# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1272878660 -10800 # Node ID de1630741fbe405335b3c2bf4a810597194ba8f7 # Parent 76a2435edfd45a84437dbf3dd89c26f028726d51 Revision: 201015 Kit: 201018 diff -r 76a2435edfd4 -r de1630741fbe contacts.pro --- a/contacts.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/contacts.pro Mon May 03 12:24:20 2010 +0300 @@ -15,5 +15,5 @@ # TEMPLATE = subdirs -SUBDIRS = phonebookengines logsui phonebookui +SUBDIRS = phonebookengines phonebookui CONFIG += ordered \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_services_api/inc/cntservicescontact.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_services_api/inc/cntservicescontact.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,76 @@ +/* +* 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 CNTSERVICESCONTACT_H_ +#define CNTSERVICESCONTACT_H_ + +#include +#include +#include + +/*Supported actions*/ +const QString KCntActionAll("all"); +const QString KCntActionCall("call"); +const QString KCntActionSms("sms"); +const QString KCntActionEmail("email"); + +/*Supported filters*/ +const QString KCntFilterDisplayAll("all"); +const QString KCntFilterDisplayFavorites("favorites"); + +/*Supported Fetch Selection Modes*/ +const QString KCntNoSelectionMode("No Selection"); +const QString KCntSingleSelectionMode("SingleSelect"); +const QString KCntMultiSelectionMode("MultiSelect"); + +class CntServicesContact +{ +public: + CntServicesContact() : mContactId(-1) {}; + virtual ~CntServicesContact() {}; + + QString mDisplayName; + QString mPhoneNumber; + QString mEmailAddress; + int mContactId; //should be changed to QContactUniqueId + + template void serialize(Stream &stream) const; + template void deserialize(Stream &stream); +}; + +template inline void CntServicesContact::serialize(Stream &s) const +{ + s << mDisplayName; + s << mPhoneNumber; + s << mEmailAddress; + s << mContactId; +} + +template inline void CntServicesContact::deserialize(Stream &s) +{ + s >> mDisplayName; + s >> mPhoneNumber; + s >> mEmailAddress; + s >> mContactId; +} + +typedef QList CntServicesContactList; + +Q_DECLARE_USER_METATYPE(CntServicesContact) +Q_DECLARE_USER_METATYPE_NO_OPERATORS(CntServicesContactList) + +#endif /* CNTSERVICESCONTACT_H_ */ diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_api/inc/cntabstractview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_api/inc/cntabstractview.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,61 @@ +/* +* 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 CNTABSTRACTVIEW_H_ +#define CNTABSTRACTVIEW_H_ + +#include +#include + +class HbView; + +class CntAbstractView +{ + +public: + virtual ~CntAbstractView(){} + +public: + /** + * View is activated after its added to main window and is + * ready to be drawn. + */ + virtual void activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) = 0; + + /** + * View is deactivated just before its removed from + * main window. + */ + virtual void deactivate() = 0; + + /** + * Default view is not deleted when its removed from + * main window. So, if view is NOT default, its deleted + * after its removed from main window. + */ + virtual bool isDefault() const = 0; + + /** + * return the view implementation. + */ + virtual HbView* view() const = 0; + + /*! + * return the view id + */ + virtual int viewId() const = 0; +}; +#endif /* CNTABSTRACTVIEW_H_ */ diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_api/inc/cntabstractviewmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_api/inc/cntabstractviewmanager.h Mon May 03 12:24:20 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 CNTABSTRACTVIEWMANAGER_H_ +#define CNTABSTRACTVIEWMANAGER_H_ + +#include +#include +#include + +QTM_BEGIN_NAMESPACE +class QContactManager; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +class CntAbstractViewManager +{ +public: + virtual ~CntAbstractViewManager() {} + + /* New API */ + virtual void changeView( const CntViewParameters aArgs ) = 0; + virtual void back( const CntViewParameters aArgs ) = 0; + + virtual QContactManager* contactManager( const QString& aType ) = 0; +}; +#endif /* CNTABSTRACTVIEWMANAGER_H_ */ diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_api/inc/cntviewparams.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_api/inc/cntviewparams.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,84 @@ +/* + * 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 CNTVIEWPARAMS_H +#define CNTVIEWPARAMS_H + +#include +#include +#include + +QTM_BEGIN_NAMESPACE +class QContact; +class QContactDetail; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +enum CntViewParamId +{ + EViewId = 0, + ESelectedAction, + ESelectedContact, + ESelectedGroupContact, + ESelectedDetail, + ESelectionMode, + ECustomParam = 100 +}; + +enum CntViewId +{ + noView=0, //exit + namesView, + commLauncherView, + serviceContactCardView, + serviceAssignContactCardView, + myCardView, + myCardSelectionView, + serviceContactSelectionView, + collectionView, + collectionFavoritesView, + FavoritesMemberView, + editView, + serviceEditView, + serviceSubEditView, + emailEditorView, + namesEditorView, + urlEditorView, + companyEditorView, + phoneNumberEditorView, + onlineAccountEditorView, + noteEditorView, + familyDetailEditorView, + addressEditorView, + dateEditorView, + imageEditorView, + serviceContactFetchView, + groupEditorView, + groupMemberView, + groupActionsView, + historyView, + customPhonebookView = 100, // reserved for internal view plugins, DO NOT USE THESE + customView = 200 // for all other view plugins +}; + +typedef QMap CntViewParameters; + +Q_DECLARE_METATYPE(QContact) +Q_DECLARE_METATYPE(QContactDetail) + +#endif // CNTVIEWPARAMS_H diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_extensions_api/inc/cnteditviewitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_extensions_api/inc/cnteditviewitem.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,74 @@ +/* + * 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 CNTEDITVIEWITEM_H +#define CNTEDITVIEWITEM_H + +#include +#include +#include +#include + +// Value enum for EditViewItemRole::ERoleItemType +enum EditViewItemType +{ + ETypeUiExtension = 0, + ETypeDetailItem +}; + +enum EditViewItemRole +{ + ERoleItemType = Hb::UserRole, + ERoleEditorViewId, + ERoleContactDetailFields, + ERoleContactDetail, + ERoleContactDetailDef +}; + +/** + * Handle to specific item's data. + */ +class CntEditViewItem +{ +public: + + virtual ~CntEditViewItem() {} + + /** + * Returns data for a given role. + * ETypeUiExtension must be returned for ERoleItemType + * + * @param int, role + * @return QVariant, data for the given role + */ + virtual QVariant data(int role) const = 0; + + /** + * Called when this item is activated (tapped) in the list. + */ + virtual void activated() = 0; + + /** + * Called when this item is longpressed in the list. + * + * @param QPointF&, coordinates from where the longpress was initiated + */ + virtual void longPressed(const QPointF& coords) = 0; +}; + +#endif // CNTEDITVIEWITEM_H + diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_extensions_api/inc/cnteditviewitemsupplier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_extensions_api/inc/cnteditviewitemsupplier.h Mon May 03 12:24:20 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: + * + */ + +#ifndef CNTEDITVIEWITEMSUPPLIER_H +#define CNTEDITVIEWITEMSUPPLIER_H + +#include + +#include + +/** + * UI extension class that supplies items for the edit view list + */ +class CntEditViewItemSupplier +{ + public: + + /** + * Returns number of items provided by the extension. + * + * @return int, item count + */ + virtual int itemCount() const = 0; + + /** + * Returns specific edit view item. + * + * @param int, item index + * @return CntEditViewItem, item + */ + virtual CntEditViewItem* itemAt(int aIndex) = 0; + +protected: + // prevent deleting by client + virtual ~CntEditViewItemSupplier() {} +}; + +#endif //CNTEDITVIEWITEMSUPPLIER_H + diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_extensions_api/inc/cntuiextensionfactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_extensions_api/inc/cntuiextensionfactory.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,95 @@ +/* + * 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: + * + */ + +// +// W A R N I N G +// ------------- +// +// FOR INTERNAL USE ONLY! +// +// This file is not the final version. These interfaces may and will +// change without any notice until they are final. Please do not use them. +// + +#ifndef CNTUIEXTENSIONFACTORY_H +#define CNTUIEXTENSIONFACTORY_H + +#include +#include + +class CntContactCardActionSupplier; +class CntUiGroupSupplier; +class CntUiSocialExtension; +class CntEditViewItemSupplier; +class CntViewSupplier; + +QTM_BEGIN_NAMESPACE +class QContact; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +/** + * A factory which gives access to UI extension interfaces. + * The plugin can extend the needed extensions and return null for the + * unsupported extension types. + */ +class CntUiExtensionFactory +{ + public: + virtual ~CntUiExtensionFactory() {} + + /** + * Gives access to an interface for extending UI action buttons. + * @return Returns null if not supported. Ownership is not given. + */ + virtual CntContactCardActionSupplier* contactCardActionSupplier() = 0; + + /** + * Gives access to an interface for extending UI with new groups. + * @return Returns null if not supported. Ownership is not given. + */ + virtual CntUiGroupSupplier* groupSupplier() = 0; + + /** + * Gives access to an interface for extending edit view list with new items for a given contact. + * @return Returns null if not supported. Ownership is not given. + */ + virtual CntEditViewItemSupplier* editViewItemSupplier(QContact &contact) = 0; + + /** + * Gives access to an interface for creating new views. + * @return Returns null if not supported. Ownership is not given. + */ + virtual CntViewSupplier* viewSupplier() = 0; + + virtual CntUiSocialExtension* socialExtension() = 0; + + virtual bool hasService(int serviceId) = 0; + + virtual void* ExtensionFactoryExt( + int /*aExtensionId*/ ) + { + return NULL; + } + +}; + +Q_DECLARE_INTERFACE(CntUiExtensionFactory, "com.nokia.contacts.uiextensionfactory/1.0") + +#endif // CNTUIEXTENSIONFACTORY_H + diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_extensions_api/inc/cntuiextensiongroup.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_extensions_api/inc/cntuiextensiongroup.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,104 @@ +/* + * 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 CNTUIEXTENSIONGROUP_H +#define CNTUIEXTENSIONGROUP_H + +#include +#include + +class QPointF; + +/** + * Handle to specific group provided by the group supplier + */ +class CntUiExtensionGroup +{ +public: + + virtual ~CntUiExtensionGroup() {} + + /** + * Returns name of the group. + * + * @return QString, name of the group item + */ + virtual QString name() const = 0; + + /** + * Returns extra text for the group. + * + * @return QString, extra text for the group item + */ + virtual QString extraText() const = 0; + + /** + * Returns member count for the group. This is displayed + * in the top or bottom right corner of the list item depending + * if the item has an extra icon. (portrait) + * Wont be displayed if return value is < 1 + * + * @return int, member count for the group item + */ + virtual int memberCount() const = 0; + + /** + * Returns group icon. + * + * @return QString, icon for the group + */ + virtual QString groupIcon() const = 0; + + /** + * Returns extra icon. This is displayed in top right corner + * of the list item. + * + * @return QString, extra icon for the group + */ + virtual QString extraIcon() const = 0; + + /** + * Returns service id for the group. This must be unique from + * Service Settings Provider. + * + * @return int, unique service id for the group + */ + virtual int serviceId() const = 0; + + /** + * Called when this item is activated (tapped) in the list. + * + * @param CntViewParameters&, callback for view switching + */ + virtual void activated(CntViewParameters& callBack) const = 0; + + /** + * Called when this item is longpressed in the list. + * + * @param QPointF&, coordinates from where the longpress was initiated + * @param CntViewParameters&, callback for view switching + */ + virtual void longPressed(const QPointF& coords, CntViewParameters &callBack) const = 0; + + virtual void* GroupExtension( + int /*aExtensionId*/ ) + { + return NULL; + } +}; + +#endif // CNTUIEXTENSIONGROUP_H diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_extensions_api/inc/cntuigroupsupplier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_extensions_api/inc/cntuigroupsupplier.h Mon May 03 12:24:20 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: + * + */ + +#ifndef CNTUIGROUPSUPPLIER_H +#define CNTUIGROUPSUPPLIER_H + +#include +#include + +/** + * UI extension class that supplies groups to phonebook groups UI. + */ +class CntUiGroupSupplier +{ + public: + + /** + * Returns number of groups provided by the extension. + * + * @return int, group count + */ + virtual int groupCount() const = 0; + + /** + * Returns specific group handle which can be used to access + * members of the group. + * + * @param int, group index + * @return CntUiExtensionGroup&, group handle + */ + virtual const CntUiExtensionGroup& groupAt( int aIndex ) const = 0; + + virtual void* GroupSupplierExtension( + int /*aExtensionId*/ ) + { + return NULL; + } +protected: + // prevent deleting by client + virtual ~CntUiGroupSupplier() {} +}; + +#endif //CNTUIGROUPSUPPLIER_H + diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_extensions_api/inc/cntuisocialextension.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_extensions_api/inc/cntuisocialextension.h Mon May 03 12:24:20 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 CNTUISOCIALEXTENSION_H +#define CNTUISOCIALEXTENSION_H + +#include +#include + +/** + * UI extension class that supplies social extension action handling + */ +class CntUiSocialExtension +{ + public: + /** + * Handle view switching logic for toolbar actions + * + * @param CntViewParameters&, callback for view switching + */ + virtual void handleToolbarAction(CntViewParameters& callBack) = 0; + +protected: + // prevent deleting by client + virtual ~CntUiSocialExtension() {} +}; + +#endif //CNTUISOCIALEXTENSION_H + diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/contacts_ui_extensions_api/inc/cntviewsupplier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contacts_plat/contacts_ui_extensions_api/inc/cntviewsupplier.h Mon May 03 12:24:20 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: + * + */ + +#ifndef CNTVIEWSUPPLIER_H +#define CNTVIEWSUPPLIER_H + +class CntAbstractView; + +/** + * UI extension class that supplies views to phonebook UI. + */ +class CntViewSupplier +{ +public: + + /** + * Returns number of views provided by the extension. + * + * @return int, view count + */ + virtual int viewCount() const = 0; + + /** + * Returns the view ID of a specific view. + * + * @param int, view index + * @return int, viewId + */ + virtual int viewIdAt( int aIndex ) const = 0; + + /** + * Returns a specific view. Ownership is given. + * + * @param int, view index + * @return CntAbstractView*, view + */ + virtual CntAbstractView* viewAt( int aIndex ) = 0; + +protected: + // prevent deleting by client + virtual ~CntViewSupplier() {} +}; + +#endif //CNTVIEWSUPPLIER_H + diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/logs_engine_api/inc/logsabstractmodel.h --- a/contacts_plat/logs_engine_api/inc/logsabstractmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSABSTRACTMODEL_H -#define LOGSABSTRACTMODEL_H - -#include -#include - -class LogsEvent; -class LogsDbConnector; -class LogsModelItemContainer; -class HbIcon; - -/** - * Abstract logs model. - * - */ -class LogsAbstractModel : public QAbstractListModel -{ - Q_OBJECT - -public: - - /** - * Additional data role types. - */ - enum LogsModelRole { - RoleFullEvent = Qt::UserRole + 1, // LogsEvent - RoleCall, // LogsCall - RoleMessage, // LogsMessage - RoleContact, // LogsContact - RoleDetailsModel, // LogsDetailsModel - RoleBaseLast // Child classes may define roles above this val - }; - -public: - - ~LogsAbstractModel(); - -public: - - static QString directionIconName(const LogsEvent& event); - static QString typeIconName(const LogsEvent& event); - - /** - * Fills iconList based on the event. - * @param event, - * @param iconList, on return contains list of icons - */ - void getDecorationData(const LogsEvent& event, QList& iconList) const; - - LogsDbConnector* dbConnector(); - -protected: - - QVariant doGetData(int role, const LogsModelItemContainer& item) const; - - virtual QVariant createCall(const LogsModelItemContainer& item) const; - virtual QVariant createMessage(const LogsModelItemContainer& item) const; - virtual QVariant createContact(const LogsModelItemContainer& item) const; - - explicit LogsAbstractModel(); - -protected: //data - - LogsDbConnector* mDbConnector; - QMap mIcons; - -private: // Testing related friend definitions - - friend class UT_LogsModel; - friend class UT_LogsDetailsModel; - friend class UT_LogsFilter; - friend class UT_LogsCustomFilter; - -}; - - -/** - * Specialized model may contain other model items than log events. - */ -class LogsModelItemContainer { -public: - LogsModelItemContainer(LogsEvent* event = 0); - virtual ~LogsModelItemContainer(); - LogsEvent* event() const; - -protected: - LogsEvent* mEvent; // not owned -}; - -#endif //LOGSABSTRACTMODEL_H diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/logs_engine_api/inc/logscustomfilter.h --- a/contacts_plat/logs_engine_api/inc/logscustomfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSCUSTOMFILTER_H -#define LOGSCUSTOMFILTER_H - -#include -#include -#include - -/** - * LogsCustomFilter can be used to filter events - * from logs model based on more detailed search terms. - */ -class LogsCustomFilter : public QSortFilterProxyModel -{ - Q_OBJECT - -public: // The exported API - - LOGSENGINE_EXPORT LogsCustomFilter(); - LOGSENGINE_EXPORT ~LogsCustomFilter(); - - /** - * Filter events based on contact id of event. - * @param contactId - */ - LOGSENGINE_EXPORT void setContactId(quint32 contactId); - - /** - * Starts removing events. Clearing can be sync or async. - * In case of async, completion is indicated by clearingCompleted signal. - * @return true if async clearing started - */ - LOGSENGINE_EXPORT bool clearEvents(); - - /** - * Mark events as seen. Completion is indicated by - * markingCompleted signal. - * @param eventIds, ids of the events to be marked - * @return true if marking started - */ - LOGSENGINE_EXPORT bool markEventsSeen(); - -protected: // From QSortFilterProxyModel - - bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; - -signals: - /** - * Signaled once asycn event clearing has completed. - * @param err, 0 if marking completed succesfully - */ - void clearingCompleted(int err); - - /** - * Signaled once asycn event marking has completed. - * @param err, 0 if marking completed succesfully - */ - void markingCompleted(int err); - -private: - - QList getEventIds(bool onlyUnseen = false) const; - -private: //data - - quint32 mContactId; - -private: // Testing related friend definitions - - friend class UT_LogsCustomFilter; - friend class UT_LogsModel; -}; - -#endif // LOGSCUSTOMFILTER_H diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/logs_engine_api/inc/logsevent.h --- a/contacts_plat/logs_engine_api/inc/logsevent.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,348 +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: -* -*/ - -#ifndef LOGSEVENT_H -#define LOGSEVENT_H - -// INCLUDES -#include -#include -#include - -// FORWARD DECLARATION -class LogsEventData; -class LogsEventStrings; -class CLogEvent; - -QTM_BEGIN_NAMESPACE -class QContactName; -class QContactManager; -QTM_END_NAMESPACE - -QTM_USE_NAMESPACE - -// CLASS DECLARATION - -/** - * Logs event information. - */ -class LogsEvent - { -public: - - // direction of the event - enum LogsDirection - { - DirUndefined = -1, // undefined - DirIn = 0, // incoming - DirOut = 1, // outgoing - DirMissed = 2 // missed - }; - - // type of the event - enum LogsEventType - { - TypeUndefined = -1, - TypeVoiceCall, - TypeVideoCall, - TypeVoIPCall - }; - - enum LogsEventState - { - EventAdded, - EventUpdated, - EventNotUpdated - }; - - public: - - /** - * Constructor. - */ - LogsEvent(); - - public: // Exported API - - /** - * Copy constructor. - */ - LOGSENGINE_EXPORT LogsEvent( const LogsEvent& event ); - - /** - * Destructor. - */ - LOGSENGINE_EXPORT virtual ~LogsEvent(); - - /** - * Get time when event occurred. - * @return date time - */ - LOGSENGINE_EXPORT QDateTime time() const; - - /** - * Get unique id of the event - * @return id - */ - LOGSENGINE_EXPORT int logId() const; - - /** - * Get phone number associated with the event. - * @return number - */ - LOGSENGINE_EXPORT const QString& number() const; - - /** - * Get remote party information. - * @return remote party name - */ - LOGSENGINE_EXPORT const QString& remoteParty() const; - - /** - * Get direction of the event - * @return direction - */ - LOGSENGINE_EXPORT LogsDirection direction() const; - - /** - * Get event type - * @return event type - */ - LOGSENGINE_EXPORT LogsEventType eventType() const; - - /** - * Get number of duplicated events (e.g. 5 missing calls from x) - * @return number of duplicates - */ - LOGSENGINE_EXPORT int duplicates() const; - - /** - * Check whether event was generated when using alternative line service - * @return true if ALS was used - */ - LOGSENGINE_EXPORT bool ALS() const; - - /** - * Get ringing duration - * return rinding duration is seconds - */ - LOGSENGINE_EXPORT int ringDuration() const; - - /** - * Get duration of event - * @return duration in seconds - */ - LOGSENGINE_EXPORT int duration() const; - - /** - * Number for calling to remote party of the event - * @return number - */ - LOGSENGINE_EXPORT QString getNumberForCalling(); - - /** - * Get contact id of associated contact - * @return contact id, zero if no associated contact exist. - */ - LOGSENGINE_EXPORT unsigned int contactLocalId() const; - - /** - * Check whether event has been read already - * @return true if event has been marked as read - */ - LOGSENGINE_EXPORT bool isRead() const; - - public: - - /** - * Initialized the event with contents of given source event. - * Event state and view status are updated automatically at - * this phase. - * @param source, source event - * @param strings, list of strings used for comparison - */ - void initializeEventL( const CLogEvent& source, - const LogsEventStrings& strings ); - - /** - * Check event's view status which tells whether the event is - * still valid or not. If event is not anymore in view, it - * is not probably needed anymore. - */ - bool isInView() const; - - /** - * Get state of the event. Event state is updated - * always at initialization phase. See initializeEventL. - */ - LogsEventState eventState() const; - - bool setIsRead(bool isRead); - - int eventUid() const; - - LogsEventData* logsEventData() const; - - bool CNAP() const { return false; }; - - /** - * Sets current index of the event. - */ - void setIndex(int index); - - /** - * Returns last set index for the event. - */ - int index() const; - - /** - * Set view status of the event. - */ - void setIsInView(bool isInView); - - /** - * Set number of duplicates for this events (e.g. 2 missed calls) - */ - void setDuplicates( int duplicates ); - - /** - * Set remote party name for the event. - */ - void setRemoteParty( const QString& remoteParty ); - - /** - * Check if event is valid. - * @return true if valid, otherwise false - */ - bool validate(); - - /** - * Return direction as string - */ - QString directionAsString() const; - - /** - * Return event type as string - */ - QString typeAsString() const; - - /** - * Search matching contact from contacts and update - * event with possible match. - * @param manager - * @return name of matched contact, zero length string if no match found. - */ - QString updateRemotePartyFromContacts(QContactManager& manager); - - /** - * Prepares the event for contact matching. - */ - void prepareForContactMatching(); - - /** - * Event has been marked as seen but database might not yet contain the change - */ - void markedAsSeenLocally(bool markedAsSeen); - - /** - * Check whether event is locally seen. - */ - bool isSeenLocally() const; - - - private: - - bool setTime( const QDateTime& time ); - - void setLogId( const int logId ); - - bool setNumber( const QString& number ); - - bool setDirection( LogsDirection aDirection ); - - void setEventUid( int uid ); - - void setEventType( LogsEventType aEventType ); - - void setLogsEventData( LogsEventData* logsEventData ); - - void setALS( bool aALS ); - - void setRingDuration( int ringDuration ); - - bool isEmergencyNumber( const QString& number ); - - void setDuration( int duration ); - - void setContactLocalId( unsigned int id ); - - QString stripPhoneNumber(const QString& num); - - QString parseContactName(const QContactName& name); - - - private: // data - - int mLogId; - LogsDirection mDirection; - LogsEventType mEventType; - int mUid; - LogsEventData* mLogsEventData; - QString mRemoteParty; - QString mNumber; - int mDuplicates; - QDateTime mTime; - int mRingDuration; - bool mIsRead; - bool mIsALS; - int mDuration; - - int mIndex; - bool mIsInView; - LogsEventState mEventState; - bool mIsLocallySeen; - - private: - - friend class LogsEventParser; - friend class LogsReaderStateFillDetails; - - private: // Testing related friend definitions - -#ifdef LOGSDBCONNECTOR_SIMULATION - friend class LogsDbConnector; -#endif - friend class UT_LogsFilter; - friend class UT_LogsModel; - friend class UT_LogsEvent; - friend class UT_LogsDbConnector; - friend class UT_LogsCall; - friend class UT_LogsContact; - friend class UT_LogsEventParser; - friend class UT_LogsEventDataParser; - friend class UT_LogsReaderStates; - friend class UT_LogsDetailsModel; - friend class UT_LogsMessage; - friend class UT_LogsCustomFilter; - friend class UT_LogsMatchesModel; - }; - -#endif // LOGSEVENT_H - - - -// End of File diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/logs_engine_api/inc/logsfilter.h --- a/contacts_plat/logs_engine_api/inc/logsfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +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: -* -*/ -#ifndef LOGSFILTER_H -#define LOGSFILTER_H - -#include -#include -#include - -/** - * LogsFilter can be used to filter certain events - * from logs model. - */ -class LogsFilter : public QSortFilterProxyModel -{ - Q_OBJECT - -public: - - enum FilterType{ - All, - Received, - Called, - Missed - }; - -public: // The exported API - - /** - * Constructor - * @param type, filter type defining which events are shown - */ - LOGSENGINE_EXPORT LogsFilter( FilterType type = All ); - - /** - * Destructor - */ - LOGSENGINE_EXPORT ~LogsFilter(); - - /** - * Get current filter type - * @return filtertype - */ - LOGSENGINE_EXPORT FilterType filterType() const; - - /** - * Get current clear type - * @return cleartype - */ - LOGSENGINE_EXPORT LogsModel::ClearType clearType() const; - - /** - * Set maximum number of events. - * @param max size - */ - LOGSENGINE_EXPORT void setMaxSize(int maxSize); - -protected: // From QSortFilterProxyModel - - bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; - -private: //data - - FilterType mFilterType; - -private: // Testing related friend definitions - - friend class UT_LogsFilter; - friend class UT_LogsModel; -}; - -#endif // LOGSFILTER_H diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/logs_engine_api/inc/logsmodel.h --- a/contacts_plat/logs_engine_api/inc/logsmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +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: -* -*/ - -#ifndef LOGSMODEL_H -#define LOGSMODEL_H - -#include -#include - -class LogsEvent; -class LogsDbConnector; -class LogsMatchesModel; - -/** - * Model for log events. - * - */ -class LogsModel : public LogsAbstractModel -{ - Q_OBJECT - -public: - - enum ClearType { - TypeLogsClearAll = 0, - TypeLogsClearReceived, - TypeLogsClearCalled, - TypeLogsClearMissed - }; - - enum LogsModelType { - LogsRecentModel, // Model handles recent events - LogsFullModel // Model handles all events - }; -public: // The exported API - - /** - * Constructor - * @param modelType - */ - LOGSENGINE_EXPORT explicit LogsModel(LogsModelType modelType = LogsRecentModel); - - /** - * Destructor - */ - LOGSENGINE_EXPORT ~LogsModel(); - - /** - * Clear events. Clearing is async operation and completion is indicated - * by clearingCompleted signal. - * @param cleartype, type of events to be cleared - * @return true if async clearing started - */ - LOGSENGINE_EXPORT bool clearList(LogsModel::ClearType cleartype); - - /** - * Get matches model. - * @return matches model - */ - LOGSENGINE_EXPORT LogsMatchesModel* logsMatchesModel(); - - /** - * Mark events as seen. Operation is asycn and completion is indicated - * by markingCompleted signal. - * @param cleartype, type of events to be marked as seen - * @return true if async marking started, false if marking did not start - */ - LOGSENGINE_EXPORT bool markEventsSeen(LogsModel::ClearType cleartype); - - /** - * Clear missed calls counter - * @return 0 if clearing was success - */ - LOGSENGINE_EXPORT int clearMissedCallsCounter(); - -public: // From QAbstractItemModel - - /** - * Get number of events currently in the model. - * @return number of events - */ - virtual int rowCount(const QModelIndex &parent) const; - - /** - * Get various data from the model. Fetched data type is defined - * by role input parameter. Besides standard Qt::DisplayRole and - * Qt::DecorationRole, LogsAbstractModel::LogsModelRole defines - * additional data types. - */ - virtual QVariant data(const QModelIndex &index, int role) const; - -signals: - - /** - * Signaled once clearing has completed. - * @param err, 0 if clearing was success - */ - void clearingCompleted(int err); - - /** - * Signaled once marking has completed. - * @param err, 0 if marking was success - */ - void markingCompleted(int err); - - -public slots: - - void dataAdded(QList addedIndexes); - void dataUpdated(QList updatedIndexes); - void dataRemoved(QList removedIndexes); - -private: - - /** - * Find sequential indexes and place each sequence to own list. - * @param indexes, index list - * @return list of index sequence lists - */ - QList< QList > findSequentialIndexes(const QList& indexes); - QString getCallerId(const LogsEvent& event) const; - void initIcons(); - bool matchEventWithClearType(const LogsEvent& event, LogsModel::ClearType clearType); - -private: //data - - LogsModelType mModelType; - QList mEvents; - -private: // Testing related friend definitions - - friend class UT_LogsModel; - friend class UT_LogsFilter; - friend class UT_LogsCustomFilter; - friend class UT_LogsMatchesModel; - -}; - -#endif //LOGSMODEL_H diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/logs_engine_api_extensions/inc/LogsApiConsts.h --- a/contacts_plat/logs_engine_api_extensions/inc/LogsApiConsts.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/* -* Copyright (c) 2006 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: -* Contains extension constants used in Logs Engine -* -*/ - - -#ifndef __LogsApiConsts_H__ -#define __LogsApiConsts_H__ - -//Symbian phone caller type strings are defined in LOGWRAP.RLS (Z:\src\common\generic\syslibs\logeng\ongoing\LogWrap). -//Below are additional strings for caller type strings handling. -_LIT( KLogsPrivateText, "Private" ); //Text in remote party in case of private number -_LIT( KLogsPayphoneText, "Payphone" ); //Text in remote party in case of payphone number - -// Strings for ClogEvent Data field tagging -_LIT8( KLogsDataFldNameDelimiter, "\t" ); //Name=value pairs separated by tabs -_LIT8( KLogsDataFldValueDelimiter, "=" ); //Names and values separated by = -_LIT8( KLogsDataFldTag_CNAP, "CNAP" ); //Caller name presentation -_LIT8( KLogsDataFldTag_Emergency, "EMERG" ); //Emergency calls -_LIT8( KLogsDataFldTag_MA, "MA" ); //My address -_LIT8( KLogsDataFldTag_POC, "POC" ); //Push-to-talk -_LIT8( KLogsDataFldTag_Type, "TYPE" ); //Internal type information for Poc -_LIT8( KLogsDataFldTag_IP, "VOIP" ); //Voice over ip -_LIT8( KLogsDataFldTag_VT, "VT" ); //Video telephony -_LIT8( KLogsDataFldTag_URL, "URL" ); //For sip-uri etc -_LIT8( KLogsDataFldTag_ServiceId, "SI"); //ServiceId -_LIT8( KLogsDataFldTag_ContactLink, "CL"); //ContactLink -// _LIT8( KLogsDataFldTag_DataSent, "DS" ); -// _LIT8( KLogsDataFldTag_DataReceived, "DR" ); - - -//Symbian messaging delivery status strings are defined in LOGWRAP.RLS (Z:\src\common\generic\syslibs\logeng\ongoing\LogWrap). -//Below are additional strings for delivery status handling. -_LIT(KLogsMsgReadText, "MsgRead"); - - -//Symbian LogDB event types are defined in LOGENG.H / LOGWRAP.HRH. Additional event types that not provided -//by Symbian LogEngine yet, are provided here. -//Additional event UIDs: -//The range 0x100058B3 to 0x10005C9A has been assigned to Series 60 by Symbian, i.e. -//new event UID values can be allocated within this range if not (yet) available by Symbian Log engine. - -#define KLogsEngMmsEventType 0x1000595e -#define KLogsEngWlanEventType 0x1000595f //KLogsEngMmsEventType+1 for WLAN Instead of 0x101F8EB7 -#define KLogsEngPocInfoEventType 0x10005960 - -const TUid KLogsEngMmsEventTypeUid = {KLogsEngMmsEventType}; -const TUid KLogsEngWlanEventTypeUid = {KLogsEngWlanEventType}; -const TUid KLogsEngPocInfoEventTypeUid= {KLogsEngPocInfoEventType}; - -#endif // __LogsApiConsts_H__ - -// End of File diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/logs_services_api/inc/logsservices.h --- a/contacts_plat/logs_services_api/inc/logsservices.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +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: -* -*/ -#ifndef LOGSSERVICES_H -#define LOGSSERVICES_H - -#include - -/** -* Logs application services -*/ -class LogsServices -{ - public: - - enum LogsView{ - ViewAll, - ViewReceived, - ViewCalled, - ViewMissed - }; - /** - * Requests to start Logs application. If Logs is already running, - * activates the requested view. - * - * @param activatedView The view to be activated in Logs. - * @param showDialpad Specifies whether dialpad should be shown on top - * of the activated view - * @return 0 if started/activated succesfully - */ - LOGSSERVICES_EXPORT static int start(LogsView activatedView, bool showDialpad); - -}; - -#endif //LOGSSERVICES_H diff -r 76a2435edfd4 -r de1630741fbe contacts_plat/logs_timers_api/inc/LogsDomainCRKeys.h --- a/contacts_plat/logs_timers_api/inc/LogsDomainCRKeys.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/* -* Copyright (c) 2006 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: Logs domain Central Repository keys -* -*/ - - - -#ifndef LOGSDOMAINCRKEYS_H -#define LOGSDOMAINCRKEYS_H - -/**************************************************************************/ -/** Logs Timers API */ -/** Provides access to the timers/counters related to Logs processing */ - -const TUid KCRUidLogs = {0x101F874E}; - - -/** -* Actual last call timer -* This timer must be updated every time a call is ended. -* Integer type -**/ -const TUint32 KLogsActualLastCallTimer = 0x00000000; - -/** -* Dialled calls timer to ALS Line 1 -* This is incremented every time when call on Line 1 is ended -* Integer type -**/ -const TUint32 KLogsDialledCallsTimerLine1 = 0x00000001; - -/** -* Dialled calls timer to ALS Line 2 -* This is incremented every time when call on Line 2 is ended -* Integer type -**/ -const TUint32 KLogsDialledCallsTimerLine2 = 0x00000002; - -/** -* Last call timer to ALS Line 1 -* This timer must be updated every time a call is ended in Line 1. -* Integer type -**/ -const TUint32 KLogsLastCallTimerLine1 = 0x00000003; - -/** -* Last call timer to ALS Line 2 -* This timer must be updated every time a call is ended in Line 2. -* Integer type -**/ -const TUint32 KLogsLastCallTimerLine2 = 0x00000004; - -/** -* Informs other applications that is the Logs application's -* logging enabled. -* Note! If this has been set OFF, it does not mean that you -* will not log. If your application is meant to log, it will -* log always. -* Integer type -* 0 (OFF) -* 1 (ON) -* -* Default value: 1 -**/ -const TUint32 KLogsLoggingEnabled = 0x00000005; - -/** -* Informs the Logs application about the amount of new missed calls. -* Integer type -**/ -const TUint32 KLogsNewMissedCalls = 0x00000006; - -/** -* Received calls timer to ALS Line 1 -* This is incremented every time when received call on Line 1 -* is ended -* Integer type -**/ -const TUint32 KLogsReceivedCallsTimerLine1 = 0x00000007; - -/** -* Received calls timer to ALS Line 2 -* This is incremented every time when received call on Line 2 -* is ended -* Integer type -**/ -const TUint32 KLogsReceivedCallsTimerLine2 = 0x00000008; - - -//FIXME: THIS IS NOT ANYMORE PART OF LOGS APPLICATION, SO IT SHOULD BE MOVED TO -//DEVICEMANAGEMENT DOMAIN -/** -* Inidicates whether call duration is shown or not in Phone Application -* -* Integer, possible values are: -* -* 0 (call duration not shown in Phone application) -* 1 (call duration shown Phone application) -* -* Default value: 0 -**/ -const TUint32 KLogsShowCallDuration = 0x00000009; - - -/** -* This key is required for VoIP Last Call Timer -*/ -const TUint32 KLogsLastCallTimerVoIP = 0x0000000A; - -/** -* This key is required for VoIP Received Calls Timer -*/ -const TUint32 KLogsReceivedCallsTimerVoIP = 0x0000000B; - -/** -* This key is required for VoIP Dialled Calls Timer -*/ -const TUint32 KLogsDialledCallsTimerVoIP = 0x0000000C; - - -/**************************************************************************/ - - -#endif // LOGSDOMAINCRKEYS_H diff -r 76a2435edfd4 -r de1630741fbe logsui/bwins/logscntfinderu.def --- a/logsui/bwins/logscntfinderu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -EXPORTS - ?resultsCount@LogsCntFinder@@QBEHXZ @ 1 NONAME ; int LogsCntFinder::resultsCount(void) const - ?getEntry@LogsCntFinder@@QBEPAVLogsCntEntry@@ABVQObject@@@Z @ 2 NONAME ; class LogsCntEntry * LogsCntFinder::getEntry(class QObject const &) const - ?deleteEntry@LogsCntFinder@@QAEXABVQObject@@@Z @ 3 NONAME ; void LogsCntFinder::deleteEntry(class QObject const &) - ?contactId@LogsCntEntry@@QBEIXZ @ 4 NONAME ; unsigned int LogsCntEntry::contactId(void) const - ?type@LogsCntEntry@@QBE?AW4EntryType@1@XZ @ 5 NONAME ; enum LogsCntEntry::EntryType LogsCntEntry::type(void) const - ?setFirstName@LogsCntEntry@@QAEXABVQString@@@Z @ 6 NONAME ; void LogsCntEntry::setFirstName(class QString const &) - ??0LogsCntEntry@@QAE@AAVQObject@@I@Z @ 7 NONAME ; LogsCntEntry::LogsCntEntry(class QObject &, unsigned int) - ?resultAt@LogsCntFinder@@QAEABVLogsCntEntry@@H@Z @ 8 NONAME ; class LogsCntEntry const & LogsCntFinder::resultAt(int) - ?predictiveSearchQuery@LogsCntFinder@@QAEXABVQString@@@Z @ 9 NONAME ; void LogsCntFinder::predictiveSearchQuery(class QString const &) - ?lastName@LogsCntEntry@@QBEABV?$QList@VLogsCntText@@@@XZ @ 10 NONAME ; class QList const & LogsCntEntry::lastName(void) const - ?handle@LogsCntEntry@@QBEPAVQObject@@XZ @ 11 NONAME ; class QObject * LogsCntEntry::handle(void) const - ??1LogsCntFinder@@UAE@XZ @ 12 NONAME ; LogsCntFinder::~LogsCntFinder(void) - ?firstName@LogsCntEntry@@QBEABV?$QList@VLogsCntText@@@@XZ @ 13 NONAME ; class QList const & LogsCntEntry::firstName(void) const - ?setLastName@LogsCntEntry@@QAEXABVQString@@@Z @ 14 NONAME ; void LogsCntEntry::setLastName(class QString const &) - ??0LogsCntFinder@@QAE@XZ @ 15 NONAME ; LogsCntFinder::LogsCntFinder(void) - ?insertEntry@LogsCntFinder@@QAEXHPAVLogsCntEntry@@@Z @ 16 NONAME ; void LogsCntFinder::insertEntry(int, class LogsCntEntry *) - diff -r 76a2435edfd4 -r de1630741fbe logsui/cenrep/backup_registration.xml --- a/logsui/cenrep/backup_registration.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/cenrep/keys_logs.xls Binary file logsui/cenrep/keys_logs.xls has changed diff -r 76a2435edfd4 -r de1630741fbe logsui/conf/logs.confml Binary file logsui/conf/logs.confml has changed diff -r 76a2435edfd4 -r de1630741fbe logsui/conf/logs_101F874E.crml Binary file logsui/conf/logs_101F874E.crml has changed diff -r 76a2435edfd4 -r de1630741fbe logsui/conf/logs_102750C6.crml Binary file logsui/conf/logs_102750C6.crml has changed diff -r 76a2435edfd4 -r de1630741fbe logsui/inc/logscntfinderexport.h --- a/logsui/inc/logscntfinderexport.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +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: -* -*/ -#ifndef LOGSCNTFINDEREXPORT_H -#define LOGSCNTFINDEREXPORT_H - -#include - -#if !defined(LOGSCNTFINDER_EXPORT) -#if defined(LOGSCNTFINDER_LIB) -#define LOGSCNTFINDER_EXPORT Q_DECL_EXPORT -#else -#define LOGSCNTFINDER_EXPORT Q_DECL_IMPORT -#endif -#endif - - - -#endif // LOGSCNTFINDEREXPORT_H diff -r 76a2435edfd4 -r de1630741fbe logsui/inc/logsexport.h --- a/logsui/inc/logsexport.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +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: -* -*/ -#ifndef LOGSEXPORT_H -#define LOGSEXPORT_H - -#include - -#if !defined(LOGSENGINE_EXPORT) -#if defined(LOGSENGINE_LIB) -#define LOGSENGINE_EXPORT Q_DECL_EXPORT -#else -#define LOGSENGINE_EXPORT Q_DECL_IMPORT -#endif -#endif - -#if !defined(LOGSSERVICES_EXPORT) -#if defined(LOGSSERVICES_LIB) -#define LOGSSERVICES_EXPORT Q_DECL_EXPORT -#else -#define LOGSSERVICES_EXPORT Q_DECL_IMPORT -#endif -#endif - - -#endif // LOGSEXPORT_H diff -r 76a2435edfd4 -r de1630741fbe logsui/inc/logslogger.h --- a/logsui/inc/logslogger.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/* -* Copyright (c) 2006 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: ?Description -* -*/ - - -#ifndef LOGSLOGGER_H -#define LOGSLOGGER_H - -#include - - -// Disabled PC_lint warning for "Undefined preprocessor variable 'UNIT_TESTING'" -//lint -e553 -#if ( !defined(_DEBUG) || defined(QT_NO_DEBUG_OUTPUT) ) // release or unit test build; no logs - -#define LOGS_QDEBUG( a ) -#define LOGS_QDEBUG_2( a, b) -#define LOGS_QDEBUG_3( a, b, c) -#define LOGS_QDEBUG_4( a, b, c, d) -#define LOGS_QDEBUG_5( a, b, c, d, e) -#define LOGS_QWARNING( a ) -#define LOGS_QWARNING_2( a, b ) -#define LOGS_QCRITICAL( a ) -#define LOGS_QCRITICAL_2( a, b ) -#define LOGS_QCRITICAL_3( a, b, c) -#define LOGS_QDEBUG_EVENT( ev ) -#define LOGS_QDEBUG_EVENT_ARR( arr ) - -#else // debug build; logs - - -const char logsDebugPrefix[] = "Debug: "; -const char logsWarningPrefix[] = "Warning: "; -const char logsCriticalPrefix[] = "Critical: "; -const char logsFatalPrefix[] = "Fatal: "; - -#include // RDebug -#include -#include -#include -#include -#include - -const char logsLogFile[] = "C:/logs/logsapp/logsappdebug.txt";// Logs application log filename. - - -#define LOGS_QDEBUG( a )\ - qDebug() << a; - -#define LOGS_QDEBUG_2( a, b)\ - qDebug() << a << b; - -#define LOGS_QDEBUG_3( a, b, c)\ - qDebug() << a << b << c; - -#define LOGS_QDEBUG_4( a, b, c, d)\ - qDebug() << a << b << c << d; - -#define LOGS_QDEBUG_5( a, b, c, d, e)\ - qDebug() << a << b << c << d << e; - -#define LOGS_QWARNING( a )\ - qWarning() << a; - -#define LOGS_QWARNING_2( a, b )\ - qWarning() << a << b; - -#define LOGS_QCRITICAL( a )\ - qCritical() << a; - -#define LOGS_QCRITICAL_2( a, b )\ - qCritical() << a << b; - -#define LOGS_QCRITICAL_3( a, b, c)\ - qCritical() << a << b << c; - -// Event logging can be disabled by commenting line below -#define LOGS_EVENT_LOGGING_ENABLED - -#ifdef LOGS_EVENT_LOGGING_ENABLED -#define LOGS_QDEBUG_EVENT( ev ) \ - qDebug() << "Logs event index:" << ev->index() << "type:" << ev->eventType() \ - << "dir:" << ev->direction() << "remote:" << ev->remoteParty() << "num:" << ev->number() \ - << "inView:" << ev->isInView() << "state:" << ev->eventState(); - -#define LOGS_QDEBUG_EVENT_ARR( arr )\ - qDebug() << "Logs event arr:";\ - foreach( LogsEvent* e, arr ) { \ - LOGS_QDEBUG_EVENT( e ) } -#else -#define LOGS_QDEBUG_EVENT( ev ) -#define LOGS_QDEBUG_EVENT_ARR( arr ) -#endif - -// File logging can be disabled by commenting definition below. -#define LOGS_FILE_LOGGING_ENABLED - -#if ( defined __WINSCW__ ) || ( defined __WINS__ ) -// No sense to have file logging enabled in wins -#undef LOGS_FILE_LOGGING_ENABLED -#endif - -#ifdef LOGS_FILE_LOGGING_ENABLED -const bool logsFileLoggingEnabled = ETrue; -#else -const bool logsFileLoggingEnabled = EFalse; -#endif - - -#endif - -#endif // LOGSLOGGER_H - -// End of File diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logsabstractviewmanager.h --- a/logsui/logsapp/inc/logsabstractviewmanager.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGABSTRACTVIEWMANAGER_H -#define LOGABSTRACTVIEWMANAGER_H - - -#include "logsdefs.h" -class HbMainWindow; - -/** - * For view changing. - */ -class LogsAbstractViewManager -{ -public: - - /** - * Activate view. Previously active view is deactivated. - * @param viewId, id for activated view - * @return true if activated succesfully, otherwise false - */ - virtual bool activateView(LogsAppViewId viewId) = 0; - - /** - * Activate view by giving activation arguments. Previously active - * view is deactivated. - * @param viewId, id for activated view - * @param showDialer, true if view should show dialer when activated - * @param args, custom arguments for view - * @return true if activated succesfully, otherwise false - */ - virtual bool activateView(LogsAppViewId viewId, bool showDialer, QVariant args) = 0; - - /** - * Activate previous view. - * @return true if activated succesfully, otherwise false - */ - virtual bool activatePreviousView() = 0; - - /** - * Returns application main window - */ - virtual HbMainWindow& mainWindow() = 0; - - /** - * Exit the application. - */ - virtual void exitApplication() = 0; - -}; - -#endif //LOGABSTRACTVIEWMANAGER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logsbaseview.h --- a/logsui/logsapp/inc/logsbaseview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +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: -* -*/ -#ifndef LOGSBASEVIEW_H -#define LOGSBASEVIEW_H - -#include -#include -#include "logsdefs.h" - -class LogsComponentRepository; -class LogsAbstractViewManager; -class Dialpad; -class LogsCall; -class LogsMessage; -class LogsContact; -class LogsDetailsModel; -class HbAbstractViewItem; -class HbMenu; -class QSignalMapper; -class HbLabel; -class HbListView; - -/** - * - */ -class LogsBaseView : public HbView -{ - Q_OBJECT - friend class UT_LogsBaseView; - -public: - - virtual ~LogsBaseView(); - -public: - enum LogsViewMap{ - ViewAll, - ViewCalled, - ViewReceived, - ViewMissed - }; - - LogsAppViewId viewId() const; - virtual void activated(bool showDialer, QVariant args); - virtual void deactivated(); - virtual bool isExitAllowed(); - -public slots: - - void handleExit(); - -signals: - - void exitAllowed(); - -protected slots: - - virtual void handleBackSoftkey(); - virtual void dialpadOpened(); - virtual void dialpadClosed(); - virtual void dialpadEditorTextChanged(); - virtual void updateEmptyListWidgetsVisibility(); - virtual void updateWidgetsSizeAndLayout(); - - //slots bellow are used in *.docml - void showFilterMenu(); - void openDialpad(); - void openContactsApp(); - void notSupported(); - void changeFilter(HbAction* action); - - //other slots - void showListItemMenu(HbAbstractViewItem* item, const QPointF& coords); - void initiateCallback(const QModelIndex &listIndex); - void initiateCall(int callType); - void createMessage(); - void saveContact(); - void updateEmptyListLabelVisibility(); - void showCallDetails(); - void deleteEvent(); - - void handleOrientationChanged(); - -protected: - - explicit LogsBaseView( LogsAppViewId viewId, - LogsComponentRepository& repository, - LogsAbstractViewManager& viewManager ); - - void setDialpadPosition(); - void initFilterMenu(); - void addActionNamesToMap(); - - void updateCall(const QModelIndex& listIndex); - void updateMessage(const QModelIndex& listIndex); - void updateContact(const QModelIndex& listIndex); - void updateDetailsModel(const QModelIndex &listIndex); - - /** - * Sets appropriate list widget layout using listView.setLayoutName() - * @param ignoreDialpad if true, dialpad visiblilty won't affect layout - */ - void updateListLayoutName( HbListView& list, bool ignoreDialpad = false ); - /** - * Loads appropriate section from *.docml to resize list widget - */ - void updateListSize(); - -protected: - - /** - * Initialize view widgets from the docml file. Must be called once on first - * view activation. - */ - virtual void initView(); - - virtual QAbstractItemModel* model() const; - - virtual void populateListItemMenu(HbMenu& menu); - - /** - * Updates data specific to the list item, e.g. call/message/contact - */ - virtual void updateListItemData(const QModelIndex& listIndex); - - /* - * Update call button state. - */ - virtual void updateCallButton(); - - void activateEmptyListIndicator(QAbstractItemModel* model); - void deactivateEmptyListIndicator(QAbstractItemModel* model); - - void addViewSwitchingEffects(); - void toggleActionAvailability( HbAction* action, bool available ); - -protected: - - LogsAppViewId mViewId; - LogsComponentRepository& mRepository; - LogsAbstractViewManager& mViewManager; - HbAction* mSoftKeyBackAction; - - HbMenu* mShowFilterMenu; //not owned - Dialpad* mDialpad; //not owned - HbLabel* mEmptyListLabel; // not owned - - QMap mActionMap; - - bool mInitialized; - - LogsCall* mCall; //owned - LogsMessage* mMessage; //owned - LogsContact* mContact; //owned - LogsDetailsModel* mDetailsModel; //owned - - QSignalMapper* mCallTypeMapper; - QString mLayoutSectionName; -}; - - - - -#endif // LOGSBASEVIEW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logscomponentrepository.h --- a/logsui/logsapp/inc/logscomponentrepository.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +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: -* -*/ -#ifndef LOGSCOMPONENTREPOSITORY_H -#define LOGSCOMPONENTREPOSITORY_H - -#include "logsdefs.h" -#include - -class LogsRecentCallsView; -class LogsDetailsView; -class LogsMatchesView; -class Dialpad; -class DialpadKeyHandler; -class LogsAbstractViewManager; -class LogsModel; - -/** - * - */ -class LogsComponentRepository : public HbDocumentLoader -{ - friend class UT_LogsComponentRepository; - -public: - - explicit LogsComponentRepository(LogsAbstractViewManager& viewManager); - ~LogsComponentRepository(); - -public: - - LogsRecentCallsView* recentCallsView(); - LogsDetailsView* detailsView(); - LogsMatchesView* matchesView(); - - /** - * Returns dialpad. Must be always a valid pointer. - */ - Dialpad* dialpad(); - - /** - * Returns model. Must be always a valid pointer. - */ - LogsModel* model() const; - - /** - * Sets object tree to a proper view object list - */ - void setObjectTreeToView( LogsAppViewId viewId ); - - bool loadSection( LogsAppViewId viewId, const QString& sectionName ); - -private: - - //from HbDocumentLoader - QObject *createObject(const QString& type, const QString &name); - - void addToolbarToObjectList( QObjectList& list ); - -private: - - LogsAbstractViewManager& mViewManager; - LogsRecentCallsView* mRecentCallsView; - LogsDetailsView* mDetailsView; - LogsMatchesView* mMatchesView; - QObjectList mRecentViewComponents; - QObjectList mDetailsViewComponents; - QObjectList mMatchesViewComponents; - - Dialpad* mDialpad; - DialpadKeyHandler* mDialpadKeyHandler; - LogsModel* mModel; -}; - -#endif // LOGSCOMPONENTREPOSITORY_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logsdefs.h --- a/logsui/logsapp/inc/logsdefs.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +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: -* -*/ - -#ifndef LOGSDEFS_H -#define LOGSDEFS_H - -//#ifndef QT_TESTLIB_LIB -const char logsRecentCallsViewFile[] = ":/docml/recentCallsView.docml"; -const char logsDetailsViewFile[] = ":/docml/detailsView.docml"; -const char logsMatchedCallsViewFile[] = ":/docml/matchesView.docml"; - -//view ids -const char logsRecentCallsViewId[] = "logs_recent_calls_view"; -const char logsDetailsViewId[] = "logs_details_view"; -const char logsMatchesViewId[] = "logs_matches_view"; - -//widget ids -const char logsListWidgetId[] = "logs_list_view"; -const char logsDetailsListWidgetId[] = "logs_details_list_view"; -const char logsGroupboxViewNameId[] = "logs_groupbox_recent_calls"; -const char logsGroupboxDetailViewNameId[] = "logs_groupbox_remote_party_info"; -const char logsDetailsViewMenuId[] = "logs_details_view_menu"; -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 logsDetailsViewInternetCallMenuActionId[] = "logs_act_internet_call"; -const char logsDetailsAddToContactsMenuActionId[] = "logs_act_add_to_contacts"; -const char logsDetailsOpenContactMenuActionId[] = "logs_act_open_contact"; -const char logsRecentViewClearListMenuActionId[] = "logs_act_clear_list"; - -const char logsShowFilterReceivedMenuActionId[] = "logs_act_received"; -const char logsShowFilterDialledMenuActionId[] = "logs_act_dialled"; -const char logsShowFilterMissedMenuActionId[] = "logs_act_missed"; -const char logsShowFilterRecentMenuActionId[] = "logs_act_recent"; - - -//list layout names from *.widgetml -const char logsListDefaultLayout[] = "default"; -const char logsListLandscapeLayout[] = "logsLandscape"; -const char logsListLandscapeDialpadLayout[] = "logsLandscapeDialpad"; - -//view layout *.docml section names -const char logsViewDefaultSection[] = "default"; -const char logsViewPortraitDialpadSection[] = "portrait_dialpad"; -const char logsViewLandscapeDialpadSection[] = "landscape_dialpad"; - - -//view identifiers -enum LogsAppViewId { - LogsUnknownViewId, - LogsRecentViewId, - LogsDetailsViewId, - LogsMatchesViewId -}; - -#endif // LOGSDEFS_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logsdetailsview.h --- a/logsui/logsapp/inc/logsdetailsview.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSDETAILSVIEW_H -#define LOGSDETAILSVIEW_H - -#include "logsbaseview.h" - -class HbListView; -class HbGroupBox; -class HbAction; -class LogsComponentRepository; -class HbAction; -class LogsAbstractViewManager; - -/** - * - */ -class LogsDetailsView : public LogsBaseView -{ - Q_OBJECT - friend class UT_LogsDetailsView; - -public: - explicit LogsDetailsView( LogsComponentRepository& repository, - LogsAbstractViewManager& viewManager ); - ~LogsDetailsView(); - -public: // From LogsBaseView - - virtual void activated(bool showDialer, QVariant args); - virtual void deactivated(); - -public slots: - - void callKeyPressed(); - -private slots: - - void initiateVoiceCall(); - void initiateVideoCall(); - void addToContacts(); - void openContact(); - void contactActionCompleted(bool modified); - void deleteEvent();//overrides base class implementation - void copyNumberToClipboard(); - - //from LogsBaseView - virtual void handleBackSoftkey(); - -private: // from LogsBaseView - - virtual void initView(); - virtual QAbstractItemModel* model() const; - virtual void updateWidgetsSizeAndLayout(); - -private: - - void initListWidget(); - void updateMenu(); - -private: - - HbGroupBox* mViewName; //not owned - HbListView* mListView; //not owned -}; - -#endif // LOGSDETAILSVIEW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logseffecthandler.h --- a/logsui/logsapp/inc/logseffecthandler.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +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: -* -*/ -#ifndef LOGSEFFECTHANDLER_H -#define LOGSEFFECTHANDLER_H - -#include -#include - -class QPropertyAnimation; -class QEasingCurve; -class QSequentialAnimationGroup; -class QAbstractAnimation; -class LogsEffectContainer; - -/** - * - */ -class LogsEffectHandler : public QObject -{ - Q_OBJECT - friend class UT_LogsEffectHandler; - friend class UT_LogsRecentCallsView; - -public: - explicit LogsEffectHandler(); - ~LogsEffectHandler(); - - void startDissappearAppearByFadingEffect(QObject& effectTarget); - void startDissappearAppearByMovingEffect( - QObject& effectTarget, QObject& secondaryEffectTarget, bool dissappearToLeft, int origX); - -signals: - - void dissappearByMovingComplete(); - void dissappearByFadingComplete(); - -private slots: - - void moveAnimationChanged(QAbstractAnimation *currentAnimation); - void fadeAnimationChanged(QAbstractAnimation *currentAnimation); - -private: - - void doStartDissappearAppearByMovingEffect( - QSequentialAnimationGroup& group, QObject& effectTarget, - bool dissappearToLeft, int origX); - - void initAppearByMovingEffect(QPropertyAnimation& animation, QObject* effectTarget, - bool appearFromLeft, int origX); - void initDissappearByMovingEffect(QPropertyAnimation& animation, QObject* effectTarget, - bool dissappearToLeft, int origX); - void initOpacityEffect( - QPropertyAnimation& animation, QObject* effectTarget, - qreal startVal, qreal endVal, int duration); - void initMoveHorizontallyEffect( - QPropertyAnimation& animation, QObject* effectTarget, - int startVal, int endVal, int duration, const QEasingCurve& easingCurve); - -private: - - QPropertyAnimation* mItemAppearByFadingAnimation; - QPropertyAnimation* mItemDissappearByFadingAnimation; - QSequentialAnimationGroup* mMoveGroup; - QSequentialAnimationGroup* mMoveGroup2; - QSequentialAnimationGroup* mFadeGroup; - -}; - -#endif // LOGSEFFECTHANDLER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logsmainwindow.h --- a/logsui/logsapp/inc/logsmainwindow.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +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: -* -*/ -#ifndef LOGSMAINWINDOW_H -#define LOGSMAINWINDOW_H - - -#include -#include - - -class LogsMainWindow : public HbMainWindow - { - Q_OBJECT - -public: - - LogsMainWindow(); - virtual ~LogsMainWindow(); - - void sendAppToBackground(); - -protected: // From HbMainWindow - - void keyPressEvent( QKeyEvent *event ); - bool event(QEvent *event); - -signals: - - void callKeyPressed(); - void appFocusGained(); - -private: - - friend class UT_LogsMainWindow; - - }; - - -#endif //LOGSMAINWINDOW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logsmatchesview.h --- a/logsui/logsapp/inc/logsmatchesview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +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: -* -*/ -#ifndef LOGSMATCHESVIEW_H -#define LOGSMATCHESVIEW_H - -#include "logsbaseview.h" -#include "logscall.h" - -class HbListView; -class HbAction; -class HbPushButton; -class LogsComponentRepository; -class LogsAbstractViewManager; -class LogsMatchesModel; - -/** - * - */ -class LogsMatchesView : public LogsBaseView -{ - Q_OBJECT - friend class UT_LogsMatchesView; - -public: - explicit LogsMatchesView( LogsComponentRepository& repository, - LogsAbstractViewManager& viewManager ); - ~LogsMatchesView(); - -public: // From LogsBaseView - - virtual void activated(bool showDialer, QVariant args); - virtual void deactivated(); - -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 - - virtual void initView(); - virtual QAbstractItemModel* model() const; - -private: - - void initListWidget(); - void updateModel(LogsMatchesModel* model); - void updateMenu(); - void callToCurrentNum( LogsCall::CallType callType ); - void updateAddContactButton(); - -private: - - HbListView* mListView; //not owned - LogsMatchesModel* mModel; //owned - HbPushButton* mAddToContactsButton; // not owned -}; - -#endif // LOGSMATCHESVIEW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logsrecentcallsview.h --- a/logsui/logsapp/inc/logsrecentcallsview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +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: -* -*/ -#ifndef LOGSRECENTCALLSVIEW_H -#define LOGSRECENTCALLSVIEW_H - -#include "logsfilter.h" -#include "logsbaseview.h" -#include - -class HbListView; -class HbLabel; -class LogsComponentRepository; -class LogsModel; -class HbAbstractViewItem; -class LogsAbstractViewManager; -class LogsEffectHandler; -class HbGroupBox; -class LogsMatchesModel; - - -/** - * - */ -class LogsRecentCallsView : public LogsBaseView -{ - Q_OBJECT - friend class UT_LogsRecentCallsView; - friend class UT_LogsViewManager; - -public: - explicit LogsRecentCallsView( LogsComponentRepository& repository, - LogsAbstractViewManager& viewManager ); - ~LogsRecentCallsView(); - -public: // From LogsBaseView - - virtual void activated(bool showDialer, QVariant args); - virtual void deactivated(); - virtual bool isExitAllowed(); - -public slots: - - void callKeyPressed(); - void markingCompleted(int err); - -protected slots: // from LogsBaseView - - virtual void handleBackSoftkey(); - void openDialpad(); - virtual void dialpadEditorTextChanged(); - void changeFilter(HbAction* action); - virtual void updateEmptyListWidgetsVisibility(); - virtual void updateWidgetsSizeAndLayout(); - - -private slots: - - void clearList(); - void updateView(LogsServices::LogsView view); - void leftFlick(); - void rightFlick(); - void dissappearByFadingComplete(); - void dissappearByMovingComplete(); - bool markMissedCallsSeen(); - -private: // from LogsBaseView - - virtual void initView(); - virtual QAbstractItemModel* model() const; - virtual void updateCallButton(); - -private: - - void addStringsToMap(); - void initListWidget(); - void updateFilter(LogsFilter::FilterType type); - void updateViewName(); - void updateContextMenuItems(LogsServices::LogsView view); - LogsFilter::FilterType getFilter(LogsServices::LogsView view); - 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 - HbListView* mListView;//not owned - LogsFilter* mFilter; //owned - - QMap mTitleMap; - QMap mConversionMap; - - LogsModel* mModel; - - LogsServices::LogsView mCurrentView; - LogsServices::LogsView mAppearingView; - bool mMoveLeftInList; - LogsEffectHandler* mEffectHandler; - int mListViewX; - LogsMatchesModel* mMatchesModel; - bool mMarkingMissedAsSeen; - -}; - -#endif // LOGSRECENTCALLSVIEW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logsservicehandler.h --- a/logsui/logsapp/inc/logsservicehandler.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +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: -* -*/ -#ifndef LOGSSERVICEHANDLER_H -#define LOGSSERVICEHANDLER_H - -#include -#include - -class LogsServiceHandler : public XQServiceProvider - { - Q_OBJECT - public: - LogsServiceHandler(); - ~LogsServiceHandler(); - - public slots: - int start(int activatedView, bool showDialpad); - - signals: - - void activateView(LogsServices::LogsView activatedView, bool showDialpad); - - public: - - LogsServices::LogsView currentlyActivatedView(); - bool isStartedUsingService() const; - - private: - int mActivatedView; - bool mIsAppStartedUsingService; - - private: - friend class UT_LogsServiceHandler; - friend class UT_LogsViewManager; - }; - -#endif //LOGSSERVICEHANDLER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/inc/logsviewmanager.h --- a/logsui/logsapp/inc/logsviewmanager.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +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: -* -*/ -#ifndef LOGVIEWMANAGER_H -#define LOGVIEWMANAGER_H - - -#include -#include -#include -#include "logsabstractviewmanager.h" - - -class HbMainWindow; -class LogsComponentRepository; -class LogsServiceHandler; -class LogsMainWindow; -class HbView; -class LogsBaseView; - -/** - * - */ -class LogsViewManager : public QObject, public LogsAbstractViewManager -{ - Q_OBJECT - - friend class UT_LogsViewManager; - -public: - - /** - * Constructor - * @param mainWindow - * @param service - */ - LogsViewManager( LogsMainWindow& mainWindow, LogsServiceHandler& service ); - ~LogsViewManager(); - -public slots: - - void changeRecentView(LogsServices::LogsView view, bool showDialpad); - void proceedExit(); - void appFocusGained(); - -public: // From LogsAbstractViewManager - - virtual bool activateView(LogsAppViewId viewId); - virtual bool activateView(LogsAppViewId viewId, bool showDialpad, QVariant args); - virtual bool activatePreviousView(); - virtual HbMainWindow& mainWindow(); - virtual void exitApplication(); - -private slots: - - void handleOrientationChanged(); - -private: - - void initViews(); - bool doActivateView(LogsAppViewId viewId, bool showDialpad, QVariant args); - -private: //data - - LogsMainWindow& mMainWindow; - LogsServiceHandler& mService; - LogsComponentRepository* mComponentsRepository; - QList mViewStack; - -}; - -#endif //LOGVIEWMANAGER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/logsapp.pro --- a/logsui/logsapp/logsapp.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +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: -# -# - -TEMPLATE = app -TARGET = logs -CONFIG += hb -CONFIG += service -RESOURCES += logsapp.qrc -TRANSLATIONS = dialer.ts - -INCLUDEPATH += ./ -INCLUDEPATH += ./inc -INCLUDEPATH += ../logsengine -INCLUDEPATH += ../logsengine/inc - -INCLUDEPATH += ../inc -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - -# Input -HEADERS += inc/logsmainwindow.h -HEADERS += inc/logsviewmanager.h -HEADERS += inc/logsbaseview.h -HEADERS += inc/logsrecentcallsview.h -HEADERS += inc/logsdetailsview.h -HEADERS += inc/logsmatchesview.h -HEADERS += inc/logsservicehandler.h -HEADERS += inc/logseffecthandler.h - -SOURCES += src/main.cpp -SOURCES += src/logsmainwindow.cpp -SOURCES += src/logsviewmanager.cpp -SOURCES += src/logscomponentrepository.cpp -SOURCES += src/logsbaseview.cpp -SOURCES += src/logsrecentcallsview.cpp -SOURCES += src/logsdetailsview.cpp -SOURCES += src/logsmatchesview.cpp -SOURCES += src/logsservicehandler.cpp -SOURCES += src/logseffecthandler.cpp - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0x101F4CD5 - TARGET.CAPABILITY = CAP_APPLICATION AllFiles - LIBS += -lxqservice -lxqserviceutil -llogsengine -ldialpad - -} - -SERVICE.FILE = service_conf.xml -SERVICE.OPTIONS = embeddable diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/logsapp.qrc --- a/logsui/logsapp/logsapp.qrc Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ - - - resources/detailsView.docml - resources/recentCallsView.docml - resources/matchesView.docml - - - resources/logs_view_fade_in_scale.fxml - resources/logs_view_fade_out.fxml - resources/logs_default.qm - - - themes/icons/hbdefault/scalable/qtg_mono_contacts.svg - themes/icons/hbdefault/scalable/qtg_mono_dialer.svg - themes/icons/hbdefault/scalable/qtg_mono_show_view.svg - - - resources/hblistviewitem.css - resources/hblistviewitem.widgetml - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/resources/hblistviewitem.css --- a/logsui/logsapp/resources/hblistviewitem.css Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -HbListViewItem[layoutName="logsLandscape"]{ - layout:logs-landscape; -} - -HbListViewItem[layoutName="logsLandscapeDialpad"]{ - layout:logs-landscape; -} - -HbListViewItem::text-1[layoutName="logsLandscape"]{ - fixed-width: 40.0un; - text-height: var(hb-param-text-height-primary); -} - -HbListViewItem::text-2[layoutName="logsLandscape"]{ - - 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 76a2435edfd4 -r de1630741fbe logsui/logsapp/resources/hblistviewitem.widgetml --- a/logsui/logsapp/resources/hblistviewitem.widgetml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/resources/logs_default.qm Binary file logsui/logsapp/resources/logs_default.qm has changed diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/resources/logs_view_fade_in_scale.fxml --- a/logsui/logsapp/resources/logs_view_fade_in_scale.fxml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ - - - - 0.4 - 0.8 - 1.0 - - - 0.4 - 0.8 - 1.0 - - - 0.4 - - 0.1 - 1.0 - - - 0.5 - 0.5 - - \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/resources/logs_view_fade_out.fxml --- a/logsui/logsapp/resources/logs_view_fade_out.fxml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ - - - - 0.2 - - 1.0 - 0.0 - - - \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/service_conf.xml --- a/logsui/logsapp/service_conf.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ - - - Logs services - - Starter interface - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/logsbaseview.cpp --- a/logsui/logsapp/src/logsbaseview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,851 +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: -* -*/ -//USER -#include "logsbaseview.h" -#include "logscomponentrepository.h" -#include "logsabstractviewmanager.h" -#include "logsdefs.h" -#include "logslogger.h" -#include "logscall.h" -#include "logsmessage.h" -#include "logscontact.h" -#include "logsabstractmodel.h" -#include "logsdetailsmodel.h" - -//SYSTEM -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -Q_DECLARE_METATYPE(LogsCall*) -Q_DECLARE_METATYPE(LogsMessage*) -Q_DECLARE_METATYPE(LogsContact*) -Q_DECLARE_METATYPE(LogsDetailsModel*) - -const int contextMenuTimeout = 5000000; //5 secs - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsBaseView::LogsBaseView( - LogsAppViewId viewId, - LogsComponentRepository& repository, - LogsAbstractViewManager& viewManager ) - : HbView(0), - mViewId( viewId ), - mRepository( repository ), - mViewManager( viewManager ), - mShowFilterMenu(0), - mEmptyListLabel(0), - mInitialized(false), - mCall(0), - mMessage(0), - mContact(0), - mDetailsModel(0), - mCallTypeMapper(0) -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::LogsBaseView()" ); - - mSoftKeyBackAction = new HbAction(Hb::BackNaviAction, this); - connect(mSoftKeyBackAction, SIGNAL(triggered()), this, - SLOT(handleBackSoftkey())); - - mDialpad = mRepository.dialpad(); - - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::LogsBaseView()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsBaseView::~LogsBaseView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::~LogsBaseView()" ); - - delete mCall; - delete mMessage; - delete mContact; - delete mDetailsModel; - delete mCallTypeMapper; - - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::~LogsBaseView()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsAppViewId LogsBaseView::viewId() const -{ - return mViewId; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -bool LogsBaseView::isExitAllowed() -{ - return true; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::activated(bool showDialer, QVariant args) -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::activated()" ); - Q_UNUSED(args); - //we have to set object tree of the repository to the current view - mRepository.setObjectTreeToView( mViewId ); - - 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() ) ); - - if ( navigationAction() != mSoftKeyBackAction ) { - setNavigationAction(mSoftKeyBackAction); - } - - if (showDialer && !mDialpad->isOpen()) { - openDialpad(); - } - - updateWidgetsSizeAndLayout(); - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::activated()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::deactivated() -{ - 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() ) ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::notSupported() -{ - HbMessageBox* messageBox = new HbMessageBox(QString("Not supported")); - messageBox->setAttribute(Qt::WA_DeleteOnClose); - messageBox->setTimeout( HbMessageBox::StandardTimeout ); - messageBox->show(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::handleBackSoftkey() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::handleBackSoftkey()" ); - //mViewManager.activatePreviousView(); - mViewManager.activateView( LogsRecentViewId, false, QVariant() ); - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::handleBackSoftkey()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::initFilterMenu() -{ - mShowFilterMenu = - qobject_cast( mRepository.findWidget( logsShowFilterMenuId ) ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::addActionNamesToMap() -{ - mActionMap.clear(); - mActionMap.insert(LogsServices::ViewReceived, logsShowFilterReceivedMenuActionId); - mActionMap.insert(LogsServices::ViewCalled, logsShowFilterDialledMenuActionId); - mActionMap.insert(LogsServices::ViewMissed, logsShowFilterMissedMenuActionId); - mActionMap.insert(LogsServices::ViewAll, logsShowFilterRecentMenuActionId); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::initView() -{ - Q_ASSERT_X( !mInitialized, "logs [UI] ", "view is already initialized!!" ); - mInitialized = true; - initFilterMenu(); - addActionNamesToMap(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QAbstractItemModel* LogsBaseView::model() const -{ - LOGS_QDEBUG( "logs [UI] <-> LogsBaseView::model()" ); - return 0; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::handleExit() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::handleExit()" ); - mViewManager.exitApplication(); - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::handleExit()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::showFilterMenu() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::showFilterMenu()" ); - if ( mShowFilterMenu ) { - QRectF toolbarGeometry = toolBar()->geometry(); - QSizeF menuSize = mShowFilterMenu->size(); - LOGS_QDEBUG_2("logs [UI] menusize:", menuSize) - - QPointF pos( toolbarGeometry.bottomRight().x(), - 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(); - } - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::showFilterMenu()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::openDialpad() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::openDialpad()" ); - updateCallButton(); - setDialpadPosition(); - mDialpad->openDialpad(); - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::openDialpad()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::openContactsApp() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::openContactsApp()" ); - - // Need to do request in async manner, otherwise new phonebook ui process - // will be started due bug(?) in highway. - XQServiceRequest snd("com.nokia.services.phonebookappservices.Launch","launch()", false); - int retValue; - snd.send(retValue); - - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::openContactsApp()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::setDialpadPosition() -{ - HbMainWindow& window = mViewManager.mainWindow(); - QRectF screenRect = window.layoutRect(); - LOGS_QDEBUG_2( "logs [UI] -> LogsBaseView::setDialpadPosition(), screenRect:", - screenRect ); - if (window.orientation() == Qt::Horizontal) { - // dialpad takes half of the screen width - mDialpad->setPos(QPointF(screenRect.width()/2, - this->scenePos().y())); - mDialpad->setPreferredSize(screenRect.width()/2, - (screenRect.height()-scenePos().y())); - } else { - // dialpad takes 65% of the screen height - qreal screenHeight = screenRect.height(); - mDialpad->setPos(QPointF(0, screenHeight/2.25)); - mDialpad->setPreferredSize(screenRect.width(), - screenHeight-screenHeight/2.25); - } - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::setDialpadPosition()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::dialpadOpened() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::dialpadOpened()" ); - updateWidgetsSizeAndLayout(); - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::dialpadOpened()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::dialpadClosed() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::dialpadClosed()" ); - mDialpad->editor().setText(QString()); - updateWidgetsSizeAndLayout(); - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::dialpadClosed()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::dialpadEditorTextChanged() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::dialpadEditorTextChanged()" ); - if ( mDialpad->editor().text().length() > 0 ) { - mViewManager.activateView( LogsMatchesViewId, true, QVariant() ); - } else { - updateCallButton(); - } - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::dialpadEditorTextChanged()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::changeFilter(HbAction* action) -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::changeFilter()" ); - LogsServices::LogsView view = mActionMap.key( action->objectName(), - LogsServices::ViewAll ); - QVariant args(view); - mViewManager.activateView( LogsRecentViewId, false, args ); - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::changeFilter()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::showListItemMenu( - HbAbstractViewItem* item, const QPointF& coords ) -{ - HbMenu itemContextMenu(0); - itemContextMenu.setDismissPolicy(HbMenu::TapAnywhere); - itemContextMenu.setTimeout(contextMenuTimeout); - - updateListItemData(item->modelIndex()); - populateListItemMenu(itemContextMenu); - - if (mDialpad->isOpen()) { - mDialpad->closeDialpad(); - } - if (itemContextMenu.actions().count() > 0) { - itemContextMenu.exec(coords); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::populateListItemMenu(HbMenu& menu) -{ - delete mCallTypeMapper; - mCallTypeMapper = 0; - - if (mCall) { - mCallTypeMapper = new QSignalMapper(); - - foreach(LogsCall::CallType callType, mCall->allowedCallTypes()){ - 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(hbTrId("txt_common_menu_create_message")); - menu.addAction(messageAction); - QObject::connect( messageAction, SIGNAL(triggered()), - this, SLOT( createMessage() ) ); - } - if (mContact) { - HbAction* contactAction = new HbAction; - if (mContact->allowedRequestType() == - LogsContact::TypeLogsContactOpen) { - contactAction->setText(hbTrId("txt_dialer_ui_menu_open_contact")); - QObject::connect( contactAction, SIGNAL(triggered()), - mContact, SLOT(open()) ); - } - else { - contactAction->setText(hbTrId("txt_common_menu_add_to_contacts")); - QObject::connect( contactAction, SIGNAL(triggered()), - this, SLOT(saveContact()) ); - - } - menu.addAction(contactAction); - } - if (mDetailsModel) { - HbAction* callDetailsAction = new HbAction; - 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(hbTrId("txt_common_menu_delete")); - menu.addAction(deleteAction); - QObject::connect(deleteAction, SIGNAL(triggered()), - this, SLOT(deleteEvent())); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateListItemData(const QModelIndex& listIndex) -{ - updateCall(listIndex); - updateMessage(listIndex); - updateContact(listIndex); - updateDetailsModel(listIndex); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateCallButton() -{ - mDialpad->setCallButtonEnabled( !mDialpad->editor().text().isEmpty() ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::initiateCallback(const QModelIndex& index) -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::initiateCallback()" ); - updateCall(index); - - if (mCall) { - mCall->initiateCallback(); - } - delete mCall; - mCall = 0; - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::initiateCallback()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::initiateCall(int callType) -{ - if (mCall) { - mCall->call( static_cast(callType) ); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::createMessage() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::createMessage()" ); - if (mMessage) { - mMessage->sendMessage(); - } - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::createMessage()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -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) -{ - delete mCall; - mCall = 0; - if ( model() ) { - mCall = qVariantValue( model()->data( - listIndex, LogsAbstractModel::RoleCall ) ); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateMessage(const QModelIndex &listIndex) -{ - delete mMessage; - mMessage = 0; - if ( model() ) { - mMessage = qVariantValue( model()->data( - listIndex, LogsAbstractModel::RoleMessage ) ); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateContact(const QModelIndex &listIndex) -{ - delete mContact; - mContact = 0; - if ( model() ) { - mContact = qVariantValue( model()->data( - listIndex, LogsAbstractModel::RoleContact ) ); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateDetailsModel(const QModelIndex &listIndex) -{ - delete mDetailsModel; - mDetailsModel = 0; - if ( model() ) { - mDetailsModel = qVariantValue( model()->data( - listIndex, LogsAbstractModel::RoleDetailsModel ) ); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::activateEmptyListIndicator(QAbstractItemModel* model) -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::activateEmptyListIndicator()" ); - if ( !mEmptyListLabel ){ - mEmptyListLabel = qobject_cast( - mRepository.findWidget( logsLabelEmptyListId ) ); - } - if ( model ){ - // Listen for changes in model and update empty list label accordingly - connect( model, SIGNAL(rowsInserted(const QModelIndex&,int,int)), - this, SLOT(updateEmptyListWidgetsVisibility())); - connect( model, SIGNAL(rowsRemoved(const QModelIndex&,int,int)), - this, SLOT(updateEmptyListWidgetsVisibility())); - connect( model, SIGNAL(modelReset()), - this, SLOT(updateEmptyListWidgetsVisibility())); - // Update to reflect current situation - updateEmptyListWidgetsVisibility(); - } - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::activateEmptyListIndicator()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::deactivateEmptyListIndicator(QAbstractItemModel* model) -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::deactivateEmptyListIndicator()" ); - if ( model ){ - disconnect( model, SIGNAL(rowsInserted(const QModelIndex&,int,int)), - this, SLOT(updateEmptyListWidgetsVisibility())); - disconnect( model, SIGNAL(rowsRemoved(const QModelIndex&,int,int)), - this, SLOT(updateEmptyListWidgetsVisibility())); - disconnect( model, SIGNAL(modelReset()), - this, SLOT(updateEmptyListWidgetsVisibility())); - } - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::deactivateEmptyListIndicator()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::addViewSwitchingEffects() -{ - // Add view switching effects, these are called when - // HbMainWindow::setCurrentView is called, may be removed once orbit - // has some built-in effects for view switching. - HbEffect::add(this, ":/view_show.fxml", "show"); - HbEffect::add(this, ":/view_hide.fxml", "hide"); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateEmptyListWidgetsVisibility() -{ - updateEmptyListLabelVisibility(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateEmptyListLabelVisibility() -{ - if ( mEmptyListLabel && model() ){ - LOGS_QDEBUG( "logs [UI] <-> LogsBaseView::updateEmptyListLabelVisibility()" ); - bool visible(model()->rowCount() == 0); - mEmptyListLabel->setVisible(visible); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::showCallDetails() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::showCallDetails()" ); - - if ( !mDetailsModel ){ - return; - } - - QVariant arg = qVariantFromValue( mDetailsModel ); - if ( mViewManager.activateView(LogsDetailsViewId, false, arg) ){ - mDetailsModel = 0; - } - - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::showCallDetails()" ); -} - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::deleteEvent() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::deleteEvent()" ); - if ( mDetailsModel ) { - mDetailsModel->clearEvent(); - } - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::deleteEvent()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateWidgetsSizeAndLayout() -{ -} - -// ----------------------------------------------------------------------------- -// Sets appropriate list widget layout using listView.setLayoutName() -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateListLayoutName( HbListView& listView, bool ignoreDialpad ) -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::updateListLayoutName()" ); - QString newLayout( logsListDefaultLayout ); - Qt::Orientation orientation = mViewManager.mainWindow().orientation(); - if (orientation == Qt::Horizontal) { - if (mDialpad->isOpen()) { - if (ignoreDialpad) { - newLayout = QString( logsListDefaultLayout ); - } else { - newLayout = QString( logsListLandscapeDialpadLayout ); - } - } else { - newLayout = QString( logsListLandscapeLayout ); - } - } else { - newLayout = QString( logsListDefaultLayout ); - } - - if (newLayout != listView.layoutName()) { - LOGS_QDEBUG_2( "logs [UI] setting new list layout name: ", newLayout ); - listView.setLayoutName( newLayout ); - } - - LOGS_QDEBUG( "logs [UI] <- LogsBaseView::updateListLayoutName()" ); -} - -// ----------------------------------------------------------------------------- -// Loads appropriate section from *.docml to resize list widget -// ----------------------------------------------------------------------------- -// -void LogsBaseView::updateListSize() -{ - LOGS_QDEBUG( "logs [UI] -> LogsBaseView::updateListSize()" ); - QString newSection( logsViewDefaultSection ); - Qt::Orientation orientation = mViewManager.mainWindow().orientation(); - - if (mDialpad->isOpen()) { - if (orientation == Qt::Horizontal) { - newSection = QString( logsViewLandscapeDialpadSection ); - } else { - newSection = QString( logsViewPortraitDialpadSection ); - } - } else { - newSection = QString( logsViewDefaultSection ); - } - - 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::handleOrientationChanged() -{ - 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 ); - } -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/logscomponentrepository.cpp --- a/logsui/logsapp/src/logscomponentrepository.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,257 +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: -* -*/ -//USER -#include "logscomponentrepository.h" -#include "logsrecentcallsview.h" -#include "logsmatchesview.h" -#include "logsdetailsview.h" -#include "logslogger.h" -#include "logsmodel.h" -#include "logsabstractviewmanager.h" - -//SYSTEM -#include -#include -#include -#include - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsComponentRepository::LogsComponentRepository(LogsAbstractViewManager& viewManager) - : HbDocumentLoader(), - mViewManager(viewManager), - mRecentCallsView(0), - mDetailsView(0), - mMatchesView(0), - mDialpad(0), - mDialpadKeyHandler(0) -{ - mModel = new LogsModel(); -} -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsComponentRepository::~LogsComponentRepository() -{ - LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::~LogsComponentRepository()" ); - - mRecentViewComponents.clear(); - mDetailsViewComponents.clear(); - mMatchesViewComponents.clear(); - delete mDialpadKeyHandler; - delete mDialpad; - delete mModel; - - LOGS_QDEBUG( "logs [UI] <- LogsComponentRepository::~LogsComponentRepository()" ); -} - - -// ----------------------------------------------------------------------------- -// HbDocumentLoader will not add HbToolBar into the object list (at least on w02), -// since toolbar has a parent (view), so let's do it ourselves -// ----------------------------------------------------------------------------- -// -void LogsComponentRepository::addToolbarToObjectList( QObjectList& list ) -{ - LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::addToolbarToObjectList()" ); - HbToolBar* toolbar = qobject_cast( findWidget( logsToolbarId ) ); - if ( toolbar && !list.contains(toolbar) ) { - LOGS_QDEBUG( "logs [UI] adding toolbar to object list" ); - list.append(toolbar); - } - LOGS_QDEBUG( "logs [UI] <- LogsComponentRepository::addToolbarToObjectList()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsRecentCallsView* LogsComponentRepository::recentCallsView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::recentCallsView()" ); - setObjectTreeToView( LogsRecentViewId ); - - if ( !mRecentCallsView ) { - bool ok = false; - mRecentViewComponents = load( logsRecentCallsViewFile, &ok ); - if ( ok ) { - mRecentCallsView = qobject_cast - ( findWidget(logsRecentCallsViewId) ); - - addToolbarToObjectList(mRecentViewComponents); - } else { - LOGS_QCRITICAL( "logs [UI] XML loading failed..." ); - } - } - - LOGS_QDEBUG( "logs [UI] <- LogsComponentRepository::recentCallsView()" ); - return mRecentCallsView; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsDetailsView* LogsComponentRepository::detailsView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::detailsView()" ); - setObjectTreeToView( LogsDetailsViewId ); - - if ( !mDetailsView ) { - bool ok = false; - mDetailsViewComponents = load( logsDetailsViewFile, &ok ); - if ( ok ) { - mDetailsView = qobject_cast - ( findWidget(logsDetailsViewId) ); - - addToolbarToObjectList(mDetailsViewComponents); - } else { - LOGS_QCRITICAL( "logs [UI] XML loading failed..." ); - } - } - LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::detailsView()" ); - return mDetailsView; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMatchesView* LogsComponentRepository::matchesView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::matchedCallsView()" ); - setObjectTreeToView( LogsMatchesViewId ); - - if ( !mMatchesView ) { - bool ok = false; - mMatchesViewComponents = load( logsMatchedCallsViewFile, &ok ); - if ( ok ) { - mMatchesView = qobject_cast - ( findWidget(logsMatchesViewId) ); - - addToolbarToObjectList(mMatchesViewComponents); - } else { - LOGS_QCRITICAL( "logs [UI] XML loading failed..." ); - } - } - - LOGS_QDEBUG( "logs [UI] <- LogsComponentRepository::matchedCallsView()" ); - return mMatchesView; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -Dialpad* LogsComponentRepository::dialpad() -{ - if ( !mDialpad ) { - mDialpad = new Dialpad(mViewManager.mainWindow()); - mDialpadKeyHandler = - new DialpadKeyHandler(mDialpad, mViewManager.mainWindow()); - } - return mDialpad; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsModel* LogsComponentRepository::model() const -{ - return mModel; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsComponentRepository::setObjectTreeToView( LogsAppViewId viewId ) -{ - reset(); - if ( viewId == LogsRecentViewId ) { - setObjectTree( mRecentViewComponents ); - } else if ( viewId == LogsDetailsViewId ) { - setObjectTree( mDetailsViewComponents ); - } else if ( viewId == LogsMatchesViewId ) { - setObjectTree( mMatchesViewComponents ); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QObject* LogsComponentRepository::createObject(const QString& type, - const QString &name) -{ - LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::createObject()" ); - - QObject* object = 0; - - if ( name == logsRecentCallsViewId ) { - LOGS_QDEBUG( "logs [UI] creating recent calls view" ); - object = new LogsRecentCallsView(*this, mViewManager); - } else if ( name == logsDetailsViewId ){ - LOGS_QDEBUG( "logs [UI] creating details view" ); - object = new LogsDetailsView(*this, mViewManager); - } else if ( name == logsMatchesViewId ){ - LOGS_QDEBUG( "logs [UI] creating matches view" ); - object = new LogsMatchesView(*this, mViewManager); - } else { - LOGS_QDEBUG( "logs [UI] creating object using document loader" ); - object = HbDocumentLoader::createObject( type, name ); - } - - if (object) - object->setObjectName(name); - - LOGS_QDEBUG( "logs [UI] <- LogsComponentRepository::createObject()" ); - return object; -} - - -// ----------------------------------------------------------------------------- -// LogsComponentRepository::loadSection -// ----------------------------------------------------------------------------- -// -bool LogsComponentRepository::loadSection( LogsAppViewId viewId, - const QString& sectionName ) - { - LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::loadSection()" ) - bool ok( false ); - - QString fileName; - if ( viewId == LogsRecentViewId ) { - fileName = logsRecentCallsViewFile; - } else if ( viewId == LogsMatchesViewId ) { - fileName = logsMatchedCallsViewFile; - } else if ( viewId == LogsDetailsViewId ) { - fileName = logsDetailsViewFile; - } - - if ( fileName.length() > 0 ) { - load( fileName, sectionName, &ok ); - } - - LOGS_QDEBUG_2( "logs [UI] -> LogsComponentRepository::loadSection(): ", ok ) - return ok; - } - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/logsdetailsview.cpp --- a/logsui/logsapp/src/logsdetailsview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,360 +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: -* -*/ -//USER -#include "logsdetailsview.h" -#include "logsdetailsmodel.h" -#include "logscall.h" -#include "logsmessage.h" -#include "logslogger.h" -#include "logscomponentrepository.h" -#include "logsabstractviewmanager.h" -#include "logsdefs.h" -#include "logscontact.h" - -//SYSTEM -#include -#include -#include - -Q_DECLARE_METATYPE(LogsDetailsModel*) - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsDetailsView::LogsDetailsView( - LogsComponentRepository& repository, LogsAbstractViewManager& viewManager ) - : LogsBaseView(LogsDetailsViewId, repository, viewManager), - mViewName(0), - mListView(0) -{ - LOGS_QDEBUG( "logs [UI] <-> LogsDetailsView::LogsDetailsView()" ); - - //TODO: taking away due to toolbar bug. If toolbar visibility changes on view - //activation, there will be a crash due to previous view effect is playing - //addViewSwitchingEffects(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsDetailsView::~LogsDetailsView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::~LogsDetailsView()" ); - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::~LogsDetailsView()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::activated(bool showDialer, QVariant args) -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::activated()" ); - //base class handling first - LogsBaseView::activated(showDialer, args); - - LogsDetailsModel* model = qVariantValue(args); - if ( !model ){ - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::activated(), no model" ); - return; - } - - if ( mListView && mDetailsModel && mDetailsModel != model ){ - mListView->setModel( 0 ); - delete mDetailsModel; - } - mDetailsModel = model; - - if (mViewName){ - mViewName->setHeading(mDetailsModel->headerData(0, Qt::Vertical).toString()); - } - - if ( mListView ){ - mListView->setModel( mDetailsModel );//ownership not transferred - } - - updateMenu(); - - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::activated()" ); -} - -// ----------------------------------------------------------------------------- -// LogsDetailsView::deactivated -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::deactivated() -{ - //base class handling first - LogsBaseView::deactivated(); - if ( mListView ){ - mListView->setModel( 0 ); - } - delete mDetailsModel; - mDetailsModel = 0; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::callKeyPressed() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::callKeyPressed()" ); - if ( mCall ){ - mCall->initiateCallback(); - } - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::callKeyPressed()" ); -} - -// ----------------------------------------------------------------------------- -// LogsDetailsView::initiateVoiceCall -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::initiateVoiceCall() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::initiateVoiceCall()" ); - if ( mCall ){ - mCall->call(LogsCall::TypeLogsVoiceCall); - } - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::initiateVoiceCall()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::initiateVideoCall() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::initiateVideoCall()" ); - if ( mCall ){ - mCall->call(LogsCall::TypeLogsVideoCall); - } - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::initiateVideoCall()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::addToContacts() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::addToContacts()" ); - if ( mContact ){ - // Use async connection to ensure that model can handle - // contact operation completion before view - QObject::connect(mContact, SIGNAL(saveCompleted(bool)), - this, SLOT(contactActionCompleted(bool)), - Qt::QueuedConnection); - this->saveContact(); - } - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::addToContacts()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::openContact() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::openContact()" ); - if ( mContact ){ - // Use async connection to ensure that model can handle - // contact operation completion before view - QObject::connect(mContact, SIGNAL(openCompleted(bool)), - this, SLOT(contactActionCompleted(bool)), - Qt::QueuedConnection); - mContact->open(); - } - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::openContact()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::contactActionCompleted(bool modified) -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::contactActionCompleted()" ); - - if (modified){ - updateMenu(); - if (mViewName){ - mViewName->setHeading( - mDetailsModel->headerData(0, Qt::Vertical).toString()); - } - } - - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::contactActionCompleted()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::deleteEvent() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::deleteEvent()" ); - if ( mDetailsModel ) { - mDetailsModel->clearEvent(); - handleBackSoftkey(); - } - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::deleteEvent()" ); -} - -// ----------------------------------------------------------------------------- -// LogsDetailsView::copyNumberToClipboard() -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::copyNumberToClipboard() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::copyNumberToClipboard()" ); - if ( mDetailsModel ) { - mDetailsModel->getNumberToClipboard(); - handleBackSoftkey(); - } - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::copyNumberToClipboard()" ); -} - -// ----------------------------------------------------------------------------- -// LogsDetailsView::handleBackSoftkey -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::handleBackSoftkey() -{ - mViewManager.activatePreviousView(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::initView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::initView()" ); - //base class handling first - LogsBaseView::initView(); - - mViewName = qobject_cast( - mRepository.findWidget( logsGroupboxDetailViewNameId ) ); - initListWidget(); - - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::initView()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QAbstractItemModel* LogsDetailsView::model() const -{ - return mDetailsModel; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::initListWidget() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::initListWidget()" ); - mListView = qobject_cast - ( mRepository.findWidget( logsDetailsListWidgetId ) ); - Q_ASSERT_X(mListView != 0, "logs [UI] ", "couldn't find list widget !!"); - - mListView->setItemRecycling(true); - - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::initListWidget() " ); -} - -// ----------------------------------------------------------------------------- -// LogsDetailsView::updateMenu -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::updateMenu() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::updateMenu()" ); - if ( !mDetailsModel ) { - return; - } - - updateCall( mDetailsModel->index(0) ); - updateMessage( mDetailsModel->index(0) ); - updateContact( mDetailsModel->index(0) ); - - HbAction* voiceCallAction = qobject_cast( - mRepository.findObject( logsDetailsViewVoiceCallMenuActionId ) ); - HbAction* videoCallAction = qobject_cast( - mRepository.findObject( logsCommonVideoCallMenuActionId ) ); - HbAction* internetCallAction = qobject_cast( - mRepository.findObject( logsDetailsViewInternetCallMenuActionId ) ); - HbAction* messageAction = qobject_cast( - mRepository.findObject( logsCommonMessageMenuActionId ) ); - HbAction* addToContactsAction = qobject_cast( - mRepository.findObject( logsDetailsAddToContactsMenuActionId ) ); - HbAction* openContactAction = qobject_cast( - mRepository.findObject( logsDetailsOpenContactMenuActionId ) ); - - bool voiceCallAvailable(false); - bool videoCallAvailable(false); - bool internetCallAvailable(false); // Currently always disabled - if (mCall) { - foreach( LogsCall::CallType callType, mCall->allowedCallTypes() ){ - if ( callType == LogsCall::TypeLogsVoiceCall ){ - voiceCallAvailable = true; - } else if ( callType == LogsCall::TypeLogsVideoCall ) { - videoCallAvailable = true; - } - } - } - - bool contactCanBeAdded(false); - bool contactCanBeOpened(false); - if (mContact){ - if (mContact->allowedRequestType() == LogsContact::TypeLogsContactSave){ - contactCanBeAdded = true; - } - if (mContact->allowedRequestType() == LogsContact::TypeLogsContactOpen){ - contactCanBeOpened = true; - } - } - - toggleActionAvailability(voiceCallAction, voiceCallAvailable); - toggleActionAvailability(videoCallAction, videoCallAvailable); - toggleActionAvailability(internetCallAction, internetCallAvailable); - toggleActionAvailability(messageAction, mMessage); - toggleActionAvailability(addToContactsAction, contactCanBeAdded); - toggleActionAvailability(openContactAction, contactCanBeOpened); - - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::updateMenu()" ); -} - -// ----------------------------------------------------------------------------- -// LogsDetailsView::updateWidgetsSizeAndLayout -// ----------------------------------------------------------------------------- -// -void LogsDetailsView::updateWidgetsSizeAndLayout() -{ - LOGS_QDEBUG( "logs [UI] -> LogsDetailsView::updateWidgetsSizeAndLayout()" ); - if ( mListView ) { - updateListLayoutName(*mListView, true); - updateListSize(); - } - LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::updateWidgetsSizeAndLayout()" ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/logseffecthandler.cpp --- a/logsui/logsapp/src/logseffecthandler.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,230 +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: -* -*/ -//USER -#include "logseffecthandler.h" -#include "logslogger.h" - -//SYSTEM -#include -#include -#include - -const int logsMoveByExtra = 20; -const int logsEffectDelayBetween = 200; -const int logsEffectAppearDurationInMs = 500; -const int logsEffectDissappearDurationInMs = 300; - -const int logsDissappearByMovingIndex = 0; -const int logsAppearByMovingIndex = 2; - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsEffectHandler::LogsEffectHandler() : QObject() -{ - LOGS_QDEBUG( "logs [UI] -> LogsEffectHandler::LogsEffectHandler()" ); - - QPropertyAnimation* itemAppearByMovingAnimation = new QPropertyAnimation(); - QPropertyAnimation* itemAppearByMovingAnimation2 = new QPropertyAnimation(); - QPropertyAnimation* itemDissappearByMovingAnimation = new QPropertyAnimation(); - QPropertyAnimation* itemDissappearByMovingAnimation2 = new QPropertyAnimation(); - - mItemAppearByFadingAnimation = new QPropertyAnimation(); - mItemDissappearByFadingAnimation = new QPropertyAnimation(); - - mMoveGroup = new QSequentialAnimationGroup; - mMoveGroup2 = new QSequentialAnimationGroup; - mFadeGroup = new QSequentialAnimationGroup; - - mMoveGroup->addAnimation(itemDissappearByMovingAnimation); - mMoveGroup->addPause(logsEffectDelayBetween); - mMoveGroup->addAnimation(itemAppearByMovingAnimation); - - mMoveGroup2->addAnimation(itemDissappearByMovingAnimation2); - mMoveGroup2->addPause(logsEffectDelayBetween); - mMoveGroup2->addAnimation(itemAppearByMovingAnimation2); - - mFadeGroup->addAnimation(mItemDissappearByFadingAnimation); - mFadeGroup->addAnimation(mItemAppearByFadingAnimation); - - connect(mMoveGroup, SIGNAL(currentAnimationChanged(QAbstractAnimation *)), - this, SLOT( moveAnimationChanged(QAbstractAnimation *))); - connect(mFadeGroup, SIGNAL(currentAnimationChanged(QAbstractAnimation *)), - this, SLOT( fadeAnimationChanged(QAbstractAnimation *))); - - LOGS_QDEBUG( "logs [UI] <- LogsEffectHandler::LogsEffectHandler()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsEffectHandler::~LogsEffectHandler() -{ - LOGS_QDEBUG( "logs [UI] -> LogsEffectHandler::~LogsEffectHandler()" ); - - // Groups delete attached animations - delete mMoveGroup; - delete mMoveGroup2; - delete mFadeGroup; - - LOGS_QDEBUG( "logs [UI] <- LogsEffectHandler::~LogsEffectHandler()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsEffectHandler::moveAnimationChanged(QAbstractAnimation *currentAnimation) -{ - if ( mMoveGroup->indexOfAnimation(currentAnimation) == 1 ) { - emit dissappearByMovingComplete(); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsEffectHandler::fadeAnimationChanged(QAbstractAnimation *currentAnimation) -{ - if ( mFadeGroup->indexOfAnimation(currentAnimation) == 1 ) { - emit dissappearByFadingComplete(); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsEffectHandler::startDissappearAppearByFadingEffect(QObject& effectTarget) -{ - initOpacityEffect(*mItemDissappearByFadingAnimation, &effectTarget, - 1.0, 0.0, logsEffectDissappearDurationInMs); - initOpacityEffect(*mItemAppearByFadingAnimation, &effectTarget, - 0.0, 1.0, logsEffectAppearDurationInMs); - mFadeGroup->start(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsEffectHandler::startDissappearAppearByMovingEffect( - QObject& effectTarget, QObject& secondaryEffectTarget, - bool dissappearToLeft, int origX) -{ - doStartDissappearAppearByMovingEffect( - *mMoveGroup, effectTarget, dissappearToLeft, origX); - doStartDissappearAppearByMovingEffect( - *mMoveGroup2, secondaryEffectTarget, dissappearToLeft, origX); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsEffectHandler::doStartDissappearAppearByMovingEffect( - QSequentialAnimationGroup& group, QObject& effectTarget, - bool dissappearToLeft, int origX) -{ - initDissappearByMovingEffect( - static_cast(*group.animationAt(logsDissappearByMovingIndex)), - &effectTarget, dissappearToLeft, origX); - initAppearByMovingEffect( - static_cast(*group.animationAt(logsAppearByMovingIndex)), - &effectTarget, !dissappearToLeft, origX); - group.start(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsEffectHandler::initAppearByMovingEffect( - QPropertyAnimation& animation, QObject* effectTarget, bool appearFromLeft, int origX) -{ - LOGS_QDEBUG( "logs [UI] -> LogsEffectHandler::startAppearByMovingEffect()" ); - - Q_ASSERT(!hbInstance->allMainWindows().isEmpty()); - int moveBy = hbInstance->allMainWindows().at(0)->layoutRect().width() + logsMoveByExtra; - int startPos = appearFromLeft ? -moveBy : moveBy; - QEasingCurve easing(QEasingCurve::OutQuad); // decelerating - initMoveHorizontallyEffect( - animation, effectTarget, startPos, origX, - logsEffectAppearDurationInMs, easing); - - LOGS_QDEBUG( "logs [UI] <- LogsEffectHandler::startAppearByMovingEffect()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsEffectHandler::initDissappearByMovingEffect( - QPropertyAnimation& animation, QObject* effectTarget, bool dissappearToLeft, int origX) -{ - LOGS_QDEBUG( "logs [UI] -> LogsEffectHandler::startDissappearByMovingEffect()" ); - - Q_ASSERT(!hbInstance->allMainWindows().isEmpty()); - int moveBy = hbInstance->allMainWindows().at(0)->layoutRect().width() + logsMoveByExtra; - int endPos = dissappearToLeft ? -moveBy : moveBy; - QEasingCurve easing(QEasingCurve::InQuad); // accelerating - initMoveHorizontallyEffect( - animation, effectTarget, origX, endPos, - logsEffectDissappearDurationInMs, easing); - - LOGS_QDEBUG( "logs [UI] <- LogsEffectHandler::startDissappearByMovingEffect()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsEffectHandler::initOpacityEffect( - QPropertyAnimation& animation, QObject* effectTarget, - qreal startVal, qreal endVal, int duration) -{ - if (animation.state() == QAbstractAnimation::Running ){ - animation.stop(); - } - animation.setTargetObject(effectTarget); - animation.setPropertyName("opacity"); - animation.setStartValue(startVal); - animation.setEndValue(endVal); - animation.setDuration(duration); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsEffectHandler::initMoveHorizontallyEffect( - QPropertyAnimation& animation, QObject* effectTarget, - int startVal, int endVal, int duration, const QEasingCurve& easingCurve) -{ - if (animation.state() == QAbstractAnimation::Running ){ - animation.stop(); - } - animation.setTargetObject(effectTarget); - animation.setPropertyName("x"); - animation.setStartValue(startVal); - animation.setEndValue(endVal); - animation.setDuration(duration); - animation.setEasingCurve(easingCurve); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/logsmainwindow.cpp --- a/logsui/logsapp/src/logsmainwindow.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +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 "logsmainwindow.h" -#include "logslogger.h" -#include -#include - - -// ----------------------------------------------------------------------------- -// LogsMainWindow::LogsMainWindow -// ----------------------------------------------------------------------------- -// -LogsMainWindow::LogsMainWindow() : HbMainWindow() -{ - if ( viewport() ){ - viewport()->grabGesture(Qt::SwipeGesture); - } -} - -// ----------------------------------------------------------------------------- -// LogsMainWindow::~LogsMainWindow -// ----------------------------------------------------------------------------- -// -LogsMainWindow::~LogsMainWindow() -{ - if ( viewport() ){ - viewport()->ungrabGesture(Qt::SwipeGesture); - } -} - -// ----------------------------------------------------------------------------- -// LogsMainWindow::sendAppToBackground -// ----------------------------------------------------------------------------- -// -void LogsMainWindow::sendAppToBackground() -{ - LOGS_QDEBUG( "logs [UI] -> LogsMainWindow::sendAppToBackground" ); - XQServiceUtil::toBackground(true); - LOGS_QDEBUG( "logs [UI] <- LogsMainWindow::sendAppToBackground" ); -} - -// ----------------------------------------------------------------------------- -// LogsMainWindow::keyPressEvent -// ----------------------------------------------------------------------------- -// -void LogsMainWindow::keyPressEvent( QKeyEvent *event ) -{ - LOGS_QDEBUG_2( "LogsMainWindow::keyPressEvent, key", event->key() ); - if ( event->key() == Qt::Key_Call || event->key() == Qt::Key_Yes ) { - // Handling at window level seems to be only way to avoid other - // applications to handle call key as well. - emit callKeyPressed(); - event->accept(); - return; - } - HbMainWindow::keyPressEvent(event); -} - -// ----------------------------------------------------------------------------- -// LogsMainWindow::event -// ----------------------------------------------------------------------------- -// -bool LogsMainWindow::event(QEvent *event) -{ - if ( event->type() == QEvent::FocusIn ){ - emit appFocusGained(); - } - return HbMainWindow::event(event); -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/logsmatchesview.cpp --- a/logsui/logsapp/src/logsmatchesview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,339 +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: -* -*/ -//USER -#include "logsmatchesview.h" -#include "logscomponentrepository.h" -#include "logsabstractviewmanager.h" -#include "logsdefs.h" -#include "logslogger.h" -#include "logsmodel.h" -#include "logsmatchesmodel.h" -#include "logscall.h" -#include "logscontact.h" -#include "logsmessage.h" - -//SYSTEM -#include -#include -#include -#include -#include -#include -#include - -Q_DECLARE_METATYPE(LogsMatchesModel*) - -// ----------------------------------------------------------------------------- -// LogsMatchesView::LogsMatchesView -// ----------------------------------------------------------------------------- -// -LogsMatchesView::LogsMatchesView( - LogsComponentRepository& repository, LogsAbstractViewManager& viewManager ) - : LogsBaseView(LogsMatchesViewId, repository, viewManager), - mListView(0), - mModel(0), - mAddToContactsButton(0) -{ - LOGS_QDEBUG( "logs [UI] <-> LogsMatchesView::LogsMatchesView()" ); -} - -// ----------------------------------------------------------------------------- -// LogsMatchesView::~LogsMatchesView -// ----------------------------------------------------------------------------- -// -LogsMatchesView::~LogsMatchesView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::~LogsMatchesView()" ); - delete mModel; - LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::~LogsMatchesView()" ); -} - -// ----------------------------------------------------------------------------- -// LogsMatchesView::activated -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::activated(bool showDialer, QVariant args) -{ - //base class handling first - LogsBaseView::activated(showDialer, args); - - LogsMatchesModel* model = qVariantValue(args); - updateModel(model); - dialpadEditorTextChanged(); - - activateEmptyListIndicator(mModel); -} - -// ----------------------------------------------------------------------------- -// LogsMatchesView::deactivated -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::deactivated() -{ - //base class handling first - LogsBaseView::deactivated(); - - deactivateEmptyListIndicator(mModel); - - delete mModel; - mModel = 0; -} - -// ----------------------------------------------------------------------------- -// LogsMatchesView::initView -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::initView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::initView()" ); - //base class handling first - LogsBaseView::initView(); - - initListWidget(); - - mAddToContactsButton = qobject_cast( - mRepository.findWidget( logsButtonAddToContactsId ) ); - - LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::initView()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QAbstractItemModel* LogsMatchesView::model() const -{ - return mModel; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::callKeyPressed() -{ - LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::callKeyPressed()" ); - - 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 -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::initListWidget() -{ - LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::initListWidget()" ); - mListView = qobject_cast - ( mRepository.findWidget( logsListWidgetId ) ); - Q_ASSERT_X(mListView != 0, "logs [UI] ", "couldn't find list widget !!"); - - mListView->setItemRecycling(true); - 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&))); - - LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::initListWidget() " ); -} - -// ----------------------------------------------------------------------------- -// LogsMatchesView::updateModel -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::updateModel(LogsMatchesModel* model) -{ - LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::updateModel()" ); - - if ( !model || model != mModel ){ - LOGS_QDEBUG( "logs [UI] Delete old model" ); - delete mModel; - mModel = 0; - } - - if ( !model ){ - LOGS_QDEBUG( "logs [UI] Create new model" ); - mModel = mRepository.model()->logsMatchesModel(); - } else { - LOGS_QDEBUG( "logs [UI] Use given model" ); - mModel = model; - } - if ( mListView ) { - mListView->setModel( mModel );//ownership not transferred - } - LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::updateModel()" ); -} - -// ----------------------------------------------------------------------------- -// LogsMatchesView::dialpadEditorTextChanged -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::dialpadEditorTextChanged() -{ - updateCallButton(); - updateMenu(); - - QString pattern = mDialpad->editor().text(); - if ( pattern.isEmpty() ){ - // Treat empty input field same was as back press - handleBackSoftkey(); - } else if ( mModel ) { - mModel->logsMatches( pattern ); - } -} - -// ----------------------------------------------------------------------------- -// LogsMatchesView::dialpadOpened -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::dialpadOpened() -{ - LogsBaseView::dialpadOpened(); - updateAddContactButton(); -} - -// ----------------------------------------------------------------------------- -// LogsMatchesView::dialpadClosed -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::dialpadClosed() -{ - LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::dialpadClosed()" ); - updateWidgetsSizeAndLayout(); - updateAddContactButton(); - LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::dialpadClosed()" ); -} - -// ----------------------------------------------------------------------------- -// LogsMatchesView::updateWidgetsSizeAndLayout -// ----------------------------------------------------------------------------- -// -void LogsMatchesView::updateWidgetsSizeAndLayout() -{ - LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::updateWidgetsSizeAndLayout()" ); - if ( mListView ) { - updateMenu(); - updateListLayoutName(*mListView); - 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 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/logsrecentcallsview.cpp --- a/logsui/logsapp/src/logsrecentcallsview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,680 +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: -* -*/ -//USER -#include "logsrecentcallsview.h" -#include "logscomponentrepository.h" -#include "logsabstractviewmanager.h" -#include "logsmodel.h" -#include "logsdefs.h" -#include "logslogger.h" -#include "logscall.h" -#include "logsmessage.h" -#include "logscontact.h" -#include "logseffecthandler.h" -#include "logsmatchesmodel.h" - -//SYSTEM -#include -#include -#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 -// ----------------------------------------------------------------------------- -// -LogsRecentCallsView::LogsRecentCallsView( - LogsComponentRepository& repository, LogsAbstractViewManager& viewManager ) - : LogsBaseView(LogsRecentViewId, repository, viewManager), - mViewName(0), - mListView(0), - mFilter(0), - mCurrentView(LogsServices::ViewAll), - mAppearingView(LogsServices::ViewAll), - mMoveLeftInList(false), - mEffectHandler(0), - mListViewX(0), - mMatchesModel(0), - mMarkingMissedAsSeen(false) -{ - LOGS_QDEBUG( "logs [UI] <-> LogsRecentCallsView::LogsRecentCallsView()" ); - mModel = mRepository.model(); - - mConversionMap.insert(LogsServices::ViewAll, LogsBaseView::ViewAll); - mConversionMap.insert(LogsServices::ViewCalled, LogsBaseView::ViewCalled); - mConversionMap.insert(LogsServices::ViewReceived, LogsBaseView::ViewReceived); - mConversionMap.insert(LogsServices::ViewMissed, LogsBaseView::ViewMissed); - - //TODO: taking away due to toolbar bug. If toolbar visibility changes on view - //activation, there will be a crash due to previous view effect is playing - //addViewSwitchingEffects(); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::~LogsRecentCallsView -// ----------------------------------------------------------------------------- -// -LogsRecentCallsView::~LogsRecentCallsView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::~LogsRecentCallsView()" ); - - delete mMatchesModel; - mModel = 0; - - delete mEffectHandler; - delete mFilter; - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::~LogsRecentCallsView()" ); -} - - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::activated -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::activated(bool showDialer, QVariant args) -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::activated()" ); - //base class handling first - LogsBaseView::activated(showDialer, args); - - LogsServices::LogsView view = static_cast( args.toInt() ); - - //View update is needed when we activate view for the first time (!mFilter) - //or if view has to be changed - if ( !mFilter || ( !args.isNull() && (mCurrentView != view) ) ) { - updateView( view ); - } - activateEmptyListIndicator(mFilter); - - mDialpad->editor().setText(QString()); - - mModel->clearMissedCallsCounter(); - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::activated()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::deactivated -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::deactivated() -{ - //base class handling first - LogsBaseView::deactivated(); - - deactivateEmptyListIndicator(mFilter); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::isExitAllowed -// ----------------------------------------------------------------------------- -// -bool LogsRecentCallsView::isExitAllowed() -{ - bool marking = markMissedCallsSeen(); - return !marking; -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::initView -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::initView() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::initView()" ); - //base class handling first - LogsBaseView::initView(); - - mViewName = - qobject_cast( mRepository.findWidget( logsGroupboxViewNameId ) ); - - addStringsToMap(); - initListWidget(); - - mEffectHandler = new LogsEffectHandler; - connect(mEffectHandler, SIGNAL(dissappearByMovingComplete()), - this, SLOT(dissappearByMovingComplete())); - connect(mEffectHandler, SIGNAL(dissappearByFadingComplete()), - this, SLOT(dissappearByFadingComplete())); - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::initView()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::model -// ----------------------------------------------------------------------------- -// -QAbstractItemModel* LogsRecentCallsView::model() const -{ - return mFilter; -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::callKeyPressed -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::callKeyPressed() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::callKeyPressed()" ); - // Call to topmost item in current list - if ( mListView && mFilter && mFilter->hasIndex(0,0) ) { - QModelIndex topIndex = mFilter->index(0,0); - mListView->scrollTo( topIndex ); - mListView->setCurrentIndex( topIndex, QItemSelectionModel::Select ); - initiateCallback(topIndex); - } - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::callKeyPressed()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::markingCompleted -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::markingCompleted(int err) -{ - LOGS_QDEBUG_2( "logs [UI] -> LogsRecentCallsView::markingCompleted(), err", err ); - Q_UNUSED(err); - mMarkingMissedAsSeen = false; - emit exitAllowed(); - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::markingCompleted()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::openDialpad -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::openDialpad() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::openDialpad()" ); - LogsBaseView::openDialpad(); - - // Create matches model already before any input to optimize - // first search - if ( !mMatchesModel ){ - mMatchesModel = mModel->logsMatchesModel(); - } - - updateCallButton(); - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::openDialpad()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::dialpadEditorTextChanged -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::dialpadEditorTextChanged() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::dialpadEditorTextChanged()" ); - if ( mDialpad->editor().text().length() > 0 ) { - QVariant arg = qVariantFromValue( mMatchesModel ); - if ( mViewManager.activateView( LogsMatchesViewId, true, arg ) ){ - mMatchesModel = 0; // Ownership was given to matches view - } - } else { - updateCallButton(); - } - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::dialpadEditorTextChanged()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::clearList -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::clearList() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::clearList()->" ); - if ( mFilter ) { - - HbMessageBox *note = new HbMessageBox("", HbMessageBox::MessageTypeQuestion); - note->setHeadingWidget(new HbLabel(hbTrId("txt_dialer_ui_title_clear_list"))); - note->setText(hbTrId("txt_dialer_ui_info_all_call_events_will_be_remo")); - note->setPrimaryAction(new HbAction(hbTrId("txt_common_button_ok"), note)); - note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); - HbAction *selected = note->exec(); - - if (selected == note->primaryAction()){ - mModel->clearList( mFilter->clearType() ); - } - delete note; - } - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::clearList()<-" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::updateView -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::updateView(LogsServices::LogsView view) -{ - LOGS_QDEBUG_2( "logs [UI] -> LogsRecentCallsView::updateView(), view:", view ); - mCurrentView = view; - LogsFilter::FilterType filter = getFilter( view ); - updateFilter(filter); - updateViewName(); - updateContextMenuItems(mCurrentView); - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateView()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::changeFilter -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::changeFilter(HbAction* action) -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::changeFilter()" ); - LogsServices::LogsView view = mActionMap.key( action->objectName(), - LogsServices::ViewAll ); - updateContextMenuItems(view); - changeView(view); - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::changeFilter()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::handleBackSoftkey -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::handleBackSoftkey() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::handleBackSoftkey()" ); - handleExit(); - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::handleBackSoftkey()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::addStringsToMap -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::addStringsToMap() -{ - 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")); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::initListWidget -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::initListWidget() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::initListWidget()" ); - mListView = qobject_cast - ( mRepository.findWidget( logsListWidgetId ) ); - Q_ASSERT_X(mListView != 0, "logs [UI] ", "couldn't find list widget !!"); - - - // Optimize memory usage, list reserves only memory for visible items - mListView->setItemRecycling(true); - - connect(mListView, SIGNAL(activated(const QModelIndex)), - this, SLOT(initiateCallback(const QModelIndex))); - connect(mListView, - SIGNAL(longPressed(HbAbstractViewItem*, const QPointF&)), - this, - SLOT(showListItemMenu(HbAbstractViewItem*, const QPointF&))); - - mListView->setScrollingStyle(HbScrollArea::PanOrFlick); - mListView->setFrictionEnabled(true); - - mListViewX = mListView->pos().x(); - - grabGesture(Qt::SwipeGesture); - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::initListWidget() " ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::updateFilter -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::updateFilter(LogsFilter::FilterType type) -{ - if ( mListView ) { - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::updateFilter()" ); - - deactivateEmptyListIndicator(mFilter); - - handleMissedCallsMarking(); - - delete mFilter; - mFilter = 0; - mFilter = new LogsFilter( type ); - mFilter->setSourceModel( mModel ); - - mListView->setModel( mFilter );//ownership not transferred - - if ( mFilter->hasIndex(0,0) ) { - mListView->scrollTo( mFilter->index(0,0) ); - } - - activateEmptyListIndicator(mFilter); - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateFilter() " ); - } else { - LOGS_QWARNING( "logs [UI] LogsRecentCallsView::updateFilter(), !no list widget!" ); - } -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::updateViewName -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::updateViewName() -{ - if ( mViewName ) { - mViewName->setHeading( mTitleMap.value(mConversionMap.value(mCurrentView))); - } -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::updateContextMenuItems -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::updateContextMenuItems(LogsServices::LogsView view) -{ - LOGS_QDEBUG_2( - "logs [UI] -> LogsRecentCallsView::updateContextMenuItems(), view:", view ); - if ( mShowFilterMenu ) { - QString activeActionName = mActionMap.value(view); - foreach (QAction* action, mShowFilterMenu->actions() ) { - action->setChecked( action->objectName() == activeActionName ); - } - } - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateContextMenuItems()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::getFilter -// ----------------------------------------------------------------------------- -// -LogsFilter::FilterType LogsRecentCallsView::getFilter(LogsServices::LogsView view) -{ - LogsFilter::FilterType filter = LogsFilter::All; - switch (view){ - case LogsServices::ViewAll: - filter = LogsFilter::All; - break; - case LogsServices::ViewReceived: - filter = LogsFilter::Received; - break; - case LogsServices::ViewCalled: - filter = LogsFilter::Called; - break; - case LogsServices::ViewMissed: - filter = LogsFilter::Missed; - break; - default: - break; - } - return filter; -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::gestureEvent -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::gestureEvent(QGestureEvent *event) -{ - 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); - } - } - } - } -} - -// ----------------------------------------------------------------------------- -// 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() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::leftFlick()" ); - if ( mConversionMap.value(mCurrentView) + 1 < mTitleMap.count() ){ - LogsBaseView::LogsViewMap viewmap = - static_cast(mConversionMap.value(mCurrentView) +1); - changeView( mConversionMap.key(viewmap) ); - } else { - // At end of the lists, rollover to first list - changeView( mConversionMap.key(static_cast(0)), true ); - } - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::leftFlick()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::rightFlick -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::rightFlick() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::rightFlick()" ); - if ( mConversionMap.value(mCurrentView) > 0 ){ - LogsBaseView::LogsViewMap viewmap = - static_cast(mConversionMap.value(mCurrentView) - 1); - changeView( mConversionMap.key(viewmap) ); - } else { - // At beginning of the lists, rollover to last list - changeView(mConversionMap.key( static_cast(mTitleMap.count() - 1)), true ); - } - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::rightFlick()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::changeView -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::changeView(LogsServices::LogsView view, bool rollOver) -{ - LOGS_QDEBUG_2( "logs [UI] -> LogsRecentCallsView::changeView(), view:", view ); - - if ( view == mCurrentView ){ - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::changeView(), view already correct" ); - // Already correct view, running animation can continue but make sure that - // appearing view is then correct. - mAppearingView = view; - return; - } - - if ( rollOver ){ - mMoveLeftInList = mConversionMap.value(view) > mConversionMap.value(mCurrentView); - } else { - mMoveLeftInList = mConversionMap.value(view) < mConversionMap.value(mCurrentView); - } - - mAppearingView = view; - mEffectHandler->startDissappearAppearByFadingEffect(*mViewName); - mEffectHandler->startDissappearAppearByMovingEffect( - *mListView, *mEmptyListLabel, !mMoveLeftInList, mListViewX); - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::changeView()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::dissappearByFadingComplete() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::dissappearByFadingComplete()" ) - - // Previous view name has dissappeared by fading, set new view name - // as it is brought visible by effect - mViewName->setHeading( mTitleMap.value(mConversionMap.value(mAppearingView)) ); - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::dissappearByFadingComplete()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::dissappearByMovingComplete() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::dissappearByMovingComplete()" ) - - updateView( mAppearingView ); - - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::dissappearByMovingComplete()" ) -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::updateMenu -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::updateMenu() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::updateMenu()" ); - HbAction* action = qobject_cast( - mRepository.findObject( logsRecentViewClearListMenuActionId ) ); - if ( action && model() ) { - bool visible( model()->rowCount() > 0 ); - action->setVisible( visible ); - } - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateMenu()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::updateEmptyListWidgetsVisibility -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::updateEmptyListWidgetsVisibility() -{ - updateMenu(); - updateEmptyListLabelVisibility(); - updateCallButton(); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::updateWidgetsSizeAndLayout -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::updateWidgetsSizeAndLayout() -{ - LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::updateWidgetsSizeAndLayout()" ); - if ( mListView ) { - updateListLayoutName(*mListView); - updateListSize(); - } - LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateWidgetsSizeAndLayout()" ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::updateCallButton -// If dialpad contains text or there is items in list, call button is enabled -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::updateCallButton() -{ - bool isVisible = !mDialpad->editor().text().isEmpty(); - if ( !isVisible && mFilter ) { - isVisible = ( mFilter->rowCount() > 0 ); - } - mDialpad->setCallButtonEnabled( isVisible ); -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::handleMissedCallsMarking -// ----------------------------------------------------------------------------- -// -void LogsRecentCallsView::handleMissedCallsMarking() -{ - if ( mFilter && !mMarkingMissedAsSeen && - ( mFilter->filterType() == LogsFilter::Missed || - mFilter->filterType() == LogsFilter::All ) ){ - // Don't care if timer would be already running, slot's implementation - // takes care that marking is done only once - LOGS_QDEBUG( "logs [UI] <-> LogsRecentCallsView::handleMissedCallsMarking()" ); - QTimer::singleShot( - logsMissedCallsMarkingDelayMs, this, SLOT(markMissedCallsSeen()) ); - } -} - -// ----------------------------------------------------------------------------- -// LogsRecentCallsView::markMissedCallsSeen -// ----------------------------------------------------------------------------- -// -bool LogsRecentCallsView::markMissedCallsSeen() -{ - if ( !mMarkingMissedAsSeen ){ - connect( mModel, SIGNAL(markingCompleted(int)), - this, SLOT(markingCompleted(int)) ); - mMarkingMissedAsSeen = - mModel->markEventsSeen(LogsModel::TypeLogsClearMissed); - } - return mMarkingMissedAsSeen; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/logsservicehandler.cpp --- a/logsui/logsapp/src/logsservicehandler.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +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: -* -*/ -//USER -#include "logsservicehandler.h" -#include "logslogger.h" -#include - -//SYSTEM - -// ----------------------------------------------------------------------------- -// LogsService::LogsService -// ----------------------------------------------------------------------------- -// -LogsServiceHandler::LogsServiceHandler() - : XQServiceProvider(QLatin1String("com.nokia.services.logsservices.starter"),0), - mActivatedView(0) -{ - LOGS_QDEBUG( "logs [UI] -> LogsServiceHandler::LogsServiceHandler()" ) - - publishAll(); - mIsAppStartedUsingService = XQServiceUtil::isService(); - - LOGS_QDEBUG_2( - "logs [UI] <- LogsServiceHandler::LogsServiceHandler(), is service", - mIsAppStartedUsingService ) -} - -// ----------------------------------------------------------------------------- -// LogsServiceHandler::~LogsServiceHandler -// ----------------------------------------------------------------------------- -// -LogsServiceHandler::~LogsServiceHandler() -{ - LOGS_QDEBUG( "logs [UI] <-> LogsServiceHandler::~LogsServiceHandler()" ) -} - -// ----------------------------------------------------------------------------- -// LogsServiceHandler::start -// ----------------------------------------------------------------------------- -// -int LogsServiceHandler::start(int activatedView, bool showDialpad) -{ - LOGS_QDEBUG_2( "logs [UI] -> LogsServiceHandler::start(), view:", activatedView ) - - if ( activatedView < LogsServices::ViewAll || - activatedView > LogsServices::ViewMissed ){ - LOGS_QDEBUG( "logs [UI] <- LogsServiceHandler::start(), incorrect view" ) - return -1; - } - mActivatedView = activatedView; - emit activateView((LogsServices::LogsView)mActivatedView, showDialpad); - - LOGS_QDEBUG( "logs [UI] Bring app to foreground" ) - XQServiceUtil::toBackground(false); - - LOGS_QDEBUG( "logs [UI] <- LogsServiceHandler::start()" ) - return 0; -} - -// ----------------------------------------------------------------------------- -// LogsServiceHandler::currentlyActivatedView -// ----------------------------------------------------------------------------- -// -LogsServices::LogsView LogsServiceHandler::currentlyActivatedView() -{ - return (LogsServices::LogsView)mActivatedView; -} - -// ----------------------------------------------------------------------------- -// LogsServiceHandler::isStartedUsingService -// ----------------------------------------------------------------------------- -// -bool LogsServiceHandler::isStartedUsingService() const -{ - return mIsAppStartedUsingService; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/logsviewmanager.cpp --- a/logsui/logsapp/src/logsviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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: -* -*/ -//USER -#include "logsviewmanager.h" -#include "logscomponentrepository.h" -#include "logsrecentcallsview.h" -#include "logsmatchesview.h" -#include "logsdetailsview.h" -#include "logsfilter.h" -#include "logsdefs.h" -#include "logslogger.h" -#include "logsservicehandler.h" -#include "logsmainwindow.h" - -//SYSTEM -#include -#include -#include -#include - -// ----------------------------------------------------------------------------- -// LogsViewManager::LogsViewManager -// ----------------------------------------------------------------------------- -// -LogsViewManager::LogsViewManager( - LogsMainWindow& mainWindow, LogsServiceHandler& service ) : - 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(); - - connect( &mService, SIGNAL( activateView(LogsServices::LogsView, bool) ), - this, SLOT( changeRecentView(LogsServices::LogsView, bool) )); - - connect( &mMainWindow, SIGNAL(appFocusGained()), this, SLOT(appFocusGained()) ); - - LOGS_QDEBUG( "logs [UI] <- LogsViewManager::LogsViewManager()" ); -} - - -// ----------------------------------------------------------------------------- -// LogsViewManager::~LogsViewManager -// ----------------------------------------------------------------------------- -// -LogsViewManager::~LogsViewManager() -{ - LOGS_QDEBUG( "logs [UI] -> LogsViewManager::~LogsViewManager()" ); - - delete mComponentsRepository; - - LOGS_QDEBUG( "logs [UI] <- LogsViewManager::~LogsViewManager()" ); -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::initViews -// ----------------------------------------------------------------------------- -// -void LogsViewManager::initViews() -{ - LOGS_QDEBUG( "logs [UI] -> LogsViewManager::initViews()" ); - - // Disable view switching as otherwise flick gestures change - // views which is not desired. - //Deprecated: - //mMainWindow.setViewSwitchingEnabled(false); - - LogsRecentCallsView* view = mComponentsRepository->recentCallsView(); - Q_ASSERT_X(view != 0, "logs [UI] ", "recentCallsView not found!"); - LOGS_QDEBUG( "logs [UI] adding view" ); - mViewStack.append(view); - mMainWindow.addView(view); - - // If app was started by using service request, wait the request - // to appear before activating view. - if ( !mService.isStartedUsingService() ){ - changeRecentView( mService.currentlyActivatedView(), false ); - } - - LogsDetailsView* detailsView = mComponentsRepository->detailsView(); - mViewStack.append(detailsView); - mMainWindow.addView(detailsView); - - LogsMatchesView* matchesView = mComponentsRepository->matchesView(); - mViewStack.append(matchesView); - mMainWindow.addView(matchesView); - - mComponentsRepository->setObjectTreeToView( LogsRecentViewId ); - - LOGS_QDEBUG( "logs [UI] <- LogsViewManager::initViews()" ); -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::changeRecentView -// ----------------------------------------------------------------------------- -// -void LogsViewManager::changeRecentView(LogsServices::LogsView view, bool showDialpad) -{ - QVariant args(view); - doActivateView(LogsRecentViewId, showDialpad, args); -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::proceedExit -// ----------------------------------------------------------------------------- -// -void LogsViewManager::proceedExit() -{ - LOGS_QDEBUG( "logs [UI] -> LogsViewManager::proceedExit()" ); - exitApplication(); - LOGS_QDEBUG( "logs [UI] <- LogsViewManager::proceedExit()" ); -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::appFocusGained -// Dialer is sent to background in case some asycn operations need to -// be completed before app can be really exited. If app is brought -// to foreground during that period, asycn completion should not -// cause anymore exit. -// ----------------------------------------------------------------------------- -// -void LogsViewManager::appFocusGained() -{ - LOGS_QDEBUG( "logs [UI] -> LogsViewManager::appFocusGained()" ); - foreach ( LogsBaseView* view, mViewStack ){ - disconnect( view, SIGNAL(exitAllowed()), this, SLOT(proceedExit()) ); - } - LOGS_QDEBUG( "logs [UI] <- LogsViewManager::appFocusGained()" ); -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::activateView -// ----------------------------------------------------------------------------- -// -bool LogsViewManager::activateView(LogsAppViewId viewId) -{ - return doActivateView(viewId, false, QVariant()); -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::activateView -// ----------------------------------------------------------------------------- -// -bool LogsViewManager::activateView( - LogsAppViewId viewId, bool showDialpad, QVariant args) -{ - return doActivateView(viewId, showDialpad, args); -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::mainWindow -// ----------------------------------------------------------------------------- -// -HbMainWindow& LogsViewManager::mainWindow() -{ - return mMainWindow; -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::exitApplication -// ----------------------------------------------------------------------------- -// -void LogsViewManager::exitApplication() -{ - LOGS_QDEBUG( "logs [UI] -> LogsViewManager::exitApplication()" ); - - bool exitAllowed( true ); - foreach ( LogsBaseView* view, mViewStack ){ - if ( !view->isExitAllowed() ){ - exitAllowed = false; - connect( view, SIGNAL(exitAllowed()), this, SLOT(proceedExit()) ); - } - } - if ( exitAllowed ){ - LOGS_QDEBUG( "logs [UI] Exit immediataly" ); - qApp->quit(); - } else { - LOGS_QDEBUG( "logs [UI] Exit delayed" ); - // Fake exit by sending app to background and do real exit - // once it is allowed (i.e. all async cleanup operations have completed) - mMainWindow.sendAppToBackground(); - // Activate default view as user could bring app back - // to foreground before async exit operations have completed - activateView( LogsRecentViewId ); - } - - LOGS_QDEBUG( "logs [UI] <- LogsViewManager::exitApplication()" ); -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::activatePreviousView -// Previously activated view is at slot 1 of view stack -// ----------------------------------------------------------------------------- -// -bool LogsViewManager::activatePreviousView() -{ - if ( mViewStack.count() < 2 ){ - return false; - } - return doActivateView(mViewStack.at(1)->viewId(), false, QVariant()); -} - -// ----------------------------------------------------------------------------- -// LogsViewManager::doActivateView -// Currently activated view is always at beginning of view stack. Deactivates -// previously activated view and activates new view and place it at top of -// view stack. -// ----------------------------------------------------------------------------- -// -bool LogsViewManager::doActivateView( - LogsAppViewId viewId, bool showDialpad, QVariant args) -{ - LOGS_QDEBUG( "logs [UI] -> LogsViewManager::doActivateView()" ); - - bool activated(false); - LogsBaseView* newView = 0; - LogsBaseView* oldView = mViewStack.count() > 0 ? mViewStack.at(0) : 0; - - for ( int i = 0; i < mViewStack.count(); ++i ){ - if ( mViewStack.at(i)->viewId() == viewId ){ - newView = mViewStack.takeAt(i); - } - } - - if ( oldView && newView && oldView != newView ){ - oldView->deactivated(); - disconnect( &mMainWindow, SIGNAL( callKeyPressed() ), oldView, 0 ); - } - - if ( newView ){ - mViewStack.insert(0, newView); - mMainWindow.setCurrentView(newView, true); - newView->activated(showDialpad, args); - connect( &mMainWindow, SIGNAL( callKeyPressed() ), newView, SLOT( callKeyPressed() ) ); - activated = true; - } - - LOGS_QDEBUG( "logs [UI] <- LogsViewManager::doActivateView()" ); - - return activated; -} - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsViewManager::handleOrientationChanged() -{ - LOGS_QDEBUG( "logs [UI] -> LogsViewManager::handleOrientationChanged()" ); - QMetaObject::invokeMethod(mMainWindow.currentView(), "handleOrientationChanged"); - LOGS_QDEBUG( "logs [UI] <- LogsViewManager::handleOrientationChanged()" ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/src/main.cpp --- a/logsui/logsapp/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +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: -* -*/ -//USER -#include "logsmainwindow.h" -#include "logsviewmanager.h" -#include "logsservicehandler.h" -#include "logslogger.h" -#include "logsdefs.h" - -//SYSTEM -#include -#include -#include -#include -#include - -int main(int argc, char *argv[]) -{ - LOGS_QDEBUG( "logs [UI] -> main()" ) - - - HbApplication app(argc, argv); - LogsMainWindow window; - - QString lang = QLocale::system().name(); - 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); - } - - //Load application-specific translator - QTranslator translator; - LOGS_QDEBUG("logs [UI] loading application strings translator"); - LOGS_QDEBUG("logs [UI] translation filename dialer_" + lang + ".qm"); - returncode = translator.load( path + "dialer_" + lang + ".qm"); - if (returncode==false) { - LOGS_QDEBUG("logs [UI] .qm file not found from "+path); - path = ":/"; - returncode = translator.load( path + "logs_default.qm"); - LOGS_QDEBUG("logs [UI]: fallback to default language file logs_default.qm"); - } - - if (returncode==false) { - LOGS_QDEBUG( "logs [UI] .qm file not found from "+path); - } else { - LOGS_QDEBUG( "logs [UI] .qm loaded successfully from "+path); - } - - app.installTranslator(&translator); - HbStyleLoader::registerFilePath(":/logslayouts"); - - // Create service handler asap so that services are published fast. - // Servicehandler cannot be created before HbApplication creation. - // This can cause problem of service request not coming through if - // HbApplication creation takes long time. - LogsServiceHandler service; - LogsViewManager viewManager(window, service); - window.show(); - int err = app.exec(); - - HbStyleLoader::unregisterFilePath(":/logslayouts"); - - LOGS_QDEBUG( "logs [UI] <- main()" ) - return err; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/themes/icons/hbdefault/scalable/qtg_mono_contacts.svg --- a/logsui/logsapp/themes/icons/hbdefault/scalable/qtg_mono_contacts.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/themes/icons/hbdefault/scalable/qtg_mono_dialer.svg --- a/logsui/logsapp/themes/icons/hbdefault/scalable/qtg_mono_dialer.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/themes/icons/hbdefault/scalable/qtg_mono_show_view.svg --- a/logsui/logsapp/themes/icons/hbdefault/scalable/qtg_mono_show_view.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/logsviewmanagerstub.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/logsviewmanagerstub.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSVIEWMANAGERSTUB_H -#define LOGSVIEWMANAGERSTUB_H - -#include -#include -#include "logsdefs.h" -#include "logsabstractviewmanager.h" - - -class LogsViewManagerStub : public LogsAbstractViewManager -{ -public: - LogsViewManagerStub(HbMainWindow& window) : mMainWindow(window), - mViewId( LogsUnknownViewId ), mShowDialer(false), - mArgs(QVariant()), mPreviousActivated(false), mExitCalled(false) - { - } - - virtual ~LogsViewManagerStub() - { - } - - void reset() - { - mViewId = LogsUnknownViewId; - mShowDialer = false; - mArgs = QVariant(); - mPreviousActivated = false; - mExitCalled = false; - } - -public: // From LogsAbstractViewManager - - virtual bool activateView(LogsAppViewId viewId) - { - mViewId = viewId; - return true; - } - virtual bool activateView(LogsAppViewId viewId, bool showDialer, QVariant args) - { - mViewId = viewId; - mShowDialer = showDialer; - mArgs = args; - return true; - } - virtual bool activatePreviousView() - { - mPreviousActivated = true; - return true; - } - - virtual HbMainWindow& mainWindow() - { - return mMainWindow; - } - - virtual void exitApplication() - { - mExitCalled = true; - } - -public: - - LogsAppViewId mViewId; - bool mShowDialer; - QVariant mArgs; - bool mPreviousActivated; - HbMainWindow& mMainWindow; - bool mExitCalled; - -}; - -#endif //LOGSVIEWMANAGERSTUB_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSBASEVIEW_H -#define UT_LOGSBASEVIEW_H - - -#include -#include "logsviewmanagerstub.h" - -class LogsBaseView; -class LogsComponentRepository; -class HbMainWindow; - - -class UT_LogsBaseView : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - - -private slots: //test methods - - void testConstructor(); - void testActivated(); - void testDeactivated(); - void testShowFilterMenu(); - void testOpenDialpad(); - void testSetDialpadPostion(); - void testDialpadClosed(); - void testDialpadEditorTextChanged(); - void testChangeFilter(); - void testOpenContactsApp(); - void testModel(); - void testInitiateCall(); - void testInitiateCallback(); - void testShowListItemMenu(); - void testPopulateListItemMenu(); - void testSaveContact(); - void testUpdateCall(); - void testUpdateMessage(); - void testUpdateContact(); - void testActivateEmptyListIndicator(); - void testDeactivateEmptyListIndicator(); - void testUpdateEmptyListLabelVisibility(); - void testUpdateListLayoutName(); - void testUpdateListSize(); - void testHandleOrientationChanged(); - void testHandleExit(); - void testIsExitAllowed(); - -private: - - LogsBaseView* mBaseView; - LogsComponentRepository* mRepository; - HbMainWindow* mMainWindow; - LogsViewManagerStub* mViewManager; -}; - -#endif //UT_LogsBaseView_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/ut_logscomponentrepository.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logscomponentrepository.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSCOMPONENTREPOSITORY_H -#define UT_LOGSCOMPONENTREPOSITORY_H - - -#include -#include "logsviewmanagerstub.h" - -class LogsComponentRepository; -class HbMainWindow; - -class UT_LogsComponentRepository : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - - -private slots: //test methods - - void testConstructor(); - void testRecentCallsView(); - void testDetailsView(); - void testMatchesView(); - void testDialpad(); - void testLoadSection(); - void testAddToolbarToObjectList(); - -private: - - HbMainWindow* mMainWindow; - LogsComponentRepository* mRepository; - LogsViewManagerStub* mViewManager; -}; - -#endif //UT_LOGSCOMPONENTREPOSITORY_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsdetailsview.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsdetailsview.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSDETAILSVIEW_H -#define UT_LOGSDETAILSVIEW_H - - -#include -#include "logsviewmanagerstub.h" - -class LogsDetailsView; -class LogsComponentRepository; -class HbMainWindow; - - -class UT_LogsDetailsView : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - - -private slots: //test methods - - void testConstructor(); - void testActivated(); - void testDeactivated(); - void testHandleBackSoftkey(); - void testCallKeyPressed(); - void testInitiateVoiceCall(); - void testInitiateVideoCall(); - void testUpdateMenu(); - void testDeleteEvent(); - void testCopyNumberToClipboard(); - void testChangeFilter(); - void testContactActionCompleted(); - void testModel(); - void testUpdateWidgetsSizeAndLayout(); - -private: - - LogsDetailsView* mDetailsView; - LogsComponentRepository* mRepository; - HbMainWindow* mMainWindow; - LogsViewManagerStub* mViewManager; -}; - -#endif //UT_LOGSDETAILSVIEW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/ut_logseffecthandler.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logseffecthandler.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +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: -* -*/ -#ifndef UT_LOGSEFFECTHANDLER_H -#define UT_LOGSEFFECTHANDLER_H - - -#include - -class LogsEffectHandler; -class HbLabel; -class HbMainWindow; - -class UT_LogsEffectHandler : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - - -private slots: //test methods - - void testConstructor(); - void testStartDissappearAppearByFadingEffect(); - void testStartDissappearAppearByMovingEffect(); - -private: - - LogsEffectHandler* mEffect; - HbLabel* mLabel; - HbLabel* mLabel2; - HbMainWindow* mMainWindow; -}; - -#endif //UT_LOGSEFFECTHANDLER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmainwindow.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmainwindow.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSMAINWINDOW_H -#define UT_LOGSMAINWINDOW_H - - -#include - -class LogsMainWindow; - -class UT_LogsMainWindow : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - - -private slots: //test methods - - void testKeyPressEvent(); - void testEvent(); - void testSendAppToBackground(); - -private: - - LogsMainWindow* mMainWindow; -}; - -#endif //UT_LOGSMAINWINDOW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmatchesview.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmatchesview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +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: -* -*/ -#ifndef UT_LOGSMATCHESVIEW_H -#define UT_LOGSMATCHESVIEW_H - - -#include -#include "logsviewmanagerstub.h" - -class LogsMatchesView; -class LogsComponentRepository; -class HbMainWindow; - - -class UT_LogsMatchesView : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - - -private slots: //test methods - - void testConstructor(); - 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: - - LogsMatchesView* mMatchesView; - LogsComponentRepository* mRepository; - HbMainWindow* mMainWindow; - LogsViewManagerStub* mViewManager; -}; - -#endif //UT_LOGSMATCHESVIEW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsrecentcallsview.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsrecentcallsview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +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: -* -*/ -#ifndef UT_LOGSRECENTCALLSVIEW_H -#define UT_LOGSRECENTCALLSVIEW_H - - -#include -#include "logsviewmanagerstub.h" - -class LogsRecentCallsView; -class LogsComponentRepository; -class HbMainWindow; -class QModelIndex; - -class UT_LogsRecentCallsView : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - - -private slots: //test methods - - void testConstructor(); - void testInitView(); - void testActivated(); - void testDeactivated(); - - void testInitListWidget(); - void testUpdateFilter(); - void testUpdateViewName(); - void testChangeFilter(); - void testInitiateCallback(); - void testCallKeyPressed(); - void testShowCallDetails(); - void testOpenDialpad(); - void testDialpadEditorTextChanged(); - void testGestureEvent(); - void testSwipeAngleToDirection(); - void testViewChangeByFlicking(); - void testModel(); - void testShowListItemMenu(); - void testUpdateListItemData(); - void testPopulateListItemMenu(); - void testUpdateCall(); - void testUpdateMessage(); - void testUpdateContact(); - void testActivateEmptyListIndicator(); - void testUpdateMenu(); - void testUpdateWidgetsSizeAndLayout(); - void testDialpadClosed(); - void testClearList(); - void testIsExitAllowed(); - -private: //helper functions - - inline QModelIndex makeValidFilterIndex(LogsRecentCallsView& view); - -private: - - LogsRecentCallsView* mRecentCallsView; - LogsComponentRepository* mRepository; - HbMainWindow* mMainWindow; - LogsViewManagerStub* mViewManager; -}; - -#endif //UT_LOGSRECENTCALLSVIEW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsservicehandler.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsservicehandler.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +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: -* -*/ -#ifndef UT_LOGSSERVICEHANDLER_H -#define UT_LOGSSERVICEHANDLER_H - - -#include - -class LogsServiceHandler; - -class UT_LogsServiceHandler : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - - -private slots: //test methods - - void testConstructor(); - void testStart(); - -private: - - LogsServiceHandler* mService; -}; - -#endif //UT_LOGSSERVICEHANDLER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h --- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +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: -* -*/ -#ifndef UT_LOGSVIEWMANAGER_H -#define UT_LOGSVIEWMANAGER_H - - -#include - -class HbMainWindow; -class LogsViewManager; -class LogsMainWindow; - -class UT_LogsViewManager : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - - -private slots: //test methods - - void testConstructorDestructor(); - void testActivateView(); - void testExitApplication(); - void testAppFocusGained(); - void testStartingWithService(); - void testHandleOrientationChanged(); - -private: - - LogsMainWindow* mMainWindow; - LogsViewManager* mLogsViewManager; -}; - -#endif //UT_LOGSVIEWMANAGER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsabstractmodel.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsabstractmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +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 "logsabstractmodel.h" -#include "logsdbconnector.h" -#include "logsevent.h" -#include "logslogger.h" -#include "logscall.h" -#include "logscontact.h" -#include "logsengdefs.h" -#include "logsmessage.h" - -Q_DECLARE_METATYPE(LogsEvent *) -Q_DECLARE_METATYPE(LogsCall *) -Q_DECLARE_METATYPE(LogsMessage *) -Q_DECLARE_METATYPE(LogsContact *) - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsAbstractModel::LogsAbstractModel() : QAbstractListModel(), mDbConnector(0) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsAbstractModel::LogsAbstractModel()" ) - - LOGS_QDEBUG( "logs [ENG] <- LogsAbstractModel::LogsAbstractModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsAbstractModel::~LogsAbstractModel() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsAbstractModel::~LogsAbstractModel()" ) - - LOGS_QDEBUG( "logs [ENG] <- LogsAbstractModel::~LogsAbstractModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsAbstractModel::doGetData(int role, LogsModelItemContainer& item) const -{ - Q_UNUSED(role); - Q_UNUSED(item); - return QVariant(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsAbstractModel::createCall(LogsModelItemContainer& item) const -{ - Q_UNUSED(item); - return QVariant(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsAbstractModel::createMessage(LogsModelItemContainer& item) const -{ - Q_UNUSED(item); - return QVariant(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsAbstractModel::createContact(LogsModelItemContainer& item) const -{ - Q_UNUSED(item); - return QVariant(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QString LogsAbstractModel::directionIconName(const LogsEvent& event) -{ - Q_UNUSED(event); - QString direction; - return direction; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QString LogsAbstractModel::typeIconName(const LogsEvent& event) -{ - Q_UNUSED(event); - QString brand; - return brand; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsModelItemContainer::LogsModelItemContainer(LogsEvent* event) : mEvent(event) -{ - -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsModelItemContainer::~LogsModelItemContainer() -{ - -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsEvent* LogsModelItemContainer::event() -{ - return mEvent; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsabstractmodel.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsabstractmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +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: -* -*/ - -#ifndef LOGSABSTRACTMODEL_H -#define LOGSABSTRACTMODEL_H - -#include -#include -#include "logsengdefs.h" - -class LogsEvent; -class LogsDbConnector; -class LogsModelItemContainer; - -/** - * Abstract logs model. - * - */ -class LogsAbstractModel : public QAbstractListModel -{ - -public: - - /** - * Additional data role types. - */ - enum LogsModelRole { - RoleFullEvent = Qt::UserRole + 1, // LogsEvent - RoleCall, // LogsCall - RoleMessage, // LogsMessage - RoleContact, // LogsContact - RoleDetailsModel, // LogsDetailsModel - RoleBaseLast // Child classes may define roles above this val - }; - -public: - - ~LogsAbstractModel(); - -public: - - static QString directionIconName(const LogsEvent& event); - static QString typeIconName(const LogsEvent& event); - -protected: - - QVariant doGetData(int role, LogsModelItemContainer& item) const; - - virtual QVariant createCall(LogsModelItemContainer& item) const; - virtual QVariant createMessage(LogsModelItemContainer& item) const; - virtual QVariant createContact(LogsModelItemContainer& item) const; - - LogsAbstractModel(); - -protected: //data - - LogsDbConnector* mDbConnector; - -private: - - friend class UT_LogsModel; - friend class UT_LogsDetailsModel; - friend class UT_LogsFilter; - friend class UT_LogsCustomFilter; - -}; - - -/** - * Specialized model may contain other model items than log events. - */ -class LogsModelItemContainer { -public: - LogsModelItemContainer(LogsEvent* event = 0); - virtual ~LogsModelItemContainer(); - LogsEvent* event(); - -private: - LogsEvent* mEvent; // not owned -}; - -#endif //LOGSABSTRACTMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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: -* -*/ - -//USER -#include "logscall.h" -#include "logsmodel.h" -#include "logsevent.h" -#include "logslogger.h" - -//SYSTEM - -bool logsCallToNumberCalled = false; -QString logsLastCalledFunction = QString(); - -bool LogsCall::isCallToNumberCalled() -{ - return logsCallToNumberCalled; -} - -QString LogsCall::lastCalledFuntion() -{ - return logsLastCalledFunction; -} - -void LogsCall::resetTestData() -{ - logsCallToNumberCalled = false; - logsLastCalledFunction = QString(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsCall::LogsCall(LogsEvent& event) -:mNumber(event.number()), - mDefaultCall( TypeLogsCallNotAvailable ), - mEventType(event.eventType()), - mTestLastCallType(-1) -{ - if (event.eventType() == LogsEvent::TypeVoiceCall){ - mDefaultCall = TypeLogsVoiceCall; - } else if (event.eventType() == LogsEvent::TypeVideoCall) { - mDefaultCall = TypeLogsVideoCall; - } else if (event.eventType() == LogsEvent::TypeVoIPCall) { - mDefaultCall = TypeLogsVoIPCall; - } -} - -// ----------------------------------------------------------------------------- -// Stub constructor -// ----------------------------------------------------------------------------- -// -LogsCall::LogsCall() : - mDefaultCall( TypeLogsCallNotAvailable ), - mEventType(LogsEvent::TypeVoiceCall), - mTestLastCallType(-1) - { - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsCall::~LogsCall() -{ -} - - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -void LogsCall::callToNumber(LogsCall::CallType callType, const QString& number, - unsigned int serviceId) -{ - Q_UNUSED(callType); - Q_UNUSED(number); - Q_UNUSED(serviceId); - logsCallToNumberCalled = true; - logsLastCalledFunction = QString("callToNumber"); -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsCall::isAllowedCallType() -{ - return (mEventType == LogsEvent::TypeVoiceCall); -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -LogsCall::CallType LogsCall::defaultCallType() -{ - return mDefaultCall; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -QList LogsCall::allowedCallTypes() -{ - QList list; - list.append(LogsCall::TypeLogsVoiceCall); - list.append(LogsCall::TypeLogsVideoCall); - list.append(LogsCall::TypeLogsVoIPCall); - return list; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -void LogsCall::call(LogsCall::CallType callType) -{ - mTestLastCallType = callType; - logsLastCalledFunction = QString("call"); -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -void LogsCall::initiateCallback() - { - if (mEventType == LogsEvent::TypeVoiceCall) - { - call(TypeLogsVoiceCall); - } - else if (mEventType == LogsEvent::TypeVideoCall) - { - call(TypeLogsVideoCall); - } - logsLastCalledFunction = QString("initiateCallback"); - } - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +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: -* -*/ -#ifndef LOGSCALL_H -#define LOGSCALL_H - - -#include -#include -#include -#include -#include -#include -#include "logsevent.h" -//#include "logseventdata.h" -#include -#include -/** - * LogsCall can be used to make a call - * from logs model. - */ -class LogsCall -{ - -public: - - enum CallType { - TypeLogsCallNotAvailable = 0, - TypeLogsVoiceCall, - TypeLogsVideoCall, - TypeLogsVoIPCall - }; - -public: - - explicit LogsCall(LogsEvent& aEvent); - explicit LogsCall(); // Stub constructor - - ~LogsCall(); - - QList allowedCallTypes(); - - LogsCall::CallType defaultCallType(); - - static void callToNumber(LogsCall::CallType callType, const QString& number, - unsigned int serviceId=0); - - bool isAllowedCallType(); - -public slots: - - void call(LogsCall::CallType aCallType); - void initiateCallback(); - -private: //data - QString mNumber; - CallType mDefaultCall; - LogsEvent::LogsEventType mEventType; - -public: // test data & methods - int mTestLastCallType; - - static bool isCallToNumberCalled(); - static QString lastCalledFuntion(); - static void resetTestData(); - -}; - -#endif // LOGSCALL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +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: -* -*/ - -//USER - -#include "logscontact.h" -//SYSTEM - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsContact::LogsContact() -{ -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsContact::LogsContact(const QString& number): mNumber(number) -{ -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsContact::~LogsContact() -{ -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -LogsContact::RequestType LogsContact::allowedRequestType() -{ - return LogsContact::TypeLogsContactSave; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsContact::open() -{ - return false; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsContact::addNew() -{ - return false; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsContact::updateExisting() -{ - return false; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +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: -* -*/ -#ifndef LOGSCONTACT_H -#define LOGSCONTACT_H - -#include -#include - -//forward declarations -class LogsDbConnector; - -/** - * LogsContact can be used to modify or create a contact in phonebook - * - */ -class LogsContact : public QObject -{ - Q_OBJECT - -public: - enum RequestType { - TypeLogsContactOpen, //contact is in phonebook, can open it - TypeLogsContactSave //contact isn't in phonebook, can save it - }; - -public: - - //explicit LogsContact(LogsEvent& event, LogsDbConnector& dbConnector); - explicit LogsContact(); // Stub constructor - explicit LogsContact(const QString& number); // Stub constructor - ~LogsContact(); - - /** - * Returns allowed request type - */ - RequestType allowedRequestType(); - -public slots: - - /** - * 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. - * @return true if opening was called successfully - */ - bool open(); - - /** - * 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 addNew(); - - /** - * 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; - -}; - -#endif // LOGSCONTACT_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsdetailsmodel.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsdetailsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +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 "logsdetailsmodel.h" -#include "logsevent.h" -#include "logsmodel.h" -#include "logslogger.h" -#include "logsengdefs.h" -#include "logscall.h" -#include "logscontact.h" -#include "logsmessage.h" -#include -#include -#include - -Q_DECLARE_METATYPE(LogsCall*) -Q_DECLARE_METATYPE(LogsContact*) -Q_DECLARE_METATYPE(LogsMessage*) - -const int LogsDetailsRemotePartyRow = 0; -const int LogsDetailsDateAndTimeRow = 1; -const int LogsDetailsCallDirectionRow = 2; -const int LogsDetailsCallTypeRow = 3; -const int LogsDetailsCallDurationRow = 4; - -QString LogsDetailsModel::mLastCallName = QString(); - -// ----------------------------------------------------------------------------- -// LogsDetailsModel::LogsDetailsModel -// ----------------------------------------------------------------------------- -// -LogsDetailsModel::LogsDetailsModel() - : LogsAbstractModel(), - mEvent( 0 ), - mDetailItemsCount( 0 ) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::LogsDetailsModel()" ) - mLastCallName = QString(); - LOGS_QDEBUG( "logs [ENG] <- LogsDetailsModel::LogsDetailsModel()" ) -} - -// ----------------------------------------------------------------------------- -// LogsDetailsModel::~LogsDetailsModel -// ----------------------------------------------------------------------------- -// -LogsDetailsModel::~LogsDetailsModel() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::~LogsDetailsModel()" ) - mLastCallName = QString(); - LOGS_QDEBUG( "logs [ENG] <- LogsDetailsModel::~LogsDetailsModel()" ) -} - -// ----------------------------------------------------------------------------- -// LogsDetailsModel::clearEvent -// ----------------------------------------------------------------------------- -// -void LogsDetailsModel::clearEvent() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::clearEvent()" ) - mLastCallName = QString("clearEvent"); - LOGS_QDEBUG( "logs [ENG] <- LogsDetailsModel::clearEvent()" ) -} - -// ----------------------------------------------------------------------------- -// LogsDetailsModel::getNumberToClipboard() -// ----------------------------------------------------------------------------- -// -void LogsDetailsModel::getNumberToClipboard() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::getNumberToClipboard()" ) - mLastCallName = QString("getNumberToClipboard"); - LOGS_QDEBUG( "logs [ENG] <- LogsDetailsModel::getNumberToClipboard()" ) -} - -// ----------------------------------------------------------------------------- -// LogsDetailsModel::rowCount -// From QAbstractListModel -// ----------------------------------------------------------------------------- -// -int LogsDetailsModel::rowCount(const QModelIndex & /* parent */) const -{ - return mDetailItemsCount; -} - -// ----------------------------------------------------------------------------- -// LogsDetailsModel::data -// From QAbstractListModel -// ----------------------------------------------------------------------------- -// -QVariant LogsDetailsModel::data(const QModelIndex &index, int role) const -{ - Q_UNUSED(index); - - if ( role == RoleCall && mEvent ) { - LogsCall* logsCall = new LogsCall(); - QVariant var = qVariantFromValue(logsCall); - return var; - } else if (role == RoleContact ) { - LogsContact* logsContact = new LogsContact(); - QVariant var = qVariantFromValue(logsContact); - return var; - } else if (role == RoleMessage && mEvent ) { - LogsMessage* logsMessage = new LogsMessage(); - QVariant var = qVariantFromValue(logsMessage); - return var; - } - - return QVariant(); -} - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -QVariant LogsDetailsModel::headerData(int section, Qt::Orientation orientation, - int role) const -{ - Q_UNUSED(section); - Q_UNUSED(orientation); - - if (role == Qt::DisplayRole && mEvent){ - QString testName("testname"); - return QVariant(testName); - } - - return QVariant(); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsdetailsmodel.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsdetailsmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSDETAILSMODEL_H -#define LOGSDETAILSMODEL_H - -#include -#include -#include "logsengdefs.h" - -class LogsEvent; -class LogsDbConnector; -class HbIcon; - -/** - * Model for log event details. - * - */ -class LogsDetailsModel : public LogsAbstractModel -{ - - - -public: - - explicit LogsDetailsModel(); - -public: // The exported API - - ~LogsDetailsModel(); - void clearEvent(); - void getNumberToClipboard(); - -public: // From QAbstractItemModel - - virtual int rowCount(const QModelIndex &parent) const; - virtual QVariant data(const QModelIndex &index, int role) const; - virtual QVariant headerData(int section, Qt::Orientation orientation, - int role = Qt::DisplayRole) const; -private: - -private: //testing purpose data - - LogsEvent* mEvent; - int mDetailItemsCount; - QMap mDetailIcons; - QMap mDetailTexts; - static QString mLastCallName; //last called exported function name - - friend class UT_LogsDetailsView; -}; - -#endif //LOGSDETAILSMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsevent.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsevent.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,468 +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 FILES - -#include "logsevent.h" -#include "logseventparser.h" -#include "logseventdata.h" -#include "logsengdefs.h" -#include "logslogger.h" - -// CONSTANTS - -// ---------------------------------------------------------------------------- -// logsEvent::logsEvent -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsEvent() - : - mLogId(-1), - mDirection(DirUndefined), - mEventType(TypeUndefined), - mUid(0), - mLogsEventData(0), - mDuplicates(0), - mRingDuration(0), - mIsRead(false), - mIsALS(false), - mDuration(0), - mIndex(0), - mIsInView(false), - mEventState(EventAdded) -{ -} - -// ---------------------------------------------------------------------------- -// LogsEvent::LogsEvent -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsEvent( const LogsEvent& event ) -{ - mLogId = event.mLogId; - mDirection = event.mDirection; - mEventType = event.mEventType; - mUid = event.mUid; - if ( event.mLogsEventData ){ - mLogsEventData = new LogsEventData( *event.mLogsEventData ); - } else { - mLogsEventData = 0; - } - mRemoteParty = event.mRemoteParty; - mNumber = event.mNumber; - mDuplicates = event.mDuplicates; - mTime = event.mTime; - mRingDuration = event.mRingDuration; - mIsRead = event.mIsRead; - mIsALS = event.mIsALS; - mDuration = event.mDuration; - - mIndex = event.mIndex; - mIsInView = event.mIsInView; - mEventState = event.mEventState; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::~LogsEvent -// ---------------------------------------------------------------------------- -// -LogsEvent::~LogsEvent() -{ - delete mLogsEventData; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::initializeEventL -// ---------------------------------------------------------------------------- -// -void LogsEvent::initializeEventL( - const CLogEvent& source, - const LogsEventStrings& strings ) -{ - Q_UNUSED(source) - Q_UNUSED(strings) -} - - -// ---------------------------------------------------------------------------- -// LogsEvent::isEmergencyNumber -// Checks wether the number is an emergency number -// ---------------------------------------------------------------------------- - -bool LogsEvent::isEmergencyNumber(const QString& number) -{ - return ( number == logsEmergencyCall911 || number == logsEmergencyCall ); -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setDuration() -// ---------------------------------------------------------------------------- -// -void LogsEvent::setDuration( int duration ) -{ - mDuration = duration; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setALS() -// ---------------------------------------------------------------------------- -// -void LogsEvent::setALS( bool isALS ) -{ - mIsALS = isALS; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setLogId -// ---------------------------------------------------------------------------- -// -void LogsEvent::setLogId( int logId ) -{ - mLogId = logId; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setNumber -// ---------------------------------------------------------------------------- -// -bool LogsEvent::setNumber( const QString& number ) - { - bool changed( mNumber != number ); - mNumber = number; - return changed; - } - -// ---------------------------------------------------------------------------- -// LogsEvent::setRemoteParty -// ---------------------------------------------------------------------------- -// -void LogsEvent::setRemoteParty( const QString& remoteParty ) -{ - if ( mEventState == EventNotUpdated && mRemoteParty != remoteParty ){ - LOGS_QDEBUG( "logs [ENG] <-> LogsEvent::setRemoteParty, event updated") - mEventState = LogsEvent::EventUpdated; - } - mRemoteParty = remoteParty; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::validate -// ---------------------------------------------------------------------------- -// -bool LogsEvent::validate() -{ - return ( !mNumber.isEmpty() || !mRemoteParty.isEmpty() || - ( mLogsEventData && !mLogsEventData->remoteUrl().isEmpty() ) ); -} - -// ---------------------------------------------------------------------------- -// LogsEvent::directionAsString -// ---------------------------------------------------------------------------- -// -QString LogsEvent::directionAsString() const -{ - QString dir; - if ( mDirection == DirIn ) { - dir = QString("Incoming call"); - } else if ( mDirection == DirOut ) { - dir = QString("Outgoing call"); - } else if ( mDirection == DirMissed ) { - dir = QString("Missed call"); - } else { - dir = QString("Direction unknown"); - } - return dir; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::typeAsString -// ---------------------------------------------------------------------------- -// -QString LogsEvent::typeAsString() const -{ - QString type; - if ( mEventType == TypeVoiceCall ) { - type = QString("Voice call"); - } else if ( mEventType == TypeVideoCall ) { - type = QString("Video call"); - } else if ( mEventType == TypeVoIPCall ) { - type = QString("VoIP call"); - } else { - type = QString("Type unknown"); - } - return type; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::getNumberForCalling -// ---------------------------------------------------------------------------- -// -QString LogsEvent::getNumberForCalling() -{ - if (mNumber.isEmpty() && mEventType == TypeVoIPCall && mLogsEventData ) { - return mLogsEventData->remoteUrl(); - } - return mNumber; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setDirection -// ---------------------------------------------------------------------------- -// -bool LogsEvent::setDirection( LogsDirection direction ) -{ - bool changed( mDirection != direction ); - mDirection = direction; - return changed; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setEventUid -// ---------------------------------------------------------------------------- -// -void LogsEvent::setEventUid( int uid ) -{ - mUid = uid; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setEventType -// ---------------------------------------------------------------------------- -// -void LogsEvent::setEventType( LogsEventType eventType ) -{ - mEventType = eventType; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::ALS() -// ---------------------------------------------------------------------------- -// -bool LogsEvent::ALS() const -{ - return mIsALS; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::logId -// ---------------------------------------------------------------------------- -// -int LogsEvent::logId() const - { - return mLogId; - } - -// ---------------------------------------------------------------------------- -// LogsEvent::setIsRead -// ---------------------------------------------------------------------------- -void LogsEvent::setIsRead(bool isRead) -{ - mIsRead = isRead; -} - - -// ---------------------------------------------------------------------------- -// LogsEvent::Number -// ---------------------------------------------------------------------------- -// -const QString& LogsEvent::number() const -{ - return mNumber; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::RemoteParty -// ---------------------------------------------------------------------------- -// -const QString& LogsEvent::remoteParty() const -{ - return mRemoteParty; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::Direction -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsDirection LogsEvent::direction() const -{ - return mDirection; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::eventUid -// ---------------------------------------------------------------------------- -// -int LogsEvent::eventUid() const -{ - return mUid; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::eventType -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsEventType LogsEvent::eventType() const -{ - return mEventType; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::isRead -// ---------------------------------------------------------------------------- - bool LogsEvent::isRead() const -{ - return mIsRead; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::RingDuration -// -// For ring duation feature -// ---------------------------------------------------------------------------- -// -int LogsEvent::ringDuration() const -{ - return mRingDuration; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::duration -// ---------------------------------------------------------------------------- -// -int LogsEvent::duration() const -{ - return mDuration; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::SetRingDuration -// ---------------------------------------------------------------------------- -// -void LogsEvent::setRingDuration( int ringDuration ) -{ - mRingDuration = ringDuration; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::LogsEventData -// ---------------------------------------------------------------------------- -// -LogsEventData* LogsEvent::logsEventData() const -{ - return mLogsEventData; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setLogsEventData -// ---------------------------------------------------------------------------- -// -void LogsEvent::setLogsEventData( LogsEventData* logsEventData ) -{ - delete mLogsEventData; - mLogsEventData = logsEventData; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setTime -// -// Time needed in recent views and in detail view (not needed in event view) -// ---------------------------------------------------------------------------- -// -bool LogsEvent::setTime( const QDateTime& time ) -{ - bool changed( mTime != time ); - mTime = time; - return changed; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::time -// ---------------------------------------------------------------------------- -// -QDateTime LogsEvent::time() const -{ - return mTime; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setDuplicates -// -// Duplicates needed only in missed calls view -// ---------------------------------------------------------------------------- -// -void LogsEvent::setDuplicates( int duplicates ) -{ - mDuplicates = duplicates; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::duplicates -// ---------------------------------------------------------------------------- -// -int LogsEvent::duplicates() const -{ - return mDuplicates; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setIndex -// ---------------------------------------------------------------------------- -// -void LogsEvent::setIndex(int index) -{ - mIndex = index; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::index -// ---------------------------------------------------------------------------- -// -int LogsEvent::index() const -{ - return mIndex; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setIsInView -// ---------------------------------------------------------------------------- -// -void LogsEvent::setIsInView(bool isInView) -{ - mIsInView = isInView; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::isInView -// ---------------------------------------------------------------------------- -// -bool LogsEvent::isInView() const -{ - return mIsInView; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::eventState -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsEventState LogsEvent::eventState() const -{ - return mEventState; -} - - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsevent.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsevent.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSEVENT_H -#define LOGSEVENT_H - -// INCLUDES -#include -#include -#include - -// FORWARD DECLARATION -class LogsEventData; -class LogsEventStrings; -class CLogEvent; - -// CLASS DECLARATION - -/** - * - */ -class LogsEvent - { -public: - - // direction of the event - enum LogsDirection - { - DirUndefined = -1, // undefined - DirIn = 0, // incoming - DirOut = 1, // outgoing - DirMissed = 2 // missed - }; - - // type of the event - enum LogsEventType - { - TypeUndefined = -1, - TypeVoiceCall, - TypeVideoCall, - TypeVoIPCall - }; - - enum LogsEventState - { - EventAdded, - EventUpdated, - EventNotUpdated - }; - - public: - - /** - * Constructor. - */ - LogsEvent(); - - /** - * Copy constructor. - */ - LogsEvent( const LogsEvent& event ); - - /** - * Destructor. - */ - virtual ~LogsEvent(); - - - public: - - /** - * Initialized the event with contents of given source event. - * Event state and view status are updated automatically at - * this phase. - * @param source, source event - * @param strings, list of strings used for comparison - */ - void initializeEventL( const CLogEvent& source, - const LogsEventStrings& strings ); - - /** - * Check event's view status which tells whether the event is - * still valid or not. If event is not anymore in view, it - * is not probably needed anymore. - */ - bool isInView() const; - - /** - * Get state of the event. Event state is updated - * always at initialization phase. See initializeEventL. - */ - LogsEventState eventState() const; - - bool isRead() const; - - void setIsRead(bool isRead); - - QDateTime time() const; - - int logId() const; - - const QString& number() const; - - const QString& remoteParty() const; - - LogsDirection direction() const; - - int eventUid() const; - - LogsEventType eventType() const; - - int duplicates() const; - - LogsEventData* logsEventData() const; - - bool ALS() const; - - bool CNAP() const { return false; }; - - int ringDuration() const; - - int duration() const; - - /** - * Sets current index of the event. - */ - void setIndex(int index); - - /** - * Returns last set index for the event. - */ - int index() const; - - /** - * Set view status of the event. - */ - void setIsInView(bool isInView); - - /** - * Set number of duplicates for this events (e.g. 2 missed calls) - */ - void setDuplicates( int duplicates ); - - /** - * Set remote party name for the event. - */ - void setRemoteParty( const QString& remoteParty ); - - /** - * Check if event is valid. - * @return true if valid, otherwise false - */ - bool validate(); - - /** - * Return direction as string - */ - QString directionAsString() const; - - /** - * Return event type as string - */ - QString typeAsString() const; - - /** - * - */ - QString getNumberForCalling(); - - private: - - bool setTime( const QDateTime& time ); - - void setLogId( const int logId ); - - bool setNumber( const QString& number ); - - bool setDirection( LogsDirection aDirection ); - - void setEventUid( int uid ); - - void setEventType( LogsEventType aEventType ); - - void setLogsEventData( LogsEventData* logsEventData ); - - void setALS( bool aALS ); - - void setRingDuration( int ringDuration ); - - bool isEmergencyNumber( const QString& number ); - - void setDuration( int duration ); - - private: // data - - int mLogId; - LogsDirection mDirection; - LogsEventType mEventType; - int mUid; - LogsEventData* mLogsEventData; - QString mRemoteParty; - QString mNumber; - int mDuplicates; - QDateTime mTime; - int mRingDuration; - bool mIsRead; - bool mIsALS; - int mDuration; - - int mIndex; - bool mIsInView; - LogsEventState mEventState; - - private: - - friend class LogsEventParser; - friend class LogsReaderStateFillDetails; - - private: // Testing related friend definitions - -#ifdef LOGSDBCONNECTOR_SIMULATION - friend class LogsDbConnector; -#endif - friend class UT_LogsFilter; - friend class UT_LogsModel; - friend class UT_LogsEvent; - friend class UT_LogsDbConnector; - friend class UT_LogsCall; - friend class UT_LogsContact; - friend class UT_LogsEventParser; - friend class UT_LogsEventDataParser; - friend class UT_LogsReaderStates; - friend class UT_LogsDetailsModel; - friend class UT_LogsMessage; - }; - -#endif // LOGSEVENT_H - - - -// End of File diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logseventdata.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logseventdata.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,220 +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 FILES -#include "logseventdata.h" -#include "logsevent.h" -/* -#include -#include -*/ -// ---------------------------------------------------------------------------- -// LogsEventData::LogsEventData -// ---------------------------------------------------------------------------- -// -LogsEventData::LogsEventData() : - mIsCNAP( false ), - mIsVT( false ), - mIsPoC( false ), - mIsVoIP( false ), - mIsEmerg( false ), - mDataSent( 0 ), - mDataReceived( 0 ), - mMsgPartsNumber( 0 ), - mServiceId( 0 ), - mContactLocalId( 0 ), - mRemoteUrl(), - mLocalUrl() -{ -} - -// ---------------------------------------------------------------------------- -// LogsEventData::LogsEventData -// ---------------------------------------------------------------------------- -// -LogsEventData::LogsEventData( const LogsEventData& data ) -{ - mIsCNAP = data.mIsCNAP; - mIsVT = data.mIsVT; - mIsPoC = data.mIsPoC; - mIsVoIP = data.mIsVoIP; - mIsEmerg = data.mIsEmerg; - mDataSent = data.mDataSent; - mDataReceived = data.mDataReceived; - mMsgPartsNumber = data.mMsgPartsNumber; - mServiceId = data.mServiceId; - mContactLocalId = data.mContactLocalId; - mRemoteUrl = data.mRemoteUrl; - mLocalUrl = data.mLocalUrl; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::~LogsEventData -// ---------------------------------------------------------------------------- -// -LogsEventData::~LogsEventData() -{ -} - -// ---------------------------------------------------------------------------- -// LogsEventData::parse -// ---------------------------------------------------------------------------- -// -int LogsEventData::parse( const CLogEvent& source ) -{ - return 0; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isCNAP -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isCNAP() const -{ - return mIsCNAP; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isVT -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isVT() const -{ - return mIsVT; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isPoC -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isPoC() const -{ - return mIsPoC; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isVoIP -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isVoIP() const -{ - return mIsVoIP; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::dataReceived -// ---------------------------------------------------------------------------- -// -long long LogsEventData::dataReceived() const -{ - return mDataReceived; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::dataSent -// ---------------------------------------------------------------------------- -// -long long LogsEventData::dataSent() const -{ - return mDataSent; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isEmerg -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isEmerg() const -{ - return mIsEmerg; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::MsgPartsNumber -// -// Msg parts. This info is meaningful only for sms events -// ---------------------------------------------------------------------------- -// -int LogsEventData::msgPartsNumber() const -{ - return mMsgPartsNumber; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::ServiceId -// -// Returns the Service ID of the log event. -// ---------------------------------------------------------------------------- -// -unsigned int LogsEventData::serviceId() const -{ - return mServiceId; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -QString LogsEventData::remoteUrl() const -{ - return mRemoteUrl; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -QString LogsEventData::localUrl() const -{ - return mLocalUrl; -} - -// ---------------------------------------------------------------------------- -// Checks whether event data can be used in CS context -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isCsCompatible() -{ - bool compatible( true ); -/* if ( !mRemoteUrl.isEmpty() ){ - // Url can start with plus but after that can contain only digits - // to be CS compatible. - QRegExp rx( "\\+{0,1}\\d*$" ); - QRegExpValidator validator(rx, 0); - int pos( 0 ); - compatible = ( validator.validate( mRemoteUrl, pos ) == QValidator::Acceptable ); - }*/ - return compatible; -} - - -// ---------------------------------------------------------------------------- -// LogsEventData::contactLocalId -// ---------------------------------------------------------------------------- -// -unsigned int LogsEventData::contactLocalId() const -{ - return mContactLocalId; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setContactLocalId -// ---------------------------------------------------------------------------- -// -void LogsEventData::setContactLocalId(unsigned int id) -{ - mContactLocalId = id; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logseventdata.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logseventdata.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +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: -* -*/ - -#ifndef LOGSEVENTDATA_H -#define LOGSEVENTDATA_H - -// INCLUDES -#include - -// FORWARD DECLARATION -class CLogEvent; - -// CLASS DECLARATION - -/** - * - */ -class LogsEventData - { - - public: - - /** - * Constructor. - */ - LogsEventData(); - - /** - * Copy constructor. - */ - LogsEventData( const LogsEventData& data ); - - /** - * Destructor. - */ - virtual ~LogsEventData(); - - - public: - - /** - * Parses event data from given data - * @param source data - * @return 0 if parsed succesfully - **/ - int parse( const CLogEvent& source ); - - bool isCNAP() const; - bool isVT() const; - bool isPoC() const; - bool isVoIP() const; - long long dataReceived() const; - long long dataSent() const; - bool isEmerg() const; - int msgPartsNumber() const; - unsigned int serviceId() const; - QString remoteUrl() const; - QString localUrl() const; - - /** - * Checks whether event data can be used in CS context. - * @return true if CS compatible. - */ - bool isCsCompatible(); - - unsigned int contactLocalId() const; - - private: - - void setContactLocalId( unsigned int id ); - - private: // data - - // Calling Name Presentation service flag - bool mIsCNAP; - bool mIsVT; - bool mIsPoC; - bool mIsVoIP; - - //Flag that indicates whether this is an emergency related event (i.e emerg call) - bool mIsEmerg; - - //Sent and received data where applicable (in bytes) - long long mDataSent; - long long mDataReceived; - - //Message parts. Meaningful only for sms - int mMsgPartsNumber; - - unsigned int mServiceId; - unsigned int mContactLocalId; - - QString mRemoteUrl; - QString mLocalUrl; - - private: - - friend class LogsEventDataParser; - friend class LogsEvent; - - private: // Testing related friend definitions - - friend class UT_LogsEventData; - friend class UT_LogsEvent; - friend class UT_LogsEventParser; - friend class UT_LogsEventDataParser; - friend class UT_LogsCall; - friend class UT_LogsContact; - friend class UT_LogsMessage; - friend class UT_LogsDetailsModel; - friend class UT_LogsModel; - friend class UT_LogsCustomFilter; - - }; - -#endif // LOGSEVENTDATA_H - - -// End of File diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsfilter.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +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: -* -*/ -#ifndef LOGSFILTER_H -#define LOGSFILTER_H - -#include -#include "logsmodel.h" - -/** - * - */ -class LogsFilter : public QSortFilterProxyModel -{ - -public: - - enum FilterType{ - All, - Received, - Called, - Missed - }; - -public: // The exported API - - LogsFilter( FilterType type = All ) - { - mFilterType = type; - }; - ~LogsFilter(){}; - - FilterType filterType() const {return mFilterType;} - LogsModel::ClearType clearType() const {return LogsModel::TypeLogsClearAll;} - -protected: // From QSortFilterProxyModel - - bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const - { - Q_UNUSED(sourceRow); - Q_UNUSED(sourceParent); - return true; - } - -private: //data - - FilterType mFilterType; - -}; - -#endif // LOGSFILTER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +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 "logsmatchesmodel.h" -#include "logslogger.h" -#include "logsengdefs.h" -#include "logsdbconnector.h" -#include "logscall.h" -#include "logsdetailsmodel.h" -#include "logscontact.h" - -Q_DECLARE_METATYPE(LogsCall*) -Q_DECLARE_METATYPE(LogsDetailsModel*) - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMatchesModel::LogsMatchesModel( LogsDbConnector& dbConnector ) - : LogsAbstractModel() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::LogsMatchesModel()" ) - mDbConnector = &dbConnector; - mLastCall = QString(); - mTextData.append( "firstitem" ); - - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::LogsMatchesModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMatchesModel::~LogsMatchesModel() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::~LogsMatchesModel()" ) - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::~LogsMatchesModel()" ) -} - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -int LogsMatchesModel::rowCount(const QModelIndex & /* parent */) const -{ - return mTextData.count(); -} - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -QVariant LogsMatchesModel::data(const QModelIndex &index, int role) const -{ - Q_UNUSED(index); - Q_UNUSED(role); - if ( role == RoleCall && mTextData.count() > 0 ) { - LogsCall* logsCall = new LogsCall(); - QVariant var = qVariantFromValue(logsCall); - return var; - } else if (role == RoleDetailsModel) { - if (mTextData.count() > 0){ - LogsDetailsModel* logsDetails = new LogsDetailsModel(); - QVariant var = qVariantFromValue(logsDetails); - return var; - } - } - return QVariant(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::logsMatches( const QString& pattern ) -{ - Q_UNUSED(pattern); - mLastCall = QString("logsMatches"); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsContact* LogsMatchesModel::createContact(const QString& number) -{ - return new LogsContact(number); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QString LogsMatchesModel::lastCall() -{ - return mLastCall; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::resetLastCall() -{ - mLastCall = QString(); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +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: -* -*/ - -#ifndef LOGSMATCHESMODEL_H -#define LOGSMATCHESMODEL_H - -#include -#include -#include -#include "logsengdefs.h" - -class LogsEvent; -class LogsDbConnector; -class HbIcon; -class LogsContact; - -/** - * Model for log event details. - * - */ -class LogsMatchesModel : public LogsAbstractModel -{ - //Q_OBJECT - -public: - - explicit LogsMatchesModel( LogsDbConnector& dbConnector ); - -public: // The exported API - - ~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; - virtual QVariant data(const QModelIndex &index, int role) const; - -public://test functions - - QString lastCall(); - void resetLastCall(); - -public: //test data - - QString mLastCall; - QStringList mTextData; - -}; - -#endif //LOGSMATCHESMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +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: -* -*/ - -//USER - -#include "logsmessage.h" -//SYSTEM - -bool logsTestMessageSent = false; - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMessage::LogsMessage() -{ -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMessage::~LogsMessage() -{ - -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsMessage::isMessagingAllowed() -{ - return false; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsMessage::sendMessage() -{ - return false; - -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -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 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSMESSAGE_H -#define LOGSMESSAGE_H - - -#include -#include -#include "logsevent.h" - -/** - * LogsMessage can be used to send message. - */ -class LogsMessage -{ - - -public: - - explicit LogsMessage(); - ~LogsMessage(); - - bool isMessagingAllowed(); - -public slots: - - /** - * Send message - * @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; - -}; - -#endif // LOGSMESSAGE_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmodel.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "logsmodel.h" -#include "logscall.h" -#include "logsmessage.h" -#include "logsdetailsmodel.h" -#include "logscontact.h" -#include "logsmatchesmodel.h" - -Q_DECLARE_METATYPE(LogsCall*) -Q_DECLARE_METATYPE(LogsDetailsModel*) -Q_DECLARE_METATYPE(LogsMessage*) -Q_DECLARE_METATYPE(LogsContact*) - - -bool mMatchesModelCreated = false; - -// ----------------------------------------------------------------------------- -// LogsModel::LogsModel -// ----------------------------------------------------------------------------- -// -LogsModel::LogsModel(LogsModelType /*modelType*/) : LogsAbstractModel(), - mDbConnector(0), mIsCleared(false) -{ - mEmptyModel = false; - mTestIsMarkingNeeded = false; - mTestEventsMarked = false; - mMissedCallsCounterCleared = false; -} - -// ----------------------------------------------------------------------------- -// LogsModel::~LogsModel -// ----------------------------------------------------------------------------- -// -LogsModel::~LogsModel() -{ - mTextData.clear(); - mIconData.clear(); - //delete mDbConnector; // Not created in stub, no point in deletion -} - - -// ----------------------------------------------------------------------------- -// LogsModel::clearList -// ----------------------------------------------------------------------------- -// -bool LogsModel::clearList(LogsModel::ClearType /*cleartype*/) -{ - mIsCleared = true; - return true; -} - -// ----------------------------------------------------------------------------- -// LogsModel::clearList -// ----------------------------------------------------------------------------- -// -int LogsModel::clearMissedCallsCounter() -{ - mMissedCallsCounterCleared = true; - return 0; -} - -// ----------------------------------------------------------------------------- -// LogsModel::logsMatchesModel -// ----------------------------------------------------------------------------- -// -LogsMatchesModel* LogsModel::logsMatchesModel() -{ - mMatchesModelCreated = true; - return new LogsMatchesModel(*mDbConnector); -} - -// ----------------------------------------------------------------------------- -// LogsModel::markEventsSeen -// ----------------------------------------------------------------------------- -// -bool LogsModel::markEventsSeen(LogsModel::ClearType /*cleartype*/) -{ - mTestEventsMarked = true; - return mTestIsMarkingNeeded; -} - -// ----------------------------------------------------------------------------- -// LogsModel::rowCount -// ----------------------------------------------------------------------------- -// -int LogsModel::rowCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent); - if ( mEmptyModel ){ - return 0; - } - return 1;//mTextData.count(); -}; - -// ----------------------------------------------------------------------------- -// LogsModel::data -// ----------------------------------------------------------------------------- -// -QVariant LogsModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid()) { - return QVariant(); - } - - if (role == Qt::DisplayRole) { - return QVariant(mTextData); - } else if (role == Qt::DecorationRole) { - return QVariant(mIconData); - }else if ( role == RoleCall ){ - if (mTextData.count() > 0){ - LogsCall* logscall = new LogsCall(); - QVariant var = qVariantFromValue(logscall); - return var; - } - } else if (role == RoleDetailsModel) { - if (mTextData.count() > 0){ - LogsDetailsModel* logsDetails = new LogsDetailsModel(); - QVariant var = qVariantFromValue(logsDetails); - return var; - } - } else if (role == RoleMessage) { - if (mTextData.count() > 0){ - LogsMessage* logsMessage = new LogsMessage(); - QVariant var = qVariantFromValue(logsMessage); - return var; - } - } else if (role == RoleContact) - if (mTextData.count() > 0){ - LogsContact* logsContact = new LogsContact(); - QVariant var = qVariantFromValue(logsContact); - return var; - } - return QVariant(); -} - -// ----------------------------------------------------------------------------- -// LogsModel::addTextData -// ----------------------------------------------------------------------------- -// -void LogsModel::addTextData(QString text) -{ - mTextData.append(text); - reset(); -} - -// ----------------------------------------------------------------------------- -// LogsModel::isMatchesModelCreated -// ----------------------------------------------------------------------------- -// -bool LogsModel::isMatchesModelCreated() -{ - return mMatchesModelCreated; -} - -// ----------------------------------------------------------------------------- -// LogsModel::setMatchesModelCreated -// ----------------------------------------------------------------------------- -// -void LogsModel::setMatchesModelCreated(bool isCreated) -{ - mMatchesModelCreated = isCreated; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmodel.h --- a/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +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: -* -*/ -#ifndef LOGSMODEL_H -#define LOGSMODEL_H - -#include -#include "logsabstractmodel.h" -#include "logsengdefs.h" -#include - -class LogsMatchesModel; - -/** - * - */ -class LogsModel : public LogsAbstractModel -{ -public: - - enum ClearType { - TypeLogsClearAll = 0, - TypeLogsClearReceived, - TypeLogsClearCalled, - TypeLogsClearMissed - }; - - enum LogsModelType { - LogsRecentModel, - LogsFullModel - }; - -public: // The exported API - - LogsModel(LogsModelType modelType = LogsRecentModel); - ~LogsModel(); - - bool clearList(LogsModel::ClearType cleartype); - int clearMissedCallsCounter(); - LogsMatchesModel* logsMatchesModel(); - bool markEventsSeen(LogsModel::ClearType cleartype); - -public: // From QAbstractItemModel - - int rowCount(const QModelIndex &parent) const; - QVariant data(const QModelIndex &index, int role) const; - -public: //data - - - - void addTextData(QString text); - static bool isMatchesModelCreated(); - static void setMatchesModelCreated(bool isCreated); - - QStringList mTextData; - QList mIconData; - - LogsDbConnector* mDbConnector; - bool mEmptyModel; - bool mIsCleared; - bool mTestEventsMarked; - bool mTestIsMarkingNeeded; - bool mMissedCallsCounterCleared; -}; - -#endif //LOGSMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/src/main.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +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 "ut_logsmainwindow.h" -#include "ut_logscomponentrepository.h" -#include "ut_logsviewmanager.h" -#include "ut_logsbaseview.h" -#include "ut_logsrecentcallsview.h" -#include "ut_logsdetailsview.h" -#include "ut_logsmatchesview.h" -#include "ut_logseffecthandler.h" -#include "ut_logsservicehandler.h" -#include "testresultxmlparser.h" - -#include - - -#define UT_ARGS( args, file )\ - QStringList args( "ut_logsapp");\ - args << "-silent" << "-xml" << "-o" << file - - -int main(int argc, char *argv[]) -{ - bool promptOnExit(true); - for (int i=0; i -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void UT_LogsBaseView::initTestCase() -{ - mMainWindow = new HbMainWindow(); - mViewManager = new LogsViewManagerStub(*mMainWindow); -} - -void UT_LogsBaseView::cleanupTestCase() -{ - delete mMainWindow; - delete mViewManager; -} - -void UT_LogsBaseView::init() -{ - mRepository = new LogsComponentRepository( *mViewManager ); - mBaseView = new LogsBaseView( LogsRecentViewId, *mRepository, *mViewManager ); -} - -void UT_LogsBaseView::cleanup() -{ - delete mBaseView; - mBaseView = 0; - delete mRepository; - mRepository = 0; -} - -void UT_LogsBaseView::testConstructor() -{ - QVERIFY( mBaseView ); - QVERIFY( mBaseView->mSoftKeyBackAction ); - QVERIFY( !mBaseView->mShowFilterMenu ); - QVERIFY( !mBaseView->mInitialized ); - QVERIFY( mBaseView->mActionMap.isEmpty() ); - QVERIFY( mBaseView->viewId() == LogsRecentViewId ); - QVERIFY( mBaseView->mDialpad ); - QVERIFY( !mBaseView->mCall ); - QVERIFY( !mBaseView->mMessage ); - QVERIFY( !mBaseView->mContact ); - QVERIFY( !mBaseView->mCallTypeMapper ); -} - -void UT_LogsBaseView::testActivated() -{ - mBaseView->activated(false, QVariant()); - QVERIFY( !mBaseView->mDialpad->isVisible() ); - QVERIFY( mBaseView->mInitialized ); - QVERIFY( !mBaseView->mShowFilterMenu ); - QVERIFY( mBaseView->mActionMap.count() == 4 ); - - mBaseView->activated(true, QVariant()); - QVERIFY( mBaseView->mDialpad->isOpen() ); -} - -void UT_LogsBaseView::testDeactivated() -{ - mBaseView->deactivated(); // NOP -} - -void UT_LogsBaseView::testShowFilterMenu() -{ - HbStubHelper::reset(); - //no context menu - QVERIFY( !mBaseView->mShowFilterMenu ); - mBaseView->showFilterMenu(); - QVERIFY( !HbStubHelper::menuShown() ); - - //contect menu exists - mBaseView->mShowFilterMenu = new HbMenu(); - QVERIFY( mBaseView->mShowFilterMenu ); - mBaseView->showFilterMenu(); - QVERIFY( HbStubHelper::menuShown() ); - delete mBaseView->mShowFilterMenu; - mBaseView->mShowFilterMenu = 0; -} - -void UT_LogsBaseView::testOpenDialpad() -{ - QVERIFY( !mBaseView->mDialpad->isOpen() ); - mBaseView->openDialpad(); - QVERIFY( mBaseView->mDialpad->isOpen() ); -} - -void UT_LogsBaseView::testSetDialpadPostion() -{ - QPointF pos = mBaseView->mDialpad->pos(); - HbMainWindow& window = mBaseView->mViewManager.mainWindow(); - - window.setOrientation( Qt::Horizontal ); - mBaseView->setDialpadPosition(); - QVERIFY( pos != mBaseView->mDialpad->pos() ); - pos = mBaseView->mDialpad->pos(); - - window.setOrientation( Qt::Vertical ); - mBaseView->setDialpadPosition(); - QVERIFY( pos != mBaseView->mDialpad->pos() ); -} - -void UT_LogsBaseView::testDialpadClosed() -{ - mBaseView->mDialpad->editor().setText( QString("hello") ); - mBaseView->dialpadClosed(); - QVERIFY( mBaseView->mDialpad->editor().text().isEmpty() ); -} - - -void UT_LogsBaseView::testDialpadEditorTextChanged() -{ - //text editor is one character long - mBaseView->mDialpad->editor().setText( QString("h") ); - mBaseView->dialpadEditorTextChanged(); - QVERIFY( mViewManager->mViewId == LogsMatchesViewId ); - - mViewManager->reset(); - mBaseView->mDialpad->mIsCallButtonEnabled = true; - mBaseView->mDialpad->editor().setText( QString("") ); - mBaseView->dialpadEditorTextChanged(); - QVERIFY( mViewManager->mViewId == LogsUnknownViewId ); - QVERIFY( !mBaseView->mDialpad->mIsCallButtonEnabled ); -} - -void UT_LogsBaseView::testChangeFilter() -{ - QVERIFY( mViewManager->mViewId == LogsUnknownViewId ); - HbAction* action = new HbAction(); - action->setObjectName(logsShowFilterMissedMenuActionId); - mBaseView->changeFilter(action); - QVERIFY( mViewManager->mViewId == LogsRecentViewId ); -} - -void UT_LogsBaseView::testModel() -{ - QVERIFY( !mBaseView->model() ); -} - -void UT_LogsBaseView::testOpenContactsApp() -{ - QtHighwayStubHelper::reset(); - mBaseView->openContactsApp(); - QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.phonebookappservices.Launch" ); - QVERIFY( QtHighwayStubHelper::message() == "launch()" ); -} - - -void UT_LogsBaseView::testInitiateCallback() -{ - LogsCall::resetTestData(); - //call can't be created - QVERIFY( !mBaseView->mCall ); - mBaseView->initiateCallback(QModelIndex()); - QVERIFY( LogsCall::lastCalledFuntion().isEmpty() ); - - //call can be created should be tested in derived class -} - -void UT_LogsBaseView::testInitiateCall() -{ - LogsCall::resetTestData(); - //no call - QVERIFY( !mBaseView->mCall ); - mBaseView->initiateCall(LogsCall::TypeLogsVoiceCall); - QVERIFY( LogsCall::lastCalledFuntion().isEmpty() ); - - //call exists - mBaseView->mCall = new LogsCall(); - mBaseView->initiateCall(LogsCall::TypeLogsVideoCall); - QVERIFY( LogsCall::lastCalledFuntion() == QString("call") ); - QVERIFY( mBaseView->mCall->mTestLastCallType == LogsCall::TypeLogsVideoCall ); -} - -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() -{ - HbStubHelper::reset(); - //no call/message/contact, menu has not actions - HbMenu menu; - mBaseView->populateListItemMenu(menu); - QVERIFY( HbStubHelper::widgetActionsCount() == 0 ); - - //call, message and contact exist, menu has actions - mBaseView->mCall = new LogsCall(); - mBaseView->mMessage = new LogsMessage(); - mBaseView->mContact = new LogsContact(); - mBaseView->populateListItemMenu(menu); - 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(); - mBaseView->updateCall( QModelIndex() ); - QVERIFY( !mBaseView->mCall ); -} - -void UT_LogsBaseView::testUpdateMessage() -{ - mBaseView->mMessage = new LogsMessage(); - mBaseView->updateMessage( QModelIndex() ); - QVERIFY( !mBaseView->mMessage ); -} - -void UT_LogsBaseView::testUpdateContact() -{ - mBaseView->mContact = new LogsContact(); - mBaseView->updateContact( QModelIndex() ); - QVERIFY( !mBaseView->mContact ); -} - -void UT_LogsBaseView::testActivateEmptyListIndicator() -{ - QStringListModel model; - - // Label not in repository - QVERIFY( !mBaseView->mEmptyListLabel ); - mBaseView->activateEmptyListIndicator(&model); - QVERIFY( !mBaseView->mEmptyListLabel ); - - // Empty model, label is set visible - mRepository->recentCallsView(); - QVERIFY( !mBaseView->mEmptyListLabel ); - mBaseView->activateEmptyListIndicator(&model); - QVERIFY( mBaseView->mEmptyListLabel ); - - // Label exists already, situation does not change - mBaseView->activateEmptyListIndicator(&model); - QVERIFY( mBaseView->mEmptyListLabel ); - - // Null list does nothing - mBaseView->activateEmptyListIndicator(0); - QVERIFY( mBaseView->mEmptyListLabel ); -} - -void UT_LogsBaseView::testDeactivateEmptyListIndicator() -{ - QVERIFY( !mBaseView->mEmptyListLabel ); - mBaseView->deactivateEmptyListIndicator(0); - HbLabel label; - mBaseView->mEmptyListLabel = &label; - mBaseView->deactivateEmptyListIndicator(0); - QVERIFY( mBaseView->mEmptyListLabel ); // Label not removed at deactivation -} - -void UT_LogsBaseView::testUpdateEmptyListLabelVisibility() -{ - // Base view does not have model, nothing happens - mBaseView->updateEmptyListLabelVisibility(); -} - -void UT_LogsBaseView::testUpdateListLayoutName() -{ - mBaseView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); - HbListView list; - - //default layout - list.setLayoutName("dummy"); - mBaseView->updateListLayoutName(list); - QVERIFY( list.layoutName() == logsListDefaultLayout ); - - //same layout, not updated - mBaseView->updateListLayoutName(list); - QVERIFY( list.layoutName() == logsListDefaultLayout ); - - //landscape without dialpad - mBaseView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - mBaseView->updateListLayoutName(list); - QVERIFY( list.layoutName() == logsListLandscapeLayout ); - - //landscape with dialpad - mBaseView->mDialpad->openDialpad(); - mBaseView->updateListLayoutName(list); - QVERIFY( list.layoutName() == logsListLandscapeDialpadLayout ); - - //landscape with dialpad, ignoreDialpad is true - mBaseView->updateListLayoutName(list, true); - 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() -{ - mBaseView->mLayoutSectionName = "dummy"; - - //default section is loaded - mBaseView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); - mBaseView->mDialpad->closeDialpad(); - mBaseView->updateListSize(); - QVERIFY( mBaseView->mLayoutSectionName == logsViewDefaultSection ); - - //same section again, not loaded - mBaseView->updateListSize(); - QVERIFY( mBaseView->mLayoutSectionName == logsViewDefaultSection ); - - //portrait with dialpad - mBaseView->mDialpad->openDialpad(); - mBaseView->updateListSize(); - QVERIFY( mBaseView->mLayoutSectionName == logsViewPortraitDialpadSection ); - - //landscape with dialpad - mBaseView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - mBaseView->updateListSize(); - QVERIFY( mBaseView->mLayoutSectionName == logsViewLandscapeDialpadSection ); -} - -void UT_LogsBaseView::testHandleOrientationChanged() -{ - //dialpad position recalculated - QPointF pos; - mBaseView->mDialpad->setPos(pos); - mBaseView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - mBaseView->handleOrientationChanged(); - QVERIFY( pos != mBaseView->mDialpad->pos() ); -} - -void UT_LogsBaseView::testHandleExit() -{ - mViewManager->reset(); - mBaseView->handleExit(); - QVERIFY( mViewManager->mExitCalled ); -} - -void UT_LogsBaseView::testIsExitAllowed() -{ - QVERIFY( mBaseView->isExitAllowed() ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +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: -* -*/ - -//USER -#include "ut_logscomponentrepository.h" -#include "logsrecentcallsview.h" -#include "logsdetailsview.h" -#include "logsmatchesview.h" -#include "logscomponentrepository.h" -#include "logsdefs.h" - -//SYSTEM -#include -#include - -void UT_LogsComponentRepository::initTestCase() -{ - mMainWindow = new HbMainWindow(); - mViewManager = new LogsViewManagerStub(*mMainWindow); -} - -void UT_LogsComponentRepository::cleanupTestCase() -{ - delete mMainWindow; - delete mViewManager; -} - - -void UT_LogsComponentRepository::init() -{ - mRepository = new LogsComponentRepository(*mViewManager); -} - -void UT_LogsComponentRepository::cleanup() -{ - delete mRepository; - mRepository = 0; -} - -void UT_LogsComponentRepository::testConstructor() -{ - QVERIFY( !mRepository->mRecentCallsView ); - QVERIFY( !mRepository->mDetailsView ); - QVERIFY( !mRepository->mMatchesView ); - QVERIFY( !mRepository->mDialpad ); - QVERIFY( !mRepository->mDialpadKeyHandler ); - QVERIFY( mRepository->mModel ); -} - -void UT_LogsComponentRepository::testRecentCallsView() -{ - //loading view - QVERIFY( !mRepository->mRecentCallsView ); - QVERIFY( mRepository->mRecentViewComponents.count() == 0 ); - LogsRecentCallsView* view = mRepository->recentCallsView(); - QVERIFY( view ); - QCOMPARE( view->objectName(), QString( logsRecentCallsViewId ) ); - - //view already loaded - LogsRecentCallsView* view2 = mRepository->recentCallsView(); - QVERIFY( view == view2 ); - delete view; -} - -void UT_LogsComponentRepository::testDetailsView() -{ - //loading view - QVERIFY( !mRepository->mDetailsView ); - QVERIFY( mRepository->mDetailsViewComponents.count() == 0 ); - LogsDetailsView* view = mRepository->detailsView(); - QVERIFY( view ); - QCOMPARE( view->objectName(), QString( logsDetailsViewId ) ); - - //view already loaded - LogsDetailsView* view2 = mRepository->detailsView(); - QVERIFY( view == view2 ); - delete view; -} - -void UT_LogsComponentRepository::testMatchesView() -{ - //loading view - QVERIFY( !mRepository->mMatchesView ); - QVERIFY( mRepository->mMatchesViewComponents.count() == 0 ); - LogsMatchesView* view = mRepository->matchesView(); - QVERIFY( view ); - QCOMPARE( view->objectName(), QString( logsMatchesViewId ) ); - - //view already loaded - LogsMatchesView* view2 = mRepository->matchesView(); - QVERIFY( view == view2 ); - delete view; -} - -void UT_LogsComponentRepository::testDialpad() -{ - //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() -{ - //Unknow viewId, section is not loaded - QVERIFY( !mRepository->loadSection(LogsUnknownViewId, "default") ); - - //loading of non-existing section - 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") ); -} - -void UT_LogsComponentRepository::testAddToolbarToObjectList() -{ - //toolbar widget not found in docml - QVERIFY( mRepository->mRecentViewComponents.count() == 0 ); - mRepository->addToolbarToObjectList( mRepository->mRecentViewComponents ); - QVERIFY( mRepository->mRecentViewComponents.count() == 0 ); - - //toolbar found and added to object list - LogsRecentCallsView* view = mRepository->recentCallsView(); - mRepository->mRecentViewComponents.clear(); - mRepository->addToolbarToObjectList( mRepository->mRecentViewComponents ); - QVERIFY( mRepository->mRecentViewComponents.count() == 1 ); - QVERIFY( mRepository->mRecentViewComponents.at(0)->objectName() == logsToolbarId ); - delete view; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/src/ut_logsdetailsview.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsdetailsview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,283 +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: -* -*/ - -//USER -#include "logsdetailsview.h" -#include "ut_logsdetailsview.h" -#include "logscomponentrepository.h" -#include "logsdetailsmodel.h" -#include "logscall.h" -#include "logsmessage.h" -#include "logsdefs.h" - -//SYSTEM -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -Q_DECLARE_METATYPE(LogsDetailsModel *) - - -void UT_LogsDetailsView::initTestCase() -{ - mMainWindow = new HbMainWindow(); - mViewManager = new LogsViewManagerStub(*mMainWindow); -} - -void UT_LogsDetailsView::cleanupTestCase() -{ - delete mMainWindow; - delete mViewManager; -} - -void UT_LogsDetailsView::init() -{ - mRepository = new LogsComponentRepository(*mViewManager); - mDetailsView = new LogsDetailsView( *mRepository, *mViewManager ); -} - -void UT_LogsDetailsView::cleanup() -{ - delete mDetailsView; - delete mRepository; -} - -void UT_LogsDetailsView::testConstructor() -{ - QVERIFY(mDetailsView); - QVERIFY(mDetailsView->mSoftKeyBackAction); - QVERIFY(mDetailsView->viewId() == LogsDetailsViewId ); - QVERIFY(!mDetailsView->mDetailsModel); -} - -void UT_LogsDetailsView::testActivated() -{ - //list widget can't be found from repository -/* //TODO: Q_ASSERT_X - LogsDetailsModel* model = new LogsDetailsModel; - QVariant arg = qVariantFromValue( model ); - mDetailsView->activated(false, arg); - QVERIFY(!mDetailsView->mListView); -*/ - //list widget is in repository - LogsDetailsModel* model2 = new LogsDetailsModel; - QVariant arg2 = qVariantFromValue( model2 ); - LogsDetailsView* view = mRepository->detailsView(); - QVERIFY( !view->mInitialized ); - view->activated(false, arg2); - QVERIFY( view->mInitialized ); - QVERIFY(view->mListView); - QVERIFY(view->mDetailsModel == model2); - QVERIFY(view->mListView->model() == model2); - QVERIFY(view->mActionMap.count() == 4); - - LogsDetailsModel* model3 = new LogsDetailsModel(); - QVariant arg3 = qVariantFromValue( model3 ); - mDetailsView->activated(false, arg3); - QVERIFY( mDetailsView->mDetailsModel == model3); - QVERIFY(view->mListView->model() == model3); - //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(); - mDetailsView->handleBackSoftkey(); - QVERIFY( mViewManager->mPreviousActivated ); -} - -void UT_LogsDetailsView::testCallKeyPressed() -{ - // No call, nothing happens - QVERIFY( !mDetailsView->mCall ); - mDetailsView->callKeyPressed(); - LogsDetailsModel* model = new LogsDetailsModel(); - - // Calling possible - delete model->mEvent; - model->mEvent = 0; - model->mEvent = new LogsEvent(); - QVariant arg = qVariantFromValue( model ); - mRepository->detailsView(); - mDetailsView->activated(false, arg); - QVERIFY( mDetailsView->mCall ); - mDetailsView->callKeyPressed(); - QVERIFY( mDetailsView->mCall->mTestLastCallType != -1 ); -} - -void UT_LogsDetailsView::testInitiateVoiceCall() -{ - // No call, nothing happens - QVERIFY( !mDetailsView->mCall ); - mDetailsView->initiateVoiceCall(); - - // Call possible - mDetailsView->mCall = new LogsCall; - mDetailsView->initiateVoiceCall(); - QVERIFY( mDetailsView->mCall->mTestLastCallType == LogsCall::TypeLogsVoiceCall ); -} - -void UT_LogsDetailsView::testInitiateVideoCall() -{ - // No call, nothing happens - QVERIFY( !mDetailsView->mCall ); - mDetailsView->initiateVideoCall(); - - // Call possible - mDetailsView->mCall = new LogsCall; - mDetailsView->initiateVideoCall(); - QVERIFY( mDetailsView->mCall->mTestLastCallType == LogsCall::TypeLogsVideoCall ); -} - -void UT_LogsDetailsView::testUpdateMenu() -{ - // No model, nothing happens - mDetailsView->updateMenu(); - - // No call, call actions disabled - QVERIFY( !mDetailsView->mCall ); - mRepository->detailsView(); // Set correct object tree - LogsDetailsModel* model = new LogsDetailsModel(); - QVariant arg = qVariantFromValue( model ); - mDetailsView->activated(false, arg); - mDetailsView->updateMenu(); - QObject* obj = mRepository->findObject( logsDetailsViewVoiceCallMenuActionId ); - HbAction* voiceCallAction = qobject_cast( obj ); - QObject* obj2 = mRepository->findObject( logsCommonVideoCallMenuActionId ); - HbAction* videoCallAction = qobject_cast( obj2 ); - QObject* obj3 = mRepository->findObject( logsCommonMessageMenuActionId ); - HbAction* messageAction = qobject_cast( obj3 ); - QVERIFY( !voiceCallAction->isVisible() ); - QVERIFY( !videoCallAction->isVisible() ); - QVERIFY( !messageAction->isVisible() ); - - // Call exists, call actions enabled - model->mEvent = new LogsEvent; - mDetailsView->updateMenu(); - QVERIFY( voiceCallAction->isVisible() ); - QVERIFY( videoCallAction->isVisible() ); - QVERIFY( messageAction->isVisible() ); -} - -void UT_LogsDetailsView::testDeleteEvent() -{ - // No model, nothing happens - QSignalSpy spy(mDetailsView, SIGNAL(viewActivated(HbView*))); - QVERIFY( LogsDetailsModel::mLastCallName.isEmpty() ); - QVERIFY( !mDetailsView->mDetailsModel ); - mDetailsView->deleteEvent(); - QVERIFY( LogsDetailsModel::mLastCallName.isEmpty() ); - QVERIFY( spy.count() == 0 ); - - // Model exists, call to delete event made and view is closed - mViewManager->reset(); - LogsDetailsModel* model = new LogsDetailsModel(); - mDetailsView->mDetailsModel = model; - mDetailsView->deleteEvent(); - QVERIFY( LogsDetailsModel::mLastCallName == QString("clearEvent") ); - QVERIFY( mViewManager->mPreviousActivated ); -} - -void UT_LogsDetailsView::testCopyNumberToClipboard() -{ - LogsDetailsModel* model = new LogsDetailsModel(); - mDetailsView->mDetailsModel = model; - mDetailsView->copyNumberToClipboard(); - QVERIFY( LogsDetailsModel::mLastCallName == QString("getNumberToClipboard") ); -} - -void UT_LogsDetailsView::testChangeFilter() -{ - mViewManager->reset(); - HbAction action; - action.setObjectName(logsShowFilterMissedMenuActionId); - mDetailsView->changeFilter(&action); - QVERIFY( mViewManager->mViewId == LogsRecentViewId ); - QVERIFY( mViewManager->mArgs.toInt() == (int)LogsServices::ViewAll ); -} - -void UT_LogsDetailsView::testContactActionCompleted() -{ - // No viewname for some reason, no effect - HbGroupBox viewName; - LogsDetailsModel* model = new LogsDetailsModel(); - mDetailsView->mDetailsModel = model; - mDetailsView->contactActionCompleted(true); - - // Contact modified, viewname updated accordingly - mDetailsView->mViewName = &viewName; - model->mEvent = new LogsEvent; - model->mEvent->setRemoteParty("someparty"); - mDetailsView->contactActionCompleted(true); - QVERIFY( mDetailsView->mViewName->titleText().length() > 0 ); - - // No effect if no contact modify occurred - mDetailsView->mViewName->setHeading(""); - mDetailsView->contactActionCompleted(false); - QVERIFY( mDetailsView->mViewName->titleText().length() == 0 ); -} - -void UT_LogsDetailsView::testModel() -{ - QVERIFY( !mDetailsView->model() ); - mDetailsView->mDetailsModel = new LogsDetailsModel(); - QVERIFY( mDetailsView->model() ); -} - -void UT_LogsDetailsView::testUpdateWidgetsSizeAndLayout() -{ - //no listView, nothing happens - QVERIFY( !mDetailsView->mListView ); - mDetailsView->updateWidgetsSizeAndLayout(); - - HbListView list; - //listView exists, layout and size updated - mDetailsView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - mDetailsView->mDialpad->openDialpad(); - mDetailsView->mListView = &list; - mDetailsView->mListView->setLayoutName("dummy"); - mDetailsView->mLayoutSectionName = "dummy"; - mDetailsView->updateWidgetsSizeAndLayout(); - QVERIFY( mDetailsView->mListView->layoutName() == logsListDefaultLayout ); - QVERIFY( mDetailsView->mLayoutSectionName == logsViewLandscapeDialpadSection ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/src/ut_logseffecthandler.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logseffecthandler.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +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: -* -*/ - -//USER -#include "ut_logseffecthandler.h" -#include "logseffecthandler.h" - -//SYSTEM -#include -#include -#include - - -void UT_LogsEffectHandler::initTestCase() -{ -} - -void UT_LogsEffectHandler::cleanupTestCase() -{ -} - - -void UT_LogsEffectHandler::init() -{ - mEffect = new LogsEffectHandler(); - mLabel = new HbLabel(); - mLabel2 = new HbLabel(); -} - -void UT_LogsEffectHandler::cleanup() -{ - delete mEffect; - mEffect = 0; - delete mLabel; - mLabel = 0; - delete mLabel2; - mLabel2 = 0; -} - -void UT_LogsEffectHandler::testConstructor() -{ - QVERIFY( mEffect ); -} - -void UT_LogsEffectHandler::testStartDissappearAppearByFadingEffect() -{ - QVERIFY( mEffect->mFadeGroup->state() == QAbstractAnimation::Stopped ); - mEffect->startDissappearAppearByFadingEffect(*mLabel); - QVERIFY( mEffect->mFadeGroup->state() == QAbstractAnimation::Running ); - - // Simulate animation progess, when dissappearing has completed effecthandler - // sends signal, other progress in anim does not cause signal to be sent - QSignalSpy spy(mEffect, SIGNAL(dissappearByFadingComplete())); - mEffect->fadeAnimationChanged(mEffect->mFadeGroup->animationAt(1)); - QVERIFY(spy.count() == 1 ); - mEffect->fadeAnimationChanged(0); - QVERIFY(spy.count() == 1 ); - - // When effect is running and new effect is requested, previous effect is stopped - mEffect->startDissappearAppearByFadingEffect(*mLabel); -} - -void UT_LogsEffectHandler::testStartDissappearAppearByMovingEffect() -{ - QVERIFY( mEffect->mMoveGroup->state() == QAbstractAnimation::Stopped ); - mEffect->startDissappearAppearByMovingEffect(*mLabel, *mLabel2, false, 0); - QVERIFY( mEffect->mMoveGroup->state() == QAbstractAnimation::Running ); - QVERIFY( mEffect->mMoveGroup2->state() == QAbstractAnimation::Running ); - - // Simulate animation progess, when dissappearing has completed effecthandler - // sends signal, other progress in anim does not cause signal to be sent - QSignalSpy spy(mEffect, SIGNAL(dissappearByMovingComplete())); - mEffect->moveAnimationChanged(mEffect->mMoveGroup->animationAt(1)); - QVERIFY(spy.count() == 1 ); - mEffect->moveAnimationChanged(0); - QVERIFY(spy.count() == 1 ); - - // When effect is running and new effect is requested, previous effect is stopped - mEffect->startDissappearAppearByMovingEffect(*mLabel, *mLabel2, true, 0); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmainwindow.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmainwindow.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +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: -* -*/ - -//USER -#include "ut_logsmainwindow.h" -#include "logsmainwindow.h" -#include "qthighway_stub_helper.h" - -//SYSTEM -#include -#include -#include - -void UT_LogsMainWindow::initTestCase() -{ - -} - -void UT_LogsMainWindow::cleanupTestCase() -{ - -} - - -void UT_LogsMainWindow::init() -{ - mMainWindow = new LogsMainWindow; -} - -void UT_LogsMainWindow::cleanup() -{ - delete mMainWindow; - mMainWindow = 0; -} - -void UT_LogsMainWindow::testKeyPressEvent() -{ - QSignalSpy spy( mMainWindow, SIGNAL(callKeyPressed()) ); - // Not handled - QKeyEvent event( QEvent::KeyPress, Qt::Key_Hangup, Qt::NoModifier); - mMainWindow->keyPressEvent( &event ); - QVERIFY( spy.count() == 0 ); - - // Handled - QKeyEvent event2( QEvent::KeyPress, Qt::Key_Yes, Qt::NoModifier); - mMainWindow->keyPressEvent( &event2 ); - QVERIFY( spy.count() == 1 ); - -} - -void UT_LogsMainWindow::testEvent() -{ - QSignalSpy spy( mMainWindow, SIGNAL(appFocusGained()) ); - // Not interesting event - QEvent event(QEvent::MaxUser); - mMainWindow->event(&event); - QVERIFY( spy.count() == 0 ); - - // Focus in event - QEvent event2(QEvent::FocusIn); - mMainWindow->event(&event2); - QVERIFY( spy.count() == 1 ); -} - -void UT_LogsMainWindow::testSendAppToBackground() -{ - QtHighwayStubHelper::reset(); - mMainWindow->sendAppToBackground(); - QVERIFY( QtHighwayStubHelper::utilToBackground() ); -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,391 +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: -* -*/ - -//USER -#include "logsmatchesview.h" -#include "ut_logsmatchesview.h" -#include "logscomponentrepository.h" -#include "logsdefs.h" -#include "logsmatchesmodel.h" -#include "logscall.h" -#include "logsmodel.h" -#include "logscontact.h" -#include "logsmessage.h" - -//SYSTEM -#include -#include -#include -#include -#include -#include - -Q_DECLARE_METATYPE(LogsMatchesModel*) - - -void UT_LogsMatchesView::initTestCase() -{ - mMainWindow = new HbMainWindow(); - mViewManager = new LogsViewManagerStub(*mMainWindow); -} - -void UT_LogsMatchesView::cleanupTestCase() -{ - delete mMainWindow; - delete mViewManager; -} - -void UT_LogsMatchesView::init() -{ - mRepository = new LogsComponentRepository(*mViewManager); - mMatchesView = new LogsMatchesView( *mRepository, *mViewManager ); -} - -void UT_LogsMatchesView::cleanup() -{ - delete mMatchesView; - delete mRepository; -} - -void UT_LogsMatchesView::testConstructor() -{ - QVERIFY( mMatchesView ); - QVERIFY( mMatchesView->viewId() == LogsMatchesViewId ); - QVERIFY( !mMatchesView->mListView ); - QVERIFY( !mMatchesView->mModel ); - QVERIFY( mMatchesView->mActionMap.count() == 0 ); - QVERIFY( mMatchesView->mLayoutSectionName == "" ); - QVERIFY( !mMatchesView->mAddToContactsButton ); -} - -void UT_LogsMatchesView::testActivated() -{ - //activate for the first time - mMatchesView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); - mRepository->matchesView(); - QVERIFY( !mMatchesView->mInitialized ); - QVERIFY( !mMatchesView->mListView ); - QVERIFY( !mMatchesView->mModel ); - QVERIFY( mMatchesView->mActionMap.count() == 0 ); - mMatchesView->activated( false,QVariant() ); - QVERIFY( mMatchesView->mInitialized ); - QVERIFY( mMatchesView->mListView ); - QVERIFY( mMatchesView->mModel ); - 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 ); - LogsModel::setMatchesModelCreated(false); - mMatchesView->activated( true,QVariant() ); - QVERIFY( mMatchesView->mListView ); - QVERIFY( mMatchesView->mModel ); - QVERIFY( LogsModel::isMatchesModelCreated() ); //model recreated - QVERIFY( mMatchesView->mActionMap.count() == 4 ); - QVERIFY( mMatchesView->mListView->layoutName() == logsListLandscapeDialpadLayout ); - QVERIFY( mMatchesView->mLayoutSectionName == logsViewLandscapeDialpadSection ); - - //Pass model as input arg - LogsDbConnector* dbConnector = 0; - LogsMatchesModel* model1 = new LogsMatchesModel(*dbConnector); - QVariant arg = qVariantFromValue( model1 ); - mMatchesView->activated( true, arg ); - QVERIFY( mMatchesView->mListView ); - QVERIFY( mMatchesView->mModel == model1 ); - - LogsMatchesModel* model2 = new LogsMatchesModel(*dbConnector); - QVariant arg2 = qVariantFromValue( model2 ); - mMatchesView->activated( true, arg2 ); - QVERIFY( mMatchesView->mListView ); - QVERIFY( mMatchesView->mModel == model2 ); - - // After passing model as input arg, do not pass model - mMatchesView->activated( true,QVariant() ); - QVERIFY( mMatchesView->mListView ); - QVERIFY( mMatchesView->mModel ); - QVERIFY( mMatchesView->mModel != model1 ); - QVERIFY( mMatchesView->mModel != model2 ); -} - - -void UT_LogsMatchesView::testDeactivated() -{ - LogsDbConnector* dbConnector = 0; - mMatchesView->mDialpad->editor().setText( "hello" ); - mMatchesView->mModel = new LogsMatchesModel(*dbConnector); - mMatchesView->deactivated(); - QVERIFY( !mMatchesView->mModel ); -} - -void UT_LogsMatchesView::testCallKeyPressed() -{ - HbListView list; - mMatchesView->mListView = &list; - mMatchesView->updateModel(0); - - // No matches, no dialed string, cannot call - LogsCall::resetTestData(); - mMatchesView->mModel->mTextData.clear(); - mMatchesView->callKeyPressed(); - QVERIFY( !LogsCall::isCallToNumberCalled() ); - - // No any item where to call, but dial string exists - QString dial("12345"); - mMatchesView->mDialpad->editor().setText( dial ); - mMatchesView->callKeyPressed(); - QVERIFY( LogsCall::isCallToNumberCalled() ); - - // Call is still made with entered number even if matches exists - LogsCall::resetTestData(); - mMatchesView->mModel->mTextData.append("testdata"); - mMatchesView->mModel->mTextData.append("testdata2"); - mMatchesView->callKeyPressed(); - 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 - mMatchesView->mDialpad->mIsCallButtonEnabled = false; - mMatchesView->mDialpad->editor().setText( QString("h") ); - QVERIFY(!mMatchesView->mModel); - mMatchesView->dialpadEditorTextChanged(); - QVERIFY( mMatchesView->mDialpad->mIsCallButtonEnabled ); - - //model exists - LogsDbConnector* dbConnector = 0; - mMatchesView->mModel = new LogsMatchesModel(*dbConnector); - mMatchesView->dialpadEditorTextChanged(); - QVERIFY( mMatchesView->mModel->lastCall() == QString("logsMatches") ); - QVERIFY( mMatchesView->mDialpad->mIsCallButtonEnabled ); - - //text erased from input, view changed to recent calls - mMatchesView->mDialpad->editor().setText( QString("") ); - QVERIFY( mViewManager->mViewId == LogsRecentViewId ); -} - -void UT_LogsMatchesView::testDialpadClosed() -{ - mMatchesView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - 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() -{ - QVERIFY( !mMatchesView->model() ); - LogsDbConnector* dbConnector = 0; - mMatchesView->mModel = new LogsMatchesModel(*dbConnector); - QVERIFY( mMatchesView->model() ); -} - - -void UT_LogsMatchesView::testUpdateWidgetsSizeAndLayout() -{ - //no listView, nothing happens - QVERIFY( !mMatchesView->mListView ); - mMatchesView->updateWidgetsSizeAndLayout(); - - //listView exists, layout and size updated, dialpad not visible - mRepository->matchesView(); - mMatchesView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); - 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 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,725 +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: -* -*/ - -//USER -#include "logsrecentcallsview.h" -#include "ut_logsrecentcallsview.h" -#include "logscomponentrepository.h" -#include "logsmodel.h" -#include "logsfilter.h" -#include "logsdetailsmodel.h" -#include "logsdefs.h" -#include "logseffecthandler.h" -#include "hbstubs_helper.h" -#include "logscall.h" -#include "logsmessage.h" -#include "logscontact.h" -#include "logsmatchesmodel.h" - -//SYSTEM -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define VERIFY_CHECKED_ACTION( v, actionName ) { \ -QVERIFY( v->mShowFilterMenu );\ -QVERIFY( v->mShowFilterMenu->actions().count() > 0 );\ -QAction* action = 0;\ -foreach ( action, v->mShowFilterMenu->actions() ){ \ - if ( action->objectName() == actionName ){ \ - QVERIFY( action->isChecked() ); \ - } else { \ - QVERIFY( !action->isChecked() ); \ - } \ -}} - - -void UT_LogsRecentCallsView::initTestCase() -{ - mMainWindow = new HbMainWindow(); - mViewManager = new LogsViewManagerStub(*mMainWindow); -} - -void UT_LogsRecentCallsView::cleanupTestCase() -{ - delete mMainWindow; - delete mViewManager; -} - -void UT_LogsRecentCallsView::init() -{ - mRepository = new LogsComponentRepository(*mViewManager); - mRecentCallsView = new LogsRecentCallsView( *mRepository, *mViewManager ); -} - -void UT_LogsRecentCallsView::cleanup() -{ - delete mRecentCallsView; - mRecentCallsView = 0; - delete mRepository; - mRepository = 0; -} - -void UT_LogsRecentCallsView::testConstructor() -{ - QVERIFY( mRecentCallsView ); - QVERIFY( !mRecentCallsView->mViewName ); - QVERIFY( !mRecentCallsView->mListView ); - QVERIFY( !mRecentCallsView->mFilter ); - QVERIFY( mRecentCallsView->mModel ); - QVERIFY( !mRecentCallsView->mShowFilterMenu ); - QVERIFY( mRecentCallsView->mCurrentView == LogsServices::ViewAll ); - QVERIFY( mRecentCallsView->viewId() == LogsRecentViewId ); - QVERIFY( mRecentCallsView->mLayoutSectionName == "" ); -} - -void UT_LogsRecentCallsView::testInitView() -{ - LogsRecentCallsView* view = mRepository->recentCallsView(); - QVERIFY( view ); - QVERIFY( !view->mInitialized ); - QVERIFY( !view->mFilter ); - QVERIFY( !view->mShowFilterMenu ); - QVERIFY( view->mTitleMap.isEmpty() ); - QVERIFY( view->mActionMap.isEmpty() ); - view->initView(); - QVERIFY( view->mInitialized ); - QVERIFY( !view->mFilter ); - QVERIFY( view->mShowFilterMenu ); - QVERIFY( view->mTitleMap.count() == 4 ); - QVERIFY( view->mActionMap.count() == 4 ); - - //TODO: Init twice not allowed -} - -void UT_LogsRecentCallsView::testActivated() -{ - LogsRecentCallsView* view = mRepository->recentCallsView(); - QVERIFY( view ); - // Change for uninitialized causes initialization - QVERIFY( !view->mInitialized ); - QVERIFY( !view->mFilter ); - QVERIFY( !view->mEmptyListLabel ); - QVERIFY( !view->mModel->mMissedCallsCounterCleared ); - view->activated(false, QVariant(LogsServices::ViewAll)); - QVERIFY( view->mInitialized ); - QVERIFY( view->mFilter ); - QVERIFY( view->mEmptyListLabel ); - QVERIFY( view->mModel->mMissedCallsCounterCleared ); - VERIFY_CHECKED_ACTION( view, logsShowFilterRecentMenuActionId ) - - // Change views - view->activated(false, QVariant(LogsServices::ViewReceived)); - QVERIFY( view->mFilter ); - QVERIFY( view->mFilter->filterType() == LogsFilter::Received ); - VERIFY_CHECKED_ACTION( view, logsShowFilterReceivedMenuActionId ) - - view->activated(false, QVariant(LogsServices::ViewMissed)); - QVERIFY( view->mFilter->filterType() == LogsFilter::Missed ); - VERIFY_CHECKED_ACTION( view, logsShowFilterMissedMenuActionId ) - - view->activated(false, QVariant(LogsServices::ViewCalled)); - QVERIFY( view->mFilter->filterType() == LogsFilter::Called ); - VERIFY_CHECKED_ACTION( view, logsShowFilterDialledMenuActionId ) - - view->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - view->mDialpad->editor().setText( QString("hello") ); - view->activated(false, QVariant(LogsServices::ViewAll)); - QVERIFY( view->mFilter->filterType() == LogsFilter::All ); - VERIFY_CHECKED_ACTION( view, logsShowFilterRecentMenuActionId ) - QVERIFY( view->mDialpad->editor().text().isEmpty() ); - QVERIFY( view->mListView->layoutName() == logsListLandscapeLayout ); - QVERIFY( view->mLayoutSectionName == logsViewDefaultSection ); -} - -void UT_LogsRecentCallsView::testDeactivated() -{ - mRecentCallsView->deactivated(); -} - -void UT_LogsRecentCallsView::testInitListWidget() -{ - //TODO:Q_ASSERT_X -/* //list widget can't be found from repository - QVERIFY( !mRecentCallsView->mListView ); - mRecentCallsView->initListWidget(); - QVERIFY( !mRecentCallsView->mListView ); - */ - //list widget is in repository - LogsRecentCallsView* view = mRepository->recentCallsView(); - QVERIFY( !view->mListView ); - view->initListWidget(); - QVERIFY( view->mListView ); - view = 0; -} - -void UT_LogsRecentCallsView::testUpdateFilter() -{ - //no list view - QVERIFY( !mRecentCallsView->mListView ); - QVERIFY( !mRecentCallsView->mFilter ); - mRecentCallsView->updateFilter(LogsFilter::All); - QVERIFY( !mRecentCallsView->mFilter ); - - //first filter created with update - HbStubHelper::reset(); - QVERIFY( !mRecentCallsView->mFilter ); - mRecentCallsView->mListView = new HbListView(); - mRecentCallsView->updateFilter(LogsFilter::All); - QVERIFY( mRecentCallsView->mFilter ); - QVERIFY( mRecentCallsView->mFilter->filterType() == LogsFilter::All ); - QVERIFY( !HbStubHelper::singleShotTimerActive() ); - delete mRecentCallsView->mListView; - mRecentCallsView->mListView = 0; - - //filter is updated with a new one, missed calls marking as seen is started (by timer) - QVERIFY( mRecentCallsView->mFilter ); - mRecentCallsView->mListView = new HbListView(); - mRecentCallsView->updateFilter(LogsFilter::Missed); - QVERIFY( mRecentCallsView->mFilter ); - QVERIFY( mRecentCallsView->mFilter->filterType() == LogsFilter::Missed ); - QVERIFY( HbStubHelper::singleShotTimerActive() ); - delete mRecentCallsView->mListView; - mRecentCallsView->mListView = 0; -} - -void UT_LogsRecentCallsView::testUpdateViewName() -{ - //no view name label - QVERIFY( !mRecentCallsView->mViewName ); - mRecentCallsView->updateViewName(); - QVERIFY( !mRecentCallsView->mViewName ); - - //view name label exists - mRecentCallsView->mCurrentView = LogsServices::ViewMissed; - mRecentCallsView->addStringsToMap(); - mRecentCallsView->mViewName = new HbGroupBox(); - mRecentCallsView->updateViewName(); - QVERIFY( mRecentCallsView->mViewName->heading() - == mRecentCallsView->mTitleMap.value( - mRecentCallsView->mConversionMap.value(LogsServices::ViewMissed))); - delete mRecentCallsView->mViewName; - mRecentCallsView->mViewName = 0; -} - -void UT_LogsRecentCallsView::testChangeFilter() -{ - mRepository->recentCallsView(); - mRecentCallsView->activated( false, QVariant(LogsServices::ViewAll) ); - QVERIFY( mRecentCallsView->mFilter ); - QVERIFY( mRecentCallsView->mFilter->filterType() == LogsFilter::All ); - - HbAction* action = new HbAction(); - action->setObjectName(logsShowFilterMissedMenuActionId); - mRecentCallsView->changeFilter(action); - - // Because of effects, filter is not changed immediately, simulate effect completion - QVERIFY( mRecentCallsView->mAppearingView == LogsServices::ViewMissed ); - mRecentCallsView->dissappearByMovingComplete(); - QVERIFY( mRecentCallsView->mFilter->filterType() == LogsFilter::Missed ); - - delete action; - delete mRecentCallsView->mListView; - mRecentCallsView->mListView = 0; - delete mRecentCallsView->mViewName; - mRecentCallsView->mViewName = 0; -} - -void UT_LogsRecentCallsView::testInitiateCallback() -{ - LogsCall::resetTestData(); - // Call cannot be constructed in model - QModelIndex filterIndex; - mRecentCallsView->initiateCallback(filterIndex); - QVERIFY( LogsCall::lastCalledFuntion().isEmpty() ); - - // Call can be constructed in model - filterIndex = makeValidFilterIndex(*mRecentCallsView); - mRecentCallsView->initiateCallback(filterIndex); - QVERIFY( LogsCall::lastCalledFuntion() == QString("initiateCallback") ); -} - -void UT_LogsRecentCallsView::testCallKeyPressed() -{ LogsRecentCallsView* view = mRepository->recentCallsView(); - - // Not ready for calling - view->callKeyPressed(); - - // No any item where to call - view->activated( false, QVariant(LogsServices::ViewAll) ); - view->callKeyPressed(); - - // Calling possible - mRepository->model()->mTextData.append("testdata"); - mRepository->model()->mTextData.append("testdata2"); - view->mListView->setCurrentIndex( - mRepository->model()->index( 1, 0 ), QItemSelectionModel::Select ); - view->callKeyPressed(); - QVERIFY( view->mListView->currentIndex().row() == 0 ); -} - -void UT_LogsRecentCallsView::testShowCallDetails() -{ - // No details model, nothing to show - QVERIFY( mRecentCallsView->mDetailsModel == 0 ); - mRecentCallsView->showCallDetails(); - QVERIFY( mViewManager->mViewId != LogsDetailsViewId ); - - // Details model shown - mRecentCallsView->mDetailsModel = new LogsDetailsModel; - mRecentCallsView->showCallDetails(); - QVERIFY( mViewManager->mViewId == LogsDetailsViewId ); -} - -void UT_LogsRecentCallsView::testOpenDialpad() -{ - QVERIFY( !mRecentCallsView->mFilter ); - QVERIFY( !mRecentCallsView->mDialpad->isOpen() ); - mRecentCallsView->openDialpad(); - QVERIFY( mRecentCallsView->mMatchesModel ); - QVERIFY( mRecentCallsView->mDialpad->isOpen() ); - - - mRecentCallsView->mFilter = new LogsFilter( LogsFilter::Missed ); - LogsMatchesModel* oldmatchesModel = mRecentCallsView->mMatchesModel; - mRecentCallsView->openDialpad(); - QVERIFY( mRecentCallsView->mMatchesModel == oldmatchesModel ); - QVERIFY( mRecentCallsView->mDialpad->isOpen() ); -} - -void UT_LogsRecentCallsView::testDialpadEditorTextChanged() -{ - // Matches view is opened and matches model is passed as arg - // text editor is one character long - LogsDbConnector* dbConnector = 0; - delete mRecentCallsView->mMatchesModel; - mRecentCallsView->mMatchesModel = 0; - mRecentCallsView->mMatchesModel = new LogsMatchesModel(*dbConnector); - mRecentCallsView->mDialpad->editor().setText( QString("h") ); - mRecentCallsView->dialpadEditorTextChanged(); - QVERIFY( mViewManager->mViewId == LogsMatchesViewId ); - QVERIFY( mRecentCallsView->mMatchesModel == 0 ); - - // No text in editor, no view change, no lines in model, call button - // gets disabled - mViewManager->reset(); - mRecentCallsView->mDialpad->mIsCallButtonEnabled = true; - delete mRecentCallsView->mFilter; - mRecentCallsView->mFilter = new LogsFilter(); - mRecentCallsView->mDialpad->editor().setText( QString("") ); - mRecentCallsView->dialpadEditorTextChanged(); - QVERIFY( mViewManager->mViewId == LogsUnknownViewId ); - QVERIFY( !mRecentCallsView->mDialpad->mIsCallButtonEnabled ); - - // No text in editor but items in list, call button is enabled - mRecentCallsView->mDialpad->mIsCallButtonEnabled = false; - mRecentCallsView->mFilter->setSourceModel(mRecentCallsView->mModel); - mRecentCallsView->mDialpad->editor().setText( QString("") ); - mRecentCallsView->dialpadEditorTextChanged(); - QVERIFY( mViewManager->mViewId == LogsUnknownViewId ); - QVERIFY( mRecentCallsView->mDialpad->mIsCallButtonEnabled ); -} - -void UT_LogsRecentCallsView::testGestureEvent() -{ - LogsRecentCallsView* view = mRepository->recentCallsView(); - 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); - - //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)); - - //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() -{ - // At leftmost list, moving to left causes going to last list - LogsRecentCallsView* view = mRepository->recentCallsView(); - view->activated( false, QVariant(LogsServices::ViewAll) ); - view->mCurrentView = LogsServices::ViewAll; - view->rightFlick(); - QVERIFY(view->mCurrentView == LogsServices::ViewAll); - QVERIFY(view->mAppearingView == LogsServices::ViewMissed); - - // Moving to right possible - 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(); - QVERIFY(view->mCurrentView == LogsServices::ViewMissed); - QVERIFY(view->mAppearingView == LogsServices::ViewAll); - - // Now moving to left is possible - view->rightFlick(); - QVERIFY(view->mCurrentView == LogsServices::ViewMissed); - QVERIFY(view->mAppearingView == LogsServices::ViewReceived); - - // Simulate effect completion which activates new view - view->dissappearByFadingComplete(); - QVERIFY( view->mViewName->heading() - == view->mTitleMap.value(view->mConversionMap.value(LogsServices::ViewReceived)) ); - - view->dissappearByMovingComplete(); - QVERIFY(view->mCurrentView == LogsServices::ViewReceived); - QVERIFY(view->mAppearingView == LogsServices::ViewReceived); - - // If view would be already what expected, nothing happens - view->dissappearByMovingComplete(); - QVERIFY(view->mCurrentView == LogsServices::ViewReceived); - QVERIFY(view->mAppearingView == LogsServices::ViewReceived); -} - - -void UT_LogsRecentCallsView::testModel() -{ - LogsRecentCallsView* view = mRepository->recentCallsView(); - view->activated(false, QVariant(LogsServices::ViewAll)); - QVERIFY( view->mFilter ); - QVERIFY( view->model() == view->mFilter ); -} - -void UT_LogsRecentCallsView::testShowListItemMenu() -{ - HbStubHelper::reset(); - QModelIndex filterIndex = makeValidFilterIndex(*mRecentCallsView); - HbListViewItem* item = new HbListViewItem; - item->setModelIndex(filterIndex);//mRecentCallsView->mFilter->index( 0, 0 )); - - mRecentCallsView->showListItemMenu(item, QPointF()); - - //can't test, showed only if itemContextMenu.actions().count() > 0 - //if we stub actions(), then testActivated() will fail -// QVERIFY( HbStubHelper::menuShown() ); - QVERIFY( HbStubHelper::widgetActionsCount() == 7 ); - delete item; -} - -void UT_LogsRecentCallsView::testUpdateListItemData() -{ - QModelIndex filterIndex = makeValidFilterIndex(*mRecentCallsView); - QVERIFY( !mRecentCallsView->mCall ); - QVERIFY( !mRecentCallsView->mContact ); - QVERIFY( !mRecentCallsView->mMessage ); - QVERIFY( !mRecentCallsView->mDetailsModel ); - - mRecentCallsView->updateListItemData( filterIndex ); - - QVERIFY( mRecentCallsView->mCall ); - QVERIFY( mRecentCallsView->mContact ); - QVERIFY( mRecentCallsView->mMessage ); - QVERIFY( mRecentCallsView->mDetailsModel ); -} - -void UT_LogsRecentCallsView::testPopulateListItemMenu() -{ - //call, message and contact exist, menu has actions - HbStubHelper::reset(); - mRecentCallsView->mCall = new LogsCall(); - mRecentCallsView->mMessage = new LogsMessage(); - mRecentCallsView->mContact = new LogsContact(); - mRecentCallsView->mDetailsModel = new LogsDetailsModel(); - HbMenu menu; - mRecentCallsView->populateListItemMenu(menu); - QVERIFY( HbStubHelper::widgetActionsCount() == 7 ); -} - -void UT_LogsRecentCallsView::testUpdateCall() -{ - //call can be created - QModelIndex filterIndex = makeValidFilterIndex(*mRecentCallsView); - QVERIFY( !mRecentCallsView->mCall ); - mRecentCallsView->updateCall( filterIndex ); - QVERIFY( mRecentCallsView->mCall ); - - //call can't be created - mRecentCallsView->updateCall( QModelIndex() ); - QVERIFY( !mRecentCallsView->mCall ); -} - -void UT_LogsRecentCallsView::testUpdateMessage() -{ - //message can be created - QModelIndex filterIndex = makeValidFilterIndex(*mRecentCallsView); - QVERIFY( !mRecentCallsView->mMessage ); - mRecentCallsView->updateMessage( filterIndex ); - QVERIFY( mRecentCallsView->mMessage ); - - //message can't be created - mRecentCallsView->updateMessage( QModelIndex() ); - QVERIFY( !mRecentCallsView->mMessage ); -} - -void UT_LogsRecentCallsView::testUpdateContact() -{ - //contact can be created - QModelIndex filterIndex = makeValidFilterIndex(*mRecentCallsView); - QVERIFY( !mRecentCallsView->mContact ); - mRecentCallsView->updateContact( filterIndex ); - QVERIFY( mRecentCallsView->mContact ); - - //contact can't be created - mRecentCallsView->updateContact( QModelIndex() ); - QVERIFY( !mRecentCallsView->mContact ); -} - -void UT_LogsRecentCallsView::testActivateEmptyListIndicator() -{ - // Empty model, label is set visible - LogsRecentCallsView* view = mRepository->recentCallsView(); - QObject* obj = mRepository->findObject( logsRecentViewClearListMenuActionId ); - HbAction* action = qobject_cast( obj ); - delete view->mFilter; - view->mFilter = 0; - view->mFilter = new LogsFilter(); - QVERIFY( !view->mEmptyListLabel ); - view->activateEmptyListIndicator(view->mFilter); - QVERIFY( view->mEmptyListLabel ); - QVERIFY( view->mEmptyListLabel->isVisible() ); - QVERIFY(action && !action->isVisible()); - - // Model has items, label is set invisible - LogsModel model; - view->mFilter->setSourceModel(&model); - view->activateEmptyListIndicator(view->mFilter); - QVERIFY( view->mEmptyListLabel ); - QVERIFY( !view->mEmptyListLabel->isVisible() ); - QVERIFY(action && action->isVisible()); -} - -void UT_LogsRecentCallsView::testUpdateMenu() -{ - //menu is not in repository - mRecentCallsView->updateMenu(); - - //menu is in repository, empty model => "Clear list" is not visible - LogsRecentCallsView* view = mRepository->recentCallsView(); - QObject* obj = mRepository->findObject( logsRecentViewClearListMenuActionId ); - HbAction* action = qobject_cast( obj ); - QVERIFY(action && action->isVisible()); - delete view->mFilter; - view->mFilter = 0; - view->mFilter = new LogsFilter(); - view->updateMenu(); - QVERIFY(action && !action->isVisible()); - - //menu is in repository, non-empty model => "Clear list" is visible - makeValidFilterIndex(*view); - view->updateMenu(); - QVERIFY(action && action->isVisible()); -} - - -QModelIndex UT_LogsRecentCallsView::makeValidFilterIndex(LogsRecentCallsView& view) -{ - if ( !view.mModel ) { - return QModelIndex(); - } - view.mModel->mTextData.append("testdata"); - delete view.mFilter; - view.mFilter = 0; - view.mFilter = new LogsFilter( LogsFilter::All ); - view.mFilter->setSourceModel( view.mModel ); - return view.mFilter->index(0,0); -} - -void UT_LogsRecentCallsView::testUpdateWidgetsSizeAndLayout() -{ - //no listView, nothing happens - QVERIFY( !mRecentCallsView->mListView ); - mRecentCallsView->updateWidgetsSizeAndLayout(); - - HbListView list; - //listView exists, layout and size updated - mRecentCallsView->mViewManager.mainWindow().setOrientation( Qt::Vertical ); - mRecentCallsView->mDialpad->closeDialpad(); - mRecentCallsView->mListView = &list; - mRecentCallsView->mListView->setLayoutName("dummy"); - mRecentCallsView->mLayoutSectionName = "dummy"; - mRecentCallsView->updateWidgetsSizeAndLayout(); - QVERIFY( mRecentCallsView->mListView->layoutName() == logsListDefaultLayout ); - QVERIFY( mRecentCallsView->mLayoutSectionName == logsViewDefaultSection ); -} - -void UT_LogsRecentCallsView::testDialpadClosed() -{ - HbListView list; - mRecentCallsView->mListView = &list; - - mRecentCallsView->mViewManager.mainWindow().setOrientation( Qt::Horizontal ); - mRecentCallsView->mDialpad->closeDialpad(); - mRecentCallsView->mLayoutSectionName = QString(logsViewLandscapeDialpadSection); - QString hello("hello"); - mRecentCallsView->mDialpad->editor().setText( hello ); - mRecentCallsView->dialpadClosed(); - QVERIFY( mRecentCallsView->mDialpad->editor().text().isEmpty() ); - QVERIFY( mRecentCallsView->mLayoutSectionName == logsViewDefaultSection ); -} - -void UT_LogsRecentCallsView::testClearList() -{ - - //check that without filter list is not cleared - mRecentCallsView->mModel->mIsCleared = false; - HbMessageBox().setText(tr("Ok")); - mRecentCallsView->clearList(); - QVERIFY( !mRecentCallsView->mModel->mIsCleared ); - - mRecentCallsView->mFilter = new LogsFilter( LogsFilter::Missed ); - - //simulate "Ok" button press of messagebox - HbMessageBox().setText(tr("Ok")); - mRecentCallsView->clearList(); - QVERIFY( mRecentCallsView->mModel->mIsCleared ); - - //simulate "Cancel" button press of messagebox - mRecentCallsView->mModel->mIsCleared = false; - HbMessageBox().setText(tr("Cancel")); - mRecentCallsView->clearList(); - QVERIFY( !mRecentCallsView->mModel->mIsCleared ); -} - -void UT_LogsRecentCallsView::testIsExitAllowed() -{ - // Exit allowed, nothing to mark as seen - QVERIFY( mRecentCallsView->isExitAllowed() ); - QVERIFY( !mRecentCallsView->mMarkingMissedAsSeen ); - - // Exit not allowed, marking started - mRecentCallsView->mModel->mTestIsMarkingNeeded = true; - QVERIFY( !mRecentCallsView->isExitAllowed() ); - QVERIFY( mRecentCallsView->mMarkingMissedAsSeen ); - - // Exit not allowed marking still ongoing - QVERIFY( !mRecentCallsView->isExitAllowed() ); - QVERIFY( mRecentCallsView->mMarkingMissedAsSeen ); - - // Complete marking, exit allowed - QSignalSpy spy( mRecentCallsView, SIGNAL(exitAllowed()) ); - mRecentCallsView->mModel->mTestIsMarkingNeeded = false; - mRecentCallsView->markingCompleted(0); - QVERIFY( !mRecentCallsView->mMarkingMissedAsSeen ); - QVERIFY( spy.count() == 1 ); - QVERIFY( mRecentCallsView->isExitAllowed() ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/src/ut_logsservicehandler.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsservicehandler.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +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: -* -*/ - -//USER -#include "ut_logsservicehandler.h" -#include "logsservicehandler.h" -#include "qthighway_stub_helper.h" - -//SYSTEM -#include - -Q_DECLARE_METATYPE(LogsServices::LogsView) - -void UT_LogsServiceHandler::initTestCase() -{ -} - -void UT_LogsServiceHandler::cleanupTestCase() -{ -} - - -void UT_LogsServiceHandler::init() -{ - mService = new LogsServiceHandler(); -} - -void UT_LogsServiceHandler::cleanup() -{ - delete mService; - mService = 0; - QtHighwayStubHelper::reset(); -} - -void UT_LogsServiceHandler::testConstructor() -{ - QVERIFY( mService ); - QVERIFY( !mService->mIsAppStartedUsingService ); - QVERIFY( !mService->isStartedUsingService() ); - - QtHighwayStubHelper::setIsService(true); - LogsServiceHandler serviceHandler; - QVERIFY( serviceHandler.mIsAppStartedUsingService ); - QVERIFY( serviceHandler.isStartedUsingService() ); - -} - -void UT_LogsServiceHandler::testStart() -{ - qRegisterMetaType< LogsServices::LogsView >("LogsServices::LogsView"); - QSignalSpy spy(mService, SIGNAL(activateView(LogsServices::LogsView, bool))); - - // Wrong view - QVERIFY( mService->start( 9999, true ) != 0 ); - QVERIFY( spy.count() == 0 ); - - // Correct view - QtHighwayStubHelper::reset(); - QVERIFY( mService->start( (int)LogsServices::ViewReceived, true ) == 0 ); - QVERIFY( spy.count() == 1 ); - LogsServices::LogsView view = - qvariant_cast< LogsServices::LogsView >(spy.at(0).at(0)); - QVERIFY( view == LogsServices::ViewReceived ); - QVERIFY( mService->currentlyActivatedView() == LogsServices::ViewReceived ); - QVERIFY( !QtHighwayStubHelper::utilToBackground() ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +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: -* -*/ - -//USER -#include "ut_logsviewmanager.h" -#include "logsviewmanager.h" -#include "logsservicehandler.h" -#include "logsmainwindow.h" -#include "logscomponentrepository.h" -#include "logsrecentcallsview.h" -#include "logsdetailsview.h" -#include "hbstubs_helper.h" - -//SYSTEM -#include -#include -#include -#include - -void UT_LogsViewManager::initTestCase() -{ - //mMainWindow = new LogsMainWindow(); -} - -void UT_LogsViewManager::cleanupTestCase() -{ -} - - -void UT_LogsViewManager::init() -{ - mMainWindow = new LogsMainWindow(); - LogsServiceHandler* service = new LogsServiceHandler(); - mLogsViewManager = new LogsViewManager(*mMainWindow, *service); -} - -void UT_LogsViewManager::cleanup() -{ - delete mLogsViewManager; - mLogsViewManager = 0; - delete mMainWindow; - mMainWindow = 0; -} - -void UT_LogsViewManager::testConstructorDestructor() -{ - QVERIFY( mLogsViewManager ); - QVERIFY( mLogsViewManager->mComponentsRepository ); - QVERIFY( mLogsViewManager->mMainWindow.viewCount() == 3 ); - QVERIFY( mLogsViewManager->mMainWindow.currentView() == - mLogsViewManager->mComponentsRepository->recentCallsView() ); - QVERIFY( mLogsViewManager->mViewStack.count() == 3 ); - - delete mLogsViewManager; - mLogsViewManager = 0; - //TODO: removeView deprecated => this will fail - //QVERIFY( mMainWindow->viewCount() == 0 ); -} - -void UT_LogsViewManager::testActivateView() -{ - // Activate already active view - QVERIFY( mLogsViewManager->mMainWindow.currentView() == - mLogsViewManager->mComponentsRepository->recentCallsView() ); - QVERIFY( mLogsViewManager->activateView(LogsRecentViewId) ); - QVERIFY( mLogsViewManager->mMainWindow.viewCount() == 3 ); - QVERIFY( mLogsViewManager->mMainWindow.currentView() == - mLogsViewManager->mComponentsRepository->recentCallsView() ); - - // Activate other view - QVERIFY( mLogsViewManager->activateView(LogsDetailsViewId) ); - QVERIFY( mLogsViewManager->mMainWindow.viewCount() == 3 ); - // Current view does not immediately return new view as it waits - // view change effect completion - //QVERIFY( mLogsViewManager->mMainWindow.currentView() == - // mLogsViewManager->mComponentsRepository->detailsView() ); - QVERIFY( mLogsViewManager->mViewStack.at(0) == - mLogsViewManager->mComponentsRepository->detailsView() ); - - // Try to activate unknown view - QVERIFY( !mLogsViewManager->activateView(LogsUnknownViewId) ); - QVERIFY( mLogsViewManager->mMainWindow.viewCount() == 3 ); - //QVERIFY( mLogsViewManager->mMainWindow.currentView() == - // mLogsViewManager->mComponentsRepository->detailsView() ); - QVERIFY( mLogsViewManager->mViewStack.at(0) == - mLogsViewManager->mComponentsRepository->detailsView() ); - - // Go back to previous view - QVERIFY( mLogsViewManager->activatePreviousView() ); - QVERIFY( mLogsViewManager->mMainWindow.viewCount() == 3 ); - //QVERIFY( mLogsViewManager->mMainWindow.currentView() == - // mLogsViewManager->mComponentsRepository->recentCallsView() ); - QVERIFY( mLogsViewManager->mViewStack.at(0) == - mLogsViewManager->mComponentsRepository->recentCallsView() ); -} - -void UT_LogsViewManager::testExitApplication() -{ - // Exit immediately possible - HbStubHelper::reset(); - mLogsViewManager->exitApplication(); - QVERIFY( HbStubHelper::quitCalled() ); - - // Exit not yet possible - mLogsViewManager->mComponentsRepository->recentCallsView()->mMarkingMissedAsSeen = true; - HbStubHelper::reset(); - mLogsViewManager->exitApplication(); - QVERIFY( !HbStubHelper::quitCalled() ); - - // Simulate view allowing exit after denying it first - mLogsViewManager->mComponentsRepository->recentCallsView()->mMarkingMissedAsSeen = false; - mLogsViewManager->proceedExit(); - QVERIFY( HbStubHelper::quitCalled() ); -} - -void UT_LogsViewManager::testAppFocusGained() -{ - mLogsViewManager->appFocusGained(); - // Nothing to verify -} - -void UT_LogsViewManager::testStartingWithService() -{ - // If app is started with highway service, view is not activated - // before service method call comes. - LogsMainWindow window; - window.setCurrentView(0); // clear stub static data - LogsServiceHandler service; - service.mIsAppStartedUsingService = true; - LogsViewManager vm(window, service); - QVERIFY( vm.mComponentsRepository ); - QVERIFY( vm.mMainWindow.viewCount() == 3 ); - QVERIFY( vm.mMainWindow.currentView() == 0 ); - QVERIFY( vm.mViewStack.count() == 3 ); -} - -void UT_LogsViewManager::testHandleOrientationChanged() -{ - mLogsViewManager->handleOrientationChanged(); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad.h --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 popup -* -*/ - -#ifndef DIALPAD_H -#define DIALPAD_H - -#include - -#include -#include - -class HbLineEdit; - -const int DialpadButtonCount = 13; - -class Dialpad : public HbWidget -{ - Q_OBJECT - -public: - explicit Dialpad(); - explicit Dialpad(const HbMainWindow& mainWindow); - - virtual ~Dialpad(); - - HbLineEdit& editor() const; - - bool isOpen() const {return mIsOpen;} - -public slots: - - void openDialpad() { mIsOpen = true; } - - void closeDialpad() { mIsOpen = false; } - - void setCallButtonEnabled(bool enabled); - -signals: - void aboutToClose(); - -public: - HbLineEdit* mLineEdit; - bool mIsCallButtonEnabled; - bool mIsOpen; -}; - -#endif // DIALPAD_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad_stub.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad_stub.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/* -* 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 -#include "dialpad.h" - -Dialpad::Dialpad() -{ - 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() -{ - delete mLineEdit; -} - -HbLineEdit& Dialpad::editor() const -{ - return *mLineEdit; -} - -void Dialpad::setCallButtonEnabled(bool enabled) -{ - mIsCallButtonEnabled = enabled; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler.h --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/*! -* 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 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler_stub.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler_stub.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* -* 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 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/stubs/hbapplication.h --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/hbapplication.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +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: -* -*/ -#ifndef HBAPPLICATION_H -#define HBAPPLICATION_H - -#include -#include - -class HbApplication : public QObject -{ -public: - HbApplication(int &/*argc*/, char */*argv*/[]); - ~HbApplication(); - - static void quit(); -}; - -#endif//HBAPPLICATION_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,253 +0,0 @@ -/* -* 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: HbMenu2 implementation. -* -*/ - - -#include -#include -#include -#include "hbstubs_helper.h" -#include -#include -#include -#include -#include - -int actionCount = 0; -Qt::Orientation windowOrientation = Qt::Vertical; -bool logsMenuShown = false; -HbMainWindow* testWindow = 0; -HbView* testView = 0; -int testViewCount = 0; -HbAction* testSoftkeyAction = 0; -QString selectedActionString = "none"; -bool testSingleShotTimer = false; -bool testQuitCalled = false; -Qt::GestureState testState = Qt::NoGesture; - -void HbStubHelper::reset() -{ - actionCount = 0; - logsMenuShown = false; - testSingleShotTimer = false; - testQuitCalled = false; -} - -int HbStubHelper::widgetActionsCount() -{ - return actionCount; -} - -bool HbStubHelper::menuShown() -{ - return logsMenuShown; -} - -bool HbStubHelper::singleShotTimerActive() -{ - return testSingleShotTimer; -} - -bool HbStubHelper::quitCalled() -{ - return testQuitCalled; -} - -void HbStubHelper::setGestureState(int state) -{ - testState = static_cast (state); -} - - -Qt::GestureState QGesture::state() const -{ - return testState; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -HbApplication::HbApplication(int &/*argc*/, char */*argv*/[]) -{ -} - -HbApplication::~HbApplication() -{ -} - -void HbApplication::quit() -{ - testQuitCalled = true; -} - -void QCoreApplication::quit() -{ - testQuitCalled = true; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -HbAction *HbMenu::exec(const QPointF &pos, HbAction *action ) -{ - Q_UNUSED(action) - Q_UNUSED(pos) - logsMenuShown = true; - return 0; -} - -HbAction *HbMenu::exec(HbAction *action) -{ - Q_UNUSED(action) - logsMenuShown = true; - return 0; -} - -void QGraphicsWidget::addAction(QAction *action) -{ - Q_UNUSED(action) - actionCount++; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -HbMainWindow::HbMainWindow(QWidget *parent, Hb::WindowFlags windowFlags) : d_ptr(0) -{ - Q_UNUSED(parent) - Q_UNUSED(windowFlags) - testViewCount = 0; - testWindow = this; -} - -HbMainWindow::~HbMainWindow() -{ - 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; -} - -int HbMainWindow::viewCount() const -{ - return testViewCount; -} -HbView *HbMainWindow::currentView() const -{ - return testView; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -HbInstance::HbInstance() : d(0) -{ - -} - -HbInstance::~HbInstance() -{ - -} - -HbInstance* HbInstance::instance() -{ - static HbInstance hbTestInstance; - return &hbTestInstance; -} - -QList HbInstance::allMainWindows() const -{ - QList list; - list.append(testWindow); - return list; -} - -void HbMessageBox::setText(const QString &string) -{ - - if (string == "Ok") { - selectedActionString = "primary"; - } else if (string == "Cancel") { - selectedActionString = "secondary"; - } - -} - - -HbAction *HbDialog::exec() -{ - if (selectedActionString == "primary") { - return primaryAction(); - } else { - return 0; - } -} - -void QTimer::singleShot(int msec, QObject *receiver, const char *member) -{ - testSingleShotTimer = true; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +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: -* -*/ - -#ifndef HBSTUB_HELPER_H -#define HBSTUB_HELPER_H -/** -* Helper class to control logsdbconnector stub behavior -* -*/ -class HbStubHelper -{ - public: - static void reset(); - static int widgetActionsCount(); - static bool menuShown(); - static bool singleShotTimerActive(); - static bool quitCalled(); - static void setGestureState(int state); -}; - -#endif diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/stubs/qthighway_stub.cpp --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/qthighway_stub.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -/* -* 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 -#include -#include -#include -#include "qthighway_stub_helper.h" - -QString qtHighwayStubService; -QString qtHighwayStubMessage; -bool qtHighwayStubToBackground = false; -bool qtHighwayStubIsService = false; - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// - -void QtHighwayStubHelper::reset() -{ - qtHighwayStubService.clear(); - qtHighwayStubMessage.clear(); - qtHighwayStubToBackground = false; - qtHighwayStubIsService = false; -} - -QString QtHighwayStubHelper::service() -{ - return qtHighwayStubService; -} - -QString QtHighwayStubHelper::message() -{ - return qtHighwayStubMessage; -} - -bool QtHighwayStubHelper::utilToBackground() -{ - return qtHighwayStubToBackground; -} - -void QtHighwayStubHelper::setIsService(bool isService) -{ - qtHighwayStubIsService = isService; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -XQServiceProvider::XQServiceProvider( const QString& service, QObject *parent ) -{ - Q_UNUSED(service); - Q_UNUSED(parent); -} - -XQServiceProvider::~XQServiceProvider() -{ - -} - -void XQServiceProvider::SetPlugin(QObject* impl_plugin) -{ - Q_UNUSED(impl_plugin); -} - -void XQServiceProvider::publishAll() -{ - -} - -int XQServiceProvider::setCurrentRequestAsync() -{ - return 0; -} - -bool XQServiceProvider::completeRequest(int index, const QVariant& retValue) -{ - Q_UNUSED(index); - Q_UNUSED(retValue); - return true; -} - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -XQServiceRequest::XQServiceRequest( - const QString& service, const QString& message, const bool& synchronous) -{ - qtHighwayStubService = service; - qtHighwayStubMessage = message; -} - -XQServiceRequest::~XQServiceRequest() -{ - -} - - -void XQServiceRequest::setArguments(const QList &arguments) -{ - Q_UNUSED(arguments) -} - -QString XQServiceRequest::service() const -{ - return qtHighwayStubService; -} - -QString XQServiceRequest::message() const -{ - return qtHighwayStubMessage; -} - -bool XQServiceRequest::send(QVariant& retValue) -{ - return true; -} -void XQServiceRequest::addArg(const QVariant& v) -{ - -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void XQServiceUtil::toBackground(bool value) -{ - qtHighwayStubToBackground = value; -} - -bool XQServiceUtil::isService() -{ - return qtHighwayStubIsService; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/stubs/qthighway_stub_helper.h --- a/logsui/logsapp/tsrc/ut_logsapp/stubs/qthighway_stub_helper.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +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: -* -*/ - -/** -* Helper class to control logcli stub behavior -* -*/ -class QtHighwayStubHelper{ - public: - static void reset(); - static QString service(); - static QString message(); - static bool utilToBackground(); - static void setIsService(bool isService); -}; diff -r 76a2435edfd4 -r de1630741fbe logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro --- a/logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +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: -# -# - -TEMPLATE = app -TARGET = - -QT += testlib xml -CONFIG += hb -RESOURCES += ../../logsapp.qrc - -INCLUDEPATH += . -INCLUDEPATH += stubs #must be before orbit includes -INCLUDEPATH += ../../ -INCLUDEPATH += ../../inc -INCLUDEPATH += ../../../inc -INCLUDEPATH += logsengine_stub -INCLUDEPATH += ../../../logsengine/inc -INCLUDEPATH += ../../../logsengine/logssymbianos -INCLUDEPATH += ../../../logsengine/logssymbianos/inc -INCLUDEPATH += /orbit/include -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -INCLUDEPATH += ../../../tsrc/qtestutils/inc - -DEFINES += QT_NO_DEBUG_OUTPUT - -# Input -HEADERS += inc/ut_logsmainwindow.h -HEADERS += ../../inc/logsmainwindow.h -HEADERS += inc/ut_logscomponentrepository.h -HEADERS += ../../inc/logsviewmanager.h -HEADERS += inc/ut_logsviewmanager.h -HEADERS += inc/ut_logsbaseview.h -HEADERS += inc/ut_logsrecentcallsview.h -HEADERS += inc/ut_logsdetailsview.h -HEADERS += inc/ut_logsmatchesview.h -HEADERS += inc/ut_logseffecthandler.h -HEADERS += ../../inc/logsrecentcallsview.h -HEADERS += ../../inc/logsbaseview.h -HEADERS += ../../inc/logsdetailsview.h -HEADERS += ../../inc/logsmatchesview.h -HEADERS += ../../inc/logsservicehandler.h -HEADERS += ../../inc/logseffecthandler.h -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 -SOURCES += ../../src/logsmainwindow.cpp -SOURCES += src/ut_logscomponentrepository.cpp -SOURCES += ../../src/logscomponentrepository.cpp -SOURCES += src/ut_logsviewmanager.cpp -SOURCES += ../../src/logsviewmanager.cpp -SOURCES += logsengine_stub/logsabstractmodel.cpp -SOURCES += logsengine_stub/logsmodel.cpp -SOURCES += logsengine_stub/logsdetailsmodel.cpp -SOURCES += logsengine_stub/logscall.cpp -SOURCES += logsengine_stub/logsmessage.cpp -SOURCES += logsengine_stub/logsevent.cpp -SOURCES += logsengine_stub/logseventdata.cpp -SOURCES += logsengine_stub/logscontact.cpp -SOURCES += logsengine_stub/logsmatchesmodel.cpp -SOURCES += src/ut_logsbaseview.cpp -SOURCES += src/ut_logsrecentcallsview.cpp -SOURCES += src/ut_logsdetailsview.cpp -SOURCES += src/ut_logsmatchesview.cpp -SOURCES += src/ut_logseffecthandler.cpp -SOURCES += ../../src/logsbaseview.cpp -SOURCES += ../../src/logsrecentcallsview.cpp -SOURCES += ../../src/logsdetailsview.cpp -SOURCES += ../../src/logsmatchesview.cpp -SOURCES += ../../src/logsservicehandler.cpp -SOURCES += ../../src/logseffecthandler.cpp -SOURCES += src/ut_logsservicehandler.cpp -SOURCES += ../../../tsrc/qtestutils/src/testresultxmlparser.cpp -SOURCES += ./stubs/hbstubs.cpp -SOURCES += ./stubs/qthighway_stub.cpp -SOURCES += ./stubs/dialpad_stub.cpp -SOURCES += ./stubs/dialpadkeyhandler_stub.cpp - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xEb768cbc - TARGET.CAPABILITY = ALL -TCB - TARGET.EPOCALLOWDLLDATA = 1 - LIBS += -lxqservice -lxqserviceutil -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/bwins/logscntfinderu.def --- a/logsui/logscntfinder/bwins/logscntfinderu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -EXPORTS - ?getEntry@LogsCntFinder@@QBEPAVLogsCntEntry@@ABVQObject@@@Z @ 1 NONAME ; class LogsCntEntry * LogsCntFinder::getEntry(class QObject const &) const - ?deleteEntry@LogsCntFinder@@QAEXABVQObject@@@Z @ 2 NONAME ; void LogsCntFinder::deleteEntry(class QObject const &) - ?contactId@LogsCntEntry@@QBEIXZ @ 3 NONAME ; unsigned int LogsCntEntry::contactId(void) const - ?setFirstName@LogsCntEntry@@QAEXABVQString@@@Z @ 4 NONAME ; void LogsCntEntry::setFirstName(class QString const &) - ??0LogsCntEntry@@QAE@AAVQObject@@I@Z @ 5 NONAME ; LogsCntEntry::LogsCntEntry(class QObject &, unsigned int) - ?speedDial@LogsCntEntry@@QBEABVQString@@XZ @ 6 NONAME ; class QString const & LogsCntEntry::speedDial(void) const - ?predictiveSearchQuery@LogsCntFinder@@QAEXABVQString@@@Z @ 7 NONAME ; void LogsCntFinder::predictiveSearchQuery(class QString const &) - ?richText@LogsCntText@@QBE?AVQString@@V2@0@Z @ 8 NONAME ; class QString LogsCntText::richText(class QString, class QString) const - ?setLastName@LogsCntEntry@@QAEXABVQString@@@Z @ 9 NONAME ; void LogsCntEntry::setLastName(class QString const &) - ??0LogsCntFinder@@QAE@XZ @ 10 NONAME ; LogsCntFinder::LogsCntFinder(void) - ?insertEntry@LogsCntFinder@@QAEXHPAVLogsCntEntry@@@Z @ 11 NONAME ; void LogsCntFinder::insertEntry(int, class LogsCntEntry *) - ?resultsCount@LogsCntFinder@@QBEHXZ @ 12 NONAME ; int LogsCntFinder::resultsCount(void) const - ?phoneNumber@LogsCntEntry@@QBEABVLogsCntText@@XZ @ 13 NONAME ; class LogsCntText const & LogsCntEntry::phoneNumber(void) const - ?type@LogsCntEntry@@QBE?AW4EntryType@1@XZ @ 14 NONAME ; enum LogsCntEntry::EntryType LogsCntEntry::type(void) const - ?resultAt@LogsCntFinder@@QAEABVLogsCntEntry@@H@Z @ 15 NONAME ; class LogsCntEntry const & LogsCntFinder::resultAt(int) - ?lastName@LogsCntEntry@@QBEABV?$QList@VLogsCntText@@@@XZ @ 16 NONAME ; class QList const & LogsCntEntry::lastName(void) const - ?handle@LogsCntEntry@@QBEPAVQObject@@XZ @ 17 NONAME ; class QObject * LogsCntEntry::handle(void) const - ?firstName@LogsCntEntry@@QBEABV?$QList@VLogsCntText@@@@XZ @ 18 NONAME ; class QList const & LogsCntEntry::firstName(void) const - ??1LogsCntFinder@@UAE@XZ @ 19 NONAME ; LogsCntFinder::~LogsCntFinder(void) - ?setPhoneNumber@LogsCntEntry@@QAEXABVQString@@@Z @ 20 NONAME ; void LogsCntEntry::setPhoneNumber(class QString const &) - ?setAvatarPath@LogsCntEntry@@QAEXABVQString@@@Z @ 21 NONAME ; void LogsCntEntry::setAvatarPath(class QString const &) - ?avatarPath@LogsCntEntry@@QBEABVQString@@XZ @ 22 NONAME ; class QString const & LogsCntEntry::avatarPath(void) const - ??0LogsCntFinder@@QAE@AAVQContactManager@QtMobility@@@Z @ 23 NONAME ; LogsCntFinder::LogsCntFinder(class QtMobility::QContactManager &) - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/eabi/logscntfinderu.def --- a/logsui/logscntfinder/eabi/logscntfinderu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -EXPORTS - _ZN12LogsCntEntry11setLastNameERK7QString @ 1 NONAME - _ZN12LogsCntEntry12setFirstNameERK7QString @ 2 NONAME - _ZN12LogsCntEntry14setPhoneNumberERK7QString @ 3 NONAME - _ZN12LogsCntEntryC1ER7QObjectj @ 4 NONAME - _ZN12LogsCntEntryC2ER7QObjectj @ 5 NONAME - _ZN13LogsCntFinder11deleteEntryERK7QObject @ 6 NONAME - _ZN13LogsCntFinder11insertEntryEiP12LogsCntEntry @ 7 NONAME - _ZN13LogsCntFinder21predictiveSearchQueryERK7QString @ 8 NONAME - _ZN13LogsCntFinder8resultAtEi @ 9 NONAME - _ZN13LogsCntFinderC1Ev @ 10 NONAME - _ZN13LogsCntFinderC2Ev @ 11 NONAME - _ZN13LogsCntFinderD0Ev @ 12 NONAME - _ZN13LogsCntFinderD1Ev @ 13 NONAME - _ZN13LogsCntFinderD2Ev @ 14 NONAME - _ZNK11LogsCntText8richTextE7QStringS0_ @ 15 NONAME - _ZNK12LogsCntEntry11phoneNumberEv @ 16 NONAME - _ZNK12LogsCntEntry4typeEv @ 17 NONAME - _ZNK12LogsCntEntry6handleEv @ 18 NONAME - _ZNK12LogsCntEntry8lastNameEv @ 19 NONAME - _ZNK12LogsCntEntry9contactIdEv @ 20 NONAME - _ZNK12LogsCntEntry9firstNameEv @ 21 NONAME - _ZNK12LogsCntEntry9speedDialEv @ 22 NONAME - _ZNK13LogsCntFinder12resultsCountEv @ 23 NONAME - _ZNK13LogsCntFinder8getEntryERK7QObject @ 24 NONAME - _ZN12LogsCntEntry13setAvatarPathERK7QString @ 25 NONAME - _ZNK12LogsCntEntry10avatarPathEv @ 26 NONAME - _ZN13LogsCntFinderC1ERN10QtMobility15QContactManagerE @ 27 NONAME - _ZN13LogsCntFinderC2ERN10QtMobility15QContactManagerE @ 28 NONAME - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/inc/logscntfinder.h --- a/logsui/logscntfinder/inc/logscntfinder.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,214 +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: -* -*/ - -#ifndef LOGSCNTFINDER_H -#define LOGSCNTFINDER_H - -#include -#include -#include -#include -#include - - -class LogsCntEntry; -typedef QObject LogsCntEntryHandle; - -QTM_BEGIN_NAMESPACE -class QContactManager; -QTM_END_NAMESPACE - -QTM_USE_NAMESPACE - -class LogsCntText -{ -public: - - inline LogsCntText() : mHighlights(0){} - inline const QString& text() const {return mText;} - inline int highlights() const {return mHighlights;} - LOGSCNTFINDER_EXPORT QString richText( QString startTag = QString(""), - QString endTag = QString("")) const; - - -private: - - QString mText; - QString mTranslatedText; - int mHighlights; - - friend class LogsCntEntry; - friend class UT_LogsCntEntry; - friend class UT_LogsCntFinder; -}; - -typedef QList LogsCntTextList; - -class LogsCntEntry -{ -public: - - enum EntryType { - EntryTypeHistory, - EntryTypeContact - }; - - LOGSCNTFINDER_EXPORT LogsCntEntry( LogsCntEntryHandle& handle, - quint32 cid ); - LogsCntEntry( quint32 cid ); - LogsCntEntry( const LogsCntEntry& entry ); - ~LogsCntEntry(); - LOGSCNTFINDER_EXPORT EntryType type() const; - LOGSCNTFINDER_EXPORT const LogsCntTextList& firstName() const; - LOGSCNTFINDER_EXPORT const LogsCntTextList& lastName() const; - LOGSCNTFINDER_EXPORT quint32 contactId() const; - LOGSCNTFINDER_EXPORT LogsCntEntryHandle* handle() const; - LOGSCNTFINDER_EXPORT void setFirstName( const QString& name ); - LOGSCNTFINDER_EXPORT void setLastName( const QString& name ); - LOGSCNTFINDER_EXPORT const LogsCntText& phoneNumber() const; - LOGSCNTFINDER_EXPORT const QString& avatarPath() const; - LOGSCNTFINDER_EXPORT void setPhoneNumber( const QString& number ); - LOGSCNTFINDER_EXPORT void setAvatarPath( const QString& avatarpath ); - LOGSCNTFINDER_EXPORT const QString& speedDial() const; - - bool isCached() const; - void setHighlights( const QString& pattern ); - void setSpeedDial( const QString& number ); - bool match( const QString& pattern ) const; - -private: - - void doSetText( const QString& text, LogsCntTextList& textlist ); - QStringList tokens( const QString& source, const QChar& separ = ' ' ) const; - void doSetHighlights( const QString& pattern, LogsCntTextList& nameArray ); - void resetHighlights( LogsCntTextList& nameArray ); - bool doSimpleMatch( const QString& pattern ) const; - bool doComplexMatch( QStringList patternArray ) const; - -private: - - EntryType mType; - quint32 mCid; - LogsCntTextList mFirstName; - LogsCntTextList mLastName; - bool mCached; - LogsCntEntryHandle* mHandle; - LogsCntText mPhoneNumber; - QString mAvatarPath; - QString mSpeedDial; - - friend class UT_LogsCntEntry; - friend class UT_LogsCntFinder; -}; - -typedef QList LogsCntEntryList; - -/** - * Log events and contacts finder - * - */ -class LogsCntFinder : public QObject -{ - - Q_OBJECT - -public: // The exported API - - LOGSCNTFINDER_EXPORT LogsCntFinder(); - LOGSCNTFINDER_EXPORT LogsCntFinder(QContactManager& contactManager); - LOGSCNTFINDER_EXPORT ~LogsCntFinder(); - - /** - * Starts/continues predictive query based on pattern. If - * there is a previously executed query with same pattern, - * call is treated as continue query. - * @param pattern the predictive pattern, containing digit(s) - */ - LOGSCNTFINDER_EXPORT - void predictiveSearchQuery( const QString& pattern ); - - /** - * returns number of results - * @return number of results - */ - LOGSCNTFINDER_EXPORT - int resultsCount() const; - - /** - * returns result at index - * @param index the index - */ - LOGSCNTFINDER_EXPORT - const LogsCntEntry& resultAt( int index ); - - /** - * Used for adding entiries to be part of a query - * Ownership is transfered - * @param entry the entry - */ - LOGSCNTFINDER_EXPORT - void insertEntry( int index, LogsCntEntry* entry ); - - /** - * Used for updating entiries - * @param handle the handle - */ - LOGSCNTFINDER_EXPORT - LogsCntEntry* getEntry( const LogsCntEntryHandle& handle ) const; - - /** - * Used for updating entiries - * @param entry the entry - */ - LOGSCNTFINDER_EXPORT - void deleteEntry( const LogsCntEntryHandle& handle ); - -signals: - - /** - * emitted when query is ready - */ - void queryReady(); - -private: - - void doPredictiveHistoryQuery(); - 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: - - QString mCurrentPredictivePattern; - LogsCntEntryList mResults; - QContactManager* mContactManager; - LogsCntEntryList mHistoryEvents; - int mCachedCounter; - - friend class UT_LogsCntFinder; - -}; - -#endif //LOGSCNTFINDER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/inc/logspredictivetranslator.h --- a/logsui/logscntfinder/inc/logspredictivetranslator.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSPREDICTIVETRANSLATOR_H -#define LOGSPREDICTIVETRANSLATOR_H - -#include -#include - -class HbKeymap; - -/** - * predictive translator. Singelton - * - */ -class LogsPredictiveTranslator : public QObject -{ - - Q_OBJECT - -public: - - static LogsPredictiveTranslator* instance(); - static void deleteInstance(); - - ~LogsPredictiveTranslator(); - - const QString translate( const QString& name, int count = -1 ) const; - int startsWith( const QString& text, const QString& pattern, bool optimize = true ) const; - - -private: - - explicit LogsPredictiveTranslator(); - const QChar translate( const QChar character ) const; - - -private: - - static LogsPredictiveTranslator* mInstance; - const HbKeymap* mKeyMap; - - friend class UT_LogsPredictiveTranslator; - -}; - -#endif //LOGSPREDICTIVETRANSLATOR_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/logscntfinder.pro --- a/logsui/logscntfinder/logscntfinder.pro Fri Apr 16 14:53:18 2010 +0300 +++ /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. -# 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 = logscntfinder -CONFIG += dll -CONFIG += hb - -INCLUDEPATH += ./ -INCLUDEPATH += ./inc -INCLUDEPATH += ../inc -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - - -# Input -HEADERS += inc/logscntfinder.h -HEADERS += inc/logspredictivetranslator.h - -# Input -SOURCES += src/logscntfinder.cpp -SOURCES += src/logspredictivetranslator.cpp - -# stub Input. comment out from real lib -#SOURCES += tsrc/stubs/qtcontacts_stubs.cpp - -DEFINES += LOGSCNTFINDER_LIB - -libFiles.sources = logscntfinder.dll -libFiles.path = "!:/sys/bin" -DEPLOYMENT += libFiles - -symbian: { - TARGET.UID2 = 0x1000008d - TARGET.UID3 = 0x10282CE3 - - TARGET.CAPABILITY = CAP_GENERAL_DLL - TARGET.EPOCALLOWDLLDATA = 1 - LIBS += -lflogger -lqtcontacts - defFiles = "$${LITERAL_HASH}ifdef WINS" \ - "DEFFILE bwins/logscntfinder.def" \ - "$${LITERAL_HASH}else" \ - "DEFFILE eabi/logscntfinder.def" \ - "$${LITERAL_HASH}endif" - MMP_RULES += defFiles -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/src/logscntfinder.cpp --- a/logsui/logscntfinder/src/logscntfinder.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,746 +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 -#include -#include -#include - -#include "logscntfinder.h" -#include "logspredictivetranslator.h" -#include "logslogger.h" - -const int MaxPredSearchPatternLen = 15; - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::richText() -// ----------------------------------------------------------------------------- -// -QString LogsCntText::richText( QString startTag, - QString endTag ) const -{ - QString str = text(); - if ( str.length() > 0 && highlights() > 0 ) { - str.insert( highlights() , endTag ); - str.insert( 0, startTag ); - } - - return str; - -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::LogsCntEntry() -// ----------------------------------------------------------------------------- -// -LogsCntEntry::LogsCntEntry( LogsCntEntryHandle& handle, - quint32 cid ) - : mType( EntryTypeHistory ), mCid( cid ), - mCached( true ),mHandle(&handle) -{ - LogsCntText empty; - mFirstName.append( empty ); - mLastName.append( empty ); - mAvatarPath = ""; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::LogsCntEntry() -// ----------------------------------------------------------------------------- -// -LogsCntEntry::LogsCntEntry( quint32 cid ) - : mType( EntryTypeContact ), mCid( cid ), - mCached( false ),mHandle(0) -{ - LogsCntText empty; - mFirstName.append( empty ); - mLastName.append( empty ); - mAvatarPath = ""; -} - -// ----------------------------------------------------------------------------- -// copy LogsCntEntry::LogsCntEntry() -// ----------------------------------------------------------------------------- -// -LogsCntEntry::LogsCntEntry( const LogsCntEntry& entry ) - : mType(entry.mType), - mCid(entry.mCid), - mFirstName(entry.mFirstName), - mLastName(entry.mLastName), - mCached(entry.mCached), - mHandle(entry.mHandle), - mPhoneNumber(entry.mPhoneNumber), - mAvatarPath(entry.mAvatarPath) -{ -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::~LogsCntEntry() -// ----------------------------------------------------------------------------- -// -LogsCntEntry::~LogsCntEntry() -{ -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::firstName() -// ----------------------------------------------------------------------------- -// -const LogsCntTextList& LogsCntEntry::firstName() const -{ - return mFirstName; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::lastName() -// ----------------------------------------------------------------------------- -// -const LogsCntTextList& LogsCntEntry::lastName() const -{ - return mLastName; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::avatarPath() -// ----------------------------------------------------------------------------- -// -const QString& LogsCntEntry::avatarPath() const -{ - return mAvatarPath; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::phoneNumber() -// ----------------------------------------------------------------------------- -// -const LogsCntText& LogsCntEntry::phoneNumber() const -{ - return mPhoneNumber; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::speedDial() -// ----------------------------------------------------------------------------- -// -const QString& LogsCntEntry::speedDial() const -{ - return mSpeedDial; -} - - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::contactId() -// ----------------------------------------------------------------------------- -// -quint32 LogsCntEntry::contactId() const -{ - return mCid; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::handle() -// ----------------------------------------------------------------------------- -// -LogsCntEntryHandle* LogsCntEntry::handle() const -{ - return mHandle; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::setFirstName() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::setFirstName( const QString& name ) -{ - mCached=true; - mFirstName.clear(); - doSetText( name, mFirstName ); -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::setLastName() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::setLastName( const QString& name ) -{ - mCached=true; - mLastName.clear(); - doSetText( name, mLastName ); -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::setAvatarPath() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::setAvatarPath( const QString& avatarpath ) -{ - mCached=true; - mAvatarPath.clear(); - mAvatarPath = avatarpath; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::tokens() -// ----------------------------------------------------------------------------- -// -QStringList LogsCntEntry::tokens( const QString& source, - const QChar& separ ) const -{ - QStringList target = source.split( separ, QString::SkipEmptyParts ); - return target; - -} - - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::doSetText() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::doSetText( const QString& text, LogsCntTextList& textlist ) -{ - QListIterator iter( tokens( text ) ); - - while( iter.hasNext() ) { - LogsCntText txt; - txt.mText = iter.next(); - txt.mTranslatedText = - LogsPredictiveTranslator::instance()->translate( txt.mText ); - textlist.append( txt ); - } - if ( textlist.count() == 0 ) { - textlist.append( LogsCntText() ); - } -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::setPhoneNumber() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::setPhoneNumber( const QString& number ) -{ - mCached=true; - mPhoneNumber.mText = number; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::resetHighlights() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::resetHighlights( LogsCntTextList& nameArray ) -{ - QMutableListIterator names( nameArray ); - while( names.hasNext() ) { - names.next().mHighlights = 0; - } - -} - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::setHighlights() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::setHighlights( const QString& pattern ) -{ - resetHighlights( mFirstName ); - resetHighlights( mLastName ); - - mPhoneNumber.mHighlights = - mPhoneNumber.text().startsWith( pattern ) && - mPhoneNumber.text().length() >= pattern.length() ? - pattern.length(): 0; - - doSetHighlights( pattern, mFirstName ); - doSetHighlights( pattern, mLastName ); - -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::doSetHighlights() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::doSetHighlights( const QString& pattern, - LogsCntTextList& nameArray ) -{ - const QChar zeroSepar('0'); - - LogsPredictiveTranslator* translator = - LogsPredictiveTranslator::instance(); - QMutableListIterator names( nameArray ); - - //simple - while( names.hasNext() ) { - LogsCntText& nameItem = names.next(); - nameItem.mHighlights = translator->startsWith( nameItem.mText, pattern, false ); - } - - //complex - QStringList tokenArray = tokens( pattern, zeroSepar ); - QListIterator patternArray( tokenArray ); - while( tokenArray.count() > 1 && patternArray.hasNext() ) { - QString patternItem = patternArray.next(); - names.toFront(); - while( names.hasNext() ) { - LogsCntText& nameItem = names.next(); - int matchSize = translator->startsWith( nameItem.mText, patternItem ); - nameItem.mHighlights = matchSize > nameItem.mHighlights ? - matchSize : nameItem.mHighlights; - } - } -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::setSpeedDial() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::setSpeedDial( const QString& number ) -{ - mSpeedDial = number; -} - - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::match() -// ----------------------------------------------------------------------------- -// -bool LogsCntEntry::match( const QString& pattern ) const -{ - const QChar zeroSepar('0'); - bool match = false; - - //direct match with phone number is enough - match = mPhoneNumber.text().startsWith( pattern ) || - doSimpleMatch( pattern ); - - if (!match ) { - QStringList patternArray = tokens( pattern, zeroSepar ); - match = patternArray.count() > 1 && - doComplexMatch( patternArray ); - } - - return match; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::doSimpleMatch() -// ----------------------------------------------------------------------------- -// -bool LogsCntEntry::doSimpleMatch( const QString& pattern ) const -{ - LogsCntTextList nameArray = mFirstName + mLastName; //with empties - QListIterator names( nameArray ); - int matchCount = 0; - - while( names.hasNext() && !matchCount ) { - matchCount = (int)names.next().mTranslatedText.startsWith( pattern ); - } - - return matchCount > 0; -} - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::doComplexMatch() -// ----------------------------------------------------------------------------- -// -bool LogsCntEntry::doComplexMatch( QStringList patternArray ) const -{ - const QChar zeroSepar('0'); - const bool zero = false; - - LogsCntTextList nameArray = mFirstName + mLastName; //with empties - - int targetMatchCount = patternArray.count(); - int namesCount = nameArray.count(); - - //if pattern has more tokens than name(s), it is a missmatch - if ( namesCount < targetMatchCount ) { - return false; - } - - QListIterator names( nameArray ); - QListIterator patterns( patternArray ); - QVector matchVector(targetMatchCount, zero ); - int currentPattern = 0; - int matchCount = 0; - bool match = false; - - while( names.hasNext() && matchCount < targetMatchCount ) { - LogsCntText name = names.next(); - currentPattern = 0; - patterns.toFront(); - match = false; - while ( !name.mText.isEmpty() && - patterns.hasNext() && !match ) { - QString pattern = patterns.next(); - //unique match check - if ( !matchVector.at( currentPattern ) ) { - match = matchVector[ currentPattern ] - = name.mTranslatedText.startsWith( pattern ); - matchCount = match ? matchCount+1 : matchCount; - } - currentPattern++; - } - } - return matchCount >= targetMatchCount; - - } - - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::isCached() -// ----------------------------------------------------------------------------- -// -bool LogsCntEntry::isCached() const -{ - return mCached; -} - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::type() -// ----------------------------------------------------------------------------- -// -LogsCntEntry::EntryType LogsCntEntry::type() const -{ - return mType; -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::LogsCntFinder() -// ----------------------------------------------------------------------------- -// -LogsCntFinder::LogsCntFinder() - : mCachedCounter(0) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::LogsCntFinder()" ) - - // Create manager ourselves, object takes care of deletion when registering - // as parent. - QMap dummyParams; - mContactManager = new QContactManager("symbian", dummyParams, this); - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::LogsCntFinder()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::LogsCntFinder() -// ----------------------------------------------------------------------------- -// -LogsCntFinder::LogsCntFinder(QContactManager& contactManager) - : mCachedCounter(0) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::LogsCntFinder(), cntmgr from client" ) - - mContactManager = &contactManager; - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::LogsCntFinder()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::~LogsCntFinder() -// ----------------------------------------------------------------------------- -// -LogsCntFinder::~LogsCntFinder() -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::~LogsCntFinder()" ) - - qDeleteAll( mResults ); - qDeleteAll( mHistoryEvents ); - LogsPredictiveTranslator::deleteInstance(); - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::~LogsCntFinder()" ) -} - - -// ----------------------------------------------------------------------------- -// LogsCntFinder::predictiveSearchQuery -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::predictiveSearchQuery( const QString& pattern ) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::predictiveSearchQuery()" ) - LOGS_QDEBUG_2( "logs [FINDER] pattern= ", 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 ) - - 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( recentResults ); - qDeleteAll( recentResults ); - } - emit queryReady(); - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::predictiveSearchQuery()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::doPredictiveHistoryQuery -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::doPredictiveHistoryQuery() -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::doPredictiveHistoryQuery()" ) - - QListIterator iter(mHistoryEvents); - - while( iter.hasNext() ) { - LogsCntEntry* e = iter.next(); - if ( e->match( mCurrentPredictivePattern ) ) { - LogsCntEntry* entry = new LogsCntEntry( *e ); - addResult( entry ); - } - } - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::doPredictiveHistoryQuery()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::doPredictiveContactQuery -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::doPredictiveContactQuery( LogsCntEntryList& recentResults ) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::doPredictiveContactQuery()" ) - QContactDetailFilter df; - df.setDetailDefinitionName( QContactName::DefinitionName ); - df.setMatchFlags( QContactFilter::MatchKeypadCollation ); - df.setValue( mCurrentPredictivePattern ); - QList cntIds; - LOGS_QDEBUG( "logs [FINDER] about to call contacts manager" ) - - cntIds = mContactManager->contactIds( df ); - LOGS_QDEBUG_2( "logs [FINDER] number of matched contacts =", cntIds.count() ) - int index = 0; - while( index < cntIds.count() ) { - 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 -// ----------------------------------------------------------------------------- -// -int LogsCntFinder::resultsCount() const -{ - return mResults.count(); -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::resultAt -// ----------------------------------------------------------------------------- -// -const LogsCntEntry& LogsCntFinder::resultAt( int index ) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::resultAt()" ) - LOGS_QDEBUG_2( "logs [FINDER] index=", index ) - - 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 = - contact.detail( QContactPhoneNumber::DefinitionName ); - entry->setPhoneNumber( - contactPhoneNumber.value( QContactPhoneNumber::FieldNumber ) ); - QContactAvatar contactAvatar = contact.detail(); - if (contactAvatar.subType().compare( - QLatin1String(QContactAvatar::SubTypeImage)) == 0 && - !contactAvatar.avatar().isEmpty()) { - entry->setAvatarPath(contactAvatar.avatar()); - } - - updateResult( entry ); - } - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::resultAt()" ) - return *entry; -} - - -// ----------------------------------------------------------------------------- -// LogsCntFinder::insertEntry -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::insertEntry( int index, LogsCntEntry* entry ) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::insertEntry()" ) - LOGS_QDEBUG_4( "logs [FINDER] handle=", entry->handle()," to index ", index ) - - mHistoryEvents.insert( index, entry ); - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::insertEntry()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::getEntry -// ----------------------------------------------------------------------------- -// -LogsCntEntry* LogsCntFinder::getEntry( const LogsCntEntryHandle& handle ) const -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::getEntry()" ) - return doGetEntry( mHistoryEvents, handle ); -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::doGetEntry -// ----------------------------------------------------------------------------- -// -LogsCntEntry* LogsCntFinder::doGetEntry( const LogsCntEntryList& list, - const LogsCntEntryHandle& handle ) const -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::doGetEntry()" ) - LOGS_QDEBUG_2( "logs [FINDER] handle= ", &handle ) - - LogsCntEntry* entry = 0; - QListIterator iter(list); - - while( iter.hasNext() && !entry ) { - LogsCntEntry* e = iter.next(); - entry = e->handle() == &handle ? e : 0; - } - - LOGS_QDEBUG_2( "logs [FINDER] found=", (entry!=0) ) - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::doGetEntry()" ) - return entry; -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::deleteEntry -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::deleteEntry( const LogsCntEntryHandle& handle ) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::deleteEntry()" ) - LOGS_QDEBUG_2( "logs [FINDER] handle= ", &handle ) - - LogsCntEntry* toRemoveHistoryEv = doGetEntry( mHistoryEvents, handle ); - mHistoryEvents.removeOne( toRemoveHistoryEv ); - delete toRemoveHistoryEv; - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::deleteEntry()" ) - -} - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/src/logspredictivetranslator.cpp --- a/logsui/logscntfinder/src/logspredictivetranslator.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +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 -#include - -#include "logspredictivetranslator.h" -#include "logslogger.h" - -LogsPredictiveTranslator* LogsPredictiveTranslator::mInstance = 0; - - -// ----------------------------------------------------------------------------- -// LogsPredictiveTranslator::instance() -// ----------------------------------------------------------------------------- -// -LogsPredictiveTranslator* LogsPredictiveTranslator::instance() -{ - if ( !mInstance ) { - mInstance = new LogsPredictiveTranslator(); - } - return mInstance; -} - -// ----------------------------------------------------------------------------- -// LogsPredictiveTranslator::deleteInstance() -// ----------------------------------------------------------------------------- -// -void LogsPredictiveTranslator::deleteInstance() -{ - delete mInstance; - mInstance = 0; -} - - -// ----------------------------------------------------------------------------- -// LogsPredictiveTranslator::LogsPredictiveTranslator() -// ----------------------------------------------------------------------------- -// -LogsPredictiveTranslator::LogsPredictiveTranslator() -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::\ -LogsPredictiveTranslator()" ) - HbInputLanguage lang = - HbInputSettingProxy::instance()->globalInputLanguage(); - mKeyMap = HbKeymapFactory::instance()->keymap( lang.language(), - lang.variant() ); - - LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\ -LogsPredictiveTranslator()" ) -} - - -// ----------------------------------------------------------------------------- -// LogsPredictiveTranslator::~LogsPredictiveTranslator() -// ----------------------------------------------------------------------------- -// -LogsPredictiveTranslator::~LogsPredictiveTranslator() -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::\ -~LogsPredictiveTranslator()" ) - mInstance = 0; - LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\ -~LogsPredictiveTranslator()" ) - -} - -// ----------------------------------------------------------------------------- -// LogsPredictiveTranslator::translate() -// ----------------------------------------------------------------------------- -// -const QChar LogsPredictiveTranslator::translate( const QChar character ) const -{ - 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; -} - - -// ----------------------------------------------------------------------------- -// LogsPredictiveTranslator::translate() -// ----------------------------------------------------------------------------- -// -const QString LogsPredictiveTranslator::translate( const QString& name, - int count ) const -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::translate()" ) - LOGS_QDEBUG_2( "logs [FINDER] name ", name ); - - count = count == -1 ? name.length() : count; - QString result; - const QChar* content = name.data(); - int index = 0; - while( index < name.length() && index < count ) { - result.insert( index++, translate( *content++ ) ); - } - - LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::translate()" ) - return result; -} - -// ----------------------------------------------------------------------------- -// LogsPredictiveTranslator::startsWith() -// ----------------------------------------------------------------------------- -// -int LogsPredictiveTranslator::startsWith( const QString& text, - const QString& pattern, - bool optimize ) const -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::startsWith()" ) - //assumed that text has found based on pattern, thus only checking with - //first char is enough, if mightContainZeroes eq false - int matchCount = pattern.length(); - if ( text.isEmpty() || matchCount > text.length() ) { - matchCount = 0; - } else { - if ( !optimize ) { - QString translatedText = translate( text, pattern.length() ); - matchCount = translatedText == pattern ? matchCount : 0; - } else { - matchCount = translate( *text.data() ) == *pattern.data() ? - matchCount : 0; - } - } - - LOGS_QDEBUG_2( "logs [FINDER] matchCount=", matchCount ) - LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::startsWith()" ) - return matchCount; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfmainwindow.h --- a/logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfmainwindow.h Fri Apr 16 14:53:18 2010 +0300 +++ /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: -* -*/ -#ifndef LCFMAINWINDOW_H -#define LCFMAINWINDOW_H - - -#include -#include - - -class LcfMainWindow : public HbMainWindow - { - Q_OBJECT - -public: - - LcfMainWindow(); - virtual ~LcfMainWindow(); - -protected: // From HbMainWindow - - void keyPressEvent( QKeyEvent *event ); - -signals: - - void callKeyPressed(); - - - }; - - -#endif //LCFMAINWINDOW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfmodel.h --- a/logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +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: -* -*/ - -#ifndef LCFMODEL_H -#define LCFMODEL_H - -#include - -class LogsCntFinder; - -/** - * - */ -class LcfModel : public QAbstractListModel -{ - Q_OBJECT - -public: - - -public: - - LcfModel( LogsCntFinder& finder ); - ~LcfModel(); - -public: // From QAbstractItemModel - - virtual int rowCount(const QModelIndex &parent) const; - virtual QVariant data(const QModelIndex &index, int role) const; - -public: // - - void reset( bool enabled ) {mEnabled=enabled;} - -private: //data - - LogsCntFinder& mFinder; - bool mEnabled; - -}; - -#endif //LCFMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfsearchresultsview.h --- a/logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfsearchresultsview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +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: -* -*/ -#ifndef LCFSEARCHRESULTSVIEW_H -#define LCFSEARCHRESULTSVIEW_H - -#include -#include -#include "logslogger.h" - -class LcfModel; -class HbListView; -class HbTextEdit; -class HbAction; -class LcfViewLoader; -class LogsCntFinder; - -const char lcfviewname[] = "logs_dialer_view"; - - -/** - * - */ -class LcfSearchResultsView : public HbView -{ - Q_OBJECT - -public: - explicit LcfSearchResultsView(); - ~LcfSearchResultsView(); - void init( LcfViewLoader& loader ); - -public slots: - - void callKeyPressed(); - -private slots: - - void closeView(); - void queryReady(); - -private: - - void initListWidget(); - void clearSoftKey(); - -private: - - HbListView* mListView;//not owned - QString mInput; - LcfModel* mModel; //owned - LogsCntFinder* mFinder; - HbAction* mSoftKeyBackAction; - -}; - - -class LcfViewLoader : public HbDocumentLoader -{ -public: - - LcfViewLoader() {} - inline QObject *createObject(const QString& type, const QString &name) - { - LOGS_QDEBUG( "logs [LCFPROTO] LcfViewLoader::createObject <->" ) - LOGS_QDEBUG_2( "logs [LCFPROTO] ", name ) - - if ( name == lcfviewname ) { - return new LcfSearchResultsView(); - } else { - return HbDocumentLoader::createObject( type, name ); - } - } -}; - - -#endif // LCFSEARCHRESULTSVIEW_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.pkg --- a/logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.pkg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -; lcfprotoui_template.pkg generated by qmake at 2009-12-01T10:45:50 -; This file is generated by qmake and should not be modified by the user -; - -; Language -&EN - -; SIS header: name, uid, version -#{"lcfprotoui"},(0x101F4CD6),1,0,0 - -; Localised Vendor name -%{"Vendor"} - -; Unique Vendor name -:"Vendor" - -; Manual PKG pre-rules from PRO files -; Default HW/platform dependencies -[0x101F7961],0,0,0,{"S60ProductID"} -[0x102032BE],0,0,0,{"S60ProductID"} -[0x102752AE],0,0,0,{"S60ProductID"} -[0x1028315F],0,0,0,{"S60ProductID"} - -; Default dependency to Qt libraries -;(0x2001E61C), , , , {"Qt"} - -; Executable and default resource files -"/epoc32/release/armv5/urel/lcfprotoui.exe" - "!:\sys\bin\lcfprotoui.exe" -"/epoc32/data/z/resource/apps/lcfprotoui.rsc" - "!:\resource\apps\lcfprotoui.rsc" -"/epoc32/data/z/private/10003a3f/import/apps/lcfprotoui_reg.rsc" - "!:\private\10003a3f\import\apps\lcfprotoui_reg.rsc" - -; Manual PKG post-rules from PRO files -;"/epoc32/release/armv5/udeb/logscntfinder.dll" - "!:\sys\bin\logscntfinder.dll" diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.pro --- a/logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +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: -# -# - -TEMPLATE = app -TARGET = lcfprotoui -CONFIG += hb -RESOURCES += lcfprotoui.qrc - -INCLUDEPATH += ./ -INCLUDEPATH += ./inc -INCLUDEPATH += ../../inc -INCLUDEPATH += ../../../inc - -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - -# Input -HEADERS += inc/lcfmainwindow.h -HEADERS += inc/lcfsearchresultsview.h -HEADERS += inc/lcfmodel.h - -SOURCES += src/main.cpp -SOURCES += src/lcfmainwindow.cpp -SOURCES += src/lcfsearchresultsview.cpp -SOURCES += src/lcfmodel.cpp - - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0x101F4CD6 - TARGET.CAPABILITY = CAP_APPLICATION - LIBS += -llogscntfinder - -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.qrc --- a/logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.qrc Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ - - - resources/lcfSearchResultsView.xml - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/resources/lcfsearchResultsView.xml --- a/logsui/logscntfinder/tsrc/lcfprotoui/resources/lcfsearchResultsView.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/src/lcfmainwindow.cpp --- a/logsui/logscntfinder/tsrc/lcfprotoui/src/lcfmainwindow.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +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 "lcfmainwindow.h" -#include "logslogger.h" -#include - - -// ----------------------------------------------------------------------------- -// MainWindow::MainWindow -// ----------------------------------------------------------------------------- -// -LcfMainWindow::LcfMainWindow() - : HbMainWindow() -{ - -} - -// ----------------------------------------------------------------------------- -// LcfMainWindow::~LcfMainWindow -// ----------------------------------------------------------------------------- -// -LcfMainWindow::~LcfMainWindow() -{ - -} - -// ----------------------------------------------------------------------------- -// LcfMainWindow::keyPressEvent -// ----------------------------------------------------------------------------- -// -void LcfMainWindow::keyPressEvent( QKeyEvent *event ) -{ - LOGS_QDEBUG_2( "LcfMainWindow::keyPressEvent, key", event->key() ); - if ( event->key() == Qt::Key_Call || event->key() == Qt::Key_Yes ) { - // Handling at window level seems to be only way to avoid other - // applications to handle call key as well. - emit callKeyPressed(); - event->accept(); - return; - } - HbMainWindow::keyPressEvent(event); -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/src/lcfmodel.cpp --- a/logsui/logscntfinder/tsrc/lcfprotoui/src/lcfmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +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 "lcfmodel.h" -#include "logslogger.h" -#include "logscntfinder.h" -#include - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LcfModel::LcfModel(LogsCntFinder& finder ) - : QAbstractListModel(), - mFinder( finder ), - mEnabled( true ) -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> LcfModel::LcfModel()" ) - LOGS_QDEBUG( "logs [LCFPROTO] <- LcfModel::LcfModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LcfModel::~LcfModel() -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> LcfModel::~LcfModel()" ) - LOGS_QDEBUG( "logs [LCFPROTO] <- LcfModel::~LcfModel()" ) -} - - -// ----------------------------------------------------------------------------- -// From QAbstractListModel -// ----------------------------------------------------------------------------- -// -int LcfModel::rowCount(const QModelIndex & /* parent */) const -{ - if (!mEnabled) { - return 0; - } - int count = mFinder.resultsCount(); - LOGS_QDEBUG_2( "logs [LCFPROTO] <-> rowCount()=", count ) - return count; -} - - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -QVariant LcfModel::data(const QModelIndex &index, int role ) const -{ - LOGS_QDEBUG_2( "logs [LCFPROTO] <-> row()=", index.row() ) - const QChar separ( ' '); - - if (!mEnabled) { - return QVariant(); - } - - int resultCount = mFinder.resultsCount(); - if (!index.isValid() || - index.row() >= resultCount || - index.row() < 0 ) { - return QVariant(); - } - if (role == Qt::DisplayRole ){ - const LogsCntEntry& result = mFinder.resultAt( index.row() ); - QStringList name; - for( int i=0;i -#include -#include -#include -#include -#include -#include -#include -#include - - -void LcfSearchResultsView::init( LcfViewLoader& loader ) -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> LcfSearchResultsView::init()" ); - - mListView = qobject_cast( loader.findWidget( "logs_list_view" ) ); - mListView->setItemRecycling(true); - - HbPushButton *buttons[11]; - for (int i = 0; i < 11; ++i) { - QString text = QString::number(i); - QString buttonString("pushButton_"); - buttonString.append(text); - buttons[i] = static_cast(loader.findWidget(buttonString)); - QObject::connect(buttons[i], SIGNAL(clicked()), this, SLOT(callKeyPressed())); - } - - mListView->listItemPrototype()->setTextFormat( Qt::RichText ); - - LOGS_QDEBUG( "logs [LCFPROTO] <- LcfSearchResultsView::init()" ); - -} - -// ----------------------------------------------------------------------------- -// LcfSearchResultsView::LcfSearchResultsView -// ----------------------------------------------------------------------------- -// -LcfSearchResultsView::LcfSearchResultsView() - : HbView(0), - mModel(0), - mFinder(0) -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> LcfSearchResultsView::LcfSearchResultsView()" ); - mSoftKeyBackAction = new HbAction(Hb::BackAction, this); - connect(mSoftKeyBackAction, SIGNAL(triggered()), this, SLOT(closeView())); - if ( !hbInstance->allMainWindows().isEmpty() ){ - hbInstance->allMainWindows().at(0)->addSoftKeyAction( - Hb::SecondarySoftKey, mSoftKeyBackAction ); - } - - mFinder = new LogsCntFinder(); - mModel = new LcfModel( *mFinder ); - - connect(mFinder, SIGNAL(queryReady()), this, SLOT(queryReady())); - - - LOGS_QDEBUG( "logs [LCFPROTO] <- LcfSearchResultsView::LcfSearchResultsView()" ); -} - - -// ----------------------------------------------------------------------------- -// LcfSearchResultsView::~LcfSearchResultsView -// ----------------------------------------------------------------------------- -// -LcfSearchResultsView::~LcfSearchResultsView() -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> LcfSearchResultsView::~LcfSearchResultsView()" ); - delete mModel; - delete mFinder; - clearSoftKey(); - delete mSoftKeyBackAction; - - LOGS_QDEBUG( "logs [LCFPROTO] <- LcfSearchResultsView::~LcfSearchResultsView()" ); -} - - - -void LcfSearchResultsView::queryReady() -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> LcfSearchResultsView::queryReady()" ); - delete mModel; - mModel = new LcfModel( *mFinder ); - mModel->reset( !mInput.isEmpty() ); - mListView->setModel( mModel ); - - mListView->reset(); - LOGS_QDEBUG( "logs [LCFPROTO] <- LcfSearchResultsView::queryReady()" ); -} - - -// ----------------------------------------------------------------------------- -// LcfSearchResultsView::callKeyPressed -// ----------------------------------------------------------------------------- -// -void LcfSearchResultsView::callKeyPressed() -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> LcfSearchResultsView::callKeyPressed()" ); - HbPushButton* button = (HbPushButton *)sender(); - - if ( button->text() == QString("C") ) { - mInput.clear(); - mModel->reset( false ); - } else { - mInput += button->text(); - mModel->reset( true ); - } - setTitle( mInput ); - mFinder->predictiveSearchQuery( mInput ); - - LOGS_QDEBUG( "logs [LCFPROTO] <- LcfSearchResultsView::callKeyPressed()" ); -} - - -// ----------------------------------------------------------------------------- -// LcfSearchResultsView::closeView -// ----------------------------------------------------------------------------- -// -void LcfSearchResultsView::closeView() -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> LcfSearchResultsView::closeView()" ); - qApp->quit(); - LOGS_QDEBUG( "logs [LCFPROTO] <- LcfSearchResultsView::closeView()" ); -} - - -// ----------------------------------------------------------------------------- -// LcfSearchResultsView::clearSoftKey -// ----------------------------------------------------------------------------- -// -void LcfSearchResultsView::clearSoftKey() -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> LcfSearchResultsView::clearSoftKey()" ); - if ( !hbInstance->allMainWindows().isEmpty() ){ - hbInstance->allMainWindows().at(0)->removeSoftKeyAction( - Hb::SecondarySoftKey, mSoftKeyBackAction ); - } - LOGS_QDEBUG( "logs [LCFPROTO] <- LcfSearchResultsView::clearSoftKey()" ); -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/lcfprotoui/src/main.cpp --- a/logsui/logscntfinder/tsrc/lcfprotoui/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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: -* -*/ -//USER -#include "lcfmainwindow.h" -#include "logslogger.h" -#include "lcfsearchresultsview.h" -//SYSTEM -#include -#include -#include - - -int main(int argc, char *argv[]) -{ - LOGS_QDEBUG( "logs [LCFPROTO] -> main()" ) - - HbApplication app(argc, argv); - LcfMainWindow window; - - LOGS_QDEBUG( "logs [LCFPROTO] application created" ) - LcfSearchResultsView* view = 0; - LcfViewLoader loader; - LOGS_QDEBUG( "logs [LCFPROTO] about to load view" ) - bool ok = true; - loader.load( ":/xml/lcfSearchResultsView.xml", &ok); - LOGS_QDEBUG_2( "logs [LCFPROTO] view loaded=", ok ) - int err = 0; - if ( ok ) { - view = qobject_cast ( loader.findWidget( lcfviewname ) ); - //LOGS_QDEBUG_2( "logs [LCFPROTO] view =", view ); - - LOGS_QDEBUG( "logs [LCFPROTO] about to init view" ) - - view->init( loader ); - LOGS_QDEBUG( "logs [LCFPROTO] init view done" ) - - window.addView(view); - - window.show(); - err = app.exec(); - } - - LOGS_QDEBUG( "logs [LCFPROTO] <- main()" ) - return err; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/pt_logscntfinder/RDTest_02.der Binary file logsui/logscntfinder/tsrc/pt_logscntfinder/RDTest_02.der has changed diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/pt_logscntfinder/RDTest_02.key --- a/logsui/logscntfinder/tsrc/pt_logscntfinder/RDTest_02.key Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQC/TDP7KKIaf5+uW4OD2iVZuUMC2a+SeQTjf6srlKcOm+CpPNXn -uLNm/8fdEnyOIuRXPRKmqhs1n0JkxEGHynELWMTuKXbQx9SRAGUXzyneGn+IJNnO -vOKHWgKCouX2hfI8rtkdqJpqmO460gGsMgw+lsbeyWyW9lnfLxq+ZC7sqQIDAQAB -AoGBALmUWZE8GBaQ3P4u9WUCSd3DJkkrmXIFSULSZeH/chlwCwDjbbhArHothVzo -REE3hEFFlERvHbplZ+mNouzy7boduvgUzbksGrbGMLJ2qO1GzWWVwV+GzOWKd3ss -/98Gwoy5R8pjnkqUE2wP1iJFw0FjvUTKcYv/z6t3LLJ0CsoBAkEA+c7ixvsviQ3J -s0INytCKU2bf8fqFQJi1VI82ukxNsujGTQ9upVSjuvqPvWyDvvTdrUBHqO+3qPut -sEh01Q8aiQJBAMQKDJPVRu4ud3mwUfEavzL5EjqwG1k9VCNGYsT4FwtrHcxu1oP/ -pk6M3rIZukqomoEEnHWPMwhrK3fhBqi0OSECQQDr40VXege4FnH5OI2Hj4afHMyp -VdQQXGMWFyopnzXblFz0lXb43cTCIiorR9XcMqNFHybLypkWE5o+lRzlt55pAkBQ -P/zeF5Sts//cpL0mgdh7OVKpC6ZmZaCnwAx2rUhhuDu+kDDoYCLoTOps5fNI1LRK -1GRoC3LMo3Jr5IYhUYWBAkBpCpN6k4JU/mszq98EojHerQNxk8sPqvQKUzTutohT -1gLX9yepGayB/TtT2EEJDkWOlnTy/dvN6W3vzbJYz97x ------END RSA PRIVATE KEY----- diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/pt_logscntfinder/inc/pt_logscntfinder.h --- a/logsui/logscntfinder/tsrc/pt_logscntfinder/inc/pt_logscntfinder.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +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: -* -*/ -#ifndef UT_CNTPREFILTERING_H -#define UT_CNTPREFILTERING_H - -#include -#include - -QTM_USE_NAMESPACE - -class LogsCntFinder; - - -class pt_LogsCntFinder : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testPredictiveQuery(); - void testExtendedQuery(); - void testDiffHitQuery(); - -private: - void createContacts(); - void createContact_one_Contact(QString& firstname, QString& Lastname, QString phnumber); - - QContactFilter::MatchFlags flag(int f); - -private: - - QContactManager *m_manager; - LogsCntFinder *m_finder; -}; - - -#endif //UT_CNTSPREFILTERING_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/pt_logscntfinder/pt_logscntfinder.pro --- a/logsui/logscntfinder/tsrc/pt_logscntfinder/pt_logscntfinder.pro Fri Apr 16 14:53:18 2010 +0300 +++ /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. -# 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 -TARGET = - -QT += testlib xml -CONFIG += qtestlib - -#include(../tsrc.pri) - -DEFINES += PBK_UNIT_TEST -DEPENDPATH += . -INCLUDEPATH += ./ -INCLUDEPATH += ./inc -INCLUDEPATH += ../inc - -#DEPENDPATH += . -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -INCLUDEPATH += ../../ -INCLUDEPATH += ../../inc -INCLUDEPATH += ../../../inc - -# Input - HEADERS += inc\pt_logscntfinder.h - - SOURCES += src\pt_logscntfinder.cpp - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xEfa329b3 - TARGET.CAPABILITY = ALL -TCB - TARGET.EPOCALLOWDLLDATA = 1 - LIBS += \ - -lxqservice \ - -lQtContacts \ - -llogscntfinder -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp --- a/logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,340 +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 "pt_LogsCntFinder.h" -#include "logscntfinder.h" - -#include -#include - - -void pt_LogsCntFinder::initTestCase() -{ -} - -void pt_LogsCntFinder::cleanupTestCase() -{ - -} - - -void pt_LogsCntFinder::init() -{ - qDebug() << "pt_LogsCntFinder::init start"; - m_finder = 0; - //open symbian database - m_manager = new QContactManager("symbian"); - - //qDebug() << "pt_LogsCntFinder::init remove old contacts"; - // Remove all contacts from the database - QList cnt_ids = m_manager->contactIds(); - qDebug() << "contacts now in db" << cnt_ids.count(); - if ( cnt_ids.count() == 600 ) { - QString f("Jack"); - QString l("Whatever"); - createContact_one_Contact( f,l, QString("03432")); - } - - 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->contactIds(); - qDebug() << "contacts now " << cnt_ids.count(); - - QVERIFY(0 == cnt_ids.count()); - - //qDebug() << "pt_LogsCntFinder::createContacts"; - createContacts(); - //qDebug() << "pt_LogsCntFinder::createContacts DONE"; - //qDebug() << "contacts now after create" << cnt_ids.count(); - }*/ - - - m_finder = new LogsCntFinder(); - - qDebug() << "pt_LogsCntFinder::init end"; -} - -void pt_LogsCntFinder::cleanup() -{ - /*m_manager = new QContactManager("symbian"); - QList cnt_ids = m_manager->contactIds(); - m_manager->removeContacts(&cnt_ids); - cnt_ids = m_manager->contactIds(); - qDebug() << "contacts now " << cnt_ids.count(); - - QVERIFY(0 == cnt_ids.count());*/ - delete m_manager; - m_manager = 0; - delete m_finder; - m_finder = 0; -} - - -void pt_LogsCntFinder::createContacts() -{ - //qDebug() << "pt_LogsCntFinder::createContacts"; - QList firstnamelist; - QList Lastnamelist; - firstnamelist<<"Micheal"<<"Evans"<<"Kris"<<"Xiao"<<"Una Vivi"<<"Wilda"<<"Tisha"<<"Queen"<<"Olga"<<"Maria Zola"; - //Lastnamelist<<"Ribecca"<<"Tina"<<"Bob"<<"George"<<"Anna"<<"Yadira"<<"Lennon"<<"Jones"<<"Augustin Zi"<<"Csoma"<<"Baranik"<<"Harhai"; - Lastnamelist<<"Ribecca"<<"Tina"<<"Bob"<<"George"<<"Anna"<<"Yadira"<<"Lennon"<<"Jones"<<"Augustin Zi"<<"Csoma"; - - //for( int z = 0;z<100;z++) { - for( int z = 0;z<5;z++) { - for(int i =0; i < firstnamelist.count(); i++) { - for(int k =0; k < Lastnamelist.count(); k++) { - createContact_one_Contact(firstnamelist[i], Lastnamelist[k], QString("03432")); - } - } - } - - // Empty contact - //QContact empty; - //m_manager->saveContact(&empty); - /* - QList cnt_ids = m_manager->contactIds(); - cnt_ids = m_manager->contactIds(); - int j = cnt_ids.count(); - QVERIFY( j == 900 ); - */ - //qDebug() << "pt_LogsCntFinder::createContacts DONE"; - -} - -void pt_LogsCntFinder::createContact_one_Contact(QString& firstname, QString& Lastname, QString phnumber) -{ - //Currenlty we can only fetch firstname,lastname,companyname and sip/email/phone from the databse - // so create contact with only these details - QContact phonecontact; - // Stefann Fedrernn +02644424423 ste.Fed@nokia.com - // Contact details - QContactName contactName; - contactName.setFirst(firstname); - contactName.setLast(Lastname); - phonecontact.saveDetail(&contactName); - - QContactPhoneNumber number; - number.setContexts("Home"); - number.setSubTypes("Mobile"); - number.setNumber(phnumber); - phonecontact.saveDetail(&number); - - //qDebug() << "pt_LogsCntFinder::createContact_one_Contact about to save.."; - - m_manager->saveContact(&phonecontact); - //qDebug() << "pt_LogsCntFinder::createContact_one_Contact done"; - -} - - -void pt_LogsCntFinder::testPredictiveQuery() -{ - const int rowsInDisplay = 10; - qDebug() << "=>pt_LogsCntFinder::testPredictiveQuery"; - - QTime t; - qDebug() << "--- testing query with 5 ---"; - t.start(); - m_finder->predictiveSearchQuery( QString("5") ); - qDebug() << "--- query ends -----"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - qDebug() << " found " << m_finder->resultsCount() << " matches:"; - - int results = m_finder->resultsCount(); - - qDebug() << "-- list 10 matched records start --"; - for( int i=0;(i < rowsInDisplay && i < results);i++) { - QTime t1; - t1.start(); - const LogsCntEntry& data = m_finder->resultAt( i ); - //qDebug() << "First Name: "; - for (int j = 0; j < data.firstName().length(); j++) { - //qDebug() << data.firstName().at(j).text(); - } - //qDebug() << "Last Name: "; - for (int k = 0; k < data.lastName().length(); k++) { - //qDebug() << data.lastName().at(k).text(); - } - //qDebug() << "Phone number: " << data.phoneNumber().text(); - - qDebug() << "fetched one contact"; - qDebug(" Time elapsed:%d ms", t1.elapsed()); - } - qDebug() << "-- list 10 matched records end --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - - qDebug() << "<=pt_LogsCntFinder::testPredictiveQuery"; - - } - - - - -void pt_LogsCntFinder::testExtendedQuery() -{ - qDebug() << "=>pt_LogsCntFinder::testExtendedQuery"; - - QTime t; - - qDebug() << "-- first 5 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("5") ); - qDebug() << "-- first 5 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - int results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "-- second 5 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("5") ); - qDebug() << "-- second 5 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "-- 52 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("52") ); - qDebug() << "-- 52 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "-- 522 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("522") ); - qDebug() << "-- 522 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "-- 5220 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("5220") ); - qDebug() << "-- 5220 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "-- 52205 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("52205") ); - qDebug() << "-- 52205 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - 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"; - - } - -void pt_LogsCntFinder::testDiffHitQuery() -{ - qDebug() << "=>pt_LogsCntFinder::testDiffHitQuery"; - - QTime t; - - qDebug() << "-- 1 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("1") ); - qDebug() << "-- 1 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - int results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "-- 2 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("2") ); - qDebug() << "-- 2 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "-- 3 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("3") ); - qDebug() << "-- 3 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "-- 6 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("6") ); - qDebug() << "-- 6 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "-- 7 query starts --"; - t.start(); - m_finder->predictiveSearchQuery( QString("7") ); - qDebug() << "-- 7 query ended --"; - qDebug(" Time elapsed:%d ms", t.elapsed()); - results = m_finder->resultsCount(); - qDebug() << "found " << results << " matches:"; - - qDebug() << "<=pt_LogsCntFinder::testDiffHitQuery"; - - -} - - -//QTEST_MAIN(pt_LogsCntFinder); // on Emulator - -int main(int argc, char *argv[]) //on HW -{ - QApplication app(argc, argv); - - pt_LogsCntFinder pt_logscntfinder; - QString resultFileName = "c:/data/others/pt_logscntfinder.txt"; - QStringList args_logsCntFinder( "pt_logscntfinder"); - args_logsCntFinder << "-o" << resultFileName; - QTest::qExec(&pt_logscntfinder, args_logsCntFinder); - return 0; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/st_logscntfinder/inc/st_logscntfinder.h --- a/logsui/logscntfinder/tsrc/st_logscntfinder/inc/st_logscntfinder.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +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: -* -*/ -#ifndef ST_LOGSCNTFINDER_H -#define ST_LOGSCNTFINDER_H - -#include -#include - -QTM_USE_NAMESPACE - -class LogsCntFinder; - - -class st_LogsCntFinder : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - 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 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); - -private: - QContactManager *m_manager; - LogsCntFinder *m_finder; -}; - - -#endif // ST_LOGSCNTFINDER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp --- a/logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,406 +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 "st_logscntfinder.h" -#include "logscntfinder.h" -#include "testresultxmlparser.h" - -#include -#include - - -void st_LogsCntFinder::initTestCase() -{ -} - -void st_LogsCntFinder::cleanupTestCase() -{ - -} - - -void st_LogsCntFinder::init() -{ - m_finder = 0; - //open symbian database - m_manager = new QContactManager("symbian"); - m_finder = new LogsCntFinder(*m_manager); - QVERIFY(m_finder); - - // Remove all contacts from the database - QList cnt_ids = m_manager->contactIds(); - qDebug() << "contacts now before deleting" << cnt_ids.count(); - - 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() -{ - delete m_manager; - m_manager = 0; - delete m_finder; - m_finder = 0; -} - -void st_LogsCntFinder::createContacts() -{ - /*Create contacts in Contacts DB for keymap testing - Stefann Yadira - Jonn Ennon - Maria-Zola Jones - Levis Augustin Zi - Nancy Csoma - Olga Baraniktestteste - Petter Harhai - Queen Fesko - Rose Galisin - Sasha Dofzin - Tisha Iatzkovits - Wilda Lazar - Una Vivi Kantsak - */ - 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") ); - - int contactsCount = m_manager->contactIds().count(); - QCOMPARE(contactsCount, 13); - qDebug() << "st_LogsCntFinder::createContacts_testKeymap. created " << contactsCount << " contacts"; - - -} - - -void st_LogsCntFinder::createHistoryEvents() -{ - createLogEvent( QString("Stefann Albert"), QString("Fedrernn"), QString("932472398") ); - createLogEvent( QString("Jonn"), QString("Lennon"), QString("932472398") ); - createLogEvent( QString("Jim-Petter"), QString("Jones"), QString("932472398") ); - -} - -void st_LogsCntFinder::createLogEvent(QString firstname, QString lastname, - QString phnumber) -{ - LogsCntEntryHandle* dummy = 0; - - LogsCntEntry* logEvent = new LogsCntEntry( *dummy, 0 ); - logEvent->setFirstName( firstname ); - logEvent->setLastName( lastname ); - logEvent->setPhoneNumber( phnumber ); - - m_finder->insertEntry(0, logEvent ); - - -} - - -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 - // so create contact with only these details - QContact phonecontact; - // Stefann Fedrernn +02644424423 ste.Fed@nokia.com - // Contact details - QContactName contactName; - contactName.setFirst(firstname); - contactName.setLast(Lastname); - phonecontact.saveDetail(&contactName); - - QContactPhoneNumber number; - number.setContexts("Home"); - number.setSubTypes("Mobile"); - number.setNumber(phnumber); - phonecontact.saveDetail(&number); - - m_manager->saveContact(&phonecontact); - qDebug() << "st_LogsCntFinder::createOneContact done"; -} - - - -// -// Tests -// - -// Test basic predictive search, all records with names starting letters "J, K, L" are matched -void st_LogsCntFinder::testPredictiveSearchQuery() -{ - createContacts(); - - m_finder->predictiveSearchQuery( QString("566") ); - QCOMPARE( m_finder->resultsCount(), 2 ); - - m_finder->predictiveSearchQuery( QString("5") ); - 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; -Press key "3", records with names starting letters "D,E,F" are matched; -Press key "4", records with names starting letters "G,H,I" are matched; -Press key "5", records with names starting letters "J,K,L" are matched; -Press key "6", records with names starting letters "M,O,N" are matched; -Press key "7", records with names starting letters "P,Q,R,S" are matched; -Press key "8", records with names starting letters "T,U,V" are matched; -Press key "9", records with names starting letters "W,X,Y,Z" are matched; -Press key "0", records with names starting letters "space" etc. are matched; -Press key "1", records with names starting letters "-,Ä,Ö" etc. are matched; -*/ -void st_LogsCntFinder::testKeymap() -{ - createContacts(); - const LogsCntEntry* data; - - for (int i = 2; i < 10; i++) - { - m_finder->predictiveSearchQuery( QString::number(i) ); - switch( i ) - { - 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: - QCOMPARE( m_finder->resultsCount(), 3 ); - data = &m_finder->resultAt( 0 ); - QCOMPARE( data->firstName().count(), 1 ); - break; - - case 5: - QCOMPARE( m_finder->resultsCount(), 5 ); - data = &m_finder->resultAt( 0 ); - QCOMPARE( data->firstName().count(), 1 ); - break; - - case 6: - QCOMPARE( m_finder->resultsCount(), 3 ); - data = &m_finder->resultAt( 0 ); - QCOMPARE( data->firstName().count(), 1 ); - break; - - case 7: - QCOMPARE( m_finder->resultsCount(), 5 ); - data = &m_finder->resultAt( 0 ); - QCOMPARE( data->firstName().count(),1 ); - break; - - case 8: - QCOMPARE( m_finder->resultsCount(), 2 ); - data = &m_finder->resultAt( 0 ); - QCOMPARE( data->firstName().count(), 1 ); - break; - - 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() -{ - 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 ); - -} - -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 ); - - 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") ); - - 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); - - for (int i=0; i -#include -#include -#include -#include -#include - -#include -#include - -QTM_USE_NAMESPACE - -class QtMobility::QContactData : public QSharedData -{ -public: - QContactData(): QSharedData() - { - } - - ~QContactData() {} - - QContactId m_id; - -}; - -class QtMobility::QContactDetailPrivate : public QSharedData -{ -public: - QContactDetailPrivate(): QSharedData() - { - } - - ~QContactDetailPrivate() {} -}; - -// ---------------------------------------------------------------------------- -// QContactManager -// ---------------------------------------------------------------------------- -// -QContactManager::QContactManager( - const QString& /*managerName*/, const QMap& /*parameters*/, - QObject* /*parent*/) -{ - -} - -QContactManager::~QContactManager() -{ - -} - -QList QContactManager::contactIds( - const QContactFilter& filter, - const QList& /*sortOrders*/) const -{ - const QContactDetailFilter& df = - static_cast( filter ); - - int digits = df.value().toString().length(); - QList list; - for( int i=0;i<10-digits;i++) { - list.append( 1+i ); - } - return list; -} - -QContact QContactManager::contact( - const QContactLocalId& contactId, - const QStringList& definitionRestrictions ) const -{ - QContact contact; - QContactId id; - id.setLocalId(contactId ); - - contact.setId( id ); - return contact; -} - -// ---------------------------------------------------------------------------- -// QContactDetailFilter -// ---------------------------------------------------------------------------- -// -QContactDetailFilter::QContactDetailFilter() -{ - -} - -void QContactDetailFilter::setDetailDefinitionName( - const QString& /*definition*/, const QString& /*fieldName*/) -{ - -} - - -void QContactDetailFilter::setMatchFlags(QContactFilter::MatchFlags /*flags*/) -{ - -} -void QContactDetailFilter::setValue(const QVariant& /*value*/) -{ -} - -QVariant QContactDetailFilter::value() const -{ - return QVariant(); -} - - -// ---------------------------------------------------------------------------- -// QContact -// ---------------------------------------------------------------------------- -// -QContact::QContact() : d(new QContactData) -{ - -} - -QContact::~QContact() -{ - -} - - -QContact& QContact::operator=(const QContact& other) -{ - -} - -QContactDetail QContact::detail(const QString& definitionId) const -{ - 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){ - QContactAvatar avatar; - avatar.setSubType(QContactAvatar::SubTypeImage); - avatar.setAvatar("c:\\data\\images\\logstest1.jpg"); - QString a( "Avatar" ); - avatar.setValue( QContactAvatar::FieldAvatar, a ); - return avatar; - } - QContactDetail detail; - return detail; -} - - -// ---------------------------------------------------------------------------- -// QContactDetail -// ---------------------------------------------------------------------------- -// -QContactDetail::QContactDetail() -{ - -} -QContactDetail::QContactDetail(const QString& definitionName) : d(new QContactDetailPrivate) -{ - -} -QContactDetail::~QContactDetail() -{ - -} - - -QContactDetail& QContactDetail::operator=(const QContactDetail& other) -{ - -} - -QString QContactDetail::definitionName() const -{ - return QString(""); -} - -bool QContactDetail::isEmpty() const -{ - return false; -} - - -QVariant QContactDetail::variantValue(const QString& key) const -{ - QString val = value(key); - return val; -} - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logscntentry.h --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logscntentry.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +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: -* -*/ -#ifndef UT_LOGSCNTENTRY_H -#define UT_LOGSCNTENTRY_H - -#include - -class LogsCntEntry; - -class UT_LogsCntEntry : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testSetName(); - void testSetHighlights(); - void testSetAvatarPath(); - void testRichText(); - void testSetPhoneNumber(); - void testSetSpeedDial(); - void testMatch(); - - -private: - - LogsCntEntry* mEntry; -}; - - -#endif //UT_LOGSCNTENTRY_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logscntfinder.h --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logscntfinder.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSCNTFINDER_H -#define UT_LOGSCNTFINDER_H - -#include - -class LogsCntFinder; - -class UT_LogsCntFinder : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testPredictiveSearchQuery(); - void testResultAt(); - void testInsertEntry(); - void testDeleteEntry(); - void testGetEntry(); - -private: - - LogsCntFinder* mFinder; -}; - - -#endif //UT_LOGSCNTFINDER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logspredictivetranslator.h --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logspredictivetranslator.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +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: -* -*/ -#ifndef UT_LOGSPREDICTIVETRANSLATOR_H -#define UT_LOGSPREDICTIVETRANSLATOR_H - -#include - -class LogsPredictiveTranslator; - -class UT_LogsPredictiveTranslator : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testTranslate(); - void testTranslateChar(); - void testStartsWith(); - -private: - - LogsPredictiveTranslator* mTranslator; -}; - - -#endif //UT_LOGSPREDICTIVETRANSLATOR_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/ut_logscntfinder/src/main.cpp --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +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 "ut_logscntfinder.h" -#include "ut_logspredictivetranslator.h" -#include "ut_logscntentry.h" - -#include "testresultxmlparser.h" - - -int main(int argc, char *argv[]) -{ - bool promptOnExit(true); - bool useQApplication(true); - for (int i=0; i - - -void UT_LogsCntEntry::initTestCase() -{ -} - -void UT_LogsCntEntry::cleanupTestCase() -{ -} - - -void UT_LogsCntEntry::init() -{ - mEntry = new LogsCntEntry( 0 ); -} - -void UT_LogsCntEntry::cleanup() -{ - delete mEntry; - mEntry = 0; - LogsPredictiveTranslator::deleteInstance(); -} - -void UT_LogsCntEntry::testConstructor() -{ - QVERIFY( !mEntry->isCached() ); - QVERIFY( mEntry->contactId() == 0 ); - QVERIFY( mEntry->type() == LogsCntEntry::EntryTypeContact ); - QVERIFY( mEntry->firstName()[0].text() == QString("") ); - QVERIFY( mEntry->lastName()[0].text() == QString("") ); - QVERIFY( mEntry->phoneNumber().text() == QString("") ); - QVERIFY( mEntry->avatarPath() == QString("") ); - QVERIFY( mEntry->handle() == 0 ); - QVERIFY( mEntry->speedDial() == QString("") ); - - - mEntry->setFirstName( QString( "foo" )); - mEntry->setLastName( QString( "bar" )); - - LogsCntEntry* e = new LogsCntEntry( *mEntry ); - QVERIFY( e->isCached() ); - QVERIFY( e->contactId() == mEntry->contactId() ); - QVERIFY( e->type() == mEntry->type() ); - QVERIFY( e->firstName()[0].text() == mEntry->firstName()[0].text() ); - QVERIFY( e->lastName()[0].text() == mEntry->lastName()[0].text() ); - QVERIFY( e->phoneNumber().text() == mEntry->phoneNumber().text() ); - QVERIFY( e->mHandle == mEntry->mHandle ); - QVERIFY( e->speedDial() == mEntry->speedDial() ); - - mEntry->setFirstName( QString( "Nokia" )); - QVERIFY( e->firstName()[0].text() != mEntry->firstName()[0].text() ); - - delete e; - e = 0; - - LogsCntEntryHandle* foo = (LogsCntEntryHandle*)1; - e = new LogsCntEntry( *foo, 0 ); - QVERIFY( e->isCached() ); - QVERIFY( e->contactId() == 0 ); - QVERIFY( e->type() == LogsCntEntry::EntryTypeHistory ); - QVERIFY( e->mHandle == foo ); - - delete e; - e = 0; - -} - - -void UT_LogsCntEntry::testSetName() -{ - QString empty(""); - - QVERIFY( !mEntry->isCached() ); - QVERIFY( mEntry->type() == LogsCntEntry::EntryTypeContact ); - - mEntry->setFirstName( QString( "first" ) ); - QVERIFY( mEntry->firstName()[0].text() == QString( "first" ) ); - QVERIFY( !mEntry->firstName()[0].highlights()); - QVERIFY( mEntry->firstName()[0].mTranslatedText == empty ); - - mEntry->setLastName( QString( "last" ) ); - QVERIFY( mEntry->lastName()[0].text() == QString( "last" ) ); - QVERIFY( !mEntry->lastName()[0].highlights()); - QVERIFY( mEntry->lastName()[0].mTranslatedText == empty ); - - mEntry->mType = LogsCntEntry::EntryTypeHistory; - mEntry->setFirstName( QString( "first1" ) ); - QVERIFY( mEntry->firstName()[0].text() == QString( "first1" ) ); - QVERIFY( !mEntry->firstName()[0].highlights()); - QVERIFY( mEntry->firstName()[0].mTranslatedText != empty ); - - mEntry->setLastName( QString( "last1" ) ); - QVERIFY( mEntry->lastName()[0].text() == QString( "last1" ) ); - QVERIFY( !mEntry->lastName()[0].highlights()); - QVERIFY( mEntry->lastName()[0].mTranslatedText != empty ); - - mEntry->setFirstName( QString( "first last" ) ); - QVERIFY( mEntry->firstName().count() == 2 ); - QVERIFY( mEntry->firstName()[0].text() == QString( "first" ) ); - QVERIFY( mEntry->firstName()[1].text() == QString( "last" ) ); - QVERIFY( !mEntry->firstName()[0].highlights() ); - QVERIFY( !mEntry->firstName()[1].highlights() ); - QVERIFY( mEntry->firstName()[0].mTranslatedText != empty ); - QVERIFY( mEntry->firstName()[1].mTranslatedText != empty ); - - mEntry->setFirstName( QString( "" ) ); - QVERIFY( mEntry->firstName()[0].text() == QString("") ); - -} - -void UT_LogsCntEntry::testSetHighlights() -{ - - mEntry->setHighlights( QString( "665" ) ); - QVERIFY( mEntry->firstName()[0].text() == QString("") ); - QVERIFY( mEntry->lastName()[0].text() == QString("") ); - - mEntry->setFirstName( QString( "Nokia" ) ); - mEntry->setLastName( QString( "Test" ) ); - - mEntry->setHighlights( QString( "665" ) ); - QVERIFY( mEntry->firstName()[0].text() == QString( "Nokia" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 3 ); - QVERIFY( mEntry->lastName()[0].text() == QString( "Test" ) ); - QVERIFY( !mEntry->lastName()[0].highlights()); - - mEntry->mType = LogsCntEntry::EntryTypeContact; - mEntry->setFirstName( QString( "Jim" ) ); - mEntry->setLastName( QString( "Johnson" ) ); - - mEntry->setHighlights( QString( "5" ) ); - QVERIFY( mEntry->firstName()[0].text() == QString( "Jim" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1 ); - QVERIFY( mEntry->lastName()[0].text() == QString( "Johnson" ) ); - QVERIFY( mEntry->lastName()[0].highlights() == 1); - - mEntry->setFirstName( QString( "Big Jim" ) ); - mEntry->setLastName( QString( "Johnson" ) ); - - mEntry->setHighlights( QString( "5" ) ); - QVERIFY( mEntry->firstName()[0].text() == QString( "Big" ) ); - QVERIFY( mEntry->firstName()[1].text() == QString( "Jim" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 0 ); - QVERIFY( mEntry->firstName()[1].highlights() == 1 ); - QVERIFY( mEntry->lastName()[0].text() == QString( "Johnson" ) ); - QVERIFY( mEntry->lastName()[0].highlights() == 1); - - mEntry->setFirstName( QString( "John" ) ); - mEntry->setLastName( QString( "Johnson" ) ); - mEntry->setHighlights( QString( "5646" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 4 ); - QVERIFY( mEntry->lastName()[0].highlights() == 4); - - mEntry->setHighlights( QString( "56467" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 0 ); - QVERIFY( mEntry->lastName()[0].highlights() == 5); - - mEntry->setHighlights( QString( "505" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->lastName()[0].highlights() == 1); - - mEntry->setHighlights( QString( "506" ) );//entry is not a match - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->lastName()[0].highlights() == 1);//506 means 5 or 6 in higlighting - - mEntry->setFirstName( QString( "Big Jim Johnson" ) ); - mEntry->setLastName( QString( "" ) ); - - mEntry->setHighlights( QString( "205" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->firstName()[1].highlights() == 1); - QVERIFY( mEntry->firstName()[2].highlights() == 1); - QVERIFY( mEntry->lastName()[0].highlights() == 0); - - mEntry->setHighlights( QString( "20505" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->firstName()[1].highlights() == 1); - QVERIFY( mEntry->firstName()[2].highlights() == 1); - QVERIFY( mEntry->lastName()[0].highlights() == 0); - - mEntry->setHighlights( QString( "50205" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->firstName()[1].highlights() == 1); - QVERIFY( mEntry->firstName()[2].highlights() == 1); - QVERIFY( mEntry->lastName()[0].highlights() == 0); - - mEntry->setHighlights( QString( "50502" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->firstName()[1].highlights() == 1); - QVERIFY( mEntry->firstName()[2].highlights() == 1); - QVERIFY( mEntry->lastName()[0].highlights() == 0); - - mEntry->setFirstName( QString( "Big John" ) ); - mEntry->setLastName( QString( "Johnson" ) ); - - mEntry->setHighlights( QString( "2056" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->firstName()[1].highlights() == 2); - QVERIFY( mEntry->lastName()[0].highlights() == 2); - - mEntry->setHighlights( QString( "5602" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->firstName()[1].highlights() == 2); - QVERIFY( mEntry->lastName()[0].highlights() == 2); - - mEntry->setHighlights( QString( "564602" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->firstName()[1].highlights() == 4); - QVERIFY( mEntry->lastName()[0].highlights() == 4); - - mEntry->setHighlights( QString( "5646702" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->firstName()[1].highlights() == 0); - QVERIFY( mEntry->lastName()[0].highlights() == 5); - - mEntry->setHighlights( QString( "5646" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 0); - QVERIFY( mEntry->firstName()[1].highlights() == 4); - QVERIFY( mEntry->lastName()[0].highlights() == 4); - - mEntry->setFirstName( QString( "John 0John" ) ); - mEntry->setLastName( QString( "Malkovich" ) ); - mEntry->setHighlights( QString( "05" ) ); - - QVERIFY( mEntry->firstName()[0].highlights() == 0); - QVERIFY( mEntry->firstName()[1].highlights() == 2); - QVERIFY( mEntry->lastName()[0].highlights() == 0); - - mEntry->setHighlights( QString( "0506" ) ); - QVERIFY( mEntry->firstName()[0].highlights() == 1); - QVERIFY( mEntry->firstName()[1].highlights() == 0); - QVERIFY( mEntry->lastName()[0].highlights() == 1); - -} - -void UT_LogsCntEntry::testSetPhoneNumber() -{ - mEntry->setPhoneNumber( QString( "1234567" ) ); - QVERIFY( mEntry->phoneNumber().text() == QString( "1234567" ) ); - QVERIFY( mEntry->phoneNumber().mTranslatedText == QString( "" ) ); - QVERIFY( mEntry->phoneNumber().mHighlights == 0 ); - -} - -void UT_LogsCntEntry::testSetSpeedDial() -{ - mEntry->setSpeedDial( QString( "1" ) ); - QVERIFY( mEntry->speedDial() == QString( "1" ) ); - -} - -void UT_LogsCntEntry::testSetAvatarPath() -{ - mEntry->setAvatarPath( QString( "c:\\data\\images\\logstest1.jpg" ) ); - QVERIFY( mEntry->avatarPath() == QString( "c:\\data\\images\\logstest1.jpg" ) ); - -} - -void UT_LogsCntEntry::testRichText() -{ - - mEntry->setFirstName( QString( "John" ) ); - mEntry->setHighlights( QString( "5" ) ); - QVERIFY( mEntry->firstName()[0].richText() == QString( "John" ) ); - QVERIFY( mEntry->firstName()[0].richText( QString(""),QString("") ) - == QString( "John" ) ); - - mEntry->setFirstName( QString( "aaa" ) ); - QVERIFY( mEntry->firstName()[0].richText() == QString( "aaa" ) ); - - mEntry->setFirstName( QString( "" ) ); - QVERIFY( mEntry->firstName()[0].richText() == QString( "" ) ); - - mEntry->setPhoneNumber( QString( "1234567" ) ); - mEntry->setHighlights( QString( "5" ) ); - - QVERIFY( mEntry->phoneNumber().mHighlights == 0 ); - QVERIFY( mEntry->phoneNumber().text() == QString( "1234567" ) ); - QVERIFY( mEntry->phoneNumber().richText() == QString( "1234567" ) ); - - mEntry->setHighlights( QString( "1" ) ); - - QVERIFY( mEntry->phoneNumber().mHighlights == 1 ); - QVERIFY( mEntry->phoneNumber().text() == QString( "1234567" ) ); - QVERIFY( mEntry->phoneNumber().richText() == QString( "1234567" ) ); - -} - -void UT_LogsCntEntry::testMatch() -{ - mEntry->mType = LogsCntEntry::EntryTypeHistory; - - mEntry->setFirstName( QString( "John" ) ); - QVERIFY( mEntry->match( QString( "5" ) ) ); - QVERIFY( !mEntry->match( QString( "6" ) ) ); - - mEntry->setPhoneNumber( QString( "11111111111" ) ); - mEntry->setFirstName( QString( "John" ) ); - mEntry->setLastName( QString( "Malkovich" ) ); - QVERIFY( mEntry->match( QString( "6" ) ) ); - QVERIFY( mEntry->match( QString( "5" ) ) ); - QVERIFY( !mEntry->match( QString( "2" ) ) ); - QVERIFY( mEntry->match( QString( "56" ) ) ); - QVERIFY( !mEntry->match( QString( "566" ) ) ); - - mEntry->setPhoneNumber( QString( "5669876566" ) ); - QVERIFY( mEntry->match( QString( "566" ) ) ); - -// - zero cases - - - mEntry->setPhoneNumber( QString( "20298457698576" ) ); - mEntry->setFirstName( QString( "John" ) ); - mEntry->setLastName( QString( "Malkovich" ) ); - - QVERIFY( mEntry->match( QString( "202" ) ) );//match not John and match not Malkovich match phone - QVERIFY( !mEntry->match( QString( "507" ) ) );//match John and match not Malkovich - QVERIFY( !mEntry->match( QString( "206" ) ) );//match not John and macth Malkovich - QVERIFY( mEntry->match( QString( "506" ) ) );//match John and macth Malkovich - QVERIFY( mEntry->match( QString( "605" ) ) );//match John and macth Malkovich - QVERIFY( !mEntry->match( QString( "505" ) ) );//match John "two times" - QVERIFY( mEntry->match( QString( "60005" ) ) );//match John and match Malkovich - QVERIFY( mEntry->match( QString( "6000500" ) ) );//match John and match Malkovich - - mEntry->setFirstName( QString( "John Malkovich" ) ); - mEntry->setLastName( QString( "" ) ); - - QVERIFY( mEntry->match( QString( "202" ) ) );//match not John and match not Malkovich match phone - QVERIFY( !mEntry->match( QString( "507" ) ) );//match John and match not Malkovich - QVERIFY( !mEntry->match( QString( "206" ) ) );//match not John and macth Malkovich - QVERIFY( mEntry->match( QString( "506" ) ) );//match John and macth Malkovich - QVERIFY( mEntry->match( QString( "605" ) ) );//match John and macth Malkovich - QVERIFY( !mEntry->match( QString( "505" ) ) );//match John "two times" - QVERIFY( mEntry->match( QString( "60005" ) ) );//match John and match Malkovich - QVERIFY( mEntry->match( QString( "6000500" ) ) );//match John and match Malkovich - - mEntry->setFirstName( QString( "" ) ); - mEntry->setLastName( QString( "John Malkovich" ) ); - - QVERIFY( mEntry->match( QString( "202" ) ) );//match not John and match not Malkovich match phone - QVERIFY( !mEntry->match( QString( "507" ) ) );//match John and match not Malkovich - QVERIFY( !mEntry->match( QString( "206" ) ) );//match not John and macth Malkovich - QVERIFY( mEntry->match( QString( "506" ) ) );//match John and macth Malkovich - QVERIFY( mEntry->match( QString( "605" ) ) );//match John and macth Malkovich - QVERIFY( !mEntry->match( QString( "505" ) ) );//match John "two times" - QVERIFY( mEntry->match( QString( "60005" ) ) );//match John and match Malkovich - QVERIFY( mEntry->match( QString( "6000500" ) ) );//match John and match Malkovich - - mEntry->setFirstName( QString( "John Peter" ) ); - mEntry->setLastName( QString( "Malkovich" ) ); - - QVERIFY( mEntry->match( QString( "50607" ) ) );//match John and match Malkovich match Peter - QVERIFY( mEntry->match( QString( "506" ) ) );//match John and macth Malkovich match ignore Peter - QVERIFY( !mEntry->match( QString( "50608" ) ) );//match John and match Malkovich match not Peter - QVERIFY( !mEntry->match( QString( "5060702" ) ) );//match John and match Malkovich match Peter + no match extra - QVERIFY( !mEntry->match( QString( "5060706" ) ) );//match John and match Malkovich match Peter + macth extra - - mEntry->setFirstName( QString( "John Kalkovich" ) ); - mEntry->setLastName( QString( "" ) ); - - QVERIFY( mEntry->match( QString( "505" ) ) );//match John and match Kalkovich - - mEntry->setFirstName( QString( "John John Malkovich" ) ); - mEntry->setLastName( QString( "" ) ); - - QVERIFY( mEntry->match( QString( "50605" ) ) );//match John and match Malkovich and match John - QVERIFY( mEntry->match( QString( "506" ) ) );//match Johns and macth Malkovich - QVERIFY( !mEntry->match( QString( "50608" ) ) );//match John and match Malkovich match not Peter - - mEntry->setFirstName( QString( "John 0John Malkovich" ) ); - mEntry->setLastName( QString( "" ) ); - - QVERIFY( !mEntry->match( QString( "50605" ) ) ); - QVERIFY( !mEntry->match( QString( "505" ) ) ); - QVERIFY( mEntry->match( QString( "5" ) ) ); - QVERIFY( mEntry->match( QString( "0" ) ) ); - QVERIFY( mEntry->match( QString( "05" ) ) ); - - //QVERIFY( mEntry->match( QString( "0505" ) ) ); //not supported - QVERIFY( mEntry->match( QString( "0506" ) ) ); //John and Malkovich not 0Jonh - //QVERIFY( mEntry->match( QString( "050506" ) ) ); //not supported - -} - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logscntfinder.cpp --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logscntfinder.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,369 +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 "ut_logscntfinder.h" -#include "logscntfinder.h" - -#include -#include - - -void UT_LogsCntFinder::initTestCase() -{ -} - -void UT_LogsCntFinder::cleanupTestCase() -{ -} - - -void UT_LogsCntFinder::init() -{ - mFinder = new LogsCntFinder(); -} - -void UT_LogsCntFinder::cleanup() -{ - delete mFinder; - mFinder = 0; -} - -void UT_LogsCntFinder::testConstructor() -{ - QVERIFY( mFinder ); - QVERIFY( mFinder->mCurrentPredictivePattern == "" ); - QVERIFY( mFinder->mResults.count() == 0 ); - QVERIFY( mFinder->mHistoryEvents.count() == 0 ); - QVERIFY( mFinder->mContactManager ); - - LogsCntFinder finder( *mFinder->mContactManager ); - QVERIFY( finder.mCurrentPredictivePattern == "" ); - QVERIFY( finder.mResults.count() == 0 ); - QVERIFY( finder.mHistoryEvents.count() == 0 ); - QVERIFY( finder.mContactManager ); - QVERIFY( finder.mCachedCounter == 0 ); - -} - -void UT_LogsCntFinder::testPredictiveSearchQuery() -{ - QSignalSpy spy(mFinder, SIGNAL(queryReady() ) ); - int resultsCount = 0; - - QString pattern( "23" ); - mFinder->predictiveSearchQuery( pattern ); - QCOMPARE( spy.count(), 1 ); - QVERIFY( mFinder->mCurrentPredictivePattern == pattern ); - resultsCount = mFinder->resultsCount(); - QVERIFY( resultsCount > 0 ); - - mFinder->predictiveSearchQuery( pattern ); - QCOMPARE( spy.count(), 2 ); - QVERIFY( mFinder->mCurrentPredictivePattern == pattern ); - QVERIFY( mFinder->resultsCount() == resultsCount ); - - LogsCntEntry* e = mFinder->mResults[ 0 ]; - pattern = QString(""); - mFinder->predictiveSearchQuery( pattern ); - QCOMPARE( spy.count(), 3 ); - QVERIFY( mFinder->resultsCount() == 0 ); - QVERIFY( mFinder->mCachedCounter == 0 ); - -//--- - - LogsCntEntryHandle* handle1 = (LogsCntEntryHandle*)1; - LogsCntEntryHandle* handle2 = (LogsCntEntryHandle*)2; - LogsCntEntryHandle* handle3 = (LogsCntEntryHandle*)3; - - LogsCntEntry* entry1 = new LogsCntEntry( *handle1,0 ); - QVERIFY( entry1->type() == LogsCntEntry::EntryTypeHistory ); - QVERIFY( entry1->firstName()[0].text() == QString("") ); - QVERIFY( entry1->lastName()[0].text() == QString("") ); - - entry1->setFirstName( QString("Jim Beam") ); - - QVERIFY( entry1->firstName()[0].text() == QString("Jim") ); - QVERIFY( entry1->firstName()[0].mTranslatedText != QString("") ); - QVERIFY( entry1->firstName()[1].text() == QString("Beam") ); - QVERIFY( entry1->firstName()[1].mTranslatedText != QString("") ); - QVERIFY( entry1->lastName()[0].text() == QString("") ); - QVERIFY( entry1->lastName()[0].mTranslatedText == QString("") ); - mFinder->insertEntry( 0, entry1 ); - QVERIFY( mFinder->mHistoryEvents.count() == 1 ); - - LogsCntEntry* entry2 = new LogsCntEntry( *handle2,0 ); - entry2->setFirstName( QString("first1") ); - entry2->setLastName( QString("last1") ); - entry2->setAvatarPath( QString("c:\\data\\images\\logstest1.jpg") ); - mFinder->insertEntry( 0, entry2 ); - QVERIFY( mFinder->mHistoryEvents.count() == 2 ); - - LogsCntEntry* entry3 = new LogsCntEntry( *handle3,0 ); - entry3->setFirstName( QString("Nokia") ); - entry3->setLastName( QString("") ); - mFinder->insertEntry( 0, entry3 ); - QVERIFY( mFinder->mHistoryEvents.count() == 3 ); - - pattern = QString("3"); - mFinder->predictiveSearchQuery( pattern ); - QCOMPARE( spy.count(), 4 ); - QVERIFY( mFinder->resultsCount() > resultsCount ); - QVERIFY( mFinder->resultAt( 0 ).handle() == handle2 ); - QVERIFY( mFinder->resultAt( 0 ).firstName()[0].text() == QString("first1") ); - QVERIFY( mFinder->resultAt( 0 ).lastName()[0].text() == QString("last1") ); - 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() -{ - QVERIFY( mFinder->resultsCount() == 0 ); - QString pattern( "5" ); - mFinder->predictiveSearchQuery( pattern ); - QVERIFY( mFinder->resultsCount() > 0 ); - - const LogsCntEntry& e = mFinder->resultAt( 0 ); - 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 ); - QVERIFY( e.mType == LogsCntEntry::EntryTypeContact ); - QVERIFY( e.isCached() ); - - const LogsCntEntry& f = mFinder->resultAt( 0 ); - QVERIFY( &e == &f ); - - pattern = QString("2"); - mFinder->predictiveSearchQuery( pattern ); - QVERIFY( mFinder->resultsCount() > 0 ); - const LogsCntEntry& g = mFinder->resultAt( 0 ); - -} - -void UT_LogsCntFinder::testInsertEntry() -{ - - LogsCntEntryHandle* handle1 = (LogsCntEntryHandle*)1; - LogsCntEntryHandle* handle2 = (LogsCntEntryHandle*)2; - LogsCntEntryHandle* handle3 = (LogsCntEntryHandle*)3; - - LogsCntEntry* entry1 = new LogsCntEntry( *handle1,0 ); - mFinder->insertEntry( 0, entry1 ); - QVERIFY( mFinder->mHistoryEvents.count() == 1 ); - LogsCntEntry* entry2 = new LogsCntEntry( *handle2,0 ); - mFinder->insertEntry( 0, entry2 ); - QVERIFY( mFinder->mHistoryEvents.count() == 2 ); - LogsCntEntry* entry3 = new LogsCntEntry( *handle3,0 ); - mFinder->insertEntry( 1, entry3 ); - QVERIFY( mFinder->mHistoryEvents.count() == 3 ); - - QVERIFY( mFinder->getEntry( *handle1 ) == entry1 ); - QVERIFY( mFinder->getEntry( *handle2 ) == entry2 ); - QVERIFY( mFinder->getEntry( *handle3 ) == entry3 ); - - -} - -void UT_LogsCntFinder::testDeleteEntry() -{ - - LogsCntEntryHandle* handle1 = (LogsCntEntryHandle*)1; - LogsCntEntryHandle* handle2 = (LogsCntEntryHandle*)2; - LogsCntEntryHandle* handle3 = (LogsCntEntryHandle*)3; - - LogsCntEntry* entry1 = new LogsCntEntry( *handle1,0 ); - mFinder->insertEntry( 0, entry1 ); - LogsCntEntry* entry2 = new LogsCntEntry( *handle2,0 ); - mFinder->insertEntry( 0, entry2 ); - LogsCntEntry* entry3 = new LogsCntEntry( *handle3,0 ); - mFinder->insertEntry( 1, entry3 ); - QVERIFY( mFinder->mHistoryEvents.count() == 3 ); - - mFinder->deleteEntry( *handle1 ); - QVERIFY( mFinder->mHistoryEvents.count() == 2 ); - mFinder->deleteEntry( *handle2 ); - QVERIFY( mFinder->mHistoryEvents.count() == 1 ); - mFinder->deleteEntry( *handle3 ); - QVERIFY( mFinder->mHistoryEvents.count() == 0 ); - - entry1 = new LogsCntEntry( *handle1,0 ); - mFinder->insertEntry( 0, entry1 ); - QVERIFY( mFinder->mHistoryEvents.count() == 1 ); - entry2 = new LogsCntEntry( *entry1 ); - mFinder->mResults.append( entry2 ); - mFinder->deleteEntry( *handle1 ); - QVERIFY( mFinder->mHistoryEvents.count() == 0 ); - QVERIFY( mFinder->mResults.count() == 1 ); - -} - -void UT_LogsCntFinder::testGetEntry() -{ - LogsCntEntryHandle* handle1 = (LogsCntEntryHandle*)1; - - LogsCntEntry* entry1 = new LogsCntEntry( *handle1,0 ); - QVERIFY( entry1->firstName()[0].text() == QString("") ); - QVERIFY( entry1->lastName()[0].text() == QString("") ); - entry1->setFirstName( QString("first") ); - entry1->setLastName( QString("last") ); - QVERIFY( entry1->firstName()[0].text() == QString("first") ); - QVERIFY( entry1->lastName()[0].text() == QString("last") ); - mFinder->insertEntry( 0, entry1 ); - - LogsCntEntry* entry = mFinder->getEntry( *handle1 ); - QVERIFY( entry == entry1 ); - entry->setFirstName( QString("foo") ); - entry->setLastName( QString("bar") ); - - LogsCntEntry* entry3 = mFinder->getEntry( *handle1 ); - QVERIFY( entry3 == entry1 ); - QVERIFY( entry3->firstName()[0].text() == QString("foo") ); - QVERIFY( entry3->lastName()[0].text() == QString("bar") ); - -} - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,173 +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 "ut_logspredictivetranslator.h" -#include "logspredictivetranslator.h" - -#include -#include - - -void UT_LogsPredictiveTranslator::initTestCase() -{ -} - -void UT_LogsPredictiveTranslator::cleanupTestCase() -{ -} - - -void UT_LogsPredictiveTranslator::init() -{ - mTranslator = LogsPredictiveTranslator::instance(); -} - -void UT_LogsPredictiveTranslator::cleanup() -{ - LogsPredictiveTranslator::deleteInstance(); -} - -void UT_LogsPredictiveTranslator::testConstructor() -{ - QVERIFY( mTranslator ); - QVERIFY( mTranslator->mKeyMap ); - -} - -void UT_LogsPredictiveTranslator::testTranslate() -{ - QVERIFY( mTranslator->translate( QString( "Nokia" ) ) == QString( "66542" ) ); - QVERIFY( mTranslator->translate( QString( "Aarne" ) ) == QString( "22763" ) ); - QVERIFY( mTranslator->translate( QString( "Bertta" ) ) == QString( "237882" ) ); - QVERIFY( mTranslator->translate( QString( "Celsius" ) ) == QString( "2357487" ) ); - QVERIFY( mTranslator->translate( QString( "Daavid" ) ) == QString( "322843" ) ); - QVERIFY( mTranslator->translate( QString( "Eemeli" ) ) == QString( "336354" ) ); - QVERIFY( mTranslator->translate( QString( "Faarao" ) ) == QString( "322726" ) ); - QVERIFY( mTranslator->translate( QString( "Gideon" ) ) == QString( "443366" ) ); - QVERIFY( mTranslator->translate( QString( "Heikki" ) ) == QString( "434554" ) ); - QVERIFY( mTranslator->translate( QString( "Iivari" ) ) == QString( "448274" ) ); - QVERIFY( mTranslator->translate( QString( "Jussi" ) ) == QString( "58774" ) ); - QVERIFY( mTranslator->translate( QString( "Kalle" ) ) == QString( "52553" ) ); - QVERIFY( mTranslator->translate( QString( "Lauri" ) ) == QString( "52874" ) ); - QVERIFY( mTranslator->translate( QString( "Matti" ) ) == QString( "62884" ) ); - QVERIFY( mTranslator->translate( QString( "Niilo" ) ) == QString( "64456" ) ); - QVERIFY( mTranslator->translate( QString( "Otto" ) ) == QString( "6886" ) ); - QVERIFY( mTranslator->translate( QString( "Paavo" ) ) == QString( "72286" ) ); - QVERIFY( mTranslator->translate( QString( "Kuu" ) ) == QString( "588" ) ); - QVERIFY( mTranslator->translate( QString( "Risto" ) ) == QString( "74786" ) ); - QVERIFY( mTranslator->translate( QString( "Sakari" ) ) == QString( "725274" ) ); - QVERIFY( mTranslator->translate( QString( "Tyyne" ) ) == QString( "89963" ) ); - QVERIFY( mTranslator->translate( QString( "Urho" ) ) == QString( "8746" ) ); - QVERIFY( mTranslator->translate( QString( "Vihtori" ) ) == QString( "8448674" ) ); - QVERIFY( mTranslator->translate( QString( "Wiski" ) ) == QString( "94754" ) ); - QVERIFY( mTranslator->translate( QString( "Yrjö" ) ) == QString( "9756" ) ); - QVERIFY( mTranslator->translate( QString( "Tseta" ) ) == QString( "87382" ) ); - QVERIFY( mTranslator->translate( QString( "Åke" ) ) == QString( "253" ) ); - QVERIFY( mTranslator->translate( QString( "Äiti" ) ) == QString( "2484" ) ); - QVERIFY( mTranslator->translate( QString( "Öljy" ) ) == QString( "6559" ) ); - QVERIFY( mTranslator->translate( QString( "Adam" ) ) == QString( "2326" ) ); - QVERIFY( mTranslator->translate( QString( "Bertil" ) ) == QString( "237845" ) ); - QVERIFY( mTranslator->translate( QString( "Cesar" ) ) == QString( "23727" ) ); - QVERIFY( mTranslator->translate( QString( "David" ) ) == QString( "32843" ) ); - QVERIFY( mTranslator->translate( QString( "Erik" ) ) == QString( "3745" ) ); - QVERIFY( mTranslator->translate( QString( "Filip" ) ) == QString( "34547" ) ); - QVERIFY( mTranslator->translate( QString( "Gustav" ) ) == QString( "487828" ) ); - QVERIFY( mTranslator->translate( QString( "Helge" ) ) == QString( "43543" ) ); - QVERIFY( mTranslator->translate( QString( "Ivar" ) ) == QString( "4827" ) ); - QVERIFY( mTranslator->translate( QString( "Johan" ) ) == QString( "56426" ) ); - QVERIFY( mTranslator->translate( QString( "Kalle" ) ) == QString( "52553" ) ); - QVERIFY( mTranslator->translate( QString( "Ludvig" ) ) == QString( "583844" ) ); - QVERIFY( mTranslator->translate( QString( "Martin" ) ) == QString( "627846" ) ); - QVERIFY( mTranslator->translate( QString( "Niklas" ) ) == QString( "645527" ) ); - QVERIFY( mTranslator->translate( QString( "Olof" ) ) == QString( "6563" ) ); - QVERIFY( mTranslator->translate( QString( "Petter" ) ) == QString( "738837" ) ); - QVERIFY( mTranslator->translate( QString( "Quintus" ) ) == QString( "7846887" ) ); - QVERIFY( mTranslator->translate( QString( "Rudolf" ) ) == QString( "783653" ) ); - QVERIFY( mTranslator->translate( QString( "Sigurd" ) ) == QString( "744873" ) ); - QVERIFY( mTranslator->translate( QString( "Tore" ) ) == QString( "8673" ) ); - QVERIFY( mTranslator->translate( QString( "Urban" ) ) == QString( "87226" ) ); - QVERIFY( mTranslator->translate( QString( "Viktor" ) ) == QString( "845867" ) ); - QVERIFY( mTranslator->translate( QString( "Wilhelm" ) ) == QString( "9454356" ) ); - QVERIFY( mTranslator->translate( QString( "Xerxes" ) ) == QString( "937937" ) ); - QVERIFY( mTranslator->translate( QString( "Yngve" ) ) == QString( "96483" ) ); - QVERIFY( mTranslator->translate( QString( "Zäta" ) ) == QString( "9282" ) ); - QVERIFY( mTranslator->translate( QString( "Ärlig" ) ) == QString( "27544" ) ); - QVERIFY( mTranslator->translate( QString( "Östen" ) ) == QString( "67836" ) ); - QVERIFY( mTranslator->translate( QString( "Alpha" ) ) == QString( "25742" ) ); - QVERIFY( mTranslator->translate( QString( "Bravo" ) ) == QString( "27286" ) ); - QVERIFY( mTranslator->translate( QString( "Charlie" ) ) == QString( "2427543" ) ); - QVERIFY( mTranslator->translate( QString( "Delta" ) ) == QString( "33582" ) ); - QVERIFY( mTranslator->translate( QString( "Echo" ) ) == QString( "3246" ) ); - QVERIFY( mTranslator->translate( QString( "Foxtrot" ) ) == QString( "3698768" ) ); - QVERIFY( mTranslator->translate( QString( "Golf" ) ) == QString( "4653" ) ); - QVERIFY( mTranslator->translate( QString( "Hotel" ) ) == QString( "46835" ) ); - QVERIFY( mTranslator->translate( QString( "India" ) ) == QString( "46342" ) ); - QVERIFY( mTranslator->translate( QString( "Juliet" ) ) == QString( "585438" ) ); - QVERIFY( mTranslator->translate( QString( "Kilo" ) ) == QString( "5456" ) ); - QVERIFY( mTranslator->translate( QString( "Lima" ) ) == QString( "5462" ) ); - QVERIFY( mTranslator->translate( QString( "Mike" ) ) == QString( "6453" ) ); - QVERIFY( mTranslator->translate( QString( "November" ) ) == QString( "66836237" ) ); - QVERIFY( mTranslator->translate( QString( "Oscar" ) ) == QString( "67227" ) ); - QVERIFY( mTranslator->translate( QString( "Papa" ) ) == QString( "7272" ) ); - QVERIFY( mTranslator->translate( QString( "Quebec" ) ) == QString( "783232" ) ); - QVERIFY( mTranslator->translate( QString( "Romeo" ) ) == QString( "76636" ) ); - 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 ); -} - - -void UT_LogsPredictiveTranslator::testStartsWith() -{ - QVERIFY( mTranslator->startsWith( QString(""), QString("") ) == 0 ); - QVERIFY( mTranslator->startsWith( QString(""), QString("12") ) == 0 ); - QVERIFY( mTranslator->startsWith( QString("Nokia"), QString("") ) == 0 ); - QVERIFY( mTranslator->startsWith( QString("Nokia"), QString("6") ) == 1 ); - QVERIFY( mTranslator->startsWith( QString("Nokia"), QString("66") ) == 2 ); - QVERIFY( mTranslator->startsWith( QString("Nokia"), QString("665") ) == 3 ); - QVERIFY( mTranslator->startsWith( QString("Nokia"), QString("6654") ) == 4 ); - QVERIFY( mTranslator->startsWith( QString("Nokia"), QString("66542") ) == 5 ); - QVERIFY( mTranslator->startsWith( QString("Nokia"), QString("665423") ) == 0 ); - - -} - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logscntfinder/tsrc/ut_logscntfinder/ut_logscntfinder.pro --- a/logsui/logscntfinder/tsrc/ut_logscntfinder/ut_logscntfinder.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +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: -# -# - -TEMPLATE = app -TARGET = - -QT += testlib xml -CONFIG += qtestlib -CONFIG += hb -HB = hbcore hbinput - -DEPENDPATH += . -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -INCLUDEPATH += ../../ -INCLUDEPATH += ../../inc -INCLUDEPATH += ../../../inc -INCLUDEPATH += ../../../tsrc/qtestutils/inc - -DEFINES += QT_NO_DEBUG_OUTPUT - -# Input -HEADERS += inc/ut_logscntfinder.h -HEADERS += ../../inc/logscntfinder.h -HEADERS += inc/ut_logspredictivetranslator.h -HEADERS += ../../inc/logspredictivetranslator.h -HEADERS += inc/ut_logscntentry.h - -SOURCES += src/main.cpp -SOURCES += src/ut_logscntfinder.cpp -SOURCES += src/ut_logspredictivetranslator.cpp -SOURCES += src/ut_logscntentry.cpp -SOURCES += ../../src/logscntfinder.cpp -SOURCES += ../../src/logspredictivetranslator.cpp -SOURCES += ../../../tsrc/qtestutils/src/testresultxmlparser.cpp -SOURCES += ../stubs/qtcontacts_stubs.cpp - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xEfa329b2 - TARGET.CAPABILITY = ALL -TCB - TARGET.EPOCALLOWDLLDATA = 1 - LIBS += -lflogger -lqtcontacts - -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/bwins/logsengineu.def --- a/logsui/logsengine/bwins/logsengineu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -EXPORTS - ?time@LogsEvent@@QBE?AVQDateTime@@XZ @ 1 NONAME ; class QDateTime LogsEvent::time(void) const - ??0LogsModel@@QAE@W4LogsModelType@0@@Z @ 2 NONAME ; LogsModel::LogsModel(enum LogsModel::LogsModelType) - ??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 - ?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) - ?duration@LogsEvent@@QBEHXZ @ 13 NONAME ; int LogsEvent::duration(void) const - ?contactLocalId@LogsEvent@@QBEIXZ @ 14 NONAME ; unsigned int LogsEvent::contactLocalId(void) const - ??1LogsMatchesModel@@UAE@XZ @ 15 NONAME ; LogsMatchesModel::~LogsMatchesModel(void) - ?open@LogsContact@@QAE_NXZ @ 16 NONAME ; bool LogsContact::open(void) - ?logId@LogsEvent@@QBEHXZ @ 17 NONAME ; int LogsEvent::logId(void) const - ?call@LogsCall@@QAEXW4CallType@1@@Z @ 18 NONAME ; void LogsCall::call(enum LogsCall::CallType) - ?allowedCallTypes@LogsCall@@QAE?AV?$QList@W4CallType@LogsCall@@@@XZ @ 19 NONAME ; class QList LogsCall::allowedCallTypes(void) - ?callToNumber@LogsCall@@SAXW4CallType@1@ABVQString@@I@Z @ 20 NONAME ; void LogsCall::callToNumber(enum LogsCall::CallType, class QString const &, unsigned int) - ?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 - ?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 76a2435edfd4 -r de1630741fbe logsui/logsengine/eabi/logsengineu.def --- a/logsui/logsengine/eabi/logsengineu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -EXPORTS - _ZN10LogsFilter10setMaxSizeEi @ 1 NONAME - _ZN10LogsFilterC1ENS_10FilterTypeE @ 2 NONAME - _ZN10LogsFilterC2ENS_10FilterTypeE @ 3 NONAME - _ZN10LogsFilterD0Ev @ 4 NONAME - _ZN10LogsFilterD1Ev @ 5 NONAME - _ZN10LogsFilterD2Ev @ 6 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 76a2435edfd4 -r de1630741fbe logsui/logsengine/inc/logscall.h --- a/logsui/logsengine/inc/logscall.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +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: -* -*/ -#ifndef LOGSCALL_H -#define LOGSCALL_H - -#include -#include -#include - -#include "logsevent.h" - - -/** - * LogsCall can be used to make a call - * from logs model. - */ -class LogsCall : public QObject -{ - Q_OBJECT - -public: - - enum CallType { - TypeLogsCallNotAvailable = 0, - TypeLogsVoiceCall, - TypeLogsVideoCall, - TypeLogsVoIPCall - }; - -public: - - explicit LogsCall(LogsEvent& aEvent); - explicit LogsCall(unsigned int contactId, const QString& number); - - LOGSENGINE_EXPORT ~LogsCall(); - - LOGSENGINE_EXPORT QList allowedCallTypes(); - - LOGSENGINE_EXPORT LogsCall::CallType defaultCallType(); - - LOGSENGINE_EXPORT static void callToNumber(LogsCall::CallType callType, const QString& number, - unsigned int serviceId = 0); - - bool isAllowedCallType(); - -public slots: - - LOGSENGINE_EXPORT void call(LogsCall::CallType callType); - LOGSENGINE_EXPORT void initiateCallback(); - -private: - - static void createcall(QString service, QString type, QString num, bool sync); - static void createCallWithService(QString service, QString type, QString num, - bool sync, unsigned int serviceId ); - -private: //data - - QList mCalls; - CallType mDefaultCall; - QString mNumber; - unsigned int mServiceId; - -private: - friend class UT_LogsCall; - -}; - -#endif // LOGSCALL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/inc/logscommondata.h --- a/logsui/logsengine/inc/logscommondata.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +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: -* -*/ - -#ifndef LOGSCOMMONDATA_H -#define LOGSCOMMONDATA_H - -#include -#include "logsevent.h" - -QTM_BEGIN_NAMESPACE -class QContactManager; -QTM_END_NAMESPACE - -QTM_USE_NAMESPACE - -/** - * Commonly shared data. - */ -class LogsCommonData -{ - private: - explicit LogsCommonData(); - virtual ~LogsCommonData(); - - public: - static LogsCommonData& getInstance(); - static void freeCommonData(); - - QContactManager& contactManager(); - - /** - * Configure maximum number of events. It is possible to - * configure that reading is stopped once defined amount - * of events of certain direction has been read. - */ - void configureReadSize( - int maxSize, - LogsEvent::LogsDirection dir = LogsEvent::DirUndefined ); - /** - * Get max read size - * @return max number of events, -1 if max num is not configured - */ - int maxReadSize() const; - LogsEvent::LogsDirection maxReadSizeDirection() const; - - private: - - QContactManager* mContactManager; - int mMaxReadSize; - LogsEvent::LogsDirection mMaxReadSizeDir; - - private: - friend class UT_LogsCommonData; - -}; - - -#endif // LOGSCOMMONDATA_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/inc/logscontact.h --- a/logsui/logsengine/inc/logscontact.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +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: -* -*/ -#ifndef LOGSCONTACT_H -#define LOGSCONTACT_H - -#include -#include -#include - -//forward declarations -class XQServiceRequest; -class LogsDbConnector; -class LogsEvent; - -QTM_USE_NAMESPACE - -/** - * LogsContact can be used to modify or create a contact in phonebook - * - */ -class LogsContact : public QObject -{ - Q_OBJECT - -public: - enum RequestType { - TypeLogsContactOpen, //contact is in phonebook, can open it - TypeLogsContactSave //contact isn't in phonebook, can save it - }; - -public: - - explicit LogsContact(LogsEvent& event, LogsDbConnector& dbConnector); - explicit LogsContact(const QString& number, - LogsDbConnector& dbConnector, - unsigned int contactId = 0); - LOGSENGINE_EXPORT ~LogsContact(); - - /** - * Returns allowed request type - */ - LOGSENGINE_EXPORT RequestType allowedRequestType(); - - bool isContactRequestAllowed(); - -public slots: - - /** - * Launch phonebook view for modification of the contact. Will proceed - * only if allowedRequestType() is TypeLogsContactOpen, otherwise returns false. - * 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 saveCompleted() signal, when contact saving is done. - * @return true if adding was called successfully - */ - 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: - - /** - * Indicates that contact modification completed - * @param modified true if contact was modified, false - otherwise - */ - void openCompleted(bool modified); - - /** - * Indicates that contact saving completed - * @param modified true if contact was saved, false - otherwise - */ - void saveCompleted(bool modified); - - -private slots: - - void handleRequestCompleted(const QVariant& result); - - -private: - - /** - * Finds contact from phonebook - * @return contact - */ - QContact contact(); - - /** - * Checks whether contact is in phonebook - * @return true if contact is in phonebook - */ - bool isContactInPhonebook(); - - bool save(QString message); - - bool requestFetchService(QString message, - const QList &arguments, - bool sync = false ); - - -private: //data - - LogsDbConnector& mDbConnector; - QContact mContact; - - XQServiceRequest* mService; - RequestType mCurrentRequest; - QString mNumber; - unsigned int mContactId; - bool mSaveAsOnlineAccount; - -private: - - friend class UT_LogsContact; - -}; - -#endif // LOGSCONTACT_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/inc/logsdetailsmodel.h --- a/logsui/logsengine/inc/logsdetailsmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSDETAILSMODEL_H -#define LOGSDETAILSMODEL_H - -#include -#include -#include -#include "logsengdefs.h" - -class LogsEvent; -class LogsDbConnector; -class HbIcon; - -/** - * Model for log event details. - * - */ -class LogsDetailsModel : public LogsAbstractModel -{ - Q_OBJECT - -public: - - explicit LogsDetailsModel( LogsDbConnector& dbConnector, LogsEvent& event ); - -public: // The exported API - - LOGSENGINE_EXPORT ~LogsDetailsModel(); - - LOGSENGINE_EXPORT void clearEvent(); - LOGSENGINE_EXPORT void getNumberToClipboard(); - -public: // From QAbstractItemModel - - virtual int rowCount(const QModelIndex &parent) const; - virtual QVariant data(const QModelIndex &index, int role) const; - virtual QVariant headerData(int section, Qt::Orientation orientation, - int role = Qt::DisplayRole) const; - -protected: // From LogsAbstractModel - - virtual QVariant createContact(const LogsModelItemContainer& item) const; - -private slots: - - void contactActionCompleted(bool modified); - void duplicatesRead(); - -private: - - void getDecorationData(int row, QList& iconList) const; - void getDisplayData(int row, QStringList& texts) const; - QString getCallerId(const LogsEvent& event) const; - QString getHeaderData(const LogsEvent& event) const; - QString getRemoteUri(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; - QList mDetailIcons; - QList mDetailTexts; - QList mDuplicates; - -private: - - friend class UT_LogsModel; - friend class UT_LogsDetailsModel; - - -}; - -#endif //LOGSDETAILSMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/inc/logsengdefs.h --- a/logsui/logsengine/inc/logsengdefs.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +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: -* -*/ - -#ifndef LOGSENGDEFS_H -#define LOGSENGDEFS_H - -#include - - -// CONSTANT LITERALS -const char logsEmergencyCall911[] = "911"; // Number in event considered to be emergency call -const char logsEmergencyCall[] = "112"; // Number in event considered to be emergency call (in CDMA - // KLogsDataFldTag_Emergency is used instead -//icons ids -const char logsVoiceCallIconId[] = "qtg_large_voice_call"; -const char logsVideoCallIconId[] = "qtg_large_video_call"; -const char logsVoipCallIconId[] = "qtg_large_voip"; - -const char logsRemotePartyInfoIconId[] = "qtg_large_info"; -const char logsCallDurationIconId[] = "qtg_large_call_duration"; -const char logsCallDateAndTimeIconId[] = "qtg_large_calendar"; -const char logsThumbUnknownId[] = "qtg_large_avatar"; - -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"; - - -// CONSTANT NUMBERS - -const int logsEventALS = 0x4; -const int logsDeleteCountInit = -1; - -// MACROS -#define DESC_TO_QSTRING( desc )\ - QString::fromUtf16( desc.Ptr(), desc.Length() ); - -#define LOGSENG_PANIC() User::Invariant() - -#define LOGSENG_ASSERT( cond )\ -if ( !(cond) ) LOGSENG_PANIC; - -// DATA TYPES - -class LogsEventStrings - { -public: - QString iInDirection; // incoming direction text - QString iOutDirection; // outgoing direction text - QString iMissedDirection; // missed direction text - QString iInDirectionAlt; // Incoming alternate line - QString iOutDirectionAlt; // Outgoing alternate line - QString iFetched; // Fetched - QString iUnKnownRemote; // unknown remote text - }; - -#endif // LOGSENGDEFS_H - -// End of File diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/inc/logseventdata.h --- a/logsui/logsengine/inc/logseventdata.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +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: -* -*/ - -#ifndef LOGSEVENTDATA_H -#define LOGSEVENTDATA_H - -// INCLUDES -#include - -// FORWARD DECLARATION -class CLogEvent; - -// CLASS DECLARATION - -/** - * - */ -class LogsEventData - { - - public: - - /** - * Constructor. - */ - LogsEventData(); - - /** - * Copy constructor. - */ - LogsEventData( const LogsEventData& data ); - - /** - * Destructor. - */ - virtual ~LogsEventData(); - - - public: - - /** - * Parses event data from given data - * @param source data - * @return 0 if parsed succesfully - **/ - int parse( const CLogEvent& source ); - - bool isCNAP() const; - bool isVT() const; - bool isPoC() const; - bool isVoIP() const; - long long dataReceived() const; - long long dataSent() const; - bool isEmerg() const; - int msgPartsNumber() const; - unsigned int serviceId() const; - QString remoteUrl() const; - QString localUrl() const; - - /** - * Checks whether event data can be used in CS context. - * @return true if CS compatible. - */ - bool isCsCompatible(); - - unsigned int contactLocalId() const; - - private: - - void setContactLocalId( unsigned int id ); - - private: // data - - // Calling Name Presentation service flag - bool mIsCNAP; - bool mIsVT; - bool mIsPoC; - bool mIsVoIP; - - //Flag that indicates whether this is an emergency related event (i.e emerg call) - bool mIsEmerg; - - //Sent and received data where applicable (in bytes) - long long mDataSent; - long long mDataReceived; - - //Message parts. Meaningful only for sms - int mMsgPartsNumber; - - unsigned int mServiceId; - unsigned int mContactLocalId; - - QString mRemoteUrl; - QString mLocalUrl; - - private: - - friend class LogsEventDataParser; - friend class LogsEvent; - - private: // Testing related friend definitions - - friend class UT_LogsEventData; - friend class UT_LogsEvent; - friend class UT_LogsEventParser; - friend class UT_LogsEventDataParser; - friend class UT_LogsCall; - friend class UT_LogsContact; - friend class UT_LogsMessage; - friend class UT_LogsDetailsModel; - friend class UT_LogsModel; - friend class UT_LogsCustomFilter; - friend class UT_LogsMatchesModel; - - }; - -#endif // LOGSEVENTDATA_H - - -// End of File diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/inc/logsmatchesmodel.h --- a/logsui/logsengine/inc/logsmatchesmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +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: -* -*/ - -#ifndef LOGSMATCHESMODEL_H -#define LOGSMATCHESMODEL_H - -#include -#include -#include "logsengdefs.h" - -class LogsEvent; -class LogsDbConnector; -class LogsCntFinder; -class LogsCntEntry; -class LogsContact; -class LogsMatchesModelItemContainer; -class LogsThumbIconManager; -typedef QObject LogsCntEntryHandle; - -/** - * Model for log event details. - * - */ -class LogsMatchesModel : public LogsAbstractModel -{ - Q_OBJECT - -public: - - explicit LogsMatchesModel( LogsAbstractModel& parentModel, - LogsDbConnector& dbConnector ); - -public: // The exported API - - LOGSENGINE_EXPORT ~LogsMatchesModel(); - 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 - - virtual int rowCount(const QModelIndex &parent) const; - virtual QVariant data(const QModelIndex &index, int role) const; - -public: // From LogsAbstractModel - - virtual QVariant createCall(const LogsModelItemContainer& item) const; - virtual QVariant createMessage(const LogsModelItemContainer& item) const; - virtual QVariant createContact(const LogsModelItemContainer& item) const; - -public slots: - void queryReady(); - void updateContactIcon(int index); - -private slots: - void eventsUpdated(const QModelIndex& first, const QModelIndex& last); - void eventsAdded(const QModelIndex& parent, int first, int last); - void eventsRemoved(const QModelIndex& parent, int first, int last); - - void doSearchQuery(); - void doModelReset(); - -private: - - bool addSearchResult(int resultIndex); - bool updateSearchResult(LogsMatchesModelItemContainer& item) const; - void readEvents(int first, int last); - void getLogsMatches( const QString& pattern, bool async = false, bool force = false ); - void updateSearchEntry(LogsCntEntry& entry, LogsEvent& event); - QString stripPhoneNumber(const QString& phoneNumber) const; - -private: //data - - LogsAbstractModel& mParentModel; - LogsCntFinder* mLogsCntFinder; - - QList mMatches; - QMap mSearchEvents; - - QString mCurrentSearchPattern; - QString mPrevSearchPattern; - LogsThumbIconManager *mIconManager; - -private: - - friend class UT_LogsModel; - friend class UT_LogsMatchesModel; - -}; - -/** - * Contains log event or contact match - */ -class LogsMatchesModelItemContainer : public LogsModelItemContainer { -public: - LogsMatchesModelItemContainer(LogsAbstractModel& parentModel, - LogsThumbIconManager& mIconManager, - int resultIndex); - virtual ~LogsMatchesModelItemContainer(); - - void setEvent(const LogsEvent& event); - void setContact(unsigned int contactId); - unsigned int contact() const; - QString number() const; - QString contactName() const; - bool isNull() const; - bool isEventMatch() const; - QStringList texts(); - QList icons(int row); - void updateData(const LogsCntEntry& entry); - int resultIndex() const; - -private: - - QString getFormattedCallerId(const LogsCntEntry& entry) const; - void getFormattedContactInfo( - const LogsCntEntry& entry, QString& contactName, QString& contactNumber ) const; - -private: - - LogsAbstractModel& mParentModel; - unsigned int mContactId; - QString mContactName; - QString mContactNumber; - QString mAvatarPath; - QString mFormattedCallerId; - LogsThumbIconManager& mIconManager; - int mResultIndex; - -private: - - friend class UT_LogsMatchesModel; -}; - -#endif //LOGSMATCHESMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/inc/logsmessage.h --- a/logsui/logsengine/inc/logsmessage.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSMESSAGE_H -#define LOGSMESSAGE_H - - -#include -#include - -#include "logsevent.h" - -class XQServiceRequest; - -/** - * LogsMessage can be used to send message. - */ -class LogsMessage : public QObject -{ - Q_OBJECT - -public: - - explicit LogsMessage(LogsEvent& aEvent); - 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: - - /** - * Send message - * @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; - -}; - -#endif // LOGSMESSAGE_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/inc/logsthumbnailmanager.h --- a/logsui/logsengine/inc/logsthumbnailmanager.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +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: Music Player collection album art manager. -* -*/ - - -#ifndef LOGSTHUMBNAILMANAGER_H -#define LOGSTHUMBNAILMANAGER_H - -#include -#include -#include -#include -#include -#include -#include - -class ThumbnailManager; - -class LogsThumbIconManager : public QObject -{ - Q_OBJECT - -public: - - explicit LogsThumbIconManager(QObject *parent=0); - virtual ~LogsThumbIconManager(); - - QIcon& contactIcon(const QString &avatarPath, int index); - void cancel(); - QIcon& defaultIcon(); - -signals: - void contactIconReady(int index); - -public slots: - void thumbnailReady(const QPixmap& pixmap, void *data, int id, int error); - void thumbnailLoad(); - void timerTimeout(); - -private: - ThumbnailManager *mThumbnailManager; - QCache mImageCache; - QMap mTnmReqMap; - - QQueue< QPair > mRequestQueue; - int mQueueCount; - QTimer* mTimer; - QIcon* mDefaultIcon; - -private: - - friend class UT_LogsMatchesModel; - friend class UT_LogsThumbnailManager; - -}; - -#endif // LOGSTHUMBNAILMANAGER_H - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logsengine.pro --- a/logsui/logsengine/logsengine.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +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: -# -# - -TEMPLATE = lib - -TARGET = logsengine -CONFIG += hb dll svg -RESOURCES += logsengine.qrc - -INCLUDEPATH += ./ -INCLUDEPATH += ./inc -INCLUDEPATH += ./logssymbianos -INCLUDEPATH += ./logssymbianos/inc -INCLUDEPATH += ../inc -INCLUDEPATH += ../logscntfinder/inc -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - - -# Input -HEADERS += ../../contacts_plat/logs_engine_api/inc/logsabstractmodel.h -HEADERS += ../../contacts_plat/logs_engine_api/inc/logsmodel.h -HEADERS += ../../contacts_plat/logs_engine_api/inc/logsevent.h -HEADERS += ../../contacts_plat/logs_engine_api/inc/logsfilter.h -HEADERS += ../../contacts_plat/logs_engine_api/inc/logscustomfilter.h -HEADERS += inc/logsdetailsmodel.h -HEADERS += inc/logsmatchesmodel.h -HEADERS += inc/logsengdefs.h -HEADERS += inc/logscall.h -HEADERS += inc/logscontact.h -HEADERS += inc/logsmessage.h -HEADERS += inc/logseventdata.h -HEADERS += inc/logsthumbnailmanager.h -HEADERS += inc/logscommondata.h -HEADERS += logssymbianos/inc/logsdbconnector.h -HEADERS += logssymbianos/inc/logsreader.h -HEADERS += logssymbianos/inc/logsreaderstates.h -HEADERS += logssymbianos/inc/logsreaderstatecontext.h -HEADERS += logssymbianos/inc/logseventparser.h -HEADERS += logssymbianos/inc/logseventdataparser.h -HEADERS += logssymbianos/inc/logsremove.h - -SOURCES += src/logsfilter.cpp -SOURCES += src/logsabstractmodel.cpp -SOURCES += src/logsmodel.cpp -SOURCES += src/logsdetailsmodel.cpp -SOURCES += src/logsmatchesmodel.cpp -SOURCES += src/logscall.cpp -SOURCES += src/logscontact.cpp -SOURCES += src/logsmessage.cpp -SOURCES += src/logsevent.cpp -SOURCES += src/logseventdata.cpp -SOURCES += src/logscustomfilter.cpp -SOURCES += src/logsthumbnailmanager.cpp -SOURCES += src/logscommondata.cpp -SOURCES += logssymbianos/src/logsdbconnector.cpp -SOURCES += logssymbianos/src/logsreader.cpp -SOURCES += logssymbianos/src/logsreaderstates.cpp -SOURCES += logssymbianos/src/logseventparser.cpp -SOURCES += logssymbianos/src/logseventdataparser.cpp -SOURCES += logssymbianos/src/logsremove.cpp - -DEFINES += LOGSENGINE_LIB - -libFiles.sources = logsengine.dll -libFiles.path = "!:/sys/bin" -DEPLOYMENT += libFiles - -symbian: { - TARGET.UID2 = 0x1000008d - TARGET.UID3 = 0x10282CE2 - - TARGET.CAPABILITY = CAP_GENERAL_DLL - TARGET.EPOCALLOWDLLDATA = 1 - LIBS += -lflogger -llogcli -llogwrap -lefsrv -lxqservice -lqtcontacts -llogscntfinder -lthumbnailmanagerqt -lcentralrepository - - defFiles = "$${LITERAL_HASH}ifdef WINS" \ - "DEFFILE bwins/logsengine.def" \ - "$${LITERAL_HASH}else" \ - "DEFFILE eabi/logsengine.def" \ - "$${LITERAL_HASH}endif" - MMP_RULES += defFiles -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logsengine.qrc --- a/logsui/logsengine/logsengine.qrc Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ - - - themes/icons/hbdefault/scalable/qtg_large_voice_call.svg - themes/icons/hbdefault/scalable/qtg_large_video_call.svg - themes/icons/hbdefault/scalable/qtg_large_voip.svg - themes/icons/hbdefault/scalable/qtg_large_call_duration.svg - themes/icons/hbdefault/scalable/qtg_large_info.svg - themes/icons/hbdefault/scalable/qtg_large_calendar.svg - 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 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/inc/logsdbconnector.h --- a/logsui/logsengine/logssymbianos/inc/logsdbconnector.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,221 +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: -* -*/ - -#ifndef LOGSDBCONNECTOR_H -#define LOGSDBCONNECTOR_H - -// INCLUDES -#include -#include "logsengdefs.h" -#include "logsreaderobserver.h" -#include "logsremoveobserver.h" -#include "logsmodel.h" -// MACROS - -// DATA TYPES - -// FUNCTION PROTOTYPES - -// FORWARD DECLARATIONS -class CLogClient; -class LogsReader; -class LogsEvent; -class LogsRemove; -class RFs; -class CRepository; - -// CLASS DECLARATIONS - - -/** - * LogsDbConnector is used to initialize database access - */ -class LogsDbConnector : - public QObject, public LogsReaderObserver, public LogsRemoveObserver - { - Q_OBJECT - - public: - - /** - * Constructor - * @param events, connector fills the array with events - * read from database. Ownership of events is not transferred. - * @param checkAllEvents, true if interested in all events of the database, - * false if interested only in recent events - */ - LogsDbConnector( QList& events, bool checkAllEvents = false ); - ~LogsDbConnector(); - - signals: - - /** - * Signaled once some new data has been read from database. - * Added data is placed to event array already when this signal - * is emitted. - * @param addedIndexes, indexes for new events - */ - void dataAdded(QList addedIndexes); - - /** - * Signaled once some data has been updated. - * Corresponding events have been already updated at event array - * when this signal is emitted. - * @param updatedIndexes, indexes for updated events - */ - void dataUpdated(QList updatedIndexes); - - /** - * Signaled once some data has been removed. - * Corresponding events have been already removed from event array - * when this signal is emitted. - * @param removedIndexes, indexes for removed events - */ - void dataRemoved(QList removedIndexes); - - /** - * Signaled once asycn event clearing has completed. - * @param err, 0 if marking completed succesfully - */ - void clearingCompleted(int err); - - /** - * Signaled once asycn event marking has completed. - * @param err, 0 if marking completed succesfully - */ - void markingCompleted(int err); - - /** - * Signaled once duplicate reading has completed. - */ - void duplicatesRead(); - - public: - - /** - * Initialize database access - * @return 0 if initialized succesfully - */ - int init(); - - /** - * Start reading data from database - * @return 0 if reading started succesfully - */ - int start(); - - /** - * Synchronously updates details (rematches from phonebook) for - * already read events - * @param clearCached if true, cached matches will be cleaned before - * rematching - */ - int updateDetails(bool clearCached); - - /** - * Clear events of defined type. Clearing is async and completion is - * indicated by clearingCompleted signal. - * @return true if async clearing started - */ - bool clearList(LogsModel::ClearType cleartype); - - /** - * Starts removing events and all their duplicates. Clearing - * can be sync or async. In case of async, completion is - * indicated by clearingCompleted signal. - * @param eventIds, ids of the events to be removed - * @return true if async clearing started - */ - bool clearEvents(const QList& eventIds); - - /** - * Mark events as seen. Completion is indicated by - * markingCompleted signal. - * @param eventIds, ids of the events to be marked - * @return true if marking started - */ - bool markEventsSeen(const QList& eventIds); - - /** - * Clear missed calls counter. - * @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 - - virtual void readCompleted(int readCount); - virtual void errorOccurred(int err); - virtual void temporaryErrorOccurred(int err); - virtual void eventModifyingCompleted(); - virtual void duplicatesReadingCompleted(QList duplicates); - - protected: // From LogsRemoveObserver - virtual void removeCompleted(); - virtual void logsRemoveErrorOccured(int err); - - private: - void initL(); - void handleTemporaryError(int& error); - void deleteRemoved(int newEventCount); - int doMarkEventSeen(); - bool handleModifyingCompletion(int err=0); - - private: // data - - QList& mModelEvents; - bool mCheckAllEvents; - CLogClient* mLogClient; - LogsEventStrings mLogEventStrings; - RFs* mFsSession; - LogsReader* mReader; - LogsRemove* mLogsRemove; - 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; - - }; - - -#endif - -// End of File LOGSDBCONNECTOR_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/inc/logseventdataparser.h --- a/logsui/logsengine/logssymbianos/inc/logseventdataparser.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSEVENTDATAPARSER_H -#define LOGSEVENTDATAPARSER_H - -// INCLUDES -#include - -// FORWARD DECLARATION -class LogsEventData; -class CLogEvent; -class TDesC8; - -// CLASS DECLARATION - -/** - * - */ -class LogsEventDataParser - { - public: - - /** - * Parses event data from given data - * @param source - * @param dest - * @return 0 if parsed succesfully - **/ - static int parse( const CLogEvent& source, LogsEventData& dest ); - - private: - - static bool checkNonTaggedData( const TDesC8 &data, LogsEventData& dest ); - static void checkTaggedData( const TDesC8 &data, LogsEventData& dest ); - static void setMsgPartsNumber( const TDesC8 &data, LogsEventData& dest ); - - private: // Testing related friend class definitions - - friend class UT_LogsEventDataParser; - - }; - -#endif // LOGSEVENTDATAPARSER_H - - -// End of File diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/inc/logseventparser.h --- a/logsui/logsengine/logssymbianos/inc/logseventparser.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +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: -* -*/ - -#ifndef LOGSEVENTPARSER_H -#define LOGSEVENTPARSER_H - -// INCLUDES -#include -#include - -// FORWARD DECLARATION -class CPhCltEmergencyCall; -class LogsEventData; -class LogsEventStrings; -class LogsEvent; - -// CLASS DECLARATION - -/** - * - */ -class LogsEventParser - { - public: - - /** - * Parses the event and fills parsed data to given dest event. - * Event state and view status are updated automatically at - * this phase. - * @param source, source event - * @param dest, destination event - * @param strings, list of strings used for comparison - */ - static void parseL( const CLogEvent& source, - LogsEvent& dest, - const LogsEventStrings& strings ); - - private: - - /** - * Resolve event type based on available information. - */ - static void resolveEventType(LogsEvent& dest); - - static void eventTypeSpecificParsing(LogsEvent& dest); - - static bool isUnknownRemoteParty(LogsEvent& dest, const QString& remoteParty); - - private: // Testing related friend class definitions - - friend class UT_LogsEventParser; - }; - -#endif // LOGSEVENTPARSER_H - -// End of File diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/inc/logsreader.h --- a/logsui/logsengine/logssymbianos/inc/logsreader.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,214 +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: -* -*/ - -#ifndef LOGSREADER_H -#define LOGSREADER_H - -// INCLUDES -#include -#include -#include -#include -#include -#include "logsreaderstatecontext.h" -#include "logsreaderstates.h" - -// FORWARD DECLARATION -class CLogViewRecent; -class RFs; -class CLogClient; -class CLogViewEvent; -class LogsReaderObserver; -class LogsEvent; -class LogsEventStrings; -class LogsReaderStateFiltering; - -// CLASS DECLARATION - - - -/** - * LogsReader is used to read events from database - */ -class LogsReader : public CActive, - public MLogClientChangeObserver, - public MLogViewChangeObserver, - public LogsReaderStateContext - { - - friend class UT_LogsReader; - friend class UT_LogsDbConnector; - - public: - - /** - * Constructor - * @param fsSession, connected fileserver session - * @param logClient - * @param strings, commonly used strings - * @param events, filled with events once reading progresses - * @param observer, information about read progress is notified - * via the interface - * @param readAllEvents, true if all events in db should be read, - * otherwise only recent events are read - */ - LogsReader( RFs& fsSession, - CLogClient& logClient, - LogsEventStrings& strings, - QList& events, - LogsReaderObserver& observer, - bool readAllEvents = false ); - - /** - * Destructor. - */ - virtual ~LogsReader(); - - - - public: - - /** - * Start reading - * @return 0 if reading started succesfully - */ - int start(); - - /** - * Stop reading - */ - void stop(); - - /** - * Synchronously update details (rematches from phonebook) for - * already read events - * @param clearCached if true, cached matches will be cleaned before - * rematching - */ - void updateDetails(bool clearCached); - - /** - * Starts modifying the event and all its duplicates as read - * @param eventId, id of the event to be removed - * @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 - - void RunL(); - void DoCancel(); - TInt RunError(TInt error); - - private: // From MLogClientChangeObserver - - void HandleLogClientChangeEventL( TUid aChangeType, - TInt aChangeParam1, - TInt aChangeParam2, - TInt aChangeParam3 ); - private: // From MLogViewChangeObserver - - void HandleLogViewChangeEventAddedL( - TLogId aId, TInt aViewIndex, - TInt aChangeIndex, TInt aTotalChangeCount); - - void HandleLogViewChangeEventChangedL( - TLogId aId, TInt aViewIndex, - TInt aChangeIndex, TInt aTotalChangeCount); - - void HandleLogViewChangeEventDeletedL( - TLogId aId, TInt aViewIndex, - TInt aChangeIndex, TInt aTotalChangeCount); - - private: // From LogsReaderStateContext - - inline void setCurrentState(const LogsReaderStateBase& state); - inline CLogView& logView(); - inline CLogViewDuplicate& duplicatesView(); - inline QList& events(); - inline int& index(); - inline LogsEventStrings& strings(); - inline TRequestStatus& reqStatus(); - inline LogsReaderObserver& observer(); - inline QHash& contactCache(); - 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 - * in progress, it will leave with error - */ - void cancelCurrentRequestL(); - LogsReaderStateBase& currentState(); - void initializeReadStates(); - void initializeModifyingStates(); - void initializeDuplicateReadingStates(); - void handleViewChange( int totalChangeCount = 1 ); - void handleError(int error); - void createLogViewL(); - LogsReaderStateFiltering* createFilteringState(); - void prepareReadingL(); - - private: // data - - CLogViewRecent* mLogViewRecent; - CLogViewEvent* mLogViewEvent; - CLogViewDuplicate* mDuplicatesView; - - RFs& mFsSession; - CLogClient& mLogClient; - LogsEventStrings& mStrings; - QList& mEvents; - LogsReaderObserver& mObserver; - bool mReadAllEvents; - - int mIndex; - QList mReadStates; - QList mModifyingStates; - QList mDuplicateReadingStates; - int mCurrentStateIndex; - QList* mCurrentStateMachine; - - QHash mContactCache; - QList mDuplicatedEvents; - - int mCurrentEventId; - }; - -#endif // LOGSREADER_H - - -// End of File - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/inc/logsreaderobserver.h --- a/logsui/logsengine/logssymbianos/inc/logsreaderobserver.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +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: -* -*/ - -#ifndef LOGSREADEROBSERVER_H -#define LOGSREADEROBSERVER_H - -// INCLUDES -#include - -// FORWARD DECLARATION -class LogsEvent; - -// CLASS DECLARATION - -/** - * Reader observer interface - */ -class LogsReaderObserver - { - - public: - - /** - * Reader has completed reading. - */ - virtual void readCompleted(int readCount) = 0; - - /** - * Error occured while reading. - * @param err - */ - virtual void errorOccurred(int err) = 0; - - /** - * Temporary error occured while reading. - * It should be possible to continue reading at some point. - * @param err - */ - 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 - - -// End of File - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/inc/logsreaderstatecontext.h --- a/logsui/logsengine/logssymbianos/inc/logsreaderstatecontext.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 LOGSREADERSTATECONTEXT_H -#define LOGSREADERSTATECONTEXT_H - -// INCLUDES -#include -#include - -// FORWARD DECLARATION -class LogsReaderStateBase; -class CLogView; -class CLogViewDuplicate; -class CLogViewEvent; -class LogsEvent; -class LogsEventStrings; -class TRequestStatus; -class LogsReaderObserver; -class CLogClient; - -// CLASS DECLARATION - -class ContactCacheEntry -{ -public: - inline ContactCacheEntry() : mRemoteParty(QString()), mContactLocalId(0) {} - inline ContactCacheEntry( const ContactCacheEntry& entry ); - inline ContactCacheEntry(QString remoteParty, unsigned int contactId); - - QString mRemoteParty; - unsigned int mContactLocalId; -}; - - -/** - * Context for reader state machine - */ -class LogsReaderStateContext { - public: - - /** - * Change state - * @param state, new state - */ - virtual void setCurrentState(const LogsReaderStateBase& state) = 0; - - /** - * Get log view - * @return current log view - */ - virtual CLogView& logView() = 0; - - /** - * Get duplicates view - * @return current duplicates view - */ - virtual CLogViewDuplicate& duplicatesView() = 0; - - /** - * Get event container - * @return events - */ - virtual QList& events() = 0; - - /** - * Get view index - * @return ref to view index - */ - virtual int& index() = 0; - - /** - * Get commonly used strings - * @return strings - */ - virtual LogsEventStrings& strings() = 0; - - /** - * Request status for async operations - * inside states - * @return reqstatus - */ - virtual TRequestStatus& reqStatus() = 0; - - /** - * Get observer - * @return observer - */ - virtual LogsReaderObserver& observer() = 0; - - /** - * Get contact cache - * @return cache (key:telnum, value:contactname) - */ - virtual QHash& contactCache() = 0; - - /** - * Get ID of the event to be handled - * @return ID of the event - */ - virtual int currentEventId() = 0; - - /** - * Get log client - * @return log client - */ - virtual CLogClient& logClient() = 0; - - /** - * Check if current view is recent view. - * @return true if recent view - */ - virtual bool isRecentView() = 0; - - /** - * Get event container for duplicated events - * @return duplicated events - */ - virtual QList& duplicatedEvents() = 0; -}; - - - -inline ContactCacheEntry::ContactCacheEntry( const ContactCacheEntry& entry ) -{ - mRemoteParty = entry.mRemoteParty; - mContactLocalId = entry.mContactLocalId; -} - -inline ContactCacheEntry::ContactCacheEntry(QString remoteParty, unsigned int contactId) -{ - mRemoteParty = remoteParty; - mContactLocalId = contactId; -} - -#endif // LOGSREADERSTATECONTEXT_H - - -// End of File - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/inc/logsreaderstates.h --- a/logsui/logsengine/logssymbianos/inc/logsreaderstates.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,357 +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: -* -*/ - -#ifndef LOGSREADERSTATES_H -#define LOGSREADERSTATES_H - -// INCLUDES -#include -#include -#include - -// FORWARD DECLARATION -class LogsReaderStateContext; -class LogsEvent; -class CLogViewEvent; -class CLogFilterList; -class CLogFilter; -class CLogEvent; - -// CLASS DECLARATION - -/** - * Reader state base - */ -class LogsReaderStateBase { - - friend class UT_LogsReaderStates; - friend class UT_LogsReader; - - public: - - /** - * Destructor - */ - virtual ~LogsReaderStateBase(); - - /** - * Set next state to be used once this state has completed. - * @param nextState - */ - void setNextState(LogsReaderStateBase& nextState); - - /** - * Enter to the state, may proceed immediately to next state. - * @return true if entering started async operation, false if not - */ - virtual bool enterL(); - - /** - * Continue running in the state, may proceed to next state - * @return true if continue started async operation, false if not - */ - virtual bool continueL(); - - protected: - - /** - * Constructor - */ - LogsReaderStateBase(LogsReaderStateContext& context); - - /** - * Proceed to next state if such exists. - * @return true if entering started async operation, false if not - */ - virtual bool enterNextStateL(); - - /** - * Get number of events in view - * @return view count - */ - int viewCountL() const; - - /** - * Get current event - * @return event - */ - CLogEvent& event() const; - - /** - * Fill dest event with source event data and insert to specified - * place in events list. - * @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, QList& events ); - - /** - * Fill already used dest event with source event data and insert - * to specified place in events list. - * @param source event - * @param dest event, ownership is transferred - * @param index, increased if event was added - * @return true if dest event was inserted, false if discarded and deleted - */ - bool updateAndInsertEventL( - const CLogEvent& source, LogsEvent* dest, int &eventIndex ); - - /** - * Reset current events - */ - void resetEvents(); - - /** - * Try to find matching event and remove it from - * events list. - * @param event, symbian log event - * @return LogsEvent or 0 if no matching found, ownership is transferred - */ - LogsEvent* takeMatchingEvent(const CLogEvent& event); - - /** - * Finds specified event from the event list. Event not removed from the list. - * @param eventId, id of the event to be found - * @return pointer to event or 0 if not found - */ - LogsEvent* eventById(int eventId); - - /** - * Try to search duplicates for current event in the view - * @param aFilter, filter to be used for searching duplicates - * @return true, if duplicates are searched - */ - bool duplicatesL(const CLogFilter* aFilter = 0); - - protected: - LogsReaderStateContext& mContext; - LogsReaderStateBase* mNextState; - int mStateIndex; -}; - -/** - * Filtering recent state - */ -class LogsReaderStateFiltering : public LogsReaderStateBase { - - friend class UT_LogsReaderStates; - - public: - LogsReaderStateFiltering(LogsReaderStateContext& context); - virtual ~LogsReaderStateFiltering(); - - public: // From LogsReaderStateBase - virtual bool enterL(); - virtual bool continueL(); - - protected: - /** - * Setting filter for view, derived class may add special filtering - * at this stage. - */ - virtual bool setFilterL(CLogFilterList& filterList); - - protected: - CLogFilterList* mFilterList; - }; - -/** - * Filtering all state - */ -class LogsReaderStateFilteringAll : public LogsReaderStateFiltering { - - friend class UT_LogsReaderStates; - - public: - LogsReaderStateFilteringAll(LogsReaderStateContext& context); - virtual ~LogsReaderStateFilteringAll(); - - protected: // From LogsReaderStateFiltering - virtual bool setFilterL(CLogFilterList& filterList); - }; - -/** - * Reading state - */ -class LogsReaderStateReading : public LogsReaderStateBase { - - friend class UT_LogsReaderStates; - - public: - LogsReaderStateReading(LogsReaderStateContext& context); - virtual ~LogsReaderStateReading(); - - public: // From LogsReaderStateBase - virtual bool enterL(); - virtual bool continueL(); - - protected: - bool handleMissedL(LogsEvent& parsedEvent); - void updateReadSizeCounter(LogsEvent& event); - bool canContinueReadingL(int index) const; - - protected: - CLogFilter* mDuplicateMissedFilter; - bool mCheckingMissed; - int mEventIndex; - int mReadSizeCounter; -}; - -/** - * Fill missing information state - */ -class LogsReaderStateFillDetails : public LogsReaderStateBase { - public: - LogsReaderStateFillDetails(LogsReaderStateContext& context); - virtual ~LogsReaderStateFillDetails(); - - /** - * Synchronously fills details from phonebook - */ - void fillDetails(); - - public: // From LogsReaderStateBase - virtual bool enterL(); -}; - -/** - * Completed state - */ -class LogsReaderStateDone : public LogsReaderStateBase { - public: - LogsReaderStateDone(LogsReaderStateContext& context); - virtual ~LogsReaderStateDone(); - - public: // From LogsReaderStateBase - virtual bool enterL(); -}; - - -/** - * Searching event state - */ -class LogsReaderStateSearchingEvent : public LogsReaderStateBase -{ - friend class UT_LogsReaderStates; - - public: - LogsReaderStateSearchingEvent(LogsReaderStateContext& context); - virtual ~LogsReaderStateSearchingEvent(){} - - public: // From LogsReaderStateBase - virtual bool enterL(); - virtual bool continueL(); -}; - -/** - * Finding duplicate events state - */ -class LogsReaderStateFindingDuplicates : public LogsReaderStateBase -{ - friend class UT_LogsReaderStates; - - public: - LogsReaderStateFindingDuplicates(LogsReaderStateContext& context); - 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(); - - 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(); -}; - -/** - * Modifying done state - */ -class LogsReaderStateModifyingDone : public LogsReaderStateBase -{ - friend class UT_LogsReaderStates; - - public: - LogsReaderStateModifyingDone(LogsReaderStateContext& context); - virtual ~LogsReaderStateModifyingDone(){} - - public: // From LogsReaderStateBase - 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 - - -// End of File - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/inc/logsremove.h --- a/logsui/logsengine/logssymbianos/inc/logsremove.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +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: -* -*/ -#ifndef LOGSREMOVE_H -#define LOGSREMOVE_H - -#include -#include -#include "logsmodel.h" - -// FORWARDS DECLARATIONS -class CLogClient; -class RFs; -class CLogViewRecent; - -// CLASS DECLARATION -class LogsRemoveObserver; -/** - * Clearing class. - */ -class LogsRemove : public CActive - { - public: - friend class UT_LogsRemove; - - /** - * Destructor - */ - ~LogsRemove(); - - LogsRemove( LogsRemoveObserver& observer, bool readingAllEvents = false ); - - - /** - * Initialize LogsRemove - * @return 0 if initialized succesfully - */ - int init(); - - bool clearList(LogsModel::ClearType cleartype); - - int clearEvents(const QList& eventIds, bool& async); - - protected: // from CActive - - void DoCancel(); - void RunL(); - TInt RunError(TInt aError); - - private: - - void initL(); - void clearEventsL(const QList& eventIds, bool& async); - bool DeleteNextEvent(); - - private: // data - LogsRemoveObserver& mObserver; - bool mReadingAllEvents; - - QList mRemovedEvents; - CLogClient* mLogClient; - CLogViewRecent* mRecentView; - RFs* mFsSession; - }; - - -#endif // LOGSREMOVE_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/inc/logsremoveobserver.h --- a/logsui/logsengine/logssymbianos/inc/logsremoveobserver.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +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: -* -*/ - -#ifndef LOGSREMOVEOBSERVER_H -#define LOGSREMOVEOBSERVER_H - -// INCLUDES - -// FORWARD DECLARATION - -// CLASS DECLARATION - -/** - * Reader observer interface - */ -class LogsRemoveObserver - { - - public: - - /** - * LogsRemove has completed removing. - */ - virtual void removeCompleted() = 0; - - /** - * Error occured while removing. - * @param err - */ - virtual void logsRemoveErrorOccured(int err) = 0; - - }; - -#endif // LOGSREMOVEOBSERVER_H - - -// End of File - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/src/logsdbconnector.cpp --- a/logsui/logsengine/logssymbianos/src/logsdbconnector.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,491 +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 FILES -#include "logsdbconnector.h" -#include "logsevent.h" -#include "logsengdefs.h" -#include "logsreader.h" -#include "logslogger.h" -#include "logsremove.h" -#include -#include -#include -#include - -// CONSTANTS - - -// ---------------------------------------------------------------------------- -// LogsDbConnector::LogsDbConnector -// ---------------------------------------------------------------------------- -// -LogsDbConnector::LogsDbConnector( QList& events, bool checkAllEvents ) -: QObject(), - mModelEvents( events ), - mCheckAllEvents( checkAllEvents ), - mLogClient( 0 ), - mReader( 0 ), - mLogsRemove( 0 ), - mRepository( 0 ) -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsDbConnector::LogsDbConnector()" ) - mFsSession = new RFs(); -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::~LogsDbConnector -// ---------------------------------------------------------------------------- -// -LogsDbConnector::~LogsDbConnector() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::~LogsDbConnector()" ) - - delete mReader; - delete mLogsRemove; - delete mLogClient; - if ( mFsSession ){ - mFsSession->Close(); - } - delete mFsSession; - - qDeleteAll( mEvents ); - qDeleteAll( mDuplicatedEvents ); - - delete mRepository; - - LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::~LogsDbConnector()" ) -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::init -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::init() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::init()" ) - - TRAPD( err, initL() ); - handleTemporaryError(err); - - LOGS_QDEBUG_2( "logs [ENG] <- LogsDbConnector::init(), err:", err ) - - return err; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::start -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::start() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::start()" ) - -#ifdef LOGSDBCONNECTOR_SIMULATION - - LOGS_QDEBUG( "logs [ENG] Simulation enabled" ) - int numEvents = 16; - QList indexes; - for ( int i = 0; i < numEvents; i++ ){ - QString number = QString("1223456%1").arg(i); - LogsEvent* event = new LogsEvent; - if ( i % 3 == 0 ){ - event->setDirection(LogsEvent::DirMissed); - number += QString("DirMissed"); - } - else if ( i % 2 == 0 ){ - event->setDirection(LogsEvent::DirIn); - number += QString("DirIn"); - } else { - event->setDirection(LogsEvent::DirOut); - number += QString("DirOut"); - } - event->setNumber(number); - mEvents.append(event); - mModelEvents.append(event); - indexes.append(i); - } - emit dataAdded( indexes ); - return 0; - -#endif - - if ( !mReader ){ - LOGS_QDEBUG( "logs [ENG] Not initialized, failure" ) - return -1; - } - int err = mReader->start(); - handleTemporaryError(err); - - LOGS_QDEBUG_2( "logs [ENG] <- LogsDbConnector::start(), err:", err ) - return err; -} - - -// ---------------------------------------------------------------------------- -// LogsDbConnector::updateDetails -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::updateDetails(bool clearCached) -{ - if ( !mReader ){ - LOGS_QDEBUG( "logs [ENG] Not initialized, failure" ) - return -1; - } - mReader->updateDetails(clearCached); - readCompleted( mEvents.count() ); //to notify of model update - return 0; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::stateChanged -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::initL() -{ - if ( mReader ){ - // Already initialized - return; - } - User::LeaveIfError( mFsSession->Connect() ); - mLogClient = CLogClient::NewL( *mFsSession ); - mLogsRemove = new LogsRemove( *this, mCheckAllEvents ); - - TLogString logString; - //Texts in LOGWRAP.RLS / LOGWRAP.RSS - User::LeaveIfError( mLogClient->GetString( logString, R_LOG_DIR_IN ) ); - mLogEventStrings.iInDirection = DESC_TO_QSTRING( logString ); - User::LeaveIfError( mLogClient->GetString( logString, R_LOG_DIR_OUT ) ); - mLogEventStrings.iOutDirection = DESC_TO_QSTRING( logString ); - User::LeaveIfError( mLogClient->GetString( logString, R_LOG_DIR_MISSED ) ); - mLogEventStrings.iMissedDirection = DESC_TO_QSTRING( logString ); - //"Unknown" (Logwrap.rls) - User::LeaveIfError( mLogClient->GetString( logString, R_LOG_REMOTE_UNKNOWN ) ); - mLogEventStrings.iUnKnownRemote = DESC_TO_QSTRING( logString ); - //"Incoming on alternate line" - User::LeaveIfError( mLogClient->GetString( logString, R_LOG_DIR_IN_ALT ) ); - mLogEventStrings.iInDirectionAlt = DESC_TO_QSTRING( logString ); - User::LeaveIfError( mLogClient->GetString( logString, R_LOG_DIR_OUT_ALT ) ); - mLogEventStrings.iOutDirectionAlt = DESC_TO_QSTRING( logString ); - User::LeaveIfError( mLogClient->GetString( logString, R_LOG_DIR_FETCHED) ); - mLogEventStrings.iFetched = DESC_TO_QSTRING( logString ); - - mReader = new LogsReader( - *mFsSession, *mLogClient, mLogEventStrings, mEvents, *this, mCheckAllEvents ); - - mRepository = CRepository::NewL( KCRUidLogs ); -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::clearList -// ---------------------------------------------------------------------------- -// -bool LogsDbConnector::clearList(LogsModel::ClearType cleartype) -{ - bool clearingStarted(false); - if ( mLogsRemove ){ - clearingStarted = mLogsRemove->clearList(cleartype); - } - return clearingStarted; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::clearEvent -// ---------------------------------------------------------------------------- -// -bool LogsDbConnector::clearEvents(const QList& eventIds) -{ - bool asyncClearingStarted(false); - if ( mLogsRemove ){ - bool async(false); - int err = mLogsRemove->clearEvents(eventIds, async); - asyncClearingStarted = ( !err && async ); - } - return asyncClearingStarted; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::markEventsSeen -// ---------------------------------------------------------------------------- -// -bool LogsDbConnector::markEventsSeen(const QList& eventIds) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::markEventsSeen()" ) - - if ( !mReader ){ - return false; - } - - foreach( int currId, eventIds ){ - if ( !mEventsSeen.contains(currId) ){ - mEventsSeen.append(currId); - } - } - - LOGS_QDEBUG_2( "logs [ENG] -> event ids:", mEventsSeen ); - - int err = doMarkEventSeen(); - LOGS_QDEBUG_2( "logs [ENG] <- LogsDbConnector::markEventsSeen(), marking err:", - err ) - return ( err == 0 ); -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::clearMissedCallsCounter -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::clearMissedCallsCounter() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::clearMissedCallsCounter()" ) - if ( !mRepository ){ - return -1; - } - TInt value(0); - int err = mRepository->Get( KLogsNewMissedCalls, value ); - if ( !err && value != 0 ){ - err = mRepository->Set( KLogsNewMissedCalls, 0 ); - } - LOGS_QDEBUG_2( "logs [ENG] <- LogsDbConnector::clearMissedCallsCounter(), err", err ) - return err; -} - -// ---------------------------------------------------------------------------- -// 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 -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::handleTemporaryError(int& error) -{ - if ( error == KErrAccessDenied ){ - LOGS_QDEBUG( - "logs [ENG] LogsDbConnector::handleTemporaryError, DB temp unavailable" ) - // TODO: handle temporary error in some meaningful way - error = 0; - } -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::deleteRemoved -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::deleteRemoved(int newEventCount) -{ - // Remove events which are not anymore in db nor in model, - // such events are always at end of list - while ( mEvents.count() > newEventCount ){ - delete mEvents.takeLast(); - } -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::removeCompleted -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::removeCompleted() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::removeCompleted()" ) - emit clearingCompleted(0); - LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::removeCompleted()" ) -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::logsRemoveErrorOccured -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::logsRemoveErrorOccured(int err) -{ - LOGS_QDEBUG_2( "logs [ENG] <-> LogsDbConnector::logsRemoveErrorOccured(), err:", err ) - - emit clearingCompleted(err); - // TODO: error handling - - LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::logsRemoveErrorOccured()" ) -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::readCompleted -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::readCompleted(int readCount) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::readCompleted()" ) - LOGS_QDEBUG_EVENT_ARR(mEvents) - - // Find out updated, added and removed events - mRemovedEventIndexes.clear(); - mUpdatedEventIndexes.clear(); - mAddedEventIndexes.clear(); - for ( int i = 0; i < mEvents.count(); i++ ){ - if ( !mEvents.at(i)->isInView() ){ - mRemovedEventIndexes.append( mEvents.at(i)->index() ); - } else if ( mEvents.at(i)->eventState() == LogsEvent::EventUpdated ) { - mUpdatedEventIndexes.append( mEvents.at(i)->index() ); - } else if ( mEvents.at(i)->eventState() == LogsEvent::EventAdded ) { - mAddedEventIndexes.append( mEvents.at(i)->index() ); - } - } - - bool doModelDataReset( !mRemovedEventIndexes.isEmpty() || - !mAddedEventIndexes.isEmpty() || - !mUpdatedEventIndexes.isEmpty() ); - if ( doModelDataReset ){ - mModelEvents.clear(); - int numValidEvents = qMin(mEvents.count(), readCount); - for ( int i = 0; i < numValidEvents; i++ ){ - mModelEvents.append(mEvents.at(i)); - } - } - - if ( !mRemovedEventIndexes.isEmpty() ){ - emit dataRemoved(mRemovedEventIndexes); - } - if ( !mAddedEventIndexes.isEmpty() ){ - emit dataAdded(mAddedEventIndexes); - } - if ( !mUpdatedEventIndexes.isEmpty() ){ - emit dataUpdated(mUpdatedEventIndexes); - } - - deleteRemoved(readCount); - - LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::readCompleted()" ) -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::errorOccurred -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::errorOccurred(int err) -{ - LOGS_QDEBUG_2( "logs [ENG] <-> LogsDbConnector::errorOccurred(), err:", err ) - - // TODO: error handling - - handleModifyingCompletion(err); - - Q_UNUSED(err) -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::temporaryErrorOccurred -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::temporaryErrorOccurred(int err) -{ - LOGS_QDEBUG_2( - "logs [ENG] -> LogsDbConnector::temporaryErrorOccurred(), err:", err ) - - handleTemporaryError(err); - - LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::temporaryErrorOccurred()" ) -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::eventModifyingCompleted -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::eventModifyingCompleted() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::eventModifyingCompleted()" ) - - if ( handleModifyingCompletion() ){ - // Possible to continue modifying - int err = doMarkEventSeen(); - if ( err != 0 ){ - // But failed for some reason - LOGS_QDEBUG( "logs [ENG] Couldn't continue modifying" ) - handleModifyingCompletion(err); - } - } - - LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::eventModifyingCompleted()" ) -} - -// ---------------------------------------------------------------------------- -// 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 -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::doMarkEventSeen() -{ - int err = -1; - if ( mEventsSeen.count() > 0 ){ - err = mReader->markEventSeen(mEventsSeen.at(0)); - } - return err; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::handleModifyingCompletion -// ---------------------------------------------------------------------------- -// -bool LogsDbConnector::handleModifyingCompletion(int err) -{ - bool continueModify( false ); - if ( err || mEventsSeen.count() == 1 ){ - mEventsSeen.clear(); - emit markingCompleted(err); - } else if ( mEventsSeen.count() > 1 ){ - // Item was modified succesfully and more to modify, remove handled - // item from queue - mEventsSeen.takeFirst(); - continueModify = true; - } else { - - } - return continueModify; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/src/logseventdataparser.cpp --- a/logsui/logsengine/logssymbianos/src/logseventdataparser.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,204 +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 FILES -#include "logseventdataparser.h" -#include "logseventdata.h" -#include -#include -#include -#include "LogsApiConsts.h" - - -// Separator for gprs data (old legacy non-tagged format for sent and -// received grps data) -_LIT8(KDataSeparator,","); - -// ---------------------------------------------------------------------------- -// LogsEventDataParser::parse -// ---------------------------------------------------------------------------- -// -int LogsEventDataParser::parse( - const CLogEvent& source, LogsEventData& dest ) -{ - // For SMS'es part data is packed into data field (by sms stack), so in - // this case there is no need to try to parse S60 specific data from it. - bool readMessageParts = ( - source.EventType() == KLogShortMessageEventTypeUid || - source.EventType() == KLogsEngMmsEventTypeUid ); - const TDesC8& data = source.Data(); - - //All default values must already be set in case there is no data in the - //event's data field. - dest.mIsCNAP = false; - dest.mIsVT = false; - dest.mIsVoIP = false; - dest.mIsPoC = false; - dest.mIsEmerg = false; - dest.mMsgPartsNumber = 0; //Meaningful only for sms - dest.mServiceId = 0; - dest.mContactLocalId = 0; - dest.mDataSent = 0; - dest.mDataReceived = 0; - dest.mRemoteUrl.clear(); - dest.mLocalUrl.clear(); - - // 1. Msg parts are written in different format in data field. - if( readMessageParts ) { - setMsgPartsNumber( data, dest ); - } - // 2. else check if the sent & received data is in old format (this can be - // removed when creating log data field entries is similar to format of - // other data field entries (i.e is tagged)) - else if ( !checkNonTaggedData( data, dest ) ) { - // 3. Otherwise check if tagged data is available. - checkTaggedData( data, dest ); - } - return 0; -} - -// ---------------------------------------------------------------------------- -// LogsEventDataParser::setMsgPartsNumber -// Read msg parts. They are written in format of TLogSmsPduData in Data field -// ---------------------------------------------------------------------------- -// -void LogsEventDataParser::setMsgPartsNumber( const TDesC8 &data, LogsEventData& dest ) -{ - TPckgBuf packedData; - packedData.Copy( data.Ptr(), sizeof( TLogSmsPduData ) ); - dest.mMsgPartsNumber = packedData().iTotal; -} - -// ---------------------------------------------------------------------------- -// LogsEventDataParser::checkNonTaggedData -// ---------------------------------------------------------------------------- -// -bool LogsEventDataParser::checkNonTaggedData( const TDesC8 &data, LogsEventData& dest ) -{ - if( data.Length() < 1 ) { - return false; - } - - //At least 1 byte of data available. Check does it begin with number. - TInt v; - TPtrC8 ptr( data.Left(1) ); - TLex8 lex = ptr; - if( lex.Val( v ) != KErrNone ) { - //First byte does not contain number - return false; - } - - //Ok, data begins with number. Try to read a pair of comma separated numbers - TInt separatorOffset = data.Find( KDataSeparator ); - if( separatorOffset + 1 > data.Length() || separatorOffset < 0 ) { - //No separator found. - return false; - } - - ptr.Set( data.Left( separatorOffset ) ); - lex = ptr; - lex.Val( dest.mDataSent ); - - if( (separatorOffset + 1) < data.Length() ){ - // Parse rest - ptr.Set( data.Mid(separatorOffset + 1, data.Length() - separatorOffset - 1) ); - lex = ptr; - lex.Val( dest.mDataReceived ); - } - - return true; -} - -// ---------------------------------------------------------------------------- -// LogsEventDataParser::checkTaggedData -// ---------------------------------------------------------------------------- -// -void LogsEventDataParser::checkTaggedData( const TDesC8 &data, LogsEventData& dest ) -{ - TPtrC8 dataPtr( data ); - TInt dataLeft = dataPtr.Length(); - while( dataLeft > 0 ){ - TInt nextTokenStart = dataPtr.Find( KLogsDataFldNameDelimiter() ); - if ( nextTokenStart > dataPtr.Length() || nextTokenStart < 0 ) { - nextTokenStart = dataPtr.Length(); - } - - TPtrC8 nameValue = dataPtr.Left( nextTokenStart ); - TPtrC8 name; - TPtrC8 value; - - TInt delimiterStart = nameValue.Find( KLogsDataFldValueDelimiter() ); - if( delimiterStart > dataPtr.Length() || delimiterStart < 0 ){ - name.Set( nameValue ); - //No value. Initialised to null in above (TPtrC8 value) - } else { - name.Set( dataPtr.Left( delimiterStart ) ); - TInt length = nameValue.Length() - delimiterStart - 1; - value.Set( dataPtr.Mid( delimiterStart + 1, length) ); - } - - // Below a minor attempt to slightly speed up the string comparisons: - // If value already found, no need to compare same name anymore. - // Most likely there is VT, VOIP or POC tag in the beginning of data - // field if any tags. - if( !dest.mIsVT && name.Compare( KLogsDataFldTag_VT ) == 0 ){ - dest.mIsVT = true; - } else if( !dest.mIsCNAP && name.Compare( KLogsDataFldTag_CNAP ) == 0 ){ - dest.mIsCNAP = true; - } else if( !dest.mIsEmerg && name.Compare( KLogsDataFldTag_Emergency ) == 0 ){ - dest.mIsEmerg = true; - } else if( !dest.mIsPoC && name.Compare( KLogsDataFldTag_POC ) == 0 ){ - dest.mIsPoC = true; - } else if( !dest.mIsVoIP && name.Compare( KLogsDataFldTag_IP ) == 0 ){ - dest.mIsVoIP = true; - } else if( !dest.mServiceId && name.Compare( KLogsDataFldTag_ServiceId ) == 0 ) { - TLex8 lex( value ); - TUint32 temp( 0 ); - TInt err = lex.Val( temp , EDecimal ); - if ( KErrNone == err ) { - //if an error occurred we leave the service id unchanged - dest.mServiceId = temp; - } - } else if ( !dest.mContactLocalId && - name.Compare( KLogsDataFldTag_ContactLink ) == 0 ) { - HBufC8* contactLink = value.AllocLC(); - TLex8 lex( contactLink->Des() ); - TUint32 temp( 0 ); - TInt err = lex.Val( temp , EDecimal ); - if ( KErrNone == err ) { - dest.mContactLocalId = temp; - } - CleanupStack::PopAndDestroy(contactLink); - - } else if ( dest.mRemoteUrl.isEmpty() && name.Compare( KLogsDataFldTag_URL ) == 0 ) { - // VoIP strips unneeded stuff from uri before writing the log - // event to db (it removes '<' '>', "sip:", and everything after ';', - // see svpsslogcall.cpp) so no need to postprocess. - dest.mRemoteUrl = QString::fromUtf8( (char*)value.Ptr(), value.Length() ); - } else if ( dest.mLocalUrl.isEmpty() && name.Compare( KLogsDataFldTag_MA ) == 0 ) { - dest.mLocalUrl = QString::fromUtf8( (char*)value.Ptr(), value.Length() ); - } - - //Process remaining data - dataLeft = dataPtr.Length() - nextTokenStart - 1; - if ( dataLeft > 0 ) { - //Continue with remaining data on the right side of token - nameValue.Set( dataPtr.Right( dataLeft ) ); - dataPtr.Set( nameValue ); - } - } -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/src/logseventparser.cpp --- a/logsui/logsengine/logssymbianos/src/logseventparser.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,176 +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 FILES -#include -#include -#include - -#include "logseventparser.h" -#include "logsevent.h" -#include "logseventdata.h" -#include "logsengdefs.h" -#include "LogsApiConsts.h" //Additional event UIDs -#include "logslogger.h" - - -// ---------------------------------------------------------------------------- -// LogsEventParser::parseL -// ---------------------------------------------------------------------------- -// -void LogsEventParser::parseL( - const CLogEvent& source, - LogsEvent& dest, - const LogsEventStrings& strings ) -{ - bool dataChanged = false; - - //Set remote party information - QString newRemoteParty = - QString::fromUtf16( source.RemoteParty().Ptr(), source.RemoteParty().Length() ); - if ( !isUnknownRemoteParty(dest, newRemoteParty) && - newRemoteParty != strings.iUnKnownRemote && - source.RemoteParty() != KLogsPrivateText && - source.RemoteParty() != KLogsPayphoneText ){ - dest.setRemoteParty( newRemoteParty ); - } - - dataChanged |= dest.setNumber( - QString::fromUtf16( source.Number().Ptr(), source.Number().Length() ) ); - - // Set direction - QString sourceDirection = - QString::fromUtf16( - source.Direction().Ptr(), source.Direction().Length() ); - - // TODO: it would be better to have symbian descriptors in strings arr so - // that symbian log event direction could be compared without conversion - LogsEvent::LogsDirection newDirection = LogsEvent::DirUndefined; - - if( sourceDirection == strings.iInDirection || - sourceDirection == strings.iInDirectionAlt ){ - newDirection = LogsEvent::DirIn; - } else if( sourceDirection == strings.iOutDirection || - sourceDirection == strings.iOutDirectionAlt ){ - newDirection = LogsEvent::DirOut; - } else if( sourceDirection == strings.iMissedDirection ){ - newDirection = LogsEvent::DirMissed; - } - dataChanged |= dest.setDirection(newDirection); - - dataChanged |= dest.setIsRead(source.Flags() & KLogEventRead); - - // Set time - TDateTime dateTime = source.Time().DateTime(); - QDate qDate( dateTime.Year(), dateTime.Month() + 1, dateTime.Day() + 1); - QTime qTime( dateTime.Hour(), dateTime.Minute(), dateTime.Second() ); - QDateTime qDateTime(qDate, qTime, Qt::UTC ); - dataChanged |= dest.setTime( qDateTime ); - - // Set duration (do not cause update even if duration changed) - if ( source.DurationType() == KLogDurationValid ){ - dest.setDuration(source.Duration()); - } - - int currLogId = dest.logId(); - int newLogId = source.Id(); - bool logIdChanged( currLogId != newLogId ); - if ( currLogId < 0 || logIdChanged ){ - dest.mEventState = LogsEvent::EventAdded; - } else if ( !logIdChanged && dataChanged ){ - dest.mEventState = LogsEvent::EventUpdated; - } else { - dest.mEventState = LogsEvent::EventNotUpdated; - } - dest.setLogId( newLogId ); // Store unique identifier - - LogsEventData* logsEventData = new LogsEventData(); - if ( logsEventData->parse(source) != 0 ){ - // Parsing failed, clear event data - delete logsEventData; - dest.setLogsEventData( 0 ); - } else { - dest.setLogsEventData( logsEventData ); //Ownership transferred - } - - // Resolve event type based on current event data - resolveEventType(dest); - - eventTypeSpecificParsing(dest); - - dest.setDuplicates( 0 ); - - if ( dest.validate() ) { - dest.setIsInView(true); // Important - } -} - -// ---------------------------------------------------------------------------- -// LogsEventParser::resolveEventType -// ---------------------------------------------------------------------------- -// -void LogsEventParser::resolveEventType(LogsEvent& dest) -{ - LogsEvent::LogsEventType type( LogsEvent::TypeVoiceCall ); - if ( dest.mLogsEventData ){ - if ( dest.mLogsEventData->isVoIP() ){ - type = LogsEvent::TypeVoIPCall; - } else if ( dest.mLogsEventData->isVT() ){ - type = LogsEvent::TypeVideoCall; - } else if ( dest.mLogsEventData->isPoC() ){ - // PoC not supported at the moment - type = LogsEvent::TypeUndefined; - } else if ( dest.mLogsEventData->msgPartsNumber() > 0 ){ - // Messages not supported at the moment - type = LogsEvent::TypeUndefined; - } - } - LOGS_QDEBUG_2( "LogsEventParser::resolveEventType, type:", type ) - dest.setEventType( type ); -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -void LogsEventParser::eventTypeSpecificParsing(LogsEvent& dest) -{ - if ( isUnknownRemoteParty(dest, dest.mRemoteParty) ) { - // Detect VoIP's strange unkown remote party handling - // and clear remote party value to treat unknown voip event - // same way as any other unknown event. - dest.mRemoteParty.clear(); - } -} - -// ---------------------------------------------------------------------------- -// VoIP uses remote url as remote party name in case of -// unknown remote party (probably because DB has to have some identifier -// in number or remote party fields). -// ---------------------------------------------------------------------------- -// -bool LogsEventParser::isUnknownRemoteParty(LogsEvent& dest, const QString& remoteParty) -{ - if ( dest.mEventType == LogsEvent::TypeVoIPCall && - dest.mLogsEventData && dest.mLogsEventData->remoteUrl() == remoteParty ){ - return true; - } - return false; -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/src/logsreader.cpp --- a/logsui/logsengine/logssymbianos/src/logsreader.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,664 +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 FILES -#include -#include -#include "logsreader.h" -#include "logsreaderobserver.h" -#include "logsevent.h" -#include "logsengdefs.h" -#include "logslogger.h" - -// CONSTANTS - -// ---------------------------------------------------------------------------- -// LogsReader::LogsReader -// ---------------------------------------------------------------------------- -// -LogsReader::LogsReader( - RFs& fsSession, - CLogClient& logClient, - LogsEventStrings& strings, - QList& events, - LogsReaderObserver& observer, - bool readAllEvents) - : CActive( EPriorityStandard ), - mLogViewRecent(0), - mLogViewEvent(0), - mDuplicatesView(0), - mFsSession(fsSession), - mLogClient(logClient), - mStrings(strings), - mEvents(events), - mObserver(observer), - mReadAllEvents(readAllEvents), - mIndex(0), - mCurrentStateIndex(0), - mCurrentStateMachine(0), - mCurrentEventId(-1) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReader::LogsReader()" ) - - TRAP_IGNORE( mLogClient.SetGlobalChangeObserverL( this ) ) - CActiveScheduler::Add( this ); - - initializeReadStates(); - - LOGS_QDEBUG( "logs [ENG] <- LogsReader::LogsReader()" ) -} - -// ---------------------------------------------------------------------------- -// LogsReader::~LogsReader -// ---------------------------------------------------------------------------- -// -LogsReader::~LogsReader() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReader::~LogsReader()" ) - - Cancel(); - qDeleteAll( mReadStates ); - qDeleteAll( mModifyingStates ); - qDeleteAll( mDuplicateReadingStates ); - delete mLogViewRecent; - delete mLogViewEvent; - delete mDuplicatesView; - qDeleteAll( mDuplicatedEvents ); - - LOGS_QDEBUG( "logs [ENG] <- LogsReader::~LogsReader()" ) -} - -// ---------------------------------------------------------------------------- -// LogsReader::start -// ---------------------------------------------------------------------------- -// -int LogsReader::start() - { - LOGS_QDEBUG( "logs [ENG] -> LogsReader::start()" ) - - TRAPD( err, startL() ); - - LOGS_QDEBUG_2( "logs [ENG] <- LogsReader::start(), err:", err ) - return err; - } - -// ---------------------------------------------------------------------------- -// LogsReader::stop -// ---------------------------------------------------------------------------- -// -void LogsReader::stop() - { - LOGS_QDEBUG( "logs [ENG] -> LogsReader::stop()" ) - - Cancel(); - - LOGS_QDEBUG( "logs [ENG] <- LogsReader::stop()" ) - } - -// ---------------------------------------------------------------------------- -// LogsReader::updateDetails -// ---------------------------------------------------------------------------- -// -void LogsReader::updateDetails(bool clearCached) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReader::updateDetails()" ) - foreach (LogsEvent* event, mEvents){ - event->prepareForContactMatching(); - } - if ( clearCached ) { - mContactCache.clear(); - } - LogsReaderStateFillDetails* fillDetailsState = - new LogsReaderStateFillDetails(*this); - fillDetailsState->fillDetails(); - delete fillDetailsState; - LOGS_QDEBUG( "logs [ENG] <- LogsReader::updateDetails()" ) -} - -// ---------------------------------------------------------------------------- -// LogsReader::markEventSeen -// ---------------------------------------------------------------------------- -// -int LogsReader::markEventSeen(int eventId) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsReader::markEventsSeen(), ids: ", eventId ) - TRAPD( err, markEventSeenL(eventId) ); - LOGS_QDEBUG_2( "logs [ENG] <- LogsReader::markEventsSeen(), err:", err ) - return err; -} - -// ---------------------------------------------------------------------------- -// 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 -// ---------------------------------------------------------------------------- -// -void LogsReader::RunL() -{ - LOGS_QDEBUG_3( "logs [ENG] -> LogsReader::RunL(), (state, status):", - mCurrentStateIndex, iStatus.Int() ) - - // Error handling in RunError - __ASSERT_ALWAYS( iStatus.Int() == KErrNone, User::Leave( iStatus.Int() ) ); - - if ( currentState().continueL() ){ - SetActive(); - } - - LOGS_QDEBUG( "logs [ENG] <- LogsReader::RunL()" ) -} - -// ---------------------------------------------------------------------------- -// LogsReader::RunError -// ---------------------------------------------------------------------------- -// -TInt LogsReader::RunError(TInt error) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsReader::RunError(), err:", error ) - - handleError(error); - - LOGS_QDEBUG( "logs [ENG] <- LogsReader::RunError()" ) - return KErrNone; -} - -// ---------------------------------------------------------------------------- -// LogsReader::DoCancel -// ---------------------------------------------------------------------------- -// -void LogsReader::DoCancel() -{ - logView().Cancel(); - mDuplicatesView->Cancel(); - mLogClient.Cancel(); -} - -// ---------------------------------------------------------------------------- -// LogsReader::startL -// ---------------------------------------------------------------------------- -// -void LogsReader::startL() -{ - prepareReadingL(); - - initializeReadStates(); - - if ( currentState().enterL() ){ - SetActive(); - } -} - -// ---------------------------------------------------------------------------- -// LogsReader::markEventSeenL -// ---------------------------------------------------------------------------- -// -void LogsReader::markEventSeenL(int eventId) -{ - prepareReadingL(); - - 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(); - - mCurrentEventId = eventId; - initializeDuplicateReadingStates(); - - if ( currentState().enterL() ){ - SetActive(); - } -} - -// ---------------------------------------------------------------------------- -// LogsReader::cancelCurrentRequestL -// ---------------------------------------------------------------------------- -// -void LogsReader::cancelCurrentRequestL() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReader::cancelCurrentRequestL()" ) - if ( IsActive() ) { - if (mCurrentStateMachine == &mReadStates || - mCurrentStateMachine == &mDuplicateReadingStates){ - LOGS_QDEBUG( "logs [ENG] reading is in progress, cancelling" ) - Cancel(); - } else if (mCurrentStateMachine == &mModifyingStates) { - LOGS_QDEBUG( "logs [ENG] <- LogsReader::removeEvent(), modifying is in progress, can't cancel" ) - User::Leave(KErrInUse); - } - } - - LOGS_QDEBUG( "logs [ENG] <- LogsReader::cancelCurrentRequestL()" ) -} - - - -// ---------------------------------------------------------------------------- -// LogsReader::HandleLogClientChangeEventL -// -// Called by Log Database engine when it notifies a change in database (e.g. -// Log database cleared) -// ---------------------------------------------------------------------------- -// -void LogsReader::HandleLogClientChangeEventL( -TUid aChangeType, -TInt /*aChangeParam1*/, -TInt /*aChangeParam2*/, -TInt /*aChangeParam3*/ ) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsReader::HandleLogClientChangeEventL()", - aChangeType.iUid ) - if( aChangeType == KLogClientChangeEventLogCleared ){ - handleViewChange(); - } - LOGS_QDEBUG( "logs [ENG] <- LogsReader::HandleLogClientChangeEventL()" ) -} - -// ---------------------------------------------------------------------------- -// LogsReader::HandleLogViewChangeEventAddedL -// Called by Log Database engine when it notifies us that it has added -// an event to database -// ---------------------------------------------------------------------------- -// -void LogsReader::HandleLogViewChangeEventAddedL( -TLogId /*aId*/, -TInt /*aViewIndex*/, -TInt /*aChangeIndex*/, -TInt aTotalChangeCount ) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsReader::HandleLogViewChangeEventAddedL()", - aTotalChangeCount ) - - //Comment: HandleLogViewChangeEventAddedL seems to be called only once - // (and aTotalChangeCount is 1) even if there are multiple entries added - // to database in a batch. This seems to happen at least in wins emulator - // in Symbian 80a_200432. If problems in this area or changed behaviour, - // we need to consider same kind of optimization to here as is in - //HandleLogViewChangeEventDeletedL - - handleViewChange(aTotalChangeCount); - LOGS_QDEBUG( "logs [ENG] <- LogsReader::HandleLogViewChangeEventAddedL()" ) -} - -// ---------------------------------------------------------------------------- -// LogsReader::HandleLogViewChangeEventChangedL -// Called by Log Database engine when it notifies us that it has -// changed an event in the database -// ---------------------------------------------------------------------------- -// -void LogsReader::HandleLogViewChangeEventChangedL( -TLogId /*aId*/, -TInt /*aViewIndex*/, -TInt /*aChangeIndex*/, -TInt aTotalChangeCount ) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsReader::HandleLogViewChangeEventChangedL()", - aTotalChangeCount ) - handleViewChange(aTotalChangeCount); - LOGS_QDEBUG( "logs [ENG] <- LogsReader::HandleLogViewChangeEventChangedL()" ) -} - -// ---------------------------------------------------------------------------- -// LogsReader::HandleLogViewChangeEventDeletedL -// Called by Log Database engine when it notifies us that it has deleted -// an event in the database -// ---------------------------------------------------------------------------- -// -void LogsReader::HandleLogViewChangeEventDeletedL( -TLogId /*aId*/, -TInt /*aViewIndex*/, -TInt aChangeIndex, -TInt aTotalChangeCount ) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsReader::HandleLogViewChangeEventDeletedL()", - aTotalChangeCount ) -LOGS_QDEBUG_2( "logs [ENG] -> LogsReader::HandleLogViewChangeEventDeletedL() aChangeIndex=", - aChangeIndex ) - // In order to prevent to re-reading the database multiple times, we call - // HandleViewChangeL only once. This is because HandleLogViewChangeEventDeletedL - // is called as many times as is the number of entries are deleted e.g. when - // deleteting old entries from database happens. However, aTotalChangeCount contains - // total number of deletions in a batch, so we can optimize the call to - // HandleViewChangeL to happen only even if we're called multiple times. - // Value of aChangeIndex is increasing from 0 to ( aTotalChangeCount - 1 ). - // we call HandleViewChangeL when the last notify has arrived. - -if ( aChangeIndex == ( aTotalChangeCount - 1 ) ) - { - LOGS_QDEBUG( "logs [ENG] <- LogsReader::HandleLogViewChangeEventDeletedL() handleViewChange" ) - handleViewChange(aTotalChangeCount); - } - - LOGS_QDEBUG( "logs [ENG] <- LogsReader::HandleLogViewChangeEventDeletedL()" ) -} - -// ---------------------------------------------------------------------------- -// LogsReader::setCurrentState -// ---------------------------------------------------------------------------- -// -void LogsReader::setCurrentState(const LogsReaderStateBase& state) -{ - bool found(false); - for( int i = 0; i < mCurrentStateMachine->count() && !found; i++ ){ - if ( mCurrentStateMachine->at(i) == &state ){ - mCurrentStateIndex = i; - found = true; - LOGS_QDEBUG_2( "logs [ENG] <-> LogsReader::setCurrentState, index:", - mCurrentStateIndex ) - } - } -} - -// ---------------------------------------------------------------------------- -// LogsReader::logView -// ---------------------------------------------------------------------------- -// -CLogView& LogsReader::logView() -{ - if ( mLogViewRecent ){ - return *mLogViewRecent; - } - return *mLogViewEvent; -} - -// ---------------------------------------------------------------------------- -// LogsReader::duplicatesView -// ---------------------------------------------------------------------------- -// -CLogViewDuplicate& LogsReader::duplicatesView() -{ - return *mDuplicatesView; -} - -// ---------------------------------------------------------------------------- -// LogsReader::events -// ---------------------------------------------------------------------------- -// -QList& LogsReader::events() -{ - return mEvents; -} - -// ---------------------------------------------------------------------------- -// LogsReader::index -// ---------------------------------------------------------------------------- -// -int& LogsReader::index() -{ - return mIndex; -} - -// ---------------------------------------------------------------------------- -// LogsReader::strings -// ---------------------------------------------------------------------------- -// -LogsEventStrings& LogsReader::strings() -{ - return mStrings; -} - -// ---------------------------------------------------------------------------- -// LogsReader::reqStatus -// ---------------------------------------------------------------------------- -// -TRequestStatus& LogsReader::reqStatus() -{ - return iStatus; -} - -// ---------------------------------------------------------------------------- -// LogsReader::observer -// ---------------------------------------------------------------------------- -// -LogsReaderObserver& LogsReader::observer() -{ - return mObserver; -} - -// ---------------------------------------------------------------------------- -// LogsReader::contactCache -// ---------------------------------------------------------------------------- -// -QHash& LogsReader::contactCache() -{ - return mContactCache; -} - -// ---------------------------------------------------------------------------- -// LogsReader::currentEventId -// ---------------------------------------------------------------------------- -// -int LogsReader::currentEventId() -{ - return mCurrentEventId; -} - -// ---------------------------------------------------------------------------- -// LogsReader::logClient -// ---------------------------------------------------------------------------- -// -CLogClient& LogsReader::logClient() -{ - return mLogClient; -} - -// ---------------------------------------------------------------------------- -// LogsReader::isRecentView -// ---------------------------------------------------------------------------- -// -bool LogsReader::isRecentView() -{ - return ( mLogViewRecent != 0 ); -} - -// ---------------------------------------------------------------------------- -// LogsReader::duplicatedEvents -// ---------------------------------------------------------------------------- -// -QList& LogsReader::duplicatedEvents() -{ - return mDuplicatedEvents; -} - -// ---------------------------------------------------------------------------- -// LogsReader::currentState -// ---------------------------------------------------------------------------- -// -LogsReaderStateBase& LogsReader::currentState() -{ - return *(mCurrentStateMachine->at(mCurrentStateIndex)); -} - -// ---------------------------------------------------------------------------- -// LogsReader::initializeReadStates -// ---------------------------------------------------------------------------- -// -void LogsReader::initializeReadStates() -{ - if ( mReadStates.count() == 0 ){ - - LogsReaderStateFiltering* filtering = createFilteringState(); - LogsReaderStateReading* reading = new LogsReaderStateReading(*this); - LogsReaderStateFillDetails* fillDetails = new LogsReaderStateFillDetails(*this); - LogsReaderStateDone* done = new LogsReaderStateDone(*this); - filtering->setNextState(*reading); - reading->setNextState(*fillDetails); - fillDetails->setNextState(*done); - mReadStates.append(filtering); - mReadStates.append(reading); - mReadStates.append(fillDetails); - mReadStates.append(done); - } - mCurrentStateMachine = &mReadStates; - setCurrentState(*mReadStates.at(0)); -} - -// ---------------------------------------------------------------------------- -// LogsReader::initializeDuplicateReadingStates -// ---------------------------------------------------------------------------- -// -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); - LogsReaderStateMarkingDuplicates* duplicates = - new LogsReaderStateMarkingDuplicates(*this); - LogsReaderStateModifyingDone* done = new LogsReaderStateModifyingDone(*this); - filtering->setNextState(*searching); - searching->setNextState(*duplicates); - duplicates->setNextState(*done); - mModifyingStates.append(filtering); - mModifyingStates.append(searching); - mModifyingStates.append(duplicates); - mModifyingStates.append(done); - } - mCurrentStateMachine = &mModifyingStates; - setCurrentState(*mModifyingStates.at(0)); -} - -// ---------------------------------------------------------------------------- -// LogsReader::handleViewChange -// ---------------------------------------------------------------------------- -// -void LogsReader::handleViewChange(int totalChangeCount) -{ - //we do not update view untill deletion is done - if ( totalChangeCount > 0 ){ - int err = start(); - handleError( err ); - } -} - -// ---------------------------------------------------------------------------- -// LogsReader::handleError -// ---------------------------------------------------------------------------- -// -void LogsReader::handleError(int error) -{ - if ( error == KErrAccessDenied || error == KErrInUse ){ - LOGS_QDEBUG( "logs [ENG] <-> LogsReader::handleError(), temp err" ) - mObserver.temporaryErrorOccurred(error); - } else if ( error != 0 ){ - LOGS_QDEBUG( "logs [ENG] <-> LogsReader::handleError(), fatal err" ) - mObserver.errorOccurred(error); - } -} - -// ---------------------------------------------------------------------------- -// LogsReader::createLogViewL -// ---------------------------------------------------------------------------- -// -void LogsReader::createLogViewL() -{ - if ( mReadAllEvents ){ - if ( !mLogViewEvent ){ - mLogViewEvent = CLogViewEvent::NewL( mLogClient, *this ); - } - } - else if ( !mLogViewRecent ) { - mLogViewRecent = CLogViewRecent::NewL( mLogClient, *this ); - } -} - -// ---------------------------------------------------------------------------- -// LogsReader::createFilteringState -// ---------------------------------------------------------------------------- -// -LogsReaderStateFiltering* LogsReader::createFilteringState() -{ - LogsReaderStateFiltering* filtering = 0; - if ( mReadAllEvents ) { - filtering = new LogsReaderStateFilteringAll(*this); - } - else { - filtering = new LogsReaderStateFiltering(*this); - } - return filtering; -} - -// ---------------------------------------------------------------------------- -// LogsReader::prepareReadingL -// ---------------------------------------------------------------------------- -// -void LogsReader::prepareReadingL() -{ - cancelCurrentRequestL(); - - createLogViewL(); - - if ( !mDuplicatesView ){ - mDuplicatesView = CLogViewDuplicate::NewL( mLogClient, *this ); - } - mIndex = 0; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/src/logsreaderstates.cpp --- a/logsui/logsengine/logssymbianos/src/logsreaderstates.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,811 +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 FILES -#include -#include -#include -#include "logsreaderstates.h" -#include "logsreaderstatecontext.h" -#include "logsevent.h" -#include "logseventdata.h" -#include "logsengdefs.h" -#include "logslogger.h" -#include "logsreaderobserver.h" -#include "logscommondata.h" - -// CONSTANTS - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::LogsReaderStateBase -// ---------------------------------------------------------------------------- -// -LogsReaderStateBase::LogsReaderStateBase( - LogsReaderStateContext& context) - : mContext(context), - mNextState(0) -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::~LogsReaderStateBase -// ---------------------------------------------------------------------------- -// -LogsReaderStateBase::~LogsReaderStateBase() -{ - -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFiltering::setNextState -// ---------------------------------------------------------------------------- -// -void LogsReaderStateBase::setNextState(LogsReaderStateBase& nextState) -{ - mNextState = &nextState; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFiltering::enterNextStateL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateBase::enterNextStateL() -{ - if ( mNextState ){ - mContext.setCurrentState(*mNextState); - return mNextState->enterL(); - } - return false; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::enterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateBase::enterL() -{ - return false; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::continueL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateBase::continueL() -{ - return false; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::viewCount -// ---------------------------------------------------------------------------- -// -int LogsReaderStateBase::viewCountL() const - { - return mContext.logView().CountL(); - } - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::event -// ---------------------------------------------------------------------------- -// -CLogEvent& LogsReaderStateBase::event() const - { - //The RVCT compiler provides warnings "type qualifier on return type is meaningless" - //for functions that return const values. In order to avoid these numerous warnings and - //const cascading, the CLogEvent is const_casted here. - return const_cast( mContext.logView().Event() ); - } - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::updateAndInsertEventL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateBase::updateAndInsertEventL( - const CLogEvent& source, LogsEvent* dest, int& eventIndex) -{ - Q_ASSERT( dest ); - dest->initializeEventL( source, mContext.strings() ); - dest->setIndex(eventIndex); - mContext.events().insert(eventIndex, dest); - eventIndex++; - return true; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::constructAndInsertEventL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateBase::constructAndInsertEventL( - const CLogEvent& source, LogsEvent* dest, int& eventIndex, QList& events) -{ - Q_ASSERT( dest ); - dest->initializeEventL( source, mContext.strings() ); - if ( !dest->validate() ){ - LOGS_QDEBUG( "LogsReaderStateBase::constructAndInsertEventL, event discarded" ) - delete dest; - return false; - } - dest->setIndex(eventIndex); - events.insert(eventIndex, dest); - eventIndex++; - return true; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::resetEvents -// ---------------------------------------------------------------------------- -// -void LogsReaderStateBase::resetEvents() -{ - QList &events = mContext.events(); - for ( int i = 0; i < events.count(); i++ ){ - events.at(i)->setIsInView(false); - } -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::takeMatchingEvent -// ---------------------------------------------------------------------------- -// -LogsEvent* LogsReaderStateBase::takeMatchingEvent(const CLogEvent& event) -{ - QList &events = mContext.events(); - for ( int i = 0; i < events.count(); i++ ){ - if ( events.at(i)->logId() == event.Id() ){ - return events.takeAt(i); - } - } - return 0; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::eventById -// ---------------------------------------------------------------------------- -// -LogsEvent* LogsReaderStateBase::eventById(int eventId) -{ - LogsEvent* event = 0; - QList &events = mContext.events(); - for ( int i = 0; i < events.count(); i++ ){ - if ( events.at(i)->logId() == eventId ){ - event = events.at(i); - break; - } - } - return event; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateBase::duplicatesL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateBase::duplicatesL(const CLogFilter* aFilter){ - bool gettingDuplicates( false ); - if ( mContext.isRecentView() ){ - if ( aFilter ){ - gettingDuplicates = - static_cast( mContext.logView() ).DuplicatesL( - mContext.duplicatesView(), *aFilter, mContext.reqStatus() ); - } else { - gettingDuplicates = - static_cast( mContext.logView() ).DuplicatesL( - mContext.duplicatesView(), mContext.reqStatus() ); - } - } - return gettingDuplicates; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFiltering::LogsReaderStateFiltering -// ---------------------------------------------------------------------------- -// -LogsReaderStateFiltering::LogsReaderStateFiltering( - LogsReaderStateContext& context ) - : LogsReaderStateBase(context), - mFilterList(0) -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFiltering::~LogsReaderStateFiltering -// ---------------------------------------------------------------------------- -// -LogsReaderStateFiltering::~LogsReaderStateFiltering() -{ - if ( mFilterList ){ - mFilterList->ResetAndDestroy(); - } - delete mFilterList; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFiltering::enterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateFiltering::enterL() -{ - // Filtering all recent calls (max number of recent events is configurable, - // see TLogConfig in logcli.h - // - LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateFiltering::enterL" ); - resetEvents(); - - CLogFilterList* filterList = new ( ELeave ) CLogFilterList; - CleanupStack::PushL(filterList); - CLogFilter* filter = CLogFilter::NewL(); - CleanupStack::PushL( filter ); - filter->SetEventType( KLogCallEventTypeUid ); - filterList->AppendL( filter ); - CleanupStack::Pop( filter ); - - if ( mFilterList ){ - mFilterList->ResetAndDestroy(); - delete mFilterList; - mFilterList = 0; - } - mFilterList = filterList; - CleanupStack::Pop(filterList); - - if ( setFilterL( *filterList ) ) { - return true; - } - - // Not possible to continue with filtering - return enterNextStateL(); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFiltering::continueL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateFiltering::continueL() -{ - return enterNextStateL(); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFiltering::setFilterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateFiltering::setFilterL(CLogFilterList& filterList){ - __ASSERT_ALWAYS( mContext.isRecentView(), User::Leave( KErrNotFound ) ); - return static_cast( mContext.logView() ).SetRecentListL( - KLogNullRecentList, filterList, mContext.reqStatus() ); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFiltering::LogsReaderStateFiltering -// ---------------------------------------------------------------------------- -// -LogsReaderStateFilteringAll::LogsReaderStateFilteringAll( - LogsReaderStateContext& context ) - : LogsReaderStateFiltering(context) -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFilteringAll::~LogsReaderStateFilteringAll -// ---------------------------------------------------------------------------- -// -LogsReaderStateFilteringAll::~LogsReaderStateFilteringAll() -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFilteringAll::setFilterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateFilteringAll::setFilterL(CLogFilterList& filterList){ - __ASSERT_ALWAYS( !mContext.isRecentView(), User::Leave( KErrNotFound ) ); - return static_cast( mContext.logView() ).SetFilterL( - filterList, mContext.reqStatus() ); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateReading::LogsReaderStateReading -// ---------------------------------------------------------------------------- -// -LogsReaderStateReading::LogsReaderStateReading( - LogsReaderStateContext& context ) - : LogsReaderStateBase(context), - mDuplicateMissedFilter(0), - mCheckingMissed(false), - mEventIndex(0), - mReadSizeCounter(0) -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateReading::~LogsReaderStateReading -// ---------------------------------------------------------------------------- -// -LogsReaderStateReading::~LogsReaderStateReading() -{ - delete mDuplicateMissedFilter; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateReading::enterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateReading::enterL() -{ - mCheckingMissed = false; - mEventIndex = 0; - mReadSizeCounter = 0; - - if ( !mDuplicateMissedFilter ){ - // Interested only about duplicates which are not marked as read - mDuplicateMissedFilter = CLogFilter::NewL(); - mDuplicateMissedFilter->SetFlags(KLogEventRead); - mDuplicateMissedFilter->SetNullFields(ELogFlagsField); - } - - if ( viewCountL() > 0 && mContext.logView().FirstL( mContext.reqStatus() ) ){ - return true; - } - - // Not possible to continue with reading - return enterNextStateL(); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateReading::continueL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateReading::continueL() -{ - int& index = mContext.index(); - QList &events = mContext.events(); - - if ( mCheckingMissed ) { - events.at(mEventIndex-1)->setDuplicates( - mContext.duplicatesView().CountL() ); - mCheckingMissed = false; - } - else { - const CLogEvent& sourceEvent = event(); - LogsEvent* event = takeMatchingEvent(sourceEvent); - bool inserted = false; - if ( event ){ - // Matching event is updated and put to new position - inserted = updateAndInsertEventL( sourceEvent, event, mEventIndex ); - } - else { - // Create new entry - event = new LogsEvent; - inserted = constructAndInsertEventL( - sourceEvent, event, mEventIndex, mContext.events() ); - } - - if ( inserted ){ - updateReadSizeCounter(*event); - if ( handleMissedL(*event) ){ - mCheckingMissed = true; - return true; - } - } - } - - index++; - if ( canContinueReadingL(index) ){ - return mContext.logView().NextL( mContext.reqStatus() ); - } - return enterNextStateL(); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateReading::handleMissedL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateReading::handleMissedL(LogsEvent& parsedEvent) -{ - bool handled = false; - if ( parsedEvent.direction() == LogsEvent::DirMissed ){ - handled = duplicatesL(mDuplicateMissedFilter); - } - return handled; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateReading::updateReadSizeCounter -// ---------------------------------------------------------------------------- -// -void LogsReaderStateReading::updateReadSizeCounter(LogsEvent& event) -{ - if ( LogsCommonData::getInstance().maxReadSize() >= 0 ){ - LogsEvent::LogsDirection dir = - LogsCommonData::getInstance().maxReadSizeDirection(); - if ( dir == LogsEvent::DirUndefined || dir == event.direction() ){ - mReadSizeCounter++; - } - } -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateReading::canContinueReadingL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateReading::canContinueReadingL(int index) const -{ - bool canContinue( index < viewCountL() ); - int maxReadSize = LogsCommonData::getInstance().maxReadSize(); - if ( canContinue && maxReadSize >= 0 ){ - canContinue = ( mReadSizeCounter < maxReadSize ); - } - return canContinue; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFillDetails::LogsReaderStateFillDetails -// ---------------------------------------------------------------------------- -// -LogsReaderStateFillDetails::LogsReaderStateFillDetails( - LogsReaderStateContext& context) - : LogsReaderStateBase(context) -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFillDetails::~LogsReaderStateFillDetails -// ---------------------------------------------------------------------------- -// -LogsReaderStateFillDetails::~LogsReaderStateFillDetails() -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFillDetails::enterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateFillDetails::enterL() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateFillDetails::enterL()" ) - fillDetails(); - LOGS_QDEBUG( "logs [ENG] <- LogsReaderStateFillDetails::enterL()" ) - return enterNextStateL(); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFillDetails::fillDetails -// ---------------------------------------------------------------------------- -// -void LogsReaderStateFillDetails::fillDetails() -{ - QHash& contactMappings = mContext.contactCache(); - QList &events = mContext.events(); - foreach ( LogsEvent* event, events ){ - const QString& num = event->getNumberForCalling(); - if ( !event->isInView() ){ - // Not interested about to be removed event - } else if ( contactMappings.contains(num) ) { - // Matching cached contact found, use that - LOGS_QDEBUG_2( "logs [ENG] Use existing contact for num:", num ) - ContactCacheEntry entry = contactMappings.value(num); - event->setRemoteParty( entry.mRemoteParty ); - event->setContactLocalId( entry.mContactLocalId ); - } else if ( event->remoteParty().length() == 0 ) { - // No remote party name, search for match from phonebook - QString contactNameStr = event->updateRemotePartyFromContacts( - LogsCommonData::getInstance().contactManager()); - if (contactNameStr.length() > 0){ - LOGS_QDEBUG_3( "LogsReaderStateFillDetails, (name, num):", - contactNameStr, num ); - // Cache the new contact name - ContactCacheEntry contactEntry(contactNameStr, event->contactLocalId()); - contactMappings.insert( num, contactEntry ); - } - } - } -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateDone::LogsReaderStateDone -// ---------------------------------------------------------------------------- -// -LogsReaderStateDone::LogsReaderStateDone( - LogsReaderStateContext& context ) - : LogsReaderStateBase(context) -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateDone::~LogsReaderStateDone -// ---------------------------------------------------------------------------- -// -LogsReaderStateDone::~LogsReaderStateDone() -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateDone::enterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateDone::enterL() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateDone::enterL" ); - - int numRead = qMin(mContext.index(),viewCountL()); - mContext.observer().readCompleted(numRead); - - LOGS_QDEBUG( "logs [ENG] <- LogsReaderStateDone::enterL" ); - - return false; -} - - -// ---------------------------------------------------------------------------- -// LogsReaderStateSearchingEvent::LogsReaderStateSearchingEvent -// ---------------------------------------------------------------------------- -// -LogsReaderStateSearchingEvent::LogsReaderStateSearchingEvent( - LogsReaderStateContext& context ) - : LogsReaderStateBase(context) -{ -} - - -// ---------------------------------------------------------------------------- -// LogsReaderStateSearchingEvent::enterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateSearchingEvent::enterL() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateSearchingEvent::enterL" ); - if ( viewCountL() > 0 && mContext.logView().FirstL( mContext.reqStatus() ) ){ - return true; - } - return enterNextStateL(); -} - - -// ---------------------------------------------------------------------------- -// LogsReaderStateSearchingEvent::continueL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateSearchingEvent::continueL() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateSearchingEvent::continueL" ); - int& index = mContext.index(); - if ( event().Id() != mContext.currentEventId() ) { - index++; - if ( index < viewCountL() ){ - return mContext.logView().NextL( mContext.reqStatus() ); - } - } - - return enterNextStateL(); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFindingDuplicates::LogsReaderStateFindingDuplicates -// ---------------------------------------------------------------------------- -// -LogsReaderStateFindingDuplicates::LogsReaderStateFindingDuplicates( - LogsReaderStateContext& context ) - : LogsReaderStateBase(context), - mDuplicateFilter(0) -{ -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFindingDuplicates::~LogsReaderStateFindingDuplicates -// ---------------------------------------------------------------------------- -// -LogsReaderStateFindingDuplicates::~LogsReaderStateFindingDuplicates() -{ - delete mDuplicateFilter; -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFindingDuplicates::enterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateFindingDuplicates::enterL() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateFindingDuplicates::enterL" ); - - 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 finding - return enterNextStateL(); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateFindingDuplicates::continueL -// ---------------------------------------------------------------------------- -// -bool 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" ); - - 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) -{ -} - -// ---------------------------------------------------------------------------- -// 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(); -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateModifyingDone::LogsReaderStateModifyingDone -// ---------------------------------------------------------------------------- -// -LogsReaderStateModifyingDone::LogsReaderStateModifyingDone( - LogsReaderStateContext& context) : LogsReaderStateBase(context) -{ - -} - -// ---------------------------------------------------------------------------- -// LogsReaderStateModifyingDone::enterL -// ---------------------------------------------------------------------------- -// -bool LogsReaderStateModifyingDone::enterL() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateModifyingDone::enterL" ); - - 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. - modifiedEvent->markedAsSeenLocally(true); - } - mContext.observer().eventModifyingCompleted(); - - LOGS_QDEBUG( "logs [ENG] <- LogsReaderStateModifyingDone::enterL" ); - - 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 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/src/logsremove.cpp --- a/logsui/logsengine/logssymbianos/src/logsremove.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,220 +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: -* -*/ - -//USER -#include "logsremove.h" -#include "logsmodel.h" -#include "logslogger.h" -#include "logsremoveobserver.h" -#include -#include -#include -//SYSTEM - -// CONSTANTS -_LIT( KMaxLogsTime, "99991130:235959.999999"); - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsRemove::LogsRemove( LogsRemoveObserver& observer, bool readingAllEvents ) -: CActive(EPriorityStandard), - mObserver(observer), - mReadingAllEvents(readingAllEvents), - mLogClient(0), - mRecentView(0) -{ - CActiveScheduler::Add( this ); - mFsSession = new RFs(); -} - -// ----------------------------------------------------------------------------- -// LogsRemove::~LogsRemove -// ----------------------------------------------------------------------------- -// -LogsRemove::~LogsRemove() -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsRemove::~LogsRemove()" ) - Cancel(); - delete mRecentView; - delete mLogClient; - if ( mFsSession ){ - mFsSession->Close(); - } - delete mFsSession; -} - -// ---------------------------------------------------------------------------- -// LogsRemove::RunL -// ---------------------------------------------------------------------------- -// -void LogsRemove::RunL() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsRemove::RunL()->" ) - if (iStatus.Int() == KErrNone){ - LOGS_QDEBUG( "logs [ENG] -> LogsRemove::RunL() KErrNone" ) - if ( !DeleteNextEvent() ){ - mObserver.removeCompleted(); - } - } - else { - User::Leave( iStatus.Int() ); - LOGS_QDEBUG( "logs [ENG] -> LogsRemove::RunL() !KErrNone" ) - } - LOGS_QDEBUG( "logs [ENG] <- LogsRemove::RunL()<-" ) -} - -// ---------------------------------------------------------------------------- -// LogsRemove::DoCancel -// ---------------------------------------------------------------------------- -// -void LogsRemove::DoCancel() -{ - if ( mLogClient ){ - mLogClient->Cancel(); - } -} - -// ---------------------------------------------------------------------------- -// LogsRemove::RunError -// ---------------------------------------------------------------------------- -// -TInt LogsRemove::RunError(TInt aError) -{ - mObserver.logsRemoveErrorOccured(aError); - return KErrNone; -} - - -// ---------------------------------------------------------------------------- -// LogsRemove::init -// ---------------------------------------------------------------------------- -// -int LogsRemove::init() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsRemove::init()" ) - TRAPD( err, initL() ); - LOGS_QDEBUG_2( "logs [ENG] <- LogsRemove::init(), err:", err ) - return err; -} - - -// ---------------------------------------------------------------------------- -// LogsRemove::clearList -// ---------------------------------------------------------------------------- -// -bool LogsRemove::clearList(LogsModel::ClearType cleartype) -{ - LOGS_QDEBUG( "logs [ENG] <- LogsRemove::clearList->" ) - if ( init() != KErrNone ) { - return false; - } - bool clearingStarted(false); - TTime time( KMaxLogsTime ); - if ( !IsActive() ){ - if (cleartype == LogsModel::TypeLogsClearAll){ - mLogClient->ClearLog( time, iStatus ); - } - else{ - mLogClient->ClearLog( cleartype, iStatus ); - } - SetActive(); - clearingStarted = true; - } else { - } - LOGS_QDEBUG_2( "logs [ENG] <- LogsRemove::clearList, started", clearingStarted ) - return clearingStarted; -} - -// ---------------------------------------------------------------------------- -// LogsRemove::initL -// ---------------------------------------------------------------------------- -// -void LogsRemove::initL() -{ - if ( mLogClient ){ - // Already initialized - return; - } - User::LeaveIfError( mFsSession->Connect() ); - mLogClient = CLogClient::NewL( *mFsSession ); -} - - -// ---------------------------------------------------------------------------- -// LogsRemove::clearEvents -// ---------------------------------------------------------------------------- -// -int LogsRemove::clearEvents(const QList& eventIds, bool& async) -{ - TRAPD( err, clearEventsL(eventIds, async) ); - return err; -} - -// ---------------------------------------------------------------------------- -// LogsRemove::clearEventsL -// ---------------------------------------------------------------------------- -// -void LogsRemove::clearEventsL(const QList& eventIds, bool& async) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsRemove::clearEventL()") - - async = false; - - initL(); - - if ( mReadingAllEvents ){ - // When all events are read, recent view cannot be used for - // event removal. - Cancel(); - mRemovedEvents = eventIds; - async = DeleteNextEvent(); - } else { - if ( !mRecentView ) { - mRecentView = CLogViewRecent::NewL( *mLogClient ); - } - foreach( int currId, eventIds ){ - LOGS_QDEBUG_2( "logs [ENG] Removing, currid: ", currId ) - mRecentView->RemoveL( currId ); - } - delete mRecentView; - mRecentView = NULL; - } - - LOGS_QDEBUG_2( "logs [ENG] <- LogsRemove::clearEventL(): async", async ) -} - -// ---------------------------------------------------------------------------- -// LogsRemove::DeleteNextEvent -// ---------------------------------------------------------------------------- -// -bool LogsRemove::DeleteNextEvent() -{ - bool deleting(false); - if ( !mRemovedEvents.isEmpty() ){ - int currId = mRemovedEvents.takeFirst(); - LOGS_QDEBUG_2( "logs [ENG] LogsRemove::DeleteNextEvent, id: ", currId ) - mLogClient->DeleteEvent( currId, iStatus ); - SetActive(); - deleting = true; - } - return deleting; -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/stubs/centralrepository_stub.cpp --- a/logsui/logsengine/logssymbianos/tsrc/stubs/centralrepository_stub.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -/* -* Copyright (c) 2005 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 "centralrepository_stub_helper.h" - -TInt mFailCode = KErrNone; -TInt mCurrentVal = 0; - -void CentralRepositoryStubHelper::reset() -{ - mFailCode = KErrNone; - mCurrentVal = 0; -} -void CentralRepositoryStubHelper::setFailCode(TInt err) -{ - mFailCode = err; -} -void CentralRepositoryStubHelper::setCurrentVal(TInt val) -{ - mCurrentVal = val; -} -TInt CentralRepositoryStubHelper::currentVal() -{ - return mCurrentVal; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -EXPORT_C CRepository* CRepository::NewL( TUid aRepositoryUid ) - { - CRepository* self = CRepository::NewLC( aRepositoryUid ); - CleanupStack::Pop( self ); - return self; - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -CRepository* CRepository::NewLC( TUid aRepositoryUid ) - { - CRepository* self = new (ELeave) CRepository(); - CleanupStack::PushL( self ); - return self; - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -CRepository::~CRepository() - { - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -TInt CRepository::Get(TUint32 aKey, TInt& aValue) - { - aValue = mCurrentVal; - return mFailCode; - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -TInt CRepository::Set(TUint32 aKey, TInt aValue) - { - if ( mFailCode == KErrNone ) - { - mCurrentVal = aValue; - } - return mFailCode; - } - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/stubs/centralrepository_stub_helper.h --- a/logsui/logsengine/logssymbianos/tsrc/stubs/centralrepository_stub_helper.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* -* Copyright (c) 2004-2006 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 __CENTRALREPOSITORYHELPER_H__ -#define __CENTRALREPOSITORYHELPER_H__ - -class CentralRepositoryStubHelper{ - -public: // Stub data - - static void reset(); - static void setFailCode(TInt err); - static void setCurrentVal(TInt val); - static TInt currentVal(); - -}; - -#endif // __CENTRALREPOSITORYHELPER_H__ diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs.cpp --- a/logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,475 +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 "logclient_stubs_helper.h" - -bool stubAsyncCallPossible = true; -int stubViewCount = 1; -int stubLeaveWithError = KErrNone; -int stubViewFlagsValue = 0; - -// ---------------------------------------------------------------------------- -// LogClientStubsHelper -// ---------------------------------------------------------------------------- -// -void LogClientStubsHelper::reset() -{ - stubAsyncCallPossible = true; - stubLeaveWithError = KErrNone; - stubViewFlagsValue = 0; -} - -void LogClientStubsHelper::createEvents(int numEvents) -{ - -} - -void LogClientStubsHelper::setStubAsyncCallPossible(bool asyncPossible) -{ - stubAsyncCallPossible = asyncPossible; -} - -void LogClientStubsHelper::setViewCount(int viewCount) -{ - stubViewCount = viewCount; -} - -void LogClientStubsHelper::setLeaveWithError(int error) -{ - stubLeaveWithError = error; -} - -int LogClientStubsHelper::stubViewFlags() -{ - return stubViewFlagsValue; -} - -// ---------------------------------------------------------------------------- -// CLogActive -// ---------------------------------------------------------------------------- -// -CLogActive::~CLogActive() -{ -} - -CLogActive::CLogActive(TInt aPriority) : CActive( aPriority ) -{ - -} -void CLogActive::DoCancel() -{ - -} -void CLogActive::RunL() -{ - -} -void CLogActive::DoComplete(TInt&) -{ - -} - -// ---------------------------------------------------------------------------- -// CLogBase -// ---------------------------------------------------------------------------- -// -CLogBase::CLogBase(TInt aPriority) : CLogActive( aPriority ) -{ - -} -CLogBase::~CLogBase() -{ - -} - -TInt CLogBase::GetString(TDes& aString, TInt /*aId*/) const -{ - aString.Copy( _L("dummy_stub_string") ); - return KErrNone; -} - -void CLogBase::GetEvent(CLogEvent& /*aEvent*/, TRequestStatus& /*aStatus*/) -{ - -} -void CLogBase::AddEvent(CLogEvent& /*aEvent*/, TRequestStatus& /*aStatus*/) -{ - -} -void CLogBase::ChangeEvent(const CLogEvent& /*aEvent*/, TRequestStatus& /*aStatus*/) -{ - -} -void CLogBase::DeleteEvent(TLogId /*aId*/, TRequestStatus& /*aStatus*/) -{ - -} -void CLogBase::DoRunL() -{ - -} -void CLogBase::CLogBase_Reserved1() -{ - -} - -// ---------------------------------------------------------------------------- -// CLogClient -// ---------------------------------------------------------------------------- -// -CLogClient* CLogClient::NewL(RFs& aFs, TInt aPriority) -{ - User::LeaveIfError(stubLeaveWithError); - CLogClient* self = new ( ELeave ) CLogClient(aFs, aPriority); - return self; -} - -CLogClient::CLogClient(RFs& aFs, TInt aPriority) : CLogBase(aPriority), iFs( aFs ) -{ -} -CLogClient::~CLogClient() -{ - -} - -void CLogClient::SetGlobalChangeObserverL(MLogClientChangeObserver* /*aObserver*/) -{ - -} - -TInt CLogClient::GetString(TDes& aString, TInt /*aId*/) const -{ - aString.Copy( _L("dummy_stub") ); - return KErrNone; -} - -void CLogClient::AddEvent(CLogEvent& /*aEvent*/, TRequestStatus& /*aStatus*/) -{ - -} -void CLogClient::GetEvent(CLogEvent& /*aEvent*/, TRequestStatus& /*aStatus*/) -{ - -} -void CLogClient::ChangeEvent(const CLogEvent& /*aEvent*/, TRequestStatus& /*aStatus*/) -{ - -} -void CLogClient::DeleteEvent(TLogId /*aId*/, TRequestStatus& aStatus) -{ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); -} - -void CLogClient::DoRunL() -{ - -} -void CLogClient::DoCancel() -{ - -} - -void CLogClient::ClearLog(const TTime& /*aDate*/, TRequestStatus& aStatus) -{ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); -} - -void CLogClient::ClearLog(TInt /*aRecentList*/, TRequestStatus& aStatus) -{ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); -} - -void CLogClient::CLogBase_Reserved1() -{ - -} - -// ---------------------------------------------------------------------------- -// CLogFilterList -// ---------------------------------------------------------------------------- -// -CLogFilterList::CLogFilterList() : CArrayPtrFlat( 4 ) -{ - -} - -// ---------------------------------------------------------------------------- -// CLogFilter -// ---------------------------------------------------------------------------- -// -CLogFilter* CLogFilter::NewL() -{ - return new ( ELeave ) CLogFilter; -} -CLogFilter::~CLogFilter() -{ - -} - -CLogFilter::CLogFilter() -{ - -} - -// ---------------------------------------------------------------------------- -// CLogView -// ---------------------------------------------------------------------------- -// -CLogView::~CLogView() -{ - delete iEvent; -} - -TBool CLogView::FirstL(TRequestStatus& aStatus) -{ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); - return ETrue; -} - -TBool CLogView::NextL(TRequestStatus& aStatus) -{ - if ( stubAsyncCallPossible ){ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); - } - return stubAsyncCallPossible; -} - -TInt CLogView::CountL() -{ - return stubViewCount; -} - -CLogView::CLogView(CLogClient& aClient, TInt aPriority) - : CLogActive( aPriority ), iClient( aClient ) -{ - TRAP_IGNORE( iEvent = CLogEvent::NewL() ) -} - -void CLogView::DoRunL() -{ - -} - -void CLogView::DoCancel() -{ - -} - -void CLogView::SetFlagsL(TLogFlags aFlags) -{ - stubViewFlagsValue = aFlags; -} - -// ---------------------------------------------------------------------------- -// CLogViewRecent -// ---------------------------------------------------------------------------- -// -CLogViewRecent* CLogViewRecent::NewL(CLogClient& aClient, TInt aPriority) -{ -return new ( ELeave ) CLogViewRecent(aClient, aPriority ); -} -CLogViewRecent* CLogViewRecent::NewL( - CLogClient& aClient, MLogViewChangeObserver& /*aObserver*/, TInt aPriority) -{ - return new ( ELeave ) CLogViewRecent(aClient, aPriority ); -} -CLogViewRecent::~CLogViewRecent() -{ - -} - -CLogViewRecent::CLogViewRecent(CLogClient& aClient, TInt aPriority) - : CLogView( aClient, aPriority ) -{ - -} -TBool CLogViewRecent::SetRecentListL(TLogRecentList aList, TRequestStatus& aStatus) -{ - iRecentList = aList; - if ( stubAsyncCallPossible ){ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); - } - return stubAsyncCallPossible; -} -TBool CLogViewRecent::SetRecentListL( - TLogRecentList aList, const CLogFilter& /*aFilter*/, TRequestStatus& aStatus) -{ - iRecentList = aList; - if ( stubAsyncCallPossible ){ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); - } - return stubAsyncCallPossible; -} -TBool CLogViewRecent::SetRecentListL( - TLogRecentList aList, const CLogFilterList& /*aFilterList*/, TRequestStatus& aStatus) -{ - iRecentList = aList; - if ( stubAsyncCallPossible ){ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); - } - return stubAsyncCallPossible; -} - -void CLogViewRecent::DoRunL() -{ - -} - -TBool CLogViewRecent::DuplicatesL(CLogViewDuplicate& /*aView*/, TRequestStatus& aStatus) -{ - if ( stubAsyncCallPossible ){ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); - } - return stubAsyncCallPossible; -} - -TBool CLogViewRecent::DuplicatesL(CLogViewDuplicate &/*aView*/, const CLogFilter &/*aFilter*/, TRequestStatus &aStatus) -{ - if ( stubAsyncCallPossible ){ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); - } - return stubAsyncCallPossible; -} - -void CLogViewRecent::RemoveL(TLogId /*aId*/) -{ - -} - -// ---------------------------------------------------------------------------- -// CLogViewEvent -// ---------------------------------------------------------------------------- -// -CLogViewEvent* CLogViewEvent::NewL(CLogClient& aClient, TInt aPriority) -{ - CLogViewEvent* self = new (ELeave) CLogViewEvent(aClient, aPriority); - return self; -} -CLogViewEvent* CLogViewEvent::NewL( - CLogClient& aClient, MLogViewChangeObserver& /*aObserver*/, TInt aPriority) -{ - CLogViewEvent* self = new (ELeave) CLogViewEvent(aClient, aPriority); - return self; -} -CLogViewEvent::~CLogViewEvent() -{ - -} -TBool CLogViewEvent::SetFilterL(const CLogFilterList& /*aFilterList*/, TRequestStatus& aStatus) -{ - if ( stubAsyncCallPossible ){ - aStatus = KRequestPending; - User::RequestComplete( &aStatus, KErrNone ); - } - return stubAsyncCallPossible; -} -CLogViewEvent::CLogViewEvent(CLogClient& aClient, TInt aPriority) : - CLogView(aClient, aPriority) -{ -} - -// ---------------------------------------------------------------------------- -// CLogViewDuplicate -// ---------------------------------------------------------------------------- -// -CLogViewDuplicate* CLogViewDuplicate::NewL( - CLogClient& aClient, TInt aPriority) -{ - return new ( ELeave ) CLogViewDuplicate(aClient, aPriority ); -} - -CLogViewDuplicate* CLogViewDuplicate::NewL( - CLogClient& aClient, MLogViewChangeObserver& /*aObserver*/, TInt aPriority) -{ - return new ( ELeave ) CLogViewDuplicate(aClient, aPriority ); -} - -CLogViewDuplicate::~CLogViewDuplicate() -{ - -} - -CLogViewDuplicate::CLogViewDuplicate(CLogClient& aClient, TInt aPriority) : - CLogView(aClient, aPriority) -{ - -} - -// ---------------------------------------------------------------------------- -// CLogEvent -// ---------------------------------------------------------------------------- -// -CLogEvent* CLogEvent::NewL() -{ - CLogEvent* self = new ( ELeave ) CLogEvent; - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; -} - -void CLogEvent::ConstructL() -{ - iNumber = HBufC::NewL( 200 ); - iDirection = HBufC::NewL( 200 ); - iRemoteParty = HBufC::NewL( 200 ); -} -CLogEvent::~CLogEvent() -{ - delete iNumber; - delete iDirection; - delete iData; - delete iRemoteParty; -} -CLogEvent::CLogEvent() -{ - -} - -void CLogEvent::SetDataL(const TDesC8& aData) -{ - HBufC8* data = aData.AllocL(); - delete iData; - iData = data; -} - -// ---------------------------------------------------------------------------- -// MLogClientChangeObserver -// ---------------------------------------------------------------------------- -// -void MLogClientChangeObserver::MLogClientChangeObserver_Reserved1() -{ - -} -void MLogClientChangeObserver::MLogClientChangeObserver_Reserved2() -{ - -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs_helper.h --- a/logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs_helper.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +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: -* -*/ - -/** -* Helper class to control logcli stub behavior -* -*/ -class LogClientStubsHelper{ - public: - static void reset(); - static void createEvents(int numEvents); - static void setStubAsyncCallPossible(bool asyncPossible); - static void setViewCount(int viewCount); - static void setLeaveWithError(int error); - static int stubViewFlags(); -}; diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs.cpp --- a/logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,267 +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 -#include -#include -#include -#include -#include "qtcontacts_stubs_helper.h" - -QTM_USE_NAMESPACE - -QString logsTestNumber = ""; -QContactLocalId logsTestContactId = 0; -QContactLocalId logsTestContactLocalId = 0; -QString logsTestAvatar = ""; -QString logsFirstName = ""; -QString logsLastName = ""; -Q_DECLARE_METATYPE(QContactAvatar *) - -void QtContactsStubsHelper::reset() -{ - logsTestNumber = ""; - logsTestContactId = 0; - logsTestContactLocalId = 0; - logsFirstName = ""; - logsLastName = ""; -} - -void QtContactsStubsHelper::setContactId(int id) -{ - logsTestContactId = id; -} - -void QtContactsStubsHelper::setContactNames(const QString& first, const QString& last) -{ - logsFirstName = first; - logsLastName = last; -} - -// ---------------------------------------------------------------------------- -// QContactData -// ---------------------------------------------------------------------------- -// - -class QtMobility::QContactData : public QSharedData -{ -public: - QContactData(): QSharedData() - { - } - - ~QContactData() {} -}; - -class QtMobility::QContactDetailPrivate : public QSharedData -{ -public: - QContactDetailPrivate(): QSharedData() - { - } - - ~QContactDetailPrivate() {} -}; - -// ---------------------------------------------------------------------------- -// QContactManager -// ---------------------------------------------------------------------------- -// -QContactManager::QContactManager( - const QString& managerName, const QMap& parameters, QObject* parent) -{ - Q_UNUSED(managerName) - Q_UNUSED(parameters) - Q_UNUSED(parent) -} - -QContactManager::~QContactManager() -{ - -} - -QList QContactManager::contacts( - 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; -} - -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; - } - return contact; -} - - -// ---------------------------------------------------------------------------- -// QContactDetailFilter -// ---------------------------------------------------------------------------- -// -QContactDetailFilter::QContactDetailFilter() -{ - -} - -void QContactDetailFilter::setDetailDefinitionName( - const QString& definition, const QString& fieldName) -{ - -} -void QContactDetailFilter::setMatchFlags(QContactFilter::MatchFlags flags) -{ - Q_UNUSED(flags) -} -void QContactDetailFilter::setValue(const QVariant& value) -{ - logsTestNumber = value.toString(); -} - -// ---------------------------------------------------------------------------- -// QContact -// ---------------------------------------------------------------------------- -// -QContact::QContact() : d(new QContactData) -{ - -} - -QContact::~QContact() -{ - -} - - -QContact& QContact::operator=(const QContact& other) -{ - Q_UNUSED(other) -} - -QContactDetail QContact::detail(const QString& definitionId) const -{ - if ( definitionId == QContactName::DefinitionName ){ - QContactName name; - return name; - } else if ( definitionId == QContactPhoneNumber::DefinitionName ){ - QContactPhoneNumber number; - return number; - } - else if ( definitionId == QContactAvatar::DefinitionName){ - QContactAvatar avatar; - avatar.setSubType(QContactAvatar::SubTypeImage); - avatar.setAvatar("c:\\data\\images\\logstest1.jpg"); - return avatar; - } - QContactDetail detail; - return detail; -} - -bool QContact::saveDetail(QContactDetail* detail) - { - return true; - } - -bool QContact::removeDetail(QContactDetail* detail) - { - return true; - } - - -QContactLocalId QContact::localId() const -{ - return logsTestContactLocalId; -} - - -// ---------------------------------------------------------------------------- -// QContactDetail -// ---------------------------------------------------------------------------- -// -QContactDetail::QContactDetail() -{ - -} -QContactDetail::QContactDetail(const QString& definitionName) : d(new QContactDetailPrivate) -{ - Q_UNUSED(definitionName) -} -QContactDetail::~QContactDetail() -{ - -} - - -QContactDetail& QContactDetail::operator=(const QContactDetail& other) -{ - Q_UNUSED(other) -} - -QString QContactDetail::definitionName() const -{ - return QString(""); -} - -bool QContactDetail::isEmpty() const -{ - return false; -} - - -QVariant QContactDetail::variantValue(const QString& key) const -{ - QString val = value(key); - return val; -} - -QString QContactDetail::value(const QString& key) const -{ - if ( key == QContactName::FieldFirst ){ - return logsFirstName; - } else if ( key == QContactName::FieldLast ) { - return logsLastName; - } else if ( key == QContactPhoneNumber::FieldNumber ) { - return QString( "12345" ); - } - else if ( key == QContactAvatar::FieldAvatar){ - return QString( "Avatar" ); - } - return QString(""); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs_helper.h --- a/logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs_helper.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +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: -* -*/ - -/** -* Helper class to control qtcontacts stub behavior -* -*/ -class QtContactsStubsHelper{ - public: - static void reset(); - static void setContactId(int id); - static void setContactNames(const QString& first, const QString& last); -}; diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsdbconnector.h --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsdbconnector.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +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: -* -*/ -#ifndef UT_LOGSDBCONNECTOR_H -#define UT_LOGSDBCONNECTOR_H - -#include -#include - -class LogsDbConnector; -class LogsEvent; - -class UT_LogsDbConnector : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testInit(); - void testClearList(); - void testClearEvents(); - void testMarkEventsSeen(); - void testReadDuplicates(); - void testStart(); - void testReadCompleted(); - void testErrorOccurred(); - void testUpdateDetails(); - void testClearMissedCallsCounter(); - -private: - - LogsDbConnector* mDbConnector; - QList mEvents; - -}; - - -#endif //UT_LOGSDBCONNECTOR_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logseventdataparser.h --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logseventdataparser.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSEVENTDATAPARSER_H -#define UT_LOGSEVENTDATAPARSER_H - -#include - -class LogsEventData; -class CLogEvent; - -class UT_LogsEventDataParser : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testParseMessageParts(); - void testParseNonTagged(); - void testParseTagged(); - -private: - - LogsEventData* mEventData; - CLogEvent* mEvent; - -}; - - -#endif //UT_LOGSEVENTDATAPARSER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logseventparser.h --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logseventparser.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSEVENTPARSER_H -#define UT_LOGSEVENTPARSER_H - -#include -#include "logsengdefs.h" - -class LogsEvent; - -class UT_LogsEventParser : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testInitializeEventL(); - void eventTypeSpecificParsing(); - void testResolveEventType(); - -private: - - LogsEvent* mEvent; - LogsEventStrings mStrings; - -}; - - -#endif //UT_LOGSEVENTPARSER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreader.h --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreader.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +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: -* -*/ -#ifndef UT_LOGSREADER_H -#define UT_LOGSREADER_H - -#include -#include -#include "logsengdefs.h" -#include "logsreaderobserver.h" - -class LogsDbConnector; -class LogsEvent; -class CLogClient; -class LogsReader; - -class UT_LogsReader : public QObject, public LogsReaderObserver -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testStart(); - void testStart2(); - void testStop(); - void testMarkEventSeen(); - void testReadDuplicates(); - void testRunL(); - void testRunError(); - void testStateContext(); - void testViewChange(); - void testUpdateDetails(); - -protected: // From LogsReaderObserver - - void readCompleted(int readCount); - void errorOccurred(int err); - void temporaryErrorOccurred(int err); - void eventModifyingCompleted(); - void duplicatesReadingCompleted(QList duplicates); - -private: - - LogsReader* mReader; - - bool mErrorOccurred; - int mError; - - QList mEvents; - RFs mFs; - CLogClient* mLogClient; - LogsEventStrings mStrings; - -}; - - -#endif //UT_LOGSREADER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreaderstates.h --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreaderstates.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSREADERSTATES_H -#define UT_LOGSREADERSTATES_H - -#include -#include -#include -#include "logsengdefs.h" -#include "logsreaderstatecontext.h" -#include "logsreaderobserver.h" - -class CLogClient; -class LogsEvent; -class CLogViewRecent; -class CLogViewEvent; -class LogsReaderStateBase; - -class UT_LogsReaderStates : public QObject, - public LogsReaderStateContext, - public LogsReaderObserver -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testStateBase(); - void testStateFiltering(); - void testStateFilteringAll(); - void testStateReading(); - void testStateReading2(); - void testStateFillDetails(); - void testStateDone(); - void testStateSearchingEvent(); - void testStateFindingDuplicates(); - void testStateMarkingDuplicates(); - void testStateReadingDuplicates(); - void testStateReadingDuplicatesDone(); - void testStateModifyingDone(); - -protected: // From LogsReaderStateContext - - void setCurrentState(const LogsReaderStateBase& state); - CLogView& logView(); - CLogViewDuplicate& duplicatesView(); - QList& events(); - int& index(); - LogsEventStrings& strings(); - TRequestStatus& reqStatus(); - LogsReaderObserver& observer(); - QHash& contactCache(); - int currentEventId(); - CLogClient& logClient(); - bool isRecentView(); - QList& duplicatedEvents(); - - -protected: // From LogsReaderObserver - - void readCompleted(int readCount); - void errorOccurred(int err); - void temporaryErrorOccurred(int err); - void eventModifyingCompleted(); - void duplicatesReadingCompleted(QList duplicates); - - -private: - - void reset(); - - -private: - - CLogClient* mLogClient; - const LogsReaderStateBase* mCurrentState; - CLogViewRecent* mLogView; - CLogViewEvent* mLogViewEvent; - CLogViewDuplicate* mDuplicatesView; - QList mEvents; - int mIndex; - LogsEventStrings mStrings; - TRequestStatus mReqStatus; - bool mIsRecentView; - - int mError; - int mTemporaryError; - bool mReadCompleted; - bool mModifyCompleted; - int mReadCount; - int mDuplicatesReadingCompletedCount; - - QHash mContactCache; - - int mCurrentEventId; - QList mDuplicatedEvents; -}; - - -#endif //UT_LOGSREADERSTATES_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsremove.h --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsremove.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSREMOVE_H -#define UT_LOGSREMOVE_H - -#include -#include -#include "logsengdefs.h" -#include "logsremoveobserver.h" -#include -#include -#include - -class LogsDbConnector; -class LogsEvent; -class CLogClient; -class LogsRemove; - -class UT_LogsRemove : public QObject, public LogsRemoveObserver -{ - Q_OBJECT - -public: - - virtual void removeCompleted(); - virtual void logsRemoveErrorOccured(int err); - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - void testConstructor(); - void testclearList(); - void testClearEvents(); - void testDoCancel(); - void testRunL(); - void testRunError(); - void testInit(); - -private: - - LogsRemove* mLogsRemove; - - bool mErrorOccurred; - int mError; - bool mRemoveCompleted; - -}; - - -#endif //UT_LOGSREMOVE_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/main.cpp --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "ut_logsdbconnector.h" -#include "ut_logsreader.h" -#include "ut_logsreaderstates.h" -#include "ut_logseventparser.h" -#include "ut_logseventdataparser.h" -#include "testresultxmlparser.h" -#include "ut_logsremove.h" - - -int main(int argc, char *argv[]) -{ - bool promptOnExit(true); - for (int i=0; i - -Q_DECLARE_METATYPE(QList) - -#define LOGS_TEST_CREATE_EVENT(eventName, index, eventState ) \ -LogsEvent* eventName = new LogsEvent; \ -eventName->setIndex(index); \ -eventName->setLogId(index);\ -eventName->setIsInView(true); \ -eventName->mEventState = eventState; \ -mDbConnector->mEvents.insert(index, eventName) - -void UT_LogsDbConnector::initTestCase() -{ - -} - -void UT_LogsDbConnector::cleanupTestCase() -{ -} - - -void UT_LogsDbConnector::init() -{ - mDbConnector = new LogsDbConnector(mEvents); -} - -void UT_LogsDbConnector::cleanup() -{ - delete mDbConnector; - mDbConnector = 0; -} - -void UT_LogsDbConnector::testConstructor() -{ - QVERIFY( mDbConnector ); -} - -void UT_LogsDbConnector::testInit() -{ - QVERIFY( !mDbConnector->mLogsRemove ); - QVERIFY( mDbConnector->init() == 0 ); - QVERIFY( mDbConnector->mReader ); - QVERIFY( mDbConnector->mLogsRemove ); - QVERIFY( mDbConnector->mLogEventStrings.iFetched.length() > 0 ); -} - -void UT_LogsDbConnector::testClearList() -{ - QVERIFY( !mDbConnector->mLogsRemove ); - QVERIFY( !mDbConnector->clearList(LogsModel::TypeLogsClearAll) ); - - mDbConnector->init(); - QVERIFY( mDbConnector->mLogsRemove ); - QVERIFY( mDbConnector->clearList(LogsModel::TypeLogsClearAll) ); -} - -void UT_LogsDbConnector::testClearEvents() -{ - QVERIFY( !mDbConnector->mLogsRemove ); - QList events; - events.append(1); - QVERIFY( !mDbConnector->clearEvents(events) ); // sync - - mDbConnector->init(); - QVERIFY( mDbConnector->mLogsRemove ); - mDbConnector->clearEvents(events); - QVERIFY( !mDbConnector->clearEvents(events) ); // sync -} - -void UT_LogsDbConnector::testMarkEventsSeen() -{ - QList events; - QSignalSpy spy( mDbConnector, SIGNAL(markingCompleted(int)) ); - - // Not ready - mDbConnector->mEventsSeen.clear(); - mDbConnector->markEventsSeen(events); - QVERIFY( mDbConnector->mEventsSeen.count() == 0 ); - - // No events - mDbConnector->init(); - mDbConnector->markEventsSeen(events); - QVERIFY( mDbConnector->mEventsSeen.count() == 0 ); - - // Marking missed as seen (one is already seen) - LOGS_TEST_CREATE_EVENT(event, 0, LogsEvent::EventAdded ); - event->setDirection(LogsEvent::DirMissed); - LOGS_TEST_CREATE_EVENT(event2, 1, LogsEvent::EventAdded ); - event2->setDirection(LogsEvent::DirMissed); - LOGS_TEST_CREATE_EVENT(event3, 2, LogsEvent::EventAdded ); - event3->setDirection(LogsEvent::DirMissed); - events.append(0); - events.append(1); - QVERIFY( mDbConnector->markEventsSeen(events) ); - QVERIFY( mDbConnector->mEventsSeen.count() == 2 ); - 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->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->mCurrentEventId == 1 ); // Started modifying next one - QVERIFY( spy.count() == 0 ); // Not yet totally completed - - // Last pending gets completed - mDbConnector->mEventsSeen.takeLast(); // Now only one pending left - mDbConnector->eventModifyingCompleted(); - QVERIFY( mDbConnector->mEventsSeen.count() == 0 ); - QVERIFY( spy.count() == 1 ); // Completion was signaled with err 0 - QVERIFY( spy.takeFirst().at(0).toInt() == 0 ); - - // Clearing all, ids are not appended as those are already in modification list - mDbConnector->mEventsSeen.clear(); - mDbConnector->mEventsSeen.append(0); - mDbConnector->mEventsSeen.append(1); - mDbConnector->mEventsSeen.append(2); - QVERIFY( !mDbConnector->markEventsSeen(events) ); - 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 - QVERIFY( mDbConnector->start() == -1 ); - - // Starting ok - mDbConnector->init(); - QVERIFY( mDbConnector->start() == 0 ); -} - -void UT_LogsDbConnector::testReadCompleted() -{ - qRegisterMetaType< QList >("QList"); - QSignalSpy spyAdded(mDbConnector, SIGNAL(dataAdded(QList))); - QSignalSpy spyRemoved(mDbConnector, SIGNAL(dataRemoved(QList))); - QSignalSpy spyUpdated(mDbConnector, SIGNAL(dataUpdated(QList))); - - // No events, no signal - mDbConnector->readCompleted(0); - QVERIFY( spyAdded.count() == 0 ); - QVERIFY( spyRemoved.count() == 0 ); - QVERIFY( spyUpdated.count() == 0 ); - - // Events exists, their indexes are signaled - LOGS_TEST_CREATE_EVENT(event, 0, LogsEvent::EventAdded ); - mDbConnector->readCompleted(1); - QVERIFY( spyAdded.count() == 1 ); - QList addedIndexes = qvariant_cast< QList >(spyAdded.at(0).at(0)); - QVERIFY( addedIndexes.count() == 1 ); - QVERIFY( addedIndexes.at(0) == 0 ); - QVERIFY( spyRemoved.count() == 0 ); - QVERIFY( spyUpdated.count() == 0 ); - QVERIFY( mDbConnector->mEvents.count() == 1 ); - QVERIFY( mEvents.count() == 1 ); - - // 2 more events added, their indexes are signaled - event->mEventState = LogsEvent::EventNotUpdated; - event->setIndex(2); - LOGS_TEST_CREATE_EVENT(event2, 0, LogsEvent::EventAdded ); - LOGS_TEST_CREATE_EVENT(event3, 1, LogsEvent::EventAdded ); - mDbConnector->readCompleted(3); - QVERIFY( spyAdded.count() == 2 ); - QList addedIndexes2 = qvariant_cast< QList >(spyAdded.at(1).at(0)); - QVERIFY( addedIndexes2.count() == 2 ); - QVERIFY( addedIndexes2.at(0) == 0 ); - QVERIFY( addedIndexes2.at(1) == 1 ); - QVERIFY( spyRemoved.count() == 0 ); - QVERIFY( spyUpdated.count() == 0 ); - QVERIFY( mDbConnector->mEvents.count() == 3 ); - QVERIFY( mEvents.count() == 3 ); - - // One of the events updated (index 1) - event->mEventState = LogsEvent::EventNotUpdated; - event2->mEventState = LogsEvent::EventNotUpdated; - event3->mEventState = LogsEvent::EventUpdated; - mDbConnector->readCompleted(3); - QVERIFY( spyAdded.count() == 2 ); - QVERIFY( spyRemoved.count() == 0 ); - QVERIFY( spyUpdated.count() == 1 ); - QList updatedIndexes = qvariant_cast< QList >(spyUpdated.at(0).at(0)); - QVERIFY( updatedIndexes.count() == 1 ); - QVERIFY( updatedIndexes.at(0) == 1 ); - QVERIFY( mDbConnector->mEvents.count() == 3 ); - QVERIFY( mEvents.count() == 3 ); - - // One of the events removed (index 2) - event->setIsInView(false); - event3->mEventState = LogsEvent::EventNotUpdated; - mDbConnector->readCompleted(2); - QVERIFY( spyAdded.count() == 2 ); - QVERIFY( spyRemoved.count() == 1 ); - QVERIFY( spyUpdated.count() == 1 ); - QList removedIndexes = qvariant_cast< QList >(spyRemoved.at(0).at(0)); - QVERIFY( removedIndexes.count() == 1 ); - QVERIFY( removedIndexes.at(0) == 2 ); // index 2 - QVERIFY( mDbConnector->mEvents.count() == 2 ); - QVERIFY( mEvents.count() == 2 ); - -} - -void UT_LogsDbConnector::testErrorOccurred() -{ - // If pending event modifying, completion is signaled - QSignalSpy spy( mDbConnector, SIGNAL(markingCompleted(int)) ); - mDbConnector->mEventsSeen.append(0); - mDbConnector->mEventsSeen.append(1); - mDbConnector->errorOccurred(-3); - QVERIFY( spy.count() == 1 ); // Completion was signaled with err -3 - QVERIFY( spy.takeFirst().at(0).toInt() == -3 ); - QVERIFY( mDbConnector->mEventsSeen.count() == 0 ); -} - -void UT_LogsDbConnector::testUpdateDetails() -{ - QSignalSpy spyUpdated(mDbConnector, SIGNAL(dataUpdated(QList))); - QVERIFY( !mDbConnector->mReader ); - QVERIFY( mDbConnector->updateDetails(false) == -1 ); - QVERIFY( spyUpdated.count() == 0 ); - - mDbConnector->init(); - QVERIFY( mDbConnector->mReader ); - LOGS_TEST_CREATE_EVENT(event, 0, LogsEvent::EventUpdated ); - QVERIFY( mDbConnector->updateDetails(false) == 0 ); - QVERIFY( spyUpdated.count() == 1 ); -} - -void UT_LogsDbConnector::testClearMissedCallsCounter() -{ - // Not ready - QVERIFY( mDbConnector->clearMissedCallsCounter() != 0 ); - - // Ready and value is changed - mDbConnector->init(); - CentralRepositoryStubHelper::reset(); - CentralRepositoryStubHelper::setCurrentVal(5); - QVERIFY( mDbConnector->clearMissedCallsCounter() == 0 ); - QVERIFY( CentralRepositoryStubHelper::currentVal() == 0 ); - - // Ready and no need to change value as it is already zero - QVERIFY( mDbConnector->clearMissedCallsCounter() == 0 ); - QVERIFY( CentralRepositoryStubHelper::currentVal() == 0 ); - - // Fails with some error - CentralRepositoryStubHelper::setCurrentVal(100); - CentralRepositoryStubHelper::setFailCode(KErrNotFound); - QVERIFY( mDbConnector->clearMissedCallsCounter() != 0 ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logseventdataparser.cpp --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logseventdataparser.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "ut_logseventdataparser.h" -#include "logseventdataparser.h" -#include "logseventdata.h" -#include "logsapiconsts.h" - - -void UT_LogsEventDataParser::initTestCase() -{ - -} - -void UT_LogsEventDataParser::cleanupTestCase() -{ -} - - -void UT_LogsEventDataParser::init() -{ - mEvent = CLogEvent::NewL(); - mEventData = new LogsEventData(); -} - -void UT_LogsEventDataParser::cleanup() -{ - delete mEvent; - mEvent = 0; - delete mEventData; - mEventData = 0; -} - -void UT_LogsEventDataParser::testConstructor() -{ - QVERIFY( mEventData ); -} - -void UT_LogsEventDataParser::testParseMessageParts() -{ - TPckgBuf packedData; - packedData().iTotal = 2; - mEvent->SetDataL(packedData); - mEvent->SetEventType(KLogShortMessageEventTypeUid); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->msgPartsNumber() == 2 ); -} - -void UT_LogsEventDataParser::testParseNonTagged() -{ - // No data - mEvent->SetDataL(KNullDesC8); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->mDataReceived == 0 ); - QVERIFY( mEventData->mDataSent == 0 ); - - // No numeric in beginning - mEvent->SetDataL(_L8("abcdef")); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->mDataReceived == 0 ); - QVERIFY( mEventData->mDataSent == 0 ); - - // No separator - mEvent->SetDataL(_L8("123")); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->mDataReceived == 0 ); - QVERIFY( mEventData->mDataSent == 0 ); - - // No received part - mEvent->SetDataL(_L8("123,")); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->mDataReceived == 0 ); - QVERIFY( mEventData->mDataSent == 123 ); - - // Both parts - mEvent->SetDataL(_L8("2234,5567889")); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->mDataReceived == 5567889 ); - QVERIFY( mEventData->mDataSent == 2234 ); -} - -void UT_LogsEventDataParser::testParseTagged() -{ - // No data - mEvent->SetDataL(KNullDesC8); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( !mEventData->isVT() ); - - // No field delim, VT - mEvent->SetDataL(KLogsDataFldTag_VT); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->isVT() ); - - // Field name delim, CNAP - TBuf8<100> testData; - testData.Copy(KLogsDataFldTag_CNAP); - testData.Append(KLogsDataFldNameDelimiter); - mEvent->SetDataL(testData); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->isCNAP() ); - - // Field name delim, value delim, emergency - testData.Copy(KLogsDataFldTag_Emergency); - testData.Append(KLogsDataFldValueDelimiter); - testData.Append(_L8("dummy val")); - testData.Append(KLogsDataFldNameDelimiter); - mEvent->SetDataL(testData); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->isEmerg() ); - - // Voip, contact link and service id - testData.Copy(KLogsDataFldTag_IP); - testData.Append(KLogsDataFldNameDelimiter); - testData.Append(KLogsDataFldTag_ServiceId); - testData.Append(KLogsDataFldValueDelimiter); - testData.Append(_L8("2")); - testData.Append(KLogsDataFldNameDelimiter); - testData.Append(KLogsDataFldTag_ContactLink); - testData.Append(KLogsDataFldValueDelimiter); - testData.Append(_L8("1")); - mEvent->SetDataL(testData); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->isVoIP() ); - QVERIFY( mEventData->contactLocalId() == 1 ); - QVERIFY( mEventData->serviceId() == 2 ); - - // Voip and incorrect contact link and service id - testData.Copy(KLogsDataFldTag_IP); - testData.Append(KLogsDataFldNameDelimiter); - testData.Append(KLogsDataFldTag_ServiceId); - testData.Append(KLogsDataFldValueDelimiter); - testData.Append(_L8("a")); - testData.Append(KLogsDataFldNameDelimiter); - testData.Append(KLogsDataFldTag_ContactLink); - testData.Append(KLogsDataFldValueDelimiter); - testData.Append(_L8("a")); - mEvent->SetDataL(testData); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->isVoIP() ); - QVERIFY( mEventData->contactLocalId() == 0 ); - QVERIFY( mEventData->serviceId() == 0 ); - - // Voip and remote url - testData.Copy(KLogsDataFldTag_IP); - testData.Append(KLogsDataFldNameDelimiter); - testData.Append(KLogsDataFldTag_URL); - testData.Append(KLogsDataFldValueDelimiter); - testData.Append(_L8("test@1.2.3.4")); - testData.Append(KLogsDataFldNameDelimiter); - testData.Append(KLogsDataFldTag_MA); - mEvent->SetDataL(testData); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->isVoIP() ); - QVERIFY( mEventData->remoteUrl() == "test@1.2.3.4" ); - QVERIFY( mEventData->localUrl().isEmpty() ); - - // Voip and remote url and local url - testData.Append(KLogsDataFldValueDelimiter); - testData.Append(_L8("test2@222.23.3.4")); - testData.Append(KLogsDataFldNameDelimiter); - mEvent->SetDataL(testData); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->isVoIP() ); - QVERIFY( mEventData->remoteUrl() == "test@1.2.3.4" ); - QVERIFY( mEventData->localUrl() == "test2@222.23.3.4" ); - - // PoC - testData.Copy(KLogsDataFldTag_POC); - mEvent->SetDataL(testData); - QVERIFY( mEventData->parse(*mEvent) == 0 ); - QVERIFY( mEventData->isPoC() ); - -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logseventparser.cpp --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logseventparser.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +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 "ut_logseventparser.h" -#include "logseventparser.h" -#include "logsevent.h" -#include "logseventdata.h" -#include - -#include - -void UT_LogsEventParser::initTestCase() -{ - -} - -void UT_LogsEventParser::cleanupTestCase() -{ -} - - -void UT_LogsEventParser::init() -{ - mEvent = new LogsEvent(); -} - -void UT_LogsEventParser::cleanup() -{ - delete mEvent; - mEvent = 0; -} - -void UT_LogsEventParser::testConstructor() -{ - QVERIFY( mEvent ); -} - -void UT_LogsEventParser::testInitializeEventL() -{ - CLogEvent* logEvent = CLogEvent::NewL(); - CleanupStack::PushL( logEvent ); - - // Test number - _LIT( eventTestNumber, "123444555" ); - QString strEventTestNumber = DESC_TO_QSTRING( eventTestNumber() ); - logEvent->SetNumber( eventTestNumber() ); - mEvent->initializeEventL(*logEvent, mStrings); - QVERIFY( mEvent->mNumber == strEventTestNumber ); - - // Test direction - mStrings.iInDirection = "dir_in"; - logEvent->SetDirection( _L("dir_in") ); - mEvent->initializeEventL(*logEvent, mStrings); - QVERIFY( mEvent->mDirection == LogsEvent::DirIn ); - - mStrings.iOutDirection = "dir_out"; - logEvent->SetDirection( _L("dir_out") ); - mEvent->initializeEventL(*logEvent, mStrings); - QVERIFY( mEvent->mDirection == LogsEvent::DirOut ); - - mStrings.iMissedDirection = "dir_missed"; - logEvent->SetDirection( _L("dir_missed") ); - mEvent->initializeEventL(*logEvent, mStrings); - QVERIFY( mEvent->mDirection == LogsEvent::DirMissed ); - - logEvent->SetDirection( _L("not_known") ); - mEvent->initializeEventL(*logEvent, mStrings); - QVERIFY( mEvent->mDirection == LogsEvent::DirUndefined ); - - // Test event states - // - LogsEvent event; - logEvent->SetId(100); - - // If no log id, event state is "added" - event.initializeEventL(*logEvent, mStrings); - QVERIFY( event.eventState() == LogsEvent::EventAdded ); - - // If log id has changed, event state is "added" - logEvent->SetId(101); - event.initializeEventL(*logEvent, mStrings); - QVERIFY( event.eventState() == LogsEvent::EventAdded ); - - // If log id is same and data has changed, event state is "updated" - _LIT( eventTestNumber2, "223444555" ); - logEvent->SetNumber( eventTestNumber2() ); - event.initializeEventL(*logEvent, mStrings); - QVERIFY( event.eventState() == LogsEvent::EventUpdated ); - - // If log id is same but no data has change, event state is "not updated" - event.initializeEventL(*logEvent, mStrings); - QVERIFY( event.eventState() == LogsEvent::EventNotUpdated ); - - CleanupStack::PopAndDestroy( logEvent ); -} - -void UT_LogsEventParser::eventTypeSpecificParsing() -{ - // Voip event - LogsEvent event; - event.setEventType(LogsEvent::TypeVoIPCall); - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "jep@1.2.3.4"; - event.setLogsEventData(eventData); - event.setRemoteParty("Jep"); - LogsEventParser::eventTypeSpecificParsing(event); - QVERIFY( event.remoteParty() == "Jep" ); - - // Voip event with unknown remote party, remote party is cleared - event.setRemoteParty(eventData->mRemoteUrl); - LogsEventParser::eventTypeSpecificParsing(event); - QVERIFY( event.remoteParty().isEmpty() ); - - // Voice call event, nop - event.setEventType(LogsEvent::TypeVoIPCall); - LogsEventParser::eventTypeSpecificParsing(event); - QVERIFY( event.remoteParty().isEmpty() ); -} - -void UT_LogsEventParser::testResolveEventType() -{ - // No event data - LogsEventParser::resolveEventType(*mEvent); - QVERIFY( mEvent->eventType() == LogsEvent::TypeVoiceCall ); - - // Event data - LogsEventData* eventData = new LogsEventData(); - mEvent->setLogsEventData(eventData); - LogsEventParser::resolveEventType(*mEvent); - QVERIFY( mEvent->eventType() == LogsEvent::TypeVoiceCall ); - - eventData->mIsVoIP = true; - LogsEventParser::resolveEventType(*mEvent); - QVERIFY( mEvent->eventType() == LogsEvent::TypeVoIPCall ); - - eventData->mIsVoIP = false; - eventData->mIsVT = true; - LogsEventParser::resolveEventType(*mEvent); - QVERIFY( mEvent->eventType() == LogsEvent::TypeVideoCall ); - - // PoC not supported - eventData->mIsVoIP = false; - eventData->mIsVT = false; - eventData->mIsPoC = true; - LogsEventParser::resolveEventType(*mEvent); - QVERIFY( mEvent->eventType() == LogsEvent::TypeUndefined ); - - // Msgs not supported - eventData->mIsVoIP = false; - eventData->mIsVT = false; - eventData->mIsPoC = false; - eventData->mMsgPartsNumber = 2; - LogsEventParser::resolveEventType(*mEvent); - QVERIFY( mEvent->eventType() == LogsEvent::TypeUndefined ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreader.cpp --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreader.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,312 +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 "ut_logsreader.h" -#include "logsreader.h" -#include "logsevent.h" -#include - -#include - -void UT_LogsReader::initTestCase() -{ - QT_TRAP_THROWING( mLogClient = CLogClient::NewL(mFs); ) -} - -void UT_LogsReader::cleanupTestCase() -{ - delete mLogClient; -} - - -void UT_LogsReader::init() -{ - mErrorOccurred = false; - mError = 0; - mReader = new LogsReader(mFs, *mLogClient, mStrings, mEvents, *this ); -} - -void UT_LogsReader::cleanup() -{ - delete mReader; - while (!mEvents.isEmpty()){ - delete mEvents.takeFirst(); - } - -} - -void UT_LogsReader::testConstructor() -{ - QVERIFY( mReader ); - QVERIFY( mReader->mReadStates.count() > 0 ); - QVERIFY( mReader->mModifyingStates.count() == 0 ); - QVERIFY( mReader->mCurrentStateMachine == &mReader->mReadStates ); -} - - -void UT_LogsReader::testStart() -{ - QVERIFY( !mReader->mLogViewRecent ); - QVERIFY( !mReader->mDuplicatesView ); - QVERIFY( mReader->start() == 0 ); - QVERIFY( mReader->IsActive() ); - QVERIFY( mReader->mLogViewRecent ); - QVERIFY( mReader->mDuplicatesView ); - QVERIFY( mReader->mCurrentStateMachine == &mReader->mReadStates ); - QVERIFY( mReader->isRecentView() ); - - // Starting second time should go ok - QVERIFY( mReader->start() == 0 ); - QVERIFY( mReader->IsActive() ); - QVERIFY( mReader->mLogViewRecent ); - - // Starting when deleting is in progress should fail - mReader->mCurrentStateMachine = &mReader->mModifyingStates; - QVERIFY( mReader->start() == KErrInUse ); -} - -void UT_LogsReader::testStart2() -{ - qDeleteAll( mReader->mReadStates ); - mReader->mReadStates.clear(); - mReader->mReadAllEvents = true; - - QVERIFY( !mReader->mLogViewEvent ); - QVERIFY( !mReader->mDuplicatesView ); - QVERIFY( mReader->start() == 0 ); - QVERIFY( mReader->IsActive() ); - QVERIFY( mReader->mLogViewEvent ); - QVERIFY( mReader->mDuplicatesView ); - QVERIFY( mReader->mCurrentStateMachine == &mReader->mReadStates ); - QVERIFY( !mReader->isRecentView() ); - - // Starting second time should go ok - QVERIFY( mReader->start() == 0 ); - QVERIFY( mReader->IsActive() ); - QVERIFY( mReader->mLogViewEvent ); -} - -void UT_LogsReader::testStop() -{ - mReader->stop(); - QVERIFY( mReader->start() == 0 ); - QVERIFY( mReader->IsActive() ); - mReader->stop(); - QVERIFY( !mReader->IsActive() ); -} - -void UT_LogsReader::testMarkEventSeen() -{ - QVERIFY( !mReader->mLogViewRecent ); - QVERIFY( !mReader->mDuplicatesView ); - QVERIFY( mReader->markEventSeen(1) == 0 ); - QVERIFY( mReader->IsActive() ); - QVERIFY( mReader->mLogViewRecent ); - QVERIFY( mReader->mDuplicatesView ); - QVERIFY( mReader->mCurrentStateMachine == &mReader->mModifyingStates ); - QVERIFY( mReader->mModifyingStates.count() > 0 ); - - //starting second time should fail - QVERIFY( mReader->markEventSeen(1) == KErrInUse ); - - //starting when reading is in progress should be ok - mReader->mCurrentStateMachine = &mReader->mReadStates; - 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(); - - // Test ok scenario - mReader->Cancel(); - mReader->iStatus = KErrNone; - mReader->RunL(); - QVERIFY( !mErrorOccurred ); - QVERIFY( mError == 0 ); - QVERIFY( mReader->IsActive() ); - - // Test failure - mReader->Cancel(); - mReader->iStatus = KErrNotFound; - TRAPD( err, mReader->RunL() ); - QVERIFY( err == KErrNotFound ); - -} - -void UT_LogsReader::testRunError() -{ - // No fatal callback for access denied or in use errors - TInt err = KErrAccessDenied; - QVERIFY( mReader->RunError(err) == KErrNone ); - QVERIFY( !mErrorOccurred ); - QVERIFY( mError == KErrAccessDenied ); - - err = KErrInUse; - QVERIFY( mReader->RunError(err) == KErrNone ); - QVERIFY( !mErrorOccurred ); - QVERIFY( mError == KErrInUse ); - - err = KErrNotFound; - QVERIFY( mReader->RunError(err) == KErrNone ); - QVERIFY( mErrorOccurred ); - QVERIFY( mError == KErrNotFound ); -} - -void UT_LogsReader::testStateContext() -{ - mReader->mCurrentStateIndex = 0; - QVERIFY( mReader->mCurrentStateMachine == &mReader->mReadStates ); - mReader->setCurrentState(*mReader->mReadStates[1]); - QVERIFY( mReader->mCurrentStateIndex == 1 ); - - //wrong state machine is set as current, state isn't changed - LogsReaderStateBase* unknownState = new LogsReaderStateBase( *mReader ); - mReader->mModifyingStates.append(unknownState); - QVERIFY( mReader->mCurrentStateMachine == &mReader->mReadStates ); - mReader->setCurrentState(*mReader->mModifyingStates[0]); - QVERIFY( mReader->mCurrentStateIndex == 1 ); - - //once again with the correct state machine, state changed - mReader->mCurrentStateMachine = &mReader->mModifyingStates; - mReader->setCurrentState(*mReader->mModifyingStates[0]); - QVERIFY( mReader->mCurrentStateIndex == 0 ); - - mReader->mIndex = 1; - int& index = mReader->index(); - QVERIFY( index == 1 ); - index++; - QVERIFY( mReader->index() = index ); - - QVERIFY( &mReader->events() == &mEvents ); - QVERIFY( &mReader->strings() == &mStrings ); - QVERIFY( &mReader->reqStatus() == &mReader->iStatus ); - -} - -void UT_LogsReader::testViewChange() -{ - mReader->Cancel(); - mReader->HandleLogClientChangeEventL(KLogClientChangeEventLogCleared, 0, 0, 0); - QVERIFY( mReader->IsActive() ); - - mReader->Cancel(); - mReader->HandleLogClientChangeEventL(KNullUid, 0, 0, 0); - QVERIFY( !mReader->IsActive() ); - - mReader->Cancel(); - mReader->HandleLogViewChangeEventAddedL(0, 0, 0, 2); - QVERIFY( mReader->IsActive() ); - - mReader->Cancel(); - mReader->HandleLogViewChangeEventChangedL(0, 0, 0, 1); - QVERIFY( mReader->IsActive() ); - - // Deletion has optimization to reduce multiple actions for same deletion - // patch - mReader->Cancel(); - mReader->HandleLogViewChangeEventDeletedL(0, 0, 1, 2); - QVERIFY( mReader->IsActive() ); - - mReader->Cancel(); - mReader->HandleLogViewChangeEventDeletedL(0, 0, 0, 2); - QVERIFY( !mReader->IsActive() ); - - mReader->Cancel(); - mReader->HandleLogViewChangeEventDeletedL(0, 0, 0, 1); - QVERIFY( mReader->IsActive() ); - -} - -void UT_LogsReader::testUpdateDetails() -{ - QVERIFY( !mReader->IsActive() ); - ContactCacheEntry contactEntry("name", 1); - mReader->mContactCache.insert("12345", contactEntry); - mReader->updateDetails(false); - QVERIFY( !mReader->IsActive() ); - QVERIFY( mReader->mContactCache.count() == 1 ); - - mReader->updateDetails(true); - QVERIFY( !mReader->IsActive() ); - QVERIFY( mReader->mContactCache.count() == 0 ); -} - - -// ---------------------------------------------------------------------------- -// From LogsReaderObserver -// ---------------------------------------------------------------------------- -// -void UT_LogsReader::readCompleted(int /*readCount*/) -{ - -} - -// ---------------------------------------------------------------------------- -// From LogsReaderObserver -// ---------------------------------------------------------------------------- -// -void UT_LogsReader::errorOccurred(int err) -{ - mErrorOccurred = true; - mError = err; -} - -// ---------------------------------------------------------------------------- -// From LogsReaderObserver -// ---------------------------------------------------------------------------- -// -void UT_LogsReader::temporaryErrorOccurred(int err) -{ - mError = err; -} - -// ---------------------------------------------------------------------------- -// From LogsReaderObserver -// ---------------------------------------------------------------------------- -// -void UT_LogsReader::eventModifyingCompleted() -{ - -} - -// ---------------------------------------------------------------------------- -// From LogsReaderObserver -// ---------------------------------------------------------------------------- -// -void UT_LogsReader::duplicatesReadingCompleted(QList duplicates) -{ - qDeleteAll(duplicates); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreaderstates.cpp --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreaderstates.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,669 +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 "ut_logsreaderstates.h" -#include "logsreaderstates.h" -#include "logsevent.h" -#include "logscommondata.h" -#include "logclient_stubs_helper.h" -#include "qtcontacts_stubs_helper.h" -#include -#include - -#include - -_LIT( KTestInDirection, "Incoming" ); -_LIT( KTestOutDirection, "Outgoing" ); -_LIT( KTestMissedDirection, "Missed call" ); - -void UT_LogsReaderStates::initTestCase() -{ - int rfsDummy = 0; - mLogClient = CLogClient::NewL( *((RFs*)&rfsDummy) ); - mStrings.iInDirection = DESC_TO_QSTRING( KTestInDirection() ); - mStrings.iOutDirection = DESC_TO_QSTRING( KTestOutDirection() ); - mStrings.iMissedDirection = DESC_TO_QSTRING( KTestMissedDirection() ); -} - -void UT_LogsReaderStates::cleanupTestCase() -{ - delete mLogClient; -} - - -void UT_LogsReaderStates::init() -{ - reset(); - - mCurrentState = 0; - mIndex = 0; - mLogView = 0; - mLogViewEvent = 0; - mIsRecentView = true; - - mLogView = CLogViewRecent::NewL(*mLogClient); - mLogViewEvent = CLogViewEvent::NewL(*mLogClient); - mDuplicatesView = CLogViewDuplicate::NewL(*mLogClient); - - const_cast( mLogView->Event() ).SetDirection( KTestInDirection ); -} - -void UT_LogsReaderStates::cleanup() -{ - delete mLogView; - mLogView = 0; - delete mLogViewEvent; - mLogViewEvent = 0; - delete mDuplicatesView; - mDuplicatesView = 0; - while (!mEvents.isEmpty()){ - delete mEvents.takeFirst(); - } - mContactCache.clear(); - qDeleteAll(mDuplicatedEvents); - mDuplicatedEvents.clear(); - -} - -void UT_LogsReaderStates::reset() -{ - mError = 0; - mTemporaryError = 0; - mReadCompleted = false; - mModifyCompleted = false; - mReadCount = 0; - mDuplicatesReadingCompletedCount = 0; -} - -void UT_LogsReaderStates::testStateBase() -{ - LogsReaderStateBase state(*this); - LogsReaderStateBase state2(*this); - QVERIFY( state.mNextState == 0 ); - QVERIFY( state2.mNextState == 0 ); - - state.setNextState(state2); - QVERIFY( state.mNextState == &state2 ); - QVERIFY( state2.mNextState == 0 ); - - QVERIFY( !state.enterL() ); - QVERIFY( !state2.enterL() ); - - QVERIFY( !state.continueL() ); - QVERIFY( !state2.continueL() ); - - QVERIFY( !state2.enterNextStateL() ); - QVERIFY( mCurrentState == 0 ); - - QVERIFY( !state.enterNextStateL() ); - QVERIFY( mCurrentState == &state2 ); - - CLogEvent* logEvent = CLogEvent::NewL(); - CleanupStack::PushL(logEvent); - logEvent->SetNumber( _L("1234") ); - logEvent->SetId( 100 ); - LogsEvent* logsEvent = new LogsEvent; - int index( 0 ); - QVERIFY( state.constructAndInsertEventL(*logEvent, logsEvent, index, mEvents ) ); - logsEvent = 0; - QVERIFY( mEvents.count() == 1 ); - QVERIFY( mEvents.at(0)->number() == "1234" ); - QVERIFY( mEvents.at(0)->isInView() ); - QVERIFY( index == 1 ); - - logEvent->SetNumber( _L("2234") ); - logEvent->SetId( 101 ); - logsEvent = new LogsEvent; - QVERIFY( state.constructAndInsertEventL(*logEvent, logsEvent, index, mEvents ) ); - logsEvent = 0; - QVERIFY( mEvents.count() == 2 ); - QVERIFY( mEvents.at(1)->number() == "2234" ); - QVERIFY( mEvents.at(1)->index() == 1 ); - QVERIFY( mEvents.at(1)->isInView() ); - QVERIFY( index == 2 ); - - // Invalid event discarded - logEvent->SetNumber( _L("") ); - logEvent->SetId( 102 ); - logsEvent = new LogsEvent; - QVERIFY( !state.constructAndInsertEventL(*logEvent, logsEvent, index, mEvents ) ); - QVERIFY( mEvents.count() == 2 ); - QVERIFY( index == 2 ); - - logEvent->SetNumber( _L("2234") ); - logEvent->SetId( 101 ); - logsEvent = new LogsEvent; - index = 0; - QVERIFY( state.updateAndInsertEventL( *logEvent, logsEvent, index ) ); - QVERIFY( mEvents.count() == 3 ); - QVERIFY( index == 1 ); - - state.resetEvents(); - QVERIFY( !mEvents.at(0)->isInView() ); - QVERIFY( !mEvents.at(1)->isInView() ); - - LogsEvent* event = state.takeMatchingEvent(*logEvent); - QVERIFY( event ); - QVERIFY( mEvents.count() == 2 ); - delete event; - logEvent->SetId( 200 ); - LogsEvent* event2 = state.takeMatchingEvent(*logEvent); - QVERIFY( !event2 ); - QVERIFY( mEvents.count() == 2 ); - - CleanupStack::PopAndDestroy( logEvent ); - - //event with Id not found - QVERIFY( !mEvents.isEmpty() ); - QVERIFY( !state.eventById(0) ); - - //event list is empty - while ( !mEvents.isEmpty() ) { - delete mEvents.takeFirst(); - } - QVERIFY( !state.eventById(0) ); - - //event with Id found - LogsEvent* event3 = new LogsEvent; - event3->setLogId( 300 ); - mEvents.append(event3); - QVERIFY( state.eventById(300) == event3 ); - QVERIFY( !mEvents.isEmpty() ); - -} - -void UT_LogsReaderStates::testStateFiltering() -{ - LogsReaderStateFiltering state(*this); - QVERIFY( !state.mFilterList ); - - // State can be used only with recent view - mIsRecentView = false; - TRAPD( err, state.enterL() ); - QVERIFY( err == KErrNotFound ); - mIsRecentView = true; - - // Recent list fetching starts ok - QVERIFY( state.enterL() ); - QVERIFY( state.mFilterList ); - QVERIFY( state.mFilterList->Count() == 1 ); - - // Recent list fetching does not start - LogClientStubsHelper::setStubAsyncCallPossible(false); - QVERIFY( !state.enterL() ); - LogClientStubsHelper::setStubAsyncCallPossible(true); - - // Doesn't continue as no next state - QVERIFY( !state.continueL() ); - - // Continues as there's next state - LogsReaderStateFiltering state2(*this); - state.setNextState(state2); - QVERIFY( state.continueL() ); -} - -void UT_LogsReaderStates::testStateFilteringAll() -{ - LogsReaderStateFilteringAll state(*this); - QVERIFY( !state.mFilterList ); - - // State can be used only with full event view - mIsRecentView = true; - TRAPD( err, state.enterL() ); - QVERIFY( err == KErrNotFound ); - mIsRecentView = false; - - // Fetching starts ok - QVERIFY( state.enterL() ); - QVERIFY( state.mFilterList ); - QVERIFY( state.mFilterList->Count() == 1 ); - - // Recent list fetching does not start - LogClientStubsHelper::setStubAsyncCallPossible(false); - QVERIFY( !state.enterL() ); - LogClientStubsHelper::setStubAsyncCallPossible(true); -} - -void UT_LogsReaderStates::testStateReading() -{ - LogsReaderStateReading state(*this); - - // Reading starts ok - QVERIFY( state.enterL() ); - - // Reading doesn't start ok as no items in view - LogClientStubsHelper::setViewCount(0); - QVERIFY( !state.enterL() ); - - // Reading continues as more events in view exist, new event is added - QVERIFY( mEvents.count() == 0 ); - const_cast( mLogView->Event() ).SetNumber( _L("12345") ); - const_cast( mLogView->Event() ).SetId( 100 ); - LogClientStubsHelper::setViewCount(2); - QVERIFY( state.continueL() ); - QVERIFY( mEvents.count() == 1 ); - QVERIFY( mIndex == 1 ); - - // Reading does not continue as no more events in view - const_cast( mLogView->Event() ).SetId( 101 ); - QVERIFY( !state.continueL() ); - QVERIFY( mEvents.count() == 2 ); - QVERIFY( mIndex == 2 ); - - // Test where view is re-read and mathing event is updated - mIndex = 0; - state.mEventIndex = 0; - LogClientStubsHelper::setViewCount(1); - QVERIFY( !state.continueL() ); - QVERIFY( mEvents.count() == 2 ); - QVERIFY( mIndex == 1 ); - - // Test where searching duplicates for missed call event - mIndex = 0; - state.mEventIndex = 0; - const_cast( mLogView->Event() ).SetDirection( KTestMissedDirection ); - LogClientStubsHelper::setViewCount(1); // effective also for duplicates view - - // Duplicate finding activation fails - LogClientStubsHelper::setStubAsyncCallPossible(false); - QVERIFY( !state.continueL() ); - QVERIFY( !state.mCheckingMissed ); - QVERIFY( mEvents.count() > 0 ); - QVERIFY( mEvents.at(0)->duplicates() == 0 ); - - // Duplicate finding activation ok - mIndex = 0; - state.mEventIndex = 0; - LogClientStubsHelper::setStubAsyncCallPossible(true); - QVERIFY( state.continueL() ); - QVERIFY( state.mCheckingMissed ); - QVERIFY( !state.continueL() ); - QVERIFY( !state.mCheckingMissed ); - QVERIFY( mEvents.count() > 0 ); - QVERIFY( mEvents.at(0)->duplicates() == 1 ); - - // Duplicate finding not done for full event view - qDeleteAll(mEvents); - mEvents.clear(); - mIsRecentView = false; - mIndex = 0; - state.mEventIndex = 0; - state.mCheckingMissed = false; - LogClientStubsHelper::setStubAsyncCallPossible(true); - QVERIFY( !state.continueL() ); // No next state - QVERIFY( !state.mCheckingMissed ); -} - -void UT_LogsReaderStates::testStateReading2() -{ - // Test reading when max size has been defined - mIndex = 0; - LogsCommonData::getInstance().configureReadSize(3); - LogClientStubsHelper::setViewCount(5); - - LogsReaderStateReading state(*this); - - // Reading starts ok - QVERIFY( state.enterL() ); - QVERIFY( state.mReadSizeCounter == 0 ); - - // Reading continues as more events in view exist, new event is added - QVERIFY( mEvents.count() == 0 ); - const_cast( mLogView->Event() ).SetNumber( _L("12345") ); - const_cast( mLogView->Event() ).SetId( 100 ); - QVERIFY( state.continueL() ); - QVERIFY( mEvents.count() == 1 ); - QVERIFY( mIndex == 1 ); - - // Reading continues as max size has not been reached - const_cast( mLogView->Event() ).SetId( 101 ); - QVERIFY( state.continueL() ); - QVERIFY( mEvents.count() == 2 ); - QVERIFY( mIndex == 2 ); - - // Reading does not continue as max size has been reached - const_cast( mLogView->Event() ).SetId( 102 ); - QVERIFY( !state.continueL() ); - QVERIFY( mEvents.count() == 3 ); - QVERIFY( mIndex == 3 ); - LogsCommonData::getInstance().configureReadSize(-1); -} - -void UT_LogsReaderStates::testStateFillDetails() -{ - LogsReaderStateFillDetails state(*this); - int contactId = 2; - - // No events, nothing to check - QVERIFY( !state.enterL() ); - QVERIFY( mContactCache.count() == 0 ); - - // Remote name exists already - LogsEvent* logsEvent = new LogsEvent; - logsEvent->setIsInView(true); - logsEvent->setRemoteParty( "remote" ); - LogsEvent* logsEvent2 = new LogsEvent; - logsEvent2->setRemoteParty( "remote2" ); - logsEvent2->setIsInView(true); - mEvents.append( logsEvent ); - mEvents.append( logsEvent2 ); - QVERIFY( !state.enterL() ); - QVERIFY( mContactCache.count() == 0 ); - - // Some events, nothing yet in cache, match from phonebook not found - QtContactsStubsHelper::setContactId( contactId ); - logsEvent->setRemoteParty( "" ); - logsEvent->setNumber( "99999999" ); - QVERIFY( !state.enterL() ); - QVERIFY( mContactCache.count() == 0 ); - QVERIFY( !logsEvent->contactLocalId() ); - - // Some events, nothing yet in cache, match from phonebook found (international format) - QtContactsStubsHelper::setContactNames("first", "last"); - logsEvent->setNumber( "+3581112222" ); - QVERIFY( !state.enterL() ); - QVERIFY( mContactCache.count() == 1 ); - QVERIFY( logsEvent->contactLocalId() == contactId ); - - // Some events, nothing yet in cache, match from phonebook found (local format) - mContactCache.clear(); - logsEvent->setRemoteParty( "" ); - logsEvent->setNumber( "11112222" ); - logsEvent->setLogsEventData(NULL); - QVERIFY( !state.enterL() ); - QVERIFY( mContactCache.count() == 1 ); - QVERIFY( logsEvent->contactLocalId() == contactId ); - - // Some events, matching info found from cache - logsEvent->setLogsEventData(NULL); - logsEvent->setRemoteParty( "" ); - QVERIFY( !logsEvent->contactLocalId() ); - QVERIFY( !state.enterL() ); - QVERIFY( mContactCache.count() == 1 ); - QVERIFY( logsEvent->remoteParty().length() > 0 ); - QVERIFY( logsEvent->contactLocalId() == contactId ); -} - -void UT_LogsReaderStates::testStateDone() -{ - LogsReaderStateDone state(*this); - mIndex = 3; - LogClientStubsHelper::setViewCount(3); - QVERIFY( !state.enterL() ); - QVERIFY( mReadCompleted ); - QVERIFY( mReadCount == 3 ); - - // Reading hasn't gone through whole db view (e.g. maxsize has been defined) - reset(); - mIndex = 2; - QVERIFY( !state.enterL() ); - QVERIFY( mReadCompleted ); - QVERIFY( mReadCount == 2 ); -} - -void UT_LogsReaderStates::testStateSearchingEvent() -{ - // Searching starts ok - LogsReaderStateSearchingEvent state(*this); - mCurrentEventId = 10; - QVERIFY( state.enterL() ); - - // Searching doesn't start ok as no items in view - LogClientStubsHelper::setViewCount(0); - QVERIFY( !state.enterL() ); - - // Searching event continues - mIndex = 0; - mCurrentEventId = -1; - const_cast( mLogView->Event() ).SetId( 100 ); - LogClientStubsHelper::setViewCount(2); - QVERIFY( state.continueL() ); - - // Last event handled, no target event found, entering next state - mIndex = 2; - QVERIFY( !state.continueL() ); - - // Target event found, entering next state - mIndex = 0; - mCurrentEventId = 100; - QVERIFY( !state.continueL() ); -} - - -void UT_LogsReaderStates::testStateFindingDuplicates() -{ - // Finding starts ok - LogsReaderStateFindingDuplicates state(*this); - QVERIFY( state.enterL() ); - - // Duplicates cannot be searched for some reason - LogClientStubsHelper::reset(); - LogClientStubsHelper::setStubAsyncCallPossible(false); - 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 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); - - // Modified event not found for some reason - LogsEvent* logsEvent = new LogsEvent; - logsEvent->setIsInView(true); - mCurrentEventId = 100; - mEvents.append( logsEvent ); - QVERIFY( !mModifyCompleted ); - QVERIFY( !state.enterL() ); - QVERIFY( mModifyCompleted ); - QVERIFY( !logsEvent->isSeenLocally() ); - - // Modified event found and is set to locally read - mModifyCompleted = false; - logsEvent->setLogId(100); - QVERIFY( !state.enterL() ); - QVERIFY( mModifyCompleted ); - QVERIFY( logsEvent->isSeenLocally() ); -} - -// ---------------------------------------------------------------------------- -// From LogsReaderStateContext -// ---------------------------------------------------------------------------- -// -void UT_LogsReaderStates::setCurrentState(const LogsReaderStateBase& state) -{ - mCurrentState = &state; -} - -// ---------------------------------------------------------------------------- -// From LogsReaderStateContext -// ---------------------------------------------------------------------------- -// -CLogView& UT_LogsReaderStates::logView() -{ - if ( mIsRecentView ){ - return *mLogView; - } - return *mLogViewEvent; -} - -CLogViewDuplicate& UT_LogsReaderStates::duplicatesView() -{ - return *mDuplicatesView; -} - -QList& UT_LogsReaderStates::events() -{ - return mEvents; -} - -int& UT_LogsReaderStates::index() -{ - return mIndex; -} - -LogsEventStrings& UT_LogsReaderStates::strings() -{ - return mStrings; -} - -TRequestStatus& UT_LogsReaderStates::reqStatus() -{ - return mReqStatus; -} - -LogsReaderObserver& UT_LogsReaderStates::observer() -{ - return *this; -} - -QHash& UT_LogsReaderStates::contactCache() -{ - return mContactCache; -} - -int UT_LogsReaderStates::currentEventId() -{ - return mCurrentEventId; -} - -CLogClient& UT_LogsReaderStates::logClient() -{ - return *mLogClient; -} - -bool UT_LogsReaderStates::isRecentView() -{ - return mIsRecentView; -} - -QList& UT_LogsReaderStates::duplicatedEvents() -{ - return mDuplicatedEvents; -} - -// ---------------------------------------------------------------------------- -// From LogsReaderObserver -// ---------------------------------------------------------------------------- -// -void UT_LogsReaderStates::readCompleted(int readCount) -{ - mReadCompleted = true; - mReadCount = readCount; -} -void UT_LogsReaderStates::errorOccurred(int err) -{ - mError = err; -} -void UT_LogsReaderStates::temporaryErrorOccurred(int err) -{ - mTemporaryError = err; -} -void UT_LogsReaderStates::eventModifyingCompleted() -{ - mModifyCompleted = true; -} - -void UT_LogsReaderStates::duplicatesReadingCompleted(QList duplicates) -{ - mDuplicatesReadingCompletedCount = duplicates.count(); - qDeleteAll(duplicates); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsremove.cpp --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsremove.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,187 +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 "ut_logsremove.h" -#include "logsremove.h" -#include "logsremoveobserver.h" -#include "logclient_stubs_helper.h" -#include - -#include - -void UT_LogsRemove::initTestCase() -{ -} - -void UT_LogsRemove::cleanupTestCase() -{ -} - -// ---------------------------------------------------------------------------- -// UT_LogsRemove::removeCompleted -// ---------------------------------------------------------------------------- -// -void UT_LogsRemove::removeCompleted() -{ - mRemoveCompleted = true; -} - -// ---------------------------------------------------------------------------- -// UT_LogsRemove::logsRemoveErrorOccured -// ---------------------------------------------------------------------------- -// -void UT_LogsRemove::logsRemoveErrorOccured(int err) -{ - Q_UNUSED(err) -} - -void UT_LogsRemove::init() -{ - mRemoveCompleted = false; - mErrorOccurred = false; - mError = 0; - mLogsRemove = new LogsRemove(*this, false); -} - -void UT_LogsRemove::cleanup() -{ - delete mLogsRemove; -} - -void UT_LogsRemove::testConstructor() -{ - QVERIFY( mLogsRemove ); - QVERIFY( mLogsRemove->mFsSession ); - QVERIFY( !mLogsRemove->mLogClient ); -} - -void UT_LogsRemove::testclearList() -{ - //clearing doesn't start, since initialization failed - LogClientStubsHelper::setLeaveWithError(KErrNoMemory); - QVERIFY( !mLogsRemove->IsActive() ); - QVERIFY( !mLogsRemove->clearList(LogsModel::TypeLogsClearAll) ); - QVERIFY( !mLogsRemove->IsActive() ); - - //clearing is ok - LogClientStubsHelper::setLeaveWithError(KErrNone); - QVERIFY( mLogsRemove->clearList(LogsModel::TypeLogsClearMissed) ); - QVERIFY( mLogsRemove->IsActive() ); - - //clearing doesn't start, since already active - QVERIFY( !mLogsRemove->clearList(LogsModel::TypeLogsClearAll) ); -} - -void UT_LogsRemove::testClearEvents() -{ - // Clearing with recent view (no ids) - QList events; - bool async( false ); - QVERIFY( mLogsRemove->clearEvents(events, async) == 0 ); - QVERIFY( !async ); - QVERIFY( mLogsRemove->mRemovedEvents.count() == 0 ); - - // Clearing with recent view (ids) - events.append(2); - events.append(100); - QVERIFY( mLogsRemove->clearEvents(events, async) == 0 ); - QVERIFY( !async ); - QVERIFY( mLogsRemove->mRemovedEvents.count() == 0 ); - - // Clearing with all events (no ids) - events.clear(); - LogsRemove removeWithAllEvents(*this, true); - QVERIFY( removeWithAllEvents.clearEvents(events, async) == 0 ); - QVERIFY( !async ); - QVERIFY( removeWithAllEvents.mRemovedEvents.count() == 0 ); - - // Clearing with all events (ids) - events.append(99); - events.append(100); - QVERIFY( removeWithAllEvents.clearEvents(events, async) == 0 ); - QVERIFY( async ); - QVERIFY( removeWithAllEvents.mRemovedEvents.count() == 1 ); - QVERIFY( removeWithAllEvents.mRemovedEvents.at(0) == 100 ); - -} - -void UT_LogsRemove::testDoCancel() -{ - mLogsRemove->DoCancel(); -} - -void UT_LogsRemove::testRunL() -{ - // Test ok scenario - mLogsRemove->init(); - mLogsRemove->Cancel(); - mLogsRemove->iStatus = KErrNone; - mLogsRemove->RunL(); - QVERIFY( mRemoveCompleted ); - - // Ok scenario when more events to delete - mRemoveCompleted = false; - mLogsRemove->mRemovedEvents.append(2); - mLogsRemove->mRemovedEvents.append(4); - mLogsRemove->Cancel(); - mLogsRemove->RunL(); - QVERIFY( !mRemoveCompleted ); - QVERIFY( mLogsRemove->mRemovedEvents.count() == 1 ); - - mLogsRemove->Cancel(); - mLogsRemove->RunL(); - QVERIFY( !mRemoveCompleted ); - QVERIFY( mLogsRemove->mRemovedEvents.count() == 0 ); - - // Ok scenario when no more events to delete - mLogsRemove->Cancel(); - mLogsRemove->RunL(); - QVERIFY( mRemoveCompleted ); - QVERIFY( mLogsRemove->mRemovedEvents.count() == 0 ); - - // Test failure - mLogsRemove->Cancel(); - mLogsRemove->iStatus = KErrNotFound; - TRAPD( err, mLogsRemove->RunL() ); - QVERIFY( err == KErrNotFound ); -} - -void UT_LogsRemove::testRunError() -{ - // No fatal callback for access denied error - TInt err = KErrAccessDenied; - QVERIFY( mLogsRemove->RunError(err) == KErrNone ); -} - -void UT_LogsRemove::testInit() -{ - //initialization failes - LogClientStubsHelper::setLeaveWithError(KErrNoMemory); - QVERIFY( mLogsRemove->init() == KErrNoMemory ); - QVERIFY( !mLogsRemove->mLogClient ); - LogClientStubsHelper::setLeaveWithError(KErrNone); - - //initializing for the first time - QVERIFY( mLogsRemove->init() == KErrNone ); - QVERIFY( mLogsRemove->mLogClient ); - CLogClient* oldClient = mLogsRemove->mLogClient; - - //2d time should be also ok - QVERIFY( mLogsRemove->init() == KErrNone ); - QVERIFY( mLogsRemove->mLogClient ); - QVERIFY( oldClient == mLogsRemove->mLogClient ); -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/ut_logssymbianos.pro --- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/ut_logssymbianos.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +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: -# -# - -TEMPLATE = app -TARGET = - -QT += testlib xml -CONFIG += qtestlib -CONFIG += hb - -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += ../stubs/ -INCLUDEPATH += /orbit/include # This must be included after the HB stubs -INCLUDEPATH += /epoc32/include -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -INCLUDEPATH += /epoc32/include/ecom -INCLUDEPATH += ../../ -INCLUDEPATH += ../../inc -INCLUDEPATH += ../../../ -INCLUDEPATH += ../../../inc -INCLUDEPATH += ../../../../inc -INCLUDEPATH += ../../../../tsrc/qtestutils/inc - -DEFINES += QT_NO_DEBUG_OUTPUT - -# Input -HEADERS += inc/ut_logsdbconnector.h -HEADERS += inc/ut_logsreader.h -HEADERS += inc/ut_logsreaderstates.h -HEADERS += inc/ut_logseventparser.h -HEADERS += inc/ut_logseventdataparser.h -HEADERS += inc/ut_logsremove.h -HEADERS += ../../inc/logsdbconnector.h -HEADERS += ../../inc/logsreader.h -HEADERS += ../../inc/logsreaderstates.h -HEADERS += ../../inc/logsreaderobserver.h -HEADERS += ../../inc/logsremove.h -HEADERS += ../../../../../contacts_plat/logs_engine_api/inc/logsevent.h -HEADERS += ../../../inc/logseventdata.h -HEADERS += ../../../inc/logscommondata.h - -HEADERS += ../stubs/logclient_stubs_helper.h - -SOURCES += src/main.cpp -SOURCES += src/ut_logsdbconnector.cpp -SOURCES += src/ut_logsreader.cpp -SOURCES += src/ut_logsreaderstates.cpp -SOURCES += src/ut_logseventparser.cpp -SOURCES += src/ut_logseventdataparser.cpp -SOURCES += src/ut_logsremove.cpp -SOURCES += ../../src/logsdbconnector.cpp -SOURCES += ../../src/logsreader.cpp -SOURCES += ../../src/logsreaderstates.cpp -SOURCES += ../../src/logseventparser.cpp -SOURCES += ../../src/logseventdataparser.cpp -SOURCES += ../../src/logsremove.cpp -SOURCES += ../../../src/logsevent.cpp -SOURCES += ../../../src/logseventdata.cpp -SOURCES += ../../../src/logscommondata.cpp -SOURCES += ../../../../tsrc/qtestutils/src/testresultxmlparser.cpp -SOURCES += ../stubs/logclient_stubs.cpp -SOURCES += ../stubs/qtcontacts_stubs.cpp -SOURCES += ../stubs/centralrepository_stub.cpp - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xEfaaa9b2 - TARGET.CAPABILITY = ALL -TCB - LIBS += -lecom -lflogger -lws32 -lbafl -lqtcontacts - TARGET.EPOCALLOWDLLDATA = 1 -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logsabstractmodel.cpp --- a/logsui/logsengine/src/logsabstractmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "logsabstractmodel.h" -#include "logsdbconnector.h" -#include "logsevent.h" -#include "logslogger.h" -#include "logscall.h" -#include "logscontact.h" -#include "logsengdefs.h" -#include "logsmessage.h" -#include - -Q_DECLARE_METATYPE(LogsEvent *) -Q_DECLARE_METATYPE(LogsCall *) -Q_DECLARE_METATYPE(LogsMessage *) -Q_DECLARE_METATYPE(LogsContact *) - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsAbstractModel::LogsAbstractModel() : QAbstractListModel(), mDbConnector(0) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsAbstractModel::LogsAbstractModel()" ) - - LOGS_QDEBUG( "logs [ENG] <- LogsAbstractModel::LogsAbstractModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsAbstractModel::~LogsAbstractModel() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsAbstractModel::~LogsAbstractModel()" ) - - qDeleteAll( mIcons ); - - LOGS_QDEBUG( "logs [ENG] <- LogsAbstractModel::~LogsAbstractModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsAbstractModel::doGetData(int role, const LogsModelItemContainer& item) const -{ - if ( role == RoleFullEvent ) { - QVariant var = qVariantFromValue(item.event()); - return var; - } else if ( role == RoleCall ) { - return createCall(item); - } else if ( role == RoleMessage ) { - return createMessage(item); - } else if ( role == RoleContact ) { - return createContact(item); - } - return QVariant(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsAbstractModel::createCall(const LogsModelItemContainer& item) const -{ - LOGS_QDEBUG( "logs [ENG] -> LogsAbstractModel::createCall()" ) - LogsEvent* event = item.event(); - if ( !event ){ - return QVariant(); - } - LogsCall* logscall = new LogsCall(*event); - if (!logscall->isAllowedCallType()) { - delete logscall; - logscall = 0; - } - QVariant var = qVariantFromValue(logscall); - return var; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsAbstractModel::createMessage(const LogsModelItemContainer& item) const -{ - LOGS_QDEBUG( "logs [ENG] -> LogsAbstractModel::createMessage()" ) - LogsEvent* event = item.event(); - if ( !event ){ - return QVariant(); - } - LogsMessage* logsMessage = new LogsMessage(*event); - if (!logsMessage->isMessagingAllowed()) { - delete logsMessage; - logsMessage = 0; - } - QVariant var = qVariantFromValue(logsMessage); - return var; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsAbstractModel::createContact(const LogsModelItemContainer& item) const -{ - LOGS_QDEBUG( "logs [ENG] -> LogsAbstractModel::createContact()" ) - LogsEvent* event = item.event(); - if ( !event ){ - return QVariant(); - } - Q_ASSERT(mDbConnector); - LogsContact* logsContact = new LogsContact(*event, *mDbConnector); - if ( !logsContact->isContactRequestAllowed() ) { - delete logsContact; - logsContact = 0; - } - QVariant var = qVariantFromValue(logsContact); - return var; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QString LogsAbstractModel::directionIconName(const LogsEvent& event) -{ - QString direction; - - if ( event.direction() == LogsEvent::DirIn ) { - if ( event.eventType() == LogsEvent::TypeVoiceCall ) { - direction = logsReceivedVoiceCallIconId; - } else if ( event.eventType() == LogsEvent::TypeVideoCall ) { - direction = logsReceivedVideoCallIconId; - } else if ( event.eventType() == LogsEvent::TypeVoIPCall ) { - direction = logsReceivedVoipCallIconId; - } - } else if ( event.direction() == LogsEvent::DirOut ) { - if ( event.eventType() == LogsEvent::TypeVoiceCall ) { - direction = logsDialledVoiceCallIconId; - } else if ( event.eventType() == LogsEvent::TypeVideoCall ) { - direction = logsDialledVideoCallIconId; - } else if ( event.eventType() == LogsEvent::TypeVoIPCall ) { - direction = logsDialledVoipCallIconId; - } - } else if ( event.direction() == LogsEvent::DirMissed ) { - if ( event.eventType() == LogsEvent::TypeVoiceCall ) { - if (!event.isRead()){ - direction = logsMissedVoiceCallUnseenIconId; - } - else { - direction = logsMissedVoiceCallIconId; - } - - } else if ( event.eventType() == LogsEvent::TypeVideoCall ) { - if (!event.isRead()){ - direction = logsMissedVideoCallUnseenIconId; - } - else { - direction = logsMissedVideoCallIconId; - } - } else if ( event.eventType() == LogsEvent::TypeVoIPCall ) { - if (!event.isRead()){ - direction = logsMissedVoipCallUnseenIconId; - } - else { - direction = logsMissedVoipCallIconId; - } - } - } - - return direction; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QString LogsAbstractModel::typeIconName(const LogsEvent& event) -{ - QString brand; - if ( event.eventType() == LogsEvent::TypeVoiceCall ) { - brand = QString(logsVoiceCallIconId); - } else if ( event.eventType() == LogsEvent::TypeVideoCall ) { - brand = QString(logsVideoCallIconId); - } else if ( event.eventType() == LogsEvent::TypeVoIPCall ) { - brand = QString(logsVoipCallIconId); - } - return brand; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsAbstractModel::getDecorationData(const LogsEvent& event, - QList& iconList) const -{ - HbIcon emptyIcon; - iconList.append( *mIcons.value(directionIconName(event), &emptyIcon) ); - - // TODO: alternative service icon -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsDbConnector* LogsAbstractModel::dbConnector() -{ - return mDbConnector; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsModelItemContainer::LogsModelItemContainer(LogsEvent* event) : mEvent(event) -{ - -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsModelItemContainer::~LogsModelItemContainer() -{ - -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsEvent* LogsModelItemContainer::event() const -{ - return mEvent; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logscall.cpp --- a/logsui/logsengine/src/logscall.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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: -* -*/ - -//USER -#include "logscall.h" -#include "logsmodel.h" -#include "logsevent.h" -#include "logslogger.h" -#include "logseventdata.h" - -//SYSTEM -#include -#include - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsCall::LogsCall(LogsEvent& event) - : QObject(), mDefaultCall( TypeLogsCallNotAvailable ) -{ - if ( event.logsEventData() ) { - mServiceId = event.logsEventData()->serviceId(); - } - - if (event.eventType() == LogsEvent::TypeVoIPCall ) { - mCalls.append(LogsCall::TypeLogsVoIPCall); - if ( event.logsEventData() && event.logsEventData()->isCsCompatible()){ - mCalls.append(LogsCall::TypeLogsVoiceCall); - mCalls.append(LogsCall::TypeLogsVideoCall); - } - } else if (event.eventType() == LogsEvent::TypeVoiceCall || - event.eventType() == LogsEvent::TypeVideoCall ) { - mCalls.append(LogsCall::TypeLogsVoiceCall); - mCalls.append(LogsCall::TypeLogsVideoCall); - } - - if (event.eventType() == LogsEvent::TypeVoiceCall){ - mDefaultCall = TypeLogsVoiceCall; - } else if (event.eventType() == LogsEvent::TypeVideoCall) { - mDefaultCall = TypeLogsVideoCall; - } else if (event.eventType() == LogsEvent::TypeVoIPCall) { - mDefaultCall = TypeLogsVoIPCall; - } - mNumber = event.getNumberForCalling(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsCall::LogsCall(unsigned int contactId, const QString& number) - : QObject(), mDefaultCall( TypeLogsCallNotAvailable ), mServiceId(0) -{ - Q_UNUSED(contactId); - mNumber = number; - - if ( mNumber.length() > 0 ) { - mCalls.append(LogsCall::TypeLogsVoiceCall); - mCalls.append(LogsCall::TypeLogsVideoCall); - mDefaultCall = TypeLogsVoiceCall; - } -} - -// ----------------------------------------------------------------------------- -// LogsCall::~LogsCall -// ----------------------------------------------------------------------------- -// -LogsCall::~LogsCall() -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsCall::~LogsCall()" ) -} - -// ---------------------------------------------------------------------------- -// LogsCall::isAllowedCallType -// ---------------------------------------------------------------------------- -// -bool LogsCall::isAllowedCallType() -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsCall::isAllowedCallType()" ) - return (mCalls.count() > 0); -} - -// ---------------------------------------------------------------------------- -// LogsCall::allowedCallTypes -// Voip call not possible at the moment. However, if voip event is CS -// compatible, voice and video call are allowed. -// ---------------------------------------------------------------------------- -// -QList LogsCall::allowedCallTypes() -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsCall::allowedCallTypes()" ) - - return mCalls; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -LogsCall::CallType LogsCall::defaultCallType() -{ - return mDefaultCall; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -void LogsCall::callToNumber(LogsCall::CallType callType, const QString& number, - unsigned int serviceId) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsCall::callToNumber(), type", callType ) - - if (callType == TypeLogsVoiceCall) { - createcall("com.nokia.services.telephony", "dial(QString)", number, false); - } else if (callType == TypeLogsVideoCall) { - createcall("com.nokia.services.telephony", "dialVideo(QString)", number, false); - } else if (callType == TypeLogsVoIPCall){ - if ( serviceId ){ - - // Service id should(?) be used with every call type. If logs entry - // is from xsp with video call support, then the executed - // video call should be mapped to the right xsp? - // also contact must be passed if available if change service is - // provided (no point change service and try to call service specific - // uri with another service)? - createCallWithService("com.nokia.services.telephony", - "dialVoipService(QString,int)", number, false, serviceId); - } - else { - // This is likely to fail as long as telephony does not - // offer any kind of service selection. Normally voip call - // should always have service id set but if it's missing - // for some reason, then this provides call failure UI. - createcall("com.nokia.services.telephony", - "dialVoip(QString)", number, false); - } - } - LOGS_QDEBUG( "logs [ENG] <- LogsCall::callToNumber()" ) -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -void LogsCall::call(LogsCall::CallType callType) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsCall::call(), type", callType ) - - callToNumber(callType, mNumber, mServiceId); - - LOGS_QDEBUG( "logs [ENG] <- LogsCall::call()" ) -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -void LogsCall::initiateCallback() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsCall::initiateCallback()" ) - - if (mDefaultCall != TypeLogsCallNotAvailable ){ - call(mDefaultCall); - } - LOGS_QDEBUG( "logs [ENG] <- LogsCall::initiateCallback()" ) -} - -// ---------------------------------------------------------------------------- -// LogsCall::createcall -// ---------------------------------------------------------------------------- -// -void LogsCall::createcall(QString service, QString type, QString num, bool sync) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsCall::createcall(), num", num ) - XQServiceRequest snd(service, type, sync); - snd << num; - QVariant retValue; - snd.send(retValue); - LOGS_QDEBUG( "logs [ENG] <- LogsCall::createcall()" ) -} - -// ---------------------------------------------------------------------------- -// LogsCall::createCallWithService -// ---------------------------------------------------------------------------- -// -void LogsCall::createCallWithService(QString service, QString type, QString num, - bool sync, unsigned int serviceId ) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsCall::createCallWithService(), num", num ) - LOGS_QDEBUG_2( "logs [ENG] -> LogsCall::createCallWithService(), num", serviceId ) - XQServiceRequest snd(service, type, sync); - snd << num << serviceId; - QVariant retValue; - snd.send(retValue); - LOGS_QDEBUG( "logs [ENG] <- LogsCall::createCallWithService()" ) -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logscommondata.cpp --- a/logsui/logsengine/src/logscommondata.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +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: -* -*/ - -//USER -#include "logscommondata.h" -#include "logslogger.h" - -//SYSTEM -#include - - -static LogsCommonData* mLogsCommonInstance = 0; - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsCommonData::LogsCommonData() : - mContactManager(0), mMaxReadSize(-1), mMaxReadSizeDir(LogsEvent::DirUndefined) -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsCommonData::LogsCommonData()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsCommonData::~LogsCommonData() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsCommonData::~LogsCommonData()" ) - delete mContactManager; - LOGS_QDEBUG( "logs [ENG] <- LogsCommonData::~LogsCommonData()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsCommonData& LogsCommonData::getInstance() -{ - if ( !mLogsCommonInstance ){ - mLogsCommonInstance = new LogsCommonData; - } - return *mLogsCommonInstance; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsCommonData::freeCommonData() -{ - delete mLogsCommonInstance; - mLogsCommonInstance = 0; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QContactManager& LogsCommonData::contactManager() -{ - if (!mContactManager){ - LOGS_QDEBUG( "logs [ENG] -> LogsCommonData::contactManager(), create mgr" ) - mContactManager = new QContactManager("symbian"); - LOGS_QDEBUG( "logs [ENG] <- LogsCommonData::contactManager()" ) - } - return *mContactManager; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsCommonData::configureReadSize(int maxSize, LogsEvent::LogsDirection dir) -{ - mMaxReadSize = maxSize; - mMaxReadSizeDir = dir; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -int LogsCommonData::maxReadSize() const -{ - return mMaxReadSize; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsEvent::LogsDirection LogsCommonData::maxReadSizeDirection() const -{ - return mMaxReadSizeDir; -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logscontact.cpp --- a/logsui/logsengine/src/logscontact.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,266 +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: -* -*/ - -//USER -#include "logscontact.h" -#include "logsmodel.h" -#include "logsevent.h" -#include "logslogger.h" -#include "logseventdata.h" -#include "logsdbconnector.h" -#include "logscommondata.h" - -//SYSTEM -#include -#include -#include - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsContact::LogsContact(LogsEvent& event, LogsDbConnector& dbConnector) - : QObject(), - mDbConnector(dbConnector), - mService(0), - mCurrentRequest(TypeLogsContactSave), - mContactId(0), - mSaveAsOnlineAccount(false) -{ - mNumber = event.getNumberForCalling(); - mContactId = event.contactLocalId(); - mContact = contact(); - if ( event.eventType() == LogsEvent::TypeVoIPCall && - event.logsEventData() && - !event.logsEventData()->remoteUrl().isEmpty() ) { - mSaveAsOnlineAccount = true; - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsContact::LogsContact(const QString& number, - LogsDbConnector& dbConnector, - unsigned int contactId) - : QObject(), - mDbConnector(dbConnector), - mService(0), - mCurrentRequest(TypeLogsContactSave), - mNumber(number), - mContactId(contactId), - mSaveAsOnlineAccount(false) -{ - mContact = contact(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsContact::~LogsContact() -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsContact::~LogsContact()" ) - delete mService; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -LogsContact::RequestType LogsContact::allowedRequestType() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsContact::allowedRequestType()" ) - LogsContact::RequestType type = TypeLogsContactSave; - - if ( isContactInPhonebook() ) { - type = TypeLogsContactOpen; - } - - LOGS_QDEBUG_2( "logs [ENG] <- LogsContact::allowedRequestType(): ", type ) - return type; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsContact::isContactRequestAllowed() -{ - return ( isContactInPhonebook() || !mNumber.isEmpty() ); -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsContact::open() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsContact::open()") - bool ret = false; - if ( allowedRequestType() == TypeLogsContactOpen ) { - mCurrentRequest = TypeLogsContactOpen; - - QList arguments; - arguments.append( QVariant(mContactId) ); - ret = requestFetchService( "open(int)", arguments ); - } - - LOGS_QDEBUG_2( "logs [ENG] <- LogsContact::open(): ", ret ) - return ret; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -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::updateExisting() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsContact::updateExisting()" ) - - bool ret = save("editUpdateExisting(QString,QString)"); - - LOGS_QDEBUG( "logs [ENG] <- LogsContact::updateExisting()" ) - return ret; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsContact::save(QString message) -{ - QList arguments; - - if ( !mNumber.isEmpty() ) { - if ( mSaveAsOnlineAccount ){ - QString type = QContactOnlineAccount::DefinitionName; - arguments.append( QVariant(type) ); - } else { - QString type = QContactPhoneNumber::DefinitionName; - 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..") - } - - return ret; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsContact::requestFetchService( QString message, - const QList &arguments, bool sync ) -{ - QString service("com.nokia.services.phonebookservices.Fetch"); - - delete mService; - mService = 0; - mService = new XQServiceRequest(service, message, sync); - connect(mService, SIGNAL(requestCompleted(QVariant)), this, - SLOT(handleRequestCompleted(QVariant))); - - mService->setArguments(arguments); - - QVariant retValue; - return mService->send(retValue); -} - -// ---------------------------------------------------------------------------- -// Phonebookservices define following return values: -// - contact wasn't modified (-2) -// - was deleted (-1) -// - was saved (1) -// - saving failed (0) -// ---------------------------------------------------------------------------- -// -void LogsContact::handleRequestCompleted(const QVariant& result) -{ - bool retValOk = false; - int serviceRetVal = result.toInt(&retValOk); - LOGS_QDEBUG_3( "logs [ENG] -> LogsContact::handleRequestCompleted(), (retval, is_ok)", - serviceRetVal, retValOk ) - - bool modified = ( retValOk && serviceRetVal == 1 ); - - //If existing contact was modified, cached match for the contact should be - //cleaned up, since remote party info might have been changed. - //However, if remote party info is taken from symbian DB, it won't be - //updated - bool clearCached = ( mCurrentRequest == TypeLogsContactOpen ); - if ( modified ) { - mContact = contact(); - mDbConnector.updateDetails(clearCached); - } - - if ( mCurrentRequest == TypeLogsContactOpen ) { - emit openCompleted(modified); - } else if ( mCurrentRequest == TypeLogsContactSave ) { - emit saveCompleted(modified); - } -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -QContact LogsContact::contact() -{ - if ( mContactId ) { - return LogsCommonData::getInstance().contactManager().contact( mContactId ); - } else { - return QContact(); - } -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsContact::isContactInPhonebook() -{ - QContactLocalId localId = mContactId; - return ( localId && localId == mContact.localId() ); -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logscustomfilter.cpp --- a/logsui/logsengine/src/logscustomfilter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,146 +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: -* -*/ - -//USER -#include "logscustomfilter.h" -#include "logsevent.h" -#include "logseventdata.h" -#include "logsdbconnector.h" -#include "logslogger.h" - -Q_DECLARE_METATYPE(LogsEvent *) - -// ----------------------------------------------------------------------------- -// LogsCustomFilter::LogsCustomFilter -// ----------------------------------------------------------------------------- -// -LogsCustomFilter::LogsCustomFilter() -: QSortFilterProxyModel(), - mContactId(0) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsCustomFilter::LogsCustomFilter()" ) - - // Enable filter check for dataChanged phase - setDynamicSortFilter( true ); - - LOGS_QDEBUG( "logs [ENG] <- LogsCustomFilter::LogsCustomFilter()" ) -} - - -// ----------------------------------------------------------------------------- -// LogsCustomFilter::~LogsCustomFilter -// ----------------------------------------------------------------------------- -// -LogsCustomFilter::~LogsCustomFilter() -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsCustomFilter::~LogsCustomFilter()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCustomFilter::setContactId -// ----------------------------------------------------------------------------- -// -void LogsCustomFilter::setContactId(quint32 contactId) -{ - mContactId = contactId; -} - -// ----------------------------------------------------------------------------- -// LogsCustomFilter::clearEvents -// ----------------------------------------------------------------------------- -// -bool LogsCustomFilter::clearEvents() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsCustomFilter::clearEvents()" ) - bool clearingStarted(false); - LogsAbstractModel* model = qobject_cast( sourceModel() ); - if ( model && model->dbConnector() ){ - connect( model->dbConnector(), SIGNAL(clearingCompleted(int)), - this, SIGNAL(clearingCompleted(int)) ); - QList eventIds = getEventIds(); - if ( !eventIds.isEmpty() ){ - clearingStarted = model->dbConnector()->clearEvents(eventIds); - } - } - LOGS_QDEBUG( "logs [ENG] <- LogsCustomFilter::clearEvents()" ) - return clearingStarted; -} - -// ----------------------------------------------------------------------------- -// LogsCustomFilter::markEventsSeen -// ----------------------------------------------------------------------------- -// -bool LogsCustomFilter::markEventsSeen() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsCustomFilter::markEventsSeen()" ) - bool markingStarted(false); - LogsAbstractModel* model = qobject_cast( sourceModel() ); - if ( model && model->dbConnector() ){ - connect( model->dbConnector(), SIGNAL(markingCompleted(int)), - this, SIGNAL(markingCompleted(int)) ); - QList eventIds = getEventIds(true); - if ( !eventIds.isEmpty() ){ - markingStarted = model->dbConnector()->markEventsSeen(eventIds); - } - } - LOGS_QDEBUG( "logs [ENG] <- LogsCustomFilter::markEventsSeen()" ) - return markingStarted; -} - -// ----------------------------------------------------------------------------- -// LogsCustomFilter::filterAcceptsRow -// From QSortFilterProxyModel -// ----------------------------------------------------------------------------- -// -bool LogsCustomFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const -{ - if ( !sourceModel() ){ - return false; - } - bool accept = false; - QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); - const LogsEvent *event = qVariantValue( sourceModel()->data( - index0, LogsModel::RoleFullEvent) ); - - if ( event && mContactId && event->logsEventData() ){ - accept = ( event->logsEventData()->contactLocalId() == mContactId ); - } - - return accept; -} - -// ----------------------------------------------------------------------------- -// LogsCustomFilter::getEventIds -// ----------------------------------------------------------------------------- -// -QList LogsCustomFilter::getEventIds(bool onlyUnseen) const -{ - QList ids; - for ( int i = 0; i < rowCount(); i++ ){ - const LogsEvent* event = qVariantValue( - data(index(i, 0), LogsModel::RoleFullEvent ) ); - if ( event ){ - if ( !onlyUnseen || ( !event->isRead() && !event->isSeenLocally() ) ){ - ids.append( event->logId() ); - } - } - } - return ids; -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logsdetailsmodel.cpp --- a/logsui/logsengine/src/logsdetailsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,438 +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 "logsdetailsmodel.h" -#include "logsevent.h" -#include "logslogger.h" -#include "logsengdefs.h" -#include "logsdbconnector.h" -#include "logseventdata.h" -#include "logscontact.h" -#include "logscommondata.h" -#include -#include -#include -#include - -Q_DECLARE_METATYPE(LogsContact*) - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsDetailsModel::LogsDetailsModel( LogsDbConnector& dbConnector, LogsEvent& event ) - : LogsAbstractModel(), - mEvent( 0 ) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::LogsDetailsModel()" ) - - mDbConnector = &dbConnector; - - mEvent = new LogsEvent( event ); - - 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()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsDetailsModel::~LogsDetailsModel() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::~LogsDetailsModel()" ) - - delete mEvent; - qDeleteAll(mDetailIcons); - qDeleteAll(mDuplicates); - - LOGS_QDEBUG( "logs [ENG] <- LogsDetailsModel::~LogsDetailsModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsModel::clearEvent() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::clearEvent()" ) - QList eventIds; - eventIds.append(mEvent->logId()); - mDbConnector->clearEvents(eventIds); - LOGS_QDEBUG( "logs [ENG] <- LogsDetailsModel::clearEvent()" ) -} - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -int LogsDetailsModel::rowCount(const QModelIndex & /* parent */) const -{ - return mDetailTexts.count(); -} - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -QVariant LogsDetailsModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid() || index.row() >= mDetailTexts.count() || index.row() < 0 ) { - return QVariant(); - } - - if (role == Qt::DisplayRole){ - QStringList text; - getDisplayData(index.row(), text); - return QVariant(text); - } else if (role == Qt::DecorationRole) { - QList icons; - getDecorationData(index.row(), icons); - return QVariant(icons); - } - LogsModelItemContainer item(mEvent); - return doGetData(role, item); -} - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -QVariant LogsDetailsModel::headerData(int section, Qt::Orientation orientation, - int role) const -{ - Q_UNUSED(section); - Q_UNUSED(orientation); - - if (role == Qt::DisplayRole){ - return QVariant(getHeaderData(*mEvent)); - } - - return QVariant(); -} - -// ----------------------------------------------------------------------------- -// From LogsAbstractModel -// ----------------------------------------------------------------------------- -// -QVariant LogsDetailsModel::createContact(const LogsModelItemContainer& item) const -{ - LOGS_QDEBUG( "logs [ENG] -> LogsDetailsModel::createContact()" ) - - QVariant var = LogsAbstractModel::createContact(item); - LogsContact* contact = qVariantValue(var); - if (contact){ - QObject::connect(contact, SIGNAL(openCompleted(bool)), - this, SLOT(contactActionCompleted(bool))); - QObject::connect(contact, SIGNAL(saveCompleted(bool)), - this, SLOT(contactActionCompleted(bool))); - } - return var; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsModel::contactActionCompleted(bool modified) -{ - if ( modified ){ - mEvent->prepareForContactMatching(); - if ( mEvent->updateRemotePartyFromContacts( - LogsCommonData::getInstance().contactManager() ).length() > 0 ) { - initContent(); - reset(); - } - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -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 ( row < mDetailIcons.count() ){ - iconList << *mDetailIcons.at(row); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsModel::getDisplayData(int row, QStringList& texts) const -{ - if ( row < mDetailTexts.count() ){ - texts << mDetailTexts.at(row); - } -} - -// ----------------------------------------------------------------------------- -// Caller id: -// num -// or remote url -// or no num -// ----------------------------------------------------------------------------- -// -QString LogsDetailsModel::getCallerId(const LogsEvent& event) const -{ - QString callerId(""); - if (event.remoteParty().length() > 0 && event.number().length() > 0){ - callerId = event.number(); - } - - if (event.remoteParty().length() > 0 && getRemoteUri(event).length() > 0){ - callerId = getRemoteUri(event); - } - return callerId; -} - -// ----------------------------------------------------------------------------- -// Caller id: -// name -// or num -// or remote url -// or no num -// ----------------------------------------------------------------------------- -// -QString LogsDetailsModel::getHeaderData(const LogsEvent& event) const -{ - QString headerdata(event.remoteParty()); - if ( headerdata.length() == 0 && event.number().length() > 0 ){ - headerdata = event.number(); - } - - if ( headerdata.length() == 0 ){ - headerdata = getRemoteUri(event); - } - - if ( headerdata.length() == 0 ){ - headerdata = hbTrId("txt_dial_dblist_call_id_val_unknown_number"); - } - return headerdata; -} - -// ----------------------------------------------------------------------------- -// VoIP remote Uri : -// ----------------------------------------------------------------------------- -// -QString LogsDetailsModel::getRemoteUri(const LogsEvent& event) const -{ - QString remoteUri(("")); - if (event.logsEventData()){ - remoteUri = event.logsEventData()->remoteUrl(); - } - return remoteUri; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsModel::getNumberToClipboard() -{ - HbLineEdit *cliptmp = new HbLineEdit(""); - - QString num = mEvent->getNumberForCalling(); - cliptmp->setText(num); - cliptmp->setSelection(0, num.length()); - cliptmp->copy(); - delete cliptmp; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -bool LogsDetailsModel::isAddress(QString value) const -{ - QChar c('@'); - return value.contains(c); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -bool LogsDetailsModel::isOutgoingCall() const -{ - return (mEvent->direction() == LogsEvent::DirOut); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QString LogsDetailsModel::getHeaderValue(QString value,bool isRemote) const -{ - QString headervalue(""); - if (isAddress(value)){ - if ((isOutgoingCall() && isRemote)|| (!isOutgoingCall() && !isRemote)){ - headervalue = hbTrId("txt_dialer_ui_dblist_call_id"); - } - else{ - headervalue = hbTrId("txt_dialer_ui_dblist_call_id"); - } - } - else { - if ((isOutgoingCall() && isRemote)|| (!isOutgoingCall() && !isRemote)) { - headervalue = hbTrId("txt_dialer_ui_dblist_call_id"); - } - else { - headervalue = hbTrId("txt_dialer_ui_dblist_call_id"); - } - } - - return headervalue; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsModel::initContent() -{ - qDeleteAll(mDetailIcons); - mDetailIcons.clear(); - mDetailTexts.clear(); - initTexts(); - initIcons(); - - Q_ASSERT( mDetailIcons.count() == mDetailTexts.count() ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsModel::initTexts() -{ - if (getCallerId(*mEvent).length()!= 0){ - QStringList remotePartyRow; - remotePartyRow << getHeaderValue(getCallerId(*mEvent),true); - remotePartyRow << getCallerId(*mEvent); - mDetailTexts.append(remotePartyRow); - } - - // 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"); - callDirectionRow << mEvent->directionAsString(); - mDetailTexts.append(callDirectionRow); - - QStringList callTypeRow; - callTypeRow << hbTrId("txt_dialer_ui_dblist_call_type"); - callTypeRow << mEvent->typeAsString(); - mDetailTexts.append(callTypeRow); - - 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); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsDetailsModel::initIcons() -{ - if (getCallerId(*mEvent).length()!= 0){ - HbIcon* remotePartyIcon = new HbIcon(logsRemotePartyInfoIconId); - mDetailIcons.append(remotePartyIcon); - } - - HbIcon* dateAndTimeIcon = new HbIcon(logsCallDateAndTimeIconId); - mDetailIcons.append(dateAndTimeIcon); - - HbIcon* directionIcon = new HbIcon( LogsAbstractModel::directionIconName(*mEvent) ); - mDetailIcons.append(directionIcon); - - HbIcon* typeIcon = new HbIcon( LogsAbstractModel::typeIconName(*mEvent) ); - mDetailIcons.append(typeIcon); - - if ( mEvent->direction() != LogsEvent::DirMissed ){ - HbIcon* durationIcon = new HbIcon(logsCallDurationIconId); - mDetailIcons.append(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 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logsevent.cpp --- a/logsui/logsengine/src/logsevent.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,641 +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 FILES - -#include -#include -#include -#include -#include -#include -#include -#include "logsevent.h" -#include "logseventparser.h" -#include "logseventdata.h" -#include "logsengdefs.h" -#include "logslogger.h" - -// CONSTANTS - -// ---------------------------------------------------------------------------- -// logsEvent::logsEvent -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsEvent() - : mLogId(-1), - mDirection(DirUndefined), - mEventType(TypeUndefined), - mUid(0), - mLogsEventData(0), - mDuplicates(0), - mRingDuration(0), - mIsRead(false), - mIsALS(false), - mDuration(0), - mIndex(0), - mIsInView(false), - mEventState(EventAdded), - mIsLocallySeen(false) -{ -} - -// ---------------------------------------------------------------------------- -// LogsEvent::LogsEvent -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsEvent( const LogsEvent& event ) -{ - mLogId = event.mLogId; - mDirection = event.mDirection; - mEventType = event.mEventType; - mUid = event.mUid; - if ( event.mLogsEventData ){ - mLogsEventData = new LogsEventData( *event.mLogsEventData ); - } else { - mLogsEventData = 0; - } - mRemoteParty = event.mRemoteParty; - mNumber = event.mNumber; - mDuplicates = event.mDuplicates; - mTime = event.mTime; - mRingDuration = event.mRingDuration; - mIsRead = event.mIsRead; - mIsALS = event.mIsALS; - mDuration = event.mDuration; - - mIndex = event.mIndex; - mIsInView = event.mIsInView; - mEventState = event.mEventState; - mIsLocallySeen = event.mIsLocallySeen; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::~LogsEvent -// ---------------------------------------------------------------------------- -// -LogsEvent::~LogsEvent() -{ - delete mLogsEventData; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::initializeEventL -// ---------------------------------------------------------------------------- -// -void LogsEvent::initializeEventL( - const CLogEvent& source, - const LogsEventStrings& strings ) -{ - LogsEventParser::parseL(source, *this, strings); - LOGS_QDEBUG_5( "LogsEvent::initializeEvent (num,dir,logid,state):", - mNumber, mDirection, mLogId, mEventState ) -} - - -// ---------------------------------------------------------------------------- -// LogsEvent::isEmergencyNumber -// Checks wether the number is an emergency number -// ---------------------------------------------------------------------------- - -bool LogsEvent::isEmergencyNumber(const QString& number) -{ - return ( number == logsEmergencyCall911 || number == logsEmergencyCall ); -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setDuration() -// ---------------------------------------------------------------------------- -// -void LogsEvent::setDuration( int duration ) -{ - mDuration = duration; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setALS() -// ---------------------------------------------------------------------------- -// -void LogsEvent::setALS( bool isALS ) -{ - mIsALS = isALS; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setLogId -// ---------------------------------------------------------------------------- -// -void LogsEvent::setLogId( int logId ) -{ - mLogId = logId; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setNumber -// ---------------------------------------------------------------------------- -// -bool LogsEvent::setNumber( const QString& number ) - { - bool changed( mNumber != number ); - mNumber = number; - return changed; - } - -// ---------------------------------------------------------------------------- -// LogsEvent::setRemoteParty -// ---------------------------------------------------------------------------- -// -void LogsEvent::setRemoteParty( const QString& remoteParty ) -{ - if ( mEventState == EventNotUpdated && mRemoteParty != remoteParty ){ - LOGS_QDEBUG( "logs [ENG] <-> LogsEvent::setRemoteParty, event updated") - mEventState = LogsEvent::EventUpdated; - } - mRemoteParty = remoteParty; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::validate -// ---------------------------------------------------------------------------- -// -bool LogsEvent::validate() -{ - return ( !mNumber.isEmpty() || !mRemoteParty.isEmpty() || - ( mLogsEventData && !mLogsEventData->remoteUrl().isEmpty() ) ); -} - -// ---------------------------------------------------------------------------- -// LogsEvent::directionAsString -// ---------------------------------------------------------------------------- -// -QString LogsEvent::directionAsString() const -{ - QString dir; - if ( mDirection == DirIn ) { - dir = hbTrId("txt_dialer_ui_dblist_call_direction_val_received"); - } else if ( mDirection == DirOut ) { - dir = hbTrId("txt_dialer_ui_dblist_call_direction_val_dialled"); - } else if ( mDirection == DirMissed ) { - dir = hbTrId("txt_dialer_ui_dblist_call_direction_val_missed"); - } else { - dir = QObject::tr("Direction unknown"); - } - return dir; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::typeAsString -// ---------------------------------------------------------------------------- -// -QString LogsEvent::typeAsString() const -{ - QString type; - if ( mEventType == TypeVoiceCall ) { - type = hbTrId("txt_dialer_ui_dblist_call_type_val_voice_call"); - } else if ( mEventType == TypeVideoCall ) { - type = hbTrId("txt_dialer_ui_dblist_call_type_val_video_call"); - } else if ( mEventType == TypeVoIPCall ) { - type = hbTrId("txt_dialer_ui_dblist_call_type_val_voip_call"); - } else { - type = QObject::tr("Type unknown"); - } - return type; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::getNumberForCalling -// ---------------------------------------------------------------------------- -// -QString LogsEvent::getNumberForCalling() -{ - if (mNumber.isEmpty() && mEventType == TypeVoIPCall && mLogsEventData ) { - return mLogsEventData->remoteUrl(); - } - return mNumber; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setDirection -// ---------------------------------------------------------------------------- -// -bool LogsEvent::setDirection( LogsDirection direction ) -{ - bool changed( mDirection != direction ); - mDirection = direction; - return changed; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setEventUid -// ---------------------------------------------------------------------------- -// -void LogsEvent::setEventUid( int uid ) -{ - mUid = uid; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setEventType -// ---------------------------------------------------------------------------- -// -void LogsEvent::setEventType( LogsEventType eventType ) -{ - mEventType = eventType; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::ALS() -// ---------------------------------------------------------------------------- -// -bool LogsEvent::ALS() const -{ - return mIsALS; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::logId -// ---------------------------------------------------------------------------- -// -int LogsEvent::logId() const -{ - return mLogId; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setIsRead -// ---------------------------------------------------------------------------- -bool LogsEvent::setIsRead(bool isRead) -{ - bool changed( mIsRead != isRead ); - mIsRead = isRead; - return changed; -} - - -// ---------------------------------------------------------------------------- -// LogsEvent::Number -// ---------------------------------------------------------------------------- -// -const QString& LogsEvent::number() const -{ - return mNumber; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::RemoteParty -// ---------------------------------------------------------------------------- -// -const QString& LogsEvent::remoteParty() const -{ - return mRemoteParty; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::Direction -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsDirection LogsEvent::direction() const -{ - return mDirection; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::eventUid -// ---------------------------------------------------------------------------- -// -int LogsEvent::eventUid() const -{ - return mUid; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::eventType -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsEventType LogsEvent::eventType() const -{ - return mEventType; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::isRead -// ---------------------------------------------------------------------------- - bool LogsEvent::isRead() const -{ - return mIsRead; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::RingDuration -// -// For ring duation feature -// ---------------------------------------------------------------------------- -// -int LogsEvent::ringDuration() const -{ - return mRingDuration; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::duration -// ---------------------------------------------------------------------------- -// -int LogsEvent::duration() const -{ - return mDuration; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::SetRingDuration -// ---------------------------------------------------------------------------- -// -void LogsEvent::setRingDuration( int ringDuration ) -{ - mRingDuration = ringDuration; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::LogsEventData -// ---------------------------------------------------------------------------- -// -LogsEventData* LogsEvent::logsEventData() const -{ - return mLogsEventData; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setLogsEventData -// ---------------------------------------------------------------------------- -// -void LogsEvent::setLogsEventData( LogsEventData* logsEventData ) -{ - delete mLogsEventData; - mLogsEventData = logsEventData; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setTime -// -// Time needed in recent views and in detail view (not needed in event view) -// ---------------------------------------------------------------------------- -// -bool LogsEvent::setTime( const QDateTime& time ) -{ - bool changed( mTime != time ); - mTime = time; - return changed; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::time -// ---------------------------------------------------------------------------- -// -QDateTime LogsEvent::time() const -{ - return mTime; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setDuplicates -// -// Duplicates needed only in missed calls view -// ---------------------------------------------------------------------------- -// -void LogsEvent::setDuplicates( int duplicates ) -{ - mDuplicates = duplicates; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::duplicates -// ---------------------------------------------------------------------------- -// -int LogsEvent::duplicates() const -{ - return mDuplicates; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setIndex -// ---------------------------------------------------------------------------- -// -void LogsEvent::setIndex(int index) -{ - mIndex = index; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::index -// ---------------------------------------------------------------------------- -// -int LogsEvent::index() const -{ - return mIndex; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setIsInView -// ---------------------------------------------------------------------------- -// -void LogsEvent::setIsInView(bool isInView) -{ - mIsInView = isInView; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::isInView -// ---------------------------------------------------------------------------- -// -bool LogsEvent::isInView() const -{ - return mIsInView; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::eventState -// ---------------------------------------------------------------------------- -// -LogsEvent::LogsEventState LogsEvent::eventState() const -{ - return mEventState; -} - - -// ---------------------------------------------------------------------------- -// LogsEvent::setContactLocalId -// ---------------------------------------------------------------------------- -// -void LogsEvent::setContactLocalId( unsigned int id ) -{ - if ( !mLogsEventData ) { - mLogsEventData = new LogsEventData; - } - mLogsEventData->setContactLocalId(id); -} - - -// ---------------------------------------------------------------------------- -// LogsEvent::contactLocalId -// ---------------------------------------------------------------------------- -// -unsigned int LogsEvent::contactLocalId() const -{ - unsigned int id = 0; - if ( mLogsEventData ) { - id = mLogsEventData->contactLocalId(); - } - return id; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -QString LogsEvent::updateRemotePartyFromContacts(QContactManager& manager) -{ - QContactDetailFilter phoneFilter; - if ( mEventType == TypeVoIPCall && mLogsEventData && !mLogsEventData->remoteUrl().isEmpty() ) { - phoneFilter.setDetailDefinitionName( QContactOnlineAccount::DefinitionName, - QContactOnlineAccount::FieldAccountUri); - phoneFilter.setValue(mLogsEventData->remoteUrl()); - phoneFilter.setMatchFlags(QContactFilter::MatchExactly); - } else if ( !mNumber.isEmpty() ){ - // remove non-significant parts from number for better matching - phoneFilter.setDetailDefinitionName( QContactPhoneNumber::DefinitionName, - QContactPhoneNumber::FieldNumber); - phoneFilter.setValue(stripPhoneNumber(mNumber)); - phoneFilter.setMatchFlags(QContactFilter::MatchEndsWith); - } else { - // Searching not possible - return QString(); - } - - LOGS_QDEBUG_2( "logs [ENG] Try to find contact for num:", phoneFilter.value().toString() ) - - QString contactNameStr; - 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 - QContact match = manager.contact(matchingContacts.at(0)); - // QContactManager::synthesiseDisplayLabel would be more clean but - // it returns currently "Unnamed" in case of missing name which we - // cannot use. - QContactName contactName = match.detail(QContactName::DefinitionName); - contactNameStr = parseContactName(contactName); - if (contactNameStr.length() > 0){ - LOGS_QDEBUG_3( "getRemotePartyFromContacts, (name, num):", - contactNameStr, mNumber ); - // Fill event with new contact info - setRemoteParty( contactNameStr ); - setContactLocalId( matchingContacts.at(0) ); - } - } - return contactNameStr; -} - - -// ---------------------------------------------------------------------------- -// LogsEvent::stripPhoneNumber -// ---------------------------------------------------------------------------- -// -QString LogsEvent::stripPhoneNumber(const QString& num) -{ - // Remove international part from beginning if starts with '+' - // and leading digit can be removed if doesn't start with '+' - // NOTE: since international part is not fixed length, this - // approach is not bulletproof (i.e. if international part is - // only one digit long, part of group identification code is ignored - // which might lead to incorrect matching in case where user - // would have two contacts with same subscriber number part but for - // different operator (quite unlikely). - - if ( num.length() == 0 ){ - return num; - } - QString modifiedNum( num ); - if ( modifiedNum.at(0) == '+' ) { - // QString handles automatically case of removing too much - const int removePlusAndInternationalPart = 4; - modifiedNum.remove( 0, removePlusAndInternationalPart ); - } - else { - const int removeFirstDigit = 1; - modifiedNum.remove( 0, removeFirstDigit ); - } - - return modifiedNum; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::parseContactName -// ---------------------------------------------------------------------------- -// -QString LogsEvent::parseContactName(const QContactName& name) -{ - QString firstName = name.value(QContactName::FieldFirst); - QString lastName = name.value(QContactName::FieldLast); - QString parsedName; - if (!lastName.isEmpty()) { - if (!firstName.isEmpty()) { - parsedName = - QString(QLatin1String("%1 %2")).arg(firstName).arg(lastName); - } - else { - parsedName = lastName; - } - } else if (!firstName.isEmpty()) { - parsedName = firstName; - } - return parsedName; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -void LogsEvent::prepareForContactMatching() -{ - // If event would be in "added" state when contact mathing is done, event state - // would not go to "updated" in case of associated contact was modified or - // new matching contact was found. This would prevent list update. - if ( mEventState == EventAdded ) { - LOGS_QDEBUG( "logs [ENG] <-> LogsEvent::prepareForContactMatching, prepared") - mEventState = EventNotUpdated; - } -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -void LogsEvent::markedAsSeenLocally(bool markedAsSeen) -{ - mIsLocallySeen = markedAsSeen; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsEvent::isSeenLocally() const -{ - return mIsLocallySeen; -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logseventdata.cpp --- a/logsui/logsengine/src/logseventdata.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,221 +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 FILES -#include "logseventdata.h" -#include "logsevent.h" -#include "logseventdataparser.h" - -#include -#include - -// ---------------------------------------------------------------------------- -// LogsEventData::LogsEventData -// ---------------------------------------------------------------------------- -// -LogsEventData::LogsEventData() : - mIsCNAP( false ), - mIsVT( false ), - mIsPoC( false ), - mIsVoIP( false ), - mIsEmerg( false ), - mDataSent( 0 ), - mDataReceived( 0 ), - mMsgPartsNumber( 0 ), - mServiceId( 0 ), - mContactLocalId( 0 ), - mRemoteUrl(), - mLocalUrl() -{ -} - -// ---------------------------------------------------------------------------- -// LogsEventData::LogsEventData -// ---------------------------------------------------------------------------- -// -LogsEventData::LogsEventData( const LogsEventData& data ) -{ - mIsCNAP = data.mIsCNAP; - mIsVT = data.mIsVT; - mIsPoC = data.mIsPoC; - mIsVoIP = data.mIsVoIP; - mIsEmerg = data.mIsEmerg; - mDataSent = data.mDataSent; - mDataReceived = data.mDataReceived; - mMsgPartsNumber = data.mMsgPartsNumber; - mServiceId = data.mServiceId; - mContactLocalId = data.mContactLocalId; - mRemoteUrl = data.mRemoteUrl; - mLocalUrl = data.mLocalUrl; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::~LogsEventData -// ---------------------------------------------------------------------------- -// -LogsEventData::~LogsEventData() -{ -} - -// ---------------------------------------------------------------------------- -// LogsEventData::parse -// ---------------------------------------------------------------------------- -// -int LogsEventData::parse( const CLogEvent& source ) -{ - return LogsEventDataParser::parse(source, *this); -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isCNAP -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isCNAP() const -{ - return mIsCNAP; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isVT -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isVT() const -{ - return mIsVT; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isPoC -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isPoC() const -{ - return mIsPoC; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isVoIP -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isVoIP() const -{ - return mIsVoIP; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::dataReceived -// ---------------------------------------------------------------------------- -// -long long LogsEventData::dataReceived() const -{ - return mDataReceived; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::dataSent -// ---------------------------------------------------------------------------- -// -long long LogsEventData::dataSent() const -{ - return mDataSent; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::isEmerg -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isEmerg() const -{ - return mIsEmerg; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::MsgPartsNumber -// -// Msg parts. This info is meaningful only for sms events -// ---------------------------------------------------------------------------- -// -int LogsEventData::msgPartsNumber() const -{ - return mMsgPartsNumber; -} - -// ---------------------------------------------------------------------------- -// LogsEventData::ServiceId -// -// Returns the Service ID of the log event. -// ---------------------------------------------------------------------------- -// -unsigned int LogsEventData::serviceId() const -{ - return mServiceId; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -QString LogsEventData::remoteUrl() const -{ - return mRemoteUrl; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -QString LogsEventData::localUrl() const -{ - return mLocalUrl; -} - -// ---------------------------------------------------------------------------- -// Checks whether event data can be used in CS context -// ---------------------------------------------------------------------------- -// -bool LogsEventData::isCsCompatible() -{ - bool compatible( true ); - if ( !mRemoteUrl.isEmpty() ){ - // Url can start with plus but after that can contain only digits - // to be CS compatible. - QRegExp rx( "\\+{0,1}\\d*$" ); - QRegExpValidator validator(rx, 0); - int pos( 0 ); - compatible = ( validator.validate( mRemoteUrl, pos ) == QValidator::Acceptable ); - } - return compatible; -} - - -// ---------------------------------------------------------------------------- -// LogsEventData::contactLocalId -// ---------------------------------------------------------------------------- -// -unsigned int LogsEventData::contactLocalId() const -{ - return mContactLocalId; -} - -// ---------------------------------------------------------------------------- -// LogsEvent::setContactLocalId -// ---------------------------------------------------------------------------- -// -void LogsEventData::setContactLocalId(unsigned int id) -{ - mContactLocalId = id; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logsfilter.cpp --- a/logsui/logsengine/src/logsfilter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +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: -* -*/ - -//USER -#include "logsfilter.h" -#include "logsevent.h" -#include "logslogger.h" -#include "logscommondata.h" - -Q_DECLARE_METATYPE(LogsEvent *) - -// ----------------------------------------------------------------------------- -// LogsFilter::LogsFilter -// ----------------------------------------------------------------------------- -// -LogsFilter::LogsFilter( FilterType type ) -: QSortFilterProxyModel(), mFilterType( type ) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsFilter::LogsFilter(), type:", mFilterType ) - - // Enable filter check for dataChanged phase - setDynamicSortFilter( true ); - - LOGS_QDEBUG( "logs [ENG] <- LogsFilter::LogsFilter()" ) -} - - -// ----------------------------------------------------------------------------- -// LogsFilter::~LogsFilter -// ----------------------------------------------------------------------------- -// -LogsFilter::~LogsFilter() -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsFilter::~LogsFilter()" ) -} - -// ----------------------------------------------------------------------------- -// LogsFilter::filterType -// ----------------------------------------------------------------------------- -// -LogsFilter::FilterType LogsFilter::filterType() const -{ - return mFilterType; -} - -// ----------------------------------------------------------------------------- -// LogsFilter::clearType -// ----------------------------------------------------------------------------- -// -LogsModel::ClearType LogsFilter::clearType() const -{ - LogsModel::ClearType cleartype(LogsModel::TypeLogsClearAll); - switch (mFilterType){ - case All: - cleartype = LogsModel::TypeLogsClearAll; - break; - case Received: - cleartype = LogsModel::TypeLogsClearReceived; - break; - case Called: - cleartype = LogsModel::TypeLogsClearCalled; - break; - case Missed: - cleartype = LogsModel::TypeLogsClearMissed; - break; - default: - break; - } - return cleartype; -} - -// ----------------------------------------------------------------------------- -// LogsFilter::setMaxSize -// ----------------------------------------------------------------------------- -// -void LogsFilter::setMaxSize(int maxSize) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsFilter::LogsFilter(), maxSize", maxSize ) - - LogsEvent::LogsDirection dir( LogsEvent::DirUndefined ); - if ( mFilterType == Missed ){ - dir = LogsEvent::DirMissed; - } else if ( mFilterType == Received ){ - dir = LogsEvent::DirIn; - } else if ( mFilterType == Called ){ - dir = LogsEvent::DirOut; - } - LogsCommonData::getInstance().configureReadSize(maxSize, dir); - - LOGS_QDEBUG( "logs [ENG] <- LogsFilter::setMaxSize()" ) -} - -// ----------------------------------------------------------------------------- -// LogsFilter::filterAcceptsRow -// From QSortFilterProxyModel -// ----------------------------------------------------------------------------- -// -bool LogsFilter::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const -{ - if ( !sourceModel() ){ - return false; - } - bool accept = false; - QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); - const LogsEvent *event = qVariantValue( sourceModel()->data( - index0, LogsModel::RoleFullEvent) ); - - if ( event ){ - switch (mFilterType){ - case All: - accept = true; - break; - case Received: - accept = ( event->direction() == LogsEvent::DirIn ); - break; - case Called: - accept = ( event->direction() == LogsEvent::DirOut ); - break; - case Missed: - accept = ( event->direction() == LogsEvent::DirMissed ); - break; - default: - break; - } - } - return accept; -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logsmatchesmodel.cpp --- a/logsui/logsengine/src/logsmatchesmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,660 +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 "logsmatchesmodel.h" -#include "logsmodel.h" - -#include "logsevent.h" -#include "logslogger.h" -#include "logsengdefs.h" -#include "logsdbconnector.h" -#include "logscntfinder.h" -#include "logsdetailsmodel.h" -#include "logscall.h" -#include "logsmessage.h" -#include "logscontact.h" -#include "logseventdata.h" -#include "logsthumbnailmanager.h" -#include "logscommondata.h" -#include -#include -#include -#include - -Q_DECLARE_METATYPE(LogsEvent *) -Q_DECLARE_METATYPE(LogsCall *) -Q_DECLARE_METATYPE(LogsMessage *) -Q_DECLARE_METATYPE(LogsContact *) -Q_DECLARE_METATYPE(LogsDetailsModel *) - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMatchesModel::LogsMatchesModel( - LogsAbstractModel& parentModel, LogsDbConnector& dbConnector ) - : LogsAbstractModel(), - mParentModel(parentModel), - mIconManager(0) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::LogsMatchesModel()" ) - - mDbConnector = &dbConnector; - - mLogsCntFinder = new LogsCntFinder(LogsCommonData::getInstance().contactManager()); - connect(mLogsCntFinder, SIGNAL(queryReady()),this, SLOT(queryReady())); - - connect( &parentModel, SIGNAL( dataChanged(const QModelIndex&,const QModelIndex&)), - this, SLOT(eventsUpdated(const QModelIndex&,const QModelIndex&))); - connect( &parentModel, SIGNAL( rowsInserted(const QModelIndex&,int,int)), - this, SLOT(eventsAdded(const QModelIndex&,int,int))); - connect( &parentModel, SIGNAL( rowsRemoved(const QModelIndex&,int,int)), - this, SLOT(eventsRemoved(const QModelIndex&,int,int))); - connect( &parentModel, SIGNAL(modelReset()), this, SLOT(doModelReset())); - readEvents(0, mParentModel.rowCount()); - mIconManager = new LogsThumbIconManager(); - connect(mIconManager, SIGNAL(contactIconReady(int)),this, SLOT(updateContactIcon(int))); - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::LogsMatchesModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMatchesModel::~LogsMatchesModel() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::~LogsMatchesModel()" ) - - delete mLogsCntFinder; - qDeleteAll(mMatches); - delete mIconManager; - - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::~LogsMatchesModel()" ) -} - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -int LogsMatchesModel::rowCount(const QModelIndex & /* parent */) const -{ - return mMatches.count(); -} - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -QVariant LogsMatchesModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid() || index.row() >= mMatches.count() || index.row() < 0 ) { - return QVariant(); - } - - LogsMatchesModelItemContainer* item = mMatches.at(index.row()); - updateSearchResult(*item); - if (role == Qt::DisplayRole){ - return( QVariant( item->texts() ) ); - } else if (role == Qt::DecorationRole) { - return( QVariant( item->icons(index.row()) ) ); - } else if ( role == RoleDetailsModel ) { - LOGS_QDEBUG( "logs [ENG] LogsMatchesModel::data() RoleDetailsModel" ) - LogsDetailsModel* detailsModel = 0; - LogsEvent* event = item->event(); - if ( event ) { - detailsModel = new LogsDetailsModel( *mDbConnector, *event ); - } - QVariant var = qVariantFromValue( detailsModel ); - return var; - } - return doGetData(role, *item); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsMatchesModel::createCall(const LogsModelItemContainer& item) const -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::createCall()" ) - LogsEvent* event = item.event(); - if ( event ){ - return LogsAbstractModel::createCall(item); - } - const LogsMatchesModelItemContainer& matchItem = - static_cast( item ); - LogsCall* logscall = new LogsCall(matchItem.contact(), matchItem.number()); - if (!logscall->isAllowedCallType()) { - delete logscall; - logscall = 0; - } - QVariant var = qVariantFromValue(logscall); - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::createCall()" ) - return var; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsMatchesModel::createMessage(const LogsModelItemContainer& item) const -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::createMessage()" ) - LogsEvent* event = item.event(); - if ( event ){ - return LogsAbstractModel::createMessage(item); - } - const LogsMatchesModelItemContainer& matchItem = - static_cast( item ); - LogsMessage* logsMessage = new LogsMessage(matchItem.contact(), matchItem.number(),matchItem.contactName()); - if (!logsMessage->isMessagingAllowed()) { - delete logsMessage; - logsMessage = 0; - } - QVariant var = qVariantFromValue(logsMessage); - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::createMessage()" ) - return var; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QVariant LogsMatchesModel::createContact(const LogsModelItemContainer& item) const -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::createContact()" ) - LogsEvent* event = item.event(); - if ( event ){ - return LogsAbstractModel::createContact(item); - } - const LogsMatchesModelItemContainer& matchItem = - static_cast( item ); - LogsContact* logsContact = - new LogsContact(matchItem.number(), *mDbConnector, matchItem.contact()); - if ( !logsContact->isContactRequestAllowed() ) { - delete logsContact; - logsContact = 0; - } - QVariant var = qVariantFromValue(logsContact); - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::createContact()" ) - return var; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::queryReady() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::queryReady()" ); - - qDeleteAll(mMatches); - mMatches.clear(); - for (int i = 0; i < mLogsCntFinder->resultsCount();i++){ - addSearchResult(i); - } - reset(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::eventsUpdated(const QModelIndex& first, const QModelIndex& last) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::eventsUpdated()" ); - bool updated( false ); - QMap::const_iterator i; - for (i = mSearchEvents.constBegin(); i != mSearchEvents.constEnd(); ++i){ - if ( i.value()->index() >= first.row() && i.value()->index() <= last.row() ){ - LogsCntEntry* entry = mLogsCntFinder->getEntry(*i.key()); - if ( entry ){ - updateSearchEntry(*entry, *i.value()); - updated = true; - } - } - } - - if ( updated ){ - getLogsMatches( mCurrentSearchPattern, true, true ); - } - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::eventsUpdated()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::eventsAdded(const QModelIndex& parent, int first, int last) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::eventsAdded()" ); - Q_UNUSED(parent); - readEvents(first, last); - getLogsMatches( mCurrentSearchPattern, true, true ); - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::eventsAdded()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::eventsRemoved(const QModelIndex& parent, int first, int last) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::eventsRemoved()" ); - Q_UNUSED(parent); - bool removed( false ); - QMap::iterator i; - for (i = mSearchEvents.begin(); i != mSearchEvents.end(); ++i){ - if ( i.value()->index() >= first && i.value()->index() <= last && - !i.value()->isInView() ){ - mLogsCntFinder->deleteEntry(*i.key()); - i = mSearchEvents.erase(i); - removed = true; - } - } - - if ( removed ){ - getLogsMatches( mCurrentSearchPattern, true, true ); - } - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::eventsRemoved()" ); -} - -// ----------------------------------------------------------------------------- -// Add result container but don't get real data yet. Get data once it is -// really needed. -// ----------------------------------------------------------------------------- -// -bool LogsMatchesModel::addSearchResult(int resultIndex) -{ - LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer( - mParentModel, *mIconManager, resultIndex); - mMatches.append(item); - return true; -} - -// ----------------------------------------------------------------------------- -// Fill result container with real data if it does not yet contain it -// ----------------------------------------------------------------------------- -// -bool LogsMatchesModel::updateSearchResult(LogsMatchesModelItemContainer& item) const -{ - bool updated( false ); - int resIndex = item.resultIndex(); - if ( item.isNull() && resIndex >= 0 && resIndex < mLogsCntFinder->resultsCount() ){ - const LogsCntEntry& result = mLogsCntFinder->resultAt(resIndex); - if ( result.type() == LogsCntEntry::EntryTypeHistory ){ - LogsEvent* event = mSearchEvents.value(result.handle()); - if ( event ){ - item.setEvent(*event); - item.updateData(result); - updated = true; - } - } else { - item.setContact(result.contactId()); - item.updateData(result); - updated = true; - } - } - return updated; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::readEvents(int first, int last) -{ - for ( int i = first; i < mParentModel.rowCount() && i <= last; ++i ){ - LogsEvent* event = qVariantValue( - mParentModel.data( mParentModel.index(i, 0), LogsModel::RoleFullEvent ) ); - if ( event ){ - QObject* entryHandle = new QObject(this); - LogsCntEntry* entry = new LogsCntEntry(*entryHandle, 0); - updateSearchEntry(*entry, *event); - mLogsCntFinder->insertEntry(i, entry); - mSearchEvents.insert(entryHandle, event); - } - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -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 - // user types fast. - getLogsMatches(pattern, true); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -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; - if ( force ){ - // Clear previous results immeditely as some data associated with results - // might be already gone. - doModelReset(); - mPrevSearchPattern.clear(); - } - if ( async ){ - QMetaObject::invokeMethod(this, "doSearchQuery", Qt::QueuedConnection ); - } else { - doSearchQuery(); - } - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::getLogsMatches()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::doSearchQuery() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::doSearchQuery()" ); - if ( mCurrentSearchPattern != mPrevSearchPattern ){ - mPrevSearchPattern = mCurrentSearchPattern; - if ( mCurrentSearchPattern.length() > 0 ) { - LOGS_QDEBUG( "logs [ENG] do search" ); - mLogsCntFinder->predictiveSearchQuery( mCurrentSearchPattern ); - } else { - // Clear old results for empty search pattern - doModelReset(); - } - } - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::doSearchQuery()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::doModelReset() -{ - qDeleteAll(mMatches); - mMatches.clear(); - reset(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::updateSearchEntry(LogsCntEntry& entry, LogsEvent& event) -{ - if ( event.remoteParty().length() > 0 ) { - entry.setFirstName(event.remoteParty()); - } else if ( event.number().length() > 0 ) { - entry.setPhoneNumber(stripPhoneNumber(event.number())); - } else if ( event.eventType() == LogsEvent::TypeVoIPCall && event.logsEventData() ){ - if ( event.logsEventData()->isCsCompatible() ){ - entry.setPhoneNumber(stripPhoneNumber(event.logsEventData()->remoteUrl())); - } else { - entry.setFirstName(event.logsEventData()->remoteUrl()); - } - } -} - -// ----------------------------------------------------------------------------- -//Update the icon for the contact with the given index (row) -//param index of the contact -// ----------------------------------------------------------------------------- -// -void LogsMatchesModel::updateContactIcon(int index) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::updateContactIcon()" ); - QModelIndex modelIndex = createIndex(index, 0); - emit dataChanged(modelIndex, modelIndex); - LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::updateContactIcon()" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QString LogsMatchesModel::stripPhoneNumber(const QString& phoneNumber) const -{ - if ( phoneNumber.startsWith(QLatin1Char('+')) ){ - return phoneNumber.mid(1); - } - return phoneNumber; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMatchesModelItemContainer::LogsMatchesModelItemContainer( - LogsAbstractModel& parentModel, - LogsThumbIconManager& thumbIconManager, - int resultIndex) : - LogsModelItemContainer(), - mParentModel(parentModel), - mContactId( 0 ), - mIconManager(thumbIconManager), - mResultIndex(resultIndex) -{ - -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMatchesModelItemContainer::~LogsMatchesModelItemContainer() -{ - delete mEvent; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModelItemContainer::setEvent(const LogsEvent& event) -{ - delete mEvent; - mEvent = 0; - mEvent = new LogsEvent(event); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModelItemContainer::setContact(unsigned int contactId) -{ - mContactId = contactId; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -unsigned int LogsMatchesModelItemContainer::contact() const -{ - return mContactId; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QString LogsMatchesModelItemContainer::number() const -{ - QString num; - if ( mEvent ){ - num = mEvent->getNumberForCalling(); - } else if ( mContactId > 0 ) { - QContact contact = LogsCommonData::getInstance().contactManager().contact( mContactId ); - QContactPhoneNumber contactNum = - contact.detail( QContactPhoneNumber::DefinitionName ); - num = contactNum.value(QContactPhoneNumber::FieldNumber); - } - return num; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QString LogsMatchesModelItemContainer::contactName() const -{ - return mContactName; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -bool LogsMatchesModelItemContainer::isNull() const -{ - return ( !mEvent && !mContactId ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -bool LogsMatchesModelItemContainer::isEventMatch() const -{ - return ( mEvent != 0 ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QStringList LogsMatchesModelItemContainer::texts() -{ - QStringList list; - if ( mEvent ){ - list << mFormattedCallerId; - list << mEvent->time().toTimeSpec(Qt::LocalTime).toString(); - } else if ( mContactId > 0 ) { - list << mContactName; - list << mContactNumber; - } - return list; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QList LogsMatchesModelItemContainer::icons(int row) -{ - QList icons; - if ( mEvent ) { - mParentModel.getDecorationData(*mEvent, icons); - } else if ( mContactId > 0 ) { - QIcon& icon = mIconManager.contactIcon( mAvatarPath, row ); - icons.append(icon); - } - return icons; - -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModelItemContainer::updateData(const LogsCntEntry& entry) -{ - if ( mEvent ){ - mFormattedCallerId = getFormattedCallerId(entry); - } else if ( mContactId > 0 ){ - getFormattedContactInfo(entry, mContactName, mContactNumber); - mAvatarPath.clear(); - mAvatarPath = entry.avatarPath(); - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -int LogsMatchesModelItemContainer::resultIndex() const -{ - return mResultIndex; -} - -// ----------------------------------------------------------------------------- -// Note: Mapping of search result entry into caller ID is depended on -// updateSearchEntry() implemention. -// ----------------------------------------------------------------------------- -// -QString LogsMatchesModelItemContainer::getFormattedCallerId( - const LogsCntEntry& entry) const -{ - QString callerId; - foreach( LogsCntText name, entry.firstName() ) { - callerId.append( name.richText() ); - if ( name.text().length() > 0 ) { - callerId.append(" "); - } - } - - if ( callerId.length() == 0 ) { - callerId = entry.phoneNumber().richText(); - } - - return callerId.trimmed(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsMatchesModelItemContainer::getFormattedContactInfo( - const LogsCntEntry& entry, - QString& contactName, - QString& contactNumber ) const -{ - contactName.clear(); - foreach( LogsCntText name, entry.firstName() ) { - contactName.append( name.richText() ); - if ( name.text().length() > 0 ) { - contactName.append(" "); - } - } - - foreach( LogsCntText lastname, entry.lastName() ) { - contactName.append( lastname.richText() ); - if ( lastname.text().length() > 0 ) { - contactName.append(" "); - } - } - contactName = contactName.trimmed(); - - contactNumber = entry.phoneNumber().richText(); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logsmessage.cpp --- a/logsui/logsengine/src/logsmessage.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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: -* -*/ - -//USER -#include "logsmessage.h" -#include "logslogger.h" -#include "logseventdata.h" -#include - -//SYSTEM - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMessage::LogsMessage(LogsEvent& event) - :QObject(), mIsAllowed( false ), mContactId( 0 ), mService( 0 ) -{ - if ( event.logsEventData() && !event.logsEventData()->isCsCompatible() ){ - LOGS_QDEBUG( "logs [ENG] LogsMessage::LogsMessage, not CS compatible" ) - mIsAllowed = false; - } else { - mIsAllowed = true; - mNumber = event.getNumberForCalling(); - mContactId = event.contactLocalId(); - mDisplayName = event.remoteParty(); - } - -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -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" ) - mIsAllowed = false; - } else { - mIsAllowed = true; - mNumber = number; - mContactId = contactId; - mDisplayName = displayName; - } -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMessage::~LogsMessage() -{ - LOGS_QDEBUG( "logs [ENG] <-> LogsMessage::~LogsMessage()" ) - delete mService; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsMessage::isMessagingAllowed() -{ - return mIsAllowed; -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsMessage::sendMessage() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsMessage::sendMessage()" ) - - 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()" ) - - 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 ret; -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logsmodel.cpp --- a/logsui/logsengine/src/logsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,357 +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 "logsmodel.h" -#include "logsdbconnector.h" -#include "logsevent.h" -#include "logslogger.h" -#include "logscall.h" -#include "logscontact.h" -#include "logsengdefs.h" -#include "logsdetailsmodel.h" -#include "logsmatchesmodel.h" -#include "logsmessage.h" -#include "logseventdata.h" -#include "logscommondata.h" -#include -#include - -Q_DECLARE_METATYPE(LogsEvent *) -Q_DECLARE_METATYPE(LogsCall *) -Q_DECLARE_METATYPE(LogsDetailsModel *) -Q_DECLARE_METATYPE(LogsMessage *) -Q_DECLARE_METATYPE(LogsContact *) -Q_DECLARE_METATYPE(LogsMatchesModel *) - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsModel::LogsModel(LogsModelType modelType) : - LogsAbstractModel(), mModelType(modelType) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsModel::LogsModel()" ) - - initIcons(); - - bool allEvents( mModelType == LogsFullModel ); - mDbConnector = new LogsDbConnector( mEvents, allEvents ); - connect( mDbConnector, SIGNAL( dataAdded(QList) ), - this, SLOT( dataAdded(QList) )); - connect( mDbConnector, SIGNAL( dataUpdated(QList) ), - this, SLOT( dataUpdated(QList) )); - connect( mDbConnector, SIGNAL( dataRemoved(QList) ), - this, SLOT( dataRemoved(QList) )); - mDbConnector->init(); - mDbConnector->start(); - - LOGS_QDEBUG( "logs [ENG] <- LogsModel::LogsModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsModel::~LogsModel() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsModel::~LogsModel()" ) - - delete mDbConnector; - - LogsCommonData::freeCommonData(); - - LOGS_QDEBUG( "logs [ENG] <- LogsModel::~LogsModel()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -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); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -bool LogsModel::markEventsSeen(LogsModel::ClearType cleartype) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsModel::markEventsSeen()" ) - - QList markedEvents; - foreach ( LogsEvent* event, mEvents ){ - if ( matchEventWithClearType(*event, cleartype) && - !event->isRead() && !event->isSeenLocally() ){ - markedEvents.append(event->logId()); - } - } - connect( mDbConnector, SIGNAL(markingCompleted(int)), - this, SIGNAL(markingCompleted(int)) ); - bool retVal = mDbConnector->markEventsSeen(markedEvents); - LOGS_QDEBUG_2( "logs [ENG] <- LogsModel::markEventsSeen()", retVal ) - return retVal; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -int LogsModel::clearMissedCallsCounter() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsModel::clearMissedCallsCounter()" ) - int err = mDbConnector->clearMissedCallsCounter(); - LOGS_QDEBUG_2( "logs [ENG] <- LogsModel::clearMissedCallsCounter(), err", err ) - return err; -} - -// ----------------------------------------------------------------------------- -// From QAbstractListModel -// ----------------------------------------------------------------------------- -// -int LogsModel::rowCount(const QModelIndex & /* parent */) const -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsModel::rowCount()", mEvents.count() ) - return mEvents.count(); -} - -// ----------------------------------------------------------------------------- -// From QAbstractItemModel -// ----------------------------------------------------------------------------- -// -QVariant LogsModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid() || - index.row() >= mEvents.count() || - index.row() < 0 ) { - return QVariant(); - } - - LogsEvent* event = mEvents.at(index.row()); - if (role == Qt::DisplayRole){ - QStringList list; - list << getCallerId( *event ); - list << event->time().toTimeSpec(Qt::LocalTime).toString(); - return QVariant(list); - } else if (role == Qt::DecorationRole) { - QList icons; - getDecorationData(*event, icons); - return QVariant(icons); - } else if ( role == RoleDetailsModel ) { - LOGS_QDEBUG( "logs [ENG] LogsModel::data() RoleDetailsModel" ) - LogsDetailsModel* detailsModel = - new LogsDetailsModel( *mDbConnector, *event ); - QVariant var = qVariantFromValue( detailsModel ); - return var; - } - LogsModelItemContainer item(event); - return doGetData(role, item); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsMatchesModel* LogsModel::logsMatchesModel() -{ - LOGS_QDEBUG( "logs [ENG] LogsModel::logsMatchesModel()" ) - return new LogsMatchesModel( *this, *mDbConnector ); -} - -// ----------------------------------------------------------------------------- -// NOTE: documentation mentions that beginInsertRows should be called -// before adding data to the model. We are not conforming to that at -// the moment and still everything works fine. If there is problems -// in future, dbconnector should give prenotification about data addition. -// Same applies for dataUpdated and dataRemoved. -// ----------------------------------------------------------------------------- -// -void LogsModel::dataAdded(QList addedIndexes) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsModel::dataAdded(), idxs:", addedIndexes ); - LOGS_QDEBUG_EVENT_ARR(mEvents) - - QList< QList > sequences = findSequentialIndexes(addedIndexes); - for ( int i = 0; i < sequences.count(); i++ ) { - beginInsertRows(QModelIndex(), sequences.at(i).first(), sequences.at(i).last()); - endInsertRows(); - } - LOGS_QDEBUG( "logs [ENG] <- LogsModel::dataAdded()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsModel::dataUpdated(QList updatedIndexes) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsModel::dataUpdated(), idxs:", updatedIndexes ); - LOGS_QDEBUG_EVENT_ARR(mEvents) - - QList< QList > sequences = findSequentialIndexes(updatedIndexes); - for ( int i = 0; i < sequences.count(); i++ ) { - QModelIndex top = index(sequences.at(i).first()); - QModelIndex bottom = index(sequences.at(i).last()); - emit dataChanged(top, bottom); - } - LOGS_QDEBUG( "logs [ENG] <- LogsModel::dataUpdated()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsModel::dataRemoved(QList removedIndexes) -{ - LOGS_QDEBUG_2( "logs [ENG] -> LogsModel::dataRemoved(), idxs:", removedIndexes ); - LOGS_QDEBUG_EVENT_ARR(mEvents) - - QList< QList > sequences = findSequentialIndexes(removedIndexes); - for ( int i = ( sequences.count() - 1 ); i >= 0; i-- ) { - beginRemoveRows(QModelIndex(), sequences.at(i).first(), sequences.at(i).last()); - endRemoveRows(); - } - LOGS_QDEBUG( "logs [ENG] <- LogsModel::dataRemoved()" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QList< QList > LogsModel::findSequentialIndexes(const QList& indexes) -{ - QList< QList > sequences; - QList currSequence; - int prevIndex = indexes.at(0) - 1; - for ( int i = 0; i < indexes.count(); i++ ){ - int currIndex = indexes.at(i); - if ( prevIndex+1 != currIndex ){ - - sequences.append(currSequence); - currSequence.clear(); - } - currSequence.append(currIndex); - prevIndex = currIndex; - } - - if ( !currSequence.isEmpty() ){ - // Add last sequence if such exist - sequences.append(currSequence); - } - return sequences; -} - -// ----------------------------------------------------------------------------- -// Caller id: -// name -// or num -// or remote url -// or no num -// ----------------------------------------------------------------------------- -// -QString LogsModel::getCallerId(const LogsEvent& event) const -{ - QString callerId(event.remoteParty()); - if ( callerId.length() == 0 ){ - callerId = event.number(); - } - if ( callerId.length() == 0 && event.logsEventData() ){ - callerId = event.logsEventData()->remoteUrl(); - } - if ( callerId.length() == 0 ){ - callerId = tr("No number"); - } - int duplicates = event.duplicates(); - if ( duplicates > 0 && !event.isRead() ){ - callerId.append( "(" ); - callerId.append( QString::number(duplicates + 1) ); - callerId.append( ")"); - } - return callerId; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsModel::initIcons() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsModel::LogsModel()" ) - - HbIcon* icon = new HbIcon(logsDialledVoiceCallIconId); - 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); - - icon = new HbIcon(logsDialledVideoCallIconId); - 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); - - icon = new HbIcon(logsDialledVoipCallIconId); - 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); - - LOGS_QDEBUG( "logs [ENG] <- LogsModel::LogsModel()" ) -} - -// ---------------------------------------------------------------------------- -// -// ---------------------------------------------------------------------------- -// -bool LogsModel::matchEventWithClearType( - const LogsEvent& event, LogsModel::ClearType clearType) -{ - bool match( false ); - LogsEvent::LogsDirection dir = event.direction(); - switch (clearType){ - case LogsModel::TypeLogsClearAll: - match = true; - break; - case LogsModel::TypeLogsClearReceived: - match = ( dir == LogsEvent::DirIn ); - break; - case LogsModel::TypeLogsClearCalled: - match = ( dir == LogsEvent::DirOut ); - break; - case LogsModel::TypeLogsClearMissed: - match = ( dir == LogsEvent::DirMissed ); - break; - default: - break; - } - return match; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/src/logsthumbnailmanager.cpp --- a/logsui/logsengine/src/logsthumbnailmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +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 "logsthumbnailmanager.h" -#include "logslogger.h" -#include "logsengdefs.h" -#include -#include - -const int KMaxQueueSize = 25; -const int KContactFetchTimer1 = 400; -const int KContactFetchTimer2 = 20; -const int KLogsMaxCacheSize = 50; - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsThumbIconManager::LogsThumbIconManager(QObject *parent) - : QObject(parent), - mQueueCount(0), - mDefaultIcon(0) -{ - mThumbnailManager = new ThumbnailManager(this); - mThumbnailManager->setMode(ThumbnailManager::Default); - mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForPerformance); - mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailSmall); - - connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void *, int, int)), - this, SLOT(thumbnailReady(QPixmap, void *, int, int))); - - mTimer = new QTimer(); - connect( mTimer, SIGNAL(timeout()), this, SLOT(timerTimeout()) ); - mDefaultIcon = new QIcon(logsThumbUnknownId); - mImageCache.setMaxCost(KLogsMaxCacheSize); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -LogsThumbIconManager::~LogsThumbIconManager() -{ - cancel(); - mImageCache.clear(); - delete mTimer; - delete mDefaultIcon; -} - -// ----------------------------------------------------------------------------- -// Get the icon for the requested avatarPath or send a new request -// to the thumbnailmanager if it doesn't exist yet, default icon is returned -// if cached icon does not exist -// ----------------------------------------------------------------------------- -// -QIcon& LogsThumbIconManager::contactIcon(const QString &avatarPath, int index) -{ - LOGS_QDEBUG( "logs [ENG] -> LogsThumbIconManager::contactIcon()" ) - QIcon* icon = 0; - if ( avatarPath.isEmpty() ){ - icon = &defaultIcon(); - } else if ( mImageCache.contains(avatarPath) ) { - icon = mImageCache.object(avatarPath); - LOGS_QDEBUG( "logs [ENG] -> LogsThumbIconManager::contactIcon() image was cached" ) - } - else - { - icon = &defaultIcon(); - mTimer->stop(); - mTimer->start(KContactFetchTimer1); - mQueueCount++; - mRequestQueue.enqueue(qMakePair(avatarPath, index)); - if( mQueueCount > KMaxQueueSize ){ - LOGS_QDEBUG( "logs [ENG] -> LogsThumbIconManager::contactIcon() image was not cached" ) - mRequestQueue.dequeue(); - mQueueCount--; - } - } - return *icon; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -QIcon& LogsThumbIconManager::defaultIcon() -{ - return *mDefaultIcon; -} - -// ----------------------------------------------------------------------------- -// Cancel all requests -// ----------------------------------------------------------------------------- -// -void LogsThumbIconManager::cancel() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsThumbIconManager::cancel()" ) - if (!mTnmReqMap.empty()){ - QMapIterator iter(mTnmReqMap); - while (iter.hasNext()){ - iter.next(); - bool result = mThumbnailManager->cancelRequest(iter.key()); - } - } - mTnmReqMap.clear(); - mRequestQueue.clear(); - mQueueCount = 0; - mImageCache.clear(); -} - - -// ----------------------------------------------------------------------------- -// Called when thumbnailmanager finishes creating a thumbnail, -// emits a signal for LogsMatchesModelModel to update icon for a contact -// ----------------------------------------------------------------------------- -// -void LogsThumbIconManager::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) -{ - LOGS_QDEBUG_2("LogsThumbIconManager::thumbnailReady:: error:", error ); - // Find the index - if (mTnmReqMap.contains(id)){ - QString avatarPath = mTnmReqMap[id]; - LOGS_QDEBUG_3( "LogsThumbIconManager::thumbnailReady (avatarPath, error):", avatarPath, error ); - mTnmReqMap.remove(id); - if ( error == 0 ){ - int *clientData = (int *)data; - int index = *clientData; - QIcon* icon = new QIcon(pixmap); - LOGS_QDEBUG_3( "LogsThumbIconManager::thumbnailReady (avatarPath, mImageCache.count()):", avatarPath, mImageCache.count() ); - mImageCache.insert(avatarPath, icon); - LOGS_QDEBUG_3( "LogsThumbIconManager::thumbnailReady (avatarPath, mImageCache.count()):", avatarPath, mImageCache.count() ); - emit contactIconReady(index); - qDebug() << "LogsThumbIconManager::thumbnailReady - signal emitted"; - if (!mRequestQueue.isEmpty()){ - mTimer->start(KContactFetchTimer2); - } - delete clientData; - } else { - thumbnailLoad(); - } - } -} -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsThumbIconManager::thumbnailLoad() -{ - LOGS_QDEBUG( "logs [ENG] -> LogsThumbIconManager::thumbnailLoad()->" ) - mTimer->stop(); - if (!mRequestQueue.isEmpty()){ - mQueueCount--; - QPair req = mRequestQueue.dequeue(); - QString avatarPath = req.first; - int index = req.second; - int *clientData = new int(index); - qDebug() << "LogsThumbIconManager::thumbnailLoad clientData is " << clientData; - int reqId = mThumbnailManager->getThumbnail(avatarPath, clientData, 0); - qDebug() << "LogsThumbIconManager::thumbnailLoad reqId is " << reqId; - mTnmReqMap.insert(reqId, avatarPath); - } - LOGS_QDEBUG( "logs [ENG] -> LogsThumbIconManager::thumbnailLoad()<-" ) -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void LogsThumbIconManager::timerTimeout() -{ - thumbnailLoad(); - -} - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_avatar.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_avatar.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_calendar.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_calendar.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_call_duration.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_call_duration.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_dialled_voice_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_dialled_voice_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_info.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_info.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_video_call_unseen.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_video_call_unseen.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voice_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voice_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voice_call_unseen.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voice_call_unseen.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voip_call_unseen.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voip_call_unseen.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_received_voice_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_received_voice_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_video_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_video_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_video_dialled_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_video_dialled_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_video_missed_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_video_missed_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_video_received_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_video_received_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voice_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voice_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voip.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voip.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,237 +0,0 @@ - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voip_dialled_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voip_dialled_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voip_missed_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voip_missed_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voip_received_call.svg --- a/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_voip_received_call.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/at_logsengine/at_logsengine.pro --- a/logsui/logsengine/tsrc/at_logsengine/at_logsengine.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +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: -# -# - -TEMPLATE = app -TARGET = - -QT += testlib xml -CONFIG += qtestlib -CONFIG += hb - -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += /orbit/include # This must be included after the HB stubs -INCLUDEPATH += /epoc32/include -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -INCLUDEPATH += /epoc32/include/ecom -INCLUDEPATH += ../../../tsrc/qtestutils/inc - -# Input -HEADERS += inc/at_logsengine.h - -SOURCES += src/main.cpp -SOURCES += src/at_logsengine.cpp -SOURCES += ../../../tsrc/qtestutils/src/testresultxmlparser.cpp - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xEfa559b2 - TARGET.CAPABILITY = ALL -TCB - TARGET.EPOCALLOWDLLDATA = 1 - LIBS += -llogsengine -} - -BLD_INF_RULES.prj_mmpfiles = "../../../tsrc/logdbmodifier/addeventtest/group/logclienttest.mmp"\ - "../../../tsrc/logdbmodifier/clearlisttest/group/clearlisttest.mmp" - -BLD_INF_RULES.prj_exports += "../../../tsrc/logdbmodifier/addeventtest/data/testlogclients.dat /epoc32/winscw/c/system/testlogclients.dat" diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/at_logsengine/inc/at_logsengine.h --- a/logsui/logsengine/tsrc/at_logsengine/inc/at_logsengine.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 AT_LOGSENGINE_H -#define AT_LOGSENGINE_H - -#include -#include - -class LogsModel; -class LogsCustomFilter; - -class AT_LogsEngine : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testAllEvents(); - void testFilteredEvents(); - void testHomeScreenUsecase(); - void testMarkEventsSeen(); - void testClearEvents(); -private: - void clearEventsL(); - void writeEventsL(); - void executeL(const TDesC& exeName, const TDesC& commandLine); - -private: - - LogsModel* mModel; - -}; - - -#endif //AT_LOGSENGINE_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/at_logsengine/src/at_logsengine.cpp --- a/logsui/logsengine/tsrc/at_logsengine/src/at_logsengine.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,223 +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 "at_logsengine.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -_LIT( KLogTestEvents, "at_logsengine" ); -_LIT( KLogTestClientWriter, "logclienttest.exe" ); -_LIT( KLogTestClientClearer, "clearlisttest.exe" ); - -const int logsTestAllEventsCount = 20; -const int logsTestMissedCallsCount = 10; -const int logsTestOtherThanMissedEventsCount = 10; -const int logsTestContact2EventsCount = 2; -const int logsTestContact3EventsCount = 3; - -// Note, events are written from .dat file in order where last event is going to -// be first event at db -const QString logsTestAllEvent1Name = "deeppu"; -const LogsEvent::LogsDirection logsTestAllEvent1Dir = LogsEvent::DirIn; - -const QString logsTestContact2Event2Name = "Jeppis"; -const LogsEvent::LogsDirection logsTestContact2Event2Dir = LogsEvent::DirIn; -const QString logsTestContact2Event1Name = "Jeppa"; -const LogsEvent::LogsDirection logsTestContact2Event1Dir = LogsEvent::DirMissed; - -const QString logsTestContact3Event3Name = "aeppu"; -const LogsEvent::LogsDirection logsTestContact3Event3Dir = LogsEvent::DirOut; -const QString logsTestContact3Event2Name = "beppu"; -const LogsEvent::LogsDirection logsTestContact3Event2Dir = LogsEvent::DirIn; -const QString logsTestContact3Event1Name = "deppu"; -const LogsEvent::LogsDirection logsTestContact3Event1Dir = LogsEvent::DirOut; - -const QString logsTestHomeScreenMissedCallerName = "Jeppa"; - -Q_DECLARE_METATYPE(LogsEvent *) - -#define AT_LOGSENG_VERIFY(m, idx, remote, dir) { \ -LogsEvent* event = qVariantValue( m.data( m.index(idx, 0), LogsModel::RoleFullEvent ) ); \ -QVERIFY( event && event->remoteParty() == remote && event->direction() == dir ); } - -void AT_LogsEngine::initTestCase() -{ - TRAPD( err, clearEventsL() ); - Q_ASSERT( err == KErrNone ); - QTest::qWait(2000); - TRAP( err, writeEventsL() ); - Q_ASSERT( err == KErrNone ); - QTest::qWait(2000); - mModel = new LogsModel(LogsModel::LogsFullModel); - QTest::qWait(5000); // wait model to be populated from db -} - -void AT_LogsEngine::cleanupTestCase() -{ - delete mModel; - mModel = 0; -} - - -void AT_LogsEngine::init() -{ -} - -void AT_LogsEngine::cleanup() -{ - -} - -void AT_LogsEngine::testAllEvents() -{ - QVERIFY( mModel->rowCount(QModelIndex()) == logsTestAllEventsCount ); - AT_LOGSENG_VERIFY( (*mModel), 0, logsTestAllEvent1Name, logsTestAllEvent1Dir ) -} - -void AT_LogsEngine::testFilteredEvents() -{ - LogsCustomFilter filter; - filter.setContactId(2); - filter.setSourceModel(mModel); - QVERIFY( filter.rowCount() == logsTestContact2EventsCount ); - AT_LOGSENG_VERIFY( filter, 0, logsTestContact2Event1Name, logsTestContact2Event1Dir ) - AT_LOGSENG_VERIFY( filter, 1, logsTestContact2Event2Name, logsTestContact2Event2Dir ) - - filter.setContactId(3); - filter.setSourceModel(0); - filter.setSourceModel(mModel); - QVERIFY( filter.rowCount() == logsTestContact3EventsCount ); - AT_LOGSENG_VERIFY( filter, 0, logsTestContact3Event1Name, logsTestContact3Event1Dir ) - AT_LOGSENG_VERIFY( filter, 1, logsTestContact3Event2Name, logsTestContact3Event2Dir ) - AT_LOGSENG_VERIFY( filter, 2, logsTestContact3Event3Name, logsTestContact3Event3Dir ) - - filter.setContactId(10345624); - filter.setSourceModel(0); - filter.setSourceModel(mModel); - QVERIFY( filter.rowCount() == 0 ); -} - -void AT_LogsEngine::testMarkEventsSeen() -{ - LogsCustomFilter filter; - filter.setContactId(2); - filter.setSourceModel(mModel); - int unseenCount = 0; - QVERIFY( filter.rowCount() == 2 ); - for ( int i = 0; i < filter.rowCount(); i++ ){ - LogsEvent* event = qVariantValue( - filter.data( filter.index(i, 0), LogsModel::RoleFullEvent ) ); - if ( event && !event->isRead() ){ - unseenCount++; - } - } - QVERIFY( unseenCount == 2 ); - QSignalSpy spy( &filter, SIGNAL( markingCompleted(int))); - QVERIFY( filter.markEventsSeen() ); - QTest::qWait(1000); // wait marking completion - - QVERIFY( spy.count() == 1 ); - int seenCount = 0; - for ( int i = 0; i < filter.rowCount(); i++ ){ - LogsEvent* event = qVariantValue( - filter.data( filter.index(i, 0), LogsModel::RoleFullEvent ) ); - if ( event && event->isRead() ){ - seenCount++; - } - } - QVERIFY( seenCount == 2 ); - -} - -void AT_LogsEngine::testClearEvents() -{ - LogsCustomFilter filter; - filter.setContactId(2); - filter.setSourceModel(mModel); - QVERIFY( filter.rowCount() == 2 ); - int unseenCount = 0; - QSignalSpy spy( &filter, SIGNAL( clearingCompleted(int))); - QVERIFY( filter.clearEvents() ); - QTest::qWait(1000); // wait clearing completion - QVERIFY( filter.rowCount() == 0 ); - QVERIFY( spy.count() == 1 ); -} - -void AT_LogsEngine::testHomeScreenUsecase() -{ - // Homescreen missed calls notification plugin uses full model with - // missed calls filter to find out how many sequential events was - // received from one caller. If number of them is the same as missed call - // counter, name of the caller is shown at HS. - - - LogsFilter filter(LogsFilter::Missed); - const int maxNumMissedCalls = 2; - filter.setMaxSize(maxNumMissedCalls); - LogsModel optimizedModel(LogsModel::LogsFullModel); - QTest::qWait(5000); // wait model to be populated from db - filter.setSourceModel(&optimizedModel); - - // Test data has 10 missed calls from Jeppa but readsize has been configured to 2 so - // reading stops when 2 missed calls has been read - QCOMPARE( filter.rowCount(), maxNumMissedCalls ); - AT_LOGSENG_VERIFY( filter, 0, logsTestHomeScreenMissedCallerName, LogsEvent::DirMissed ) - AT_LOGSENG_VERIFY( filter, 1, logsTestHomeScreenMissedCallerName, LogsEvent::DirMissed ) - - // Filter assigned to full model without read size has all those 10 missed calls - LogsFilter filter2(LogsFilter::Missed); - filter2.setSourceModel(mModel); - QVERIFY( filter2.rowCount() == logsTestMissedCallsCount ); - - // Verify decoration and display data - QStringList displayData = filter.data( filter.index(0, 0), Qt::DisplayRole ).toStringList(); - QVERIFY( displayData.count() == 2 ); - QVERIFY( displayData.at(0) == logsTestHomeScreenMissedCallerName ); - 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 -} - -void AT_LogsEngine::clearEventsL() -{ - executeL(KLogTestClientClearer, KNullDesC); -} - -void AT_LogsEngine::writeEventsL() -{ - TBuf<100> commandLine; - // Run and write events named at_logsengine in the .dat - commandLine.Append( KLogTestEvents ); - executeL(KLogTestClientWriter, commandLine); -} - -void AT_LogsEngine::executeL(const TDesC& exeName, const TDesC& commandLine) -{ - RProcess process; - CleanupClosePushL( process ); - User::LeaveIfError( process.Create( exeName, commandLine ) ); - process.Resume(); - CleanupStack::PopAndDestroy( &process ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/at_logsengine/src/main.cpp --- a/logsui/logsengine/tsrc/at_logsengine/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +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 "at_logsengine.h" -#include "testresultxmlparser.h" - - -int main(int argc, char *argv[]) -{ - bool promptOnExit(true); - for (int i=0; i -#include //krazy:exclude=qclasses -class HbIcon -{ -public: - HbIcon(); - HbIcon(const QString &iconName); - HbIcon(const QIcon &icon); - ~HbIcon(); - bool isNull() const; - bool operator==(const HbIcon &other) const; - - operator QVariant() const; - -public: // Data added for the unit testing stub - QString mName; -}; - -Q_DECLARE_METATYPE(HbIcon) - -#endif // HBICON_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/hbstubs/hblineedit.h --- a/logsui/logsengine/tsrc/hbstubs/hblineedit.h Fri Apr 16 14:53:18 2010 +0300 +++ /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: Orbit stubs for Live Comms UI unit tests -* -*/ -#ifndef HBLINEEDIT_H -#define HBLINEEDIT_H - -#include - - -class HbLineEdit -{ -public: - HbLineEdit(); - HbLineEdit(const QString &lineEditText); - ~HbLineEdit(); - - void setText(const QString &text); - void paste(); - void copy(); - void selectAll(); - void setSelection(int start, int length); - QString text() const; - - -public: // Data added for the unit testing stub - QString mName; - QString mText; - -}; - -Q_DECLARE_METATYPE(HbLineEdit) - -#endif // HBLINEEDIT_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/hbstubs/hbstubs.cpp --- a/logsui/logsengine/tsrc/hbstubs/hbstubs.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,162 +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: -* -*/ - -// Orbit classes -#include -#include -#include - - -QString mUTClipboard; - -// ----------------------------------------------------------------------------- -// HbIcon::HbIcon -// ----------------------------------------------------------------------------- -// -HbIcon::HbIcon() -{ - mName = QString(); -} - -// ----------------------------------------------------------------------------- -// HbIcon::HbIcon -// ----------------------------------------------------------------------------- -// -HbIcon::HbIcon(const QString &iconName) -{ - mName = iconName; -} - -// ----------------------------------------------------------------------------- -// HbIcon::HbIcon -// ----------------------------------------------------------------------------- -// -HbIcon::HbIcon(const QIcon &icon) -{ - mName = "c:\\data\\images\\designer.png"; -} - -// ----------------------------------------------------------------------------- -// HbIcon::~HbIcon -// ----------------------------------------------------------------------------- -// -HbIcon::~HbIcon() -{ -} - -// ----------------------------------------------------------------------------- -// HbIcon::isNull -// ----------------------------------------------------------------------------- -// -bool HbIcon::isNull() const -{ - return false; -} - -// ----------------------------------------------------------------------------- -// HbIcon::operator== -// ----------------------------------------------------------------------------- -// -bool HbIcon::operator==(const HbIcon &other) const -{ - return (other.mName == mName); -} - -// ----------------------------------------------------------------------------- -// HbIcon::operator QVariant -// Returns the icon as a QVariant. -// ----------------------------------------------------------------------------- -// -HbIcon::operator QVariant() const -{ - return QVariant::fromValue(*this); -} - -// ----------------------------------------------------------------------------- -// HbLineEdit::HbLineEdit -// ----------------------------------------------------------------------------- -// -HbLineEdit::HbLineEdit() -{ - //mName = QString(); -} - -// ----------------------------------------------------------------------------- -// HbLineEdit::HbLineEdit -// ----------------------------------------------------------------------------- -// -HbLineEdit::HbLineEdit(const QString &lineEditText) -{ - //mName = iconName; -} - -// ----------------------------------------------------------------------------- -// HbLineEdit::~HbLineEdit -// ----------------------------------------------------------------------------- -// -HbLineEdit::~HbLineEdit() -{ -} - -// ----------------------------------------------------------------------------- -// HbLineEdit::setText -// ----------------------------------------------------------------------------- -// -void HbLineEdit::setText(const QString &text) -{ - mText = text; -} -// ----------------------------------------------------------------------------- -// HbLineEdit::selectAll -// ----------------------------------------------------------------------------- -// -void HbLineEdit::selectAll() -{ -} -// ----------------------------------------------------------------------------- -// HbLineEdit::selectAll -// ----------------------------------------------------------------------------- -// -void HbLineEdit::setSelection(int start, int length) -{ - Q_UNUSED(start); - Q_UNUSED(length); -} -// ----------------------------------------------------------------------------- -// HbLineEdit::copy -// ----------------------------------------------------------------------------- -// -void HbLineEdit::copy() -{ - mUTClipboard = mText; -} -// ----------------------------------------------------------------------------- -// HbLineEdit::paste -// ----------------------------------------------------------------------------- -// -void HbLineEdit::paste() -{ - mText = mUTClipboard; -} -// ----------------------------------------------------------------------------- -// HbLineEdit::text -// ----------------------------------------------------------------------------- -// -QString HbLineEdit::text() const -{ - return mText; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/hbstubs/qicon.h --- a/logsui/logsengine/tsrc/hbstubs/qicon.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +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: Orbit stubs for Live Comms UI unit tests -* -*/ -#ifndef QICON_H -#define QICON_H - -#include -class QIcon -{ -public: - QIcon(); - QIcon(const QString &iconName); - QIcon(const QIcon &icon); - QIcon(const QPixmap &pixmap); - ~QIcon(); - bool isNull() const; - bool operator==(const QIcon &other) const; - - operator QVariant() const; - -public: // Data added for the unit testing stub - QString mName; -}; - -Q_DECLARE_METATYPE(QIcon) - -#endif // QICON_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/hbstubs/qiconstubs.cpp --- a/logsui/logsengine/tsrc/hbstubs/qiconstubs.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +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: -* -*/ - -// Orbit classes -#include -#include -#include - - -// ----------------------------------------------------------------------------- -// QIcon::QIcon -// ----------------------------------------------------------------------------- -// -QIcon::QIcon() -{ - mName = QString(); -} - -// ----------------------------------------------------------------------------- -// QIcon::QIcon -// ----------------------------------------------------------------------------- -// -QIcon::QIcon(const QString &iconName) -{ - mName = iconName; -} - -// ----------------------------------------------------------------------------- -// QIcon::QIcon -// ----------------------------------------------------------------------------- -// -QIcon::QIcon(const QPixmap &pixmap) -{ - mName = "c:\\data\\images\\bg_1.png"; -} - -// ----------------------------------------------------------------------------- -// QIcon::QIcon -// ----------------------------------------------------------------------------- -// -QIcon::QIcon(const QIcon &icon) -{ - mName = "c:\\data\\images\\bg_1.png"; -} - -// ----------------------------------------------------------------------------- -// QIcon::~QIcon -// ----------------------------------------------------------------------------- -// -QIcon::~QIcon() -{ -} - -// ----------------------------------------------------------------------------- -// QIcon::isNull -// ----------------------------------------------------------------------------- -// -bool QIcon::isNull() const -{ - return false; -} - -// ----------------------------------------------------------------------------- -// QIcon::operator== -// ----------------------------------------------------------------------------- -// -bool QIcon::operator==(const QIcon &other) const -{ - return (other.mName == mName); -} - -// ----------------------------------------------------------------------------- -// QIcon::operator QVariant -// Returns the icon as a QVariant. -// ----------------------------------------------------------------------------- -// -QIcon::operator QVariant() const -{ - return QVariant::fromValue(*this); -} - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/stubs/logscntfinder.h --- a/logsui/logsengine/tsrc/stubs/logscntfinder.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,188 +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: -* -*/ - -#ifndef LOGSCNTFINDER_H -#define LOGSCNTFINDER_H - -#include -#include -#include -#include - -QTM_USE_NAMESPACE - -class LogsCntEntry; -typedef QObject LogsCntEntryHandle; - - -class LogsCntText -{ -public: - - inline LogsCntText() : mHighlights(0){} - inline const QString& text() const {return mText;} - inline int highlights() const {return mHighlights;} - QString richText( QString startTag = QString(""), - QString endTag = QString("")) const; - -private: - - QString mText; - QString mTranslatedText; - int mHighlights; - - friend class LogsCntEntry; - friend class UT_LogsCntEntry; - friend class UT_LogsCntFinder; -}; - -typedef QList LogsCntTextList; - -class LogsCntEntry -{ -public: - - enum EntryType { - EntryTypeHistory, - EntryTypeContact - }; - - LogsCntEntry( LogsCntEntryHandle& handle, - quint32 cid ); - LogsCntEntry( quint32 cid ); - LogsCntEntry( const LogsCntEntry& entry ); - ~LogsCntEntry(); - EntryType type() const; - const LogsCntTextList& firstName() const; - const LogsCntTextList& lastName() const; - const QString& avatarPath() const; - quint32 contactId() const; - LogsCntEntryHandle* handle() const; - void setFirstName( const QString& name ); - void setLastName( const QString& name ); - const LogsCntText& phoneNumber() const; - void setPhoneNumber( const QString& number ); - - bool isCached() const; - void setHighlights( const QString& pattern ); - bool match( const QString& pattern ) const; - -private: - - void doSetText( const QString& text, LogsCntTextList& textlist ); - bool doMatch( const QString& pattern, - const LogsCntTextList& textlist ) const; - -private: - - EntryType mType; - quint32 mCid; - LogsCntTextList mFirstName; - LogsCntTextList mLastName; - bool mCached; - LogsCntEntryHandle* mHandle; - LogsCntText mPhoneNumber; - QString mAvatarPath; - - friend class UT_LogsCntEntry; - friend class UT_LogsCntFinder; -}; - -typedef QList LogsCntEntryList; - -/** - * Log events and contacts finder - * - */ -class LogsCntFinder : public QObject -{ - - Q_OBJECT - -public: // The exported API - - LogsCntFinder(); - LogsCntFinder(QContactManager& contactManager); - ~LogsCntFinder(); - - /** - * Starts/continues predictive query based on pattern. If - * there is a previously executed query with same pattern, - * call is treated as continue query. - * @param pattern the predictive pattern, containing digit(s) - */ - void predictiveSearchQuery( const QString& pattern ); - - /** - * returns number of results - * @return number of results - */ - int resultsCount() const; - - /** - * returns result at index - * @param index the index - */ - const LogsCntEntry& resultAt( int index ); - - /** - * Used for adding entiries to be part of a query - * Ownership is transfered - * @param entry the entry - */ - void insertEntry( int index, LogsCntEntry* entry ); - - /** - * Used for updating entiries - * @param handle the handle - */ - LogsCntEntry* getEntry( const LogsCntEntryHandle& handle ) const; - - /** - * Used for updating entiries - * @param entry the entry - */ - void deleteEntry( const LogsCntEntryHandle& handle ); - -signals: - - /** - * emitted when query is ready - */ - void queryReady(); - -private: - - void doPredictiveHistoryQuery(); - void doPredictiveContactQuery(); - - LogsCntEntry* doGetEntry( const LogsCntEntryList& list, - const LogsCntEntryHandle& handle ) const; - - -private: - - QString mCurrentPredictivePattern; - LogsCntEntryList mResults; - QContactManager* mContactManager; - LogsCntEntryList mHistoryEvents; - - friend class UT_LogsMatchesModel; - -}; - -#endif //LOGSCNTFINDER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/stubs/logscntfinder_stub.cpp --- a/logsui/logsengine/tsrc/stubs/logscntfinder_stub.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,469 +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 "logscntfinder.h" -#include "logslogger.h" - -#include -#include -#include -#include -#include - -// ----------------------------------------------------------------------------- -// LogsCntEntry::richText() -// ----------------------------------------------------------------------------- -// -QString LogsCntText::richText( QString startTag, - QString endTag ) const -{ - QString str = text(); - if ( str.length() > 0 && highlights() > 0 ) { - str.insert( highlights() , endTag ); - str.insert( 0, startTag ); - } - - return str; - -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::LogsCntEntry() -// ----------------------------------------------------------------------------- -// -LogsCntEntry::LogsCntEntry( LogsCntEntryHandle& handle, - quint32 cid ) - : mType( EntryTypeHistory ), mCid( cid ), - mCached( false ),mHandle(&handle) -{ - LogsCntText empty; - mFirstName.append( empty ); - mLastName.append( empty ); - mAvatarPath = "c:\\data\\images\\bg_1.png"; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::LogsCntEntry() -// ----------------------------------------------------------------------------- -// -LogsCntEntry::LogsCntEntry( quint32 cid ) - : mType( EntryTypeContact ), mCid( cid ), - mCached( false ),mHandle(0) -{ - LogsCntText empty; - mFirstName.append( empty ); - mLastName.append( empty ); -} - -// ----------------------------------------------------------------------------- -// copy LogsCntEntry::LogsCntEntry() -// ----------------------------------------------------------------------------- -// -LogsCntEntry::LogsCntEntry( const LogsCntEntry& entry ) - : mType(entry.mType), - mCid(entry.mCid), - mFirstName(entry.mFirstName), - mLastName(entry.mLastName), - mCached(entry.mCached), - mHandle(entry.mHandle), - mPhoneNumber(entry.mPhoneNumber) -{ -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::~LogsCntEntry() -// ----------------------------------------------------------------------------- -// -LogsCntEntry::~LogsCntEntry() -{ -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::LogsCntEntry() -// ----------------------------------------------------------------------------- -// -const LogsCntTextList& LogsCntEntry::firstName() const -{ - return mFirstName; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::lastName() -// ----------------------------------------------------------------------------- -// -const LogsCntTextList& LogsCntEntry::lastName() const -{ - return mLastName; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::avatarPath() -// ----------------------------------------------------------------------------- -// -const QString& LogsCntEntry::avatarPath() const -{ - return mAvatarPath; -} - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::phoneNumber() -// ----------------------------------------------------------------------------- -// -const LogsCntText& LogsCntEntry::phoneNumber() const -{ - return mPhoneNumber; -} - - -// ----------------------------------------------------------------------------- -// LogsCntEntry::contactId() -// ----------------------------------------------------------------------------- -// -quint32 LogsCntEntry::contactId() const -{ - return mCid; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::handle() -// ----------------------------------------------------------------------------- -// -LogsCntEntryHandle* LogsCntEntry::handle() const -{ - return mHandle; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::setFirstName() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::setFirstName( const QString& name ) -{ - mCached=true; - mFirstName.clear(); - doSetText( name, mFirstName ); -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::setLastName() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::setLastName( const QString& name ) -{ - mCached=true; - mLastName.clear(); - doSetText( name, mLastName ); -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::setPhoneNumber() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::setPhoneNumber( const QString& number ) -{ - mPhoneNumber.mText = number; -} - -// ----------------------------------------------------------------------------- -// LogsCntEntry::doSetText() -// ----------------------------------------------------------------------------- -// -void LogsCntEntry::doSetText( const QString& text, LogsCntTextList& textlist ) -{ - const QChar separ(' '); - QStringList parts = text.split( separ, QString::SkipEmptyParts ); - for( int i=0;i LogsCntFinder::LogsCntFinder()" ) - - // Create manager ourselves, object takes care of deletion when registering - // as parent. - QMap dummyParams; - mContactManager = new QContactManager("symbian", dummyParams, this); - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::LogsCntFinder()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::LogsCntFinder() -// ----------------------------------------------------------------------------- -// -LogsCntFinder::LogsCntFinder(QContactManager& contactManager) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::LogsCntFinder(), cntmgr from client" ) - - mContactManager = &contactManager; - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::LogsCntFinder()" ) -} - - -// ----------------------------------------------------------------------------- -// LogsCntFinder::~LogsCntFinder() -// ----------------------------------------------------------------------------- -// -LogsCntFinder::~LogsCntFinder() -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::~LogsCntFinder()" ) - - qDeleteAll( mResults ); - qDeleteAll( mHistoryEvents ); - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::~LogsCntFinder()" ) -} - - -// ----------------------------------------------------------------------------- -// LogsCntFinder::predictiveSearchQuery -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::predictiveSearchQuery( const QString& pattern ) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::predictiveSearchQuery()" ) - LOGS_QDEBUG_2( "logs [FINDER] pattern= ", pattern ) - - bool patternChanged = pattern != mCurrentPredictivePattern; - mCurrentPredictivePattern = pattern; - - if ( !mCurrentPredictivePattern.isEmpty() && patternChanged ) { - qDeleteAll( mResults ); - mResults.clear(); - doPredictiveHistoryQuery(); - doPredictiveContactQuery(); - } - //emit queryReady(); // commented off to ease testing - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::predictiveSearchQuery()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::doPredictiveHistoryQuery -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::doPredictiveHistoryQuery() -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::doPredictiveHistoryQuery()" ) - - QListIterator iter(mHistoryEvents); - - while( iter.hasNext() ) { - LogsCntEntry* e = iter.next(); - if ( e->match( mCurrentPredictivePattern ) ) { - LogsCntEntry* entry = new LogsCntEntry( *e ); - mResults.append( entry ); - } - } - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::doPredictiveHistoryQuery()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::doPredictiveContactQuery -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::doPredictiveContactQuery() -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::doPredictiveContactQuery()" ) -/* - int index = 0; - while( index < cntIds.count() ) { - LogsCntEntry* entry = new LogsCntEntry( cntIds.at( index++ ) ); - mResults.append( entry ); - } - */ - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::doPredictiveContactQuery()" ) - -} - - -// ----------------------------------------------------------------------------- -// LogsCntFinder::resultsCount -// ----------------------------------------------------------------------------- -// -int LogsCntFinder::resultsCount() const -{ - return mResults.count(); -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::resultAt -// ----------------------------------------------------------------------------- -// -const LogsCntEntry& LogsCntFinder::resultAt( int index ) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::resultAt()" ) - LOGS_QDEBUG_2( "logs [FINDER] index=", index ) - - LogsCntEntry* entry = mResults.at( index ); - if ( !entry->isCached() ) { - 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( - contactPhoneNumber.value( QContactPhoneNumber::FieldNumber ) ); - - entry->setHighlights( mCurrentPredictivePattern ); - } - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::resultAt()" ) - return *entry; - -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::insertEntry -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::insertEntry( int index, LogsCntEntry* entry ) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::insertEntry()" ) - LOGS_QDEBUG_4( "logs [FINDER] handle=", entry->handle()," to index ", index ) - - mHistoryEvents.insert( index, entry ); - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::insertEntry()" ) -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::getEntry -// ----------------------------------------------------------------------------- -// -LogsCntEntry* LogsCntFinder::getEntry( const LogsCntEntryHandle& handle ) const -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::getEntry()" ) - return doGetEntry( mHistoryEvents, handle ); -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::doGetEntry -// ----------------------------------------------------------------------------- -// -LogsCntEntry* LogsCntFinder::doGetEntry( const LogsCntEntryList& list, - const LogsCntEntryHandle& handle ) const -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::doGetEntry()" ) - LOGS_QDEBUG_2( "logs [FINDER] handle= ", &handle ) - - LogsCntEntry* entry = 0; - QListIterator iter(list); - - while( iter.hasNext() && !entry ) { - LogsCntEntry* e = iter.next(); - entry = e->handle() == &handle ? e : 0; - } - - LOGS_QDEBUG_2( "logs [FINDER] found=", (entry!=0) ) - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::doGetEntry()" ) - return entry; -} - -// ----------------------------------------------------------------------------- -// LogsCntFinder::deleteEntry -// ----------------------------------------------------------------------------- -// -void LogsCntFinder::deleteEntry( const LogsCntEntryHandle& handle ) -{ - LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::deleteEntry()" ) - LOGS_QDEBUG_2( "logs [FINDER] handle= ", &handle ) - - LogsCntEntry* toRemoveHistoryEv = doGetEntry( mHistoryEvents, handle ); - mHistoryEvents.removeOne( toRemoveHistoryEv ); - delete toRemoveHistoryEv; - - LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::deleteEntry()" ) - -} - - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/stubs/qthighway_stub.cpp --- a/logsui/logsengine/tsrc/stubs/qthighway_stub.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "qthighway_stub_helper.h" - -QString qtHighwayStubService; -QString qtHighwayStubMessage; - -void QtHighwayStubHelper::reset() -{ - qtHighwayStubService.clear(); - qtHighwayStubMessage.clear(); -} - -QString QtHighwayStubHelper::service() -{ - return qtHighwayStubService; -} - -QString QtHighwayStubHelper::message() -{ - return qtHighwayStubMessage; -} - -XQServiceRequest::XQServiceRequest( - const QString& service, const QString& message, const bool& synchronous) -{ - qtHighwayStubService = service; - qtHighwayStubMessage = message; -} - -XQServiceRequest::~XQServiceRequest() -{ - -} - - -void XQServiceRequest::setArguments(const QList &arguments) -{ - Q_UNUSED(arguments) -} - -QString XQServiceRequest::service() const -{ - return qtHighwayStubService; -} - -QString XQServiceRequest::message() const -{ - return qtHighwayStubMessage; -} - -bool XQServiceRequest::send(QVariant& retValue) -{ - return true; -} -void XQServiceRequest::addArg(const QVariant& v) -{ - -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/stubs/qthighway_stub_helper.h --- a/logsui/logsengine/tsrc/stubs/qthighway_stub_helper.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +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: -* -*/ - -/** -* Helper class to control logcli stub behavior -* -*/ -class QtHighwayStubHelper{ - public: - static void reset(); - static QString service(); - static QString message(); -}; diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub.cpp --- a/logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,225 +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 FILES -#include "logsdbconnector.h" -#include "logsdbconnector_stub_helper.h" -#include "logsevent.h" - -// CONSTANTS - -QString logsLastCalledFunction = ""; - -void LogsDbConnectorStubHelper::reset() -{ - logsLastCalledFunction = ""; -} - -QString LogsDbConnectorStubHelper::lastCalledFunction() -{ - return logsLastCalledFunction; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::LogsDbConnector -// ---------------------------------------------------------------------------- -// -LogsDbConnector::LogsDbConnector( QList& events, bool checkAllEvents ) -: QObject(), mModelEvents( events ), mCheckAllEvents( checkAllEvents ) -{ -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::~LogsDbConnector -// ---------------------------------------------------------------------------- -// -LogsDbConnector::~LogsDbConnector() -{ - while ( !mEvents.isEmpty() ){ - delete mEvents.takeFirst(); - } -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::init -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::init() -{ - logsLastCalledFunction = "init"; - return 0; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::start -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::start() -{ - logsLastCalledFunction = "start"; - return 0; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::updateDetails -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::updateDetails(bool /*clearCached*/) -{ - logsLastCalledFunction = "updateDetails"; - return 0; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::clearList -// ---------------------------------------------------------------------------- -// -bool LogsDbConnector::clearList(LogsModel::ClearType /*cleartype*/) -{ - logsLastCalledFunction = "clearList"; - return true; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::clearMissedCallsCounter -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::clearMissedCallsCounter() -{ - logsLastCalledFunction = "clearMissedCallsCounter"; - return 0; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::clearEvents -// ---------------------------------------------------------------------------- -// -bool LogsDbConnector::clearEvents(const QList& /*ids*/) -{ - logsLastCalledFunction = "clearEvents"; - return true; -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::markEventsSeen -// ---------------------------------------------------------------------------- -// -bool LogsDbConnector::markEventsSeen(const QList& ids) -{ - bool started(false); - logsLastCalledFunction = "markEventsSeen"; - foreach( int currId, ids ){ - if ( !mEventsSeen.contains(currId) ){ - mEventsSeen.append(currId); - started = true; - } - } - return started; -} - -// ---------------------------------------------------------------------------- -// 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 -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::readCompleted(int /*numRead*/) -{ -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::errorOccurred -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::errorOccurred(int err) -{ - Q_UNUSED(err) -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::readCompleted -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::removeCompleted() -{ -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::errorOccurred -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::logsRemoveErrorOccured(int err) -{ - Q_UNUSED(err) -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::temporaryErrorOccurred -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::temporaryErrorOccurred(int err) -{ - Q_UNUSED(err) -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::eventModifyingCompleted -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::eventModifyingCompleted() -{ - -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::duplicatesReadingCompleted -// ---------------------------------------------------------------------------- -// -void LogsDbConnector::duplicatesReadingCompleted(QList duplicates) -{ - Q_UNUSED(duplicates); -} - -// ---------------------------------------------------------------------------- -// LogsDbConnector::doMarkEventSeen -// ---------------------------------------------------------------------------- -// -int LogsDbConnector::doMarkEventSeen() -{ - return 0; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub_helper.h --- a/logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub_helper.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +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: -* -*/ - -/** -* Helper class to control logsdbconnector stub behavior -* -*/ -class LogsDbConnectorStubHelper -{ - public: - static void reset(); - static QString lastCalledFunction(); -}; diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/symbianos_stub/logseventdataparser_stub.cpp --- a/logsui/logsengine/tsrc/symbianos_stub/logseventdataparser_stub.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 FILES -#include -#include - -#include "logseventdataparser.h" -#include "logseventdata.h" -#include "LogsApiConsts.h" - -// Separator for gprs data (old legacy non-tagged format for sent and -// received grps data) -_LIT8(KDataSeparator,","); - -// ---------------------------------------------------------------------------- -// LogsEventDataParser::parse -// ---------------------------------------------------------------------------- -// -int LogsEventDataParser::parse( - const CLogEvent& /*source*/, LogsEventData& dest ) -{ - dest.mIsVT = true; - return 0; -} - -// ---------------------------------------------------------------------------- -// LogsEventDataParser::setMsgPartsNumber -// Read msg parts. They are written in format of TLogSmsPduData in Data field -// ---------------------------------------------------------------------------- -// -void LogsEventDataParser::setMsgPartsNumber( const TDesC8 &/*data*/, LogsEventData& /*dest*/ ) -{ -} - -// ---------------------------------------------------------------------------- -// LogsEventDataParser::checkNonTaggedData -// ---------------------------------------------------------------------------- -// -bool LogsEventDataParser::checkNonTaggedData( const TDesC8 &/*data*/, LogsEventData& /*dest*/ ) -{ -return true; -} - - -// ---------------------------------------------------------------------------- -// LogsEventDataParser::checkTaggedData -// ---------------------------------------------------------------------------- -// -void LogsEventDataParser::checkTaggedData( const TDesC8 &/*data*/, LogsEventData& /*dest*/ ) -{ -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/symbianos_stub/logseventparser_stub.cpp --- a/logsui/logsengine/tsrc/symbianos_stub/logseventparser_stub.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 FILES -#include -#include -#include - -#include "logseventparser.h" -#include "logsevent.h" -#include "logseventdata.h" -#include "logsengdefs.h" -#include "LogsApiConsts.h" //Additional event UIDs -#include "logslogger.h" - - -// ---------------------------------------------------------------------------- -// LogsEventParser::parseL -// ---------------------------------------------------------------------------- -// -void LogsEventParser::parseL( - const CLogEvent& source, - LogsEvent& dest, - const LogsEventStrings& /*strings*/ ) -{ - dest.mNumber = DESC_TO_QSTRING( source.Number() ); -} - -// ---------------------------------------------------------------------------- -// LogsEventParser::resolveEventType -// ---------------------------------------------------------------------------- -// -void LogsEventParser::resolveEventType(LogsEvent& /*dest*/) -{ -} - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscall.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscall.h Fri Apr 16 14:53:18 2010 +0300 +++ /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: -* -*/ -#ifndef UT_LOGSCALL_H -#define UT_LOGSCALL_H - -#include - -class LogsCall; -class LogsEvent; - -class UT_LogsCall : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testCall(); - void testInitiateCallback(); - void testallowedCallTypes(); - void testisAllowedCallType(); - -private: - - LogsCall* mLogsCall; - LogsEvent* mLogsEvent; - -}; - - -#endif //UT_LOGSCALL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscommondata.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscommondata.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +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: -* -*/ -#ifndef UT_LOGSCOMMONDATA_H -#define UT_LOGSCOMMONDATA_H - -#include - -class UT_LogsCommonData : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testGetInstance(); - void testGetContactManager(); - void testFreeCommonData(); - -private: - -}; - - -#endif //UT_LOGSCOMMONDATA_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscontact.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscontact.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +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: -* -*/ -#ifndef UT_LOGSCONTACT_H -#define UT_LOGSCONTACT_H - -#include -#include - -class LogsContact; -class LogsEvent; -class LogsDbConnector; - -class UT_LogsContact : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testAllowedRequestType(); - void testOpen(); - void testAddNew(); - void testUpdateExisting(); - void testIsContactInPhonebook(); - void testIsContactRequestAllowed(); - void testHandleRequestCompeted(); - -private: - - LogsContact* mLogsContact; - LogsEvent* mLogsEvent; - - QList mEvents; - LogsDbConnector* mDbConnector; -}; - - -#endif //UT_LOGSCALL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscustomfilter.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscustomfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSCUSTOMFILTER_H -#define UT_LOGSCUSTOMFILTER_H - -#include - -class LogsCustomFilter; - -class UT_LogsCustomFilter : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testFilterAcceptsRow(); - void testClearEvents(); - void testMarkEventsSeen(); - -private: - - LogsCustomFilter* mFilter; - -}; - - -#endif //UT_LOGSCUSTOMFILTER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsdetailsmodel.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsdetailsmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +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: -* -*/ -#ifndef UT_LOGSDETAILSMODEL_H -#define UT_LOGSDETAILSMODEL_H - -#include - -class LogsDetailsModel; -class LogsDbConnector; -class LogsEvent; - - -class UT_LogsDetailsModel : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testRowCount(); - void testData(); - void testHeaderData(); - void testgetRemoteUri(); - void testInitTextsAndIcons(); - void testInitUnseenMissed(); - void testGetHeaderData(); - void testGetCallerId(); - void testgetNumberToClipboard(); - void testCreateContact(); - void testContactActionCompleted(); - -private: - - QList mEvents; - LogsDbConnector* mDbConnector; - LogsDetailsModel* mModel; - -}; - - -#endif //UT_LOGSDETAILSMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsevent.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsevent.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSEVENT_H -#define UT_LOGSEVENT_H - -#include -#include "logsengdefs.h" - -class LogsEvent; - -class UT_LogsEvent : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testInitializeEventL(); - void testSetters(); - void testGetters(); - void testValidate(); - void testGetNumberForCalling(); - void testSetContactLocalId(); - void testUpdateRemotePartyFromContacts(); - void testParseContactName(); - -private: - - LogsEvent* mEvent; - LogsEventStrings mStrings; - -}; - - -#endif //UT_LOGSEVENT_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logseventdata.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logseventdata.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSEVENTDATA_H -#define UT_LOGSEVENTDATA_H - -#include - -class LogsEventData; - -class UT_LogsEventData : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testParse(); - void testSetters(); - void testGetters(); - void testIsCsCompatible(); - -private: - - LogsEventData* mEventData; - -}; - - -#endif //UT_LOGSEVENTDATA_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsfilter.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSFILTER_H -#define UT_LOGSFILTER_H - -#include - -class LogsFilter; - -class UT_LogsFilter : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testFilterAcceptsRow(); - void testClearType(); - void testSetMaxSize(); - -private: - - LogsFilter* mFilter; - -}; - - -#endif //UT_LOGSFILTER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +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: -* -*/ -#ifndef UT_LOGSMATCHESMODEL_H -#define UT_LOGSMATCHESMODEL_H - -#include - -class LogsModel; -class LogsMatchesModel; - - -class UT_LogsMatchesModel : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testRowCount(); - void testData(); - void testDataAdded(); - void testDataUpdated(); - void testDataRemoved(); - void testLogsMatches(); - void testCreateContactWithNumber(); - void testCreateCall(); - void testCreateMessage(); - void testCreateContact(); - void testUpdateSearchEntry(); - void testGetFormattedCallerId(); - void testGetFormattedContactInfo(); - -private: - - LogsModel* mModel; - LogsMatchesModel* mMatchesModel; - -}; - - -#endif //UT_LOGSMATCHESMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmessage.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmessage.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 UT_LOGSMESSAGE_H -#define UT_LOGSMESSAGE_H - -#include - -class LogsMessage; -class LogsEvent; - -class UT_LogsMessage : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testIsMessagingAllowed(); - void testSendMessage(); - void testSendMessageToNumber(); - -private: - - LogsMessage* mLogsMessage; - LogsEvent* mLogsEvent; - -}; - - -#endif //UT_LOGSMESSAGE_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmodel.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +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: -* -*/ -#ifndef UT_LOGSMODEL_H -#define UT_LOGSMODEL_H - -#include - -class LogsModel; - - -class UT_LogsModel : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testConstructor(); - void testRowCount(); - void testData(); - void testDataAdded(); - void testDataUpdated(); - void testDataRemoved(); - void testGetDecorationData(); - void testIconName(); - void testGetCallerId(); - void testClearList(); - void testMarkEventsSeen(); - void testClearMissedCallsCounter(); - -private: - - LogsModel* mModel; - -}; - - -#endif //UT_LOGSMODEL_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsthumbnailmanager.h --- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsthumbnailmanager.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +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: -* -*/ -#ifndef UT_LOGSTHUMBNAILMANAGER_H -#define UT_LOGSTHUMBNAILMANAGER_H - -#include -#include - -class LogsThumbIconManager; - - -class UT_LogsThumbnailManager : public QObject -{ -Q_OBJECT - -private slots: - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - void testConstructor(); - void testNonExistingIcon(); - void testOneExistingIcon(); - void testCancel(); - - -private: - - LogsThumbIconManager* mIconMgr; // SUT - QIcon mIcon; - -}; - -#endif //UT_LOGSTHUMBNAILMANAGER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/main.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +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 "ut_logsmodel.h" -#include "ut_logsdetailsmodel.h" -#include "ut_logsmatchesmodel.h" -#include "ut_logsfilter.h" -#include "ut_logscustomfilter.h" -#include "ut_logscall.h" -#include "ut_logscontact.h" -#include "ut_logsmessage.h" -#include "ut_logsevent.h" -#include "ut_logseventdata.h" -#include "ut_logsthumbnailmanager.h" -#include "ut_logscommondata.h" -#include "testresultxmlparser.h" - - -int main(int argc, char *argv[]) -{ - bool promptOnExit(true); - for (int i=0; i - -void UT_LogsCall::initTestCase() -{ -} - -void UT_LogsCall::cleanupTestCase() -{ -} - - -void UT_LogsCall::init() -{ - mLogsEvent = new LogsEvent(); - mLogsEvent->setNumber(QString::number(12345)); - mLogsEvent->setEventType(LogsEvent::TypeVoiceCall); - mLogsCall = new LogsCall(*mLogsEvent); -} - -void UT_LogsCall::cleanup() -{ - delete mLogsCall; - mLogsCall = 0; - delete mLogsEvent; - mLogsEvent = 0; -} - -void UT_LogsCall::testConstructor() -{ - QVERIFY( mLogsCall ); - QVERIFY( mLogsCall->mDefaultCall == LogsCall::TypeLogsVoiceCall ); - QVERIFY( mLogsCall->mNumber == QString::number(12345) ); - - LogsCall callWithContact(2, "2222" ); - QVERIFY( callWithContact.mDefaultCall == LogsCall::TypeLogsVoiceCall ); - QVERIFY( callWithContact.mNumber == "2222" ); - - LogsCall callWithContact2(2, "user@server.com" ); - QVERIFY( callWithContact2.mDefaultCall == LogsCall::TypeLogsVoiceCall ); - QVERIFY( callWithContact2.mNumber == "user@server.com" ); - - LogsCall callWithContact3(2, "" ); - QVERIFY( callWithContact3.mDefaultCall == LogsCall::TypeLogsCallNotAvailable ); - QVERIFY( callWithContact3.mNumber.isEmpty() ); -} - -void UT_LogsCall::testallowedCallTypes() -{ - LogsEvent event; - event.setNumber(QString::number(12345)); - event.setEventType(LogsEvent::TypeVoiceCall); - LogsCall call1(event); - QVERIFY(call1.allowedCallTypes().count() == 2); - - event.setEventType(LogsEvent::TypeVideoCall); - LogsCall call2(event); - QVERIFY(call2.allowedCallTypes().count() == 2); - - // CS compatible Voip event - event.setEventType(LogsEvent::TypeVoIPCall); - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "23456667"; - event.setLogsEventData( eventData ); - LogsCall call3(event); - QVERIFY(call3.allowedCallTypes().count() == 3); - - // Not CS compatible Voip event - LogsEventData* eventData2 = new LogsEventData; - eventData2->mRemoteUrl = "test@1.2.3.4"; - event.setLogsEventData( eventData2 ); - LogsCall call4(event); - QVERIFY(call4.allowedCallTypes().count() == 1); -} - -void UT_LogsCall::testisAllowedCallType() -{ - QVERIFY(mLogsCall->isAllowedCallType()); - delete mLogsCall; - mLogsCall = 0; - mLogsEvent->setEventType(LogsEvent::TypeVoIPCall); - mLogsCall = new LogsCall(*mLogsEvent); - QVERIFY(mLogsCall->isAllowedCallType()); - - // Calling with voip event possible if having remote tel uri - delete mLogsCall; - mLogsCall = 0; - mLogsEvent->setEventType(LogsEvent::TypeVoIPCall); - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "+22233344555"; - mLogsEvent->setLogsEventData( eventData ); - mLogsCall = new LogsCall(*mLogsEvent); - QVERIFY(mLogsCall->isAllowedCallType()); -} - -void UT_LogsCall::testCall() -{ - QtHighwayStubHelper::reset(); - mLogsCall->call(LogsCall::TypeLogsVoiceCall); - QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.telephony" ); - QVERIFY( QtHighwayStubHelper::message() == "dial(QString)" ); - - // Video call message is longer than voice call - QtHighwayStubHelper::reset(); - mLogsCall->call(LogsCall::TypeLogsVideoCall); - QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.telephony" ); - QVERIFY( QtHighwayStubHelper::message() == "dialVideo(QString)" ); - - QtHighwayStubHelper::reset(); - mLogsCall->call(LogsCall::TypeLogsVoIPCall); - mLogsCall->mServiceId = 3; - QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.telephony" ); - QVERIFY( QtHighwayStubHelper::message() == "dialVoipService(QString,int)" ); - - // Not supported calltype - QtHighwayStubHelper::reset(); - mLogsCall->call(static_cast(9999)); - QVERIFY( QtHighwayStubHelper::service().isEmpty() ); - QVERIFY( QtHighwayStubHelper::message().isEmpty() ); -} - -void UT_LogsCall::testInitiateCallback() -{ - QtHighwayStubHelper::reset(); - mLogsCall->initiateCallback(); - QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.telephony" ); - QVERIFY( QtHighwayStubHelper::message() == "dial(QString)" ); - - // Video call message is longer than voice call - mLogsCall->mDefaultCall = LogsCall::TypeLogsVideoCall; - QtHighwayStubHelper::reset(); - mLogsCall->initiateCallback(); - QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.telephony" ); - QVERIFY( QtHighwayStubHelper::message() == "dialVideo(QString)" ); - - mLogsCall->mDefaultCall = LogsCall::TypeLogsVoIPCall; - QtHighwayStubHelper::reset(); - mLogsCall->mServiceId = 3; - mLogsCall->initiateCallback(); - QVERIFY( QtHighwayStubHelper::service() == "com.nokia.services.telephony" ); - QVERIFY( QtHighwayStubHelper::message() == "dialVoipService(QString,int)" ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logscommondata.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logscommondata.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +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 "ut_logscommondata.h" -#include "logscommondata.h" - -#include - -void UT_LogsCommonData::initTestCase() -{ -} - -void UT_LogsCommonData::cleanupTestCase() -{ -} - - -void UT_LogsCommonData::init() -{ -} - -void UT_LogsCommonData::cleanup() -{ -} - -void UT_LogsCommonData::testGetInstance() -{ - QVERIFY( &LogsCommonData::getInstance() != 0 ); - QVERIFY( &LogsCommonData::getInstance() == &LogsCommonData::getInstance() ); -} - -void UT_LogsCommonData::testGetContactManager() -{ - QVERIFY( &LogsCommonData::getInstance().contactManager() != 0 ); - QVERIFY( &LogsCommonData::getInstance().contactManager() == &LogsCommonData::getInstance().contactManager() ); -} - -void UT_LogsCommonData::testFreeCommonData() -{ - LogsCommonData* comData = &LogsCommonData::getInstance(); - QVERIFY( comData != 0 ); - LogsCommonData::freeCommonData(); -} - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logscontact.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logscontact.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,277 +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 "ut_logscontact.h" -#include "logscontact.h" -#include "logsevent.h" -#include "logseventdata.h" -#include "logsdbconnector.h" -#include "logsdbconnector_stub_helper.h" -#include "qtcontacts_stubs_helper.h" - -#include -#include - -const int logsContactsLocalIdTest1 = 1; -const QString logsFetchService = "com.nokia.services.phonebookservices.Fetch"; - -void UT_LogsContact::initTestCase() -{ - mDbConnector = new LogsDbConnector(mEvents); - mLogsContact = 0; -} - -void UT_LogsContact::cleanupTestCase() -{ - delete mDbConnector; -} - -void UT_LogsContact::init() -{ - QtContactsStubsHelper::reset(); - mLogsEvent = new LogsEvent(); - LogsEventData* eventData = new LogsEventData; - mLogsEvent->setLogsEventData(eventData); - mLogsEvent->logsEventData()->setContactLocalId(logsContactsLocalIdTest1); - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); -} - -void UT_LogsContact::cleanup() -{ - delete mLogsContact; - mLogsContact = 0; - delete mLogsEvent; - mLogsEvent = 0; -} - -void UT_LogsContact::testConstructor() -{ - QVERIFY( mLogsContact ); - QVERIFY( !mLogsContact->mService ); - QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactSave ); - - LogsContact contactWithoutEvent("2345", *mDbConnector, 2); - QVERIFY( contactWithoutEvent.mContactId == 2 ); - QVERIFY( contactWithoutEvent.mNumber == "2345" ); -} - -void UT_LogsContact::testAllowedRequestType() -{ - //Empty event with no matching contact - QVERIFY( mLogsContact ); - QVERIFY( mLogsContact->allowedRequestType() == LogsContact::TypeLogsContactSave ); - - //contact is in phonebook, but matching of contact is done only during - //construction of mLogsContact, later changes not reflected - mLogsEvent->logsEventData()->setContactLocalId(1); - QtContactsStubsHelper::setContactId(1); - QVERIFY( mLogsContact->allowedRequestType() == LogsContact::TypeLogsContactSave ); - - //contact is in phonebook => open is allowed - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( mLogsEvent->logsEventData()->contactLocalId() ); - QVERIFY( mLogsContact->allowedRequestType() == LogsContact::TypeLogsContactOpen ); - - //contact not in phonebook, but caller ID present => save allowed - QtContactsStubsHelper::reset(); - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( mLogsEvent->logsEventData()->contactLocalId() ); - mLogsEvent->setNumber( "123" ); - QVERIFY( mLogsContact->allowedRequestType() == LogsContact::TypeLogsContactSave ); -} - -void UT_LogsContact::testOpen() -{ - //contact not in phonebook, can't open - QVERIFY( !mLogsContact->mService ); - QVERIFY( !mLogsContact->open() ); - QVERIFY( !mLogsContact->mService ); - QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactSave ); - - //contact is in phonebook, open is ok - mLogsEvent->logsEventData()->setContactLocalId(2); - QtContactsStubsHelper::setContactId(2); - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( mLogsContact->open() ); - QVERIFY( mLogsContact->mService ); - QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactOpen ); - QVERIFY( mLogsContact->mService->service() == logsFetchService ); - QVERIFY( mLogsContact->mService->message() == "open(int)" ); - - // Same but without using logsevent at construction - LogsContact contactWithoutEvent("2345", *mDbConnector, 2); - QVERIFY( contactWithoutEvent.open() ); - QVERIFY( contactWithoutEvent.mService ); - QVERIFY( contactWithoutEvent.mCurrentRequest == LogsContact::TypeLogsContactOpen ); - QVERIFY( contactWithoutEvent.mService->service() == logsFetchService ); - QVERIFY( contactWithoutEvent.mService->message() == "open(int)" ); - -} - -void UT_LogsContact::testAddNew() -{ - //no caller ID, contact won't be saved - mLogsEvent->setEventType(LogsEvent::TypeVoiceCall); - QVERIFY( mLogsEvent->getNumberForCalling().isEmpty() ); - QVERIFY( !mLogsContact->addNew() ); - QVERIFY( !mLogsContact->mService ); - QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactSave ); - - //called ID present, contact not in phonebook => save is ok - mLogsEvent->setNumber(QString::number(12345)); - mLogsEvent->setEventType(LogsEvent::TypeVoiceCall); - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( !mLogsEvent->getNumberForCalling().isEmpty() ); - QVERIFY( !mLogsContact->isContactInPhonebook() ); - QVERIFY( mLogsContact->addNew() ); - QVERIFY( mLogsContact->mService ); - QVERIFY( mLogsContact->mCurrentRequest == LogsContact::TypeLogsContactSave ); - QVERIFY( mLogsContact->mService->service() == logsFetchService ); - QVERIFY( mLogsContact->mService->message() == "editCreateNew(QString,QString)" ); - - //caller ID present, contact is in phonebook => save is ok - mLogsEvent->setEventType(LogsEvent::TypeVoIPCall); - mLogsEvent->setNumber(""); - mLogsEvent->logsEventData()->mRemoteUrl = "someurl@blah"; - mLogsEvent->logsEventData()->setContactLocalId(2); - QtContactsStubsHelper::setContactId(2); - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( mLogsContact->isContactInPhonebook() ); - 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() ); - - //any changes in phonebook after mLogsContact creation are not reflected - mLogsEvent->logsEventData()->setContactLocalId(2); - QtContactsStubsHelper::setContactId(2); - QVERIFY( !mLogsContact->isContactInPhonebook() ); - - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( mLogsContact->isContactInPhonebook() ); - - // 0 is not valid contact ID - mLogsEvent->logsEventData()->setContactLocalId(0); - QtContactsStubsHelper::setContactId(0); - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( !mLogsContact->isContactInPhonebook() ); -} - -void UT_LogsContact::testIsContactRequestAllowed() -{ - // contact not in phonebook, caller ID not defined - QVERIFY( !mLogsContact->isContactInPhonebook() ); - QVERIFY( mLogsEvent->number().isEmpty() ); - QVERIFY( mLogsEvent->logsEventData()->remoteUrl().isEmpty() ); - QVERIFY( !mLogsContact->isContactRequestAllowed() ); - - // caller ID is defined, number - mLogsEvent->setNumber( "1234" ); - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( mLogsContact->isContactRequestAllowed() ); - - // caller ID is defined, voip url - mLogsEvent->setNumber( "" ); - mLogsEvent->logsEventData()->mRemoteUrl = "blah"; - mLogsEvent->setEventType( LogsEvent::TypeVoIPCall ); - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( mLogsContact->isContactRequestAllowed() ); - - // No caller ID, but contact is in phonebook - mLogsEvent->logsEventData()->mRemoteUrl = ""; - mLogsEvent->logsEventData()->setContactLocalId(1); - QtContactsStubsHelper::setContactId(1); - delete mLogsContact; - mLogsContact = 0; - mLogsContact = new LogsContact(*mLogsEvent, *mDbConnector); - QVERIFY( mLogsContact->isContactRequestAllowed() ); -} - -void UT_LogsContact::testHandleRequestCompeted() -{ - QSignalSpy spyOpened( mLogsContact, SIGNAL(openCompleted(bool)) ); - QSignalSpy spySaved( mLogsContact, SIGNAL(saveCompleted(bool)) ); - - //open operation finished - LogsDbConnectorStubHelper::reset(); - mLogsContact->mCurrentRequest = LogsContact::TypeLogsContactOpen; - mLogsContact->handleRequestCompleted( QVariant(1) ); - QVERIFY( spyOpened.count() == 1 ); - QVERIFY( spySaved.count() == 0 ); - QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "updateDetails" ); - - //save operation finished successfully - LogsDbConnectorStubHelper::reset(); - spyOpened.clear(); - spySaved.clear(); - mLogsContact->mCurrentRequest = LogsContact::TypeLogsContactSave; - mLogsContact->handleRequestCompleted( QVariant(1) ); - QVERIFY( spyOpened.count() == 0 ); - QVERIFY( spySaved.count() == 1 ); - QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "updateDetails" ); - - //save operation finished unsuccessfully - LogsDbConnectorStubHelper::reset(); - spyOpened.clear(); - spySaved.clear(); - mLogsContact->mCurrentRequest = LogsContact::TypeLogsContactSave; - mLogsContact->handleRequestCompleted( QVariant(0) ); - QVERIFY( spyOpened.count() == 0 ); - QVERIFY( spySaved.count() == 1 ); - QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction().isEmpty() ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logscustomfilter.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logscustomfilter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +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 "ut_logscustomfilter.h" -#include "logscustomfilter.h" -#include "logsmodel.h" -#include "logsevent.h" -#include "logseventdata.h" -#include - -#include - -void UT_LogsCustomFilter::initTestCase() -{ - mFilter = new LogsCustomFilter; -} - -void UT_LogsCustomFilter::cleanupTestCase() -{ - delete mFilter; - mFilter = 0; -} - - -void UT_LogsCustomFilter::init() -{ - -} - -void UT_LogsCustomFilter::cleanup() -{ - -} - -void UT_LogsCustomFilter::testConstructor() -{ - QVERIFY( mFilter ); -} - -void UT_LogsCustomFilter::testFilterAcceptsRow() -{ - // No source model - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == false ); - - LogsModel* logsModel = new LogsModel(LogsModel::LogsFullModel); - mFilter->setSourceModel(logsModel); - - // No any events - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == false ); - - // No search term - LogsEvent* event = new LogsEvent; - logsModel->mEvents.append(event); - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == false ); - - // Search term but no matching event - mFilter->setContactId(50); - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == false ); - - // Search term and matching event - LogsEvent* event2 = new LogsEvent; - LogsEventData* eventData = new LogsEventData; - eventData->setContactLocalId(50); - event2->setLogsEventData(eventData); - logsModel->mEvents.append(event2); - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == false ); - QVERIFY( mFilter->filterAcceptsRow(1, QModelIndex()) == true ); - - mFilter->setSourceModel(0); - delete logsModel; -} - -void UT_LogsCustomFilter::testClearEvents() -{ - // No source model - mFilter->setSourceModel(0); - QVERIFY( !mFilter->clearEvents() ); - - // Wrong type of source model - QStringListModel wrongModel; - mFilter->setSourceModel(&wrongModel); - QVERIFY( !mFilter->clearEvents() ); - - // Nothing to clear - LogsModel* logsModel = new LogsModel(LogsModel::LogsFullModel); - mFilter->setSourceModel(logsModel); - QVERIFY( !mFilter->clearEvents() ); - - // Something to clear - LogsEvent* event2 = new LogsEvent; - LogsEventData* eventData = new LogsEventData; - eventData->setContactLocalId(50); - event2->setLogsEventData(eventData); - logsModel->mEvents.append(event2); - mFilter->setSourceModel(0); - mFilter->setSourceModel(logsModel); - QVERIFY( mFilter->clearEvents() ); -} - -void UT_LogsCustomFilter::testMarkEventsSeen() -{ - // No source model - mFilter->setSourceModel(0); - QVERIFY( !mFilter->markEventsSeen() ); - - // Wrong type of source model - QStringListModel wrongModel; - mFilter->setSourceModel(&wrongModel); - QVERIFY( !mFilter->markEventsSeen() ); - - // Nothing to clear - LogsModel* logsModel = new LogsModel(LogsModel::LogsFullModel); - mFilter->setSourceModel(logsModel); - QVERIFY( !mFilter->markEventsSeen() ); - - // Something to clear - LogsEvent* event2 = new LogsEvent; - LogsEventData* eventData = new LogsEventData; - eventData->setContactLocalId(50); - event2->setLogsEventData(eventData); - logsModel->mEvents.append(event2); - mFilter->setSourceModel(0); - mFilter->setSourceModel(logsModel); - QVERIFY( mFilter->markEventsSeen() ); - - // Clearing for the event already ongoing, don't try again - event2->markedAsSeenLocally(true); - QVERIFY( !mFilter->markEventsSeen() ); -} - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logsdetailsmodel.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsdetailsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,454 +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 "ut_logsdetailsmodel.h" -#include "logsdetailsmodel.h" -#include "logsevent.h" -#include "logsdbconnector.h" -#include "logscall.h" -#include "logscontact.h" -#include "logsmessage.h" -#include "logseventdata.h" -#include "qtcontacts_stubs_helper.h" -#include "logsdbconnector_stub_helper.h" -#include -#include -#include - -Q_DECLARE_METATYPE(LogsCall *) -Q_DECLARE_METATYPE(LogsMessage *) -Q_DECLARE_METATYPE(LogsContact *) - -const QString testEmpty = ""; -const QString testDetailsRemoteParty = "Remoteman"; -const QString testDetailsRemoteNum = "12345566"; -const QString testDetailsRemoteInfo = "Remoteman"; -QDateTime testDetailsDateAndTime; -const LogsEvent::LogsDirection testDetailsDirection = LogsEvent::DirIn; -const LogsEvent::LogsEventType testDetailsEventType = LogsEvent::TypeVoiceCall; -const int testDetailsDuration = 2000; -const QString testDetailsNumber = "+4152800"; - -void UT_LogsDetailsModel::initTestCase() -{ - - mDbConnector = new LogsDbConnector(mEvents); -} - -void UT_LogsDetailsModel::cleanupTestCase() -{ - delete mDbConnector; -} - - -void UT_LogsDetailsModel::init() -{ - testDetailsDateAndTime.setTime_t( 3000 ); - - LogsEvent event; - event.setRemoteParty( testDetailsRemoteParty ); - event.setNumber( testDetailsRemoteNum ); - event.setTime( testDetailsDateAndTime ); - event.setDirection( testDetailsDirection ); - event.setEventType( testDetailsEventType ); - event.setDuration( testDetailsDuration ); - mModel = new LogsDetailsModel(*mDbConnector, event); -} - -void UT_LogsDetailsModel::cleanup() -{ - delete mModel; - mModel = 0; -} - -void UT_LogsDetailsModel::testConstructor() -{ - QVERIFY( mModel ); -} - -void UT_LogsDetailsModel::testRowCount() -{ - QVERIFY( mModel->rowCount(QModelIndex()) == 5 ); -} - -void UT_LogsDetailsModel::testgetNumberToClipboard() -{ - HbLineEdit *cliptmp2 = new HbLineEdit(" "); - - cliptmp2->setText(" "); - cliptmp2->selectAll(); - cliptmp2->copy(); - - mModel->getNumberToClipboard(); - - cliptmp2->setText(" "); - cliptmp2->paste(); - - QVERIFY( cliptmp2->text() == testDetailsRemoteNum ); - delete cliptmp2; -} - -void UT_LogsDetailsModel::testData() -{ - QVERIFY( mModel->data(QModelIndex(), Qt::DisplayRole).isNull() ); - - // Test remote party info - QStringList display = mModel->data(mModel->index(0), Qt::DisplayRole).toStringList(); - QVERIFY( display.count() == 2 ); - QVERIFY( display.at(1) == testDetailsRemoteNum ); - QList decoration = mModel->data(mModel->index(0), Qt::DecorationRole).toList(); - QVERIFY( decoration.count() == 1 ); - - // Test date and time - display = mModel->data(mModel->index(1), Qt::DisplayRole).toStringList(); - QVERIFY( display.count() == 2 ); - QVERIFY( display.at(1) == testDetailsDateAndTime.toTimeSpec(Qt::LocalTime).toString() ); - decoration = mModel->data(mModel->index(1), Qt::DecorationRole).toList(); - QVERIFY( decoration.count() == 1 ); - - // Test call direction - display = mModel->data(mModel->index(2), Qt::DisplayRole).toStringList(); - QVERIFY( display.count() == 2 ); - QVERIFY( display.at(1) == mModel->mEvent->directionAsString() ); - decoration = mModel->data(mModel->index(2), Qt::DecorationRole).toList(); - QVERIFY( decoration.count() == 1 ); - - // Test call type - display = mModel->data(mModel->index(3), Qt::DisplayRole).toStringList(); - QVERIFY( display.count() == 2 ); - QVERIFY( display.at(1) == mModel->mEvent->typeAsString() ); - decoration = mModel->data(mModel->index(3), Qt::DecorationRole).toList(); - QVERIFY( decoration.count() == 1 ); - - // Test call duration - display = mModel->data(mModel->index(4), Qt::DisplayRole).toStringList(); - QVERIFY( display.count() == 2 ); - QTime n(0,0,0); - QTime t = n.addSecs(testDetailsDuration); - QVERIFY( display.at(1) == t.toString("hh:mm:ss") ); - decoration = mModel->data(mModel->index(4), Qt::DecorationRole).toList(); - QVERIFY( decoration.count() == 1 ); - - // Test call, event type supports call - QVariant callData = mModel->data(mModel->index(0), LogsDetailsModel::RoleCall); - LogsCall *call = qVariantValue( callData ); - QVERIFY( call ); - delete call; - - // Test call, event type does not support call - mModel->mEvent->setEventType(LogsEvent::TypeUndefined); - QVariant callData2 = mModel->data(mModel->index(0), LogsDetailsModel::RoleCall); - LogsCall *call2 = qVariantValue( callData2 ); - QVERIFY( !call2 ); - - // Test message - QVariant messageData = mModel->data(mModel->index(0), LogsDetailsModel::RoleMessage); - LogsMessage* message = qVariantValue( messageData ); - QVERIFY( message != 0 ); - delete message; - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "test@1.2.3.4"; - mModel->mEvent->setLogsEventData( eventData ); - QVariant messageData2 = mModel->data(mModel->index(0), LogsDetailsModel::RoleMessage); - LogsMessage* message2 = qVariantValue( messageData2 ); - QVERIFY( message2 == 0 ); - - // Contact supported - QVERIFY( mModel->mEvent->getNumberForCalling().length() > 0 ); - QVariant contactData = mModel->data(mModel->index(0), LogsDetailsModel::RoleContact); - LogsContact *contact = qVariantValue( contactData ); - QVERIFY( contact ); - delete contact; - - // Contact not supported - mModel->mEvent->setNumber(""); - mModel->mEvent->setLogsEventData( 0 ); - contactData = mModel->data(mModel->index(0), LogsModel::RoleContact); - contact = qVariantValue( contactData ); - QVERIFY( !contact ); -} - -void UT_LogsDetailsModel::testHeaderData() -{ - QCOMPARE(mModel->headerData(0, Qt::Vertical).toString(), - testDetailsRemoteInfo); - QVERIFY(mModel->headerData(0, Qt::Vertical, Qt::DecorationRole).isNull()); -} - -void UT_LogsDetailsModel::testgetRemoteUri() -{ - LogsEvent event; - QVERIFY( mModel->getRemoteUri(event) == QString("") ); - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "test@1.2.3.4"; - mModel->mEvent->setLogsEventData( eventData ); - QVERIFY( mModel->getRemoteUri(*mModel->mEvent) == QString("test@1.2.3.4") ); -} - -void UT_LogsDetailsModel::testInitTextsAndIcons() -{ - //No VoIP call,no remote url or local url and contactname - testDetailsDateAndTime.setTime_t( 3000 ); - LogsEvent event; - event.setRemoteParty( testDetailsRemoteParty ); - event.setNumber( testDetailsRemoteNum ); - event.setTime( testDetailsDateAndTime ); - event.setDirection( testDetailsDirection ); - event.setEventType( testDetailsEventType ); - event.setDuration( testDetailsDuration ); - LogsDetailsModel* model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailIcons.count() == 5); - QVERIFY(model->mDetailTexts.count() == 5); - delete model; - model = 0; - - //No VoIP call,no remote url or local url and no contactname - testDetailsDateAndTime.setTime_t( 3000 ); - event.setRemoteParty( testEmpty ); - event.setNumber( testDetailsRemoteNum ); - event.setTime( testDetailsDateAndTime ); - event.setDirection( testDetailsDirection ); - event.setEventType( testDetailsEventType ); - event.setDuration( testDetailsDuration ); - model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailIcons.count() == 4); - QVERIFY(model->mDetailTexts.count() == 4); - delete model; - model = 0; - - //VoIP call,only remote 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 ); - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "tester@100.200.300.400"; - event.setLogsEventData( eventData ); - model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailIcons.count() == 4); - QVERIFY(model->mDetailTexts.count() == 4); - delete model; - model = 0; - - //VoIP call,only remote 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->mRemoteUrl = "tester@100.200.300.400"; - event.setLogsEventData( eventData ); - model = new LogsDetailsModel(*mDbConnector, event); - QVERIFY(model->mDetailIcons.count() == 5); - QVERIFY(model->mDetailTexts.count() == 5); - delete model; - model = 0; - - //VoIP call,remote uri and local uri, 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->mRemoteUrl = "tester@100.200.300.400"; - eventData->mLocalUrl = "caller@100.200.300.400"; - event.setLogsEventData( eventData ); - model = new LogsDetailsModel(*mDbConnector, event); - 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) == hbTrId("txt_dial_dblist_call_id_val_unknown_number") ); - - // No name - QString num("+12345555"); - event.setNumber(num); - QVERIFY( mModel->getHeaderData(event) == num ); - - // No number - QString remote("Souuu"); - event.setRemoteParty(remote); - event.setNumber(""); - QVERIFY( mModel->getHeaderData(event) == remote ); - - // Both - event.setNumber(num); - QVERIFY( mModel->getHeaderData(event) == remote ); - - // Only remote url - event.setNumber(""); - event.setRemoteParty(""); - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "test@1.2.3.4"; - event.setLogsEventData( eventData ); - QVERIFY( mModel->getHeaderData(event) == eventData->mRemoteUrl ); -} - - -void UT_LogsDetailsModel::testGetCallerId() -{ - // No name or number - LogsEvent event; - QVERIFY( mModel->getCallerId(event) == QString("") ); - - // No name - QString num("+12345555"); - event.setNumber(num); - QVERIFY( mModel->getCallerId(event) == QString("") ); - - // No number - QString remote("Souuu"); - event.setRemoteParty(remote); - event.setNumber(""); - QVERIFY( mModel->getCallerId(event) == QString("") ); - - // Both - event.setNumber(num); - QVERIFY( mModel->getCallerId(event) == num ); - - //Only number - event.setRemoteParty(""); - QVERIFY( mModel->getCallerId(event) == QString("") ); - - // Only remote url - event.setNumber(""); - event.setRemoteParty("contactname"); - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "test@1.2.3.4"; - event.setLogsEventData( eventData ); - QVERIFY( mModel->getCallerId(event) == eventData->mRemoteUrl ); -} - -void UT_LogsDetailsModel::testCreateContact() -{ - LogsEvent event; - LogsModelItemContainer item(&event); - LogsContact* contact = qVariantValue(mModel->createContact(item)); - QVERIFY( !contact ); - - LogsEvent event2; - event2.setNumber("2145"); - LogsModelItemContainer item2(&event2); - contact = qVariantValue(mModel->createContact(item2)); - QVERIFY( contact ); - delete contact; -} - -void UT_LogsDetailsModel::testContactActionCompleted() -{ - mModel->mDetailTexts.clear(); - mModel->contactActionCompleted(false); - QVERIFY( mModel->mDetailTexts.count() == 0 ); - - // No match - mModel->mEvent->setRemoteParty( "" ); - mModel->mEvent->setNumber( "123445" ); - mModel->contactActionCompleted(true); - QVERIFY( mModel->mDetailTexts.count() == 0 ); - QVERIFY( mModel->mEvent->remoteParty().length() == 0 ); - - // Match - QtContactsStubsHelper::setContactNames("first", "last"); - mModel->mEvent->setRemoteParty( "" ); - mModel->mEvent->setNumber( "11112222" ); - mModel->contactActionCompleted(true); - QVERIFY( mModel->mDetailTexts.count() > 0 ); - QVERIFY( mModel->mEvent->remoteParty().length() > 0 ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logsevent.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsevent.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "ut_logsevent.h" -#include "logsevent.h" -#include "logseventdata.h" -#include "qtcontacts_stubs_helper.h" -#include -#include -#include - -#include - -void UT_LogsEvent::initTestCase() -{ - -} - -void UT_LogsEvent::cleanupTestCase() -{ -} - - -void UT_LogsEvent::init() -{ - mEvent = new LogsEvent(); -} - -void UT_LogsEvent::cleanup() -{ - delete mEvent; - mEvent = 0; -} - -void UT_LogsEvent::testConstructor() -{ - QVERIFY( mEvent ); -} - -void UT_LogsEvent::testInitializeEventL() -{ - CLogEvent* logEvent = 0; - QT_TRAP_THROWING( logEvent = CLogEvent::NewL(); ) - - // Test number - _LIT( eventTestNumber, "123444555" ); - QString strEventTestNumber = DESC_TO_QSTRING( eventTestNumber() ); - logEvent->SetNumber( eventTestNumber() ); - QT_TRAP_THROWING( mEvent->initializeEventL(*logEvent, mStrings); ) - QVERIFY( mEvent->mNumber == strEventTestNumber ); -} - -void UT_LogsEvent::testSetters() -{ -} - -void UT_LogsEvent::testGetters() -{ -} - -void UT_LogsEvent::testValidate() -{ - // No num, remote party nor remote url, not valid - QVERIFY( !mEvent->validate() ); - - // Num, valid - mEvent->mNumber = "123454555"; - QVERIFY( mEvent->validate() ); - - // Remote party, valid - mEvent->mNumber.clear(); - mEvent->mRemoteParty = "remotePart"; - QVERIFY( mEvent->validate() ); - - // Remote url, valid - mEvent->mRemoteParty.clear(); - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "2343425"; - mEvent->setLogsEventData(eventData); - QVERIFY( mEvent->validate() ); -} - -void UT_LogsEvent::testGetNumberForCalling() -{ - mEvent->mNumber = "123454555"; - QVERIFY( mEvent->getNumberForCalling() == "123454555" ); - mEvent->mNumber.clear(); - QVERIFY( mEvent->getNumberForCalling() == "" ); - mEvent->mEventType = LogsEvent::TypeVoIPCall; - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "2343425"; - mEvent->setLogsEventData(eventData); - QVERIFY( mEvent->getNumberForCalling() == "2343425" ); - LogsEventData* eventData2 = new LogsEventData; - eventData2->mRemoteUrl = "test@pr.fi"; - mEvent->setLogsEventData(eventData2); - QVERIFY( mEvent->getNumberForCalling() == "test@pr.fi" ); -} - -void UT_LogsEvent::testSetContactLocalId() -{ - //event data hasn't been created yet - QVERIFY( !mEvent->logsEventData() ); - mEvent->setContactLocalId( 2 ); - QVERIFY( mEvent->logsEventData() ); - QVERIFY( mEvent->logsEventData()->contactLocalId() == 2 ); - QVERIFY( mEvent->contactLocalId() == 2 ); - - //event data exists - mEvent->setContactLocalId( 3 ); - QVERIFY( mEvent->logsEventData()->contactLocalId() == 3 ); - QVERIFY( mEvent->contactLocalId() == 3 ); - - //getting contact id with no event data - mEvent->setLogsEventData(NULL); - QVERIFY( mEvent->contactLocalId() == 0 ); - QVERIFY( !mEvent->logsEventData() ); -} - -void UT_LogsEvent::testUpdateRemotePartyFromContacts() -{ - // No search term - QContactManager manager; - LogsEvent event; - QVERIFY( event.updateRemotePartyFromContacts(manager).length() == 0 ); - QVERIFY( event.remoteParty().length() == 0 ); - - // Number as search term, no match - event.setNumber("12345"); - QVERIFY( event.updateRemotePartyFromContacts(manager).length() == 0 ); - QVERIFY( event.remoteParty().length() == 0 ); - - // Number as search term, match - QtContactsStubsHelper::setContactNames("first", "last"); - event.setNumber("11112222"); - QString newRemoteParty = event.updateRemotePartyFromContacts(manager); - QVERIFY( newRemoteParty.length() > 0 ); - QVERIFY( newRemoteParty == event.remoteParty() ); - - // Voip address as search term, no match - LogsEvent event2; - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "1.2.3.4"; - event2.setLogsEventData(eventData); - event2.setEventType(LogsEvent::TypeVoIPCall); - QVERIFY( event2.updateRemotePartyFromContacts(manager).length() == 0 ); - QVERIFY( event2.remoteParty().length() == 0 ); - - // Voip address as search term, match - eventData->mRemoteUrl = "11112222"; - newRemoteParty = event2.updateRemotePartyFromContacts(manager); - QVERIFY( newRemoteParty.length() > 0 ); - QVERIFY( newRemoteParty == event.remoteParty() ); -} - -void UT_LogsEvent::testParseContactName() -{ - LogsEvent event; - QtContactsStubsHelper::reset(); - QContactName name; - QtContactsStubsHelper::setContactNames("firstname", ""); - QVERIFY(event.parseContactName(name) == "firstname"); - - QtContactsStubsHelper::setContactNames("firstname", "lastname"); - QVERIFY(event.parseContactName(name) == "firstname lastname"); - - QtContactsStubsHelper::setContactNames("", "lastname"); - QVERIFY(event.parseContactName(name) == "lastname"); - - QtContactsStubsHelper::setContactNames("", ""); - QVERIFY(event.parseContactName(name) == ""); -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logseventdata.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logseventdata.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +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 "ut_logseventdata.h" -#include "logseventdata.h" -#include "logsapiconsts.h" - - -void UT_LogsEventData::initTestCase() -{ - -} - -void UT_LogsEventData::cleanupTestCase() -{ -} - - -void UT_LogsEventData::init() -{ - mEventData = new LogsEventData(); -} - -void UT_LogsEventData::cleanup() -{ - delete mEventData; - mEventData = 0; -} - -void UT_LogsEventData::testConstructor() -{ - QVERIFY( mEventData ); -} - -void UT_LogsEventData::testParse() -{ - -} - -void UT_LogsEventData::testSetters() -{ - -} - -void UT_LogsEventData::testGetters() -{ - QVERIFY( mEventData->remoteUrl().isEmpty() ); - QString remote( "te@1.2.3.4" ); - mEventData->mRemoteUrl = remote; - QVERIFY( mEventData->remoteUrl() == remote ); - - QVERIFY( mEventData->localUrl().isEmpty() ); - QString local( "tetetetet@2.2.3.4" ); - mEventData->mLocalUrl = local; - QVERIFY( mEventData->localUrl() == local ); -} - -void UT_LogsEventData::testIsCsCompatible() -{ - // No url, compatible - QVERIFY( mEventData->isCsCompatible() ); - - // Url has only digits, compatible - mEventData->mRemoteUrl = "1234555662"; - QVERIFY( mEventData->isCsCompatible() ); - - // Url has only digits and + at beginning, compatible - mEventData->mRemoteUrl = "+00634555662"; - QVERIFY( mEventData->isCsCompatible() ); - - // Url has non-digit, not compatible - mEventData->mRemoteUrl = "006345+55662"; - QVERIFY( !mEventData->isCsCompatible() ); - - mEventData->mRemoteUrl = "006345@55662"; - QVERIFY( !mEventData->isCsCompatible() ); - - mEventData->mRemoteUrl = "test"; - QVERIFY( !mEventData->isCsCompatible() ); - - mEventData->mRemoteUrl = "test@1.2.3.4"; - QVERIFY( !mEventData->isCsCompatible() ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logsfilter.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsfilter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,166 +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 "ut_logsfilter.h" -#include "logsfilter.h" -#include "logsmodel.h" -#include "logsevent.h" -#include "logscommondata.h" - -#include - -void UT_LogsFilter::initTestCase() -{ - mFilter = new LogsFilter(); -} - -void UT_LogsFilter::cleanupTestCase() -{ - delete mFilter; - mFilter = 0; -} - - -void UT_LogsFilter::init() -{ - -} - -void UT_LogsFilter::cleanup() -{ - -} - -void UT_LogsFilter::testConstructor() -{ - QVERIFY( mFilter ); - LogsFilter* filt = new LogsFilter( LogsFilter::Received ); - QVERIFY( filt->filterType() == LogsFilter::Received ); - delete filt; -} - -void UT_LogsFilter::testFilterAcceptsRow() -{ - // No source model - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == false ); - - LogsModel* logsModel = new LogsModel(); - mFilter->setSourceModel(logsModel); - - // No any events - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == false ); - - // Matching event ("accept all" filter) - LogsEvent* event = new LogsEvent; - logsModel->mEvents.append(event); - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == true ); - - // Matching event ("accept received" filter) - mFilter->mFilterType = LogsFilter::Received; - LogsEvent* event2 = new LogsEvent(); - event2->setDirection(LogsEvent::DirIn); - logsModel->mEvents.append(event2); - QVERIFY( mFilter->filterAcceptsRow(1, QModelIndex()) == true ); - - // Not mathing event ("accept received" filter) - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == false ); - - // Called filter - mFilter->mFilterType = LogsFilter::Called; - QVERIFY( mFilter->filterAcceptsRow(1, QModelIndex()) == false ); - event2->setDirection(LogsEvent::DirOut); - QVERIFY( mFilter->filterAcceptsRow(1, QModelIndex()) == true ); - - // Missed filter - mFilter->mFilterType = LogsFilter::Missed; - QVERIFY( mFilter->filterAcceptsRow(1, QModelIndex()) == false ); - event2->setDirection(LogsEvent::DirMissed); - QVERIFY( mFilter->filterAcceptsRow(1, QModelIndex()) == true ); - - // Unknown filter - mFilter->mFilterType = (LogsFilter::FilterType)999; - QVERIFY( mFilter->filterAcceptsRow(1, QModelIndex()) == false ); -} - -void UT_LogsFilter::testClearType() -{ - - LogsModel* logsModel = new LogsModel(); - mFilter->setSourceModel(logsModel); - - // No any events - QVERIFY( mFilter->clearType() == LogsModel::TypeLogsClearAll ); - - // Matching event ("accept all" filter) - LogsEvent* event = new LogsEvent; - logsModel->mEvents.append(event); - QVERIFY( mFilter->clearType() == LogsModel::TypeLogsClearAll ); - - // Matching event ("accept received" filter) - mFilter->mFilterType = LogsFilter::Received; - LogsEvent* event2 = new LogsEvent(); - event2->setDirection(LogsEvent::DirIn); - logsModel->mEvents.append(event2); - QVERIFY( mFilter->clearType() == LogsModel::TypeLogsClearReceived ); - - // Not mathing event ("accept received" filter) - QVERIFY( mFilter->filterAcceptsRow(0, QModelIndex()) == false ); - - // Called filter - mFilter->mFilterType = LogsFilter::Called; - QVERIFY( mFilter->filterAcceptsRow(1, QModelIndex()) == false ); - event2->setDirection(LogsEvent::DirOut); - QVERIFY( mFilter->clearType() == LogsModel::TypeLogsClearCalled ); - - // Missed filter - mFilter->mFilterType = LogsFilter::Missed; - QVERIFY( mFilter->filterAcceptsRow(1, QModelIndex()) == false ); - event2->setDirection(LogsEvent::DirMissed); - QVERIFY( mFilter->clearType() == LogsModel::TypeLogsClearMissed ); - - // Unknown filter - mFilter->mFilterType = (LogsFilter::FilterType)999; - QVERIFY( mFilter->clearType() == LogsModel::TypeLogsClearAll ); -} - -void UT_LogsFilter::testSetMaxSize() -{ - // Max size for all - mFilter->mFilterType = LogsFilter::All; - mFilter->setMaxSize(10); - QVERIFY( LogsCommonData::getInstance().maxReadSize() == 10 ); - QVERIFY( LogsCommonData::getInstance().maxReadSizeDirection() == LogsEvent::DirUndefined ); - - // Max size for missed - mFilter->mFilterType = LogsFilter::Missed; - mFilter->setMaxSize(5); - QVERIFY( LogsCommonData::getInstance().maxReadSize() == 5 ); - QVERIFY( LogsCommonData::getInstance().maxReadSizeDirection() == LogsEvent::DirMissed ); - - // Max size for called - mFilter->mFilterType = LogsFilter::Called; - mFilter->setMaxSize(100); - QVERIFY( LogsCommonData::getInstance().maxReadSize() == 100 ); - QVERIFY( LogsCommonData::getInstance().maxReadSizeDirection() == LogsEvent::DirOut ); - - // Max size for received - mFilter->mFilterType = LogsFilter::Received; - mFilter->setMaxSize(8); - QVERIFY( LogsCommonData::getInstance().maxReadSize() == 8 ); - QVERIFY( LogsCommonData::getInstance().maxReadSizeDirection() == LogsEvent::DirIn ); -} - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,552 +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 "ut_logsmatchesmodel.h" -#include "logsmodel.h" -#include "logsmatchesmodel.h" -#include "logsevent.h" -#include "logscall.h" -#include "logscontact.h" -#include "logsdetailsmodel.h" -#include "logsmessage.h" -#include "logseventdata.h" -#include "qtcontacts_stubs_helper.h" -#include "logscntfinder.h" - -#include - -Q_DECLARE_METATYPE(LogsEvent *) -Q_DECLARE_METATYPE(LogsCall *) -Q_DECLARE_METATYPE(LogsDetailsModel *) -Q_DECLARE_METATYPE(LogsMessage *) -Q_DECLARE_METATYPE(LogsContact *) - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::initTestCase() -{ -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::cleanupTestCase() -{ -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::init() -{ - mModel = new LogsModel(); - - mMatchesModel = mModel->logsMatchesModel(); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::cleanup() -{ - delete mMatchesModel; - mMatchesModel = 0; - delete mModel; - mModel = 0; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testConstructor() -{ - QVERIFY( mMatchesModel ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testRowCount() -{ - QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 0 ); - LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer( - *mModel, *mMatchesModel->mIconManager, 0); - mMatchesModel->mMatches.append(item); - QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 1 ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testData() -{ - QVERIFY( mModel->data(QModelIndex(), Qt::DisplayRole).isNull() ); - - // Setup search results - LogsCntEntry* entry = new LogsCntEntry(*this, 0); - entry->setFirstName("Testing"); - mMatchesModel->mLogsCntFinder->mResults.append(entry); - quint32 contactId = 2; - entry = new LogsCntEntry(contactId); - mMatchesModel->mLogsCntFinder->mResults.append(entry); - quint32 contactId2 = 3; - entry = new LogsCntEntry(contactId2); - mMatchesModel->mLogsCntFinder->mResults.append(entry); - - LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer( - *mModel, *mMatchesModel->mIconManager, 0); - LogsEvent event; - event.setRemoteParty( "Testing" ); - item->setEvent(event); - item->mFormattedCallerId = "formattedCallerId"; - mMatchesModel->mMatches.append(item); - - QtContactsStubsHelper::setContactId(contactId); - LogsMatchesModelItemContainer* item2 = new LogsMatchesModelItemContainer( - *mModel, *mMatchesModel->mIconManager, 1); - mMatchesModel->mMatches.append(item2); - - // Display data for event match - QVariant displayData = mMatchesModel->data(mMatchesModel->index(0), Qt::DisplayRole); - QVERIFY ( displayData.type() == QVariant::StringList ); - QStringList list = displayData.toStringList(); - QVERIFY( list.count() == 2 ); - QVERIFY( list.at(0) == "formattedCallerId" ); - - // Display data for contact match, getting it first time which causes - // that data is fetched from contact - QtContactsStubsHelper::setContactNames("first", "last"); - QVERIFY( mMatchesModel->mMatches.at(1)->mContactId == 0 ); - displayData = mMatchesModel->data(mMatchesModel->index(1), Qt::DisplayRole); - QVERIFY ( displayData.type() == QVariant::StringList ); - list = displayData.toStringList(); - QVERIFY( list.count() == 2 ); - QVERIFY( list.at(0).length() > 0 && list.at(0) != "Testing" ); - QVERIFY( mMatchesModel->mMatches.at(1)->mContactId == contactId ); - - // Data asked again for same item, optimized - item2->mContactName = "formattedName"; - item2->mContactNumber = "formattedNumber"; - displayData = mMatchesModel->data(mMatchesModel->index(1), Qt::DisplayRole); - QVERIFY ( displayData.type() == QVariant::StringList ); - QStringList list2 = displayData.toStringList(); - QVERIFY( list2.count() == 2 ); - QVERIFY( list2.at(0) == "formattedName" ); - QVERIFY( list2.at(1) == "formattedNumber" ); - - // Decoration data for event match - QVariant decorationData = mMatchesModel->data(mMatchesModel->index(0), Qt::DecorationRole); - QVERIFY ( decorationData.canConvert< QList >() ); - - //create and save contact - QContact c; - QVariant ret; - QtContactsStubsHelper::setContactId(contactId2); - LogsMatchesModelItemContainer* item3 = new LogsMatchesModelItemContainer( - *mModel, *mMatchesModel->mIconManager, 2); - item3->setContact(contactId2); - mMatchesModel->mMatches.append(item3); - ret = mMatchesModel->data(mMatchesModel->index(2), Qt::DecorationRole); - QVERIFY(ret.type() == QVariant::List); - - // - ret = mMatchesModel->data(mMatchesModel->index(2), Qt::DecorationRole); - QVERIFY(ret.type() == QVariant::List); - // - ret = mMatchesModel->data(mMatchesModel->index(2), Qt::DecorationRole); - QVERIFY(ret.type() == QVariant::List); - - ret = mMatchesModel->data(mMatchesModel->index(2), Qt::DecorationRole); - QVERIFY(ret.type() == QVariant::List); - - // Details model for logs event - QVariant details = mMatchesModel->data(mMatchesModel->index(0), LogsMatchesModel::RoleDetailsModel); - LogsDetailsModel *detailsModel = qVariantValue( details ); - QVERIFY( detailsModel ); - delete detailsModel; - detailsModel = 0; - - //Details model for contact match is null - details = mMatchesModel->data(mMatchesModel->index(1), LogsMatchesModel::RoleDetailsModel); - detailsModel = qVariantValue( details ); - QVERIFY( !detailsModel ); - delete detailsModel; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testDataAdded() -{ - // One event added - LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer( - *mModel, *mMatchesModel->mIconManager, 0); - mMatchesModel->mMatches.append(item); - LogsEvent* event = new LogsEvent(); - mModel->mEvents.append(event); - mMatchesModel->eventsAdded(QModelIndex(), 0, 0); - QVERIFY( mMatchesModel->mSearchEvents.count() == 1 ); - QVERIFY( mMatchesModel->mMatches.count() == 0 ); // cleared because of new events - QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur - - // Two more sequnetial events added - item = new LogsMatchesModelItemContainer( - *mModel, *mMatchesModel->mIconManager, 1); - mMatchesModel->mMatches.append(item); - LogsEvent* event2 = new LogsEvent(); - LogsEvent* event3 = new LogsEvent(); - mModel->mEvents.insert(0, event2); - mModel->mEvents.insert(0, event3); - mMatchesModel->eventsAdded(QModelIndex(), 0, 1); - QVERIFY( mMatchesModel->mSearchEvents.count() == 3 ); - QVERIFY( mMatchesModel->mMatches.count() == 0 ); // cleared because of new events - QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testDataUpdated() -{ - // Nothing to update - LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer( - *mModel, *mMatchesModel->mIconManager, 0); - mMatchesModel->mMatches.append(item); - mMatchesModel->eventsUpdated(mModel->index(0), mModel->index(0)); - QVERIFY( mMatchesModel->mMatches.count() == 1 ); // not cleared because nothing was updated - - // Search event to update - LogsEvent* event = new LogsEvent(); - mModel->mEvents.append(event); - mMatchesModel->eventsAdded(QModelIndex(), 0, 0); - mMatchesModel->eventsUpdated(mModel->index(0), mModel->index(0)); - QVERIFY( mMatchesModel->mSearchEvents.count() == 1 ); - QVERIFY( mMatchesModel->mMatches.count() == 0 ); // cleared because of updated events - QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testDataRemoved() -{ - // Nothing to remove - LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer( - *mModel, *mMatchesModel->mIconManager, 1); - mMatchesModel->mMatches.append(item); - mMatchesModel->eventsRemoved(QModelIndex(), 0, 0); - QVERIFY( mMatchesModel->mMatches.count() == 1 ); // not cleared because nothing was removed - - // Existing search event removed - LogsEvent* event = new LogsEvent(); - mModel->mEvents.append(event); - mMatchesModel->eventsAdded(QModelIndex(), 0, 0); - mMatchesModel->eventsRemoved(QModelIndex(), 0, 0); - QVERIFY( mMatchesModel->mSearchEvents.count() == 0 ); // cleared because of removed events - QVERIFY( mMatchesModel->mMatches.count() == 0 ); // cleared because of removed events - QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); // Must be emptied, otherwise requery would not occur -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testLogsMatches() -{ - // Query ready when no matching search events - QSignalSpy spy(mMatchesModel, SIGNAL(modelReset())); - - mMatchesModel->logsMatches( "3" ); - mMatchesModel->doSearchQuery(); // simulate async completion - LogsCntEntry* entry = new LogsCntEntry(*this, 0); - mMatchesModel->mLogsCntFinder->mResults.append(entry); - mMatchesModel->queryReady(); - QVERIFY( mMatchesModel->mPrevSearchPattern == "3" ); - QVERIFY( mMatchesModel->mCurrentSearchPattern == "3" ); - QVERIFY( spy.count() == 1 ); - - // Query ready when matching search events - LogsEvent* event = new LogsEvent(); - mModel->mEvents.append(event); - mMatchesModel->eventsAdded(QModelIndex(), 0, 0); // Causes immediate reset - mMatchesModel->logsMatches( "4" ); - mMatchesModel->doSearchQuery(); // simulate async completion - mMatchesModel->mLogsCntFinder->mResults.append( - new LogsCntEntry(*mMatchesModel->mLogsCntFinder->mHistoryEvents.at(0))); - mMatchesModel->queryReady(); - QVERIFY( spy.count() == 3 ); - QVERIFY( mMatchesModel->mMatches.count() == 1 ); - - // Query ready with both event and contact matches - mMatchesModel->logsMatches( "5" ); - mMatchesModel->doSearchQuery(); // simulate async completion - mMatchesModel->mLogsCntFinder->mResults.append( - new LogsCntEntry(*mMatchesModel->mLogsCntFinder->mHistoryEvents.at(0))); - mMatchesModel->mLogsCntFinder->mResults.append( new LogsCntEntry(2) ); - mMatchesModel->queryReady(); - QVERIFY( spy.count() == 4 ); - QVERIFY( mMatchesModel->mMatches.count() == 2 ); - - // Query ready without any matches - mMatchesModel->logsMatches( "377778877" ); - mMatchesModel->doSearchQuery(); // simulate async completion - qDeleteAll(mMatchesModel->mLogsCntFinder->mResults); - mMatchesModel->mLogsCntFinder->mResults.clear(); - mMatchesModel->queryReady(); - QVERIFY( spy.count() == 5 ); - QVERIFY( mMatchesModel->mMatches.count() == 0 ); - - // Test rapid queries, only last one should be done once async calls complete - mMatchesModel->logsMatches( "1" ); - QVERIFY( mMatchesModel->mCurrentSearchPattern == "1" ); - QVERIFY( mMatchesModel->mPrevSearchPattern != "1" ); - mMatchesModel->logsMatches( "12" ); - QVERIFY( mMatchesModel->mCurrentSearchPattern == "12" ); - QVERIFY( mMatchesModel->mPrevSearchPattern != "12" ); - mMatchesModel->logsMatches( "123" ); - QVERIFY( mMatchesModel->mCurrentSearchPattern == "123" ); - QVERIFY( mMatchesModel->mPrevSearchPattern != "123" ); - - mMatchesModel->doSearchQuery(); // simulate async completion - QVERIFY( mMatchesModel->mPrevSearchPattern == "123" ); - QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern == "123" ); - - mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern.clear(); // Check that same query is not made many times - mMatchesModel->doSearchQuery(); // simulate async completion - QVERIFY( mMatchesModel->mPrevSearchPattern == "123" ); - QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern.isEmpty() ); - - mMatchesModel->doSearchQuery(); // simulate async completion - QVERIFY( mMatchesModel->mPrevSearchPattern == "123" ); - 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 - LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0); - LogsEvent event; - event.setEventType(LogsEvent::TypeVoiceCall); - event.setNumber( "1234" ); - item.setEvent(event); - QVariant var = mMatchesModel->createCall(item); - LogsCall *call = qVariantValue( var ); - QVERIFY( call ); - delete call; - - // With contact, calling not supported - LogsMatchesModelItemContainer item2(*mModel, *mMatchesModel->mIconManager, 1); - var = mMatchesModel->createCall(item2); - call = qVariantValue( var ); - QVERIFY( !call ); - - // With contact, calling supported - LogsMatchesModelItemContainer item3(*mModel, *mMatchesModel->mIconManager, 2); - item3.setContact(2); - var = mMatchesModel->createCall(item3); - call = qVariantValue( var ); - QVERIFY( call ); - delete call; - -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testCreateMessage() -{ - // With event - LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0); - LogsEvent event; - event.setNumber( "1234" ); - item.setEvent(event); - QVariant var = mMatchesModel->createMessage(item); - LogsMessage *message = qVariantValue( var ); - QVERIFY( message ); - delete message; - - // With contact, messaging not supported - LogsMatchesModelItemContainer item2(*mModel, *mMatchesModel->mIconManager, 1); - var = mMatchesModel->createMessage(item2); - message = qVariantValue( var ); - QVERIFY( !message ); - - // With contact, messaging supported - LogsMatchesModelItemContainer item3(*mModel, *mMatchesModel->mIconManager, 2); - item3.setContact(2); - var = mMatchesModel->createMessage(item3); - message = qVariantValue( var ); - QVERIFY( message ); - delete message; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testCreateContact() -{ - // With event - LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0); - LogsEvent event; - event.setEventType(LogsEvent::TypeVoiceCall); - event.setNumber( "1234" ); - item.setEvent(event); - QVariant var = mMatchesModel->createContact(item); - LogsContact *contact = qVariantValue( var ); - QVERIFY( contact ); - delete contact; - contact = 0; - - // With contact - LogsMatchesModelItemContainer item2(*mModel, *mMatchesModel->mIconManager, 1); - item2.setContact(2); - var = mMatchesModel->createContact(item2); - contact = qVariantValue( var ); - QVERIFY( contact ); - delete contact; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testUpdateSearchEntry() -{ - // Remote name exists - LogsEvent event1; - event1.setRemoteParty("someparty"); - LogsCntEntry entry1(0); - mMatchesModel->updateSearchEntry(entry1, event1); - QVERIFY( entry1.firstName().at(0).text() == "someparty" ); - QVERIFY( entry1.phoneNumber().text() == "" ); - - // Only number exists - LogsEvent event2; - event2.setNumber("55556666"); - LogsCntEntry entry2(0); - mMatchesModel->updateSearchEntry(entry2, event2); - QVERIFY( entry2.firstName().at(0).text() == "" ); - QVERIFY( entry2.phoneNumber().text() == "55556666" ); - - // Only number starting with '+' exists - LogsEvent event3; - event3.setNumber("+77776666"); - LogsCntEntry entry3(0); - mMatchesModel->updateSearchEntry(entry3, event3); - QVERIFY( entry3.firstName().at(0).text() == "" ); - QVERIFY( entry3.phoneNumber().text() == "77776666" ); - - // VoIP event with CS compatible url - LogsEvent event4; - event4.setEventType(LogsEvent::TypeVoIPCall); - LogsEventData* eventData1 = new LogsEventData(); - eventData1->mRemoteUrl = "444222111"; - event4.setLogsEventData(eventData1); - LogsCntEntry entry4(0); - mMatchesModel->updateSearchEntry(entry4, event4); - QVERIFY( entry4.firstName().at(0).text() == "" ); - QVERIFY( entry4.phoneNumber().text() == "444222111" ); - - // VoIP event without CS compatible url - LogsEvent event5; - event5.setEventType(LogsEvent::TypeVoIPCall); - LogsEventData* eventData2 = new LogsEventData(); - eventData2->mRemoteUrl = "testing@test.com"; - event5.setLogsEventData(eventData2); - LogsCntEntry entry5(0); - mMatchesModel->updateSearchEntry(entry5, event5); - QVERIFY( entry5.firstName().at(0).text() == "testing@test.com" ); - QVERIFY( entry5.phoneNumber().text() == "" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testGetFormattedCallerId() -{ - // Entry is not initialized, caller Id is empty - LogsCntEntry entry(0); - LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0); - QVERIFY( item.getFormattedCallerId(entry).length() == 0 ); - - // Entry is initialized, firstname is preffered over other data - entry.setFirstName(" long firstname"); - entry.setLastName("verylong lastname"); - entry.setPhoneNumber(" number"); - QString callerId = item.getFormattedCallerId(entry); - QVERIFY( callerId == "long firstname" ); - - // Firstname is missing, phone number is used - entry.setFirstName(""); - callerId = item.getFormattedCallerId(entry); - QVERIFY( callerId == "number" ); -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void UT_LogsMatchesModel::testGetFormattedContactInfo() -{ - QString name; - QString number; - - // Entry is not initialized, name and number are empty - LogsCntEntry entry(0); - LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0); - item.getFormattedContactInfo(entry, name, number); - QVERIFY( name.length() == 0 && number.length() == 0 ); - - // Entry is initialized, name and number are not empty - entry.setFirstName("long firstname"); - entry.setLastName("long lastname"); - entry.setPhoneNumber("number"); - item.getFormattedContactInfo(entry, name, number); - QVERIFY( name == "long firstname long lastname" ); - QVERIFY( number == "number" ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmessage.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmessage.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "ut_logsmessage.h" -#include "logsmessage.h" -#include "logsevent.h" -#include "logseventdata.h" -#include "qthighway_stub_helper.h" - -#include - -void UT_LogsMessage::initTestCase() -{ -} - -void UT_LogsMessage::cleanupTestCase() -{ -} - - -void UT_LogsMessage::init() -{ - mLogsEvent = new LogsEvent(); - mLogsEvent->setNumber(QString::number(12345)); - mLogsEvent->setEventType(LogsEvent::TypeVoiceCall); - mLogsMessage = new LogsMessage(*mLogsEvent); -} - -void UT_LogsMessage::cleanup() -{ - delete mLogsMessage; - mLogsMessage = 0; - delete mLogsEvent; - mLogsEvent = 0; -} - -void UT_LogsMessage::testConstructor() -{ - QVERIFY( mLogsMessage ); - - LogsMessage messageWithoutEvent( 2, "1234", "firstname" ); - QVERIFY( messageWithoutEvent.mContactId == 2 ); - QVERIFY( messageWithoutEvent.mNumber == "1234" ); - QVERIFY( messageWithoutEvent.mIsAllowed ); - - LogsMessage messageWithoutEvent2( 2, "","" ); - QVERIFY( messageWithoutEvent2.mContactId == 0 ); - QVERIFY( messageWithoutEvent2.mNumber == "" ); - QVERIFY( !messageWithoutEvent2.mIsAllowed ); -} - -void UT_LogsMessage::testIsMessagingAllowed() -{ - QVERIFY( mLogsMessage->isMessagingAllowed() ); - - // Not allowed as event not CS compatible - LogsEvent event; - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "test@1.2.3.4"; - event.setLogsEventData( eventData ); - LogsMessage message(event); - QVERIFY( !message.isMessagingAllowed() ); -} - -void UT_LogsMessage::testSendMessage() -{ - 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 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmodel.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,472 +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 "ut_logsmodel.h" -#include "logsmodel.h" -#include "logsevent.h" -#include "logscall.h" -#include "logscontact.h" -#include "logsdetailsmodel.h" -#include "logsmessage.h" -#include "logseventdata.h" -#include "logsdbconnector.h" -#include "logsdbconnector_stub_helper.h" - -#include -#include - -Q_DECLARE_METATYPE(LogsEvent *) -Q_DECLARE_METATYPE(LogsCall *) -Q_DECLARE_METATYPE(LogsDetailsModel *) -Q_DECLARE_METATYPE(LogsMessage *) -Q_DECLARE_METATYPE(LogsContact *) - -#define LOGS_TEST_CMP_ICONS( var, icon ){ \ - const HbIcon& tempIcon = qVariantValue( var );\ - QVERIFY( &tempIcon = icon ); } - -#define LOGS_TEST_CREATE_EVENT(eventName, index, eventState ) \ -LogsEvent* eventName = new LogsEvent; \ -eventName->setIndex(index); \ -eventName->setLogId(index);\ -eventName->setIsInView(true); \ -eventName->mEventState = eventState; \ -mModel->mEvents.insert(index, eventName) - -void UT_LogsModel::initTestCase() -{ -} - -void UT_LogsModel::cleanupTestCase() -{ -} - - -void UT_LogsModel::init() -{ - mModel = new LogsModel(); -} - -void UT_LogsModel::cleanup() -{ - delete mModel; - mModel = 0; -} - -void UT_LogsModel::testConstructor() -{ - QVERIFY( mModel ); -} - -void UT_LogsModel::testRowCount() -{ - QVERIFY( mModel->rowCount(QModelIndex()) == 0 ); - LogsEvent* event = new LogsEvent(); - mModel->mEvents.append(event); - QVERIFY( mModel->rowCount(QModelIndex()) == 1 ); -} - -void UT_LogsModel::testData() -{ - QVERIFY( mModel->data(QModelIndex(), Qt::DisplayRole).isNull() ); - - QString number("123"); - LogsEvent* event = new LogsEvent(); - event->setNumber(number); - - mModel->mEvents.append(event); - - //display data, no duplicate items - QVariant displayData = mModel->data(mModel->index(0), Qt::DisplayRole); - QVERIFY ( displayData.type() == QVariant::StringList ); - QStringList list = displayData.toStringList(); - QVERIFY( list.count() == 2 ); - QVERIFY( list.at(0) == number ); - - //display data with duplicates - event->setDuplicates(1); - displayData = mModel->data(mModel->index(0), Qt::DisplayRole); - list = displayData.toStringList(); - QVERIFY( list.count() == 2 ); - QVERIFY( list.at(0) == QString("123(2)") ); - - QVariant decorationData = mModel->data(mModel->index(0), Qt::DecorationRole); - QVERIFY ( decorationData.canConvert< QList >() ); - - // Full event - QVariant fullEventdata = mModel->data(mModel->index(0), LogsModel::RoleFullEvent); - const LogsEvent *fetchedEvent = qVariantValue( fullEventdata ); - QVERIFY ( fetchedEvent ); - - // Call not supported for this event - mModel->mEvents.at(0)->setEventType(LogsEvent::TypeUndefined); - QVariant callData = mModel->data(mModel->index(0), LogsModel::RoleCall); - LogsCall *call = qVariantValue( callData ); - QVERIFY ( !call ); - - // Call supported - mModel->mEvents.at(0)->setEventType(LogsEvent::TypeVoiceCall); - QVariant callData2 = mModel->data(mModel->index(0), LogsModel::RoleCall); - LogsCall *call2 = qVariantValue( callData2 ); - QVERIFY ( call2 ); - delete call2; - - // Details model - QVariant details = mModel->data(mModel->index(0), LogsModel::RoleDetailsModel); - LogsDetailsModel *detailsModel = qVariantValue( details ); - QVERIFY( detailsModel ); - delete detailsModel; - - // Test message - QVariant messageData = mModel->data(mModel->index(0), LogsModel::RoleMessage); - LogsMessage* message = qVariantValue( messageData ); - QVERIFY( message != 0 ); - delete message; - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "test@1.2.3.4"; - mModel->mEvents.at(0)->setLogsEventData( eventData ); - QVariant messageData2 = mModel->data(mModel->index(0), LogsModel::RoleMessage); - LogsMessage* message2 = qVariantValue( messageData2 ); - QVERIFY( message2 == 0 ); - - // Contact supported - QVariant contactData = mModel->data(mModel->index(0), LogsModel::RoleContact); - LogsContact *contact = qVariantValue( contactData ); - QVERIFY( contact ); - delete contact; - - //contact not supported - mModel->mEvents.at(0)->setNumber(""); - mModel->mEvents.at(0)->setLogsEventData( 0 ); - contactData = mModel->data(mModel->index(0), LogsModel::RoleContact); - contact = qVariantValue( contactData ); - QVERIFY( !contact ); -} - -void UT_LogsModel::testDataAdded() -{ - // One event added - LogsEvent* event = new LogsEvent(); - mModel->mEvents.append(event); - QList addedIndexes; - addedIndexes.append( 0 ); - QSignalSpy spy(mModel, SIGNAL(rowsInserted(const QModelIndex &, int, int))); - mModel->dataAdded(addedIndexes); - QVERIFY( spy.count() == 1 ); - - // Two more sequnetial events added - LogsEvent* event2 = new LogsEvent(); - LogsEvent* event3 = new LogsEvent(); - mModel->mEvents.insert(0, event2); - mModel->mEvents.insert(0, event3); - addedIndexes.clear(); - addedIndexes.append( 0 ); - addedIndexes.append( 1 ); - mModel->dataAdded(addedIndexes); - QVERIFY( spy.count() == 2 ); // +one addition sequence - - // Three events added, one is non-sequential with other two - LogsEvent* event4 = new LogsEvent(); - LogsEvent* event5 = new LogsEvent(); - LogsEvent* event6 = new LogsEvent(); - mModel->mEvents.insert(0, event4); - mModel->mEvents.insert(0, event5); - mModel->mEvents.append(event6); - addedIndexes.clear(); - addedIndexes.append( 0 ); - addedIndexes.append( 1 ); - addedIndexes.append( mModel->mEvents.count() - 1 ); // Added to end - mModel->dataAdded(addedIndexes); - QVERIFY( spy.count() == 4 ); // +two addition sequences -} - -void UT_LogsModel::testDataUpdated() -{ - LogsEvent* event = new LogsEvent(); - mModel->mEvents.append(event); - QList updatedIndexes; - updatedIndexes.append( 0 ); - QSignalSpy spy(mModel, SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &))); - mModel->dataUpdated(updatedIndexes); - QVERIFY( spy.count() == 1 ); -} - -void UT_LogsModel::testDataRemoved() -{ - QList removedIndexes; - removedIndexes.append( 0 ); - QSignalSpy spy(mModel, SIGNAL(rowsRemoved(const QModelIndex &, int, int))); - mModel->dataRemoved(removedIndexes); - QVERIFY( spy.count() == 1 ); -} - -void UT_LogsModel::testGetDecorationData() -{ - LogsEvent* event = new LogsEvent(); - mModel->mEvents.append(event); - QList icons; - - //no direction/call type - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - QVERIFY( qVariantValue( icons.at(0) ).isNull() ); - - icons.clear(); - event->setDirection(LogsEvent::DirIn); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - QVERIFY( qVariantValue( icons.at(0) ).isNull() ); - - icons.clear(); - event->setDirection(LogsEvent::DirOut); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - QVERIFY( qVariantValue( icons.at(0) ).isNull() ); - - icons.clear(); - event->setDirection(LogsEvent::DirMissed); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - QVERIFY( qVariantValue( icons.at(0) ).isNull() ); - - //different directions/call types to get coverage - icons.clear(); - event->setDirection(LogsEvent::DirIn); - event->setEventType(LogsEvent::TypeVideoCall); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsReceivedVideoCallIconId )); - - icons.clear(); - event->setEventType(LogsEvent::TypeVoIPCall); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsReceivedVoipCallIconId )); - - icons.clear(); - event->setEventType(LogsEvent::TypeVoiceCall); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsReceivedVoiceCallIconId )); - - icons.clear(); - event->setDirection(LogsEvent::DirOut); - event->setEventType(LogsEvent::TypeVideoCall); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsDialledVideoCallIconId )); - - icons.clear(); - event->setEventType(LogsEvent::TypeVoIPCall); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsDialledVoipCallIconId )); - - icons.clear(); - event->setEventType(LogsEvent::TypeVoiceCall); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsDialledVoiceCallIconId )); - - icons.clear(); - event->setDirection(LogsEvent::DirMissed); - event->setEventType(LogsEvent::TypeVideoCall); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsMissedVideoCallIconId )); - - icons.clear(); - event->setEventType(LogsEvent::TypeVoIPCall); - mModel->getDecorationData(*event, icons); - QVERIFY(icons.count() == 1); - LOGS_TEST_CMP_ICONS(icons.at(0), mModel->mIcons.value( logsMissedVoipCallIconId )); - - icons.clear(); - event->setEventType(LogsEvent::TypeVoiceCall); - 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() -{ - LogsEvent event; - QVERIFY( LogsModel::typeIconName(event) == "" ); - event.setEventType( LogsEvent::TypeVideoCall ); - QVERIFY( LogsModel::typeIconName(event) == logsVideoCallIconId ); - event.setEventType( LogsEvent::TypeVoIPCall ); - QVERIFY( LogsModel::typeIconName(event) == logsVoipCallIconId ); - event.setEventType( LogsEvent::TypeVoiceCall ); - QVERIFY( LogsModel::typeIconName(event) == logsVoiceCallIconId ); - - QVERIFY( LogsModel::directionIconName(event) == "" ); - event.setDirection(LogsEvent::DirIn); - event.setEventType( LogsEvent::TypeUndefined ); - QVERIFY( LogsModel::directionIconName(event) == "" ); - event.setEventType( LogsEvent::TypeVoiceCall ); - QVERIFY( LogsModel::directionIconName(event) == logsReceivedVoiceCallIconId ); - event.setEventType( LogsEvent::TypeVoIPCall ); - QVERIFY( LogsModel::directionIconName(event) == logsReceivedVoipCallIconId ); - event.setEventType( LogsEvent::TypeVideoCall ); - QVERIFY( LogsModel::directionIconName(event) == logsReceivedVideoCallIconId ); - - event.setDirection(LogsEvent::DirOut); - event.setEventType( LogsEvent::TypeUndefined ); - QVERIFY( LogsModel::directionIconName(event) == "" ); - QVERIFY( LogsModel::directionIconName(event) == "" ); - event.setEventType( LogsEvent::TypeVoiceCall ); - QVERIFY( LogsModel::directionIconName(event) == logsDialledVoiceCallIconId ); - event.setEventType( LogsEvent::TypeVoIPCall ); - QVERIFY( LogsModel::directionIconName(event) == logsDialledVoipCallIconId ); - event.setEventType( LogsEvent::TypeVideoCall ); - QVERIFY( LogsModel::directionIconName(event) == logsDialledVideoCallIconId ); - - event.setDirection(LogsEvent::DirMissed); - event.setEventType( LogsEvent::TypeUndefined ); - 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() -{ - // No name or number - LogsEvent event; - QVERIFY( mModel->getCallerId(event) == QString("No number") ); - - // No name - QString num("+12345555"); - event.setNumber(num); - QVERIFY( mModel->getCallerId(event) == num ); - - // No number - QString remote("Souuu"); - event.setRemoteParty(remote); - event.setNumber(""); - QVERIFY( mModel->getCallerId(event) == remote ); - - // Both, still use remote - event.setNumber(num); - QVERIFY( mModel->getCallerId(event) == remote ); - - // Only remote url - event.setNumber(""); - event.setRemoteParty(""); - LogsEventData* eventData = new LogsEventData; - eventData->mRemoteUrl = "test@1.2.3.4"; - event.setLogsEventData( eventData ); - QVERIFY( mModel->getCallerId(event) == eventData->mRemoteUrl ); - - // Duplicates - event.setDuplicates(3); - QVERIFY( mModel->getCallerId(event) == "test@1.2.3.4(4)" ); - - // Duplicates for already read event - event.setIsRead(true); - QVERIFY( mModel->getCallerId(event) == "test@1.2.3.4" ); -} - -void UT_LogsModel::testClearList() -{ - mModel->clearList(LogsModel::TypeLogsClearAll); - QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "clearList" ); -} - -void UT_LogsModel::testMarkEventsSeen() -{ - // No events - mModel->markEventsSeen(LogsModel::TypeLogsClearMissed); - - // No missed events - LOGS_TEST_CREATE_EVENT(event, 0, LogsEvent::EventAdded ); - event->setDirection(LogsEvent::DirIn); - QVERIFY( !mModel->markEventsSeen(LogsModel::TypeLogsClearMissed) ); - QVERIFY( mModel->mDbConnector->mEventsSeen.count() == 0 ); - - // Marking missed as seen (one is already seen) - event->setDirection(LogsEvent::DirMissed); - LOGS_TEST_CREATE_EVENT(event2, 1, LogsEvent::EventAdded ); - event2->setDirection(LogsEvent::DirMissed); - LOGS_TEST_CREATE_EVENT(event3, 2, LogsEvent::EventAdded ); - event3->setDirection(LogsEvent::DirMissed); - event3->setIsRead(true); - QVERIFY( mModel->markEventsSeen(LogsModel::TypeLogsClearMissed) ); - QVERIFY( mModel->mDbConnector->mEventsSeen.count() == 2 ); - - // Trying to clear missed again, id is appended to mark list - event3->setIsRead(false); - QVERIFY( mModel->markEventsSeen(LogsModel::TypeLogsClearMissed) ); - QVERIFY( mModel->mDbConnector->mEventsSeen.count() == 3 ); - - // Clearing for the events already ongoing, don't try again - event->markedAsSeenLocally(true); - event2->markedAsSeenLocally(true); - event3->markedAsSeenLocally(true); - QVERIFY( !mModel->markEventsSeen(LogsModel::TypeLogsClearMissed) ); - - // Clearing received, does not find such - mModel->mDbConnector->mEventsSeen.clear(); - QVERIFY( !mModel->markEventsSeen(LogsModel::TypeLogsClearReceived) ); - QVERIFY( mModel->mDbConnector->mEventsSeen.count() == 0 ); - - // Clearing called, does not find such - QVERIFY( !mModel->markEventsSeen(LogsModel::TypeLogsClearCalled) ); - QVERIFY( mModel->mDbConnector->mEventsSeen.count() == 0 ); -} - -void UT_LogsModel::testClearMissedCallsCounter() -{ - QVERIFY( mModel->clearMissedCallsCounter() == 0 ); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/src/ut_logsthumbnailmanager.cpp --- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsthumbnailmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +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 "ut_logsthumbnailmanager.h" -#include "logsthumbnailmanager.h" -#include //KNullDesC -#include -#include -#include -#include - - - const QString path1 = "c:\\data\\images\\bg_1.png"; - const QString path3 = "e:\\images\\non.jpeg"; - - - -void UT_LogsThumbnailManager::initTestCase() - { - mIconMgr = new LogsThumbIconManager(); - - } - -void UT_LogsThumbnailManager::cleanupTestCase() - { - delete mIconMgr; - mIconMgr = NULL; - } - -void UT_LogsThumbnailManager::init() - { - initTestCase(); - } - -void UT_LogsThumbnailManager::cleanup() - { - cleanupTestCase(); - } - -void UT_LogsThumbnailManager::testConstructor() -{ -} - -void UT_LogsThumbnailManager::testNonExistingIcon() - { - QSignalSpy spy(mIconMgr, SIGNAL(contactIconReady(int))); - Q_ASSERT(spy.isValid()); - QCOMPARE( spy.count(), 0 ); - mIcon = mIconMgr->contactIcon(path3, 0); - Q_ASSERT(mIcon.isNull()); - mIconMgr->cancel(); - - // No avatarpath, use defaul icon, note that defaul icon is null - // because svg config is not enabled in .pro file - mIcon = mIconMgr->contactIcon(QString(), 0); - Q_ASSERT(mIcon.isNull()); - - } - -void UT_LogsThumbnailManager::testOneExistingIcon() - { - QSignalSpy spy(mIconMgr, SIGNAL(contactIconReady(int))); - Q_ASSERT(spy.isValid()); - QCOMPARE( spy.count(), 0 ); - mIcon = mIconMgr->contactIcon(path1, 10); - Q_ASSERT(mIcon.isNull()); - - QPixmap pixmap(path1); - int index = 10; - int *clientData = new int(index); - int reqId = mIconMgr->mThumbnailManager->getThumbnail(path1, clientData, 0); - mIconMgr->mTnmReqMap.insert(reqId, path1); - mIconMgr->thumbnailReady(pixmap, clientData, 1, 0); - // - mIcon = mIconMgr->contactIcon(path1, 10); - Q_ASSERT(!mIcon.isNull()); - // - mIconMgr->cancel(); - // - mIcon = mIconMgr->contactIcon(path1, 10); - Q_ASSERT(mIcon.isNull()); - reqId = mIconMgr->mThumbnailManager->getThumbnail(path1, clientData, 0); - mIconMgr->mTnmReqMap.insert(reqId, path1); - mIconMgr->thumbnailReady(pixmap, clientData, 2, -1); - mIconMgr->cancel(); - - QCOMPARE(spy.count(), 1); - QList arguments = spy.takeFirst(); - QVERIFY(arguments.at(0).toInt() == 10); - mIcon = mIconMgr->contactIcon(path1, 10); - Q_ASSERT(!mIcon.isNull()); - } - -void UT_LogsThumbnailManager::testCancel() - { - QSignalSpy spy(mIconMgr, SIGNAL(contactIconReady(int))); - Q_ASSERT(spy.isValid()); - QCOMPARE( spy.count(), 0 ); - mIcon = mIconMgr->contactIcon(path1, 10); - Q_ASSERT(mIcon.isNull()); - mIcon = mIconMgr->contactIcon(path1, 11); - Q_ASSERT(mIcon.isNull()); - mIcon = mIconMgr->contactIcon(path3, 0); - Q_ASSERT(mIcon.isNull()); - mIconMgr->thumbnailLoad(); - mIconMgr->cancel(); - QCOMPARE(spy.count(), 0); - } - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsengine/tsrc/ut_logsengine/ut_logsengine.pro --- a/logsui/logsengine/tsrc/ut_logsengine/ut_logsengine.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +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: -# -# - -TEMPLATE = app -TARGET = - -QT += testlib xml -CONFIG += qtestlib -CONFIG += hb - -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += ../symbianos_stub -INCLUDEPATH += ../hbstubs -INCLUDEPATH += ../stubs -INCLUDEPATH += /orbit/include # This must be included after the HB stubs -INCLUDEPATH += /epoc32/include -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -INCLUDEPATH += /epoc32/include/ecom -INCLUDEPATH += ../../inc -INCLUDEPATH += ../../logssymbianos/inc -INCLUDEPATH += ../../../inc -INCLUDEPATH += ../../../tsrc/qtestutils/inc -#INCLUDEPATH += ../../logssymbianos/tsrc/stubs - -DEFINES += QT_NO_DEBUG_OUTPUT - -# Input -HEADERS += inc/ut_logsmodel.h -HEADERS += inc/ut_logsdetailsmodel.h -HEADERS += inc/ut_logsmatchesmodel.h -HEADERS += inc/ut_logsfilter.h -HEADERS += inc/ut_logscustomfilter.h -HEADERS += inc/ut_logscall.h -HEADERS += inc/ut_logscontact.h -HEADERS += inc/ut_logsmessage.h -HEADERS += inc/ut_logsevent.h -HEADERS += inc/ut_logseventdata.h -HEADERS += inc/ut_logsthumbnailmanager.h -HEADERS += inc/ut_logscommondata.h -HEADERS += ../../../../contacts_plat/logs_engine_api/inc/logsabstractmodel.h -HEADERS += ../../../../contacts_plat/logs_engine_api/inc/logsmodel.h -HEADERS += ../../inc/logsdetailsmodel.h -HEADERS += ../../inc/logsmatchesmodel.h -HEADERS += ../../../../contacts_plat/logs_engine_api/inc/logsfilter.h -HEADERS += ../../../../contacts_plat/logs_engine_api/inc/logscustomfilter.h -HEADERS += ../../inc/logscall.h -HEADERS += ../../inc/logscontact.h -HEADERS += ../../inc/logsmessage.h -HEADERS += ../../../../contacts_plat/logs_engine_api/inc/logsevent.h -HEADERS += ../../inc/logseventdata.h -HEADERS += ../../inc/logsthumbnailmanager.h -HEADERS += ../../inc/logscommondata.h -HEADERS += ../../logssymbianos/inc/logseventparser.h -HEADERS += ../../logssymbianos/inc/logseventdataparser.h -HEADERS += ../../logssymbianos/inc/logsdbconnector.h -HEADERS += ../../logssymbianos/inc/logsremove.h -HEADERS += ../stubs/logscntfinder.h - -SOURCES += src/main.cpp -SOURCES += src/ut_logsmodel.cpp -SOURCES += src/ut_logsdetailsmodel.cpp -SOURCES += src/ut_logsmatchesmodel.cpp -SOURCES += src/ut_logsfilter.cpp -SOURCES += src/ut_logscustomfilter.cpp -SOURCES += src/ut_logscall.cpp -SOURCES += src/ut_logscontact.cpp -SOURCES += src/ut_logsmessage.cpp -SOURCES += src/ut_logsevent.cpp -SOURCES += src/ut_logseventdata.cpp -SOURCES += src/ut_logsthumbnailmanager.cpp -SOURCES += src/ut_logscommondata.cpp -SOURCES += ../../src/logsabstractmodel.cpp -SOURCES += ../../src/logsmodel.cpp -SOURCES += ../../src/logsdetailsmodel.cpp -SOURCES += ../../src/logsmatchesmodel.cpp -SOURCES += ../../src/logsfilter.cpp -SOURCES += ../../src/logscustomfilter.cpp -SOURCES += ../../src/logscall.cpp -SOURCES += ../../src/logscontact.cpp -SOURCES += ../../src/logsmessage.cpp -SOURCES += ../../src/logsevent.cpp -SOURCES += ../../src/logseventdata.cpp -SOURCES += ../../src/logsthumbnailmanager.cpp -SOURCES += ../../src/logscommondata.cpp -SOURCES += ../hbstubs/hbstubs.cpp -SOURCES += ../hbstubs/qiconstubs.cpp -SOURCES += ../symbianos_stub/logsdbconnector_stub.cpp -SOURCES += ../symbianos_stub/logseventparser_stub.cpp -SOURCES += ../symbianos_stub/logseventdataparser_stub.cpp -SOURCES += ../../../tsrc/qtestutils/src/testresultxmlparser.cpp -SOURCES += ../stubs/qthighway_stub.cpp -SOURCES += ../stubs/logscntfinder_stub.cpp -SOURCES += ../../logssymbianos/tsrc/stubs/logclient_stubs.cpp -SOURCES += ../../logssymbianos/tsrc/stubs/qtcontacts_stubs.cpp - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xEfa329b2 - TARGET.CAPABILITY = ALL -TCB - TARGET.EPOCALLOWDLLDATA = 1 - LIBS += -lxqservice -lqtcontacts -lthumbnailmanagerqt -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsservices/bwins/logsservicesu.def --- a/logsui/logsservices/bwins/logsservicesu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -EXPORTS - ?start@LogsServices@@SAHW4LogsView@1@_N@Z @ 1 NONAME ; int LogsServices::start(enum LogsServices::LogsView, bool) - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsservices/eabi/logsservicesu.def --- a/logsui/logsservices/eabi/logsservicesu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -EXPORTS - _ZN12LogsServices5startENS_8LogsViewEb @ 1 NONAME - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsservices/logsservices.pro --- a/logsui/logsservices/logsservices.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +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: -# -# - -TEMPLATE = lib - -TARGET = logsservices -CONFIG += dll - -INCLUDEPATH += ./ -INCLUDEPATH += ../inc -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - -# Input - -SOURCES += src/logsservices.cpp - -DEFINES += LOGSSERVICES_LIB - -libFiles.sources = logsservices.dll -libFiles.path = "!:/sys/bin" -DEPLOYMENT += libFiles - -symbian: { - TARGET.UID2 = 0x1000008d - TARGET.UID3 = 0x10282EBB - - TARGET.CAPABILITY = CAP_GENERAL_DLL - TARGET.EPOCALLOWDLLDATA = 1 - LIBS += -lxqservice -lxqserviceutil - - defFiles = "$${LITERAL_HASH}ifdef WINS" \ - "DEFFILE bwins/logsservices.def" \ - "$${LITERAL_HASH}else" \ - "DEFFILE eabi/logsservices.def" \ - "$${LITERAL_HASH}endif" - MMP_RULES += defFiles -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsservices/src/logsservices.cpp --- a/logsui/logsservices/src/logsservices.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +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 "logslogger.h" - -// -------------------------------------------------------------------------- -// LogsServices::start -// -------------------------------------------------------------------------- -// -int LogsServices::start(LogsView activatedView, bool showDialpad) -{ - LOGS_QDEBUG_2( "LogsServices::start ->", activatedView ) - // Need to do request in async manner, otherwise new logs ui process - // will be started due bug(?) in highway. - XQServiceRequest snd("com.nokia.services.logsservices.starter", - "start(int,bool)", false); - snd << (int)activatedView; - snd << showDialpad; - int retValue; - bool res=snd.send(retValue); - LOGS_QDEBUG_3( "LogsServices::start <-", activatedView, retValue ) - return res ? retValue : -1; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsservices/tsrc/at_logsservices/at_logsservices.pro --- a/logsui/logsservices/tsrc/at_logsservices/at_logsservices.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +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: -# -# - -TEMPLATE = app -TARGET = - -QT += testlib xml -CONFIG += qtestlib - -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += ./inc -INCLUDEPATH += /orbit/include # This must be included after the HB stubs -INCLUDEPATH += /epoc32/include -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -INCLUDEPATH += /epoc32/include/ecom -INCLUDEPATH += ../../../inc -INCLUDEPATH += ../../../tsrc/qtestutils/inc - -# Input -HEADERS += inc/at_logsservices.h - -SOURCES += src/main.cpp -SOURCES += src/at_logsservices.cpp -SOURCES += ../../../tsrc/qtestutils/src/testresultxmlparser.cpp - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xEf1af9b2 - TARGET.CAPABILITY = ALL -TCB - LIBS += -lecom -lflogger -lws32 -lbafl -llogsservices - TARGET.EPOCALLOWDLLDATA = 1 -} diff -r 76a2435edfd4 -r de1630741fbe logsui/logsservices/tsrc/at_logsservices/inc/at_logsservices.h --- a/logsui/logsservices/tsrc/at_logsservices/inc/at_logsservices.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 AT_LOGSSERVICES_H -#define AT_LOGSSERVICES_H - -#include - -class AT_LogsServices : public QObject -{ - Q_OBJECT - -private slots: - -/* - * In addition, there are four private slots that are not treated as testfunctions. - * They will be executed by the testing framework and can be used to initialize and clean up - * either the entire test or the current test function. - * - * initTestCase() will be called before the first testfunction is executed. - * cleanupTestCase() will be called after the last testfunction was executed. - * init() will be called before each testfunction is executed. - * cleanup() will be called after every testfunction. -*/ - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: //test methods - - void testStart(); - -private: - -}; - - -#endif //AT_LOGSSERVICES_H diff -r 76a2435edfd4 -r de1630741fbe logsui/logsservices/tsrc/at_logsservices/src/at_logsservices.cpp --- a/logsui/logsservices/tsrc/at_logsservices/src/at_logsservices.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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 "at_logsservices.h" -#include - -#include - -void AT_LogsServices::initTestCase() -{ -} - -void AT_LogsServices::cleanupTestCase() -{ -} - - -void AT_LogsServices::init() -{ -} - -void AT_LogsServices::cleanup() -{ -} - -void AT_LogsServices::testStart() -{ - LogsServices::start( LogsServices::ViewAll ); - LogsServices::start( LogsServices::ViewReceived ); - LogsServices::start( LogsServices::ViewCalled ); - LogsServices::start( LogsServices::ViewMissed ); -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/logsservices/tsrc/at_logsservices/src/main.cpp --- a/logsui/logsservices/tsrc/at_logsservices/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +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 "at_logsservices.h" -#include "testresultxmlparser.h" - - -int main(int argc, char *argv[]) -{ - bool promptOnExit(true); - for (int i=0; i - -//Resource files for Logs application -data=DATAZ_\resource\apps\logs.rsc \resource\apps\logs.rsc -data=DATAZ_\QT_TRANSLATIONS_DIR\dialer.qm QT_TRANSLATIONS_DIR\dialer.qm - -#endif diff -r 76a2435edfd4 -r de1630741fbe logsui/rom/logs_stub.sis Binary file logsui/rom/logs_stub.sis has changed diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/ApplicationControl.rb --- a/logsui/tsrc/MATTItests/ApplicationControl.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ - - -class ApplicationControl - # Run when the class is intialized. Takes logging file and MATTI sut in. - def initialize(log, my_sut) - @log = log - @my_sut = my_sut - end - - # Starts Logs application - def startApplication() - puts "starting application" - @log.debug("Starting logs.exe application") - @my_app = @my_sut.run(:name=>'logs.exe') - sleep 4 - # @my_sut.capture_screen(:Filename => 'c:/temp/live.png') - # puts @my_sut.application.attribute("FullName") - # f = File.new('c:\temp\decorator.xml', "w") - # xml = @my_sut.get_ui_dump() - # f.puts xml - - return @my_app - end - - # Closes Logs application - def closeApplication() - puts "closing application" - @log.debug("Closing logs.exe application") - @my_app.close() - end - - # Clears the database. - # An external test application is called that clears the database used by Logs application - def clearList - begin - @my_sut.run(:name=>'clearlisttest.exe') - rescue - # Expected, as the exe does not stay running - end - end - - # Adds events to database. - # An external test application is called that adds events to database used by Logs application. - # The test application takes in an argument that specifies which events should be added, e.g. case1. - def addEvents(caseName) - begin - puts caseName - @my_sut.run(:name=>"logclienttest.exe #{caseName}") - rescue - # Expected, as the exe does not stay running - end - end - - # Starts the call service monitor test application - def startCallService() - begin - puts caseName - @serviceApp = @my_sut.run(:name=>"servicepp2.exe") - rescue - # Some crashes my occure during startup - end - end - - - # Start application by pressing Send key. Currently a test application is used as the Send key does not work - def pressSendKey() - @log.debug("running logsservicestester.exe 2") - ## matti does not support pressing keys in QT side at the moment. IT will be added in maybe 0.6 version. - #MATTI.disconnect_sut(:Id => 'sut_s60_qt') - #sut = MATTI.sut(:Id => 's60') - #sut.press_key(:kEnd) - #sleep 4 - sut.press_key(:kSend) - #MATTI.disconnect_sut(:Id => 's60') - #@my_sut = MATTI.sut(:Id => 'sut_s60_qt') - #begin - #@my_sut.run(:name=>'logsservicestester.exe 2') - #rescue - # Expected, as the exe does not stay running - #end - end - - -end - \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/CommonFunctions.rb --- a/logsui/tsrc/MATTItests/CommonFunctions.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,172 +0,0 @@ -require 'matti' - -### Constants - -VoiceIcon_Const = ':/callVoice.svg' -VideoIcon_Const = ':/callVideo.svg' -DirInIcon_Const = ':/dirIn.svg' -DirOutIcon_Const = ':/dirOut.svg' -DirMissedIcon_Const = ':/dirMissed.svg' -DataAndTimeIcon_Const = ':/callDateAndTime.svg' -RemoteInfoIcon_Const = ':/remoteInfo.svg' -CallDurationIcon_Const = ':/callDuration.svg' - - -## Parent class for all TC_ classes. Contains common functionality related to intializing and running the cases, -## and other functionality that can be re-used by different tests -class CommonFunctions - # Run when the class is intialized. Takes logging file and MATTI sut in. - def initialize(log, my_sut) - @log = log - @my_sut = my_sut - end - - # Running test case logic. The case name is taken in from the test list file and then a function that has the - # same name is called. - def run(testName) - begin - result = send(testName) - rescue Exception => e - @log.fatal("Error, case execution terminated.") - @log.fatal("Error code: #{e.message}") - @log.fatal("Error line: #{e.backtrace.inspect}") - if(@my_sut.application.attribute("FullName") == 'Z:\sys\bin\logs.exe') - @appControl.closeApplication() - end - result = -2 - end - return result - end - - # Initializes the test by generating the log events - def initializeTest(caseName) - @appControl = ApplicationControl.new(@log, @my_sut) - @appControl.clearList() - @appControl.addEvents(caseName) - @my_app = @appControl.startApplication() - sleep 3 - # Note! Use only these in the test cases so that maintenance is easier. - @mainWindow = @my_app.LogsMainWindow - @recentCallsView = @mainWindow.HbContentWidget.LogsRecentCallsView.HbWidget - @eventContainer = @recentCallsView.HbListView.HbAbstractItemContainer - end - - # Initializes the test by generating the log events and starting application by pressing send Key - def initializeTestSendKey(caseName) - @appControl = ApplicationControl.new(@log, @my_sut) - @appControl.clearList() - @appControl.addEvents(caseName) - @appControl.pressSendKey - - sleep 4 - puts @my_sut.application.attribute("FullName") - @mainWindow = @my_app.LogsMainWindow - @recentCallsView = @mainWindow.HbContentWidget.LogsRecentCallsView.HbWidget - @eventContainer = @recentCallsView.HbListView.HbAbstractItemContainer - - end - - - # Selects a wanted view. First it verifies the current view and then the next view is selected. - def selectView(currentView, nextView) - @log.debug("Tapping on Show button") - showButton = @mainWindow.HbToolBar(:name=>'logs_toolbar').HbToolButton(:toolTipText=>'Show') - showButton.tap - sleep 1 - sort_menu = @mainWindow.HbMenu.HbMenuListView.HbAbstractItemContainer - @log.debug("Verifying the current view in sort menu. Menu should be: #{currentView}") - - if(currentView == "Recent") - sort_menu.HbMenuItem(:row=>'0').HbTextItem(:text=>'Recent calls') - sort_menu.HbMenuItem(:row=>'0').HbIconItem(:iconName => 'qtg_indi_list_selected') - elsif(currentView == "Dialled") - sort_menu.HbMenuItem(:row=>'2').HbTextItem(:text=>'Dialled calls') - sort_menu.HbMenuItem(:row=>'2').HbIconItem(:iconName => 'qtg_indi_list_selected') - elsif(currentView == "Received") - sort_menu.HbMenuItem(:row=>'1').HbTextItem(:text=>'Received calls') - sort_menu.HbMenuItem(:row=>'1').HbIconItem(:iconName => 'qtg_indi_list_selected') - elsif(currentView == "Missed") - sort_menu.HbMenuItem(:row=>'3').HbTextItem(:text=>'Missed calls') - sort_menu.HbMenuItem(:row=>'3').HbIconItem(:iconName => 'qtg_indi_list_selected') - end - @log.debug("Selecting the next view in sort menu. Selection: #{nextView}") - - if(nextView == "Recent") - sort_menu.HbMenuItem(:row=>'0').tap - @currentView = "Recent" - elsif(nextView == "Dialled") - sort_menu.HbMenuItem(:row=>'2').tap - @currentView = "Dialled" - elsif(nextView == "Received") - sort_menu.HbMenuItem(:row=>'1').tap - @currentView = "Received" - elsif(nextView == "Missed") - sort_menu.HbMenuItem(:row=>'3').tap - @currentView = "Missed" - end - end - - # Intiates a call to the event that is in specified row passed in as a parameter. - # Verifies the call is made to correct number - def initiate_call(row, phoneNumber) - @log.debug("Initiating call. Row: #{row} Phone number: #{phoneNumber}") - firstDialledEvent = @eventContainer.HbListViewItem(:row=>"#{row}").HbTextItem(:text=>"#{phoneNumber}") - firstDialledEvent.tap - sleep 2 - # Verify that the Telephone is calling to the correct number!! Currently no environment for that!!!! - puts @serviceApp.attribute("FullName") - return 0 - - end - - # Intiates a call to the first event in the current view by pressing Send key - # Verifies the call is made to correct number - def initiate_call_with_send_key - @log.debug("Initiating call by pressing Send key") - #recentCallsView = @my_app.HbMainWindow.HbContentWidget.LogsRecentCallsView.HbWidget - firstEvent = @eventContainer.HbAbstractViewItem(:row=>"0")#.HbTextItem(:text=>"#{phoneNumber}") - @appControl.pressSendKey() - # Verify that the Telephone is calling to the correct number!! Currently no environment for that!!!! - return 0 - end - - ## Common functionality for testing the that the last call is dislplayed correctly in - ## selected view. - ## Check the Call type (voice / video) and call direction - def last_call(caseName, phoneNumber, direction, type) - initializeTest(caseName) - @log.debug('Verifying the first recent calls item.') - verify_event(0, phoneNumber, direction, type) - @log.debug('Changing the view from Recent to Dialled and verifying the event') - if(direction == DirMissedIcon_Const) - selectView("Recent", "Missed") - elsif(direction == DirOutIcon_Const) - selectView("Recent", "Dialled") - else - selectView("Recent", "Received") - end - verify_event(0, phoneNumber, direction, type) - @log.debug('Add one event') - @appControl.addEvents(caseName + "b") - verify_event(0, phoneNumber + '1', direction, type) - verify_event(1, phoneNumber, direction, type) - result = 0 - @appControl.closeApplication() - return result - end - - ## Function for verifying that the event is correct in the selected row. - ## Check the Call type (voice / video), call direction and phone number - def verify_event(row, contact, direction, type) - puts "Verifying that row: #{row} has a contact/phone number: #{contact}" - @log.debug("Verifying that row: #{row} contact/phone number: #{contact}") - @eventContainer.HbListViewItem(:row=>"#{row}").HbTextItem(:text=>"#{contact}") - @log.debug("Verifying the call type: #{type} by checking the icon") - @eventContainer.HbListViewItem(:row=>"#{row}").HbIconItem(:iconName=>"#{type}") - @log.debug("Verifying the call direction: #{direction} by checking the icon") - ## CHANGE THIS BACK, CURRENTLY 2 ICONS - #@recentCallsView.HbAbstractItemContainer.HbAbstractViewItem(:row=>"#{row}").HbIconItem(:iconName=>"#{direction}") - end - - -end diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/RunTests.rb --- a/logsui/tsrc/MATTItests/RunTests.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -#!/usr/bin/env ruby -################################################################### -# Environment constants. Change these according to your environment -# Path to your script directory -@scriptdir = "C:/matti/script/QTLogs/" -# Path to your test case list -@testlist = "C:/matti/script/QTLogs/testlist.txt" -# Path to your log directory file -@logfile = "C:/matti/script/QTLogs/logs/log.txt" -# Path to test result file used by ATS3 -@results = "C:/matti/script/QTLogs/logs/testresults.txt" -################################################################### - -require 'logger' -require 'socket' -require 'ftools' -require 'matti' -require @scriptdir + 'TC_RecentCalls' -require @scriptdir + 'TC_DialledCalls' -require @scriptdir + 'TC_Toolbar' -require @scriptdir + 'TC_MissedCalls' -require @scriptdir + 'TC_ReceivedCalls' -require @scriptdir + 'TC_OptionsMenu' -require @scriptdir + 'TC_EventDetails' - -# create Log file -#time = Time.now.strftime("%d-%m-%Y_%H-%M-%S") -#logname = time + ".log" -if(File.exists?(@logfile)) - File.delete(@logfile) -end -file = open(@logfile, File::WRONLY | File::CREAT) -log = Logger.new(file) -#log = Logger.new(@logdir + logname) -log.debug("Establishing HTI connection to the Phone") - -#fileresults = open(@results, File::WRONLY | File::CREAT) -logResults = File.new(@results, File::WRONLY | File::CREAT) - - -begin - @my_sut = MATTI.sut(:Id => 'sut_s60_qt') - log.debug("Connection established") -rescue - log.fatal("Error: HTI connection establishment failed") - exit() -end - - -if(File.exists?(@testlist) == true) - f = File.new(@testlist, "r") - begin - while (line = f.readline) - line.chomp - if(!line.include? "//") - puts "Starting to run Test case: " + line[0..(line.index('-')-2)] - log.debug("- - - - - - - - - - ") - log.debug("- - - - - - - - - - ") - - #testname = line[(line.index('.')+1)..line.length].chomp - testname = line[(line.index('.')+1)..(line.index('-')-2)].chomp - logResults.puts("Title:[#{testname}]") - - if(line.include? "RecentCalls") - log.debug("Set:[RecentCalls]") - log.debug("Title:[#{testname}]") - testSet = TC_RecentCalls.new(log, @my_sut) - end - if(line.include? "Toolbar") - log.debug("Set:[Toolbar]") - log.debug("Title:[#{testname}]") - testSet = TC_Toolbar.new(log, @my_sut) - end - if(line.include? "DialledCalls") - log.debug("Set:[DialledCalls]") - log.debug("Title:[#{testname}]") - testSet = TC_DialledCalls.new(log, @my_sut) - end - if(line.include? "MissedCalls") - log.debug("Set:[MissedCalls]") - log.debug("Title:[#{testname}]") - testSet = TC_MissedCalls.new(log, @my_sut) - end - if(line.include? "ReceivedCalls") - log.debug("Set:[ReceivedCalls]") - log.debug("Title:[#{testname}]") - testSet = TC_ReceivedCalls.new(log, @my_sut) - end - if(line.include? "OptionsMenu") - log.debug("Set:[OptionsMenu]") - log.debug("Title:[#{testname}]") - testSet = TC_OptionsMenu.new(log, @my_sut) - end - if(line.include? "EventDetails") - log.debug("Set:[EventDetails]") - log.debug("Title:[#{testname}]") - testSet = TC_EventDetails.new(log, @my_sut) - end - result = testSet.run(testname) - - if result == 0 - puts 'Result: 0 [] ==> PASSED' - log.debug('### Result: 0 [] ==> PASSED ###') - logResults.puts('Result: 0 [] ==> PASSED') - else - puts "Result: #{result} [Case failed, check log] ==> FAILED" - log.debug("### Result: #{result} [Case failed, check log] ==> FAILED ### ") - logResults.puts("Result: #{result} [Case failed, check log] ==> FAILED") - end - end - - end - rescue EOFError - f.close - end -else - log.error('Test list not found') -end - - - - - - #@my_sut.capture_screen(:Filename => 'c:/temp/live.png') - #puts @my_sut.application.attribute("FullName") - #f = File.new('c:\temp\decorator.xml', "w") - #xml = @my_sut.get_ui_dump() - #f.puts xml \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/TC_DialledCalls.rb --- a/logsui/tsrc/MATTItests/TC_DialledCalls.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -require 'CommonFunctions.rb' - -class TC_DialledCalls < CommonFunctions - - ## Initializes the Dialled view. Log events are created and application is started. - ## Calls are sorted by Dialled option - def initializeDialledView(caseName) - initializeTest(caseName) - selectView("Recent", "Dialled") - end - - ## Initializes the Dialled view. Log events are created and application is started by pressing Send key - ## Calls are sorted by Dialled option - def intializeDialledViewSendKey(caseName) - initializeTestSendKey(caseName) - selectView("Recent", "Dialled") - end - - ## Test that last dialled CS call is shown in dialled view - def last_dialled_CS_call_in_dialled_view - result = last_call("case1", "+35812345790", DirOutIcon_Const, VoiceIcon_Const) - return result - end - - ## Test that last dialled video call is shown in dialled view - def last_dialled_video_call_in_dialled_view - result = last_call("case2", "+358123457918888", DirOutIcon_Const, VideoIcon_Const) - return result - end - - ## Test initiating a quick CS callback in dialled calls view - def initiate_CS_callback_in_dialled_view - intializeDialledViewSendKey("case7") - # call to function in CommonFunctions.rb - initiate_call_with_send_key() - end - - ## Test initiating a quick video callback in dialled calls view - def initiate_video_callback_in_dialled_view - intializeDialledViewSendKey("case9") - # call to function in CommonFunctions.rb - initiate_call_with_send_key() - end - - ## Test initiating a quick video callback in dialled calls view once the - ## list is scrolled down - def initiate_video_callback_in_dialled_view_scrolling - intializeDialledViewSendKey("case9") - # call to function in CommonFunctions.rb - # Scroll down the list!! IMPLEMENT THIS - initiate_call_with_send_key() - end - - ## Test initiating CS call to first event in dialled calls view - def initiate_CS_call_to_first_event_in_dialled_view - initializeDialledView("case8") - # call to function in CommonFunctions.rb - initiate_call("0", "+3580123456789") - end - - ## Test initiating CS call to last event in dialled calls view - def initiate_CS_call_to_last_event_in_dialled_view - initializeDialledView("case8") - # call to function in CommonFunctions.rb - initiate_call("1", "+358012345678910") - end - - ## Test that contact name is displyed correctly in dialled view - def matching_contact_name_dialled_CS_call - initializeDialledView("case10") - #match_conctact("2", "Test") - verify_event(1, "Test", DirOutIcon_Const, VoiceIcon_Const) - @appControl.closeApplication() - return 0 - end - - ## Test that contact name is displyed correctly in dialled view - def matching_contact_name_dialled_video_call - initializeDialledView("case10") - verify_event(0, "Testing The Test", DirOutIcon_Const, VideoIcon_Const) - @appControl.closeApplication() - return 0 - end - - - ## Test pressing Send key in Idle mode and verify that dialled calls view is opened - def pressing_send_key_in_idle_mode - intializeDialledViewSendKey("case8") - sleep 5 - #my_app = @my_sut.application.attribute("FullName") - #puts my_app - #@my_sut.application.close - #my_app = @my_sut.application.attribute("FullName") - #puts my_app - # Verfiy that the application is logs and the menu is dialled - # case is not finished - # Check the UI components that must be there. If not there, case fails - #dialledCallsView = my_app.HbMainWindow.HbContentWidget.LogsDialledCallsView.HbWidget - #@log.debug('Verifying that the view name is "Recent calls"') - #dialledCallsView.HbLabel(:text=>'Dialed calls') - end -end \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/TC_EventDetails.rb --- a/logsui/tsrc/MATTItests/TC_EventDetails.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -require 'CommonFunctions.rb' - -class TC_EventDetails < CommonFunctions - - ## Test that dialled call event can be deleted from event specifc view - def deleting_dialled_call_event_in_the_event_specific_view - initializeTest("case8") - delete_event_from_event_specific_view(4, "Dialled", "+358012345678910", DirOutIcon_Const) - end - - ## Test that missed call event can be deleted from event specifc view - def deleting_missed_call_event_in_the_event_specific_view - initializeTest("case8") - delete_event_from_event_specific_view(0, "Missed", "088012345678910", DirMissedIcon_Const) - end - - ## Test that dialled call event can be deleted from event specifc view - def deleting_received_call_event_in_the_event_specific_view - initializeTest("case8") - delete_event_from_event_specific_view(2, "Received", "88012345678910", DirInIcon_Const) - end - - ## Test that event specific data is displayed correclty for dialled call. Contact has contact name - def displaying_event_specific_data_dialled_CS_call_contact_name_assigned - initializeTest("case11") - @log.debug('Long tapping the dialled event') - @eventContainer.HbListViewItem(:row=>"7").long_tap - @mainWindow.HbMenu.HbMenuListView.HbAbstractItemContainer.HbMenuItem(:row=>'2').tap - sleep 2 - - - end - - - - - def delete_event_from_event_specific_view(row, view, verificationPhoneNumber, direction) - @log.debug('Long tapping the dialled event') - @eventContainer.HbListViewItem(:row=>"#{row}").long_tap - @mainWindow.HbMenu.HbMenuListView.HbAbstractItemContainer.HbMenuItem(:row=>'2').tap - sleep 2 - puts "tapping finished" - @log.debug('Tapping the options menu') - @mainWindow.HbTitlePane.tap - @log.debug('Selecting Delete Event from the options menu') - @mainWindow.HbMenu.HbMenuListView.HbAbstractItemContainer.HbMenuItem(:row=>'4').HbTextItem(:text=>'Delete event').tap - - verify_event("#{row}", verificationPhoneNumber, direction, VoiceIcon_Const) - selectView("Recent", view) - verify_event("0", verificationPhoneNumber, direction, VoiceIcon_Const) - begin - @eventContainer.HbListViewItem(:row=>"1") - rescue - #Expected, as there should be only one event left - @appControl.closeApplication() - return 0 - end - @appControl.closeApplication() - return -2 - end - - - -end \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/TC_MissedCalls.rb --- a/logsui/tsrc/MATTItests/TC_MissedCalls.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -require 'CommonFunctions.rb' - -class TC_MissedCalls < CommonFunctions - - ## Initializes the Missed view. Log events are created and application is started. - ## Calls are sorted by Missed option - def initializeMissedView(caseName) - initializeTest(caseName) - selectView("Recent", "Missed") - end - - ## Initializes the Missed view. Log events are created and application is started by pressing Send ky - ## Calls are sorted by Missed option - def initializeMissedViewSendKey(caseName) - initializeTestSendKey(caseName) - selectView("Recent", "Missed") - end - - ## Test that last missed CS call is shown in missed view - def last_missed_CS_call_in_missed_view - result = last_call("case5", "358123461", DirMissedIcon_Const, VoiceIcon_Const) - return result - end - - ## Test that last missed video call is shown in missed view - def last_missed_video_call_in_missed_view - result = last_call("case6", "558123461", DirMissedIcon_Const, VideoIcon_Const) - return result - end - - ## Test initiating CS call to first event in missed calls view - def initiate_CS_call_to_first_event_in_missed_view - initializeMissedView("case8") - # call to function in CommonFunctions.rb - initiate_call("0", "088012345678911") - end - - ## Test initiating CS call to last event in missed calls view - def initiate_CS_call_to_last_event_in_missed_view - initializeMissedView("case8") - # call to function in CommonFunctions.rb - initiate_call("1", "088012345678910") - end - - ## Test initiating a quick CS callback in missed calls view - def initiate_CS_callback_in_missed_view - initializeMissedViewSendKey("case7") - # call to function in CommonFunctions.rb - initiate_call_with_send_key() - end - - ## Test that contact name is displyed correctly in missed view - def matching_contact_name_missed_CS_call - initializeMissedView("case10") - verify_event(0, "Keke Rosberg", DirMissedIcon_Const, VoiceIcon_Const) - @appControl.closeApplication() - return 0 - end - -end \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/TC_OptionsMenu.rb --- a/logsui/tsrc/MATTItests/TC_OptionsMenu.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -require 'CommonFunctions.rb' - -class TC_OptionsMenu < CommonFunctions - - ## Initializes the Application. Log events are created and application is started. - def initializeOptionsMenu(caseName) - initializeTest(caseName) - end - - ## Test that event list can be cleaned in recent view - def clear_event_list_recent_view - initializeOptionsMenu("case8") - @log.debug('Tapping the options menu') - @mainWindow.HbTitlePane.tap - @log.debug('Selecting "Clear list" options menu') - @optionsMenu = @mainWindow.HbMenu.HbMenuListView.HbAbstractItemContainer - @optionsMenu.HbMenuItem(:row=>'1').HbTextItem(:text=>'Clear list').tap - begin - @log.debug('Verify that there are no event items anymore left') - @eventContainer.HbListViewItem(:row=>"0") - rescue - #Expected, case passed as no items left anymore - result = 0 - @appControl.closeApplication() - return result - end - @log.fatal('There are still event items left!') - return -2 - end - - ## Test that event list can be cleaned in recent view - def clear_event_list_missed_view - return clear_event_list("Missed") - end - - ## Test that event list can be cleaned in recent view - def clear_event_list_dialled_view - return clear_event_list("Dialled") - end - - ## Test that event list can be cleaned in recent view - def clear_event_list_received_view - return clear_event_list("Received") - end - - def clear_event_list(view) - initializeOptionsMenu("case8") - selectView("Recent", view) - @log.debug('Tapping the options menu') - @mainWindow.HbTitlePane.tap - @log.debug('Selecting "Clear list" options menu') - @optionsMenu = @mainWindow.HbMenu.HbMenuListView.HbAbstractItemContainer - @optionsMenu.HbMenuItem(:row=>'1').HbTextItem(:text=>'Clear list').tap - begin - @log.debug('Verify that there are no event items anymore left') - @eventContainer.HbListViewItem(:row=>"0") - rescue - #Expected, no items left in selected view view - @log.debug("No event items anymore left in #{view} view") - @log.debug('Verify Recent view, all other event items should be still there') - if(view == "Missed") - selectView("Missed", "Recent") - verify_event("0", "880123456789", DirInIcon_Const, VoiceIcon_Const) - verify_event("3", "+358012345678910", DirOutIcon_Const, VoiceIcon_Const) - elsif(view == "Dialled") - selectView("Dialled", "Recent") - verify_event("0", "088012345678911", DirMissedIcon_Const, VoiceIcon_Const) - verify_event("3", "88012345678910", DirInIcon_Const, VoiceIcon_Const) - else - selectView("Received", "Recent") - verify_event("0", "088012345678911", DirMissedIcon_Const, VoiceIcon_Const) - verify_event("3", "+358012345678910", DirOutIcon_Const, VoiceIcon_Const) - end - result = 0 - @appControl.closeApplication() - return result - end - @log.fatal('There are still event items left in #{view} view!') - return -2 - end - - ## Test that logs application is closed when tapping on back - def exit_logs_by_selecting_back - initializeOptionsMenu("case8") - @log.debug('Tapping the Back button') - @my_app.LogsMainWindow.HbSoftKey({:visibleOnScreen => 'true'}).tap - if(@my_sut.application.attribute("FullName") == "Z:\sys\bin\logs.exe") - log.fatal("Error in closing logs application from Exit options menu. Logs still running!") - appControl.closeApplication() - result = -2 - else - result = 0 - end - return result - end - - ## Test that logs application is closed when selecting exit from options menu - def exit_logs_by_selecting_exit_from_options_menu - initializeOptionsMenu("case8") - @log.debug('Tapping the options menu') - @my_app.LogsMainWindow.HbTitlePane.tap - @log.debug('Selecting "Exit" options menu') - @my_app.LogsMainWindow.HbMenu.HbMenuListView.HbAbstractItemContainer.HbMenuItem(:row=>'3').HbTextItem(:text=>'Exit').tap - if(@my_sut.application.attribute("FullName") == "Z:\sys\bin\logs.exe") - log.fatal("Error in closing logs application from Exit options menu. Logs still running!") - appControl.closeApplication() - result = -2 - else - result = 0 - end - return result - end - - - -end - - - #@my_sut.capture_screen(:Filename => 'c:/temp/live.png') - #puts @my_sut.application.attribute("FullName") - #f = File.new('c:\temp\decorator.xml', "w") - #xml = @my_sut.get_ui_dump() - #f.puts xml diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/TC_ReceivedCalls.rb --- a/logsui/tsrc/MATTItests/TC_ReceivedCalls.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -require 'CommonFunctions.rb' - -class TC_ReceivedCalls < CommonFunctions - - ## Initializes the Received view. Log events are created and application is started. - ## Calls are sorted by Received option - def initializeReceivedView(caseName) - initializeTest(caseName) - selectView("Recent", "Received") - end - - ## Initializes the Received view. Log events are created and application is started by pressing Send key - ## Calls are sorted by Received option - def initializeReceivedViewSendKey(caseName) - initializeTestSendKey(caseName) - selectView("Recent", "Received") - end - - ## Test that last received CS call is shown in received view - def last_received_CS_call_in_received_view - result = last_call("case3", "358123457918889", DirInIcon_Const, VoiceIcon_Const) - return result - end - - ## Test that last received video call is shown in received view - def last_received_video_call_in_received_view - result = last_call("case4", "358123457918810", DirInIcon_Const, VideoIcon_Const) - return result - end - - ## Test initiating CS call to first event in received calls view - def initiate_CS_call_to_first_event_in_received_view - initializeReceivedView("case8") - # call to function in CommonFunctions.rb - initiate_call("0", "880123456789") - end - - ## Test initiating CS call to last event in received calls view - def initiate_CS_call_to_last_event_in_received_view - initializeReceivedView("case8") - # call to function in CommonFunctions.rb - initiate_call("1", "88012345678910") - end - - ## Test initiating a quick CS callback in received calls view - def initiate_CS_callback_in_received_view - initializeReceivedViewSendKey("case7") - # call to function in CommonFunctions.rb - initiate_call_with_send_key() - end - - ## Test that contact name is displyed correctly in received view - def matching_contact_name_received_CS_call - initializeReceivedView("case10") - verify_event(0, "Testing1 050", DirInIcon_Const, VoiceIcon_Const) - @appControl.closeApplication() - return 0 - end - -end \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/TC_RecentCalls.rb --- a/logsui/tsrc/MATTItests/TC_RecentCalls.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -require 'CommonFunctions.rb' - -class TC_RecentCalls < CommonFunctions - - ## Initializes the Recent view. Log events are created and application is started - def initializeRecentView(caseName) - initializeTest(caseName) - @log.debug('Verifying that the view name is "Recent calls"') - @recentCallsView.HbLabel(:text=>'Recent calls') - #@appControl.startCallService() - end - - ## Test initiating CS call to first dialled event in recent calls view - def initiate_CS_call_to_first_dialled_event_in_recent_view - # call to function in CommonFunctions.rb - initializeRecentView("case8") - initiate_call("4", "+3580123456789") - end - - ## Test initiating CS call to first missed event in recent calls view - def initiate_CS_call_to_first_missed_event_in_recent_view - # call to function in CommonFunctions.rb - initializeRecentView("case8") - initiate_call("0", "088012345678911") - end - - ## Test initiating CS call to first received event in recent calls view - def initiate_CS_call_to_first_received_event_in_recent_view - # call to function in CommonFunctions.rb - initializeRecentView("case8") - initiate_call("2", "880123456789") - end - - ## Test initiating a quick video callback by pressing Send key in recent calls view - def initiate_CS_callback_in_recent_view - initializeRecentView("case9") - # call to function in CommonFunctions.rb - initiate_call_with_send_key() - end - - -end diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/TC_Toolbar.rb --- a/logsui/tsrc/MATTItests/TC_Toolbar.rb Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -require 'ApplicationControl.rb' -require 'CommonFunctions.rb' - -class TC_Toolbar < CommonFunctions - - ## Test that log is sorted to contain only dialled calls. - def sort_call_log_dialled_calls - return sort_call_log("Dialled", DirOutIcon_Const) - end - - ## Test that log is sorted to contain only received calls. - def sort_call_log_received_calls - return sort_call_log("Received", DirInIcon_Const) - end - - ## Test that log is sorted to contain only missed calls. - def sort_call_log_missed_calls - return sort_call_log("Missed", DirMissedIcon_Const) - end - - ## Common functionality for sorting the calls - ## It sorts the log according to criteria passed in and verfies that the list is sorted - ## Finally it switches back to Recent view and verifies the list again - def sort_call_log(criteria, icon) - initializeTest("case8") - selectView("Recent", criteria) - - @log.debug("Verify that only #{criteria} calls are displayed and they are in correct order") - - if(criteria == "Dialled") - verify_event("1", "+358012345678910", DirOutIcon_Const, VoiceIcon_Const) - verify_event("0", "+3580123456789", DirOutIcon_Const, VoiceIcon_Const) - elsif(criteria == "Received") - verify_event("1", "88012345678910", DirInIcon_Const, VoiceIcon_Const) - verify_event("0", "880123456789", DirInIcon_Const, VoiceIcon_Const) - else - verify_event("1", "088012345678910", DirMissedIcon_Const, VoiceIcon_Const) - verify_event("0", "088012345678911", DirMissedIcon_Const, VoiceIcon_Const) - end - - @log.debug("Change back to Recent view and verify that all events are displayed") - selectView(criteria, "Recent") - - verify_event("5", "+358012345678910", DirOutIcon_Const, VoiceIcon_Const) - verify_event("4", "+3580123456789", DirOutIcon_Const, VoiceIcon_Const) - verify_event("3", "88012345678910", DirInIcon_Const, VoiceIcon_Const) - verify_event("2", "880123456789", DirInIcon_Const, VoiceIcon_Const) - verify_event("1", "088012345678910", DirMissedIcon_Const, VoiceIcon_Const) - verify_event("0", "088012345678911", DirMissedIcon_Const, VoiceIcon_Const) - - result = 0 - @appControl.closeApplication() - return result - - end -end \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/MATTItests/testlist.txt --- a/logsui/tsrc/MATTItests/testlist.txt Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -//RecentCalls.initiate_CS_call_to_first_dialled_event_in_recent_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//RecentCalls.initiate_CS_call_to_first_missed_event_in_recent_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//RecentCalls.initiate_CS_call_to_first_received_event_in_recent_view - Comments:Blocked, cannot have 2 applications in MATTI at the same time -//RecentCalls.initiate_CS_callback_in_recent_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//MissedCalls.last_missed_CS_call_in_missed_view - Comments: PASSED -//MissedCalls.last_missed_video_call_in_missed_view - Comments: PASSED -//MissedCalls.initiate_CS_call_to_first_event_in_missed_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//MissedCalls.initiate_CS_call_to_last_event_in_missed_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//MissedCalls.initiate_CS_callback_in_missed_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//MissedCalls.matching_contact_name_missed_CS_call - Comments: PASSED -//ReceivedCalls.last_received_CS_call_in_received_view - Comments: PASSED -//ReceivedCalls.last_received_video_call_in_received_view - Comments: PASSED -//ReceivedCalls.initiate_CS_call_to_first_event_in_received_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//ReceivedCalls.initiate_CS_call_to_last_event_in_received_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//ReceivedCalls.initiate_CS_callback_in_received_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//ReceivedCalls.matching_contact_name_received_CS_call - Comments: PASSED -//DialledCalls.last_dialled_CS_call_in_dialled_view - Comments: PASSED -//DialledCalls.last_dialled_video_call_in_dialled_view - Comments: PASSED -//DialledCalls.initiate_CS_call_to_first_event_in_dialled_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//DialledCalls.initiate_CS_call_to_last_event_in_dialled_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//DialledCalls.initiate_CS_callback_in_dialled_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//DialledCalls.initiate_video_callback_in_dialled_view - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//DialledCalls.initiate_video_callback_in_dialled_view_scrolling - Comments: Blocked, cannot have 2 applications in MATTI at the same time -//DialledCalls.pressing_send_key_in_idle_mode - Comments: Blocked, pressind Send key in QT does not work, should work soon -//DialledCalls.matching_contact_name_dialled_CS_call - Comments: PASSED -//DialledCalls.matching_contact_name_dialled_video_call - Comments: PASSED -//Toolbar.sort_call_log_dialled_calls - Comments: PASSED -//Toolbar.sort_call_log_received_calls - Comments: PASSED -//Toolbar.sort_call_log_missed_calls - Comments: PASSED -//OptionsMenu.exit_logs_by_selecting_exit_from_options_menu - Comments: PASSED -//OptionsMenu.exit_logs_by_selecting_back - Comments: PASSED -//OptionsMenu.clear_event_list_recent_view - Comments: PASSED -//OptionsMenu.clear_event_list_missed_view - Comments: PASSED -//OptionsMenu.clear_event_list_received_view - Comments: PASSED -//OptionsMenu.clear_event_list_dialled_view - Comments: PASSED -//EventDetails.deleting_dialled_call_event_in_the_event_specific_view - Comments: PASSED -//EventDetails.deleting_missed_call_event_in_the_event_specific_view - Comments: PASSED -//EventDetails.deleting_received_call_event_in_the_event_specific_view - Comments: PASSED -//EventDetails.displaying_event_specific_data_dialled_CS_call_contact_name_assigned - Comments: UNFINISHED - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation/service_conf.xml --- a/logsui/tsrc/callservicesimulation/service_conf.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ - - - Telephony service - - Dial interface - - \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation/serviceapp.pro --- a/logsui/tsrc/callservicesimulation/serviceapp.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +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: -# - -SERVICEAPP=app -TARGET=serviceapp - -CONFIG += service - -symbian:TARGET.UID3 = 0xE0022E73 - -XQSERVICE_ROOT=../../../qthighway -include(../../../qthighway/xqservicebase.pri) -include(src/serviceapp.pri) - -LIBS+=-lxqservice -lxqserviceutil - -SERVICE.FILE = service_conf.xml -SERVICE.OPTIONS = embeddable - -libFiles.sources = serviceapp.exe -libFiles.path = "!:\sys\bin" -DEPLOYMENT += libFiles - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation/src/main.cpp --- a/logsui/tsrc/callservicesimulation/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +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 "serviceapp.h" - -int main(int argc, char **argv) -{ - QApplication a( argc, argv ); - - ServiceApp *cl = new ServiceApp(); - cl->show(); - int rv = a.exec(); - delete cl; - return rv; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation/src/serviceapp.cpp --- a/logsui/tsrc/callservicesimulation/src/serviceapp.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,176 +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 -#include -#include -#include -#include -#include -#include -#include - - -#include "serviceapp.h" -#include - -ServiceApp::ServiceApp(QWidget *parent, Qt::WFlags f) - : QWidget(parent, f) -{ - - mService = new DialerService(this); - /* Adjust the palette */ -#if defined(Q_WS_S60) - QPalette p = qApp->palette(); - QColor color(80,20,20); - QColor bg(20,20,20); - p.setColor(QPalette::Highlight, color.lighter(200)); - p.setColor(QPalette::Text, Qt::white); - p.setColor(QPalette::Base, bg); - p.setColor(QPalette::WindowText, Qt::white); - p.setColor(QPalette::Window, bg); - p.setColor(QPalette::ButtonText, Qt::white); - p.setColor(QPalette::Button, color.lighter(150)); - p.setColor(QPalette::Link, QColor(240,40,40)); - - qApp->setPalette(p); -#endif - - QPushButton *quitButton = new QPushButton(tr("Quit")); - connect(quitButton, SIGNAL(clicked()), this, SLOT(quit())); - - /* - mEndCallButton = new QPushButton(tr("End Call")); - mEndCallButton->setEnabled(false); - connect(mEndCallButton, SIGNAL(clicked()), this, SLOT(endCall())); - */ - QString t = "SERVICE DIAL -> "; - t = t + (XQServiceUtil::isEmbedded() ? " EMBEDDED" : " NOT EMBEDDED"); - QLabel *title = new QLabel(t); - - mLabel = new QLabel(tr("PHONE")); - mNumber = new QLabel(tr("******")); - - QVBoxLayout *vl = new QVBoxLayout; - vl->setMargin(0); - vl->setSpacing(0); - - vl->addWidget(title); - vl->addWidget(mLabel); - vl->addWidget(mNumber); - vl->addWidget(quitButton); - - setLayout(vl); -#if defined(Q_WS_X11) || defined(Q_WS_WIN) - setFixedSize(QSize(360,640)); // nHD -#elif defined(Q_WS_S60) - showMaximized(); - showFullScreen(); -#endif -// new DialerService(this); -} - - -ServiceApp::~ServiceApp() -{ -} - -void ServiceApp::quit() -{ - if (mService->asyncAnswer()) { - connect(mService, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); - mService->complete(mNumber->text()); - } - else { - qApp->quit(); - } -} - -void ServiceApp::endCall() -{ - //QVBoxLayout *vl = qobject_cast(layout()) ; - //vl->removeWidget(mEndCallButton); - - //XQServiceUtil::toBackground(true); -} - -void ServiceApp::setLabelNumber(QString label,QString number) -{ - //QVBoxLayout *vl = qobject_cast(layout()) ; - //vl->insertWidget(1,mEndCallButton); - mLabel->setText(label); - mNumber->setText(number); -} - - -DialerService::DialerService(ServiceApp* parent) -: XQServiceProvider(QLatin1String("com.nokia.services.telephony"),parent),mServiceApp(parent) -{ -publishAll(); -} - -DialerService::~DialerService() -{ -} - -void DialerService::complete(QString number) -{ - completeRequest(0,number.toInt()); -} - -void DialerService::dial(const QString& number) -{ - qDebug() << "DialerService::dial (number):" << number; - QString label = "PHONE dialing (number):" ; - mServiceApp->setLabelNumber(label,number); -} - -void DialerService::dial(const QString& number, int contactId) -{ - qDebug() << "DialerService::dial to num:" << number << "contactId:" << contactId; - QString label = "PHONE dialing (number+contact):" ; - QString num; - num.append( number ); - num.append(" "); - QString contactStr; - contactStr.setNum(contactId); - num.append( contactStr ); - mServiceApp->setLabelNumber(label,num); -} - -void DialerService::dialVideo(const QString& number) -{ - qDebug() << "DialerService::dialVideo (number):" << number; - QString label = "PHONE dialing video (number):" ; - mServiceApp->setLabelNumber(label,number); -} - -void DialerService::dialVideo(const QString& number, int contactId) -{ - qDebug() << "DialerService::dialVideo to num:" << number << "contactId:" << contactId; - QString label = "PHONE dialing video (number+contact):" ; - QString num; - num.append( number ); - num.append(" "); - QString contactStr; - contactStr.setNum(contactId); - num.append( contactStr ); - mServiceApp->setLabelNumber(label,num); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation/src/serviceapp.h --- a/logsui/tsrc/callservicesimulation/src/serviceapp.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +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: -* -*/ - -#ifndef PHONESERVICE_H -#define PHONESERVICE_H - -#include -#include -#include -#include -#include - -class QLineEdit; -class QPushButton; -class DialerService; -class QLabel; - -class ServiceApp : public QWidget -{ - Q_OBJECT -public: - ServiceApp( QWidget *parent = 0, Qt::WFlags f = 0 ); - ~ServiceApp(); - - void setLabelNumber(QString label,QString number); - -public slots: - void endCall(); - -private slots: - void quit(); -private: - QLabel *mLabel; - QLabel *mNumber; - //QPushButton *mEndCallButton; - DialerService* mService; -}; - -class DialerService : public XQServiceProvider -{ - Q_OBJECT -public: - DialerService( ServiceApp *parent = 0 ); - ~DialerService(); - - void complete(QString number); - bool asyncAnswer() {return mAsyncAnswer;} -public slots: - void dial(const QString& number); - void dial(const QString& number,int contactId); - void dialVideo(const QString& number); - void dialVideo(const QString& number,int contactId); - -private: - ServiceApp* mServiceApp; - QString mNumber; - bool mAsyncAnswer; -}; - -#endif diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation/src/serviceapp.pri --- a/logsui/tsrc/callservicesimulation/src/serviceapp.pri Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +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: -# - -SOURCES=\ - src/main.cpp\ - src/serviceapp.cpp - -HEADERS=\ - src/serviceapp.h - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation2/service_conf.xml --- a/logsui/tsrc/callservicesimulation2/service_conf.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ - - - Telephony service - - Dial interface - - \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation2/serviceapp2.pro --- a/logsui/tsrc/callservicesimulation2/serviceapp2.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +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: -# - -SERVICEAPP=app -TARGET=serviceapp2 - -CONFIG += hb -CONFIG += service - -#XQSERVICE_ROOT=../../../qthighway -#include(../../../qthighway/xqservicebase.pri) -include(src/serviceapp.pri) - -LIBS+=-lxqservice -lxqserviceutil - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xE0011E73 - TARGET.CAPABILITY = CAP_APPLICATION -} - -SERVICE.FILE = service_conf.xml -SERVICE.OPTIONS = embeddable - -libFiles.sources = serviceapp2.exe -libFiles.path = "!:\sys\bin" -DEPLOYMENT += libFiles - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation2/src/main.cpp --- a/logsui/tsrc/callservicesimulation2/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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 -#include -#include -#include -#include "serviceapp.h" - -int main(int argc, char **argv) -{ - - qDebug() << "ServiceApp::main ->"; - - - HbApplication app(argc, argv); - - HbMainWindow mainWindow; - - DialerService* dialer = new DialerService(); - ServiceApp serviceApp(dialer); - mainWindow.addView(&serviceApp); - - // Show widget - mainWindow.show(); - - // Enter event loop - int err = app.exec(); - qDebug() << "ServiceApp::main <-"; - return err; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation2/src/serviceapp.cpp --- a/logsui/tsrc/callservicesimulation2/src/serviceapp.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +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 "serviceapp.h" -#include - -ServiceApp::ServiceApp( DialerService* service ) - : QGraphicsWidget(), mService( service ) -{ - qDebug() << "ServiceApp::ServiceApp ->"; - mMainLayout = new QGraphicsLinearLayout(Qt::Vertical); - mLabel = new HbLineEdit("Callservice simulation"); - mNumber = new HbLineEdit(""); - mMainLayout->addItem(mLabel); - mMainLayout->addItem(mNumber); - setLayout(mMainLayout); - if ( mService ){ - setLabelNumber( mService->label(), mService->number() ); - connect( mService, SIGNAL(labelChanged(QString)), - mLabel, SLOT(setText(const QString &)) ); - connect( mService, SIGNAL(numberChanged(QString)), - mNumber, SLOT(setText(const QString &)) ); - } - qDebug() << "ServiceApp::ServiceApp <-"; - -} - - -ServiceApp::~ServiceApp() -{ - qDebug() << "ServiceApp::~ServiceApp ->"; - delete mMainLayout; - delete mLabel; - delete mNumber; - delete mService; - qDebug() << "ServiceApp::~ServiceApp <-"; -} - -void ServiceApp::setLabelNumber(QString label,QString number) -{ - mLabel->setText(label); - mNumber->setText(number); -} - - -DialerService::DialerService() -: XQServiceProvider(QLatin1String("com.nokia.services.telephony"),0) -{ - publishAll(); -} - -DialerService::~DialerService() -{ - qDebug() << "DialerService::~DialerService <->"; -} - -void DialerService::dial(const QString& number) -{ - qDebug() << "DialerService::dial (number):" << number; - QString label = "PHONE dialing (number):" ; - mLabel = label; - mNumber = number; - emit labelChanged(mLabel); - emit numberChanged(mNumber); -} - -void DialerService::dial(const QString& number, int contactId) -{ - qDebug() << "DialerService::dial to num:" << number << "contactId:" << contactId; - QString label = "PHONE dialing (number+contact):" ; - QString num; - num.append( number ); - num.append(" "); - QString contactStr; - contactStr.setNum(contactId); - num.append( contactStr ); - mLabel = label; - mNumber = number; - emit labelChanged(mLabel); - emit numberChanged(mNumber); -} - -void DialerService::dialVideo(const QString& number) -{ - qDebug() << "DialerService::dialVideo (number):" << number; - QString label = "PHONE dialing video (number):" ; - mLabel = label; - mNumber = number; - emit labelChanged(mLabel); - emit numberChanged(mNumber); -} - -void DialerService::dialVideo(const QString& number, int contactId) -{ - qDebug() << "DialerService::dialVideo to num:" << number << "contactId:" << contactId; - QString label = "PHONE dialing video (number+contact):" ; - QString num; - num.append( number ); - num.append(" "); - QString contactStr; - contactStr.setNum(contactId); - num.append( contactStr ); - mLabel = label; - mNumber = number; - emit labelChanged(mLabel); - emit numberChanged(mNumber); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation2/src/serviceapp.h --- a/logsui/tsrc/callservicesimulation2/src/serviceapp.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +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: -* -*/ - -#ifndef PHONESERVICE_H -#define PHONESERVICE_H - -#include -#include -#include -#include -#include -#include - -class DialerService; -class HbLineEdit; -class QGraphicsLinearLayout; -class DialerService; - -class ServiceApp : public QGraphicsWidget -{ - Q_OBJECT -public: - ServiceApp(DialerService* service); - ~ServiceApp(); - - void setLabelNumber(QString label,QString number); - -private: - QGraphicsLinearLayout *mMainLayout; - HbLineEdit* mLabel; - HbLineEdit* mNumber; - DialerService* mService; -}; - -class DialerService : public XQServiceProvider -{ - Q_OBJECT -public: - DialerService(); - ~DialerService(); - - QString label(){ - return mLabel; - } - QString number(){ - return mNumber; - } - -signals: - - void labelChanged(QString label); - void numberChanged(QString number); - -public slots: - void dial(const QString& number); - void dial(const QString& number,int contactId); - void dialVideo(const QString& number); - void dialVideo(const QString& number,int contactId); - -private: - QString mLabel; - QString mNumber; - bool mAsyncAnswer; -}; - -#endif diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/callservicesimulation2/src/serviceapp.pri --- a/logsui/tsrc/callservicesimulation2/src/serviceapp.pri Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +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: -# - -SOURCES=\ - src/main.cpp\ - src/serviceapp.cpp - -HEADERS=\ - src/serviceapp.h - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/install/logs_update_urel.pkg --- a/logsui/tsrc/install/logs_update_urel.pkg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +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: -; -; A package file for creating an installation file for Logs -; which updates Logs binaries from ROM (eclipsing) - -; Supported languages -&EN - -; Header -#{"LogsApp"},(0x101F4CD5),1,0,0,TYPE=SA,RU - -; Localised Vendor name -%{"Symbian"} - -; Unique Vendor name -:"Symbian" - - -; ----------------------------------------------------------------------------------- - -; Backup registration and restore -"\epoc32\data\z\private\101F4CD5\backup_registration.xml"-"!:\private\101F4CD5\backup_registration.xml" - -"\epoc32\release\armv5\urel\logs.exe"-"!:\sys\bin\logs.exe" -"\epoc32\release\armv5\urel\logsengine.dll"-"!:\sys\bin\logsengine.dll" -"\epoc32\release\armv5\urel\logsservices.dll"-"!:\sys\bin\logsservices.dll" -"\epoc32\data\z\resource\apps\logs.rsc"-"!:\resource\apps\logs.rsc" -"\epoc32\data\z\private\10003a3f\import\apps\logs_reg.rsc"-"!:\private\10003a3f\import\apps\logs_reg.rsc" diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logdbmodifier/addeventtest/data/testlogclients.dat --- a/logsui/tsrc/logdbmodifier/addeventtest/data/testlogclients.dat Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +0,0 @@ -//The unique event ID TLogId -//EventType TUid KLogCallEventTypeUid defined in logwrap.hrh -// KLogCallEventType 0x1000550D -// KLogDataEventType 0x10005566 -// KLogFaxEventType 0x10005567 -// KLogShortMessageEventType 0x10005568 -// KLogMailEventType 0x10005569 -// KLogTaskSchedulerEventType 0x1000585E -// -// -//RemoteParty const TDesC& -//Direction const TDesC& incoming, outgoing -//R_LOG_DIR_IN R_LOG_DIR_OUT R_LOG_DIR_IN_ALT R_LOG_DIR_OUT_ALT R_LOG_DIR_FETCHED R_LOG_DIR_MISSED -//Time TTime& UTC time -//DurationType TLogDurationType KLogDurationNone, KLogDurationValid,KLogDurationData -//Duration TLogDuration expressed as the number of seconds since -//Status const TDesC& R_LOG_DEL_PENDING, R_LOG_DEL_SENT, R_LOG_DEL_FAILED, -//R_LOG_DEL_NONE,R_LOG_DEL_DONE and R_LOG_DEL_NOT_SENT -//Subject const TDesC& -//Number const TDesC& -//Contact TLogContactItemId -//Description const TDesC& Note that this is set automatically by the Log Engine?? -//Data const TDesC8& "", if there is no data. Data can contain multiple name value pairs -// for which value separator is "=" and pair separator is "\t". Value can be empty. -// E.g. "dummyparam=value1\tdummyparam2=value3\tdummyparam4=" -//Flags TLogFlags -//iId (0)iEventType (0)iRemoteParty ("Unknown")iDirection ("R_LOG_DIR_OUT")iTime (0)iDurationType (0)iDuration (0)iStatus ("R_LOG_DEL_NONE")iSubject ("Unknown")iNumber ("+358123456")iContact (0)iDescription ("Voice call")iData ("")iFlags (0) -//logevent (1, 0x12345678, "Unknown", "R_LOG_DIR_OUT", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 358123456, 0, "Voice call", "", 0) -case1 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +35812345790, 0, "Voice call", "", 0) -case1b (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358123457901, 0, "Voice call", "", 0) -case2 (3, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358123457918888, 0, "Voice call", "VT", 0) -case2b (3, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3581234579188881, 0, "Voice call", "VT", 0) -case3 (4, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 358123457918889, 0, "Voice call", "", 0) -case3b (4, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 3581234579188891, 0, "Voice call", "", 0) -case4 (5, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 358123457918810, 0, "Voice call", "VT", 0) -case4b (5, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 3581234579188101, 0, "Voice call", "VT", 0) -case5 (6, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 358123461, 0, "Voice call", "", 0) -case5b (6, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 3581234611, 0, "Voice call", "", 0) -case6 (6, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 558123461, 0, "Voice call", "VT", 0) -case6b (6, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 5581234611, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358012345678910, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3580123456789, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358012345678, 0, "Voice call", "", 0) -case7 (3, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +35801234567, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3580123456, 0, "Voice call", "", 0) -case7 (3, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358012345, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +35801234, 0, "Voice call", "", 0) -case7 (3, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3580123, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358012, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +35801, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3580, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 88012345678910, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 880123456789, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 88012345678, 0, "Voice call", "", 0) -case7 (3, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 8801234567, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 880123456, 0, "Voice call", "", 0) -case7 (3, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 88012345, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 8801234, 0, "Voice call", "", 0) -case7 (3, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 880123, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 88012, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 8801, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 880, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012345678910, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 0880123456789, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012345678, 0, "Voice call", "", 0) -case7 (3, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 08801234567, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 0880123456, 0, "Voice call", "", 0) -case7 (3, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012345, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 08801234, 0, "Voice call", "", 0) -case7 (3, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 0880123, 0, "Voice call", "VT", 0) -case7 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 08801, 0, "Voice call", "", 0) -case7 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 0880, 0, "Voice call", "", 0) -case8 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358012345678910, 0, "Voice call", "", 0) -case8 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3580123456789, 0, "Voice call", "", 0) -case8 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 88012345678910, 0, "Voice call", "", 0) -case8 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 880123456789, 0, "Voice call", "", 0) -case8 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012345678910, 0, "Voice call", "", 0) -case8 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012345678911, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358012345678910, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3580123456789, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358012345678, 0, "Voice call", "", 0) -case9 (3, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +35801234567, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3580123456, 0, "Voice call", "", 0) -case9 (3, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358012345, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +35801234, 0, "Voice call", "", 0) -case9 (3, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3580123, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +358012, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +35801, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", +3580, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 88012345678910, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 880123456789, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 88012345678, 0, "Voice call", "", 0) -case9 (3, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 8801234567, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 880123456, 0, "Voice call", "", 0) -case9 (3, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 88012345, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 8801234, 0, "Voice call", "", 0) -case9 (3, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 880123, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 88012, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 8801, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 880, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012345678910, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 0880123456789, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012345678, 0, "Voice call", "", 0) -case9 (3, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 08801234567, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 0880123456, 0, "Voice call", "", 0) -case9 (3, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012345, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 08801234, 0, "Voice call", "", 0) -case9 (3, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 0880123, 0, "Voice call", "VT", 0) -case9 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088012, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 08801, 0, "Voice call", "", 0) -case9 (2, 0x12345678, "", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 0880, 0, "Voice call", "", 0) -case10 (2, 0x12345678, "Keke Rosberg", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 088089899, 0, "Voice call", "", 0) -case10 (2, 0x12345678, "Test", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 0506666, 0, "Voice call", "", 0) -case10 (2, 0x12345678, "Testing The Test", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 777, 0, "Voice call", "VT", 0) -case10 (2, 0x12345678, "Testing1 050", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 3333333333333333333, 0, "Voice call", "", 0) -case11 (2, 0x12345678, "Test", "Outgoing", 10, 1, 120, "R_LOG_DEL_NONE", "Unknown", 0506666, 0, "Voice call", "", 0) -case11 (2, 0x12345678, "", "Outgoing", 10000, 1, 20, "R_LOG_DEL_NONE", "Unknown", 0506666, 0, "Voice call", "", 0) -case11 (2, 0x12345678, "Testing The Test", "Outgoing", 600000, 1, 600, "R_LOG_DEL_NONE", "Unknown", 777, 0, "Voice call", "VT", 0) -case11 (2, 0x12345678, "", "Outgoing", 444, 1, 600, "R_LOG_DEL_NONE", "Unknown", 777, 0, "Voice call", "VT", 0) -case11 (2, 0x12345678, "Keke Rosberg", "Missed call", 90, 1, 455, "R_LOG_DEL_NONE", "Unknown", 088089899, 0, "Voice call", "", 0) -case11 (2, 0x12345678, "Contact is of type missed", "Missed call", 1, 1, 2, "R_LOG_DEL_NONE", "Unknown", 088089899, 0, "Voice call", "VT", 0) -case11 (2, 0x12345678, "Testing1 050", "Incoming", 2, 1, 77, "R_LOG_DEL_NONE", "Unknown", 3333333333333333333, 0, "Voice call", "", 0) -case11 (2, 0x12345678, "Testing1 050 Jes", "Incoming", 22, 1, 232, "R_LOG_DEL_NONE", "Unknown", 3333333333333333333, 0, "Voice call", "VT", 0) -case (7, 0x12345678, "Unknown", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 558123462, 0, "Voice call", "VT=\tdummy=3", 0) -case (8, 0x12345678, "Unknown", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 558123463, 0, "Voice call", "VT=", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (1, 0x12345678, "Jeppy", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "CL=999", 0) -at_logsengine (2, 0x12345678, "Jeppis", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "CL=2", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "CL=2", 0) -at_logsengine (3, 0x12345678, "Jeppa", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (4, 0x12345678, "Jeppu", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (5, 0x12345678, "Jeppu", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (6, 0x12345678, "Jeppu", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (7, 0x12345678, "aeppu", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "CL=3", 0) -at_logsengine (8, 0x12345678, "beppu", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "CL=3", 0) -at_logsengine (9, 0x12345678, "ceppu", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -at_logsengine (10, 0x12345678, "deppu", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "CL=3", 0) -at_logsengine (11, 0x12345678, "deeppu", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "", 0) -logevent (7, 0x12345678, "Unknown", "Missed call", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 358123462, 0, "Voice call", "", 0) -logevent (8, 0x12345678, "Unknown", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 358123463, 0, "Voice call", "", 0) -logevent (9, 0x12345678, "Unknown", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 358123464, 0, "Voice call", "", 0) -logevent (10, 0x12345678, "Unknown", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 358123465, 0, "Voice call", "", 0) -logevent (11, 0x12345678, "Unknown", "Outgoing", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", 358123466, 0, "Voice call", "", 0) -logevent (12, 0x12345678, "Jeppis", "Incoming", 0, 0, 0, "R_LOG_DEL_NONE", "Unknown", "", 0, "Voice call", "VOIP\tURL=+23456677\tMA=te@172.21.10.191", 0) diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logdbmodifier/addeventtest/inc/argstest.h --- a/logsui/tsrc/logdbmodifier/addeventtest/inc/argstest.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,175 +0,0 @@ -/* -* Copyright (c) 2002 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: Argument parser -* -*/ - - - -#ifndef CARGS_H -#define CARGS_H - -// INCLUDES -#include - -// CONSTANTS -const TInt KMaxArgs = 100; - -// MACROS -// none - -// DATA TYPES -enum TParseType - { - // class.method (arg1, arg2, ...) - // functionname (arg1, arg2, ...) - // - // classname is always found from StrArg(1) (if only funcname provided, "") - // method/functonname is always found from StrArg(2) - // - EParseFunction, - - // // comment here - // - EParseComment - }; - -enum TArgType - { - EArgNotSpecified, - EArgNum, - EArgStr - }; - -// FUNCTION PROTOTYPES -// none - -// FORWARD DECLARATIONS -// none - -// CLASS DECLARATION - -/** -* CArgs is used to parse parameters from a data file -* -* @lib commonutils.lib -* @since -*/ -class CArgs : public CBase - { - public: // Constructors and destructor - - /** - * C++ default constructor. - */ - IMPORT_C CArgs(); - - /** - * Destructor. - */ - IMPORT_C ~CArgs(); - - public: // New functions - - /** - * Returns count of parsed arguments. - * @since - * @return Count of parsed arguments - */ - IMPORT_C TInt ArgCount() const; - - /** - * Returns type of argument (string/numeric). - * @since - * @param aArgIndex Index of argument - * @return Type of argument - */ - IMPORT_C TArgType ArgType( const TInt aArgIndex ) const; - - /** - * Returns argument value as TInt - * @since - * @param aArgIndex Index of argument - * @return Integer value of argument - */ - IMPORT_C TInt NumArg( const TInt aArgIndex ) const; - - /** - * Returns argument value as String - * @since - * @param aArgIndex Index of argument - * @return Argument as String - */ - IMPORT_C const TDesC& StrArg( const TInt aArgIndex ) const; - - /** - * Parses arguments from a string - * @since - * @param aType Type of argument - * @param aLine Line to parse - * @return Errorcode - */ - IMPORT_C TInt ParseLineL( const TParseType aType, const TDes& aLine ); - - public: // Functions from base classes - // none - - protected: // New functions - // none - - protected: // Functions from base classes - // none - - private: - - /** - * Clears all parsed arguments and frees allocated memory - * @since - */ - void ClearArgs(); - - public: // Data - // none - - protected: // Data - // none - - private: // Data - - // Argument count - TInt iArgCount; - - // Array for arguments revealing the type of argument - TArgType iArgType[KMaxArgs]; - - // Array for numeric arguments - TInt iNumArg[KMaxArgs]; - - // Array for string arguments - HBufC* iStrArg[KMaxArgs]; - - public: // Friend classes - // none - - protected: // Friend classes - // none - - private: // Friend classes - // none - - }; - -#endif // CARGS_H - -// End of File diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logdbmodifier/addeventtest/inc/clientlogstest.h --- a/logsui/tsrc/logdbmodifier/addeventtest/inc/clientlogstest.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +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: -* -*/ - - -// INCLUDES -#ifndef __CCLIENTLOGSTEST_H__ -#define __CCLIENTLOGSTEST_H__ -#include -#include -#include "argstest.h" -#include -#include - - -class CClientlogstest : public CActive -{ - - public: // Constructors and destructor - /** - * Two-phased constructor. - */ - static CClientlogstest* NewL(); - // static CClientlogstest* NewLC(); - /** - * Destructor. - */ - ~CClientlogstest(); - -public: // From CActive - - void RunL (); - void DoCancel (); - - public: // New functions - - /** - * ReadParametersL - * @since - * @param fileName - */ - void ReadParametersL( const TDes & fileName ); - - private: - - CClientlogstest(); - void ConstructL(); - TInt AddEvent(); - void DeleteReadDataMembers(); - - private: // data - HBufC* iDllName; - TLogId iId; - TUid iEventType; - TTime iTime; - TLogDurationType iDurationType; - TLogDuration iDuration; - TLogContactItemId iContact; - TLogLink iLink; - TLogFlags iFlags; - HBufC* iDescription; - HBufC* iRemoteParty; - HBufC* iDirection; - HBufC* iCallStatus; - HBufC* iSubject; - HBufC* iNumber; - HBufC8* iData; - TInt iCompleteError; - // - CLogClient* iLogClient; - RFs iFsSession; - CLogEvent* iLogEvent; - RPointerArray iLogEvents; - HBufC* ikeyword; - CArgs* iArgs; - TPtrC8 iDataPtr; - private: // Friend classes - // none - -}; - -// End of File __CCLIENTLOGSTEST_H__ -#endif \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logdbmodifier/addeventtest/install/sis_udeb.bat --- a/logsui/tsrc/logdbmodifier/addeventtest/install/sis_udeb.bat Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -rem -rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -rem All rights reserved. -rem This component and the accompanying materials are made available -rem under the terms of "Eclipse Public License v1.0" -rem which accompanies this distribution, and is available -rem at the URL "http://www.eclipse.org/legal/epl-v10.html". -rem -rem Initial Contributors: -rem Nokia Corporation - initial contribution. -rem -rem Contributors: -rem -rem Description: -rem - -makesis clientlogstest.pkg clientlogstest.sis diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logdbmodifier/addeventtest/src/argstest.cpp --- a/logsui/tsrc/logdbmodifier/addeventtest/src/argstest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,400 +0,0 @@ -/* -* Copyright (c) 2002 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: Argument parser -* -*/ - - - -// INCLUDE FILES -#include "argstest.h" - -// EXTERNAL DATA STRUCTURES -// none - -// EXTERNAL FUNCTION PROTOTYPES -// none - -// CONSTANTS -// none - -// MACROS -// none - -// LOCAL CONSTANTS AND MACROS -// none - -// MODULE DATA STRUCTURES -// none - -// LOCAL FUNCTION PROTOTYPES -// none - -// FORWARD DECLARATIONS -// none - -// ============================= LOCAL FUNCTIONS =============================== - -// none - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CArgs::CArgs -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -EXPORT_C CArgs::CArgs() - { - } - -// Destructor -EXPORT_C CArgs::~CArgs() - { - - ClearArgs(); - - } - -// ----------------------------------------------------------------------------- -// CArgs::ArgCount -// Returns count of parsed arguments -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CArgs::ArgCount() const - { - - return iArgCount; - - } - -// ----------------------------------------------------------------------------- -// CArgs::ArgType -// Returns type of argument (string/numeric) -// ----------------------------------------------------------------------------- -// -EXPORT_C TArgType CArgs::ArgType( const TInt aArgIndex ) const - { - - if ( aArgIndex < 1 || aArgIndex > iArgCount ) - { - return EArgNotSpecified; - } - else - { - return iArgType[aArgIndex - 1]; - } - - } - -// ----------------------------------------------------------------------------- -// CArgs::NumArg -// Returns argument value as TInt -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CArgs::NumArg( const TInt aArgIndex ) const - { - - if ( aArgIndex < 1 || - aArgIndex > iArgCount || - iArgType[aArgIndex - 1] != EArgNum ) - { - return 0; - } - else - { - return iNumArg[aArgIndex - 1]; - } - - } - -// ----------------------------------------------------------------------------- -// CArgs::StrArg -// Returns argument value as string -// ----------------------------------------------------------------------------- -// -EXPORT_C const TDesC& CArgs::StrArg( const TInt aArgIndex ) const - { - - if ( aArgIndex < 1 || aArgIndex > iArgCount ) - { - return KNullDesC; - } - else - { - return *iStrArg[aArgIndex - 1]; - } - - } - -// ----------------------------------------------------------------------------- -// CArgs::ParseLineL -// Parses arguments from a string -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CArgs::ParseLineL( - const TParseType aType, - const TDes& aLine ) - { - - TBuf<1024> line; - line.Append( aLine ); - - ClearArgs(); - - switch ( aType ) - { - case EParseComment: - - line.Trim(); - - // if line starts with "//" - // - if ( line.Length() >= 2 && - line[0] == static_cast< TInt >( TChar( '/' ) ) && - line[1] == static_cast< TInt >( TChar( '/' ) ) ) - { - return KErrNone; - } - break; - - case EParseFunction: - - TInt posDot = line.Locate( '.' ); - posDot = -1; // Messes stuff in case of ip addresses - TInt posBraceOpen = line.Locate( '(' ); - - if ( posBraceOpen == -1 ) - { - return KErrArgument; - } - - iArgType[0] = EArgStr; - iArgType[1] = EArgStr; - - // read classname and methodname: "class.method(" - // - if ( posDot != -1 && posDot < posBraceOpen ) - { - iStrArg[0] = HBufC::NewL( posDot ); - iStrArg[0]->Des().Append( line.Ptr(), posDot ); - iStrArg[0]->Des().Trim(); - iStrArg[1] = HBufC::NewL( posBraceOpen - posDot ); - iStrArg[1]->Des().Append( line.Ptr() + posDot + 1, - posBraceOpen - ( posDot + 1 ) ); - iStrArg[1]->Des().Trim(); - } - else // only methodname: "method(" - { - iStrArg[0] = HBufC::NewL( 0 ); - iStrArg[1] = HBufC::NewL( posBraceOpen ); - iStrArg[1]->Des().Append( line.Ptr(), posBraceOpen ); - iStrArg[1]->Des().Trim(); - } - - iArgCount = 2; - - // remove "class.method(" or "method(" from line - // - line.Delete( 0, posBraceOpen + 1 ); - line.Trim(); - - // parse arguments - // - while ( line.Length() > 0 ) - { - line.Trim(); - TInt pos = line.Locate( '"' ); - - // string - // - if ( pos == 0 ) - { - line.Delete( 0, 1 ); - pos = line.Locate( '"' ); - if ( pos == -1 ) - { - return KErrArgument; - } - - iArgType[iArgCount] = EArgStr; - iStrArg[iArgCount] = HBufC::NewL( pos ); - iStrArg[iArgCount]->Des().Append( line.Ptr(), pos ); - iArgCount++; - line.Delete( 0, pos + 1 ); - line.Trim(); - - // remove possible comma - // - if ( line.Locate( ',' ) == 0 ) - { - line.Delete( 0, 1 ); - line.Trim(); - } - } - - else // numeric? or enum value - { - pos = line.Locate( ',' ); - if ( pos == -1 ) - { - pos = line.Locate( ')' ); - if ( pos == -1 ) - { - return KErrArgument; - } - else if ( pos == 0 ) - { - break; - } - } - - iArgType[iArgCount] = EArgStr; - iStrArg[iArgCount] = HBufC::NewL( pos ); - iStrArg[iArgCount]->Des().Append( line.Ptr(), pos ); - iStrArg[iArgCount]->Des().Trim(); - iArgCount++; - line.Delete( 0, pos + 1 ); - line.Trim(); - - // len must be > 0 - // - if ( iStrArg[iArgCount-1]->Length() == 0 ) - { - return KErrArgument; - } - - TBool isNum = ETrue; - TBool isNegative = EFalse; - TInt numVal = 0; - - // check if argument is numeric -> [-]n(0-9) - // - for ( pos=0; pos < iStrArg[iArgCount - 1]->Length(); pos++ ) - { - if ( pos == 0 && - iStrArg[iArgCount - 1]->Locate( '-' ) == 0 ) - { - isNegative = ETrue; - // if number is negative, len must be >= 2 - // - if ( iStrArg[iArgCount - 1]->Length() < 2 ) - { - isNum = EFalse; - break; - } - } - else - { - TInt number; - - if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '0' ) ) ) number = 0; - else if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '1' ) ) ) number = 1; - else if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '2' ) ) ) number = 2; - else if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '3' ) ) ) number = 3; - else if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '4' ) ) ) number = 4; - else if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '5' ) ) ) number = 5; - else if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '6' ) ) ) number = 6; - else if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '7' ) ) ) number = 7; - else if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '8' ) ) ) number = 8; - else if ( (*iStrArg[iArgCount - 1])[pos] == - static_cast< TInt >( TChar( '9' ) ) ) number = 9; - else - { - isNum = EFalse; - break; - } - numVal = (numVal * 10) + number; - } - } - - // argument is numeric - // - if ( isNum ) - { - if ( isNegative ) - { - numVal = -numVal; - } - - iNumArg[iArgCount - 1] = numVal; - iArgType[iArgCount - 1] = EArgNum; - } - - } // else - - } // while - - return KErrNone; - - } // switch - - return KErrArgument; - - } - -// ----------------------------------------------------------------------------- -// CArgs::ClearArgs -// Clears all parsed arguments and frees allocated memory -// ----------------------------------------------------------------------------- -// -void CArgs::ClearArgs() - { - - for ( TInt i = 0; i < iArgCount; i++ ) - { - delete iStrArg[i]; - } - - iArgCount = 0; - - } - -// ========================== OTHER EXPORTED FUNCTIONS ========================= - -#if defined(__WINS__) && !defined(EKA2) - -// ----------------------------------------------------------------------------- -// E32Dll -// -// DLL entry point function. In a MARM implementation, the -// entry point is called when a thread is attached to or detached from the -// DLL.?description -// -// Returns: TInt: For DLLs which do not set up thread-local storage, -// the function can ignore the TDllReason type -// parameter passed to it and simply return KErrNone; -// ----------------------------------------------------------------------------- -// - -GLDEF_C TInt E32Dll( TDllReason /*aReason*/ ) - { - - return KErrNone; - - } - -#endif - -// End of File diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logdbmodifier/addeventtest/src/clientlogstest.cpp --- a/logsui/tsrc/logdbmodifier/addeventtest/src/clientlogstest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,404 +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 "clientlogstest.h" -#include -#include -#include -#include -#include - - -#ifdef EKA2 //RD_APPS_TO_EXES -#include -#endif -_LIT(KtestlogclientsFileName,"C:\\System\\testlogclients.dat"); - - -#include -#include - -_LIT(KClientlogstestPanic,"Clientlogstest creation"); - -LOCAL_C void MainL(); - -// main function called by E32 -GLDEF_C TInt E32Main() - { - CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack - TRAPD(error,MainL()); - __ASSERT_ALWAYS(error == KErrNone,User::Panic(KClientlogstestPanic,error)); - delete cleanup; // destroy clean-up stack - User::Heap().Reset(); - return 0; // and return - } - -LOCAL_C void MainL() - {RDebug::Print(_L("CClientlogstest MainL")); - RThread().SetPriority(EPriorityAbsoluteForeground); - // install an active scheduler - CActiveScheduler* scheduler = new(ELeave)CActiveScheduler; - CActiveScheduler::Install(scheduler); - //CleanupStack::PushL(scheduler); - //CleanupStack::Pop(scheduler); - - CClientlogstest* main = 0; - TRAPD (err, main = CClientlogstest::NewL()); - if (err == KErrNone) - {RDebug::Print(_L("CClientlogstest CActiveScheduler::Start()")); - CActiveScheduler::Start(); - } - RDebug::Print(_L("CClientlogstestafter CActiveScheduler::Start()")); - delete main; - delete scheduler; - - } - -CClientlogstest::~CClientlogstest() - { - RDebug::Print(_L("CClientlogstest deleted")); - RDebug::Print(_L("CClientlogstest Cancel()")); - CActive::Cancel(); - RDebug::Print(_L("CClientlogstest delete iLogEvent")); - delete iLogEvent; - iLogEvent = NULL; - RDebug::Print(_L("CClientlogstest delete iLogClient")); - delete iLogClient; - iLogClient = NULL; - RDebug::Print(_L("CClientlogstest iLogEvents.ResetAndDestroy()")); - iLogEvents.ResetAndDestroy(); - RDebug::Print(_L("CClientlogstest iFsSession.Close()")); - iFsSession.Close(); - RDebug::Print(_L("CClientlogstest delete iDescription")); - delete iDescription; - iDescription = NULL; - RDebug::Print(_L("CClientlogstest delete iRemoteParty")); - delete iRemoteParty; - iRemoteParty = NULL; - RDebug::Print(_L("CClientlogstest delete iDirection")); - delete iDirection; - iDirection = NULL; - RDebug::Print(_L("CClientlogstest delete iCallStatus")); - delete iCallStatus; - iCallStatus = NULL; - RDebug::Print(_L("CClientlogstest delete iSubject")); - delete iSubject; - iSubject = NULL; - RDebug::Print(_L("CClientlogstest delete iNumber")); - delete iNumber; - iNumber = NULL; - RDebug::Print(_L("CClientlogstest delete iData")); - delete iData; - iData = NULL; - delete ikeyword; - ikeyword = NULL; - delete iArgs; - iArgs = NULL; - RDebug::Print(_L("CClientlogstest deleted <-")); - //CActiveScheduler::Install (NULL); - //CActiveScheduler::Stop(); - } -// From CActive -void CClientlogstest::RunL () - { - RDebug::Print(_L("CClientlogstest::RunL->")); - if (iStatus.Int() == KErrNone) - {RDebug::Print(_L("CClientlogstest::RunL iStatus.Int() == KErrNone")); - if (iLogEvents.Count() > 0) - {RDebug::Print(_L("CClientlogstest::RunL if (iLogEvents.Count() > 0)")); - delete iLogEvent; - iLogEvent = NULL; - RDebug::Print(_L("CClientlogstest::RunL iStatus.Int() == KErrNone")); - User::LeaveIfError(AddEvent()); - } - else - { - RDebug::Print(_L("CClientlogstest::RunL <-")); - CActiveScheduler::Stop(); - } - } - else - { - if (iStatus.Int() == KErrNotFound) - { - //if the event type is not registered with the Log Engine - RDebug::Print(_L("CClientlogstest::RunL event type is not registered with the Log Engine")); - } - - RDebug::Print(_L("CClientlogstest::RunL iStatus.Int() != KErrNone")); - CActiveScheduler::Stop(); - } - } - -// From CActive -void CClientlogstest::DoCancel () - { - RDebug::Print(_L("CClientlogstest::DoCancel")); - - } - - - -CClientlogstest* CClientlogstest::NewL() - {RDebug::Print(_L("CClientlogstest NewL")); - CClientlogstest* self = new (ELeave) CClientlogstest(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } - -CClientlogstest::CClientlogstest() -: CActive(EPriorityStandard) -{ -} - -void CClientlogstest::ConstructL() - {RDebug::Print(_L("CClientlogstest ConstructL->")); - CActiveScheduler::Add (this); - //TRequestStatus *status=&iStatus; - User::LeaveIfError(iFsSession.Connect()); - iLogClient = CLogClient::NewL( iFsSession ); - iLogEvent = CLogEvent::NewL(); - TBuf<100> fileName; - fileName.Append( KtestlogclientsFileName ); - CCommandLineArguments* args = CCommandLineArguments::NewLC(); - //ikeyword = HBufC::NewL(0); - _LIT(Kkeywordlogs,"logevent"); - TBufC<16> buf1(Kkeywordlogs); - - ikeyword = buf1.AllocL(); - if (args->Count() > 1) - { - delete ikeyword; - ikeyword = NULL; - ikeyword = args->Arg(1).AllocL(); - RDebug::Print(*ikeyword); - } - CleanupStack::PopAndDestroy(args); - ReadParametersL( fileName ); - User::LeaveIfError(AddEvent()); - RDebug::Print(_L("CClientlogstest ConstructL<-")); - } - -TInt CClientlogstest::AddEvent() - {RDebug::Print(_L("CClientlogstest::AddEvent()->")); - TInt errorCode ( KErrNone ); - iLogEvent = iLogEvents[0]; - iLogEvents.Remove(0); - iLogEvents.Compress(); - if ( !IsActive( ) ) - { - RDebug::Print(_L("CClientlogstest::AddEvent() CLogClient::AddEvent()")); - iLogClient->AddEvent( *iLogEvent, iStatus ); - errorCode = KErrNone; - SetActive( ); - } - else - { - RDebug::Print(_L("CClientlogstest::AddEvent() Event NOT added")); - errorCode = KErrInUse; - } - RDebug::Print(_L("CClientlogstest::AddEvent()<-")); - return errorCode; - } - - -void CClientlogstest::ReadParametersL( const TDes& fileName ) - {RDebug::Print(_L("CClientlogstest ReadParametersL ->")); - iArgs = new ( ELeave ) CArgs(); - RFileReadStream readStream; - TBuf8<256> asciiLine; - TBuf16<256> unicodeLine; - TInt findPos; - TInt leaveCode( KErrNone ); - iCompleteError = KErrNone; - iId = 0; - iEventType.Null(); - iRemoteParty = NULL; - iDirection = NULL; - iTime = 0; - iDurationType = 0; - iDuration = 0; - iCallStatus = NULL; - iSubject = NULL; - iNumber = NULL; - iContact = 0; - iDescription = NULL; - iData = NULL; - iFlags = 0; - if ( KErrNone != readStream.Open( iFsSession, fileName, EFileRead ) ) - {RDebug::Print(_L("CClientlogstest ReadParametersL KErrNone != readStream.Open ")); - CleanupStack::PopAndDestroy(); - return; - } - - CleanupClosePushL( readStream ); - while ( KErrEof != leaveCode ) - {RDebug::Print(_L("CClientlogstest ReadParametersL while ")); - TRAP( leaveCode, readStream.ReadL( asciiLine, TChar(10)) ) - if ( KErrNone == leaveCode ) - { - // Delete leading spaces and tabs - asciiLine.TrimLeft(); - // Delete trailing (CR)+LF if any - findPos = asciiLine.Locate( TChar(10) ); - if ( KErrNotFound != findPos ) - { - if ( KErrNotFound != asciiLine.Locate( TChar(13) ) ) - { - // Dos style text file(CR+LF) - asciiLine.Delete( - findPos - 1, asciiLine.Length() - (findPos + 1) ); - } - else - { - // Unix style text file(LF) - asciiLine.Delete( - findPos , asciiLine.Length() - findPos ); - } - } - - // Skip empty lines and lines that start with '//' - if ( asciiLine.Length() == 0 || - (findPos = asciiLine.Find(_L8("//"))) == 0 ) - { - continue; - } - - if ( KErrNotFound != findPos ) - { - asciiLine.Delete( findPos, asciiLine.Length() - findPos ); - asciiLine.TrimRight(); - } - - // Unicode format is used internally - TInt ret = - CnvUtfConverter::ConvertToUnicodeFromUtf8( - unicodeLine, asciiLine ); - - if ( KErrNone != ret ) - { - //Unicode conversion failed. Skip this line and go on - continue; - } - - if ( KErrNone != iArgs->ParseLineL( EParseFunction, unicodeLine ) ) - { - continue; - } - // Long lines maintained for clarity - if ( iArgs->StrArg(1) == _L("") ) - { - // if ( iArgs->StrArg(2) == _L("logevent") ) - if (iArgs->StrArg(2) == *ikeyword ) - { - iId = iArgs->NumArg(3); - iEventType.iUid = iArgs->NumArg(4); - iRemoteParty = iArgs->StrArg(5).AllocL(); - - iDirection = iArgs->StrArg(6).AllocL(); - RDebug::RawPrint(*iDirection); - iTime = iArgs->NumArg(7); - iDurationType = iArgs->NumArg(8); - iDuration = iArgs->NumArg(9); - iCallStatus = iArgs->StrArg(10).AllocL(); - iSubject = iArgs->StrArg(11).AllocL(); - iNumber = iArgs->StrArg(12).AllocL(); - iContact = iArgs->NumArg(13); - iDescription = iArgs->StrArg(14).AllocL(); - RDebug::Print(_L("CClientlogstest data:")); - RDebug::RawPrint(iArgs->StrArg(15)); - iData = HBufC8::NewL( iArgs->StrArg(15).Length() * 2 ); - TPtr8 ptrData( iData->Des() ); - ptrData.Copy( iArgs->StrArg(15) ); - _LIT8( KLogClientFieldDelim, "\\t" ); - int delimPos = ptrData.Find( KLogClientFieldDelim ); - while ( delimPos >= 0 ){ - ptrData.Replace( delimPos, KLogClientFieldDelim().Length(), _L8("\t") ); - int newDelimPos = ptrData.Mid( delimPos + 1 ).Find( KLogClientFieldDelim ); - delimPos = ( newDelimPos >= 0 ) ? delimPos + newDelimPos + 1 : -1; - } - iFlags = iArgs->NumArg(16); - - delete iLogEvent; - iLogEvent = CLogEvent::NewL(); - RDebug::Print(_L("CClientlogstest ReadParametersL while iLogEvent->SetId(iId)")); - iLogEvent->SetId(iId); - //iLogEvent->SetEventType(iEventType); - iLogEvent->SetEventType( KLogCallEventTypeUid ); - iLogEvent->SetRemoteParty(*iRemoteParty); - iLogEvent->SetDirection(*iDirection); - iLogEvent->SetTime(iTime); - iLogEvent->SetDurationType(iDurationType); - iLogEvent->SetDuration(iDuration); - iLogEvent->SetStatus(*iCallStatus); - iLogEvent->SetSubject(*iSubject); - iLogEvent->SetNumber(*iNumber); - iLogEvent->SetContact(iContact); - iLogEvent->SetDescription(*iDescription); - iLogEvent->SetFlags(iFlags); - RDebug::Print(_L("CClientlogstest ReadParametersL while After set logevent parameters")); - iDataPtr.Set( iData->Des() ); - iLogEvent->SetDataL(iDataPtr); - //own the objects - RDebug::Print(_L("CClientlogstest ReadParametersL while append LogEvent obj to array")); - iLogEvents.AppendL(iLogEvent); - iLogEvent = NULL; - DeleteReadDataMembers(); - - RDebug::Print(_L("CClientlogstest ReadParametersL while After deleting all member parameters")); - } - } - else - { - // not a valid line - } - } - }//while - - CleanupStack::PopAndDestroy();//readStream - RDebug::Print(_L("CClientlogstest ReadParametersL <-")); - } - -void CClientlogstest::DeleteReadDataMembers() - { - RDebug::RawPrint(*iDescription); - delete iDescription; - iDescription = NULL; - RDebug::RawPrint(*iRemoteParty); - delete iRemoteParty; - iRemoteParty = NULL; - RDebug::RawPrint(*iDirection); - delete iDirection; - iDirection = NULL; - RDebug::RawPrint(*iCallStatus); - delete iCallStatus; - iCallStatus = NULL; - RDebug::RawPrint(*iSubject); - delete iSubject; - iSubject = NULL; - RDebug::RawPrint(*iNumber); - delete iNumber; - iNumber = NULL; - //RDebug::RawPrint(*iData); - delete iData; - iData = NULL; - } - -// End of file - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logdbmodifier/clearlisttest/inc/clearlisttest.h --- a/logsui/tsrc/logdbmodifier/clearlisttest/inc/clearlisttest.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +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: -* -*/ - - -// INCLUDES -#ifndef __CLEARLISTTEST_H__ -#define __CLEARLISTTEST_H__ -#include -#include -#include -#include - -// CLASS DECLARATION - - -class CClearlisttest : public CActive -{ - public: // Constructors and destructor - - static CClearlisttest* NewL(); - - ~CClearlisttest(); - -public: // From CActive - void RunL (); - void DoCancel (); - - private: - - CClearlisttest(); - void ConstructL(); - TInt ClearList(); - - private: // data - HBufC* iDllName; - TLogId iId; - TUid iEventType; - TTime iTime; - TLogDurationType iDurationType; - TLogDuration iDuration; - TLogContactItemId iContact; - TLogLink iLink; - TLogFlags iFlags; - HBufC* iDescription; - HBufC* iRemoteParty; - HBufC* iDirection; - HBufC* iCallStatus; - HBufC* iSubject; - HBufC* iNumber; - HBufC8* iData; - TInt iCompleteError; - // - CLogClient* iLogClient; - RFs iFsSession; - CLogEvent* iLogEvent; - RPointerArray iLogEvents; - private: // Friend classes - // none - -}; - -// End of File __CLEARLISTTEST_H__ -#endif \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logdbmodifier/clearlisttest/install/sis_udeb.bat --- a/logsui/tsrc/logdbmodifier/clearlisttest/install/sis_udeb.bat Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -rem -rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -rem All rights reserved. -rem This component and the accompanying materials are made available -rem under the terms of "Eclipse Public License v1.0" -rem which accompanies this distribution, and is available -rem at the URL "http://www.eclipse.org/legal/epl-v10.html". -rem -rem Initial Contributors: -rem Nokia Corporation - initial contribution. -rem -rem Contributors: -rem -rem Description: -rem - -makesis clearlisttest.pkg clearlisttest.sis diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logdbmodifier/clearlisttest/src/clearlisttest.cpp --- a/logsui/tsrc/logdbmodifier/clearlisttest/src/clearlisttest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +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 "clearlisttest.h" -#include -#include -#include - -#ifdef EKA2 //RD_APPS_TO_EXES -#include -#endif - - -#include -#include - -_LIT(KClearlisttestPanic,"Clearlisttest creation"); -_LIT( KMaxTime, "99991130:235959.999999"); - -LOCAL_C void MainL(); - -// main function called by E32 -GLDEF_C TInt E32Main() - { - CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack - TRAPD(error,MainL()); - __ASSERT_ALWAYS(error == KErrNone,User::Panic(KClearlisttestPanic,error)); - delete cleanup; // destroy clean-up stack - User::Heap().Reset(); - return 0; // and return - } - -LOCAL_C void MainL() - {RDebug::Print(_L("CClearlisttest MainL")); - RThread().SetPriority(EPriorityAbsoluteForeground); - // install an active scheduler - CActiveScheduler* scheduler = new(ELeave)CActiveScheduler; - CActiveScheduler::Install(scheduler); - - CClearlisttest* main = 0; - TRAPD (err, main = CClearlisttest::NewL()); - if (err == KErrNone) - {RDebug::Print(_L("CClearlisttest CActiveScheduler::Start()")); - CActiveScheduler::Start(); - } - RDebug::Print(_L("CClearlisttest after CActiveScheduler::Start()")); - delete main; - delete scheduler; - CActiveScheduler::Install(NULL); - } - -CClearlisttest::~CClearlisttest() - { - RDebug::Print(_L("CClearlisttest deleted")); - RDebug::Print(_L("CClearlisttest Cancel()")); - CActive::Cancel(); - RDebug::Print(_L("CClearlisttest delete iLogEvent")); - delete iLogEvent; - RDebug::Print(_L("CClearlisttest delete iLogClient")); - delete iLogClient; - RDebug::Print(_L("CClearlisttest ~CClearlisttest<-")); - iFsSession.Close(); - } -// From CActive -void CClearlisttest::RunL () - { - RDebug::Print(_L("CClearlisttest::RunL->")); - if (iStatus.Int() == KErrNone) - { - RDebug::Print(_L("CClearlisttest::RunL iStatus.Int() == KErrNone")); - } - else - { - RDebug::Print(_L("CClearlisttest::RunL iStatus.Int() != KErrNone<-")); - } - RDebug::Print(_L("CClearlisttest::RunL<-")); - CActiveScheduler::Stop(); - } - -// From CActive -void CClearlisttest::DoCancel () - { - RDebug::Print(_L("CClearlisttest::DoCancel")); - } - -CClearlisttest* CClearlisttest::NewL() - {RDebug::Print(_L("CClearlisttest NewL")); - CClearlisttest* self = new (ELeave) CClearlisttest(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop(); - return self; - } - -CClearlisttest::CClearlisttest() -: CActive(EPriorityStandard) -{ -} - -void CClearlisttest::ConstructL() - {RDebug::Print(_L("CClearlisttest ConstructL->")); - CActiveScheduler::Add (this); - - User::LeaveIfError(iFsSession.Connect()); - iLogClient = CLogClient::NewL( iFsSession ); - iLogEvent = CLogEvent::NewL(); - User::LeaveIfError(ClearList()); - RDebug::Print(_L("CClearlisttest ConstructL<-")); - } - -TInt CClearlisttest::ClearList() - {RDebug::Print(_L("CClearlisttest::ClearList()->")); - TTime time( KMaxTime ); - TInt errorCode ( KErrNone ); - if ( !IsActive( ) ) - { - //const TLogRecentList KLogNullRecentList = -1; - RDebug::Print(_L("CClearlisttest::ClearList()")); - //iLogClient->ClearLog( KLogNullRecentList, iStatus ); - iLogClient->ClearLog( time, iStatus ); - SetActive( ); - } - else - { - RDebug::Print(_L("CClearlisttest::ClearList()() Clear failed")); - errorCode = KErrInUse; - } - RDebug::Print(_L("CClearlisttest::ClearList()<-")); - return errorCode; - } - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logsengineapitester/logsengineapitester.pro --- a/logsui/tsrc/logsengineapitester/logsengineapitester.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +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: -# - -SERVICEAPP=app -TARGET=logsengineapitester - -CONFIG += hb - -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - -include(src/logsengineapitester.pri) - -LIBS+=-llogsengine -lcentralrepository - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xE0014E73 - TARGET.CAPABILITY = CAP_APPLICATION -} - - -libFiles.sources = logsengineapitester.exe -libFiles.path = "!:\sys\bin" -DEPLOYMENT += libFiles - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logsengineapitester/src/logsengineapitester.cpp --- a/logsui/tsrc/logsengineapitester/src/logsengineapitester.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,301 +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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "logsengineapitester.h" - -Q_DECLARE_METATYPE(LogsEvent *) - -#define LOGSAPITEST_PRINT_ALLOC_SIZE { \ - User::CompressAllHeaps(); \ - TInt allocsize; \ - User::AllocSize(allocsize); \ - qDebug() << "LogsApiTest alloc size:" << allocsize; } \ - -TestView::TestView() : HbView(), mList(0), mModel(0), mLogsModel(0), mFilter(0), mShowAll(true) -{ - qDebug() << "LogsApiTest::LogsApiTest ->"; - - LOGSAPITEST_PRINT_ALLOC_SIZE - - mRepository = CRepository::NewL( KCRUidLogs ); - - mLabel = new HbLabel(this); - mList = new HbListView(this); - mList->setItemRecycling(true); - mList->setUniformItemSizes(true); - mLogsModel = new LogsModel(LogsModel::LogsFullModel); - mModel = new TestModel(*mLogsModel); - mList->setModel(mModel); - QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical); - layout->addItem(mLabel); - layout->addItem(mList); - setLayout(layout); - - mMissedCallsFilter = new LogsFilter(LogsFilter::Missed); - mMissedCallsFilter->setMaxSize(5); - mMissedCallsFilter->setSourceModel(mLogsModel); - connect(mMissedCallsFilter, SIGNAL(rowsInserted(const QModelIndex &, int, int)), - this, SLOT(updateMissedCallsLabel())); - - HbAction* filterAction = new HbAction; - filterAction->setText("Change filter"); - connect(filterAction, SIGNAL(triggered()), this, SLOT(changeFilter()) ); - menu()->addAction(filterAction); - - HbAction* addMissedCallAction = new HbAction; - addMissedCallAction->setText("Add missed call"); - connect(addMissedCallAction, SIGNAL(triggered()), this, SLOT(addMissedCall()) ); - menu()->addAction(addMissedCallAction); - - HbAction* clearMissedCallsAction = new HbAction; - clearMissedCallsAction->setText("Clear missed calls"); - connect(clearMissedCallsAction, SIGNAL(triggered()), this, SLOT(clearMissedCalls()) ); - menu()->addAction(clearMissedCallsAction); - - HbAction* deleteAction = new HbAction; - deleteAction->setText("Delete events"); - connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteEvents()) ); - menu()->addAction(deleteAction); - - updateMissedCallsLabel(); - - qDebug() << "LogsApiTest::LogsApiTest <-"; - -} - - -TestView::~TestView() -{ - qDebug() << "LogsApiTest::~LogsApiTest ->"; - - delete mMissedCallsFilter; - mList->setModel(0); - delete mModel; - delete mLogsModel; - - delete mRepository; - - qDebug() << "LogsApiTest::~LogsApiTest <-"; -} - -void TestView::changeFilter() -{ - quint32 contactId = 2; - if ( mShowAll ){ - if ( mFilter ){ - delete mFilter; - mFilter = 0; - } - mFilter = new LogsCustomFilter; - mFilter->setContactId(contactId); - mFilter->setSourceModel(mLogsModel); - connect( mFilter, SIGNAL(markingCompleted(int)), this, SLOT(markingCompleted(int)) ); - connect( mFilter, SIGNAL(clearingCompleted(int)), this, SLOT(clearingCompleted(int)) ); - mList->setModel(0); - delete mModel; - mModel = 0; - mModel = new TestModel(*mFilter); - mList->setModel(mModel); - mShowAll = false; - } - else { - mList->setModel(0); - delete mFilter; - mFilter = 0; - delete mModel; - mModel = 0; - mModel = new TestModel(*mLogsModel); - mList->setModel(mModel); - mShowAll = true; - } -} - -void TestView::addMissedCall() -{ - TInt errorCode( KErrNone ); - TInt value; - - errorCode = mRepository->Get( KLogsNewMissedCalls, value ); - - if ( errorCode == KErrNone ){ - ++value; - errorCode = mRepository->Set( KLogsNewMissedCalls, value ); - } - - // Do here what some API user might do when it gets - // notification about missed call counter increase - updateMissedCallsLabel(); -} - -void TestView::clearMissedCalls() -{ - mRepository->Set( KLogsNewMissedCalls, 0 ); - if ( mFilter ){ - mFilter->markEventsSeen(); - } - updateMissedCallsLabel(); -} - -void TestView::deleteEvents() -{ - if ( mFilter ){ - mFilter->clearEvents(); - } else { - mLogsModel->clearList(LogsModel::TypeLogsClearAll); - } -} - -void TestView::updateMissedCallsLabel() -{ - qDebug() << "LogsApiTest::updateMissedCallsLabel ->"; - - LOGSAPITEST_PRINT_ALLOC_SIZE - - QString lastMissedCallFrom; - int repeatedMissedCalls = 0; - TInt value(0); - mRepository->Get( KLogsNewMissedCalls, value ); - if ( mMissedCallsFilter->rowCount() > 0 ){ - lastMissedCallFrom = mMissedCallsFilter->data(mMissedCallsFilter->index(0,0), Qt::DisplayRole).toStringList().at(0); - repeatedMissedCalls = 1; - } - for( int i = 1; i < value && i < mMissedCallsFilter->rowCount(); i++ ){ - QStringList displayData = mMissedCallsFilter->data(mMissedCallsFilter->index(i,0), Qt::DisplayRole).toStringList(); - if ( lastMissedCallFrom == displayData.at(0) ){ - repeatedMissedCalls++; - } else { - i = value; // Break - } - } - - if ( value == 0 ){ - mLabel->setPlainText( "No missed calls" ); - } else if ( repeatedMissedCalls >= value ){ - mLabel->setPlainText( - QString("%1 missed call(s) from %2").arg(value).arg(lastMissedCallFrom) ); - } else { - mLabel->setPlainText( QString("%1 missed call(s)").arg(value) ); - } - qDebug() << "LogsApiTest::updateMissedCallsLabel <-"; -} - -void TestView::markingCompleted(int err) -{ - HbMessageBox box(HbMessageBox::MessageTypeInformation); - box.setText( QString("Marking completed, err:%1").arg(err) ); - box.exec(); -} - -void TestView::clearingCompleted(int err) -{ - HbMessageBox box(HbMessageBox::MessageTypeInformation); - box.setText( QString("Clearing completed, err:%1").arg(err) ); - box.exec(); -} - -TestModel::TestModel(QAbstractItemModel& logsModel) : mLogsModel(logsModel) -{ - readEvents(); - connect( &mLogsModel, SIGNAL( dataChanged(const QModelIndex&,const QModelIndex&)), - this, SLOT(handleModelUpdated())); - connect( &mLogsModel, SIGNAL( rowsInserted(const QModelIndex&,int,int)), - this, SLOT(handleModelUpdated())); - connect( &mLogsModel, SIGNAL( rowsRemoved(const QModelIndex&,int,int)), - this, SLOT(handleModelUpdated())); - connect( &mLogsModel, SIGNAL(modelReset()), - this, SLOT(handleModelUpdated())); -} -TestModel::~TestModel() -{ -} -int TestModel::rowCount(const QModelIndex &parent) const -{ - return mEvents.count(); -} -QVariant TestModel::data(const QModelIndex &index, int role) const -{ - if ( role == Qt::DisplayRole && index.row() >= 0 && index.row() < mEvents.count() ){ - return mEvents.at(index.row()); - } - return QVariant(); -} -void TestModel::handleModelUpdated() -{ - LOGSAPITEST_PRINT_ALLOC_SIZE - - // Do it in simple but unefficient way - readEvents(); - reset(); -} - -void TestModel::readEvents() -{ - mEvents.clear(); - for ( int i = 0; i < mLogsModel.rowCount(); ++i ){ - LogsEvent* event = qVariantValue( - mLogsModel.data( mLogsModel.index(i, 0), LogsModel::RoleFullEvent ) ); - if ( event ){ - - mEvents.append( directionText(*event) ); - // Can check occurence time etc. - } - } -} - -QString TestModel::directionText(const LogsEvent& event) -{ - QString direction; - if ( event.direction() == LogsEvent::DirIn ) { - direction = QString("Received call from "); - } else if ( event.direction() == LogsEvent::DirOut ) { - direction = QString("Called to "); - } else if ( event.direction() == LogsEvent::DirMissed ) { - direction = QString("Missed call from "); - } - if ( event.remoteParty().length() > 0 ){ - direction.append( event.remoteParty() ); - } - else { - direction.append( event.number() ); - } - - if ( event.direction() == LogsEvent::DirMissed ){ - if ( event.isRead() ){ - direction.append( " Seen"); - } else { - direction.append( " Unseen"); - } - } - - return direction; -} - - - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logsengineapitester/src/logsengineapitester.h --- a/logsui/tsrc/logsengineapitester/src/logsengineapitester.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +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: -* -*/ - -#ifndef LOGSENGINEAPITESTER_H -#define LOGSENGINEAPITESTER_H - -#include - -class HbListView; -class HbLabel; -class LogsModel; -class LogsCustomFilter; -class QAbstractItemModel; -class TestModel; -class LogsEvent; -class CRepository; -class LogsFilter; - -class TestView : public HbView -{ - Q_OBJECT -public: - TestView(); - ~TestView(); - -public slots: - void changeFilter(); - void addMissedCall(); - void clearMissedCalls(); - void updateMissedCallsLabel(); - void deleteEvents(); - void markingCompleted(int err); - void clearingCompleted(int err); - -private: - HbListView* mList; - HbLabel* mLabel; - TestModel* mModel; - LogsModel* mLogsModel; - LogsCustomFilter* mFilter; - bool mShowAll; - CRepository* mRepository; - LogsFilter* mMissedCallsFilter; - -}; - -class TestModel : public QAbstractListModel - { - Q_OBJECT - -public: - TestModel(QAbstractItemModel& logsModel); - ~TestModel(); - -public: // From QAbstractListModel - virtual int rowCount(const QModelIndex &parent) const; - virtual QVariant data(const QModelIndex &index, int role) const; - -public slots: - void handleModelUpdated(); - -private: - void readEvents(); - QString directionText(const LogsEvent& event); - -private: - QStringList mEvents; - QAbstractItemModel& mLogsModel; - - }; - -#endif diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logsengineapitester/src/logsengineapitester.pri --- a/logsui/tsrc/logsengineapitester/src/logsengineapitester.pri Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +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: -# - -SOURCES=\ - src/main.cpp\ - src/logsengineapitester.cpp - -HEADERS=\ - src/logsengineapitester.h - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logsengineapitester/src/main.cpp --- a/logsui/tsrc/logsengineapitester/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +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 "logsengineapitester.h" - -int main(int argc, char **argv) -{ - - qDebug() << "LogsEngineApiTester::main ->"; - - - HbApplication app(argc, argv); - - HbMainWindow mainWindow; - - TestView testView; - mainWindow.addView(&testView); - - // Show widget - mainWindow.show(); - - // Enter event loop - int err = app.exec(); - qDebug() << "LogsEngineApiTester::main <-"; - return err; -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logsservicestester/logsservicestester.pro --- a/logsui/tsrc/logsservicestester/logsservicestester.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +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: -# -# - -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -CONFIG += hb - -# Input -SOURCES += main.cpp - -symbian: { - TARGET.UID2 = 0x100039CE - TARGET.UID3 = 0xEC209DCF - TARGET.CAPABILITY = CAP_APPLICATION AllFiles - LIBS += -llogsservices -} - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/logsservicestester/main.cpp --- a/logsui/tsrc/logsservicestester/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +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 -#include -#include - -int main(int argc, char *argv[]) -{ - qDebug() << "LogsServicesTester entry"; - LogsServices::LogsView viewIndex = LogsServices::ViewAll; - bool showDialpad = false; - for ( int i = 0; i< argc; i++ ){ - qDebug() << "Arg" << ( i + 1 ) << argv[i]; - QString argStr( argv[i] ); - if ( argStr.length() == 1 ){ - viewIndex = (LogsServices::LogsView)argStr.toInt(); - } - if ( argStr == QString("-dialpad") ){ - showDialpad = true; - } - } - - HbApplication app(argc, argv); - HbMainWindow mainWindow; - mainWindow.show(); - - qDebug() << "LogsServicesTester start logs"; - LogsServices::start( viewIndex, showDialpad ); - - int ret = app.exec(); - qDebug() << "LogsServicesTester exit"; - return ret; -} diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/qtestutils/inc/testresultxmlparser.h --- a/logsui/tsrc/qtestutils/inc/testresultxmlparser.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +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: -* -*/ - -#ifndef TESTRESULTXMLPARSER_H -#define TESTRESULTXMLPARSER_H - -#include - - -class TestResultXmlParser : public QXmlDefaultHandler -{ -public: // Constructors and destructor - TestResultXmlParser(); - ~TestResultXmlParser(); - -public: // From QXmlContentHandler - bool startElement( - const QString& namespaceURI, - const QString& localName, - const QString& qName, - const QXmlAttributes& atts); - - bool endElement( - const QString& namespaceURI, - const QString& localName, - const QString& qName); - - bool characters(const QString& ch); - -public: // New functions - - int parse(const QString& fileName); - - int parseAndPrintResults( - const QString& fileName, - bool printDetails=false); - - int testCount(); - - QStringList errors(); - -private: // Data - int mTestCount; - QStringList* mErrors; - bool mParsingIncidentElement; - bool mParsingDescriptionElement; - bool mCurrentTestFailed; - QString mCurrentTestName; - QString mCurrentTestFile; - int mCurrentTestFailureLine; -}; - - -#endif // TESTRESULTXMLPARSER_H diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/qtestutils/src/testresultxmlparser.cpp --- a/logsui/tsrc/qtestutils/src/testresultxmlparser.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +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 "testresultxmlparser.h" -#include - -const char testFunctionElement[] = "TestFunction"; -const char incidentElement[] = "Incident"; -const char descriptionElement[] = "Description"; -const char nameAttr[] = "name"; -const char typeAttr[] = "type"; -const char fileAttr[] = "file"; -const char lineAttr[] = "line"; -const char attrValueFail[] = "fail"; - - -// ----------------------------------------------------------------------------- -// TestResultXmlParser::TestResultXmlParser -// ----------------------------------------------------------------------------- -// -TestResultXmlParser::TestResultXmlParser() -: mTestCount(0), - mParsingIncidentElement(false), - mParsingDescriptionElement(false), - mCurrentTestFailed(false), - mCurrentTestFailureLine(0) -{ - mErrors = new QStringList; -} - -// ----------------------------------------------------------------------------- -// TestResultXmlParser::TestResultXmlParser -// ----------------------------------------------------------------------------- -// -TestResultXmlParser::~TestResultXmlParser() -{ - delete mErrors; -} - -// ----------------------------------------------------------------------------- -// TestResultXmlParser::startElement -// ----------------------------------------------------------------------------- -// -bool TestResultXmlParser::startElement( - const QString& /*namespaceURI*/, - const QString& /*localName*/, - const QString& qName, - const QXmlAttributes& atts) -{ - if (qName == testFunctionElement) { - mTestCount++; - mCurrentTestName = atts.value(nameAttr); - return true; - } - if (qName == incidentElement) { - mParsingIncidentElement = true; - if (atts.value(typeAttr) == attrValueFail) { - mCurrentTestFailed = true; - mCurrentTestFile = atts.value(fileAttr); - mCurrentTestFailureLine = atts.value(lineAttr).toInt(); - } - return true; - } - mParsingDescriptionElement = (qName == descriptionElement); - return true; -} - -// ----------------------------------------------------------------------------- -// TestResultXmlParser::endElement -// ----------------------------------------------------------------------------- -// -bool TestResultXmlParser::endElement( - const QString& /*namespaceURI*/, - const QString& /*localName*/, - const QString& qName) -{ - if (qName == incidentElement) { - mParsingIncidentElement = false; - mCurrentTestFailed = false; - return true; - } - if (qName == descriptionElement) { - mParsingDescriptionElement = false; - } - return true; -} - -// ----------------------------------------------------------------------------- -// TestResultXmlParser::characters -// ----------------------------------------------------------------------------- -// -bool TestResultXmlParser::characters(const QString& ch) -{ - if (mParsingIncidentElement && - mParsingDescriptionElement && - mCurrentTestFailed) { - QString testResult = mCurrentTestName + " failed:\n"; - testResult += "File: "; - testResult += mCurrentTestFile; - testResult += "\n"; - testResult += "Line: "; - testResult += QString::number(mCurrentTestFailureLine); - testResult += "\n"; - testResult += "Reason: "; - testResult += ch; - testResult += "\n"; - mErrors->append(testResult); - } - return true; -} - -// ----------------------------------------------------------------------------- -// TestResultXmlParser::parse -// ----------------------------------------------------------------------------- -// -int TestResultXmlParser::parse(const QString& fileName) -{ - QFile file(fileName); - QXmlInputSource inputSource(&file); - QXmlSimpleReader reader; - reader.setContentHandler(this); - return reader.parse(inputSource); -} - -// ----------------------------------------------------------------------------- -// TestResultXmlParser::parseAndPrintResults -// ----------------------------------------------------------------------------- -// -int TestResultXmlParser::parseAndPrintResults( - const QString& fileName, - bool printDetails) -{ - printf("Parsing: %s\n", fileName.toUtf8().data()); - int error = parse(fileName); - printf("%d tests executed. Failed total: %d\n", mTestCount, mErrors->count()); - if (printDetails) { - printf("\n"); - foreach(QString error, *mErrors) { - printf(error.toUtf8().data()); - printf("\n"); - } - } - return error; -} - -// ----------------------------------------------------------------------------- -// TestResultXmlParser::testCount -// ----------------------------------------------------------------------------- -// -int TestResultXmlParser::testCount() -{ - return mTestCount; -} - -// ----------------------------------------------------------------------------- -// TestResultXmlParser::errors -// ----------------------------------------------------------------------------- -// -QStringList TestResultXmlParser::errors() -{ - return *mErrors; -} - -// End of File. diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/unittestrunner/tsrc.pro --- a/logsui/tsrc/unittestrunner/tsrc.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +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: -# -# - -TEMPLATE = subdirs - -SUBDIRS= \ - ..\..\logsengine\tsrc\ut_logsengine\ - ..\..\logsengine\logssymbianos\tsrc\ut_logssymbianos\ - ..\..\logscntfinder\tsrc\ut_logscntfinder\ - ..\..\logsapp\tsrc\ut_logsapp\ - - diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/unittestrunner/unittest_qt.pl --- a/logsui/tsrc/unittestrunner/unittest_qt.pl Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,443 +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: -# -#!/usr/bin/perl - -use File::Copy; -use Cwd; -use Getopt::Long; -use XML::Parser::Expat; -use Data::Dumper; - -#---------------------------------------Initialization------------------------------------------------------# - -$projectrootname = "/"; #is set to correct at run-time -$projectdrive = "z:"; #is set to correct at run-time - -$unitTestRunner = "unittest_qt.pl"; -$scriptLocation = "logsui/tsrc/unittestrunner"; -$coverageResultsDirDefault = "logsui/tsrc/unittestrunner/qtresults/"; -$testConfigDefault = "unittest_qt_config.txt"; -$qtProFileDefault = "tsrc.pro"; -$buildResults = "BuildResults.txt"; -$coverageDat = "MON.dat"; -$coverageSymbols = "MON.sym"; -$coverageProfile = "profile.txt"; - -$coverageResultsFile = "CTCHTML/index.html"; -$finalResultsFile = "AllResults.html"; -$cssFile = "CTCHTML/ctc.css"; -$cssLink = " \$param_noclean, - "config:s" => \$testConfig, - "pro:s" => \$qtProFile, - "results:s" => \$coverageResultsDir, - "help" => \$help); - -$startdir = cwd; - -if (defined $help){ - print_help(); - exit; -} - -findProjectDriveAndRoot(); - -createResultsDir(); - -# set target for intrumentation result -$ENV{'CTC_DATA_PATH'}= "$coverageResultsDir"; - -doClean(); - -parseConfigFile(); - -buildTests(); - -runTests(); - -chdir($startdir); - -# create textual output -chdir("$coverageResultsDir"); -doSystemCall("ctcpost $coverageSymbols $coverageDat -p $coverageProfile -T 70"); -doSystemCall("ctc2html -i $coverageProfile -t 70"); - -# clear target for intrumentation result -$ENV{'CTC_DATA_PATH'}= ""; - -combineResults(); - -chdir($startdir); - -#---------------------------------------Main Ends-------------------------------------------------------------# - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub findProjectDriveAndRoot() -{ - $tempStartDir = $startdir; - if ($tempStartDir =~ m/$scriptLocation/){ - # extract project root - for ($tempStartDir) { - s/$scriptLocation+$//; - } - # divide it to drive and root - if ($tempStartDir =~ /^(.:)(.*)/){ - $projectdrive = $1; - $projectrootname = $2; - } - print "project drive: $projectdrive \n"; - print "project root: $projectrootname \n"; - } - else{ - print "cannot determine project drive and root, use defaults!\n"; - } -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub createResultsDir() -{ - # create directory for results - if ( defined $coverageResultsDir ){ - if ($coverageResultsDir =~ /^(.:)/){ - print("Drive name given in results dir arg\n"); - } - else{ - $coverageResultsDir = "$projectdrive" . "/" . "$coverageResultsDir"; - } - } - else{ - $coverageResultsDir = "$projectdrive$projectrootname$coverageResultsDirDefault"; - } - print ("Writing results to $coverageResultsDir \n\n"); - if (mkdir("$coverageResultsDir", 0755)){ - print("The results directory was created successfully! \n"); - } - else { - print("The results directory already exists. \n"); - } -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub doClean() -{ - if (!defined $param_noclean) - { - # clear previous results - print("Cleaning previous results. \n"); - unlink("$coverageResultsDir$buildResults"); - unlink("$coverageResultsDir$coverageDat"); - unlink("$coverageResultsDir$coverageSymbols"); - unlink("$coverageResultsDir$coverageProfile"); - unlink("$coverageResultsDir$finalResultsFile"); - } -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub parseConfigFile() -{ - if ( !defined $testConfig ){ - print("Config file not defined, using default. \n"); - $testConfig = $testConfigDefault; - } - - open(CONFIG, $testConfig) or die("file $testConfig not found!\n"); - - @config_file_content = ; - - - for ($j = 0; $j <= $#config_file_content; $j++) - { - # remove \n from each line - $currline = @config_file_content[$j]; - for ($currline) { - s/\n+$//; - } - @{ $testNamesAndLogFiles [$j] } = split( ",", $currline ); - } - - print Dumper( @testNamesAndLogFiles ); - - close(CONFIG); -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub buildTests() -{ - if ( !defined $qtProFile ){ - print("Pro file not defined, using default. \n"); - $qtProFile = $qtProFileDefault; - } - doSystemCall( "qmake -platform symbian-abld $qtProFile" ); - doSystemCall( "bldmake bldfiles" ); - doSystemCall( "abld clean winscw udeb" ); - doSystemCall( "abld reallyclean winscw udeb" ); - - $exclude = "-C \"EXCLUDE+*\tsrc\*\" -C \"EXCLUDE+*/*/tsrc/*\" -C \"EXCLUDE+*/*/*/tsrc/*\" -C \"EXCLUDE+moc_*\""; - - doSystemCall( "call ctcwrap -i d -n $coverageResultsDir$coverageSymbols $exclude abld build winscw udeb" ); -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub runTests() -{ - for $i ( 0 .. $#testNamesAndLogFiles ) { - $testName = $testNamesAndLogFiles[$i][0]; - print("Running tests for: $testName\n"); - - $testCall = "\\epoc32\\release\\winscw\\udeb\\" . $testName . " -xml"; - doSystemCall( $testCall ); - - for $j ( 1 .. $#{ $testNamesAndLogFiles [$i] } ) { - $logFile = $projectdrive . "\\epoc32\\winscw\\c\\" . $testNamesAndLogFiles[$i][$j]; - print("Copying log file: $logFile\n"); - copy( $logFile, "$coverageResultsDir" ); - } - } -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub combineResults() -{ - open(COVERAGE, "$coverageResultsDir$coverageResultsFile") or die("file $coverageResultsFile not found!\n"); - @coverageFileContent = ; - - # append coverage information after eunit results - - for ($j = 0; $j <= $#coverageFileContent; $j++){ - $currentLine = @coverageFileContent[$j]; - - if ($currentLine =~ /$cssLink/){ - if ( open(CSSFILE, "$coverageResultsDir$cssFile") ){ - # append css styles to results html - $outputString .= "\n"; - close(CSSFILE); - } - } - else{ - $outputString .= $currentLine; - - if ($currentLine =~ /$outputFileBodyStart/){ - $outputString .= parseXmlResults(); - $outputString .= "

" - } - } - } - - open(NEWRESULTSFILE, "> $coverageResultsDir$finalResultsFile") or die "Cannot open final results file\n"; - print NEWRESULTSFILE "$outputString"; - close(NEWRESULTSFILE); - close(OUTPUT); - close(COVERAGE); -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub parseXmlResults() -{ - $qtestOutputString = "QTestLib Results

\n"; - - - for $i ( 0 .. $#testNamesAndLogFiles ) { - $testName = $testNamesAndLogFiles[$i][0]; - - for $j ( 1 .. $#{ $testNamesAndLogFiles [$i] } ) { - $logFile = $testNamesAndLogFiles[$i][$j]; - if ( -e "$coverageResultsDir$logFile" ){ - print("Parsing: $logFile\n"); - open(TESTRESULTS, "$coverageResultsDir$logFile"); - $parser = new XML::Parser::Expat; - $parser->setHandlers('Start' => \&sh, - 'End' => \&eh, - 'Char' => \&ch); - - $totalCount = 0; - $passedCount = 0; - $failedCount = 0; - eval{ - ### try block - $parser->parse(*TESTRESULTS); - }; - if ($@){ - ### catch block - print("$logFile, parsing failed\n"); - $qtestOutputString .= "$logFile parsing failed, testcase execution might have failed
\n"; - }; - close(TESTRESULTS); - - } - else{ - - print("$logFile, not found\n"); - $qtestOutputString .= ""; - $qtestOutputString .= "$testName => "; - $qtestOutputString .= "$logFile not found, testcase building might have failed
\n"; - } - } - } - - return $qtestOutputString; -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub sh -{ - my ($p, $el, %atts) = @_; - if ( $el eq $xmlDllLine ) - { - $qtestOutputString .= ""; - $dllName = %atts->{name}; - @dllNameParts = split m!(\\)!, $dllName; - $dllName = $dllNameParts[$#dllNameParts]; - $qtestOutputString .= "$dllName => "; - } - - if ( $el eq $xmlResultLine ) - { - $status = %atts->{type}; - if ( $status eq $xmlCasePassed ) - { - $passedCount++; - } - else - { - $failedCount++; - } - } -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub eh -{ - my ($p, $el) = @_; - if ( $el eq $xmlDllLine ) - { - $totalCount = $passedCount + $failedCount; - if ( $failedCount > 0 || $totalCount == 0 ) - { - $qtestOutputString .= "Testcases passed/run: $passedCount/$totalCount
\n"; - } - else - { - $qtestOutputString .= "Testcases passed/run: $passedCount/$totalCount
\n"; - } - $passedCount = 0; - $failedCount = 0; - } -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub ch -{ - my ($p, $el) = @_; - #print ("$el\n"); -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub doSystemCall -{ - #print("\nDoing system call: $_[0]\n"); - #system($_[0]); - system("echo Doing system call: $_[0] >> $coverageResultsDir$buildResults"); - system("$_[0] >> $coverageResultsDir$buildResults 2>&1"); -} - -# ----------------------------------------------------------------------------- -# -# ----------------------------------------------------------------------------- -# -sub print_help -{ - print("\n*************************************************************\n\n"); - print("Script runs by default all multimediasharing qt tests\n"); - print("and creates build, test and coverage results to:\n\n"); - print(" mmsharing/src/internal/unittestrunner/qtresults/\n\n"); - print("Own configuration file (list of components to be processed)\n"); - print("can be used as well:\n\n"); - print(" >unittest_ctc.pl -config=myowntestcomponents.txt\n\n"); - print("The text file should follow the syntax of default configuration file\n"); - print("mmsharing/src/internal/unittestrunner/unittest_qt_config.txt\n\n"); - print("When running just some set of components you might want to \"merge\" the results"); - print("with existing coverage results.\n"); - print("That is possible with command:\n\n"); - print(" >unittest_ctc.pl -eunitdlls=myowneunitcomponents.txt -noclean\n"); - print("\n*************************************************************\n"); -} diff -r 76a2435edfd4 -r de1630741fbe logsui/tsrc/unittestrunner/unittest_qt_config.txt --- a/logsui/tsrc/unittestrunner/unittest_qt_config.txt Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -ut_logsengine -noprompt,ut_logs_logsModel.xml,ut_logs_logsDetailsModel.xml,ut_logs_logsMatchesModel.xml,ut_logs_logsFilter.xml,ut_logs_logsCustomFilter.xml,ut_logs_logsCall.xml,ut_logs_logsContact.xml,ut_logs_logsMessage.xml,ut_logs_logsEvent.xml,ut_logs_logsEventData.xml -ut_logssymbianos -noprompt,ut_logs_logsDbConnector.xml,ut_logs_logsRemove.xml,ut_logs_logsReader.xml,ut_logs_logsReaderStates.xml,ut_logs_logsEventParser.xml,ut_logs_logsEventDataParser.xml -ut_logscntfinder -noprompt,ut_logs_logsCntFinder.xml,ut_logs_logsPredictiveTranslator.xml,ut_logs_logscntentry.xml -ut_logsapp -noprompt,ut_logsMainWindow.xml,ut_logsRepository.xml,ut_logsViewManager.xml,ut_logsBaseView.xml,ut_logsRecentCallsView.xml,ut_logsDetailsView.xml,ut_logsMatchesView.xml,ut_logsEffectHandler.xml,ut_logsServiceHandler.xml diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/bwins/cntimageutilityu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/bwins/cntimageutilityu.def Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,19 @@ +EXPORTS + ?trUtf8@CntImageUtility@@SA?AVQString@@PBD0H@Z @ 1 NONAME ; class QString CntImageUtility::trUtf8(char const *, char const *, int) + ??_ECntImageUtility@@UAE@I@Z @ 2 NONAME ; CntImageUtility::~CntImageUtility(unsigned int) + ?qt_metacall@CntImageUtility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 3 NONAME ; int CntImageUtility::qt_metacall(enum QMetaObject::Call, int, void * *) + ?staticMetaObject@CntImageUtility@@2UQMetaObject@@B @ 4 NONAME ; struct QMetaObject const CntImageUtility::staticMetaObject + ?metaObject@CntImageUtility@@UBEPBUQMetaObject@@XZ @ 5 NONAME ; struct QMetaObject const * CntImageUtility::metaObject(void) const + ??1CntImageUtility@@UAE@XZ @ 6 NONAME ; CntImageUtility::~CntImageUtility(void) + ?initPath@CntImageUtility@@AAEXAAVQString@@H@Z @ 7 NONAME ; void CntImageUtility::initPath(class QString &, int) + ?trUtf8@CntImageUtility@@SA?AVQString@@PBD0@Z @ 8 NONAME ; class QString CntImageUtility::trUtf8(char const *, char const *) + ?tr@CntImageUtility@@SA?AVQString@@PBD0@Z @ 9 NONAME ; class QString CntImageUtility::tr(char const *, char const *) + ?getStaticMetaObject@CntImageUtility@@SAABUQMetaObject@@XZ @ 10 NONAME ; struct QMetaObject const & CntImageUtility::getStaticMetaObject(void) + ?removeImage@CntImageUtility@@QAE_NABVQString@@AAH@Z @ 11 NONAME ; bool CntImageUtility::removeImage(class QString const &, int &) + ?qt_metacast@CntImageUtility@@UAEPAXPBD@Z @ 12 NONAME ; void * CntImageUtility::qt_metacast(char const *) + ?selectDrive@CntImageUtility@@AAEHAAH@Z @ 13 NONAME ; int CntImageUtility::selectDrive(int &) + ?tr@CntImageUtility@@SA?AVQString@@PBD0H@Z @ 14 NONAME ; class QString CntImageUtility::tr(char const *, char const *, int) + ?createImage@CntImageUtility@@QAE_NABVQPixmap@@AAVQString@@AAH@Z @ 15 NONAME ; bool CntImageUtility::createImage(class QPixmap const &, class QString &, int &) + ?createImage@CntImageUtility@@QAE_NABVQString@@AAV2@AAH@Z @ 16 NONAME ; bool CntImageUtility::createImage(class QString const &, class QString &, int &) + ??0CntImageUtility@@QAE@PAVQObject@@@Z @ 17 NONAME ; CntImageUtility::CntImageUtility(class QObject *) + diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/bwins/simutilityu.def --- a/phonebookengines/bwins/simutilityu.def Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookengines/bwins/simutilityu.def Mon May 03 12:24:20 2010 +0300 @@ -1,15 +1,26 @@ 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 + ?staticMetaObject@SimUtility@@2UQMetaObject@@B @ 1 NONAME ; struct QMetaObject const SimUtility::staticMetaObject + ?qt_metacast@SimUtility@@UAEPAXPBD@Z @ 2 NONAME ; void * SimUtility::qt_metacast(char const *) + ??_ESimUtility@@UAE@I@Z @ 3 NONAME ; SimUtility::~SimUtility(unsigned int) + ?startGetAvailableStores@SimUtility@@QAE_NXZ @ 4 NONAME ; bool SimUtility::startGetAvailableStores(void) + ?setFdnStatus@SimUtility@@QAEH_N@Z @ 5 NONAME ; int SimUtility::setFdnStatus(bool) + ?qt_metacall@SimUtility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 6 NONAME ; int SimUtility::qt_metacall(enum QMetaObject::Call, int, void * *) + ?isFdnActive@SimUtility@@QAE_NXZ @ 7 NONAME ; bool SimUtility::isFdnActive(void) + ?getSimInfo@SimUtility@@QAE?AUSimInfo@1@AAH@Z @ 8 NONAME ; struct SimUtility::SimInfo SimUtility::getSimInfo(int &) + ?metaObject@SimUtility@@UBEPBUQMetaObject@@XZ @ 9 NONAME ; struct QMetaObject const * SimUtility::metaObject(void) const + ?RequestCompleted@SimUtility@@QAEXH@Z @ 10 NONAME ; void SimUtility::RequestCompleted(int) + ?tr@SimUtility@@SA?AVQString@@PBD0H@Z @ 11 NONAME ; class QString SimUtility::tr(char const *, char const *, int) + ?trUtf8@SimUtility@@SA?AVQString@@PBD0H@Z @ 12 NONAME ; class QString SimUtility::trUtf8(char const *, char const *, int) + ??0SimUtility@@QAE@W4StoreType@0@AAHPAVQObject@@@Z @ 13 NONAME ; SimUtility::SimUtility(enum SimUtility::StoreType, int &, class QObject *) + ?trUtf8@SimUtility@@SA?AVQString@@PBD0@Z @ 14 NONAME ; class QString SimUtility::trUtf8(char const *, char const *) + ?startGetSimInfo@SimUtility@@QAE_NXZ @ 15 NONAME ; bool SimUtility::startGetSimInfo(void) + ??1SimUtility@@UAE@XZ @ 16 NONAME ; SimUtility::~SimUtility(void) + ?getAvailableStores@SimUtility@@QAE?AUAvailableStores@1@AAH@Z @ 17 NONAME ; struct SimUtility::AvailableStores SimUtility::getAvailableStores(int &) + ?availableStoresReady@SimUtility@@IAEXAAUAvailableStores@1@H@Z @ 18 NONAME ; void SimUtility::availableStoresReady(struct SimUtility::AvailableStores &, int) + ?ParseServiceTable@SimUtility@@ABEXPAUAvailableStores@1@@Z @ 19 NONAME ; void SimUtility::ParseServiceTable(struct SimUtility::AvailableStores *) const + ?verifyPin2Code@SimUtility@@QAE_NXZ @ 20 NONAME ; bool SimUtility::verifyPin2Code(void) + ?tr@SimUtility@@SA?AVQString@@PBD0@Z @ 21 NONAME ; class QString SimUtility::tr(char const *, char const *) + ?getStaticMetaObject@SimUtility@@SAABUQMetaObject@@XZ @ 22 NONAME ; struct QMetaObject const & SimUtility::getStaticMetaObject(void) + ?simInfoReady@SimUtility@@IAEXAAUSimInfo@1@H@Z @ 23 NONAME ; void SimUtility::simInfoReady(struct SimUtility::SimInfo &, int) + ?isSimInserted@SimUtility@@ABE_NXZ @ 24 NONAME ; bool SimUtility::isSimInserted(void) const diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/cntimageutility/cntimageutility.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntimageutility/cntimageutility.pro Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,40 @@ +# +# 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 = lib +TARGET = cntimageutility +MOC_DIR = moc +CONFIG += hb +DEFINES += CNTIMAGEUTILITY_LIBRARY + +TARGET.CAPABILITY = CAP_GENERAL_DLL +TARGET.EPOCALLOWDLLDATA = 1 +TARGET.UID3 = 0x2002B3F5 + +INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE +INCLUDEPATH += inc + +HEADERS += inc/cntimageutilityglobal.h \ + inc/cntimageutility.h + +SOURCES += src/cntimageutility.cpp + +LIBS += -lplatformenv diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/cntimageutility/inc/cntimageutility.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntimageutility/inc/cntimageutility.h Mon May 03 12:24:20 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 CNTIMAGEUTILITY_H +#define CNTIMAGEUTILITY_H + +#include +#include +#include "cntimageutilityglobal.h" + +class QPixmap; + +class CNTIMAGEUTILITYLIB_EXPORT CntImageUtility : public QObject +{ + Q_OBJECT + +public: + CntImageUtility(QObject *parent = 0); + ~CntImageUtility(); + + bool createImage(const QString& filePath, QString& imagePath, int& error); + bool createImage(const QPixmap& pixmap, QString& imagePath, int& error); + bool removeImage(const QString& imagePath, int& error); + +private: + int selectDrive(int &driveIndex); + void initPath(QString &path, int drive); +}; + +#endif diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/cntimageutility/inc/cntimageutilityglobal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntimageutility/inc/cntimageutilityglobal.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,29 @@ +/* +* 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 CNTIMAGEUTILITYGLOBAL_H +#define CNTIMAGEUTILITYGLOBAL_H + +#include + +#if defined(CNTIMAGEUTILITY_LIBRARY) +# define CNTIMAGEUTILITYLIB_EXPORT Q_DECL_EXPORT +#else +# define CNTIMAGEUTILITYLIB_EXPORT Q_DECL_IMPORT +#endif + +#endif diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/cntimageutility/src/cntimageutility.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/cntimageutility/src/cntimageutility.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,155 @@ +/* +* 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 "cntimageutility.h" + +#include +#include + +#include +#include +#include +#include +#include + +const char* PBK_FOLDER = "Private\\20022EF9"; +const char* IMAGEFILE_EXT = ".jpg"; +const char* IMAGE_TYPE = "JPEG"; +const char* FOLDER_SEPARATOR = "\\"; + +const TInt64 KMinRequiredSpaceImage = 2000000; + +CntImageUtility::CntImageUtility(QObject *parent) + : QObject(parent) +{ +} + +CntImageUtility::~CntImageUtility() +{ +} + +bool CntImageUtility::createImage(const QString& filePath, QString& imagePath, int& error) +{ + Q_UNUSED(error); + + int drive; + bool success(false); + QString fileExt(IMAGEFILE_EXT); + int err= selectDrive(drive); + if (KErrNone==err) + { + initPath(imagePath, drive); + // Filename format + // image_.jpg + QDateTime dateTime = QDateTime::currentDateTime(); + QString dateTimeString = dateTime.toString("yyhh_mm_ss_zzz"); + QString filename = "image_" + dateTimeString + fileExt; + imagePath += FOLDER_SEPARATOR + filename; + + // Copy source image to contacts images + QFile destFile; + success= destFile.copy(filePath,imagePath); + } + return success; +} + +bool CntImageUtility::createImage(const QPixmap& pixmap, QString& imagePath, int& error) +{ + Q_UNUSED(error); + + int drive; + bool success(false); + QString fileExt(IMAGEFILE_EXT); + int err= selectDrive(drive); + if (KErrNone==err) + { + initPath(imagePath, drive); + // Filename format + // image_.jpg + QDateTime dateTime = QDateTime::currentDateTime(); + QString dateTimeString = dateTime.toString("yyhh_mm_ss_zzz"); + QString filename = "image_" + dateTimeString + fileExt; + imagePath += FOLDER_SEPARATOR + filename; + + if(!pixmap.isNull()) + { + QPixmap pix(pixmap); + QImage image(pix.toImage()); + success= image.save(imagePath, IMAGE_TYPE); + } + } + return success; +} + +bool CntImageUtility::removeImage(const QString& imagePath, int& error) +{ + Q_UNUSED(error); + + QDir dir; + bool success(false); + + QFile file( imagePath ); + if( !file.exists() + || dir.remove(imagePath)) + success= true; + + return success; +} + +int CntImageUtility::selectDrive(int &driveIndex) +{ + int err = KErrNone; + TInt64 minSpaceInBytes = KMinRequiredSpaceImage; + RFs fsSession; + + // Connect to file session + err= fsSession.Connect(); + if(err!=KErrNone) + return err; + + // Get the drive/volume details + TVolumeInfo vInfo; + err = DriveInfo::GetDefaultDrive(DriveInfo::EDefaultMassStorage, driveIndex); + if (KErrNone==err) + { + err = fsSession.Volume(vInfo, driveIndex); + } + + // Check the availability and disk space + if ( !err && vInfo.iFree < minSpaceInBytes) + { + // All drives are full or inaccessible + err = KErrDiskFull; + } + return err; +} + +void CntImageUtility::initPath(QString &path, int drive) +{ + // Get the root path for the given drive. + TFileName tPath; + PathInfo::GetRootPath(tPath, drive); + path = QString::fromUtf16(tPath.Ptr(), tPath.Length()); + + // Image files saved in Phonebook folder + // Create folder if not exists + QDir dir(path); + if (!dir.cd(PBK_FOLDER)) + { + dir.mkpath(PBK_FOLDER); + } + path = dir.path(); +} diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.cpp --- a/phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.cpp Mon May 03 12:24:20 2010 +0300 @@ -11,7 +11,7 @@ * * Contributors: * -* Description: +* Description: * */ #include diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.pro --- a/phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookengines/cntmaptileservice/tsrc/ut_cntmaptileservice/ut_maptileservice.pro Mon May 03 12:24:20 2010 +0300 @@ -11,7 +11,7 @@ # # Contributors: # -# Description: +# Description: # TEMPLATE = app diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/contactsmodel/cntplsql/inc/cpcskeymap.h --- a/phonebookengines/contactsmodel/cntplsql/inc/cpcskeymap.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/inc/cpcskeymap.h Mon May 03 12:24:20 2010 +0300 @@ -90,7 +90,7 @@ /** * Construct mappings between keys and characters. */ - void ContructKeyboardMappingsL(); + TBool ContructKeyboardMappings(); /** * Returns a list of languages installed on the phone. @@ -111,8 +111,6 @@ 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) diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/contactsmodel/cntplsql/inc/pltables.h --- a/phonebookengines/contactsmodel/cntplsql/inc/pltables.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/inc/pltables.h Mon May 03 12:24:20 2010 +0300 @@ -339,15 +339,9 @@ 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; @@ -360,6 +354,8 @@ void DeleteFromAllTablesL(TContactItemId aContactId, TBool& aLowDiskErrorOccurred) const; + QList FillTableList() const; + // Return next table's name, ownership is transferred HBufC* GetTableNameL(QList& aTables) const; diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/contactsmodel/cntplsql/src/cpcskeymap.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cpcskeymap.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/src/cpcskeymap.cpp Mon May 03 12:24:20 2010 +0300 @@ -18,6 +18,11 @@ #include "cpcskeymap.h" #if defined(USE_ORBIT_KEYMAP) + +// If defined, only the currently used language's keymap is used +#define USE_ONLY_DEFAULT_LANG_KEYMAP + + #include #include #include @@ -147,7 +152,7 @@ // ---------------------------------------------------------------------------- CPcsKeyMap::CPcsKeyMap() : iKeyMapping() - { + { for (TInt i = 0; i < KAmountOfKeys; ++i) { iKeyMapping << QString(""); @@ -159,24 +164,43 @@ // ---------------------------------------------------------------------------- void CPcsKeyMap::ConstructL() { - ContructKeyboardMappingsL(); + TBool ok(EFalse); + TInt err(KErrNone); + QT_TRYCATCH_ERROR(err, ok = ContructKeyboardMappings()); + if (err != KErrNone) + { + PRINT1(_L("ContructKeyboardMappings threw exception, err=%d"), err); + User::Leave(err); + } + if (!ok) + { + PRINT(_L("ContructKeyboardMappings returns error")); + User::Leave(KErrGeneral); + } } // ---------------------------------------------------------------------------- -// CPcsKeyMap::ContructKeyboardMappingsL +// CPcsKeyMap::ContructKeyboardMappings // Fetch keymap for every language/country pair present. // 10.1 only has virtual 12 key ITU-T keyboard // ---------------------------------------------------------------------------- -void CPcsKeyMap::ContructKeyboardMappingsL() +TBool CPcsKeyMap::ContructKeyboardMappings() { - PRINT( _L("Enter CPcsKeyMap::ContructKeyboardMappingsL") ); + PRINT( _L("Enter CPcsKeyMap::ContructKeyboardMappings") ); #if defined(_DEBUG) TInt count(0); #endif - QList languages = AvailableLanguages(); - // Calling HbKeymapFactory::keymap() causes no memory exception after + TInt err(KErrNone); + QList languages; +#if defined(USE_ONLY_DEFAULT_LANG_KEYMAP) + HbInputLanguage inputLanguage(QLocale::system().language()); + languages << inputLanguage; +#else + languages = AvailableLanguages(); +#endif + // 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() @@ -191,19 +215,15 @@ for (TInt lang = 0; lang < handleMaxLanguages; ++lang) { - PRINT1( _L("handle language %d"), languages[lang].language() ); // test +// 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 + HbKeymapFactory::instance()->keymap(languages[lang].language(), + languages[lang].variant()); if (keymap) { for (TInt key = EKey1; key <= EKey0; ++key) @@ -213,7 +233,7 @@ if (!mappedKey) { PRINT1(_L("Mapped key not found, key(%d)"), KeyIdToNumber(key)); - User::Leave(KErrNotFound); + return EFalse; } // Get both upper and lowercase letters const QString lowerCase = mappedKey->characters(HbModifierNone); // e.g. "abc2.." @@ -244,14 +264,15 @@ } else { - PRINT(_L("CPcsKeyMap: keymap not found")); + PRINT(_L("CPcsKeyMap::ContructKeyboardMapping keymap not found")); } } } #if defined(_DEBUG) - PRINT1( _L("End CPcsKeyMap::ContructKeyboardMappingsL key map has %d chars"), count ); + PRINT1( _L("End CPcsKeyMap::ContructKeyboardMappings keymap has %d chars"), count ); #endif + return ETrue; } // ---------------------------------------------------------------------------- @@ -263,23 +284,26 @@ { PRINT( _L("Enter CPcsKeyMap::AvailableLanguages") ); - QLocale locale; - QLocale::Language currentLanguage = locale.language(); + QList languages = HbKeymapFactory::availableLanguages(); + +#if 0 // This code would make sure the default language is at the beginning of + // list of available languages. But since there is resource leak, the code + // is currently commented out until the leak is fixed. + QLocale::Language currentLanguage = QLocale::system().language(); if (!IsLanguageSupported(currentLanguage)) { PRINT( _L("current lang not supported, use english") ); //test currentLanguage = QLocale::English; } - HbInputLanguage defaultLanguage(currentLanguage); - - QList languages = HbKeymapFactory::availableLanguages(); + HbInputLanguage defaultLanguage(currentLanguage); 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); + languages.prepend(defaultLanguage); // THIS LEAKS RESOURCES! +#endif PRINT1( _L("End CPcsKeyMap::AvailableLanguages found %d languages"), languages.count() ); @@ -359,25 +383,6 @@ } 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() { diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/contactsmodel/cntplsql/src/cpplpredictivesearchtable.cpp --- a/phonebookengines/contactsmodel/cntplsql/src/cpplpredictivesearchtable.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookengines/contactsmodel/cntplsql/src/cpplpredictivesearchtable.cpp Mon May 03 12:24:20 2010 +0300 @@ -75,6 +75,7 @@ return self; } + /** Destructor */ @@ -242,8 +243,8 @@ RDebug::Print(_L("CPplPredictiveSearchTable::ConstructL")); // Using dummy table names here - TCntSqlStatementType insertType( EInsert, KSqlContactPredSearchTable0 ); - TCntSqlStatementType deleteType( EDelete, KSqlContactPredSearchTable0 ); + TCntSqlStatementType insertType(EInsert, KSqlContactPredSearchTable0); + TCntSqlStatementType deleteType(EDelete, KSqlContactPredSearchTable0); // Insert new record // INSERT INTO predictivesearchX (X=0..9) @@ -251,20 +252,20 @@ // VALUES (contact_id value, nbr value, nbr2 value, nbr3 value, nbr4 value, // first_name value, last_name value); iInsertStmnt = TSqlProvider::GetSqlStatementL(insertType); - iInsertStmnt->SetParamL( KPredSearchContactId, - 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 ); + iInsertStmnt->SetParamL(KPredSearchContactId, + 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() + @@ -312,8 +313,13 @@ HBufC* lastName(NULL); // owned GetFieldsLC(aItem, &firstNameAsNbr, &lastNameAsNbr, &firstName, &lastName); - QStringList numericTokens = GetNumericTokens(firstNameAsNbr, lastNameAsNbr); - QList tables = DetermineTables(numericTokens); + QStringList numericTokens; + QList tables; + QT_TRYCATCH_LEAVING({ + numericTokens = GetNumericTokens(firstNameAsNbr, lastNameAsNbr); + tables = DetermineTables(numericTokens); + }); + HBufC* tableName(NULL); while ((tableName = GetTableNameL(tables)) != NULL) { @@ -332,7 +338,8 @@ &KPredSearchNameAsNumber4Param}; for (TInt i = 0; i < numericTokens.count(); ++i) { - quint64 hex = ConvertToHex(numericTokens[i]); + quint64 hex(0); + QT_TRYCATCH_LEAVING(hex = ConvertToHex(numericTokens[i])); if (hex == KConversionError) { User::Leave(KErrArgument); @@ -347,31 +354,32 @@ if (firstName) { - User::LeaveIfError( stmnt.BindText( - User::LeaveIfError( stmnt.ParameterIndex( KPredSearchFirstNameParam ) ), - *firstName ) ); + User::LeaveIfError(stmnt.BindText( + User::LeaveIfError(stmnt.ParameterIndex(KPredSearchFirstNameParam)), + *firstName)); } if (lastName) { - User::LeaveIfError( stmnt.BindText( - User::LeaveIfError( stmnt.ParameterIndex( KPredSearchLastNameParam ) ), - *lastName ) ); + User::LeaveIfError(stmnt.BindText( + User::LeaveIfError(stmnt.ParameterIndex(KPredSearchLastNameParam)), + *lastName)); } RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL execute SQL statement")); // Execute the SQL statement - User::LeaveIfError( stmnt.Exec() ); - CleanupStack::PopAndDestroy( &stmnt ); + User::LeaveIfError(stmnt.Exec()); + CleanupStack::PopAndDestroy(&stmnt); } - CleanupStack::PopAndDestroy( lastNameAsNbr ); - CleanupStack::PopAndDestroy( lastName ); - CleanupStack::PopAndDestroy( firstNameAsNbr ); - CleanupStack::PopAndDestroy( firstName ); + CleanupStack::PopAndDestroy(lastNameAsNbr); + CleanupStack::PopAndDestroy(lastName); + CleanupStack::PopAndDestroy(firstNameAsNbr); + CleanupStack::PopAndDestroy(firstName); RDebug::Print(_L("CPplPredictiveSearchTable::WriteToDbL ends")); } + void CPplPredictiveSearchTable::GetFieldsLC(const CContactItem& aItem, HBufC** aFirstNameAsNbr, HBufC** aLastNameAsNbr, @@ -433,24 +441,6 @@ *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 { @@ -468,35 +458,6 @@ 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". @@ -523,16 +484,19 @@ } } + TBool CPplPredictiveSearchTable::IsValidChar(TInt aChar) const { return (aChar >= '0' && aChar <= '9'); } + TBool CPplPredictiveSearchTable::IsValidChar(QChar aChar) const { return (aChar >= '0' && aChar <= '9'); } + // 1. get first token of LN // 2. get first token of FN // 3. get second token of LN @@ -565,6 +529,7 @@ return tokens; } + void CPplPredictiveSearchTable::GetNextToken(QStringList& aSource, QStringList& aDestination) const { @@ -576,17 +541,13 @@ } } + 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; - } + QT_TRYCATCH_LEAVING(tables = FillTableList()); HBufC* tableName(NULL); while ((tableName = GetTableNameL(tables)) != NULL) @@ -626,6 +587,20 @@ } } + +QList CPplPredictiveSearchTable::FillTableList() const + { + QList tables; + const TInt KLargestKey = '9'; + for (TInt i = '0'; i <= KLargestKey; ++i) + { + TChar ch = i; + tables << ch; + } + return tables; + } + + HBufC* CPplPredictiveSearchTable::GetTableNameL(QList& aTables) const { HBufC* tableName(NULL); @@ -645,6 +620,7 @@ 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 diff -r 76a2435edfd4 -r de1630741fbe phonebookengines/contactsmodel/group/backup_registration.xml --- a/phonebookengines/contactsmodel/group/backup_registration.xml Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookengines/contactsmodel/group/backup_registration.xml Mon May 03 12:24:20 2010 +0300 @@ -1,7 +1,7 @@ - -]> - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_mono_contact_all.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_mono_contact_all.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_mono_details.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_mono_details.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ - - - -]> - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_mono_group.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_mono_group.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_mono_person_activitystream.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_mono_person_activitystream.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_mono_person_history.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_mono_person_history.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_mono_plus.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_mono_plus.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_mono_refresh.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_mono_refresh.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ - - - -]> - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_mono_search.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_mono_search.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_small_assistant.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_small_assistant.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_small_car.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_small_car.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_small_email.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_small_email.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_small_fax.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_small_fax.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_small_internet.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_small_internet.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_small_landline.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_small_landline.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_small_location.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_small_location.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_small_mobile.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_small_mobile.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/icons/qtg_small_pager.svg --- a/phonebookui/pbkcommonui/resources/icons/qtg_small_pager.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_indi_ai_nt_birthday.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_indi_ai_nt_birthday.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_indi_ai_nt_camera.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_indi_ai_nt_camera.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_empty.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_empty.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_address.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_address.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_assistant.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_assistant.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_car.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_car.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_chat.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_chat.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_date.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_date.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_email.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_email.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_fax.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_fax.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_mobile.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_mobile.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_note.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_note.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_pager.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_pager.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_phone.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_phone.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_sip.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_sip.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_swis.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_swis.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_url.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_url.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_voip.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_nrtyp_voip.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_pb_comm_call_large.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_pb_comm_call_large.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_pb_comm_email_large.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_pb_comm_email_large.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_pb_comm_message_large.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_pb_comm_message_large.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_pb_thumb_unknown.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_pb_thumb_unknown.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/images/qgn_prop_tutor_gallery.svg --- a/phonebookui/pbkcommonui/resources/images/qgn_prop_tutor_gallery.svg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/pbkcommonui.qrc --- a/phonebookui/pbkcommonui/resources/pbkcommonui.qrc Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/pbkcommonui.qrc Mon May 03 12:24:20 2010 +0300 @@ -1,29 +1,31 @@ - - 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 - contacts_favorite.docml - contacts_favmember.docml - contacts_collections.docml + + edit_button_pressed.fxml + edit_button_released.fxml + contacts_actions.docml + contacts_contactcard.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 + contacts_favorite.docml + contacts_favmember.docml + contacts_collections.docml + contacts_groupmembers.docml + contacts_detail_editor.docml icons/pickerIcon.jpg icons/pin.png - style/cnteditviewdetailitem.widgetml - style/cnteditviewdetailitem.css + style/cnteditviewlistitem.hblistviewitem.widgetml + style/cnteditviewlistitem.css style/cnteditviewheadingitem.css style/cnteditviewheadingitem.widgetml style/cnteditviewdetailitem_color.css diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.css --- a/phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.css Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.css Mon May 03 12:24:20 2010 +0300 @@ -1,8 +1,3 @@ -CntContactCardDetailItem[icon][primaryText][!text][!valueText]{ - layout:customLayoutOneRow; -} - - CntContactCardDetailItem{ layout:customLayout; } @@ -18,12 +13,6 @@ text-align:left; } -CntContactCardDetailItem::primaryText{ - text-height:var(hb-param-text-height-primary); - font-variant:primary; - text-align:left; -} - CntContactCardDetailItem::valueText{ text-height:var(hb-param-text-height-secondary); font-variant:secondary; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.widgetml --- a/phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.widgetml Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cntcontactcarddetailitem.widgetml Mon May 03 12:24:20 2010 +0300 @@ -1,5 +1,4 @@ - @@ -22,26 +21,5 @@ - - - - - - - - - - - - - - - - - - - - - - + diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.css --- a/phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.css Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.css Mon May 03 12:24:20 2010 +0300 @@ -6,6 +6,18 @@ layout:layout_three_rows; } +CntContactCardHeadingItem[primary_text][!secondary_text][!marquee_item][!first_line_text][!second_line_text]:landscape{ + layout:layout_one_row-landscape; +} + +CntContactCardHeadingItem[first_line_text][secondary_text][marquee_item][!primary_text][!second_line_text]:landscape{ + layout:layout_three_rows-landscape; +} + +CntContactCardHeadingItem:landscape{ + layout:layout_two_rows-landscape; +} + CntContactCardHeadingItem{ layout:layout_two_rows; } @@ -45,6 +57,11 @@ text-align:left; } +CntContactCardHeadingItem::secondary_icon{ + fixed-height: var(hb-param-graphic-size-primary-small); + fixed-width: var(hb-param-graphic-size-primary-small); +} + CntContactCardHeadingItem::background{ left:0.0un; right:0.0un; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.widgetml --- a/phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.widgetml Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cntcontactcardheadingitem.widgetml Mon May 03 12:24:20 2010 +0300 @@ -7,8 +7,8 @@ - - + + @@ -18,6 +18,23 @@ + + + + + + + + + + + + + + + + + @@ -30,8 +47,8 @@ - - + + @@ -55,6 +72,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -67,8 +119,8 @@ - - + + @@ -91,5 +143,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.css --- a/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.css Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.css Mon May 03 12:24:20 2010 +0300 @@ -10,6 +10,18 @@ layout:customLayoutNoText; } +CntEditViewHeadingItem[text][second_text]:landscape{ + layout:customLayout-landscape; +} + +CntEditViewHeadingItem[text][!second_text]:landscape{ + layout:customLayoutNoSecondText-landscape; +} + +CntEditViewHeadingItem[!text][second_text]:landscape{ + layout:customLayoutNoText-landscape; +} + CntEditViewHeadingItem::icon{ fixed-width:var(hb-param-graphic-size-primary-large); fixed-height:var(hb-param-graphic-size-primary-large); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.widgetml --- a/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.widgetml Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cnteditviewheadingitem.widgetml Mon May 03 12:24:20 2010 +0300 @@ -64,4 +64,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cnteditviewlistitem.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/style/cnteditviewlistitem.css Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,44 @@ +HbListViewItem[layoutName="editviewlist"][modelItemType="StandardItem"]{ + layout:custom-1; +} + +HbListViewItem[layoutName="editviewlist"][modelItemType="StandardItem"][!text-2]{ + layout:custom-2; +} + +HbListViewItem[layoutName="editviewlist"][modelItemType="StandardItem"][!icon-1]{ + layout:custom-3; +} + +HbListViewItem[layoutName="editviewlist"][modelItemType="SeparatorItem"]{ + layout:custom-separator-1; +} + +HbListViewItem::text-1[layoutName="editviewlist"][modelItemType="SeparatorItem"]{ + text-height: var(hb-param-text-height-secondary); + font-variant: secondary; + text-align: left; +} + +HbListViewItem::icon-1[layoutName="editviewlist"]{ + fixed-width:var(hb-param-graphic-size-primary-small); + fixed-height:var(hb-param-graphic-size-primary-small); +} + +HbListViewItem::text-1[layoutName="editviewlist"][modelItemType="StandardItem"]{ + text-height:var(hb-param-text-height-secondary); + font-variant:secondary; + text-align:left; +} + +HbListViewItem::text-1[layoutName="editviewlist"][modelItemType="StandardItem"][!text-2]{ + text-height:var(hb-param-text-height-primary); + font-variant:primary; + text-align:left; +} + +HbListViewItem::text-2[layoutName="editviewlist"]{ + text-height:var(hb-param-text-height-primary); + font-variant:primary; + text-align:left; +} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cnteditviewlistitem.hblistviewitem.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/resources/style/cnteditviewlistitem.hblistviewitem.widgetml Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.css --- a/phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.css Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.css Mon May 03 12:24:20 2010 +0300 @@ -47,3 +47,10 @@ CntHistoryViewItemWidget::frame{ border-width: var(hb-param-background-list-main); } + +CntHistoryViewItemWidget::newItem{ + left:-0.25un; + top:-1.0un; + bottom:0.5un; + size-policy:fixed preferred; +} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.widgetml --- a/phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.widgetml Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/resources/style/cnthistoryviewitemwidget.widgetml Mon May 03 12:24:20 2010 +0300 @@ -19,7 +19,11 @@ - + + + + + @@ -28,7 +32,7 @@ - + @@ -61,7 +65,11 @@ - + + + + + @@ -99,7 +107,7 @@ - + diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntaction.cpp --- a/phonebookui/pbkcommonui/src/cntaction.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntaction.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,7 +17,8 @@ #include "cntaction.h" CntAction::CntAction( QString aAction ) : QObject(), -mAction( aAction ) +mAction( aAction ), +mContactAction( NULL ) { } @@ -32,19 +33,19 @@ mContactAction = QContactAction::action( all.first() ); if ( mContactAction ) { - connect(mContactAction, SIGNAL(progress(QContactAction::Status, const QVariantMap&)), - this, SLOT(progress(QContactAction::Status, const QVariantMap&))); + connect(mContactAction, SIGNAL(progress(QContactAction::State, const QVariantMap&)), + this, SLOT(progress(QContactAction::State, const QVariantMap&))); mContactAction->invokeAction( aContact, aDetail ); } } -void CntAction::progress( QContactAction::Status status, const QVariantMap& result ) +void CntAction::progress( QContactAction::State status, const QVariantMap& result ) { Q_UNUSED(result); switch(status) { - case QContactAction::Finished: - case QContactAction::FinishedWithError: + case QContactAction::FinishedState: + case QContactAction::FinishedWithErrorState: emit actionExecuted( this ); break; default: diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntactions.cpp --- a/phonebookui/pbkcommonui/src/cntactions.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +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 "cntactions.h" - -#include -#include - - -const char *CNT_ACTIONS_XML = ":/xml/contacts_actions.docml"; - -CntActions::CntActions(QObject *aParent) -{ - setParent(aParent); - mActionList.clear(); - mStringActionMap.clear(); - - bool ok = false; - mDocumentLoader.load(CNT_ACTIONS_XML, &ok); - if (!ok) - { - qFatal("Unable to read :/xml/contacts_actions.docml"); - } -} - - -CntActions::~CntActions() -{ - -} - -HbAction *CntActions::baseAction(const QString& aName) -{ - if (mStringActionMap.contains(aName)) - { - return mStringActionMap.value(aName); - } - - HbAction *baseAction = qobject_cast(mDocumentLoader.findObject(aName)); - - if (baseAction) - { - mStringActionMap.insert(aName, baseAction); - } - - return baseAction; -} - -void CntActions::addActionToToolBar(HbAction *aAction, HbToolBar *aToolBar) -{ - aToolBar->addAction(aAction); -} - -void CntActions::addActionsToToolBar(HbToolBar *aToolBar) -{ - for (int i=0;iaddAction(mActionList[i]); - } -} - -void CntActions::addActionsToMenu(HbMenu *aMenu) -{ - for (int i=0;iaddAction(mActionList[i]); - } -} - -void CntActions::addActionToMenu(HbAction *aAction, HbMenu *aMenu) -{ - aMenu->addAction(aAction); -} - -QList &CntActions::actionList() -{ - return mActionList; -} - -void CntActions::clearActionList() -{ - mActionList.clear(); -} - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntaddresseditorview.cpp --- a/phonebookui/pbkcommonui/src/cntaddresseditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,230 +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 "cntaddresseditorview.h" -#include "cnteditordataviewitem.h" -#include - -CntAddressEditorView::CntAddressEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("txt_phob_subtitle_edit_address_details")); -} - -CntAddressEditorView::~CntAddressEditorView() -{ - -} - -void CntAddressEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - - if (mDetailList.at(i)->value(QContactAddress::FieldPostOfficeBox).isEmpty() && - mDetailList.at(i)->value(QContactAddress::FieldStreet).isEmpty() && - mDetailList.at(i)->value(QContactAddress::FieldPostcode).isEmpty() && - mDetailList.at(i)->value(QContactAddress::FieldLocality).isEmpty() && - mDetailList.at(i)->value(QContactAddress::FieldRegion).isEmpty() && - mDetailList.at(i)->value(QContactAddress::FieldCountry).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -void CntAddressEditorView::initializeForm() -{ - QList addressDetails = mContact->details(); - QContactAddress *address = 0; - QContactAddress *addressHome = 0; - QContactAddress *addressWork = 0; - - // we allow one address detail of each type: no context, home and work - if (addressDetails.count() > 0) - { - for(int i = 0;i < addressDetails.count();i++) - { - QString context; - if (addressDetails.at(i).contexts().count()) - { - context = addressDetails.at(i).contexts().at(0); - } - - if (context.isEmpty() && address == 0) - { - address = new QContactAddress(addressDetails.at(i)); - mDetailList.append(address); - } - else if (context == QContactDetail::ContextHome && addressHome == 0) - { - addressHome = new QContactAddress(addressDetails.at(i)); - mDetailList.append(addressHome); - } - else if (context == QContactDetail::ContextWork && addressWork == 0) - { - addressWork = new QContactAddress(addressDetails.at(i)); - mDetailList.append(addressWork); - } - } - } - else - { - address = new QContactAddress(); - mDetailList.append(address); - - addressHome = new QContactAddress(); - addressHome->setContexts(QContactDetail::ContextHome); - mDetailList.append(addressHome); - - addressWork = new QContactAddress(); - addressWork->setContexts(QContactDetail::ContextWork); - mDetailList.append(addressWork); - } - - // check if any of the address details isn't set yet - if (address == 0) - { - address = new QContactAddress(); - mDetailList.append(address); - } - if (addressHome == 0) - { - addressHome = new QContactAddress(); - addressHome->setContexts(QContactDetail::ContextHome); - mDetailList.append(addressHome); - } - if (addressWork == 0) - { - addressWork = new QContactAddress(); - addressWork->setContexts(QContactDetail::ContextWork); - mDetailList.append(addressWork); - } - - HbDataFormModelItem *addressType = - formModel()->appendDataFormGroup(hbTrId("txt_phob_list_address"), formModel()->invisibleRootItem()); - - //Details for addressDefault - CntEditorDataModelItem *item = new CntEditorDataModelItem(*address, QContactAddress::FieldStreet, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_street")); - formModel()->appendDataFormItem(item, addressType); - - item = new CntEditorDataModelItem(*address, QContactAddress::FieldPostOfficeBox, CNT_POBOX_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("P.O. Box")); - item->setTextFilter(HbPhoneNumberFilter::instance()); - formModel()->appendDataFormItem(item, addressType); - - item = new CntEditorDataModelItem(*address, QContactAddress::FieldPostcode, CNT_POBOX_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_post_code")); - item->setTextFilter(HbPhoneNumberFilter::instance()); - formModel()->appendDataFormItem(item, addressType); - - item = new CntEditorDataModelItem(*address, QContactAddress::FieldLocality, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_city")); - formModel()->appendDataFormItem(item, addressType); - - item = new CntEditorDataModelItem(*address, QContactAddress::FieldRegion, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_province")); - formModel()->appendDataFormItem(item, addressType); - - item = new CntEditorDataModelItem(*address, QContactAddress::FieldCountry, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_country")); - formModel()->appendDataFormItem(item, addressType); - - //Details for addressHome - HbDataFormModelItem *addressHomeType = - formModel()->appendDataFormGroup(hbTrId("txt_phob_subhead_address_home"), formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*addressHome, QContactAddress::FieldStreet, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("Street (home)")); - formModel()->appendDataFormItem(item, addressHomeType); - - item = new CntEditorDataModelItem(*addressHome, QContactAddress::FieldPostOfficeBox, CNT_POBOX_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("P.O. Box (home)")); - item->setTextFilter(HbPhoneNumberFilter::instance()); - formModel()->appendDataFormItem(item, addressHomeType); - - item = new CntEditorDataModelItem(*addressHome, QContactAddress::FieldPostcode, CNT_POBOX_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("Postal code (home)")); - item->setTextFilter(HbPhoneNumberFilter::instance()); - formModel()->appendDataFormItem(item, addressHomeType); - - item = new CntEditorDataModelItem(*addressHome, QContactAddress::FieldLocality, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("City (home)")); - formModel()->appendDataFormItem(item, addressHomeType); - - item = new CntEditorDataModelItem(*addressHome, QContactAddress::FieldRegion, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("Region (home)")); - formModel()->appendDataFormItem(item, addressHomeType); - - item = new CntEditorDataModelItem(*addressHome, QContactAddress::FieldCountry, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("Country (home)")); - formModel()->appendDataFormItem(item, addressHomeType); - - //Details for addressWork - HbDataFormModelItem *addressWorkType = - formModel()->appendDataFormGroup(hbTrId("txt_phob_subhead_address_work"), formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*addressWork, QContactAddress::FieldStreet, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("Street (work)")); - formModel()->appendDataFormItem(item, addressWorkType); - - item = new CntEditorDataModelItem(*addressWork, QContactAddress::FieldPostOfficeBox, CNT_POBOX_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("P.O. Box (work)")); - item->setTextFilter(HbPhoneNumberFilter::instance()); - formModel()->appendDataFormItem(item, addressWorkType); - - item = new CntEditorDataModelItem(*addressWork, QContactAddress::FieldPostcode, CNT_POBOX_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("Postal code (work)")); - item->setTextFilter(HbPhoneNumberFilter::instance()); - formModel()->appendDataFormItem(item, addressWorkType); - - item = new CntEditorDataModelItem(*addressWork, QContactAddress::FieldLocality, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("City (work)")); - formModel()->appendDataFormItem(item, addressWorkType); - - item = new CntEditorDataModelItem(*addressWork, QContactAddress::FieldRegion, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("Region (work)")); - formModel()->appendDataFormItem(item, addressWorkType); - - item = new CntEditorDataModelItem(*addressWork, QContactAddress::FieldCountry, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("Country (work)")); - formModel()->appendDataFormItem(item, addressWorkType); - - // Define which address type is expanded, by default normal address is opened - if (mParamString.isEmpty()) - { - dataForm()->setExpanded(formModel()->indexFromItem(addressType), true); - // set focus to street detail's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(addressType->childAt(0))))->focusLineEdit(); - } - else if (mParamString == QContactDetail::ContextHome) - { - dataForm()->setExpanded(formModel()->indexFromItem(addressHomeType), true); - // set focus to street detail's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(addressHomeType->childAt(0))))->focusLineEdit(); - } - else if (mParamString == QContactDetail::ContextWork) - { - dataForm()->setExpanded(formModel()->indexFromItem(addressWorkType), true); - // set focus to street detail's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(addressWorkType->childAt(0))))->focusLineEdit(); - } -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntaddressmodel.cpp --- a/phonebookui/pbkcommonui/src/cntaddressmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntaddressmodel.cpp Mon May 03 12:24:20 2010 +0300 @@ -21,9 +21,9 @@ CntAddressModel::CntAddressModel( QContact* aContact ): CntDetailEditorModel( aContact ), -mAddress(0), -mAddressHome(0), -mAddressWork(0) +mAddress(NULL), +mAddressHome(NULL), +mAddressWork(NULL) { HbDataFormModelItem* address = appendDataFormGroup(qtTrId("Address"), invisibleRootItem()); HbDataFormModelItem* addressHome = appendDataFormGroup(qtTrId("Address (home)"), invisibleRootItem()); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntaddressviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntaddressviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntaddressviewitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -36,9 +36,9 @@ CntAddressViewItem::CntAddressViewItem(QGraphicsItem* aParent) : /*CntDetailViewItem(aParent),*/ HbDataFormViewItem(aParent), - mRequest(0), - mAppManager(0), - mSenderButton(0) + mRequest(NULL), + mAppManager(NULL), + mSenderButton(NULL) { } @@ -64,7 +64,6 @@ 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"); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntbasedetaileditorview.cpp --- a/phonebookui/pbkcommonui/src/cntbasedetaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +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 "cntbasedetaileditorview.h" -#include "cnteditordataviewitem.h" - -#include - -const char *CNT_EDITOR_XML = ":/xml/contacts_editor.docml"; - -CntBaseDetailEditorView::CntBaseDetailEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseView(viewManager, parent), - mContact(0), - mDataForm(0), - mDataFormModel(0), - mHeader(0) -{ - bool ok = false; - ok = loadDocument(CNT_EDITOR_XML); - - if (ok) - { - QGraphicsWidget *content = findWidget(QString("content")); - setWidget(content); - } - else - { - qFatal("Unable to read :/xml/contacts_editor.docml"); - } -} - -CntBaseDetailEditorView::~CntBaseDetailEditorView() -{ - for(int i = 0;i < mDetailList.count();i++) - { - delete mDetailList.at(i); - } - delete mContact; - delete mDataFormModel; - delete mDataForm; -} - -void CntBaseDetailEditorView::aboutToCloseView() -{ - CntViewParameters args;//( CntViewParameters::editView ); - args.setSelectedContact( *mContact ); - viewManager()->back( args ); - /* - viewManager()->previousViewParameters().setSelectedContact(*mContact); - viewManager()->onActivatePreviousView(); - */ -} - -/*! -Add actions to options menu -*/ -void CntBaseDetailEditorView::addMenuItems() -{ - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:discardchanges"); - actions()->addActionsToMenu(menu()); - - connect(actions()->baseAction("cnt:discardchanges"), SIGNAL(triggered()), - this, SLOT(cancelChanges())); -} - -/*! -Cancel all changes made to the details and return to main edit view -*/ -void CntBaseDetailEditorView::cancelChanges() -{ - CntViewParameters args;//( CntViewParameters::editView ); - args.setSelectedContact( *mContact ); - viewManager()->back( args ); - /* - viewManager()->previousViewParameters().setSelectedContact(*mContact); - viewManager()->onActivatePreviousView(); - */ -} - -HbDataFormModel *CntBaseDetailEditorView::formModel() -{ - if (!mDataFormModel) - { - mDataFormModel = new HbDataFormModel(); - } - return mDataFormModel; -} - -HbDataForm *CntBaseDetailEditorView::dataForm() -{ - if (!mDataForm) - { - mDataForm = static_cast(findWidget(QString("dataForm"))); - mDataForm->setItemRecycling(true); - CntEditorDataViewItem *viewItem = new CntEditorDataViewItem(this); - mDataForm->setModel(formModel(), viewItem); - } - return mDataForm; -} - -HbGroupBox *CntBaseDetailEditorView::header() -{ - if (!mHeader) - { - mHeader = static_cast(findWidget(QString("headerBox"))); - } - return mHeader; -} - -void CntBaseDetailEditorView::setHeader(QString headerText) -{ - header()->setHeading(headerText); -} - -void CntBaseDetailEditorView::activateView(const CntViewParameters &viewParameters) -{ - mContact = new QContact(viewParameters.selectedContact()); - mParamString = viewParameters.selectedAction(); - dataForm(); - initializeForm(); - if (mParamString == "add") - { - addDetail(); - } -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntbaselistview.cpp --- a/phonebookui/pbkcommonui/src/cntbaselistview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,385 +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 "cntbaselistview.h" -#include "qtpbkglobal.h" - -#include -#include -#include -#include -#include - -const char *CNT_LISTVIEW_UI_XML = ":/xml/contacts_list.docml"; - -/*! -\class CntBaseListView -\brief - -This class provides common functionality to all views that use HbListView component. View contains banner and a listview that shows actual data. -There is also toolbar and menu for navigating between different views. - -*/ - -/*! -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) - -*/ -CntBaseListView::CntBaseListView(CntViewManager *viewManager, QGraphicsItem *parent) - : CntBaseView(viewManager, parent), - mBanner(0), - mHasBanner(true), - mListView(0), - mListLayout(0) -{ - bool ok = false; - ok = loadDocument(CNT_LISTVIEW_UI_XML); - if (!ok) - { - qFatal("Unable to read :/xml/contacts_list.docml"); - } - -} - -/*! -Destructor -*/ -CntBaseListView::~CntBaseListView() -{ - -} - - -/*! -[Virtual] Creates UI elements in this view -*/ -void CntBaseListView::setupView() -{ - addItemsToLayout(); - CntBaseView::setupView(); -} - -void CntBaseListView::activateView(const CntViewParameters &viewParameters) -{ - Q_UNUSED(viewParameters) - setDataModel(); -} - -/*! -Adds created controls to the layout -*/ -void CntBaseListView::addItemsToLayout() -{ - listView(); - setWidget(findWidget(QString("container"))); -} - -/*! -Set text for the banner control -*/ -void CntBaseListView::setBannerName(QString aBannerName) -{ - mBannerName = aBannerName; - // add banner - if (isBannerVisible()) - { - listLayout()->insertItem(0,banner()); - banner()->setHeading(aBannerName); - } - -} - -/*! -return banner control text -*/ -QString CntBaseListView::bannerName() -{ - return mBannerName; -} - -/*! -\return pointer to HbLabel (banner object) -*/ -HbGroupBox *CntBaseListView::banner() -{ - if ((!mBanner) && isBannerVisible()) - { - mBanner = new HbGroupBox(this); - } - return mBanner; -} - -/*! -\return pointer to listLayout component -*/ -QGraphicsLinearLayout *CntBaseListView::listLayout() -{ - QGraphicsWidget *w = findWidget(QString("container")); - return static_cast(w->layout()); -} - -/*! -returns true if banner is set to be visible. -*/ -bool CntBaseListView::isBannerVisible() -{ - return mHasBanner; -} - -/*! -set banner visibility. Currently in use only in class construction. TODO: expand to hide control if needed. -*/ -void CntBaseListView::setBannerVisibility(bool aVisible) -{ - mHasBanner = aVisible; -} - - -/*! -[Virtual] \return pointer to HbListView component -*/ -HbListView *CntBaseListView::listView() -{ - if ( mListView==0 ) - { - mListView = static_cast(findWidget(QString("listView"))); - - HbListViewItem *prototype = mListView->listItemPrototype(); - prototype->setGraphicsSize(HbListViewItem::Thumbnail); - - mListView->setFrictionEnabled(true); - mListView->setScrollingStyle(HbScrollArea::PanOrFlick); - - HbFrameBackground frame; - frame.setFrameGraphicsName("qtg_fr_list_normal"); - frame.setFrameType(HbFrameDrawer::NinePieces); - mListView->itemPrototypes().first()->setDefaultFrame(frame); - - connect(mListView, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), - this, SLOT(onLongPressed(HbAbstractViewItem*,QPointF))); - - connect(mListView, SIGNAL(activated (const QModelIndex&)), - this, SLOT(onListViewActivated(const QModelIndex&))); - - } - return mListView; -} - -/*! -Called when a list item is longpressed -*/ -void CntBaseListView::onLongPressed (HbAbstractViewItem *item, const QPointF &coords) -{ - QModelIndex index = item->modelIndex(); - - // Normal contact - if (contactModel()->contact(index).localId() != contactManager()->selfContactId()) - { - HbMenu *menu = new HbMenu(); - HbAction *callAction = 0; - HbAction *smsAction = 0; - HbAction *emailAction = 0; - HbAction *openAction = 0; - HbAction *editAction = 0; - HbAction *deleteAction = 0; - - QContact contact = contactModel()->contact(index); - QList actionDescriptors = contact.availableActions(); - QStringList actions; - for (int i = 0;i < actionDescriptors.count();i++) - { - actions << actionDescriptors.at(i).actionName(); - } - - // Call action - if (actions.contains("call", Qt::CaseInsensitive)) - { - // Create call action - QContactDetail detail = contact.preferredDetail("call"); - QContactPhoneNumber number; - - //if preferred is empty pick first phonenumber - if(detail.isEmpty()) - { - number = contact.detail(); - } - else - { - number = detail; - } - - QString detailName = mStringMapper.getMappedDetail(number.subTypes().first()); - if (!number.contexts().isEmpty()) - { - detailName += hbTrId(" %1").arg(mStringMapper.getMappedDetail(number.contexts().first())); - } - callAction = menu->addAction(hbTrId("Call %1").arg(detailName)); - } - - // SMS action - if (actions.contains("message", Qt::CaseInsensitive)) - { - // Create call action - smsAction = menu->addAction(hbTrId("txt_phob_menu_send_message")); - } - - // Email action - if (actions.contains("email", Qt::CaseInsensitive)) - { - // Create call action - QContactDetail detail = contact.preferredDetail("email"); - QContactEmailAddress email; - - //if preferred is empty pick first email address - if(detail.isEmpty()) - { - email = contact.detail(); - } - else - { - email = detail; - } - - QString detailName = hbTrId("txt_phob_menu_email"); - if (!email.contexts().isEmpty()) - { - detailName += hbTrId(" %1").arg(mStringMapper.getMappedDetail(email.contexts().first())); - } - emailAction = menu->addAction(hbTrId("Mail %1").arg(detailName)); - } - - //add separator in case actions exist - if (actions.count()) - { - menu->addSeparator(); - } - - //add open menu option - openAction = menu->addAction(hbTrId("txt_common_menu_open")); - - //add edit menu option - editAction = menu->addAction(hbTrId("txt_common_menu_edit")); - - //delete menu option - deleteAction = menu->addAction(hbTrId("Delete")); - - HbAction *selectedAction = menu->exec(coords); - - if (selectedAction) - { - if (selectedAction == callAction) - { - commands()->launchAction(contact, QContactDetail(), "call"); - } - else if (selectedAction == smsAction) - { - commands()->launchAction(contact, QContactDetail(), "message"); - } - else if (selectedAction == emailAction) - { - commands()->launchAction(contact, QContactDetail(), "email"); - } - else if (selectedAction == openAction) - { - commands()->openContact(contact); - } - else if (selectedAction == editAction) - { - commands()->editContact(contact); - } - else if (selectedAction == deleteAction) - { - commands()->deleteContact(contact); - } - } - menu->deleteLater(); - } - // MyCard (NOT empty, empty one is ignored -> no longtap menu shown for it) - else if (contactModel()->contact(index).localId() == contactManager()->selfContactId() && contactModel()->contact(index).details().count() > 4) - { - HbMenu *menu = new HbMenu(); - HbAction *openAction = 0; - HbAction *editAction = 0; - HbAction *deleteAction = 0; - - QContact contact = contactModel()->contact(index); - - //add open menu option - openAction = menu->addAction(hbTrId("txt_common_menu_open")); - - //add edit menu option - editAction = menu->addAction(hbTrId("txt_common_menu_edit")); - - //delete menu option - deleteAction = menu->addAction(hbTrId("Delete")); - - HbAction *selectedAction = menu->exec(coords); - if (selectedAction) - { - if (selectedAction == openAction) - { - commands()->openContact(contact); - } - else if (selectedAction == editAction) - { - commands()->editContact(contact); - } - else if (selectedAction == deleteAction) - { - commands()->deleteContact(contact); - } - } - menu->deleteLater(); - } -} - -/*! -Called after user clicked on the listview. -*/ -void CntBaseListView::onListViewActivated(const QModelIndex &index) -{ - if (contactModel()->contact(index).localId() == contactManager()->selfContactId() && contactModel()->contact(index).details().count() <= 4) - { - CntViewParameters viewParameters(CntViewParameters::myCardView); - viewParameters.setSelectedContact(contactModel()->contact(index)); - viewManager()->changeView(viewParameters); - } - else - { - CntViewParameters viewParameters(CntViewParameters::commLauncherView); - viewParameters.setSelectedContact(contactModel()->contact(index)); - viewManager()->changeView(viewParameters); - } -} - -/*! -[Virtual] Set model for the listview. By default we use QContactModel. Can be overridden in derived class -*/ -void CntBaseListView::setDataModel() -{ - // notice that listview is created if it doesn't exists before calling this - listView()->setModel(contactModel()); -} - - -void CntBaseListView::clearDataModelFilter() -{ - setDataModel(); -} - -// end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntbaseselectionview.cpp --- a/phonebookui/pbkcommonui/src/cntbaseselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntbaseselectionview.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,18 +17,108 @@ #include "cntbaseselectionview.h" +#include #include -#include -#include -#include +#include +#include +#include const char *CNT_SELECTION_LISTVIEW_UI_XML = ":/xml/contacts_list.docml"; -CntBaseSelectionView::CntBaseSelectionView(CntViewManager *viewManager, QGraphicsItem *parent, HbAbstractItemView::SelectionMode newMode) +CntBaseSelectionView::CntBaseSelectionView() : QObject() +{ + mDocument = new HbDocumentLoader(); + + bool ok; + mDocument->load( CNT_SELECTION_LISTVIEW_UI_XML, &ok ); + if ( !ok ) + { + qFatal( "Unable to load %S", CNT_SELECTION_LISTVIEW_UI_XML ); + } + mView = static_cast( mDocument->findWidget("view") ); + mListView = static_cast( mDocument->findWidget("listView") ); + + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect( mSoftkey, SIGNAL(triggered()), this, SLOT(closeView()) ); +} + +CntBaseSelectionView::~CntBaseSelectionView() +{ + delete mDocument; +} + +void CntBaseSelectionView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) +{ + mMgr = aMgr; + + if ( mView->navigationAction() != mSoftkey) + mView->setNavigationAction(mSoftkey); + + HbMainWindow* window = mView->mainWindow(); + if ( window ) + { + //connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); + //setOrientation(window->orientation()); + } + + QContactSortOrder sortOrderFirstName; + sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName,QContactName::FieldFirst); + sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive); + + QContactSortOrder sortOrderLastName; + sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName,QContactName::FieldLast); + sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive); + + QList sortOrders; + sortOrders.append(sortOrderFirstName); + sortOrders.append(sortOrderLastName); + + QContactDetailFilter filter; + filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + QString typeContact = QContactType::TypeContact; + filter.setValue(typeContact); + + mListModel = new MobCntModel(mMgr->contactManager(SYMBIAN_BACKEND), filter, sortOrders); + mListModel->showMyCard( false ); + + mListView->setModel( mListModel ); + + if ( aArgs.contains(ESelectionMode) ) { + mListView->setSelectionMode( static_cast(aArgs.value(ESelectionMode).toInt()) ); + } + + emit viewOpened( aArgs ); +} + +void CntBaseSelectionView::deactivate() +{ +} + +bool CntBaseSelectionView::isDefault() const +{ + return false; +} + +HbView* CntBaseSelectionView::view() const +{ + return mView; +} + +void CntBaseSelectionView::closeView() +{ + emit viewClosed(); + + CntViewParameters args; + mMgr->back( args ); +} + + +/* +CntBaseSelectionView::CntBaseSelectionView() : CntBaseView(viewManager, parent), - mListView(0), - mListLayout(0), - mSelectionMode(newMode) + mListView(NULL), + mListLayout(NULL), + mSelectionMode(HbAbstractItemView::NoSelection) { bool ok = false; ok = loadDocument(CNT_SELECTION_LISTVIEW_UI_XML); @@ -49,33 +139,28 @@ } -void CntBaseSelectionView::activateView(const CntViewParameters &viewParameters) +void CntBaseSelectionView::activateView(const CntViewParameters viewParameters) { - Q_UNUSED(viewParameters) listView()->setModel(contactModel()); + + if (viewParameters.contains(ESelectionMode)) { + mSelectionMode = static_cast(viewParameters.value(ESelectionMode).toInt()); + } + listView()->setSelectionMode(mSelectionMode); } -/*! -Adds created controls to the layout -*/ void CntBaseSelectionView::addItemsToLayout() { listView(); setWidget(findWidget(QString("container"))); } -/*! -\return pointer to listLayout component -*/ QGraphicsLinearLayout *CntBaseSelectionView::listLayout() { QGraphicsWidget *w = findWidget(QString("container")); return static_cast(w->layout()); } -/*! -\return pointer to HbListView component -*/ HbListView *CntBaseSelectionView::listView() { if (mListView==0) @@ -108,5 +193,5 @@ { return listView()->selectionModel(); } - +*/ // EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntbaseview.cpp --- a/phonebookui/pbkcommonui/src/cntbaseview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +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 "cntbaseview.h" -#include "cntmainwindow.h" -#include "cntdocumentloader.h" - -#include - -CntBaseView::CntBaseView(CntViewManager *viewManager, QGraphicsItem *parent) : - HbView(parent), - mViewManager(viewManager), - mActions(0), - mCommands(0), - 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))); - - connect(mSoftKeyBackAction, SIGNAL(triggered()), this, SLOT(aboutToCloseView())); -} - -CntBaseView::~CntBaseView() -{ - mModelProvider->release(); -} - -void CntBaseView::setupView() -{ - addToolBar(); - addMenuItems(); - addSoftkeyAction(); -} - -CntViewManager* CntBaseView::viewManager() -{ - return mViewManager; -} - -/*! -\return pointer to MobCntModel -*/ -MobCntModel *CntBaseView::contactModel() -{ - return mModelProvider->contactModel(); -} - -QContactManager *CntBaseView::contactManager() -{ - return mModelProvider->contactManager(); -} - -CntCommands *CntBaseView::commands() -{ - if (mCommands == 0) - { - mCommands = new CntCommands(*viewManager(), mModelProvider->contactManager(), - mModelProvider->contactSimManager(), this); - } - return mCommands; -} - -void CntBaseView::addSoftkeyAction() -{ - if (navigationAction() != mSoftKeyBackAction) - setNavigationAction(mSoftKeyBackAction); -} - -void CntBaseView::keyPressEvent(QKeyEvent *event) -{ - if (this == viewManager()->mainWindow()->currentView() && event->key() == Qt::Key_Yes) - { - event->accept(); - commands()->launchDialer(); - } - else if (this == viewManager()->mainWindow()->currentView() && event->key() == Qt::Key_No) - { - event->accept(); - qApp->quit(); - } - else - { - HbView::keyPressEvent(event); - } -} - -/*! -Clears toolbar items. -*/ -void CntBaseView::clearToolBar() -{ - toolBar()->clearActions(); -} - -/*! -Adds toolbar control. -*/ -void CntBaseView::addToolBar() -{ - clearToolBar(); - - //Add Action to the toolbar and set its orientation (default horizontal always) - addActionsToToolBar(); - setToolBarOrientation(); -} - -void CntBaseView::setToolBarOrientation() -{ - toolBar()->setOrientation(Qt::Horizontal); -} - -CntActions *CntBaseView::actions() -{ - if (mActions == 0) - { - mActions = new CntActions(this); - } - return mActions; -} - -bool CntBaseView::loadDocument(const char *aDocument) -{ - bool ok = false; - documentLoader().load(aDocument, &ok); - return ok; -} - -bool CntBaseView::loadDocument(const char *aDocument, const char *aSection) -{ - bool ok = false; - documentLoader().load(aDocument, aSection, &ok); - return ok; -} - -CntDocumentLoader &CntBaseView::documentLoader() -{ - return mDocumentLoader; -} - -QGraphicsWidget* CntBaseView::findWidget(const QString& aWidget) -{ - return documentLoader().findWidget(aWidget); -} - -QObject* CntBaseView::findObject(const QString& aObject) -{ - return documentLoader().findObject(aObject); -} -// end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp --- a/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,6 +16,9 @@ */ #include "cntcollectionlistmodel.h" +#include "cntextensionmanager.h" +#include +#include #include #include @@ -25,8 +28,9 @@ /*! Constructor */ -CntCollectionListModel::CntCollectionListModel(QContactManager *manager, QObject *parent) +CntCollectionListModel::CntCollectionListModel(QContactManager *manager, CntExtensionManager &extensionManager, QObject *parent) : QAbstractListModel(parent), + mExtensionManager(extensionManager), mContactManager(manager), mFavoriteGroupId(-1) { @@ -65,8 +69,11 @@ else if (role == Qt::DecorationRole) { QVariantList icons; - HbIcon icon(values[1].toString()); - icons.append(icon); + for (int i = 0;i < values[1].toStringList().count();i++) + { + HbIcon icon(values[1].toStringList().at(i)); + icons.append(icon); + } return QVariant(icons); } @@ -102,6 +109,22 @@ beginRemoveRows(parent, row, row); mDataPointer->mDataList.removeAt(row); + if (mDataPointer->mExtensions.remove(row) > 0) + { + // if extension group was deleted, refresh the indices of extension group map + QList keyList = mDataPointer->mExtensions.keys(); + qSort(keyList); + + for (int i = 0;i < keyList.count();i++) + { + if (keyList.at(i) > row) + { + CntUiGroupSupplier* groupSupplier = mDataPointer->mExtensions.take(keyList.at(i)); + mDataPointer->mExtensions.insert(keyList.at(i) - 1, groupSupplier); + } + } + } + endRemoveRows(); return true; @@ -128,6 +151,7 @@ void CntCollectionListModel::doConstruct() { initializeStaticGroups(); + initializeExtensions(); initializeUserGroups(); } @@ -158,11 +182,25 @@ QContact favoriteGroup = mContactManager->contact(mFavoriteGroupId); QContactRelationshipFilter rFilter; rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactRole(QContactRelationship::First); rFilter.setRelatedContactId(favoriteGroup.id()); - // group members and their count - QList groupMemberIds = mContactManager->contactIds(rFilter); + QContactSortOrder sortOrderFirstName; + sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldFirst); + sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive); + + QContactSortOrder sortOrderLastName; + sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldLast); + sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive); + + QList sortOrders; + sortOrders.append(sortOrderFirstName); + sortOrders.append(sortOrderLastName); + + // group members and their count + QList groupMemberIds = mContactManager->contactIds(rFilter, sortOrders); if (!groupMemberIds.isEmpty()) { @@ -188,12 +226,52 @@ } dataList.append(displayList); - dataList.append("qtg_large_favourites"); + dataList.append(QStringList("qtg_large_favourites")); dataList.append(mFavoriteGroupId); // as favorites doesn't really have a contact Id, -1 is used mDataPointer->mDataList.append(dataList); } /*! +Initialize extension groups +*/ +void CntCollectionListModel::initializeExtensions() +{ + for(int i = 0;i < mExtensionManager.pluginCount();i++) + { + CntUiGroupSupplier* groupSupplier = mExtensionManager.pluginAt(i)->groupSupplier(); + if (groupSupplier) + { + for(int j = 0;j < groupSupplier->groupCount();j++) + { + const CntUiExtensionGroup& group = groupSupplier->groupAt(j); + + QVariantList dataList; + + QStringList displayList; + displayList.append(group.name()); + displayList.append(group.extraText()); + if (group.memberCount() > 0) + { + displayList.append(hbTrId("(%1)").arg(group.memberCount())); + } + dataList.append(displayList); + + QStringList decorationList; + decorationList.append(group.groupIcon()); + decorationList.append(group.extraIcon()); + dataList.append(decorationList); + + dataList.append(group.serviceId()); + dataList.append(true); // for checking if this is from an extension + + mDataPointer->mExtensions.insert(rowCount(), groupSupplier); + mDataPointer->mDataList.append(dataList); + } + } + } +} + +/*! Initialize user defined groups */ void CntCollectionListModel::initializeUserGroups() @@ -202,7 +280,15 @@ groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); - QList groupContactIds = mContactManager->contactIds(groupFilter); + QContactSortOrder sortOrderGroupName; + sortOrderGroupName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldCustomLabel); + sortOrderGroupName.setCaseSensitivity(Qt::CaseInsensitive); + + QList groupsOrder; + groupsOrder.append(sortOrderGroupName); + + QList groupContactIds = mContactManager->contactIds(groupFilter, groupsOrder); if (!groupContactIds.isEmpty()) { for(int i = 0;i < groupContactIds.count();i++) @@ -229,11 +315,25 @@ QContactRelationshipFilter rFilter; rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactRole(QContactRelationship::First); rFilter.setRelatedContactId(contact.id()); + QContactSortOrder sortOrderFirstName; + sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldFirst); + sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive); + + QContactSortOrder sortOrderLastName; + sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldLast); + sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive); + + QList sortOrders; + sortOrders.append(sortOrderFirstName); + sortOrders.append(sortOrderLastName); + // group members and their count - QList groupMemberIds = mContactManager->contactIds(rFilter); + QList groupMemberIds = mContactManager->contactIds(rFilter, sortOrders); if (!groupMemberIds.isEmpty()) { @@ -259,7 +359,7 @@ dataList.append(displayList); // icon, default for now always - dataList.append("qtg_large_custom"); + dataList.append(QStringList("qtg_large_custom")); // contact Id for identification dataList.append(groupContactIds.at(i)); @@ -303,3 +403,51 @@ return mFavoriteGroupId; } +bool CntCollectionListModel::isExtensionGroup(const QModelIndex &index) +{ + int row = index.row(); + if (row < 0) + { + return false; + } + + QVariantList values = mDataPointer->mDataList.at(row); + + if(values.count() > 3) + { + return true; + } + + return false; +} + +CntViewParameters CntCollectionListModel::extensionGroupActivated(int row) +{ + CntViewParameters params; + for(int i = 0;i < mDataPointer->mExtensions.value(row)->groupCount();i++) + { + const CntUiExtensionGroup& group = mDataPointer->mExtensions.value(row)->groupAt(i); + if (group.serviceId() == mDataPointer->mDataList.at(row)[2].toInt()) + { + group.activated(params); + break; + } + } + return params; +} + +CntViewParameters CntCollectionListModel::extensionGroupLongPressed(int row, const QPointF& coords) +{ + CntViewParameters params; + for(int i = 0;i < mDataPointer->mExtensions.value(row)->groupCount();i++) + { + const CntUiExtensionGroup& group = mDataPointer->mExtensions.value(row)->groupAt(i); + if (group.serviceId() == mDataPointer->mDataList.at(row)[2].toInt()) + { + group.longPressed(coords, params); + break; + } + } + return params; +} + diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcollectionview.cpp --- a/phonebookui/pbkcommonui/src/cntcollectionview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcollectionview.cpp Mon May 03 12:24:20 2010 +0300 @@ -19,8 +19,12 @@ #include "cntgroupselectionpopup.h" #include "cntgroupdeletepopup.h" #include "cntcollectionlistmodel.h" +#include "cntextensionmanager.h" #include "qtpbkglobal.h" +#include +#include + #include #include #include @@ -38,16 +42,18 @@ /*! */ -CntCollectionView::CntCollectionView() : - mView(0), - mSoftkey(0), - mViewManager(0), - mModel(0), - mListView(0), - mNamesAction(0), - mRefreshAction(0), - mNewGroupAction(0), - mDeleteGroupsAction(0) +CntCollectionView::CntCollectionView(CntExtensionManager &extensionManager) : + mExtensionManager(extensionManager), + mView(NULL), + mSoftkey(NULL), + mViewManager(NULL), + mModel(NULL), + mListView(NULL), + mNamesAction(NULL), + mFindAction(NULL), + mExtensionAction(NULL), + mNewGroupAction(NULL), + mDeleteGroupsAction(NULL) { bool ok = false; mDocumentLoader.load(CNT_COLLECTIONVIEW_XML, &ok); @@ -66,20 +72,17 @@ connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); // menu actions + mNewGroupAction = static_cast(mDocumentLoader.findObject("cnt:newgroup")); + connect(mNewGroupAction, SIGNAL(triggered()), this, SLOT(newGroup())); 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())); + mFindAction = static_cast(mDocumentLoader.findObject("cnt:find")); + mExtensionAction = static_cast (mDocumentLoader.findObject("cnt:activity")); } /*! @@ -93,7 +96,7 @@ /*! Called when activating the view */ -void CntCollectionView::activate( CntAbstractViewManager* aMgr, const CntViewParameters& aArgs ) +void CntCollectionView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) { Q_UNUSED(aArgs) @@ -114,6 +117,7 @@ // set up the list mListView = static_cast(mDocumentLoader.findWidget(QString("listView"))); + mListView->setUniformItemSizes(true); connect(mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(openGroup(const QModelIndex&))); @@ -126,8 +130,8 @@ mListView->itemPrototypes().first()->setDefaultFrame(frame); mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::LargeIcon); - - mModel = new CntCollectionListModel(mViewManager->contactManager(SYMBIAN_BACKEND), this); + mListView->listItemPrototype()->setStretchingStyle(HbListViewItem::StretchLandscape); + mModel = new CntCollectionListModel(mViewManager->contactManager(SYMBIAN_BACKEND), mExtensionManager, this); mListView->setModel(mModel); } @@ -150,72 +154,104 @@ */ void CntCollectionView::openGroup(const QModelIndex &index) { - int id = index.data(Qt::UserRole).toInt(); - int favoriteGrpId = mModel->favoriteGroupId(); - - if (id == favoriteGrpId ) + if (mModel->isExtensionGroup(index)) { - 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 params = mModel->extensionGroupActivated(index.row()); + if (params.count()) { - CntViewParameters viewParameters(CntViewParameters::collectionFavoritesView); - viewParameters.setSelectedContact(favoriteGroup); - mViewManager->changeView(viewParameters); - } - else - { - CntViewParameters viewParameters(CntViewParameters::FavoritesMemberView); - viewParameters.setSelectedContact(favoriteGroup); - mViewManager->changeView(viewParameters); + mViewManager->changeView(params); } } else { - QContact groupContact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(id); - CntViewParameters viewParameters(CntViewParameters::groupMemberView); - viewParameters.setSelectedContact(groupContact); - mViewManager->changeView(viewParameters); + int id = index.data(Qt::UserRole).toInt(); + int favoriteGrpId = mModel->favoriteGroupId(); + + if (id == favoriteGrpId ) + { + QContact favoriteGroup = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(favoriteGrpId); + QContactRelationshipFilter rFilter; + rFilter.setRelationshipType(QContactRelationship::HasMember); + rFilter.setRelatedContactRole(QContactRelationship::First); + rFilter.setRelatedContactId(favoriteGroup.id()); + // group members and their count + QList groupMemberIds = mViewManager->contactManager(SYMBIAN_BACKEND)->contactIds(rFilter); + + if (groupMemberIds.isEmpty()) + { + CntViewParameters viewParameters; + viewParameters.insert(EViewId, collectionFavoritesView); + QVariant var; + var.setValue(favoriteGroup); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); + } + else + { + CntViewParameters viewParameters; + viewParameters.insert(EViewId, FavoritesMemberView); + QVariant var; + var.setValue(favoriteGroup); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); + } + } + else + { + QContact groupContact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(id); + + CntViewParameters viewParameters; + viewParameters.insert(EViewId, groupMemberView); + QVariant var; + var.setValue(groupContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); + } } } 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; - - openAction = menu->addAction(hbTrId("txt_common_menu_open")); - - if (id != favoriteGrpId) + if (mModel->isExtensionGroup(item->modelIndex())) { - deleteAction = menu->addAction(hbTrId("txt_phob_menu_delete_group")); - } - - HbAction *selectedAction = menu->exec(coords); - - if (selectedAction) - { - if (selectedAction == openAction) + CntViewParameters params = mModel->extensionGroupLongPressed(item->modelIndex().row(), coords); + if (params.count()) { - openGroup(item->modelIndex()); - } - else if (selectedAction == deleteAction) - { - QContact groupContact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(id); - deleteGroup(groupContact); + mViewManager->changeView(params); } } - menu->deleteLater(); + else + { + int id = item->modelIndex().data(Qt::UserRole).toInt(); + int favoriteGrpId = mModel->favoriteGroupId(); + + HbMenu *menu = new HbMenu(); + HbAction *openAction = 0; + HbAction *deleteAction = 0; + + openAction = menu->addAction(hbTrId("txt_common_menu_open")); + + if (id != favoriteGrpId) + { + deleteAction = menu->addAction(hbTrId("txt_phob_menu_delete_group")); + } + + HbAction *selectedAction = menu->exec(coords); + + if (selectedAction) + { + if (selectedAction == openAction) + { + openGroup(item->modelIndex()); + } + else if (selectedAction == deleteAction) + { + QContact groupContact = mViewManager->contactManager(SYMBIAN_BACKEND)->contact(id); + deleteGroup(groupContact); + } + } + menu->deleteLater(); + } } void CntCollectionView::newGroup() @@ -257,9 +293,14 @@ if (action == groupSelectionPopup->primaryAction()) { groupSelectionPopup->saveNewGroup(); - CntViewParameters viewParameters(CntViewParameters::groupMemberView); - viewParameters.setSelectedContact(groupContact); + + CntViewParameters viewParameters; + viewParameters.insert(EViewId, groupMemberView); + QVariant var; + var.setValue(groupContact); + viewParameters.insert(ESelectedContact, var); mViewManager->changeView(viewParameters); + delete groupSelectionPopup; } else if (action == groupSelectionPopup->secondaryAction()) @@ -280,15 +321,10 @@ mListView->setModel(0); delete mModel; mModel = 0; - mModel = new CntCollectionListModel(mViewManager->contactManager(SYMBIAN_BACKEND), this); + mModel = new CntCollectionListModel(mViewManager->contactManager(SYMBIAN_BACKEND), mExtensionManager, this); mListView->setModel(mModel); } -void CntCollectionView::reorderGroup() -{ - // wait for specs -} - void CntCollectionView::deleteGroup(QContact group) { QString name = group.displayLabel(); @@ -341,10 +377,4 @@ mDeleteGroupsAction->setEnabled(false); } } - -void CntCollectionView::disconnectAll() -{ - // wait for specs -} - // EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcommands.cpp --- a/phonebookui/pbkcommonui/src/cntcommands.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +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 "cntcommands.h" -#include "cntviewmanager.h" - -#include - -#include -#include - -CntCommands::CntCommands(CntViewManager &viewManager, - QContactManager* contactManager, - QContactManager* contactSimManager, - QObject *aParent): - mViewManager(viewManager), - mContactAction(0), - mContactManager(contactManager), - mContactSimManager(contactSimManager) -{ - setParent(aParent); -} - -CntCommands::~CntCommands() -{ -} - -void CntCommands::launchAction(QContact contact, QContactDetail detail, QString action) -{ - // detail might be empty -> in that case engine uses the preferred detail for the selected action - QList callActionDescriptors = QContactAction::actionDescriptors(action, "symbian"); - mContactAction = QContactAction::action(callActionDescriptors.at(0)); - connect(mContactAction, SIGNAL(progress(QContactAction::Status, const QVariantMap&)), - this, SLOT(progress(QContactAction::Status, const QVariantMap&))); - mContactAction->invokeAction(contact, detail); -} - -void CntCommands::progress(QContactAction::Status status, const QVariantMap& result) -{ - Q_UNUSED(result); - switch(status) - { - case QContactAction::Finished: - case QContactAction::FinishedWithError: - mContactAction->deleteLater(); - mContactAction = 0; - break; - default: - break; - } -} - -/*! -* Create a new contact -*/ -void CntCommands::newContact() -{ - QContact contact; - editContact(contact); -} - -/*! -* Import contacts from SIM card -*/ -void CntCommands::importFromSim() -{ - int copied(0); - int failed(0); - 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) { - //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 (mContactManager->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); -} - -/*! -* Edit a contact -*/ -void CntCommands::editContact(QContact contact) -{ - CntViewParameters viewParameters(CntViewParameters::editView); - //viewParameters.setPreviousViewId(mViewManager.previousViewParameters().previousViewId()); - viewParameters.setSelectedContact(contact); - mViewManager.changeView(viewParameters); -} - -/*! -* Delete a contact (confirmation query) -*/ -void CntCommands::deleteContact(QContact 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)); - note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); - HbAction *selected = note->exec(); - if (selected == note->primaryAction()) - { - mContactManager->removeContact(contact.localId()); - emit commandExecuted("delete", contact); - } - delete note; -} - -/*! -* Open a contact to Communication Launcher view -*/ -void CntCommands::openContact(QContact contact) -{ - CntViewParameters viewParameters(CntViewParameters::commLauncherView); - viewParameters.setSelectedContact(contact); - - mViewManager.changeView(viewParameters); -} - -/*! -* open history view -*/ -void CntCommands::viewHistory(QContact contact) -{ - CntViewParameters viewParameters(CntViewParameters::historyView); - viewParameters.setSelectedContact(contact); - mViewManager.changeView(viewParameters); -} - -/*! -* Launch dialer -*/ -void CntCommands::launchDialer() -{ - XQServiceRequest snd("com.nokia.services.logsservices.starter", "start(int,bool)", false); - snd << 0; // all calls - snd << true; // show dialpad - snd.send(); -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcompanyeditorview.cpp --- a/phonebookui/pbkcommonui/src/cntcompanyeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +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 "cntcompanyeditorview.h" -#include "cnteditordataviewitem.h" - -CntCompanyEditorView::CntCompanyEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("Edit company details")); -} - -CntCompanyEditorView::~CntCompanyEditorView() -{ - -} - -void CntCompanyEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - - if (mDetailList.at(i)->value(QContactOrganization::FieldName).isEmpty() && - mDetailList.at(i)->value(QContactOrganization::FieldTitle).isEmpty() && - mDetailList.at(i)->value(QContactOrganization::FieldDepartment).isEmpty() && - mDetailList.at(i)->value(QContactOrganization::FieldAssistantName).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -void CntCompanyEditorView::initializeForm() -{ - QList companyDetails = mContact->details(); - QContactOrganization *company = 0; - - if (companyDetails.count() > 0) - { - company = new QContactOrganization(companyDetails.at(0)); - } - else - { - company = new QContactOrganization(); - } - mDetailList.append(company); - - - CntEditorDataModelItem *item = new CntEditorDataModelItem(*company, QContactOrganization::FieldName, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_company")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*company, QContactOrganization::FieldTitle, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_job_title")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*company, QContactOrganization::FieldDepartment, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_department")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*company, QContactOrganization::FieldAssistantName, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_assistant")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - // set focus to the correct field - if (mParamString == "company") - { - static_cast(dataForm()->itemByIndex(formModel()->index(0, 0, QModelIndex())))->focusLineEdit(); - } - else - { - static_cast(dataForm()->itemByIndex(formModel()->index(3, 0, QModelIndex())))->focusLineEdit(); - } -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcontactcarddatacontainer.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,10 +16,13 @@ */ #include "cntcontactcarddatacontainer.h" +#include "cntcontactcarddataitem.h" #include //For fetching maptile +#include #include #include +#include #include "cntstringmapper.h" @@ -29,17 +32,13 @@ CntContactCardDataContainer::CntContactCardDataContainer(QContact* contact, QObject *parent) : mContact(contact), mSeparatorIndex(-1) { Q_UNUSED(parent); - mDataPointer = new CntContactCardContainerData; - //Non standard types needs to be registered before they can be used by QVariant - qRegisterMetaType(); - if (contact->type() == QContactType::TypeGroup) { initializeGroupData(); } else { - initializeData(); + initializeActionsData(); initializeDetailsData(); } } @@ -49,13 +48,16 @@ */ CntContactCardDataContainer::~CntContactCardDataContainer() { - + while (!mDataItemList.isEmpty()) + { + delete mDataItemList.takeFirst(); + } } /*! Initialize contact details which include actions. */ -void CntContactCardDataContainer::initializeData() +void CntContactCardDataContainer::initializeActionsData() { QList actionDescriptors = mContact->availableActions(); QStringList availableActions; @@ -66,54 +68,57 @@ QList details = mContact->details(); for (int i = 0; i < details.count(); i++) - { - QString context; - if (details[i].contexts().count()) - { - context = mStringMapper.getMappedDetail(details[i].contexts().at(0)); - } - + { if (availableActions.contains("call", Qt::CaseInsensitive) && supportsDetail("call", details[i]) && details[i].definitionName() == QContactPhoneNumber::DefinitionName) { QContactPhoneNumber number(details.at(i)); - QVariantList dataList; - //type - dataList.append("call"); - //name - QStringList list; - list << mStringMapper.getMappedDetail(number.subTypes().at(0)) << context; - QString name = list.join(" "); - dataList.append(qtTrId("Call %1").arg(name.trimmed())); - //data - dataList.append(number.number()); - //icon - dataList.append(mStringMapper.getMappedLauncherIcon(number.subTypes().at(0))); - //detail - QContactDetail detail(number); - QVariant var; - var.setValue(detail); - dataList.append(var); - mDataPointer->mDataList.insert(rowCount(), dataList); + QString title; + QString icon; + if (!number.contexts().isEmpty()) + { + title = mStringMapper.getContactCardListLocString(number.subTypes().first(), number.contexts().first()); + icon = mStringMapper.getContactCardIconString(number.subTypes().first(), number.contexts().first()); + } + else + { + title = mStringMapper.getContactCardListLocString(number.subTypes().first(), QString()); + icon = mStringMapper.getContactCardIconString(number.subTypes().first(), QString()); + } + + CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, true); + dataItem->setAction("call"); + dataItem->setValueText(number.number()); + dataItem->setIcon(HbIcon(icon)); + dataItem->setContactDetail(number); + mDataItemList.insert(itemCount(), dataItem); } if (availableActions.contains("message", Qt::CaseInsensitive) && supportsDetail("message", details[i]) && details[i].definitionName() == QContactPhoneNumber::DefinitionName) { QContactPhoneNumber number(details.at(i)); - QVariantList dataList; - //type - dataList.append("message"); - //name - dataList.append(hbTrId("txt_phob_menu_send_message")); - //data - dataList.append(number.number()); - //icon - dataList.append("qtg_large_message"); - //detail - QContactDetail detail(number); - QVariant var; - var.setValue(detail); - dataList.append(var); - mDataPointer->mDataList.insert(rowCount(), dataList); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_send_message"), true); + dataItem->setAction("message"); + dataItem->setValueText(number.number()); + QString icon; + if (number.contexts().isEmpty()) + { + icon = "qtg_large_message"; + } + else if (number.contexts().first() == QContactDetail::ContextHome) + { + icon = "qtg_large_message_home"; + } + else if (number.contexts().first() == QContactDetail::ContextWork) + { + icon = "qtg_large_message_work"; + } + else + { + icon = "qtg_large_message"; + } + dataItem->setIcon(HbIcon(icon)); + dataItem->setContactDetail(number); + mDataItemList.insert(itemCount(), dataItem); } } @@ -122,33 +127,29 @@ { QList details = actionDetails("email", *mContact); for (int i = 0; i < details.count(); i++) - { - QString context; - if (details[i].contexts().count()) - { - context = mStringMapper.getMappedDetail(details[i].contexts().at(0)); - } - + { if (details[i].definitionName() == QContactEmailAddress::DefinitionName) { QContactEmailAddress email(details.at(i)); - QVariantList dataList; - //action - dataList.append("email"); - //name - QStringList list; - list << mStringMapper.getMappedDetail(email.definitionName()) << context; - dataList.append(qtTrId("Mail %1").arg(list.join(" ").trimmed())); - //data - dataList.append(email.emailAddress()); - //icon - dataList.append("qtg_large_email"); - //detail - QContactDetail detail(email); - QVariant var; - var.setValue(detail); - dataList.append(var); - mDataPointer->mDataList.insert(rowCount(), dataList); + QString title; + QString icon; + if (!email.contexts().isEmpty()) + { + title = mStringMapper.getContactCardListLocString(email.definitionName(), email.contexts().first()); + icon = mStringMapper.getContactCardIconString(email.definitionName(), email.contexts().first()); + } + else + { + title = mStringMapper.getContactCardListLocString(email.definitionName(), QString()); + icon = mStringMapper.getContactCardIconString(email.definitionName(), QString()); + } + + CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, true); + dataItem->setAction("email"); + dataItem->setValueText(email.emailAddress(), Qt::ElideLeft); + dataItem->setIcon(HbIcon(icon)); + dataItem->setContactDetail(email); + mDataItemList.insert(itemCount(), dataItem); } } } @@ -160,60 +161,34 @@ void CntContactCardDataContainer::initializeGroupData() { // get the conference number + QContactPhoneNumber confCallNumber = mContact->detail(); - QContactPhoneNumber confCallNumber = mContact->detail(); - - QVariantList callDataList; - //type - callDataList.append("call"); - //name - callDataList.append(hbTrId("txt_phob_dblist_conference_call")); - //data - callDataList.append(confCallNumber.number()); - //icon - callDataList.append("qtg_large_call_group"); - //detail - QContactDetail detail(confCallNumber); - QVariant var; - var.setValue(detail); - callDataList.append(var); - if(confCallNumber.number() != NULL) - { - mDataPointer->mDataList.insert(rowCount(), callDataList); - } + //call + if (confCallNumber.number() != NULL) + { + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_conference_call"), true); + dataItem->setAction("call"); + dataItem->setValueText(confCallNumber.number()); + dataItem->setIcon(HbIcon("qtg_large_call_group")); + dataItem->setContactDetail(confCallNumber); + mDataItemList.insert(itemCount(), dataItem); + } - QVariantList messageDataList; - //type - messageDataList.append("message"); - //name - messageDataList.append(hbTrId("txt_phob_list_send_group_message")); - //data - messageDataList.append(confCallNumber.number()); - //icon - messageDataList.append("qtg_large_message"); - //detail - QContactDetail messageDetail(confCallNumber); - QVariant messageVar; - messageVar.setValue(messageDetail); - messageDataList.append(messageVar); - mDataPointer->mDataList.insert(rowCount(), messageDataList); + //message + CntContactCardDataItem* dataMessageItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_send_val_members"), true); + dataMessageItem->setAction("message"); + dataMessageItem->setValueText(confCallNumber.number()); + dataMessageItem->setIcon(HbIcon("qtg_large_message")); + dataMessageItem->setContactDetail(confCallNumber); + mDataItemList.insert(itemCount(), dataMessageItem); - QVariantList emailDataList; - //type - emailDataList.append("email"); - //name - emailDataList.append(hbTrId("txt_phob_list_send_group_mail")); - //data - emailDataList.append(confCallNumber.number()); - //icon - emailDataList.append("qtg_large_email"); - //detail - QContactDetail emailDetail(confCallNumber); - QVariant emailVar; - emailVar.setValue(emailDetail); - emailDataList.append(emailVar); - mDataPointer->mDataList.insert(rowCount(), emailDataList); - + //email + CntContactCardDataItem* dataEmailItem = new CntContactCardDataItem(hbTrId("txt_phob_dblist_email"), true); + dataEmailItem->setAction("email"); + dataEmailItem->setValueText(confCallNumber.number()); + dataEmailItem->setIcon(HbIcon("qtg_large_email")); + dataEmailItem->setContactDetail(confCallNumber); + mDataItemList.insert(itemCount(), dataEmailItem); } /*! @@ -232,28 +207,27 @@ sourceAddressType = CntMapTileService::AddressPreference; QVariantList addressList; //no action - addressList.append(QString()); + QString title; if (addressDetails[i].contexts().isEmpty()) { - addressList.append(hbTrId("txt_phob_formlabel_address")); + title = hbTrId("txt_phob_formlabel_address"); } else { if ( addressDetails[i].contexts().at(0) == contextHome ) { sourceAddressType = CntMapTileService::AddressHome; - addressList.append(hbTrId("txt_phob_formlabel_address_home")); + title = 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")); + title = hbTrId("txt_phob_formlabel_address_work"); } } - QStringList address; + CntContactCardDataItem* dataItem = new CntContactCardDataItem(title, false); - if (!addressDetails[i].postOfficeBox().isEmpty()) - address.append(addressDetails[i].postOfficeBox()); + QStringList address; if (!addressDetails[i].street().isEmpty()) address.append(addressDetails[i].street()); if (!addressDetails[i].postcode().isEmpty()) @@ -264,21 +238,16 @@ address.append(addressDetails[i].region()); if (!addressDetails[i].country().isEmpty()) address.append(addressDetails[i].country()); + + dataItem->setValueText(address.join(" ")); + dataItem->setContactDetail(addressDetails[i]); + addSeparator(itemCount()); + mDataItemList.insert(itemCount(), dataItem); - addressList.append(address.join(" ")); - //no icon - addressList.append(QString()); - //detail - QContactDetail detail(addressDetails[i]); - QVariant var; - var.setValue(detail); - addressList.append(var); - addSeparator(rowCount()); - mDataPointer->mDataList.insert(rowCount(), addressList); //Check whether location feature enabled if (mLocationFeatureEnabled) { - TUint32 contactId = mContact->id().localId(); + QContactLocalId contactId = mContact->id().localId(); //Get the maptile image path QString imageFile = CntMapTileService::getMapTileImage(contactId, sourceAddressType); @@ -291,9 +260,26 @@ maptileImage.append(QString(" ")); maptileImage.append(QString(" ")); - maptileImage.append( imageFile ); - addSeparator(rowCount()); - mDataPointer->mDataList.insert(rowCount(), maptileImage); + //Display the maptile image + HbIcon icon(imageFile); + QIcon mapTileIcon; + + QPainter painter; + QPixmap baloon(":/icons/pin.png"); + QPixmap map(icon.pixmap()); + + //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); + + addSeparator(itemCount()); + + CntContactCardDataItem* dataItem = new CntContactCardDataItem(QString(), false); + dataItem->setIcon(HbIcon(mapTileIcon)); + mDataItemList.insert(itemCount(), dataItem); } } } @@ -302,62 +288,35 @@ QList birthdayDetails = mContact->details(); for (int i = 0; i < birthdayDetails.count(); i++) { - QVariantList dateList; - //no action - dateList.append(QString()); - dateList.append(hbTrId("txt_phob_formlabel_birthday")); - dateList.append(birthdayDetails[i].date().toString("dd MMMM yyyy")); - //no icon - dateList.append(QString()); - //detail - QContactDetail detail(birthdayDetails[i]); - QVariant var; - var.setValue(detail); - dateList.append(var); - addSeparator(rowCount()); - mDataPointer->mDataList.insert(rowCount(), dateList); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_birthday"), false); + dataItem->setValueText(birthdayDetails[i].date().toString("dd MMMM yyyy")); + dataItem->setContactDetail(birthdayDetails[i]); + addSeparator(itemCount()); + mDataItemList.insert(itemCount(), dataItem); } //anniversary QList anniversaryDetails = mContact->details(); for (int i = 0; i < anniversaryDetails.count(); i++) { - QVariantList dateList; - //no action - dateList.append(QString()); - dateList.append(hbTrId("txt_phob_formlabel_anniversary")); - dateList.append(anniversaryDetails[i].originalDate().toString("dd MMMM yyyy")); - //no icon - dateList.append(QString()); - //detail - QContactDetail detail(anniversaryDetails[i]); - QVariant var; - var.setValue(detail); - dateList.append(var); - addSeparator(rowCount()); - mDataPointer->mDataList.insert(rowCount(), dateList); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_anniversary"), false); + dataItem->setValueText(anniversaryDetails[i].originalDate().toString("dd MMMM yyyy")); + dataItem->setContactDetail(anniversaryDetails[i]); + addSeparator(itemCount()); + mDataItemList.insert(itemCount(), dataItem); } //ringing tone - QList ringtoneDetails = mContact->details(); + QList ringtoneDetails = mContact->details(); for (int i = 0; i < ringtoneDetails.count(); i++) { - if (ringtoneDetails.at(i).subType() == QContactAvatar::SubTypeAudioRingtone) + if (!ringtoneDetails.at(i).audioRingtoneUrl().isEmpty()) { - QVariantList dataList; - //no action - dataList.append(QString()); - dataList.append(hbTrId("txt_phob_formlabel_ringing_tone")); - dataList.append(ringtoneDetails[i].avatar()); - //no icon - dataList.append(QString()); - //detail - QContactDetail detail(ringtoneDetails[i]); - QVariant var; - var.setValue(detail); - dataList.append(var); - addSeparator(rowCount()); - mDataPointer->mDataList.insert(rowCount(), dataList); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_ringing_tone"), false); + dataItem->setValueText(ringtoneDetails[i].audioRingtoneUrl().toString()); + dataItem->setContactDetail(ringtoneDetails[i]); + addSeparator(itemCount()); + mDataItemList.insert(itemCount(), dataItem); break; } } @@ -366,57 +325,28 @@ QList noteDetails = mContact->details(); for (int i = 0; i < noteDetails.count(); i++) { - QVariantList noteList; - //no action - noteList.append(QString()); - noteList.append(hbTrId("txt_phob_formlabel_note2")); - noteList.append(noteDetails[i].note()); - //no icon - noteList.append(QString()); - //detail - QContactDetail detail(noteDetails[i]); - QVariant var; - var.setValue(detail); - noteList.append(var); - addSeparator(rowCount()); - mDataPointer->mDataList.insert(rowCount(), noteList); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_note"), false); + dataItem->setValueText(noteDetails[i].note()); + dataItem->setContactDetail(noteDetails[i]); + addSeparator(itemCount()); + mDataItemList.insert(itemCount(), dataItem); } //family details QList familyDetails = mContact->details(); for (int i = 0; i < familyDetails.count(); i++) { - // Spouse - QVariantList spouseList; - //no action - spouseList.append(QString()); - spouseList.append(hbTrId("txt_phob_formlabel_spouse")); - spouseList.append(familyDetails[i].spouse()); - //no icon - spouseList.append(QString()); - //detail - QContactDetail spouseDetail(familyDetails[i]); - QVariant varSpouse; - varSpouse.setValue(spouseDetail); - spouseList.append(varSpouse); - addSeparator(rowCount()); - mDataPointer->mDataList.insert(rowCount(), spouseList); - - // Children - QVariantList childrenList; - //no action - childrenList.append(QString()); - childrenList.append(hbTrId("txt_phob_formlabel_children")); - childrenList.append(familyDetails[i].children().join(", ")); - //no icon - childrenList.append(QString()); - //detail - QContactDetail childrenDetail(familyDetails[i]); - QVariant varChild; - varChild.setValue(childrenDetail); - childrenList.append(varChild); - addSeparator(rowCount()); - mDataPointer->mDataList.insert(rowCount(), childrenList); + CntContactCardDataItem* dataSpouseItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_spouse"), false); + dataSpouseItem->setValueText(familyDetails[i].spouse()); + dataSpouseItem->setContactDetail(familyDetails[i]); + addSeparator(itemCount()); + mDataItemList.insert(itemCount(), dataSpouseItem); + + CntContactCardDataItem* dataChildrenItem = new CntContactCardDataItem(hbTrId("txt_phob_formlabel_children"), false); + dataChildrenItem->setValueText(familyDetails[i].children().join(", ")); + dataChildrenItem->setContactDetail(familyDetails[i]); + addSeparator(itemCount()); + mDataItemList.insert(itemCount(), dataChildrenItem); } } @@ -426,9 +356,9 @@ bool CntContactCardDataContainer::supportsDetail(const QString &actionName, const QContactDetail &contactDetail) { QList actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian"); - QContactAction* contactAction = QContactAction::action(actionDescriptors.at(0)); + QContactAction* contactAction = QContactAction::action(actionDescriptors.first()); - bool isSupportDetail = contactAction->supportsDetail(contactDetail); + bool isSupportDetail = contactAction->isDetailSupported(contactDetail); delete contactAction; @@ -441,7 +371,7 @@ QList CntContactCardDataContainer::actionDetails(const QString &actionName, const QContact &contact) { QList actionDescriptors = QContactAction::actionDescriptors(actionName, "symbian"); - QContactAction* contactAction = QContactAction::action(actionDescriptors.at(0)); + QContactAction* contactAction = QContactAction::action(actionDescriptors.first()); QList details = contactAction->supportedDetails(contact); @@ -451,64 +381,18 @@ } /*! -Returns the data for the given index with a role +Returns the data for the given index */ -QVariant CntContactCardDataContainer::data(int index, int role) const +CntContactCardDataItem* CntContactCardDataContainer::dataItem(int index) const { if (index < 0) - return QVariant(); - - QVariantList values = mDataPointer->mDataList.at(index); - - if (index == mSeparatorIndex) { - if (role == Qt::DisplayRole) - { - return QVariant(values[action].toString()); - } - return QVariant(); - } - - if (role == Qt::DisplayRole) - { - QStringList list; - QString field = values[text].toString(); - if(mContact->isPreferredDetail(values[action].toString(), values[detail].value())) - { - field.prepend(""); - field.append(""); - } - QString value = values[valueText].toString(); - list << field << value; - - return QVariant(list); + return NULL; } - - else if (role == Qt::DecorationRole) + else { - if (!values[icon].toString().isEmpty()) - { - QList icons; - HbIcon itemIcon(values[icon].toString()); - icons.append(itemIcon); - return QVariant(icons); - } - } - - else if (role == Qt::UserRole+1) - { - //TODO: Find out better solution!!! - QMap map; - - map.insert("action", values[action]); - map.insert("name", values[text]); - map.insert("data", values[valueText]); - map.insert("icon", values[icon]); - map.insert("detail", values[detail]); - return map; - } - - return QVariant(); + return mDataItemList.at(index); + } } /*! @@ -519,24 +403,16 @@ if (mSeparatorIndex == -1) { mSeparatorIndex = index; - QVariantList separatorList; - separatorList.append(hbTrId("txt_phob_subtitle_details")); - mDataPointer->mDataList.insert(rowCount(), separatorList); + CntContactCardDataItem* dataItem = new CntContactCardDataItem(hbTrId("txt_phob_subtitle_details"), false); + mDataItemList.insert(itemCount(), dataItem); } } /*! -Returns the amount of rows in the container +Returns the amount of items in the container */ -int CntContactCardDataContainer::rowCount() const +int CntContactCardDataContainer::itemCount() const { - return mDataPointer->mDataList.count(); + return mDataItemList.count(); } -/*! -Called when a detail is set as preferred, model needs to be refreshed -*/ -void CntContactCardDataContainer::preferredUpdated() -{ - //emit layoutChanged(); -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcontactcarddataitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntcontactcarddataitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,67 @@ +/* +* 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 "cntcontactcarddataitem.h" + +CntContactCardDataItem::CntContactCardDataItem(const QString& aTitle, bool aIsFocusable) : + mIcon(HbIcon()), + mSecondaryIcon(HbIcon()), + mTitle(aTitle), + mValueText(QString("")), + mAction(QString("")), + mValueTextElideMode(Qt::ElideRight), + mIsFocusable(aIsFocusable) +{ + +} + +CntContactCardDataItem::~CntContactCardDataItem() +{ + +} + +void CntContactCardDataItem::setTitleText(const QString& aTitle) +{ + mTitle = aTitle; +} + +void CntContactCardDataItem::setValueText(const QString& aValueText, Qt::TextElideMode aValueTextElideMode) +{ + mValueText = aValueText; + mValueTextElideMode = aValueTextElideMode; +} + +void CntContactCardDataItem::setIcon(HbIcon aIcon) +{ + mIcon = aIcon; +} + +void CntContactCardDataItem::setSecondaryIcon(HbIcon aSecondaryIcon) +{ + mSecondaryIcon = aSecondaryIcon; +} + +void CntContactCardDataItem::setAction(const QString& aAction) +{ + mAction = aAction; +} + +void CntContactCardDataItem::setContactDetail(QContactDetail aDetail) +{ + mDetail = aDetail; +} + diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcontactcarddetailitem.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcarddetailitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcontactcarddetailitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,6 +16,7 @@ */ #include "cntcontactcarddetailitem.h" +#include "cntcontactcarddataitem.h" #include #include #include @@ -30,15 +31,14 @@ CntContactCardDetailItem::CntContactCardDetailItem(int index, QGraphicsItem *parent, bool isFocusable) : HbWidget(parent), - mIcon(0), - mFirstLineText(0), - mPrimaryText(0), - mSecondLineText(0), - mFrameItem(0), - mFocusItem(0), + mIcon(NULL), + mFirstLineText(NULL), + mSecondLineText(NULL), + mFrameItem(NULL), + mFocusItem(NULL), mHasFocus(false), - mGestureFilter(0), - mGestureLongpressed(0), + mGestureFilter(NULL), + mGestureLongpressed(NULL), mIndex(index), mIsFocusable(isFocusable), mValueTextElideMode(Qt::ElideRight), @@ -79,19 +79,8 @@ if (!text.isNull()) { - mFirstLineText = new HbRichTextItem(this); - if (mIsUnderline) - { - QString temp = text; - temp.prepend(""); - temp.append(""); - mFirstLineText->setText(temp); - } - else - { - mFirstLineText->setText(text); - } - + mFirstLineText = new HbTextItem(this); + mFirstLineText->setText(text); mFirstLineText->setTextWrapping(Hb::TextWordWrap); style()->setItemName(mFirstLineText, "text"); } @@ -104,26 +93,6 @@ mFirstLineText = 0; } - if (!primaryText.isNull()) - { - if (!mPrimaryText) - { - mPrimaryText = new HbTextItem(this); - mPrimaryText->setText(primaryText); - mPrimaryText->setMaximumLines(2); - mPrimaryText->setTextWrapping(Hb::TextWordWrap); - style()->setItemName(mPrimaryText, "primaryText"); - } - } - else - { - if (mPrimaryText) - { - delete mPrimaryText; - } - mPrimaryText = 0; - } - if (!valueText.isNull()) { if (!mSecondLineText) @@ -172,9 +141,6 @@ delete mFirstLineText; mFirstLineText = 0; - - delete mPrimaryText; - mPrimaryText = 0; delete mSecondLineText; mSecondLineText = 0; @@ -254,59 +220,23 @@ event->accept(); } -void CntContactCardDetailItem::setDetails(const HbIcon detailIcon, const QString& detailText, const QString& detailValueText, Qt::TextElideMode valueTextElideMode, bool underLine) +void CntContactCardDetailItem::setDetails(CntContactCardDataItem* aDataItem) { text.clear(); valueText.clear(); icon.clear(); - mValueTextElideMode = valueTextElideMode; - mIsUnderline = underLine; + mValueTextElideMode = aDataItem->elideMode(); - if (!detailIcon.isNull()) - icon = detailIcon; - if (!detailText.isEmpty()) - text = detailText; - if (!detailValueText.isEmpty()) - valueText = detailValueText; + if (!aDataItem->icon().isNull()) + icon = aDataItem->icon(); + if (!aDataItem->titleText().isEmpty()) + text = aDataItem->titleText(); + if (!aDataItem->valueText().isEmpty()) + valueText = aDataItem->valueText(); recreatePrimitives(); } -void CntContactCardDetailItem::setDetails(const HbIcon detailIcon, const QString& detailText) -{ - primaryText.clear(); - icon.clear(); - - if (!detailIcon.isNull()) - icon = detailIcon; - if (!detailText.isEmpty()) - primaryText = detailText; - - recreatePrimitives(); -} - -void CntContactCardDetailItem::setUnderLine(bool underLine) -{ - if (mIsUnderline != underLine) - { - QString temp; - mIsUnderline = underLine; - createPrimitives(); - if (underLine) - { - temp = text; - temp.prepend(""); - temp.append(""); - } - else - { - temp = text; - } - mFirstLineText->setText(temp); - repolish(); - } -} - int CntContactCardDetailItem::index() { return mIndex; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcontactcardheadingitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -28,19 +28,21 @@ #include #include #include +#include CntContactCardHeadingItem::CntContactCardHeadingItem(QGraphicsItem *parent) : HbWidget(parent), - mIcon(0), - mFirstLineText(0), - mPrimaryText(0), - mSecondLineText(0), - mSecondaryText(0), - mMarqueeItem(0), - mFrameItem(0), - mGestureFilter(0), - mGestureLongpressed(0), - mPictureArea(0) + mIcon(NULL), + mSecondaryIcon(NULL), + mFirstLineText(NULL), + mPrimaryText(NULL), + mSecondLineText(NULL), + mSecondaryText(NULL), + mMarqueeItem(NULL), + mFrameItem(NULL), + mGestureFilter(NULL), + mGestureLongpressed(NULL), + mPictureArea(NULL) { } @@ -54,7 +56,7 @@ { if (!icon.isNull()) { - if (!mIcon) + if (!mIcon && mainWindow()->orientation() != Qt::Horizontal) { mIcon = new HbIconItem(this); mIcon->setIcon(icon); @@ -69,6 +71,24 @@ } mIcon = 0; } + + if (!secondaryIcon.isNull()) + { + if (!mSecondaryIcon) + { + mSecondaryIcon = new HbIconItem(this); + mSecondaryIcon->setIcon(secondaryIcon); + style()->setItemName(mSecondaryIcon, "secondary_icon"); + } + } + else + { + if (mSecondaryIcon) + { + delete mSecondaryIcon; + } + mSecondaryIcon = 0; + } if (!firstLineText.isNull()) { @@ -172,24 +192,27 @@ if (!mFrameItem) { mFrameItem = new HbFrameItem(this); - mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_groupbox"); + mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_list_parent_normal"); mFrameItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); mFrameItem->setZValue(-2); style()->setItemName(mFrameItem, "background"); } - - if (!mPictureArea) { + if (!mPictureArea) + { mPictureArea = new HbTouchArea(this); style()->setItemName(mPictureArea, "pictureArea"); - } + } - initGesture(); + if ( mainWindow()->orientation() != Qt::Horizontal) + { + initGesture(); + } } void CntContactCardHeadingItem::setIcon(const HbIcon newIcon) { - if (newIcon != icon) + if (newIcon != icon && mainWindow()->orientation() != Qt::Horizontal) { icon = newIcon; createPrimitives(); @@ -198,12 +221,33 @@ } } +void CntContactCardHeadingItem::setSecondaryIcon(bool favoriteContact) +{ + secondaryIcon.clear(); + + if (favoriteContact) + { + secondaryIcon = HbIcon("qtg_small_favorite"); + createPrimitives(); + mSecondaryIcon->setIcon(secondaryIcon); + } + else + { + createPrimitives(); + } + repolish(); + +} + void CntContactCardHeadingItem::recreatePrimitives() { HbWidget::recreatePrimitives(); delete mIcon; mIcon = 0; + + delete mSecondaryIcon; + mSecondaryIcon = 0; delete mFirstLineText; mFirstLineText = 0; @@ -242,10 +286,12 @@ bool CntContactCardHeadingItem::isCompanyName(const QContact* contact) { - return (!(contact->detail().title().isNull()) || !(contact->detail().name().isNull())); + return (!(contact->detail().title().isNull()) + || !(contact->detail().name().isNull()) + || !(contact->detail().department().isEmpty())); } -void CntContactCardHeadingItem::setDetails(const QContact* contact) +void CntContactCardHeadingItem::setDetails(const QContact* contact, bool isMyCard) { primaryText.clear(); firstLineText.clear(); @@ -254,7 +300,14 @@ tinyMarqueeText.clear(); // icon label - icon = HbIcon("qtg_large_avatar"); + if (isMyCard) + { + icon = HbIcon("qtg_large_mycard"); + } + else + { + icon = HbIcon("qtg_large_avatar"); + } QContactName name = contact->detail(); @@ -267,7 +320,7 @@ firstLineText = nameList.join(" ").trimmed(); if (firstLineText.isEmpty()) { - firstLineText = hbTrId("Unnamed"); + firstLineText = hbTrId("txt_phob_list_unnamed"); } } else @@ -278,7 +331,7 @@ primaryText = nameList.join(" ").trimmed(); if (primaryText.isEmpty()) { - primaryText = hbTrId("Unnamed"); + primaryText = hbTrId("txt_phob_list_unnamed"); } /* @@ -328,7 +381,7 @@ if (primaryText.isEmpty()) { - primaryText = hbTrId("Unnamed"); + primaryText = hbTrId("txt_phob_list_unnamed"); } recreatePrimitives(); @@ -368,9 +421,34 @@ mGestureFilter->addGesture(mGestureLongpressed); mGestureFilter->setLongpressAnimation(true); - installSceneEventFilter(mGestureFilter); + mIcon->installSceneEventFilter(mGestureFilter); connect(mGestureLongpressed, SIGNAL(longPress(QPointF)), this, SLOT(processLongPress(QPointF))); } +QVariant CntContactCardHeadingItem::itemChange(GraphicsItemChange change, const QVariant &value) +{ + if (change == QGraphicsItem::ItemSceneHasChanged) + { + HbMainWindow *window = mainWindow(); + if (window) + { + connect(window, SIGNAL(orientationChanged(Qt::Orientation)), + this, SLOT(orientationChanged(Qt::Orientation))); + } + else + { + QObject::disconnect(this, SLOT(orientationChanged(Qt::Orientation))); + } + } + return HbWidget::itemChange(change, value); +} + +void CntContactCardHeadingItem::orientationChanged(Qt::Orientation) +{ + recreatePrimitives(); + repolish(); +} + + // EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcontactcardview.cpp --- a/phonebookui/pbkcommonui/src/cntcontactcardview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntcontactcardview.cpp Mon May 03 12:24:20 2010 +0300 @@ -1,762 +1,69 @@ /* -* 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 "cntcontactcardview.h" - -#include -#include -#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"; - -/*! -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) -*/ -CntContactCardView::CntContactCardView(CntViewManager *viewManager, QGraphicsItem *parent) : - CntBaseView(viewManager, parent), - mScrollArea(0), - mContainerWidget(0), - mContainerLayout(0), - mContact(0), - mDetailsWidget(0), - mDataContainer(0), - mHeadingItem(0), - mThumbnailManager(0), - mGroupContact(0), - mAvatar(0), - mIsGroupMember(false), - mIsHandlingMenu(false), - mFavoriteGroupId(-1) -{ - bool ok = false; - ok = loadDocument(CNT_COMMLAUNCERVIEW_XML); - - if (ok) - { - QGraphicsWidget *content = findWidget(QString("content")); - setWidget(content); - } - else - { - qFatal("Unable to read :/xml/contacts_cc.docml"); - } +#include "cntcontactcardview_p.h" - 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))); -} - -/*! -Destructor -*/ -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); - if (!error) - { - QIcon qicon(pixmap); - HbIcon icon(qicon); - mHeadingItem->setIcon(icon); - } -} - -/*! -Add actions to menu -*/ -void CntContactCardView::addMenuItems() -{ - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:sendbusinesscard") << actions()->baseAction("cnt:editcontact") << - 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()), - this, SLOT (sendBusinessCard())); - - connect(actions()->baseAction("cnt:editcontact"), SIGNAL(triggered()), - this, SLOT (editContact())); +#include - connect(actions()->baseAction("cnt:addtogroup"), SIGNAL(triggered()), - this, SLOT (addToGroup())); - - 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 -*/ -void CntContactCardView::addActionsToToolBar() -{ - //Add Action to the toolbar - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:edit") << actions()->baseAction("cnt:history") << actions()->baseAction("cnt:activitystream"); - actions()->addActionsToToolBar(toolBar()); - - connect(actions()->baseAction("cnt:edit"), SIGNAL(triggered()), - this, SLOT(editContact())); - connect(actions()->baseAction("cnt:history"), SIGNAL(triggered()), - this, SLOT(viewHistory())); -} - -/*! -Launch contact editor -*/ -void CntContactCardView::editContact() -{ - CntViewParameters viewParameters(CntViewParameters::editView); - viewParameters.setSelectedContact(*mContact); - viewManager()->changeView(viewParameters); -} - -void CntContactCardView::sendBusinessCard() -{ -} - -void CntContactCardView::addToGroup() -{ -} - -void CntContactCardView::setAsFavorite() +CntContactCardView::CntContactCardView() : d_ptr(new CntContactCardViewPrivate()) { - 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 -*/ -void CntContactCardView::deleteContact() -{ - // the delete command - connect(commands(), SIGNAL(commandExecuted(QString, QContact)), this, - SLOT(handleExecutedCommand(QString, QContact))); - commands()->deleteContact(*mContact); -} - - -/*! -Launch history view -*/ -void CntContactCardView::viewHistory() -{ - commands()->viewHistory(*mContact); + Q_D(CntContactCardView); + connect(d_ptr, SIGNAL(backPressed()), this, SIGNAL(backPressed())); + connect(d_ptr, SIGNAL(viewActivated(QContact, QContactDetail)), this, SIGNAL(viewActivated(QContact, QContactDetail))); } /*! -Activates a previous view -*/ -void CntContactCardView::aboutToCloseView() -{ - if(mIsGroupMember) - { - CntViewParameters viewParameters(CntViewParameters::groupMemberView); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->changeView(viewParameters); - } - else - { - //viewManager()->onActivateView(CntViewParameters::namesView); - CntViewParameters viewParameters; - viewManager()->back( viewParameters ); - } - + Destructor + */ +CntContactCardView::~CntContactCardView() +{ + Q_D(CntContactCardView); + delete d; } -void CntContactCardView::resizeEvent(QGraphicsSceneResizeEvent *event) +void CntContactCardView::activate(CntAbstractViewManager* aMgr, const CntViewParameters aArgs) { - if (mScrollArea) - { - mContainerWidget->resize(mScrollArea->size().width(), 0); - } - CntBaseView::resizeEvent(event); -} - -void CntContactCardView::handleExecutedCommand(QString command, QContact /*contact*/) -{ - if (command == "delete") - { - CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->changeView(viewParameters); - } + Q_D(CntContactCardView); + d->activate( aMgr, aArgs ); } -/* -Activates a default view and setup name label texts -*/ -void CntContactCardView::activateView(const CntViewParameters &viewParameters) -{ - QContact contact = viewParameters.selectedContact(); - mContact = new QContact(contact); - - if (viewParameters.selectedAction() == "FromGroupMemberView") - { - mIsGroupMember = true; - QContact groupContact = viewParameters.selectedGroupContact(); - mGroupContact = new QContact(groupContact); - } - // add heading widget to the content - QGraphicsWidget *c = findWidget(QString("content")); - QGraphicsLinearLayout* l = static_cast(c->layout()); - - mHeadingItem = new CntContactCardHeadingItem(c); - mHeadingItem->setDetails(mContact); - - connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawMenu(const QPointF&))); - - l->insertItem(0, mHeadingItem); - - // avatar - QList details = mContact->details(); - if (details.count() > 0) - { - for (int i = 0;i < details.count();i++) - { - if (details.at(i).subType() == QContactAvatar::SubTypeImage) - { - mAvatar = new QContactAvatar(details.at(i)); - mThumbnailManager->getThumbnail(mAvatar->avatar()); - break; - } - } - } - - // data - mDataContainer = new CntContactCardDataContainer(mContact); - - mScrollArea = static_cast(findWidget(QString("scrollArea"))); - mScrollArea->setScrollDirections(Qt::Vertical); - - mContainerWidget = new QGraphicsWidget(mScrollArea); - mContainerWidget->setPreferredWidth(mScrollArea->size().width()); - mScrollArea->setContentWidget(mContainerWidget); - - mContainerLayout = new QGraphicsLinearLayout(Qt::Vertical); - mContainerLayout->setContentsMargins(0, 0, 0, 0); - mContainerLayout->setSpacing(0); - mContainerWidget->setLayout(mContainerLayout); - - for (int index = 0; index < mDataContainer->rowCount(); index++) - { - // communication methods - if (mDataContainer->separatorIndex() == -1 || index < mDataContainer->separatorIndex()) - { - CntContactCardDetailItem* item = new CntContactCardDetailItem(index, mContainerWidget); - - connect(item, SIGNAL(clicked()), this, SLOT(onItemActivated())); - connect(item, SIGNAL(longPressed(const QPointF&)), this, SLOT(onLongPressed(const QPointF&))); - - HbIcon icon(""); - QString text; - QString valueText; - - // DecorationRole - QVariant decorationRole = mDataContainer->data(index, Qt::DecorationRole); - QVariantList variantList; - if (decorationRole.canConvert()) - { - icon = decorationRole.value(); - } - else if (decorationRole.canConvert< QList >()) - { - variantList = decorationRole.toList(); - for (int j = 0; j < variantList.count(); j++) - { - if (j==0 && variantList.at(0).canConvert()) - { - icon = variantList.at(0).value(); - } - } - } - - - // DisplayRole - 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); - } - } - - QVariant variant = mDataContainer->data(index, Qt::UserRole+1); - const QMap map = variant.toMap(); - QString action = map.value("action").toString(); - bool isUnderLine = mContact->isPreferredDetail(action, map.value("detail").value()); - if (isUnderLine) - { - mPreferredItems.insert(action, item); - } - if (action == "call" || action == "message") - { - item->setDetails(icon, text, valueText, Qt::ElideLeft, isUnderLine); - } - else - { - item->setDetails(icon, text, valueText, Qt::ElideRight, isUnderLine); - } - - mContainerLayout->addItem(item); - } - - // separator - else if (index == mDataContainer->separatorIndex()) - { - QVariant displayRole = mDataContainer->data(index, Qt::DisplayRole); - if (displayRole.isValid()) - { - if (displayRole.canConvert()) - { - HbGroupBox* details = new HbGroupBox(this); - details->setHeading(displayRole.toString()); - mContainerLayout->addItem(details); - } - } - } - - // details - else - { - 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 decorationRole = mDataContainer->data( index, Qt::DecorationRole ); - if ( decorationRole.canConvert()) - { - //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 >()) - { - QVariantList variantList; - variantList = decorationRole.toList(); - for (int j = 0; j < variantList.count(); j++) - { - 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")); - } +void CntContactCardView::deactivate() +{ + Q_D(CntContactCardView); + d->deactivate(); } -/*! -Called after user selects to view the icon image. -*/ -void CntContactCardView::doViewImage() -{ - // TODO Image viewer not implemented yet in QtHighway. Pending implementation -} - -/*! -Called after user clicked on the listview. -*/ -void CntContactCardView::onItemActivated() -{ - CntContactCardDetailItem *item = qobject_cast(sender()); - int index = item->index(); - QVariant variant = mDataContainer->data(index, Qt::UserRole+1); - const QMap map = variant.toMap(); - QString action = map.value("action").toString(); - QContactDetail detail = map.value("detail").value(); - - commands()->launchAction(*mContact, detail, action); -} - -/*! -Set selected detail as preferred for selected action -*/ -void CntContactCardView::setPreferredAction(const QString &aAction, const QContactDetail &aDetail) -{ - mContact->setPreferredDetail(aAction, aDetail); - contactManager()->saveContact(mContact); - emit preferredUpdated(); -} - -/*! -Called after user longtaps the listview -*/ -void CntContactCardView::onLongPressed(const QPointF &aCoords) +HbView* CntContactCardView::view() const { - CntContactCardDetailItem *item = qobject_cast(sender()); - int index = item->index(); - QVariant variant = mDataContainer->data(index, Qt::UserRole+1); - const QMap map = variant.toMap(); - - HbMenu *menu = new HbMenu(); - HbAction *communicationAction = 0; - HbAction *preferredAction = 0; - - QString action = map.value("action").toString(); - - if (action.compare("call", Qt::CaseInsensitive) == 0) - { - communicationAction = menu->addAction(map.value("name").toString()); - } - else if (action.compare("message", Qt::CaseInsensitive) == 0) - { - communicationAction = menu->addAction(hbTrId("txt_phob_dblist_send_message")); - } - else if (action.compare("email", Qt::CaseInsensitive) == 0) - { - communicationAction = menu->addAction(hbTrId("Send email")); - } - menu->addSeparator(); - - preferredAction = menu->addAction(hbTrId("Set as preferred")); - if (mContact->isPreferredDetail(action, map.value("detail").value())) - { - preferredAction->setEnabled(false); - } - - //favoriteAction = menu->addAction(hbTrId("Make favorite")); - //homeScreenAction = menu->addAction(hbTrId("Place to homescreen")); - HbAction *selectedAction = menu->exec(aCoords); - - if (selectedAction) - { - if (selectedAction == communicationAction) - { - commands()->launchAction(*mContact, map.value("detail").value(), action); - } - else if (selectedAction == preferredAction) - { - setPreferredAction(action, map.value("detail").value()); - item->setUnderLine(true); - - if (mPreferredItems.contains(action)) - { - mPreferredItems.value(action)->setUnderLine(false); - } - mPreferredItems.insert(action, item); - } - } - menu->deleteLater(); + Q_D(const CntContactCardView); + return d->mView; } -void CntContactCardView::keyPressEvent(QKeyEvent *event) -{ - if (this == viewManager()->mainWindow()->currentView() && event->key() == Qt::Key_Yes) - { - event->accept(); - QList actionDescriptors = mContact->availableActions(); - QStringList availableActions; - for (int i = 0;i < actionDescriptors.count();i++) - { - availableActions << actionDescriptors.at(i).actionName(); - } - if (availableActions.contains("call", Qt::CaseInsensitive)) - { - commands()->launchAction(*mContact, QContactDetail(), "call"); - } - } - else - { - CntBaseView::keyPressEvent(event); - } -} - -/*! -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); - } - } +bool CntContactCardView::isDefault() const +{ + Q_D(const CntContactCardView); + return false; } -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; +int CntContactCardView::viewId() const +{ + Q_D(const CntContactCardView); + return commLauncherView; } // end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntcontactcardview_p.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,906 @@ +/* +* 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 "cntcontactcardview_p.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //For maptile processing +#include +#include +#include +#include "cntcontactcarddatacontainer.h" +#include "cntcontactcarddetailitem.h" +#include "cntcontactcardheadingitem.h" +#include "cntcontactcarddataitem.h" +#include "cntmainwindow.h" +#include "cntstringmapper.h" +#include "cntdocumentloader.h" +#include "cntimagelabel.h" + +const char *CNT_CONTACTCARDVIEW_XML = ":/xml/contacts_contactcard.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) +*/ +CntContactCardViewPrivate::CntContactCardViewPrivate() : + QObject(), + mScrollArea(NULL), + mContainerWidget(NULL), + mContainerLayout(NULL), + mContact(NULL), + mDetailsWidget(NULL), + mDataContainer(NULL), + mHeadingItem(NULL), + mThumbnailManager(NULL), + mGroupContact(NULL), + mAvatar(NULL), + mIsGroupMember(false), + mIsHandlingMenu(false), + mFavoriteGroupId(-1), + mLoader(NULL), + mContactAction(NULL), + mBackKey(NULL), + mImageLabel(NULL), + mVCardIcon(NULL) +{ + bool ok; + document()->load(CNT_CONTACTCARDVIEW_XML, &ok); + if (!ok) + { + qFatal("Unable to read :/xml/contacts_contactcard.docml"); + } + + mView = static_cast(document()->findWidget("view")); + + mThumbnailManager = new ThumbnailManager(this); + mThumbnailManager->setMode(ThumbnailManager::Default); + mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); + mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailLarge); + + connect(mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), + this, SLOT(thumbnailReady(QPixmap, void*, int, int))); + + //back button + mBackKey = new HbAction(Hb::BackNaviAction, mView); + mView->setNavigationAction(mBackKey); + connect(mBackKey, SIGNAL(triggered()), this, SLOT(showPreviousView())); +} + +/*! +Destructor +*/ +CntContactCardViewPrivate::~CntContactCardViewPrivate() +{ + delete mContact; + mContact = 0; + + delete mDataContainer; + mDataContainer = NULL; + + delete mGroupContact; + mGroupContact = NULL; + + delete mAvatar; + mAvatar = NULL; + + delete mLoader; + mLoader = NULL; + + delete mVCardIcon; + mVCardIcon = NULL; +} + +/*! +Activates a previous view +*/ +void CntContactCardViewPrivate::showPreviousView() +{ + emit backPressed(); + + CntViewParameters viewParameters; + if (mIsGroupMember) + { + QVariant var; + var.setValue(*mGroupContact); + viewParameters.insert(ESelectedContact, var); + } + mViewManager->back(viewParameters); +} + +/* +Activates a default view and setup name label texts +*/ +void CntContactCardViewPrivate::activate(CntAbstractViewManager* aMgr, const CntViewParameters aArgs) +{ + mView->installEventFilter(this); + + mViewManager = aMgr; + + HbMainWindow* window = mView->mainWindow(); + connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); + setOrientation(window->orientation()); + + QContact contact = aArgs.value(ESelectedContact).value(); + mContact = new QContact(contact); + + //my card + if (mContact->localId() == contactManager()->selfContactId()) + { + mView->menu()->clearActions(); + mView->toolBar()->removeAction(static_cast(document()->findObject(QString("cnt:history")))); + } + else + { + mView->toolBar()->removeAction(static_cast(document()->findObject(QString("cnt:sendMyCard")))); + } + + if (aArgs.value(ESelectedAction).toString() == "FromGroupMemberView") + { + mIsGroupMember = true; + QContact groupContact = aArgs.value(ESelectedGroupContact).value(); + mGroupContact = new QContact(groupContact); + } + // add heading widget to the content + QGraphicsWidget *c = document()->findWidget(QString("content")); + QGraphicsLinearLayout* l = static_cast(c->layout()); + + mHeadingItem = static_cast(document()->findWidget(QString("cnt_contactcard_heading"))); + mHeadingItem->setDetails(mContact, mContact->localId() == contactManager()->selfContactId()); + mHeadingItem->setSecondaryIcon(isFavoriteGroupContact()); + + connect(mHeadingItem, SIGNAL(passLongPressed(const QPointF&)), this, SLOT(drawMenu(const QPointF&))); + + mImageLabel = static_cast(document()->findWidget("cnt_contactcard_image")); + connect(mImageLabel, SIGNAL(iconClicked()), this, SLOT(doChangeImage())); + + // avatar + QList details = mContact->details(); + for (int i = 0;i < details.count();i++) + { + if (details.at(i).imageUrl().isValid()) + { + mAvatar = new QContactAvatar(details.at(i)); + mThumbnailManager->getThumbnail(mAvatar->imageUrl().toString()); + break; + } + } + + // data + mDataContainer = new CntContactCardDataContainer(mContact); + + // scroll area + container widget + mScrollArea = static_cast(document()->findWidget(QString("scrollArea"))); + mScrollArea->setScrollDirections(Qt::Vertical); + mContainerWidget = new QGraphicsWidget(mScrollArea); + mScrollArea->setContentWidget(mContainerWidget); + + mContainerLayout = new QGraphicsLinearLayout(Qt::Vertical); + mContainerLayout->setContentsMargins(0, 0, 0, 0); + mContainerLayout->setSpacing(0); + mContainerLayout->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + + mContainerWidget->setLayout(mContainerLayout); + + for (int index = 0; index < mDataContainer->itemCount(); index++) + { + // communication methods + if (mDataContainer->separatorIndex() == -1 || index < mDataContainer->separatorIndex()) + { + CntContactCardDetailItem* item = new CntContactCardDetailItem(index, mContainerWidget); + + connect(item, SIGNAL(clicked()), this, SLOT(onItemActivated())); + connect(item, SIGNAL(longPressed(const QPointF&)), this, SLOT(onLongPressed(const QPointF&))); + + CntContactCardDataItem* dataItem = mDataContainer->dataItem(index); + + if (mContact->isPreferredDetail(dataItem->action(), dataItem->detail())) + { + dataItem->setSecondaryIcon(HbIcon("qtg_mono_favourites")); + mPreferredItems.insert(dataItem->action(), item); + } + + item->setDetails(dataItem); + mContainerLayout->addItem(item); + } + + // separator + else if (index == mDataContainer->separatorIndex()) + { + HbGroupBox* details = new HbGroupBox(mView); + details->setHeading(mDataContainer->dataItem(index)->titleText()); + mContainerLayout->addItem(details); + } + + // details + else + { + CntContactCardDataItem* dataItem = mDataContainer->dataItem(index); + if (!dataItem->icon().isNull()) + { + HbLabel* iconLabel = new HbLabel(mView); + iconLabel->setIcon(dataItem->icon()); + iconLabel->setPreferredSize(dataItem->icon().width(), dataItem->icon().height()); + mContainerLayout->addItem(iconLabel); + } + else + { + CntContactCardDetailItem* item = new CntContactCardDetailItem(index, mContainerWidget, false); + item->setDetails(dataItem); + 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(QContactRelationship::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) + { + mView->menu()->removeAction(qobject_cast(document()->findObject("cnt:setasfavorite"))); + } + else + { + mView->menu()->removeAction(qobject_cast(document()->findObject("cnt:removefromfavorite"))); + } + + // Menu items + connect(qobject_cast(document()->findObject("cnt:sendbusinesscard")), SIGNAL(triggered()), + this, SLOT (sendBusinessCard())); + connect(qobject_cast(document()->findObject("cnt:deletecontact")), SIGNAL(triggered()), + this, SLOT (deleteContact())); + connect(qobject_cast(document()->findObject("cnt:setasfavorite")), SIGNAL(triggered()), + this, SLOT (setAsFavorite())); + connect(qobject_cast(document()->findObject("cnt:removefromfavorite")), SIGNAL(triggered()), + this, SLOT (removeFromFavorite())); + connect(qobject_cast(document()->findObject("cnt:placecontacttohs")), SIGNAL(triggered()), + this, SLOT (sendToHs())); + + // Toolbar items + connect(qobject_cast(document()->findObject("cnt:edit")), SIGNAL(triggered()), + this, SLOT(editContact())); + connect(qobject_cast(document()->findObject("cnt:history")), SIGNAL(triggered()), + this, SLOT(viewHistory())); + connect(qobject_cast(document()->findObject("cnt:sendMyCard")), SIGNAL(triggered()), + this, SLOT (sendBusinessCard())); + + emit viewActivated(*mContact, aArgs.value(ESelectedDetail).value()); +} + +void CntContactCardViewPrivate::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) +{ + Q_UNUSED(data); + Q_UNUSED(id); + if (!error) + { + QIcon qicon(pixmap); + HbIcon icon(qicon); + mHeadingItem->setIcon(icon); + mVCardIcon = new HbIcon(qicon); + mImageLabel->clear(); + mImageLabel->setIcon(icon); + } +} + +/*! +Place contact to homescreen as widget +*/ +void CntContactCardViewPrivate::sendToHs() +{ + QVariantHash preferences; + preferences["contactId"] = mContact->id().localId(); + + XQServiceRequest snd("com.nokia.services.hsapplication.IHomeScreenClient", + "addWidget(QString,QVariantHash)" + ,false); + snd << QString("hscontactwidgetplugin"); + snd << preferences; + snd.send(); +} + +/*! +Launch contact editor +*/ +void CntContactCardViewPrivate::editContact() +{ + CntViewParameters viewParameters; + viewParameters.insert(EViewId, editView); + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); +} + +void CntContactCardViewPrivate::addToGroup() +{ +} + +void CntContactCardViewPrivate::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); + + mView->menu()->removeAction(qobject_cast(document()->findObject("cnt:setasfavorite"))); + mView->menu()->addAction(qobject_cast(document()->findObject("cnt:removefromfavorite"))); + mHeadingItem->setSecondaryIcon(true); +} + +void CntContactCardViewPrivate::removeFromFavorite() + { + QContact favoriteGroup = contactManager()->contact(mFavoriteGroupId); + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(favoriteGroup.id()); + relationship.setSecond(mContact->id()); + contactManager()->removeRelationship(relationship); + + mView->menu()->removeAction(qobject_cast(document()->findObject("cnt:removefromfavorite"))); + mView->menu()->addAction(qobject_cast(document()->findObject("cnt:setasfavorite"))); + mHeadingItem->setSecondaryIcon(false); + } + +/*! +Delete contact +*/ +void CntContactCardViewPrivate::deleteContact() +{ + QString name = contactManager()->synthesizedDisplayLabel(*mContact); + + 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()) + { + contactManager()->removeContact(mContact->localId()); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, namesView); + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); + viewParameters.insert(ESelectedAction, "delete"); + mViewManager->changeView(viewParameters); + } + delete note; +} + +/*! +Launch history view +*/ +void CntContactCardViewPrivate::viewHistory() +{ + CntViewParameters viewParameters; + viewParameters.insert(EViewId, historyView); + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); +} + +/*! +Deactivate the view +*/ +void CntContactCardViewPrivate::deactivate() +{ + mView->removeEventFilter(this); +} + +/*! +Send the business card / my card +*/ +void CntContactCardViewPrivate::sendBusinessCard() +{ + QString tempDir = QDir::tempPath().append("/tempcntvcard"); + + QDir dir(tempDir); + + // Temporary directory to store the vCard file + if (!dir.exists()) + { + // Create a temp directory + QDir::temp().mkdir("tempcntvcard"); + } + else + { + // Empty the temp directory since the other vCards are not required + QStringList l = dir.entryList(); + foreach(QString s, l) + { + if (dir.exists(s)) + { + dir.remove(s); + } + } + } + + QString vCardName = QString(mContact->displayLabel().append(".vcf")); + QString vCardPath = dir.absolutePath().append(QDir::separator()); + vCardPath.append(vCardName); + vCardPath = QDir::toNativeSeparators(vCardPath); + + QString service("com.nokia.services.hbserviceprovider.conversationview"); + QString type("send(QVariant)"); + + // Create the vCard and send it to messaging service + if (createVCard(vCardPath)) + { + ShareUi s; + QStringList l; + l << vCardPath; + s.send(l,false); + } +} + +/*! +Set orientation of the view +*/ +void CntContactCardViewPrivate::setOrientation(Qt::Orientation orientation) +{ + if (orientation == Qt::Vertical) + { + // reading "portrait" section + document()->load(CNT_CONTACTCARDVIEW_XML, "portrait"); + } + else + { + // reading "landscape" section + document()->load(CNT_CONTACTCARDVIEW_XML, "landscape"); + } +} + +/*! +Called after user clicked on the listview. +*/ +void CntContactCardViewPrivate::onItemActivated() +{ + CntContactCardDetailItem *item = qobject_cast(sender()); + int index = item->index(); + launchAction(*mContact, mDataContainer->dataItem(index)->detail(), mDataContainer->dataItem(index)->action()); +} + +/*! +Launch the call / message / email action +*/ +void CntContactCardViewPrivate::launchAction(QContact contact, QContactDetail detail, QString action) +{ + // detail might be empty -> in that case engine uses the preferred detail for the selected action + QList callActionDescriptors = QContactAction::actionDescriptors(action, "symbian"); + mContactAction = QContactAction::action(callActionDescriptors.at(0)); + connect(mContactAction, SIGNAL(stateChanged(QContactAction::State)), + this, SLOT(progress(QContactAction::State))); + mContactAction->invokeAction(contact, detail); +} + +void CntContactCardViewPrivate::progress(QContactAction::State status) +{ + switch(status) + { + case QContactAction::FinishedState: + case QContactAction::FinishedWithErrorState: + mContactAction->deleteLater(); + mContactAction = 0; + break; + default: + break; + } +} + +/*! +Set selected detail as preferred for selected action +*/ +void CntContactCardViewPrivate::setPreferredAction(const QString &aAction, const QContactDetail &aDetail) +{ + mContact->setPreferredDetail(aAction, aDetail); + contactManager()->saveContact(mContact); + emit preferredUpdated(); +} + +/*! +Item specific menu +*/ +void CntContactCardViewPrivate::onLongPressed(const QPointF &aCoords) +{ + CntContactCardDetailItem *item = qobject_cast(sender()); + int index = item->index(); + + HbMenu *menu = new HbMenu(); + HbAction *communicationAction = 0; + HbAction *preferredAction = 0; + CntStringMapper stringMapper; + + QString action = mDataContainer->dataItem(index)->action(); + QContactDetail detail = mDataContainer->dataItem(index)->detail(); + + if (action.compare("call", Qt::CaseInsensitive) == 0) + { + QContactDetail detail = mDataContainer->dataItem(index)->detail(); + if (!detail.contexts().isEmpty()) + { + communicationAction = menu->addAction(stringMapper.getContactCardMenuLocString(detail.definitionName(), detail.contexts().first())); + } + else + { + communicationAction = menu->addAction(stringMapper.getContactCardMenuLocString(detail.definitionName(), QString())); + } + } + else if (action.compare("message", Qt::CaseInsensitive) == 0) + { + communicationAction = menu->addAction(hbTrId("txt_phob_menu_send_message")); + } + else if (action.compare("email", Qt::CaseInsensitive) == 0) + { + if (!detail.contexts().isEmpty()) + { + communicationAction = menu->addAction(stringMapper.getContactCardMenuLocString(detail.definitionName(), detail.contexts().first())); + } + else + { + communicationAction = menu->addAction(stringMapper.getContactCardMenuLocString(detail.definitionName(), QString())); + } + } + + if (action.compare("call", Qt::CaseInsensitive) == 0) + { + preferredAction = menu->addAction(hbTrId("txt_phob_menu_set_as_default_number")); + } + else if (action.compare("email", Qt::CaseInsensitive) == 0) + { + preferredAction = menu->addAction(hbTrId("txt_phob_menu_set_as_default_email")); + } + + if (mContact->isPreferredDetail(action, detail)) + { + preferredAction->setEnabled(false); + } + + if (preferredAction) + { + menu->insertSeparator(preferredAction); + } + + HbAction *selectedAction = menu->exec(aCoords); + + if (selectedAction) + { + if (selectedAction == communicationAction) + { + launchAction(*mContact, detail, action); + } + else if (selectedAction == preferredAction) + { + setPreferredAction(action, detail); + //item->setUnderLine(true); + + if (mPreferredItems.contains(action)) + { + //mPreferredItems.value(action)->setUnderLine(false); + } + mPreferredItems.insert(action, item); + } + } + menu->deleteLater(); +} + +/*! +Event filter for green key +*/ +bool CntContactCardViewPrivate::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::KeyPress && static_cast(event)->key() == Qt::Key_Yes) + { + QList actionDescriptors = mContact->availableActions(); + QStringList availableActions; + for (int i = 0; i < actionDescriptors.count();i++) + { + availableActions << actionDescriptors.at(i).actionName(); + } + if (availableActions.contains("call", Qt::CaseInsensitive)) + { + launchAction(*mContact, QContactDetail(), "call"); + } + return true; + } + else if (event->type() == QEvent::LayoutRequest && mScrollArea) + { + mContainerWidget->resize(mScrollArea->size().width(), mScrollArea->size().height()); + return true; + } + else + { + return QObject::eventFilter(obj,event); + } +} + +/*! +Called after the user clicked "Change Image" from popup menu after +longpressing the image in this view. +*/ +void CntContactCardViewPrivate::doChangeImage() +{ + CntViewParameters viewParameters; + viewParameters.insert(EViewId, imageEditorView); + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); +} + +/*! +Called after the user clicked "Remove Image" from popup menu after +longpressing the image in this view. +*/ +void CntContactCardViewPrivate::doRemoveImage() +{ + if (mAvatar) + { + bool success = mContact->removeDetail(mAvatar); + if (success) + { + mHeadingItem->setIcon(HbIcon("qtg_large_avatar")); + contactManager()->saveContact(mContact); + } + } +} + +/*! +Draw the image specific content menu +*/ +void CntContactCardViewPrivate::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 *changeImageAction = menu->addAction(hbTrId("txt_phob_menu_change_picture")); + HbAction *removeAction = menu->addAction(hbTrId("txt_phob_menu_remove_image")); + + HbAction *selectedAction = menu->exec(aCoords); + + if (selectedAction) + { + if (selectedAction == changeImageAction) + { + doChangeImage(); + } + else if (selectedAction == removeAction) + { + doRemoveImage(); + } + } + + mIsHandlingMenu = false; + menu->deleteLater(); +} + +/*! +Check if the favourite group created +*/ +bool CntContactCardViewPrivate::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; +} + +/*! +Check if the contact is the favourite group +*/ +bool CntContactCardViewPrivate::isFavoriteGroupContact() +{ + bool favoriteGroupContact = false; + + if (isFavoriteGroupCreated()) + { + QContact favoriteGroup = contactManager()->contact(mFavoriteGroupId); + QContactRelationshipFilter rFilter; + rFilter.setRelationshipType(QContactRelationship::HasMember); + rFilter.setRelatedContactRole(QContactRelationship::First); + rFilter.setRelatedContactId(favoriteGroup.id()); + + QList contactsLocalIdList = contactManager()->contactIds(rFilter); + if (!contactsLocalIdList.isEmpty()) + { + for(int i = 0;i < contactsLocalIdList.count();i++) + { + QContact favContact = contactManager()->contact(contactsLocalIdList.at(i)); + if (favContact.localId() == mContact->localId()) + { + favoriteGroupContact = true; + } + } + } + } + return favoriteGroupContact; +} + +/*! +Creates the v-card +*/ +bool CntContactCardViewPrivate::createVCard(QString& vCardPath) +{ + QList list; + QContact tempContact(*mContact); + bool createVCard( false ); + + // Check if the contact has an image. + QList avatars = tempContact.details(); + + foreach(QContactAvatar a, avatars) + { + if (!a.imageUrl().isEmpty()) + { + // If true and query the user if they want to add it to + // the business card + + // TODO: Missing translation + HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_add_contact_card_image_to_business_c"), + HbMessageBox::MessageTypeQuestion); + note->setIcon(*mVCardIcon); + + note->setPrimaryAction(new HbAction(hbTrId("txt_common_button_ok"), note)); + note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note)); + HbAction *selected = note->exec(); + if (selected == note->secondaryAction()) + { + // Remove the avatar detail from the temp contact + createVCard = tempContact.removeDetail(&a); + } + else if (selected == note->primaryAction()) + { + createVCard = true; + } + delete note; + break; + } + else + { + // Contact does not have an image + createVCard = true; + } + } + + // False = User clicked outside the popup, dismissing it + // = User prompted the removal of the avatar but it failed + if (!createVCard) + { + return false; + } + + list.append(tempContact); + QVersitContactExporter exporter; + // The vCard version needs to be 2.1 due to backward compatiblity when sending + if (!exporter.exportContacts(list, QVersitDocument::VCard21Type)) + return false; + + QList docs = exporter.documents(); + + QFile f(vCardPath); + if (!f.open(QIODevice::WriteOnly)) + { + return false; + } + + // Start creating the vCard + QVersitWriter writer; + writer.setDevice(&f); + + bool ret = writer.startWriting(docs); + ret = writer.waitForFinished(); + + return ret; +} + +/*! +Return the pointer to the document loader +*/ +CntDocumentLoader* CntContactCardViewPrivate::document() +{ + if (!mLoader) + { + mLoader = new CntDocumentLoader(); + } + return mLoader; +} + +/*! +Return pointer to the contact manager +*/ +QContactManager* CntContactCardViewPrivate::contactManager() +{ + return mViewManager->contactManager(SYMBIAN_BACKEND); +} + +// end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntdateeditorview.cpp --- a/phonebookui/pbkcommonui/src/cntdateeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "cntdateeditorview.h" - -CntDateEditorView::CntDateEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("txt_phob_subtitle_edit_date")); -} - -CntDateEditorView::~CntDateEditorView() -{ - -} - -void CntDateEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - - if (mDetailList.at(i)->definitionName() == QContactBirthday::DefinitionName && - mDetailList.at(i)->variantValue(QContactBirthday::FieldBirthday).toString().isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - - if (mDetailList.at(i)->definitionName() == QContactAnniversary::DefinitionName && - mDetailList.at(i)->variantValue(QContactAnniversary::FieldOriginalDate).toString().isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -void CntDateEditorView::initializeForm() -{ - QList birthdayDetails = mContact->details(); - QList anniversaryDetails = mContact->details(); - - QContactBirthday *birthday = 0; - QContactAnniversary *anniversary = 0; - - if (birthdayDetails.count() > 0) - { - birthday = new QContactBirthday(birthdayDetails.at(0)); - } - else - { - birthday = new QContactBirthday(); - } - mDetailList.append(birthday); - - if (anniversaryDetails.count() > 0) - { - anniversary = new QContactAnniversary(anniversaryDetails.at(0)); - } - else - { - anniversary = new QContactAnniversary(); - } - mDetailList.append(anniversary); - - - CntEditorDataModelItem *item = new CntEditorDataModelItem(*birthday, QContactBirthday::FieldBirthday, 0, - static_cast(HbDataFormModelItem::CustomItemBase+3), hbTrId("txt_phob_formlabel_birthday")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*anniversary, QContactAnniversary::FieldOriginalDate, 0, - static_cast(HbDataFormModelItem::CustomItemBase+3), hbTrId("txt_phob_formlabel_anniversary")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntdateeditorviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntdateeditorviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdateeditorviewitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -36,7 +36,8 @@ #include CntDateEditorViewItem::CntDateEditorViewItem( QGraphicsItem* aParent ) : -CntDetailViewItem( aParent ) +CntDetailViewItem( aParent ), +mButton(NULL) { mLocale = QLocale::system(); } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntdefaultviewfactory.cpp --- a/phonebookui/pbkcommonui/src/cntdefaultviewfactory.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdefaultviewfactory.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,70 +16,113 @@ */ #include "cntabstractviewfactory.h" -#include "cntviewparameters.h" +#include "cntdetaileditor.h" #include "cntmainwindow.h" - +#include +#include +#include +#include // views #include "cntnamesview.h" #include "cntmycardview.h" #include "cntfavoritesview.h" #include "cntimageeditorview.h" #include "cntcollectionview.h" +#include "cntgroupmemberview.h" +#include "cntfavoritesmemberview.h" +#include "cntcontactcardview.h" +#include "cntgroupactionsview.h" +#include "cnthistoryview.h" +#include "cnteditview.h" +#include "cntmycardselectionview.h" +#include "cntextensionmanager.h" -CntDefaultViewFactory::CntDefaultViewFactory( ) +CntDefaultViewFactory::CntDefaultViewFactory(): + mExtensionManager(NULL) { + mExtensionManager = new CntExtensionManager(); + HbStyleLoader::registerFilePath( ":/style" ); } CntDefaultViewFactory::~CntDefaultViewFactory() { + delete mExtensionManager; } 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: + case namesView: + return new CntNamesView(*mExtensionManager); + case noView: + case commLauncherView: + return new CntContactCardView(); + case serviceContactCardView: + case serviceAssignContactCardView: break; - case CntViewParameters::myCardView: + case myCardView: return new CntMyCardView(); - case CntViewParameters::myCardSelectionView: - case CntViewParameters::serviceContactSelectionView: + case myCardSelectionView: + return new CntMyCardSelectionView(); + case serviceContactSelectionView: break; - case CntViewParameters::collectionView: - return new CntCollectionView(); - case CntViewParameters::collectionFavoritesView: + case collectionView: + return new CntCollectionView(*mExtensionManager); + case 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: + case FavoritesMemberView: + return new CntFavoritesMemberView(); + case editView: + return new CntEditView(); + case onlineAccountEditorView: + case serviceEditView: + case serviceSubEditView: + break; + + case emailEditorView: + case namesEditorView: + case urlEditorView: + case companyEditorView: + case phoneNumberEditorView: + case noteEditorView: + case familyDetailEditorView: + case addressEditorView: + case dateEditorView: + case groupEditorView: + return new CntDetailEditor(aId); + + case imageEditorView: + return new CntImageEditorView(); + case serviceContactFetchView: break; - case CntViewParameters::imageEditorView: - return new CntImageEditorView(); - case CntViewParameters::serviceContactFetchView: - case CntViewParameters::groupEditorView: - case CntViewParameters::groupMemberView: - case CntViewParameters::groupActionsView: - case CntViewParameters::historyView: - break; + case groupMemberView: + return new CntGroupMemberView(); + case groupActionsView: + return new CntGroupActionsView(); + case historyView: + return new CntHistoryView(); default: - break; + return createPluginView(aId); + } + return NULL; +} + +CntAbstractView* CntDefaultViewFactory::createPluginView( int aId ) +{ + for(int i = 0;i < mExtensionManager->pluginCount();i++) + { + CntViewSupplier* viewSupplier = mExtensionManager->pluginAt(i)->viewSupplier(); + if (viewSupplier) + { + for(int j = 0;j < viewSupplier->viewCount();j++) + { + if (viewSupplier->viewIdAt(j) == aId) + { + return viewSupplier->viewAt(j); + } + } + } } return NULL; } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp --- a/phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdefaultviewmanager.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,80 +17,99 @@ #include "cntdefaultviewmanager.h" #include "cntabstractviewfactory.h" -#include "cntabstractview.h" +#include #include "cntmainwindow.h" #include -//#include "cntmodelprovider.h" +#include #include #include "cntviewnavigator.h" -#include "cntbaseview.h" +#include + +CntDefaultViewManager::CntDefaultViewManager( HbMainWindow* aWindow ) : QObject(), + mFactory(NULL), + mCurrent(NULL), + mOldView(NULL), + mNavigator(NULL), + mMainWindow( aWindow ) + +{ + setViewFactory(new CntDefaultViewFactory()); + setViewNavigator(new CntViewNavigator(this)); -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); +#ifndef __WINS__ + int error = -1; + SimUtility simUtility = SimUtility(SimUtility::AdnStore, error); + if (error == 0) + { + SimUtility::AvailableStores store = simUtility.getAvailableStores(error); + if (error == 0 && store.AdnStorePresent) + { + QContactManager* manager = QContactManager::fromUri(SIM_BACKEND_ADN); + mBackends.append( manager ); + } } +#endif } CntDefaultViewManager::~CntDefaultViewManager() { + qDeleteAll(mDefaults.values()); delete mFactory; - delete mArgs; } -void CntDefaultViewManager::back(const CntViewParameters& aArgs) +void CntDefaultViewManager::setViewFactory( CntAbstractViewFactory* aFactory ) { - if ( mArgs ) + if ( aFactory ) { - delete mArgs; - mArgs = NULL; + mFactory = aFactory; } - 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::setViewNavigator( CntViewNavigator* aNavigator ) +{ + if ( aNavigator ) + { + mNavigator = aNavigator; } } -void CntDefaultViewManager::changeView(const CntViewParameters& aArgs) +void CntDefaultViewManager::back(const CntViewParameters aArgs) { - removeCurrentView(); + mArgs.clear(); + + QFlags flags; + int back = mNavigator->back( flags ); - mNavigator->next( aArgs.nextViewId() ); - switchView(aArgs); + mArgs.insert(EViewId, back ); + mArgs.insert(ESelectedAction, aArgs.value(ESelectedAction)); + mArgs.insert(ESelectedContact, aArgs.value(ESelectedContact)); + mArgs.insert(ESelectedGroupContact, aArgs.value(ESelectedGroupContact)); + mArgs.insert(ESelectedDetail, aArgs.value(ESelectedDetail)); + + if (mArgs.value(EViewId).toInt() != noView) + { + switchView( mArgs, flags ); + } +} + +void CntDefaultViewManager::changeView(const CntViewParameters aArgs) +{ + QFlags flags; + mNavigator->next(aArgs.value(EViewId).toInt(), flags); + switchView(aArgs, flags); } QContactManager* CntDefaultViewManager::contactManager( const QString& aType ) { foreach ( QContactManager* mgr, mBackends ) { - if ( aType.compare(mgr->managerName(), Qt::CaseInsensitive) == 0 ) + QString uri = mgr->managerUri(); + if ( aType.compare(uri, Qt::CaseInsensitive) == 0 ) { return mgr; } } - QContactManager* manager = new QContactManager( aType ); + QContactManager* manager = QContactManager::fromUri( aType ); if ( manager ) { mBackends.append( manager ); @@ -99,76 +118,40 @@ return manager; } -bool CntDefaultViewManager::isDepracatedView(CntViewParameters::ViewId aId) +void CntDefaultViewManager::removeCurrentView() { - switch (aId) + if (mOldView) { - 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; + connect(mMainWindow, SIGNAL(viewReady()), this, SLOT(deleteOldView())); + } + else + { + mMainWindow->setInteractive( true ); } } -void CntDefaultViewManager::removeCurrentView() +void CntDefaultViewManager::deleteOldView() { - if (mCurrent == NULL) { - removeDepracatedCurrentView(); - return; - } - - if (mCurrent) { - mCurrent->deactivate(); - mMainWindow->removeView(mCurrent->view()); + if (mOldView && !mOldView->view()->isVisible()) + { + disconnect(mMainWindow, SIGNAL(viewReady()), this, SLOT(deleteOldView())); + mOldView->deactivate(); + mMainWindow->removeView(mOldView->view()); - if (!mCurrent->isDefault()) { - delete mCurrent; - mCurrent = NULL; + if (!mOldView->isDefault()) + { + delete mOldView; + mOldView = NULL; } + mMainWindow->setInteractive(true); } } -void CntDefaultViewManager::switchView(const CntViewParameters& aArgs) +void CntDefaultViewManager::switchView(const CntViewParameters aArgs, QFlags flags) { - 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 + mMainWindow->setInteractive(false); + int id = aArgs.value(EViewId).toInt(); + if ( id != noView ) { CntAbstractView* nextView(NULL); if (mDefaults.contains(id)) @@ -177,18 +160,21 @@ } else { - nextView = mFactory->createView((int) id); + nextView = mFactory->createView( id ); if (nextView->isDefault()) { mDefaults.insert(id, nextView); } } - - mCurrent = nextView; + mOldView = mCurrent; + mCurrent = nextView; + mMainWindow->addView(mCurrent->view()); - mMainWindow->setCurrentView(mCurrent->view()); + mMainWindow->setCurrentView(mCurrent->view(), true, flags); mCurrent->activate(this, aArgs); + + removeCurrentView(); } } // End of File diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntdetaileditor.cpp --- a/phonebookui/pbkcommonui/src/cntdetaileditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdetaileditor.cpp Mon May 03 12:24:20 2010 +0300 @@ -15,64 +15,156 @@ * */ #include "cntdetaileditor.h" +#include "cnteditorfactory.h" +#include #include -CntDetailEditor::CntDetailEditor(CntViewManager *viewManager, QGraphicsItem *parent) : - CntBaseView(viewManager, parent), mDataForm(0), mDataFormModel(0) +#include +#include +#include +#include +#include + +const char *CNT_DETAILEDITOR_XML = ":/xml/contacts_detail_editor.docml"; + +CntDetailEditor::CntDetailEditor( int aId ) : + QObject(), + mId(aId), + mView(NULL), + mLoader(NULL), + mViewManager(NULL), + mEditorFactory(NULL), + mCancel(NULL) { - if (loadDocument(":/xml/contacts_editor.docml")) { - QGraphicsWidget *content = findWidget(QString("content")); - setWidget(content); - mDataForm = static_cast (findWidget(QString("dataForm"))); + bool ok; + document()->load(CNT_DETAILEDITOR_XML, &ok); + if (!ok) { + qFatal("Unable to read %S", CNT_DETAILEDITOR_XML); } + else { + mView = static_cast (document()->findWidget(QString("view"))); + + mDataForm = static_cast (document()->findWidget(QString("dataForm"))); + } + + mEditorFactory = new CntEditorFactory(); + + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect( mSoftkey, SIGNAL(triggered()), this, SLOT(saveChanges()) ); } -void CntDetailEditor::setViewId( CntViewParameters::ViewId aId ) +CntDetailEditor::~CntDetailEditor() { - iId = aId; + delete mDataForm; + delete mDataFormModel; + delete mHeader; + delete mLoader; + delete mEditorFactory; +} + +void CntDetailEditor::setViewId( int aId ) +{ + mId = aId; } void CntDetailEditor::setInsertAction( const QString aInsert ) { HbAction* insert = new HbAction( aInsert ); - menu()->addAction( insert ); + mView->menu()->insertAction(mCancel, insert); connect( insert, SIGNAL(triggered()), this, SLOT(insertField()) ); } +void CntDetailEditor::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) +{ + mViewManager = aMgr; + + mCancel = static_cast(document()->findObject("cnt:discardchanges")); + mView->menu()->addAction( mCancel ); + connect( mCancel, SIGNAL(triggered()), this, SLOT(discardChanges()) ); + + if ( mView->navigationAction() != mSoftkey) { + mView->setNavigationAction(mSoftkey); + } + + QContact selectedContact = aArgs.value(ESelectedContact).value(); + mEditorFactory->setupEditorView(*this, selectedContact); + + mDataForm->setItemRecycling(true); + + // add new field if required + if ( aArgs.value(ESelectedAction).toString() == "add" ) { + mDataFormModel->insertDetailField(); + } + + HbMainWindow* window = mView->mainWindow(); + if ( window ) { + connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(handleOrientation(Qt::Orientation))); + handleOrientation(window->orientation()); + } +} + +void CntDetailEditor::deactivate() +{ + if( mId == groupEditorView) { + QContactManager* mgr = mViewManager->contactManager(SYMBIAN_BACKEND); + mgr->saveContact( mDataFormModel->contact() ); + } +} + +bool CntDetailEditor::isDefault() const +{ + return false; +} + +HbView* CntDetailEditor::view() const +{ + return mView; +} + +HbDocumentLoader* CntDetailEditor::document() +{ + if (!mLoader) { + mLoader = new HbDocumentLoader(); + } + + return mLoader; +} + void CntDetailEditor::insertField() { mDataFormModel->insertDetailField(); } -CntDetailEditor::~CntDetailEditor() +void CntDetailEditor::handleOrientation(Qt::Orientation aOrientation) { - delete mDataForm; - delete mDataFormModel; - delete mPrototype; - delete mHeader; + Q_UNUSED(aOrientation); } void CntDetailEditor::discardChanges() { QContact selected( *mDataFormModel->contact() ); CntViewParameters args; - args.setSelectedContact( selected ); - viewManager()->back( args ); + QVariant var; + var.setValue(selected); + args.insert(ESelectedContact, var); + mViewManager->back( args ); } -void CntDetailEditor::aboutToCloseView() +void CntDetailEditor::saveChanges() { mDataFormModel->saveContactDetails(); QContact selected( *mDataFormModel->contact() ); CntViewParameters args; - args.setSelectedContact( selected ); - viewManager()->back( args ); + QVariant var; + var.setValue(selected); + args.insert(ESelectedContact, var); + mViewManager->back( args ); } void CntDetailEditor::setHeader(QString aHeader) { if (!mHeader) { - mHeader = static_cast (findWidget(QString("headerBox"))); + mHeader = static_cast (document()->findWidget(QString("headerBox"))); } mHeader->setHeading(aHeader); } @@ -80,28 +172,12 @@ void CntDetailEditor::setDetails(CntDetailEditorModel* aModel, HbAbstractViewItem* aPrototype) { mDataFormModel = aModel; - mPrototype = aPrototype; + mDataForm->setModel(mDataFormModel, aPrototype); } -void CntDetailEditor::activateView(const CntViewParameters &viewParameters) +int CntDetailEditor::viewId() const { - 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; + return mId; } // End of File diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntdetailpopup.cpp --- a/phonebookui/pbkcommonui/src/cntdetailpopup.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdetailpopup.cpp Mon May 03 12:24:20 2010 +0300 @@ -22,29 +22,35 @@ #include #include #include +#include #include QTM_USE_NAMESPACE -CntDetailPopup::CntDetailPopup(QStringList excludeList, QGraphicsItem *parent): +CntDetailPopup::CntDetailPopup(QGraphicsItem *parent): HbDialog(parent), - mListModel(0), - mListView(0), - mExcludeList(excludeList) + mListModel(NULL), + mListView(NULL) { mListView = new HbListView(this); - mListModel = new QStandardItemModel(); + mListModel = new QStandardItemModel(this); - 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 - + addListItem("qtg_small_mobile", hbTrId("txt_phob_list_number"), phoneNumberEditorView ); + addListItem("qtg_small_email", hbTrId("txt_phob_list_email"), emailEditorView ); + addListItem("qtg_small_url_address", hbTrId("txt_phob_list_url"), urlEditorView); + addListItem("qtg_small_location", hbTrId("txt_phob_list_address"), addressEditorView ); + addListItem("qtg_small_note", hbTrId("txt_phob_formlabel_note"), noteEditorView); + addListItem("qtg_small_sound", hbTrId("txt_phob_formlabel_personal_ringing_tone"), noView ); + addListItem("qtg_small_calendar", hbTrId("txt_phob_formlabel_date"), dateEditorView); + addListItem("qtg_small_company_details", hbTrId("txt_phob_formlabel_company_details"), companyEditorView); + addListItem("qtg_small_family", hbTrId("txt_phob_formlabel_family"), familyDetailEditorView); + mListView->setModel(mListModel); mListView->setSelectionMode(HbAbstractItemView::NoSelection); - + // ownership of prototype is not transferred + HbListViewItem* prototype = mListView->listItemPrototype(); + prototype->setGraphicsSize( HbListViewItem::SmallIcon ); + HbGroupBox *headingLabel = new HbGroupBox(); HbLabel *label = new HbLabel(hbTrId("txt_phob_title_add_field")); headingLabel->setContentWidget(label); @@ -75,9 +81,9 @@ return mSelectedDetail; } -QString CntDetailPopup::selectDetail(QStringList excludeList) +int CntDetailPopup::selectDetail() { - CntDetailPopup *popup = new CntDetailPopup(excludeList); + CntDetailPopup *popup = new CntDetailPopup(); QString result; HbAction *action = popup->exec(); @@ -88,17 +94,15 @@ } delete popup; - return result; + return result.toInt(); } -void CntDetailPopup::addListItem(QString label, QString id1, QString id2) +void CntDetailPopup::addListItem(QString aIcon, QString label, int aId ) { - if (mExcludeList.contains(id1) || mExcludeList.contains(id2)) - return; - QList items; - QStandardItem *labelItem = new QStandardItem(label); - QStandardItem *idItem = new QStandardItem(id1); + QStandardItem *labelItem = new QStandardItem(HbIcon(aIcon).qicon(), label); + QString id; + QStandardItem *idItem = new QStandardItem( id.number(aId) ); items << labelItem << idItem; mListModel->appendRow(items); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntdocumentloader.cpp --- a/phonebookui/pbkcommonui/src/cntdocumentloader.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntdocumentloader.cpp Mon May 03 12:24:20 2010 +0300 @@ -20,6 +20,8 @@ #include #include "cntdocumentloader.h" #include "cnteditviewheadingitem.h" +#include "cntcontactcardheadingitem.h" +#include "cntimagelabel.h" CntDocumentLoader::CntDocumentLoader() { @@ -41,6 +43,22 @@ result->setObjectName(name); } } + else if (type == "CntContactCardHeadingItem") + { + result = new CntContactCardHeadingItem(); + if (result) + { + result->setObjectName(name); + } + } + else if (type == "CntImageLabel") + { + result = new CntImageLabel(); + if (result) + { + result->setObjectName(name); + } + } else { result = HbDocumentLoader::createObject(type,name); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditordatamodelitem.cpp --- a/phonebookui/pbkcommonui/src/cnteditordatamodelitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +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 "cnteditordatamodelitem.h" -#include -#include - -CntEditorDataModelItem::CntEditorDataModelItem(QContactDetail &detail, const QString &key, QStandardItemModel *fieldModel, - HbDataFormModelItem::DataItemType type, const QString &label, const HbDataFormModelItem *parent) : - HbDataFormModelItem(type, label, parent), - mContactDetail(detail), - mKey(key), - mFieldModel(fieldModel), - mInputFilter(0) -{ - -} - -CntEditorDataModelItem::CntEditorDataModelItem(QContactDetail &detail, const QString &key, int maxLength, - HbDataFormModelItem::DataItemType type, const QString &label, const HbDataFormModelItem *parent) : - HbDataFormModelItem(type, label, parent), - mContactDetail(detail), - mKey(key), - mMaxLength(maxLength), - mInputFilter(0) -{ - -} - -CntEditorDataModelItem::CntEditorDataModelItem(QContactDetail &detail, const QString &buttonLabel, - HbDataFormModelItem::DataItemType type, const QString &label, const HbDataFormModelItem *parent) : - HbDataFormModelItem(type, label, parent), - mContactDetail(detail), - mButtonLabel(buttonLabel) -{ - -} - -CntEditorDataModelItem::~CntEditorDataModelItem() -{ - -} - -QContactDetail &CntEditorDataModelItem::contactDetail() -{ - return mContactDetail; -} - -QString CntEditorDataModelItem::key() -{ - return mKey; -} - -QString CntEditorDataModelItem::buttonLabel() -{ - return mButtonLabel; -} - -QStandardItemModel *CntEditorDataModelItem::fieldModel() -{ - return mFieldModel; -} - -int CntEditorDataModelItem::maxLength() -{ - return mMaxLength; -} - -HbInputFilter *CntEditorDataModelItem::inputFilter() -{ - return mInputFilter; -} - -void CntEditorDataModelItem::setTextFilter(HbInputFilter *inputFilter) -{ - mInputFilter = inputFilter; -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditordataviewitem.cpp --- a/phonebookui/pbkcommonui/src/cnteditordataviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,325 +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 "cnteditordataviewitem.h" -#include "cnteditordatamodelitem.h" -#include "cntbasedetaileditorview.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -CntEditorDataViewItem::CntEditorDataViewItem(CntBaseDetailEditorView *view, QGraphicsItem *parent): - HbDataFormViewItem(parent), - mView(view), - mLineEdit(0) -{ -} - -CntEditorDataViewItem::~CntEditorDataViewItem() -{ -} - -HbAbstractViewItem* CntEditorDataViewItem::createItem() -{ - return new CntEditorDataViewItem(*this); -} - -HbWidget* CntEditorDataViewItem::createCustomWidget() -{ - HbDataFormModelItem::DataItemType itemType = static_cast( - modelIndex().data(HbDataFormModelItem::ItemTypeRole).toInt()); - - switch(itemType) - { - // DataFormItem with combobox and lineedit - case HbDataFormModelItem::CustomItemBase: - { - HbWidget *widget = new HbWidget(); - QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); - widget->setLayout(layout); - - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - - HbComboBox *box = new HbComboBox(); - box->setModel(item->fieldModel()); - box->setCurrentIndex(modelPosition(item->fieldModel(), item->contactDetail())); - connect(box, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int))); - layout->addItem(box); - - mLineEdit = new HbLineEdit(); - mLineEdit->setText(item->contactDetail().value(item->key())); - mLineEdit->setMaxLength(item->fieldModel()->item(modelPosition(item->fieldModel(), - item->contactDetail()))->data(Qt::UserRole+3).toInt()); - setTextFilter(mLineEdit, item); - connect(mLineEdit, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString))); - layout->addItem(mLineEdit); - - return widget; - } - // DataFormItem with lineedit - case HbDataFormModelItem::CustomItemBase + 1: - { - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - - mLineEdit = new HbLineEdit(); - mLineEdit->setText(item->contactDetail().value(item->key())); - mLineEdit->setMaxLength(item->maxLength()); - setTextFilter(mLineEdit, item); - connect(mLineEdit, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString))); - - if (item->contactDetail().definitionName() == QContactNote::DefinitionName) - { - mLineEdit->setMinRows(5); - mLineEdit->setMaxRows(5); - } - else - { - mLineEdit->setMinRows(1); - mLineEdit->setMaxRows(1); - } - - return mLineEdit; - } - // DataFormItem with pushbutton - case HbDataFormModelItem::CustomItemBase + 2: - { - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - - HbPushButton *button = new HbPushButton(); - button->setBackground(HbIcon(" ")); - button->setText(item->buttonLabel()); - connect(button, SIGNAL(clicked()), this, SLOT(addDetail())); - - return button; - } - // DataFormItem with pushbutton for date editors - case HbDataFormModelItem::CustomItemBase + 3: - { - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - - QString date; - QDate tempDate = item->contactDetail().value(item->key()); - - if (tempDate.isNull()) - { - date = hbTrId("No date set"); - } - else - { - date = tempDate.toString("dd MMMM yyyy"); - } - - HbPushButton *button = new HbPushButton(); - button->setBackground(HbIcon(" ")); - button->setText(date); - connect(button, SIGNAL(clicked()), this, SLOT(editDate())); - - return button; - } - default: - return 0; - } -} - -/*! -Set focus to the current item's lineedit -*/ -void CntEditorDataViewItem::focusLineEdit() -{ - mLineEdit->setFocus(); -} - -int CntEditorDataViewItem::modelPosition(QStandardItemModel *model, QContactDetail &detail) -{ - int position = 0; - - QString subType; - QString context; - - if (detail.definitionName() == QContactPhoneNumber::DefinitionName) - { - QContactPhoneNumber number = detail; - subType = number.subTypes().at(0); - } - else if (detail.definitionName() == QContactOnlineAccount::DefinitionName) - { - QContactOnlineAccount account = detail; - subType = account.subTypes().at(0); - } - else if (detail.definitionName() == QContactEmailAddress::DefinitionName) - { - QString temp = QContactEmailAddress::FieldEmailAddress; - subType = temp; - } - else if (detail.definitionName() == QContactUrl::DefinitionName) - { - QString temp = QContactUrl::FieldUrl; - subType = temp; - } - - if (detail.contexts().count() != 0) - { - context = detail.contexts().at(0); - } - - for (int i = 0;i < model->rowCount();i++) - { - if (model->item(i)->data(Qt::UserRole).toString() == subType && - model->item(i)->data(Qt::UserRole+1).toString() == context) - { - return position; - } - else - { - position++; - } - } - - return position; -} - -/*! - Set text filter to the widget. -*/ -void CntEditorDataViewItem::setTextFilter(QObject *aEditor, CntEditorDataModelItem *item) -{ - HbEditorInterface editorInterface(aEditor); - editorInterface.setFilter(item->inputFilter()); - - if (editorInterface.filter() == HbEmailAddressFilter::instance() || - editorInterface.filter() == HbInputLowerCaseFilter::instance()) - { - editorInterface.setTextCase(HbTextCaseLower); - } - else if (editorInterface.filter() == HbPhoneNumberFilter::instance()) - { - editorInterface.setUpAsPhoneNumberEditor(); - } -} - -void CntEditorDataViewItem::textChanged(QString text) -{ - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - - if (item->key() == QContactOrganization::FieldDepartment || item->key() == QContactFamily::FieldChildren) - { - item->contactDetail().setValue(item->key(), QStringList(text.trimmed())); - } - else - { - item->contactDetail().setValue(item->key(), text.trimmed()); - } -} - -void CntEditorDataViewItem::indexChanged(int index) -{ - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - QStandardItem *sItem = item->fieldModel()->item(index); - - // Update context - if (!sItem->data(Qt::UserRole+1).toString().isEmpty()) - { - item->contactDetail().setContexts(sItem->data(Qt::UserRole+1).toString()); - } - else - { - item->contactDetail().setContexts(QStringList()); - } - - // Update subtype if applicable - if (item->contactDetail().definitionName() == QContactPhoneNumber::DefinitionName) - { - item->contactDetail().setValue(QContactPhoneNumber::FieldSubTypes, QStringList(sItem->data(Qt::UserRole).toString())); - } - else if (item->contactDetail().definitionName() == QContactOnlineAccount::DefinitionName) - { - item->contactDetail().setValue(QContactOnlineAccount::FieldSubTypes, QStringList(sItem->data(Qt::UserRole).toString())); - } - - // Update maxlength of the lineedit - mLineEdit->setMaxLength(sItem->data(Qt::UserRole+3).toInt()); -} - -void CntEditorDataViewItem::addDetail() -{ - mView->addDetail(); -} - -void CntEditorDataViewItem::editDate() -{ - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - - HbDialog popup; - - popup.setDismissPolicy(HbDialog::NoDismiss); - popup.setTimeout(HbPopup::NoTimeout); - - HbTextItem *headingText = new HbTextItem(&popup); - headingText->setFontSpec(HbFontSpec(HbFontSpec::Title)); - if (item->contactDetail().definitionName() == QContactBirthday::DefinitionName) - { - headingText->setText(hbTrId("txt_phob_dblist_birthday")); - } - else - { - headingText->setText(hbTrId("txt_phob_dblist_anniversary")); - } - - popup.setHeadingWidget(headingText); - - HbDateTimePicker *picker = new HbDateTimePicker(&popup); - picker->setDisplayFormat("dd.MMM.yyyy"); - picker->setDateRange(QDate(1900, 0, 0), QDate(2050, 0, 0)); - picker->setDate(item->contactDetail().value(item->key())); - popup.setContentWidget(picker); - - popup.setPrimaryAction(new HbAction(hbTrId("txt_common_button_ok"), &popup)); - popup.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), &popup)); - - HbAction *selected = popup.exec(); - if (selected == popup.primaryAction()) - { - item->contactDetail().setValue(item->key(), picker->date()); - qobject_cast(sender())->setText(picker->date().toString("dd MMMM yyyy")); - } -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditorfactory.cpp --- a/phonebookui/pbkcommonui/src/cnteditorfactory.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditorfactory.cpp Mon May 03 12:24:20 2010 +0300 @@ -14,8 +14,8 @@ * Description: * */ + #include "cnteditorfactory.h" -#include "cntviewmanager.h" #include "cntnameeditormodel.h" #include "cntphonenumbermodel.h" #include "cntphonenumberviewitem.h" @@ -32,9 +32,12 @@ #include "cntcompanyeditormodel.h" #include "cntfamilyeditormodel.h" #include "cntdetaileditor.h" +#include "cntgroupeditormodel.h" +#include "cntabstractview.h" +#include "cntdetaileditor.h" -CntEditorFactory::CntEditorFactory(CntViewManager* aMgr, QObject* aParent) : - QObject(aParent), iViewMgr(aMgr) +CntEditorFactory::CntEditorFactory( QObject* aParent ) : + QObject(aParent) { } @@ -42,93 +45,91 @@ { } -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) +/*! +The View's Id should have been set before calling this function. +*/ +void CntEditorFactory::setupEditorView(CntDetailEditor &aEditor, 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")); -} + int viewId = aEditor.viewId(); + + switch ( viewId ) + { + case emailEditorView: + { + aEditor.setDetails(new CntEmailEditorModel(new QContact(aContact)), new CntEmailEditorViewItem); + aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_email_address")); + aEditor.setInsertAction(hbTrId("txt_phob_list_add_email_address")); + break; + } + + case namesEditorView: + { + aEditor.setDetails(new CntNameEditorModel(new QContact(aContact)), NULL); + aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_contact_name")); + break; + } -CntBaseView* CntEditorFactory::createFamilyEditorView(QContact aContact) -{ - return createEditor(CntViewParameters::familyDetailEditorView, - new CntFamilyEditorModel(new QContact(aContact)), - NULL, - qtTrId("Edit family details")); -} + case urlEditorView: + { + aEditor.setDetails(new CntUrlEditorModel(new QContact(aContact)), new CntUrlEditorViewItem); + aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_web_address")); + aEditor.setInsertAction(hbTrId("txt_phob_list_add_url_address")); + break; + } + + case companyEditorView: + { + aEditor.setDetails(new CntCompanyEditorModel(new QContact(aContact)), NULL); + aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_company_details")); + break; + } + + case phoneNumberEditorView: + { + aEditor.setDetails(new CntPhoneNumberModel(new QContact(aContact)), new CntPhoneNumberViewItem); + aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_phone_number")); + aEditor.setInsertAction(hbTrId("txt_phob_opt_add_number")); + break; + } + + case noteEditorView: + { + aEditor.setDetails(new CntNoteEditorModel(new QContact(aContact)), new CntNoteEditorViewItem); + aEditor.setHeader(hbTrId("Edit note details")); + aEditor.setInsertAction(hbTrId("Add note")); + break; + } -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 ) + case familyDetailEditorView: + { + aEditor.setDetails(new CntFamilyEditorModel(new QContact(aContact)), NULL); + aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_family_details")); + break; + } + + case addressEditorView: + { + aEditor.setDetails(new CntAddressModel(new QContact(aContact)), NULL); + aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_address_details")); + break; + } + + case dateEditorView: { - editor->setInsertAction( aInsert ); + aEditor.setDetails(new CntDateEditorModel(new QContact(aContact)), new CntDateEditorViewItem); + aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_date")); + break; } - return editor; + + case groupEditorView: + { + aEditor.setDetails(new CntGroupEditorModel(new QContact(aContact)), NULL); + aEditor.setHeader(hbTrId("txt_phob_subtitle_edit_group_details")); + break; + } + + default: + break; + } } +// End of File diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditview.cpp --- a/phonebookui/pbkcommonui/src/cnteditview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditview.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,8 +16,11 @@ */ #include "cnteditview.h" -#include "cntviewparameters.h" -#include "cntviewmanager.h" +#include "cnteditview_p.h" +#include "cntabstractviewmanager.h" + +#include + #include "cntdetailpopup.h" #include "cnteditviewdetailitem.h" #include "cnteditviewheadingitem.h" @@ -30,879 +33,45 @@ #include #include -const char *CNT_UI_XML = ":/xml/contacts_ev.docml"; - -CntEditView::CntEditView(CntViewManager *aViewManager, QGraphicsItem *aParent) : - CntBaseView(aViewManager, aParent), - mScrollArea(0), - mContainerWidget(0), - mContainerLayout(0), - mContact(0), - mDetailItem(0), - mThumbnailManager(0), - mHeadingItem(0), - mDetailItemIndex(-1), - mAddressItemIndex(-1) -{ - bool ok = false; - ok=loadDocument(CNT_UI_XML); - - if (ok) - { - QGraphicsWidget *content = findWidget(QString("content")); - setWidget(content); - } - else - { - qFatal("Unable to read :/xml/contacts_ev.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)) ); +CntEditView::CntEditView() : d_ptr(new CntEditViewPrivate()) +{ + Q_D( CntEditView ); + connect( d_ptr, SIGNAL(contactUpdated()), this, SIGNAL(contactUpdated()) ); + connect( d_ptr, SIGNAL(contactRemoved()), this, SIGNAL(contactRemoved()) ); + connect( d_ptr, SIGNAL(changesDiscarded()), this, SIGNAL(changesDiscarded()) ); } CntEditView::~CntEditView() { - delete mContact; -} - -void CntEditView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) -{ - Q_UNUSED(data); - Q_UNUSED(id); - if (!error) - { - QIcon qicon(pixmap); - HbIcon icon(qicon); - mHeadingItem->setIcon(icon); - } -} - -/*! -Activates a previous view -*/ -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()); - } - - // save contact if there is one and it's not empty - else if (contact() && !contact()->isEmpty()) - { - bool isSaved = contactManager()->saveContact(contact()); - - if (isSaved) - { - viewParameters.setSelectedContact(*contact()); - viewParameters.setSelectedAction("save"); - } - else - { - viewParameters.setSelectedAction("failed"); - } - } - viewManager()->back(viewParameters); -} - -void CntEditView::resizeEvent(QGraphicsSceneResizeEvent *event) -{ - if (mScrollArea) - { - mContainerWidget->resize(mScrollArea->size().width() - 50, 0); - } - CntBaseView::resizeEvent(event); + Q_D(CntEditView); + delete d; } - -/* -Activates a default view -*/ -void CntEditView::activateView(const CntViewParameters &aViewParameters) + +void CntEditView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) { - QContact xcontact = aViewParameters.selectedContact(); - mContact = new QContact(xcontact); - - mHeadingItem = static_cast(findWidget(QString("cnt_editview_heading"))); - mHeadingItem->setDetails(mContact); - connect(mHeadingItem, SIGNAL(iconClicked()), this, SLOT(openImageEditor())); - connect(mHeadingItem, SIGNAL(textClicked()), this, SLOT(openNameEditor())); - - QList details = mContact->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; - } - } - } - - //construct listview & connect signals - mScrollArea = static_cast(findWidget(QString("cnt_listview_labels"))); - mScrollArea->setScrollDirections(Qt::Vertical); - - mContainerWidget = new QGraphicsWidget(mScrollArea); - mContainerWidget->setPreferredWidth(mScrollArea->size().width() - 50); - mScrollArea->setContentWidget(mContainerWidget); - - mContainerLayout = new QGraphicsLinearLayout(Qt::Vertical); - mContainerLayout->setContentsMargins(0, 0, 0, 0); - mContainerLayout->setSpacing(0); - mContainerWidget->setLayout(mContainerLayout); - prepareItems(); - - // command handling (for delete menu option) - connect(commands(), SIGNAL(commandExecuted(QString, QContact)), - this, SLOT(handleExecutedCommand(QString, QContact))); - - // 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")); - } - - // Save and Discard all changes options only available once changes have been made - if (xcontact == contactManager()->contact(mContact->localId())) - { - actions()->baseAction("cnt:discardallchanges")->setEnabled(false); - actions()->baseAction("cnt:save")->setEnabled(false); - } + Q_D(CntEditView); + d->activate(aMgr,aArgs); } -void CntEditView::prepareItems() +void CntEditView::deactivate() { - QList numberDetails = mContact->details(); - QList emailDetails = mContact->details(); - QList addressDetails = mContact->details(); - QList chatDetails = mContact->details(); - QList urlDetails = mContact->details(); - - // phone numbers - if (numberDetails.count()) - { - for (int i = 0;i < numberDetails.count();i++) - { - createItem(numberDetails.at(i)); - } - } - else - { - QContactPhoneNumber number; - createItem(number); - } - - // email addresses - if (emailDetails.count()) - { - for (int i = 0;i < emailDetails.count();i++) - { - createItem(emailDetails.at(i)); - } - } - else - { - QContactEmailAddress email; - createItem(email); - } - - // postal addresses - if (!addressDetails.count()) - { - QContactAddress address; - createItem(address); - } - else - { - mAddressItemIndex = mContainerLayout->count(); - } - - // IM accounts - if (chatDetails.count()) - { - for (int i = 0;i < chatDetails.count();i++) - { - createItem(chatDetails.at(i)); - } - } - else - { - QContactOnlineAccount account; - createItem(account); - } - - // URL addresses - if (urlDetails.count()) - { - for (int i = 0;i < urlDetails.count();i++) - { - createItem(urlDetails.at(i)); - } - } - else - { - QContactUrl url; - createItem(url); - } - - QList companyDetails = mContact->details(); - QList birthdayDetails = mContact->details(); - QList anniversaryDetails = mContact->details(); - QList noteDetails = mContact->details(); - QList familyDetails = mContact->details(); - - QList ringingtoneDetails = mContact->details(); - bool hasRingingtone = false; - for (int i = 0;i < ringingtoneDetails.count();i++) - { - if (ringingtoneDetails.at(i).subType() == QContactAvatar::SubTypeAudioRingtone) - { - hasRingingtone = true; - break; - } - } - - if (addressDetails.count() || companyDetails.count() || birthdayDetails.count() || - anniversaryDetails.count() || noteDetails.count() || familyDetails.count() || hasRingingtone) - { - mDetailItem = new HbGroupBox(this); - mDetailItem->setHeading(hbTrId("Details")); - mContainerLayout->addItem(mDetailItem); - mDetailItemIndex = mContainerLayout->count(); - - // address details - if (addressDetails.count()) - { - for (int i = 0;i < addressDetails.count();i++) - { - createItem(addressDetails.at(i)); - } - } - - // company details - if (companyDetails.count()) - { - for (int i = 0;i < companyDetails.count();i++) - { - if (!companyDetails.at(i).title().isEmpty() || - !companyDetails.at(i).name().isEmpty() || - !companyDetails.at(i).department().isEmpty()) - { - mExcludeList.append(QContactOrganization::DefinitionName); - createItem(companyDetails.at(i), QContactOrganization::DefinitionName); - } - if (!companyDetails.at(i).assistantName().isEmpty()) - { - mExcludeList.append(QContactOrganization::FieldAssistantName); - createItem(companyDetails.at(i), QContactOrganization::FieldAssistantName); - } - } - } - - // birthday - if (birthdayDetails.count()) - { - mExcludeList.append(QContactBirthday::DefinitionName); - for (int i = 0;i < birthdayDetails.count();i++) - { - createItem(birthdayDetails.at(i)); - } - } - - // anniversary - if (anniversaryDetails.count()) - { - mExcludeList.append(QContactAnniversary::DefinitionName); - for (int i = 0;i < anniversaryDetails.count();i++) - { - createItem(anniversaryDetails.at(i)); - } - } - - // ringing tone - if (ringingtoneDetails.count()) - { - for (int i = 0;i < ringingtoneDetails.count();i++) - { - if (ringingtoneDetails.at(i).subType() == QContactAvatar::SubTypeAudioRingtone) - { - mExcludeList.append(QContactAvatar::SubTypeAudioRingtone); - createItem(ringingtoneDetails.at(i)); - } - } - } - - // notes - if (noteDetails.count()) - { - mExcludeList.append(QContactNote::DefinitionName); - for (int i = 0;i < noteDetails.count();i++) - { - createItem(noteDetails.at(i)); - } - } - - // family details - if (familyDetails.count()) - { - for (int i = 0;i < familyDetails.count();i++) - { - if (!familyDetails.at(i).spouse().isEmpty()) - { - mExcludeList.append(QContactFamily::FieldSpouse); - createItem(familyDetails.at(i), QContactFamily::FieldSpouse); - } - if (familyDetails.at(i).children().count()) - { - mExcludeList.append(QContactFamily::FieldChildren); - createItem(familyDetails.at(i), QContactFamily::FieldChildren); - } - } - } - } -} - -void CntEditView::onLongPressed(const QPointF &point) -{ - CntEditViewDetailItem *item = qobject_cast(sender()); - QContactDetail detail = item->detail(); - - HbMenu *menu = new HbMenu(); - HbAction *addDetailAction = 0; - HbAction *editAction = 0; - HbAction *deleteAction = 0; - - // not possible for some of the details or when detail type doesn't exist yet - if (detail.definitionName() != QContactAddress::DefinitionName && - detail.definitionName() != QContactFamily::DefinitionName && - detail.definitionName() != QContactOrganization::DefinitionName && - detail.definitionName() != QContactBirthday::DefinitionName && - detail.definitionName() != QContactAnniversary::DefinitionName && - detail.definitionName() != QContactAvatar::DefinitionName && - !detail.isEmpty()) - { - addDetailAction = menu->addAction(hbTrId("Add detail")); - } - - editAction = menu->addAction(hbTrId("Edit")); - - // only add this if details contains something to delete - if (!detail.isEmpty()) - { - deleteAction = menu->addAction(hbTrId("Delete detail")); - } - - HbAction *selectedAction = menu->exec(point); - - if (selectedAction) - { - if (selectedAction == editAction) - { - onItemActivated(); - } - else if (selectedAction == deleteAction) - { - deleteDetail(); - } - else if (selectedAction == addDetailAction) - { - addDetail(); - } - } - menu->deleteLater(); + Q_D(CntEditView); + d->deactivate(); } -void CntEditView::onItemActivated() +bool CntEditView::isDefault() const { - CntEditViewDetailItem *item = qobject_cast(sender()); - QContactDetail detail = item->detail(); - - QString field = detail.definitionName(); - - // check the context (needed for editing postal address) - // or the index of the detail (needed for other editors for correct VKB handling) - QString context; - if (detail.contexts().count() && field == QContactAddress::DefinitionName) - { - context = detail.contexts().at(0); - } - // Phone number - else if (field == QContactPhoneNumber::DefinitionName) - { - int index = mContact->details().indexOf(detail); - context.setNum(index); - } - // Email address - else if (field == QContactEmailAddress::DefinitionName) - { - int index = mContact->details().indexOf(detail); - context.setNum(index); - } - // Online account (IM) - else if (field == QContactOnlineAccount::DefinitionName) - { - int index = mContact->details().indexOf(detail); - context.setNum(index); - } - // URL - else if (field == QContactUrl::DefinitionName) - { - int index = mContact->details().indexOf(detail); - context.setNum(index); - } - // Note - else if (field == QContactNote::DefinitionName) - { - int index = mContact->details().indexOf(detail); - context.setNum(index); - } - // Family details - else if (field == QContactFamily::DefinitionName) - { - if (item->fieldType() == QContactFamily::FieldSpouse) - { - context = "spouse"; - } - } - // Company details - else if (field == QContactOrganization::DefinitionName) - { - if (item->fieldType() == field) - { - context = "company"; - } - } - // Ringing tone - else if (field == QContactAvatar::DefinitionName) - { - // launch ringtone picker service - } - - CntViewParameters viewParameters(CntViewParameters::noView); - viewParameters = prepareToEditContact(field, context); - viewParameters.setSelectedContact(*contact()); - if (viewParameters.nextViewId() != CntViewParameters::noView) - { - viewManager()->changeView(viewParameters); - } -} - -/*! -Open the editor for the selected detail and add a new empty field with default subtype & context -*/ -void CntEditView::addDetail() -{ - CntEditViewDetailItem *item = qobject_cast(sender()); - QContactDetail detail = item->detail(); - QString field = detail.definitionName(); - - CntViewParameters viewParameters(CntViewParameters::noView); - QString action("add"); - viewParameters = prepareToEditContact(field, action); - viewParameters.setSelectedContact(*contact()); - if (viewParameters.nextViewId() != CntViewParameters::noView) - { - viewManager()->changeView(viewParameters); - } + return false; } -/*! -Delete the selected (via longtap menu) detail -*/ -void CntEditView::deleteDetail() +HbView* CntEditView::view() const { - CntEditViewDetailItem *item = qobject_cast(sender()); - QContactDetail detail = item->detail(); - - // family detail needs special checking as it is split in multiple items in the list - if (detail.definitionName() == QContactFamily::DefinitionName) - { - QContactFamily family(detail); - - if (item->fieldType() == QContactFamily::FieldSpouse) - { - family.setSpouse(QString()); - mExcludeList.removeOne(QContactFamily::FieldSpouse); - } - else - { - family.setChildren(QStringList()); - mExcludeList.removeOne(QContactFamily::FieldChildren); - } - contact()->saveDetail(&family); - } - // same goes for company details - else if (detail.definitionName() == QContactOrganization::DefinitionName) - { - QContactOrganization company(detail); - - if (item->fieldType() == QContactOrganization::DefinitionName) - { - company.setTitle(QString()); - company.setDepartment(QStringList()); - company.setName(QString()); - mExcludeList.removeOne(QContactOrganization::DefinitionName); - } - else - { - company.setAssistantName(QString()); - mExcludeList.removeOne(QContactOrganization::FieldAssistantName); - } - contact()->saveDetail(&company); - } - else if (detail.definitionName() == QContactBirthday::DefinitionName) - { - mExcludeList.removeOne(QContactBirthday::DefinitionName); - contact()->removeDetail(&detail); - } - else if (detail.definitionName() == QContactAnniversary::DefinitionName) - { - mExcludeList.removeOne(QContactAnniversary::DefinitionName); - contact()->removeDetail(&detail); - } - else if (detail.definitionName() == QContactAvatar::DefinitionName) - { - mExcludeList.removeOne(QContactAvatar::SubTypeAudioRingtone); - contact()->removeDetail(&detail); - } - else if (detail.definitionName() == QContactNote::DefinitionName) - { - contact()->removeDetail(&detail); - if (!contact()->details().count()) - { - mExcludeList.removeOne(QContactNote::DefinitionName); - } - } - else - { - contact()->removeDetail(&detail); - } - - // if removed detail was the last of its type, create an empty one as a replacement (else decrease detail item index) - if (detail.definitionName() == QContactPhoneNumber::DefinitionName) - { - if (contact()->details().count()) - { - mDetailItemIndex--; - mAddressItemIndex--; - mContainerLayout->removeItem(item); - item->deleteLater(); - } - else - { - QContactPhoneNumber number; - item->setDetail(number); - } - } - else if (detail.definitionName() == QContactEmailAddress::DefinitionName) - { - if (contact()->details().count()) - { - mDetailItemIndex--; - mAddressItemIndex--; - mContainerLayout->removeItem(item); - item->deleteLater(); - } - else - { - QContactEmailAddress email; - item->setDetail(email); - } - } - else if (detail.definitionName() == QContactAddress::DefinitionName) - { - mContainerLayout->removeItem(item); - item->deleteLater(); - - if (!contact()->details().count()) - { - QContactAddress address; - createItem(address, QString(), mAddressItemIndex); - mDetailItemIndex++; - } - } - else if (detail.definitionName() == QContactOnlineAccount::DefinitionName) - { - if (contact()->details().count()) - { - mDetailItemIndex--; - mContainerLayout->removeItem(item); - item->deleteLater(); - } - else - { - QContactOnlineAccount account; - item->setDetail(account); - } - } - else if (detail.definitionName() == QContactUrl::DefinitionName) - { - if (contact()->details().count()) - { - mDetailItemIndex--; - mContainerLayout->removeItem(item); - item->deleteLater(); - } - else - { - QContactUrl url; - item->setDetail(url); - } - } - else - { - mContainerLayout->removeItem(item); - item->deleteLater(); - } - - if (mContainerLayout->count() == mDetailItemIndex) - { - mContainerLayout->removeItem(mDetailItem); - mDetailItem->deleteLater(); - mDetailItemIndex = -1; - } - - actions()->baseAction("cnt:discardallchanges")->setEnabled(true); - actions()->baseAction("cnt:save")->setEnabled(true); -} - -/*! -Add actions also to toolbar -*/ -void CntEditView::addActionsToToolBar() -{ - //Add Action to the toolbar - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:addfield"); - actions()->addActionsToToolBar(toolBar()); - - connect(actions()->baseAction("cnt:addfield"), SIGNAL(triggered()), - this, SLOT(addField())); -} - -/*! -Add actions to options menu -*/ -void CntEditView::addMenuItems() -{ - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:save") << actions()->baseAction("cnt:discardallchanges") << - actions()->baseAction("cnt:deletecontact"); - actions()->addActionsToMenu(menu()); - - connect(actions()->baseAction("cnt:discardallchanges"), SIGNAL(triggered()), - this, SLOT(discardAllChanges())); - - connect(actions()->baseAction("cnt:deletecontact"), SIGNAL(triggered()), - this, SLOT(deleteContact())); - - connect(actions()->baseAction("cnt:save"), SIGNAL(triggered()), - this, SLOT(aboutToCloseView())); + Q_D( const CntEditView ); + return d->mView; } -/*! -Cancel all changes made and return to names view -*/ -void CntEditView::discardAllChanges() -{ - CntViewParameters viewParameters(CntViewParameters::namesView); - viewManager()->back(viewParameters); -} - -/*! -Launch delete query -*/ -void CntEditView::deleteContact() -{ - commands()->deleteContact(*contact()); -} - -/*! -Open the "Add field" popup and launch a specific detail editor view if needed -*/ -void CntEditView::addField() -{ - QString detail = CntDetailPopup::selectDetail(mExcludeList); - - if (detail == QContactNote::DefinitionName) - { - CntViewParameters viewParameters(CntViewParameters::noteEditorView); - viewParameters.setSelectedContact(*contact()); - viewManager()->changeView(viewParameters); - } - else if (detail == QContactAvatar::SubTypeAudioRingtone) - { - // launch ringtone selection service - } - else if (detail == QContactAnniversary::DefinitionName) - { - CntViewParameters viewParameters(CntViewParameters::dateEditorView); - viewParameters.setSelectedContact(*contact()); - viewManager()->changeView(viewParameters); - } - else if (detail == QContactOrganization::DefinitionName) - { - CntViewParameters viewParameters(CntViewParameters::companyEditorView); - viewParameters.setSelectedContact(*contact()); - viewParameters.setSelectedAction("company"); - viewManager()->changeView(viewParameters); - } - else if (detail == QContactFamily::FieldSpouse) - { - CntViewParameters viewParameters(CntViewParameters::familyDetailEditorView); - viewParameters.setSelectedContact(*contact()); - viewParameters.setSelectedAction("spouse"); - viewManager()->changeView(viewParameters); - } - 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) - } -} - -/*! -Opens the name detail editor view -*/ -void CntEditView::openNameEditor() -{ - CntViewParameters viewParameters(CntViewParameters::namesEditorView); - viewParameters.setSelectedContact(*contact()); - viewManager()->changeView(viewParameters); -} - -/*! -Opens the image detail editor view -*/ -void CntEditView::openImageEditor() -{ - CntViewParameters viewParameters(CntViewParameters::imageEditorView); - viewParameters.setSelectedContact(*contact()); - viewManager()->changeView(viewParameters); -} - -/* -Handle signals emitted from CntCommands, only used for delete command for now. -*/ -int CntEditView::handleExecutedCommand(QString aCommand, const QContact &aContact) +int CntEditView::viewId() const { - Q_UNUSED(aContact); - int result=-1; - if (aCommand == "delete") - { - CntViewParameters viewParameters(CntViewParameters::namesView); - viewParameters.setSelectedContact(*contact()); - viewParameters.setSelectedAction("delete"); - viewManager()->changeView(viewParameters); - result=0; - } - return result; -} - -/*! -Set correct next view id and possible action string (used for "Add detail" longtap menu command -and when opening postal address editor view) -*/ -CntViewParameters CntEditView::prepareToEditContact(const QString &aViewType, const QString &aAction) -{ - CntViewParameters viewParameters(CntViewParameters::noView); - - // open name editor - if (aViewType == QContactName::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::namesEditorView); - } - // open number editor - else if (aViewType == QContactPhoneNumber::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::phoneNumberEditorView); - } - // open email editor - else if (aViewType == QContactEmailAddress::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::emailEditorView); - } - // open address editor - else if (aViewType == QContactAddress::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::addressEditorView); - } - // open online account editor - else if (aViewType == QContactOnlineAccount::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::phoneNumberEditorView); - } - // open URL editor - else if (aViewType == QContactUrl::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::urlEditorView); - } - // open note editor - else if (aViewType == QContactNote::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::noteEditorView); - } - // open family detail editor - else if (aViewType == QContactFamily::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::familyDetailEditorView); - } - // open company detail editor - else if (aViewType == QContactOrganization::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::companyEditorView); - } - // open date detail editor - else if (aViewType == QContactBirthday::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::dateEditorView); - } - // open date detail editor - else if (aViewType == QContactAnniversary::DefinitionName) - { - viewParameters.setNextViewId(CntViewParameters::dateEditorView); - } - else - { - viewParameters.setNextViewId(CntViewParameters::noView); - } - - viewParameters.setSelectedAction(aAction); - - return viewParameters; -} - -void CntEditView::createItem(const QContactDetail &detail, const QString &type, int position) -{ - CntEditViewDetailItem *item = new CntEditViewDetailItem(mContainerWidget); - item->setDetail(detail, type); - mContainerLayout->insertItem(position, item); - connect(item, SIGNAL(longPressed(const QPointF&)), this, SLOT(onLongPressed(const QPointF&))); - connect(item, SIGNAL(clicked()), this, SLOT(onItemActivated())); -} - -QContact *CntEditView::contact() -{ - return mContact; -} - -void CntEditView::setContact(QContact* aContact) -{ - if (contact()) - { - delete mContact; - } - mContact=aContact; -} - + return editView; +} // EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditview_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cnteditview_p.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,448 @@ +/* +* 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 "cnteditview_p.h" +#include "cnteditviewlistmodel.h" +#include "cntdocumentloader.h" +#include "cntdetailpopup.h" +#include "cnteditviewheadingitem.h" +#include "cntimagelabel.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const char *CNT_EDIT_XML = ":/xml/contacts_ev.docml"; + +CntEditViewPrivate::CntEditViewPrivate() : +mModel( NULL ), +mImageLabel( NULL ), +mThumbnailManager( NULL ) +{ + mDocument = new CntDocumentLoader; + + bool ok; + mDocument->load( CNT_EDIT_XML, &ok ); + if ( !ok ){ + qFatal( "Unable to load %S", CNT_EDIT_XML ); + } + mView = static_cast( mDocument->findWidget("view") ); + mListView = static_cast( mDocument->findWidget("listView") ); + mListView->setLayoutName("editviewlist"); + HbFrameBackground frame; + frame.setFrameGraphicsName("qtg_fr_list_normal"); + frame.setFrameType(HbFrameDrawer::NinePieces); + mListView->itemPrototypes().first()->setDefaultFrame(frame); + + mHeading = static_cast( mDocument->findWidget("editViewHeading") ); + mImageLabel = static_cast(mDocument->findWidget("editViewImage")); + + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + mDiscard = static_cast( mDocument->findObject("cnt:discard") ); + mSave = static_cast( mDocument->findObject("cnt:savecontact") ); + mDelete = static_cast( mDocument->findObject("cnt:deletecontact") ); + + HbAction* add = static_cast( mDocument->findObject("cnt:adddetail_options") ); + HbAction* removeContact = static_cast( mDocument->findObject("cnt:deletecontact") ); + + connect( add, SIGNAL(triggered()), this, SLOT(addDetailItem()) ); + connect( mDelete, SIGNAL(triggered()), this, SLOT(deleteContact()) ); + connect( mDiscard, SIGNAL(triggered()), this, SLOT(discardChanges()) ); + connect( mSave, SIGNAL(triggered()), this, SLOT(saveChanges()) ); + + connect( mSoftkey, SIGNAL(triggered()), this, SLOT(saveChanges()) ); + connect( mImageLabel, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) ); + connect( mHeading, SIGNAL(textClicked()), this, SLOT(openNameEditor()) ); + connect( mHeading, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) ); + connect( mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(activated(const QModelIndex&)) ); + connect( mListView, SIGNAL(longPressed(HbAbstractViewItem*,const QPointF&)), this, SLOT(longPressed(HbAbstractViewItem*,const QPointF&)) ); +} + +CntEditViewPrivate::~CntEditViewPrivate() +{ + mView->deleteLater(); + delete mDocument; + delete mListView; + delete mModel; + delete mContact; + delete mThumbnailManager; +} + +void CntEditViewPrivate::setOrientation(Qt::Orientation orientation) +{ + if (orientation == Qt::Vertical) + { + // reading "portrait" section + mDocument->load( CNT_EDIT_XML, "portrait" ); + } + else + { + // reading "landscape" section + mDocument->load( CNT_EDIT_XML, "landscape" ); + } +} + +void CntEditViewPrivate::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) +{ + mMgr = aMgr; + if ( mView->navigationAction() != mSoftkey) + { + mView->setNavigationAction(mSoftkey); + } + HbMainWindow* window = mView->mainWindow(); + if ( window ) + { + connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); + setOrientation(window->orientation()); + } + + QVariant contact = aArgs.value( ESelectedContact ); + mContact = new QContact( contact.value() ); + QContactLocalId localId = mContact->localId(); + + QContactManager* cm = mMgr->contactManager(SYMBIAN_BACKEND); + QContactLocalId selfContactId = cm->selfContactId(); + + HbMenu* menu = mView->menu(); + // don't delete contact which is "MyCard" or not saved yet or both. + if ( localId == selfContactId && selfContactId != 0 && mContact->details().count() <= 4 || localId == 0 ) + { + mDelete->setEnabled( false ); + } + // save and discard disabled if no changes found + if ( (*mContact) == cm->contact( mContact->localId()) ) + { + mDiscard->setEnabled( false ); + mSave->setEnabled( false ); + } + + mHeading->setDetails( mContact ); + mModel = new CntEditViewListModel( mContact ); + mListView->setModel( mModel ); + + mThumbnailManager = new ThumbnailManager(this); + mThumbnailManager->setMode(ThumbnailManager::Default); + mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); + mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailLarge); + + connect( mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), + this, SLOT(thumbnailReady(QPixmap, void*, int, int)) ); + + loadAvatar(); +} + +void CntEditViewPrivate::deactivate() +{ +} + +void CntEditViewPrivate::activated( const QModelIndex& aIndex ) +{ + CntEditViewItem* item = mModel->itemAt( aIndex ); + QVariant type = item->data( ERoleItemType ); + if ( type == QVariant(ETypeUiExtension) ) + { + item->activated(); + mModel->refreshExtensionItems( aIndex ); + } + else + { + // open editor view + QVariant id = item->data( ERoleEditorViewId ); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, id.toInt()); + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); + + mMgr->changeView( viewParameters ); + } +} + +void CntEditViewPrivate::longPressed( HbAbstractViewItem* aItem, const QPointF& aCoords ) +{ + CntEditViewItem* item = mModel->itemAt( aItem->modelIndex() ); + QVariant type = item->data( ERoleItemType ); + + // Ui extensions handle the long press by themselves. + if ( type == QVariant(ETypeUiExtension) ) + { + item->longPressed( aCoords ); + mModel->refreshExtensionItems( aItem->modelIndex() ); + } + // only detail items are able to show context specific menu + else + { + QVariant cd = item->data( ERoleContactDetail ); + + HbMenu* menu = new HbMenu(); + menu->addActions( createPopup(item) ); + HbAction* selected = menu->exec( aCoords ); + + if ( selected ) + { + switch ( selected->commandRole() ) + { + case HbAction::EditRole: + { + editDetail( item ); + } + break; + + case HbAction::NewRole: + { + addDetail( item ); + } + break; + + case HbAction::DeleteRole: + { + removeDetail( item, aItem->modelIndex() ); + } + break; + + default: + break; + } + } + + delete menu; + } +} + +void CntEditViewPrivate::addDetailItem() +{ + int detailEditorId = CntDetailPopup::selectDetail(); + if (detailEditorId != noView ) + { + CntViewParameters viewParameters; + viewParameters.insert(EViewId, detailEditorId ); + switch ( detailEditorId ) + { + case phoneNumberEditorView: + case emailEditorView: + case urlEditorView: + case noteEditorView: + viewParameters.insert( ESelectedAction, "add" ); + break; + case addressEditorView: + case dateEditorView: + case companyEditorView: + case familyDetailEditorView: + viewParameters.insert( ESelectedAction, "focus" ); + break; + default: + break; + } + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); + mMgr->changeView(viewParameters); + } +} + +void CntEditViewPrivate::deleteContact() +{ + QContactManager* cm = mMgr->contactManager( SYMBIAN_BACKEND ); + QString name = cm->synthesizedDisplayLabel( *mContact ); + + 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()) + { + cm->removeContact( mContact->localId() ); + emit contactRemoved(); + + CntViewParameters viewParameters; + mMgr->back( viewParameters ); + } + delete note; +} + +void CntEditViewPrivate::discardChanges() +{ + emit changesDiscarded(); + + // get a fresh one from backend. + QContactManager* mgr = mMgr->contactManager(SYMBIAN_BACKEND); + mContact = new QContact(mgr->contact( mContact->localId() )); + + QVariant var; + var.setValue(*mContact); + + CntViewParameters viewParameters; + viewParameters.insert(ESelectedContact, var); + + mMgr->back( viewParameters ); +} + +void CntEditViewPrivate::saveChanges() +{ + QContactManager* mgr = mMgr->contactManager( SYMBIAN_BACKEND ); + mgr->saveContact( mContact ); + emit contactUpdated(); + + QVariant var; + var.setValue(*mContact); + + CntViewParameters viewParameters; + viewParameters.insert(ESelectedContact, var); + viewParameters.insert( ESelectedAction, "save" ); + + mMgr->back( viewParameters ); +} + +void CntEditViewPrivate::openNameEditor() +{ + QVariant var; + var.setValue(*mContact); + + CntViewParameters viewParameters; + viewParameters.insert(EViewId, namesEditorView); + viewParameters.insert(ESelectedContact, var); + + mMgr->changeView( viewParameters ); +} + +void CntEditViewPrivate::openImageEditor() +{ + QVariant var; + var.setValue(*mContact); + + CntViewParameters viewParameters; + viewParameters.insert(ESelectedContact, var); + viewParameters.insert(EViewId, imageEditorView ); + + mMgr->changeView( viewParameters ); +} + +void CntEditViewPrivate::loadAvatar() +{ + QList details = mContact->details(); + for (int i = 0;i < details.count();i++) + { + QUrl url = details.at(i).imageUrl(); + if ( url.isValid() ) + { + mThumbnailManager->getThumbnail( url.toString() ); + break; + } + } +} + +void CntEditViewPrivate::thumbnailReady( const QPixmap& pixmap, void *data, int id, int error ) +{ + Q_UNUSED(data); + Q_UNUSED(id); + if (!error) + { + QIcon qicon(pixmap); + HbIcon icon(qicon); + mHeading->setIcon(icon); + + mImageLabel->clear(); + mImageLabel->setIcon(icon); + } +} + +QList CntEditViewPrivate::createPopup( CntEditViewItem* aDetail ) +{ + QList actions; + CntStringMapper* map = new CntStringMapper(); + QVariant cd = aDetail->data( ERoleContactDetail ); + QContactDetail detail = cd.value(); + + HbAction* edit = static_cast(mDocument->findObject("cnt:editdetail")); + + HbAction* add = static_cast(mDocument->findObject("cnt:adddetail_popup")); + QString text = add->text(); + add->setText( text.arg( "%1", map->getMappedDetail(detail.definitionName())) ); + + HbAction* del = static_cast(mDocument->findObject("cnt:deletedetail")); + text = edit->text(); + del->setText( text.arg("%1", map->getMappedDetail(detail.definitionName())) ); + + add->setCommandRole( HbAction::NewRole ); + edit->setCommandRole( HbAction::EditRole ); + del->setCommandRole( HbAction::DeleteRole ); + + if ( !mModel->isEmptyItem(aDetail) ) + { + // add is supported only on these items: + // QContactPhonenumber, QContactOnlineAccount, QContactEmail, QContactUrl and QContactNote + QString def = detail.definitionName(); + if ( def == QContactPhoneNumber::DefinitionName || + def == QContactOnlineAccount::DefinitionName || + def == QContactEmailAddress::DefinitionName || + def == QContactUrl::DefinitionName || + def == QContactNote::DefinitionName ) + { + actions.append( add ); + } + actions.append( edit ); + actions.append( del ); + } + else + { + actions.append( edit ); + } + delete map; + return actions; +} + +void CntEditViewPrivate::addDetail( CntEditViewItem* aDetail ) +{ + QVariant id = aDetail->data( ERoleEditorViewId ); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, id.toInt()); + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); + viewParameters.insert(ESelectedAction, "add" ); + + mMgr->changeView( viewParameters ); +} + +void CntEditViewPrivate::editDetail( CntEditViewItem* aDetail ) +{ + QVariant id = aDetail->data( ERoleEditorViewId ); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, id.toInt()); + QVariant var; + var.setValue(*mContact); + + viewParameters.insert(ESelectedContact, var); + + mMgr->changeView( viewParameters ); +} + +void CntEditViewPrivate::removeDetail( CntEditViewItem* aDetail, const QModelIndex& aIndex ) +{ + mModel->removeItem( aDetail, aIndex ); + mSave->setEnabled( true ); + mDiscard->setEnabled( true ); +} +// End of File + diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditviewdetailitem.cpp --- a/phonebookui/pbkcommonui/src/cnteditviewdetailitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditviewdetailitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,6 +16,8 @@ */ #include "cnteditviewdetailitem.h" +#include "cntabstractviewmanager.h" +#include "cnteditviewlistmodel.h" #include #include @@ -28,423 +30,472 @@ #include -CntEditViewDetailItem::CntEditViewDetailItem(QGraphicsItem *parent): - HbWidget(parent), - mIcon(0), - mLabel(0), - mContent(0), - mFrameItem(0), - mFocusItem(0), - mHasFocus(false), - mGestureFilter(0), - mGestureLongpressed(0) +CntEditViewDetailItem::CntEditViewDetailItem( QContactDetail aDetail, QString aField, int aEditorViewId ) : +QObject(), +mDetail( aDetail ), +mEditorViewId( aEditorViewId ) { - HbEffect::add(QString("frameitem"), QString(":/xml/edit_button_pressed.fxml"), QString("pressed")); - HbEffect::add(QString("frameitem"), QString(":/xml/edit_button_released.fxml"), QString("released")); + mField << aField; +} - setFlag(QGraphicsItem::ItemIsFocusable, true); - setFocusPolicy(Qt::StrongFocus); - initGesture(); +CntEditViewDetailItem::CntEditViewDetailItem( QContactDetail aDetail, QStringList aField, int aEditorViewId ) : +QObject(), +mDetail( aDetail ), +mField( aField ), +mEditorViewId( aEditorViewId ) +{ } CntEditViewDetailItem::~CntEditViewDetailItem() { +} +void CntEditViewDetailItem::addText( QString aText ) +{ + mTextList << aText; +} + +void CntEditViewDetailItem::addIcon( HbIcon aIcon ) +{ + mIconList << aIcon; } -void CntEditViewDetailItem::createPrimitives() +QVariant CntEditViewDetailItem::data( int aRole ) const { - if (!icon.isNull()) - { - if (!mIcon) - { - mIcon = new HbIconItem(this); - mIcon->setIcon(icon); - style()->setItemName(mIcon, "icon"); - } - } - else - { - if (mIcon) - { - delete mIcon; - } - mIcon = 0; - } - - if (!text.isNull()) - { - if (!mLabel) - { - mLabel = new HbTextItem(this); - mLabel->setText(text); - style()->setItemName(mLabel, "text"); - } - } - else - { - if (mLabel) - { - delete mLabel; - } - mLabel = 0; - } - - if (!valueText.isNull()) + switch ( aRole ) { - if (!mContent) - { - mContent = new HbTextItem(this); - mContent->setText(valueText); - mContent->setTextWrapping(Hb::TextNoWrap); - style()->setItemName(mContent, "valueText"); - - // make sure phone number truncation characters are placed - // on left side of the phone number. - if ( mDetail.definitionName() == QContactPhoneNumber::DefinitionName ) - { - mContent->setElideMode( Qt::ElideLeft ); - } - } - } - else + case Qt::DisplayRole: // text + return mTextList; + + case Qt::DecorationRole: // icon + return mIconList; + + case ERoleItemType: + return QVariant( ETypeDetailItem ); + + case ERoleEditorViewId: // detail editor view id + return QVariant( mEditorViewId ); + + case ERoleContactDetailFields: + return QVariant( mField ); + + case ERoleContactDetailDef: + return QVariant( mDetail.definitionName() ); + + case ERoleContactDetail: { - if (mContent) - { - delete mContent; - } - mContent = 0; + QVariant detail; + detail.setValue(mDetail); + return detail; } - - if (!mFrameItem) - { - mFrameItem = new HbFrameItem(this); - mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_list_normal"); - mFrameItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); - mFrameItem->setZValue(-2); - style()->setItemName(mFrameItem, "background"); - } - - if (!mFocusItem) - { - mFocusItem = new HbFrameItem(this); - mFocusItem->frameDrawer().setFrameGraphicsName("qtg_fr_list_pressed"); - mFocusItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); - mFocusItem->setZValue(-1); - mFocusItem->setVisible(false); - style()->setItemName(mFocusItem, "highlight"); + + default: + return QVariant(); } } -void CntEditViewDetailItem::recreatePrimitives() +void CntEditViewDetailItem::activated() { - HbWidget::recreatePrimitives(); - - delete mIcon; - mIcon = 0; - - delete mLabel; - mLabel = 0; - - delete mContent; - mContent = 0; - - delete mFrameItem; - mFrameItem = 0; - - delete mFocusItem; - mFocusItem = 0; - - createPrimitives(); -} - -void CntEditViewDetailItem::initGesture() -{ - mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); - mGestureLongpressed = new HbGesture(HbGesture::longpress, 5); - mGestureFilter->addGesture(mGestureLongpressed); - mGestureFilter->setLongpressAnimation(true); - installSceneEventFilter(mGestureFilter); - - connect(mGestureLongpressed, SIGNAL(longPress(QPointF)), this, SLOT(onLongPress(QPointF))); -} - -void CntEditViewDetailItem::onLongPress(const QPointF &point) -{ - mHasFocus = false; - updatePrimitives(); - emit longPressed(point); } -void CntEditViewDetailItem::setDetail(const QContactDetail &detail, const QString &type) +void CntEditViewDetailItem::longPressed(const QPointF &coords) { - bool doPolish = false; - if (!mDetail.isEmpty() && detail != mDetail) - { - text.clear(); - valueText.clear(); - icon.clear(); - doPolish = true; - } - mDetail = detail; - mType = type; - - QString context; - if (mDetail.contexts().count()) - { - context = mStringMapper.getMappedDetail(detail.contexts().at(0)); - } - - // phone number - if (mDetail.definitionName() == QContactPhoneNumber::DefinitionName) - { - QContactPhoneNumber number = mDetail; - if (number.isEmpty()) - { - text = hbTrId("txt_phob_list_add_phone_number"); - icon = HbIcon(mStringMapper.getMappedIcon(number.definitionName())); - } - else if ( !number.subTypes().isEmpty() ) - { - QStringList list; - list << mStringMapper.getMappedDetail(number.subTypes().at(0)) << context; - text = list.join(" "); - valueText = number.number(); - icon = HbIcon(mStringMapper.getMappedIcon(number.subTypes().at(0))); - } - } - - // email address - if (mDetail.definitionName() == QContactEmailAddress::DefinitionName) - { - QContactEmailAddress email = mDetail; - if (email.isEmpty()) - { - text = hbTrId("txt_phob_list_add_email_address"); - icon = HbIcon(mStringMapper.getMappedIcon(email.definitionName())); - } - else - { - QStringList list; - list << mStringMapper.getMappedDetail(email.definitionName()) << context; - text = list.join(" "); - valueText = email.emailAddress(); - icon = HbIcon(mStringMapper.getMappedIcon(email.definitionName())); - } - } - - // postal address - if (mDetail.definitionName() == QContactAddress::DefinitionName) - { - QContactAddress address = mDetail; - if (address.isEmpty()) - { - text = qtTrId("Add postal address"); - icon = HbIcon(mStringMapper.getMappedIcon(address.definitionName())); - } - else - { - QStringList nameList; - nameList << mStringMapper.getMappedDetail(address.definitionName()) << context; - text = nameList.join(" "); - QStringList list; - if (!address.street().isEmpty()) - list << address.street(); - if (!address.postcode().isEmpty()) - list << address.postcode(); - if (!address.postOfficeBox().isEmpty()) - list << address.postOfficeBox(); - if (!address.locality().isEmpty()) - list << address.locality(); - if (!address.region().isEmpty()) - list << address.region(); - if (!address.country().isEmpty()) - list << address.country(); - - QString data = list.join(", "); - valueText = data; - } - } - - // online account - if (mDetail.definitionName() == QContactOnlineAccount::DefinitionName) - { - QContactOnlineAccount account = mDetail; - if (account.isEmpty()) - { - text = hbTrId("Add IM address"); - icon = HbIcon(mStringMapper.getMappedIcon(account.definitionName())); - } - else if ( !account.subTypes().isEmpty() ) - { - QStringList list; - list << mStringMapper.getMappedDetail(account.subTypes().at(0)) << context; - text = list.join(" "); - valueText = account.accountUri(); - icon = HbIcon(mStringMapper.getMappedIcon(account.subTypes().at(0))); - } - } - - // url address - if (mDetail.definitionName() == QContactUrl::DefinitionName) - { - QContactUrl url = mDetail; - if (url.isEmpty()) - { - text = hbTrId("txt_phob_list_add_url_address"); - icon = HbIcon(mStringMapper.getMappedIcon(url.definitionName())); - } - else - { - QStringList list; - list << mStringMapper.getMappedDetail(url.definitionName()) << context; - text = list.join(" "); - valueText = url.url(); - icon = HbIcon(mStringMapper.getMappedIcon(url.definitionName())); - } - } - - // company details - if (mDetail.definitionName() == QContactOrganization::DefinitionName) - { - QContactOrganization org = mDetail; - - // general details - if (mType == QContactOrganization::DefinitionName) - { - text = mStringMapper.getMappedDetail(org.definitionName()); - QStringList list; - if(!org.title().isEmpty()) - list << org.title(); - if(!org.name().isEmpty()) - list << org.name(); - if(!org.department().isEmpty()) - list << org.department().join(" "); - valueText = list.join(", "); - - } - // assistant name - else if (mType == QContactOrganization::FieldAssistantName) - { - text = mStringMapper.getMappedDetail(QContactOrganization::FieldAssistantName); - valueText = org.assistantName(); - } - } - - // birthday - if (mDetail.definitionName() == QContactBirthday::DefinitionName) - { - QContactBirthday bDay = mDetail; - - text = mStringMapper.getMappedDetail(bDay.definitionName()); - valueText = bDay.date().toString("dd MMMM yyyy"); - } - - // anniversary - if (mDetail.definitionName() == QContactAnniversary::DefinitionName) - { - QContactAnniversary anniversary = mDetail; - - text = mStringMapper.getMappedDetail(anniversary.definitionName()); - valueText = anniversary.originalDate().toString("dd MMMM yyyy"); - } - - // ringing tone - if (mDetail.definitionName() == QContactAvatar::DefinitionName) - { - QContactAvatar avatar = mDetail; - - text = mStringMapper.getMappedDetail(QContactAvatar::SubTypeAudioRingtone); - valueText = avatar.avatar(); - } - - // note - if (mDetail.definitionName() == QContactNote::DefinitionName) - { - QContactNote note = mDetail; - - text = mStringMapper.getMappedDetail(note.definitionName()); - valueText = note.note(); - } - - // family details - if (mDetail.definitionName() == QContactFamily::DefinitionName) - { - QContactFamily family = mDetail; - - // spouse - if (mType == QContactFamily::FieldSpouse) - { - text = mStringMapper.getMappedDetail(QContactFamily::FieldSpouse); - valueText = family.spouse(); - - } - // children - else if (mType == QContactFamily::FieldChildren) - { - text = mStringMapper.getMappedDetail(QContactFamily::FieldChildren); - valueText = family.children().join(", "); - } - } - - recreatePrimitives(); - if (doPolish) - { - repolish(); - } + Q_UNUSED( coords ); } - -QContactDetail CntEditViewDetailItem::detail() -{ - return mDetail; -} - -QString CntEditViewDetailItem::fieldType() -{ - return mType; -} - -void CntEditViewDetailItem::updatePrimitives() -{ - HbWidget::updatePrimitives(); - if (mHasFocus) - { - mFocusItem->setVisible(true); - HbEffect::start(mFocusItem, QString("frameitem"), QString("pressed")); - } - else - { - HbEffect::start(mFocusItem, QString("frameitem"), QString("released")); - } -} - -void CntEditViewDetailItem::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - HbInstantFeedback::play(HbFeedback::Basic); - event->accept(); - mHasFocus = true; - updatePrimitives(); -} - -void CntEditViewDetailItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - if (!rect().contains(event->pos()) && mHasFocus) - { - mHasFocus = false; - updatePrimitives(); - } - event->accept(); -} - - -void CntEditViewDetailItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - bool hadFocus = mHasFocus; - mHasFocus = false; - if (rect().contains(event->pos()) && hadFocus) - { - updatePrimitives(); - emit clicked(); - } - event->accept(); -} +// +//void CntEditViewDetailItem::createPrimitives() +//{ +//// if (!icon.isNull()) +//// { +//// if (!mIcon) +//// { +//// mIcon = new HbIconItem(this); +//// mIcon->setIcon(icon); +//// //style()->setItemName(mIcon, "icon"); +//// } +//// } +//// else +//// { +//// if (mIcon) +//// { +//// delete mIcon; +//// } +//// mIcon = 0; +//// } +//// +//// if (!text.isNull()) +//// { +//// if (!mLabel) +//// { +//// mLabel = new HbTextItem(this); +//// mLabel->setText(text); +//// //style()->setItemName(mLabel, "text"); +//// } +//// } +//// else +//// { +//// if (mLabel) +//// { +//// delete mLabel; +//// } +//// mLabel = 0; +//// } +//// +//// if (!valueText.isNull()) +//// { +//// if (!mContent) +//// { +//// mContent = new HbTextItem(this); +//// mContent->setText(valueText); +//// mContent->setTextWrapping(Hb::TextNoWrap); +//// // style()->setItemName(mContent, "valueText"); +//// +//// // make sure phone number truncation characters are placed +//// // on left side of the phone number. +//// if ( mDetail.definitionName() == QContactPhoneNumber::DefinitionName ) +//// { +//// mContent->setElideMode( Qt::ElideLeft ); +//// } +//// } +//// } +//// else +//// { +//// if (mContent) +//// { +//// delete mContent; +//// } +//// mContent = 0; +//// } +//// +//// if (!mFrameItem) +//// { +//// mFrameItem = new HbFrameItem(this); +//// mFrameItem->frameDrawer().setFrameGraphicsName("qtg_fr_list_normal"); +//// mFrameItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); +//// mFrameItem->setZValue(-2); +//// //style()->setItemName(mFrameItem, "background"); +//// } +//// +//// if (!mFocusItem) +//// { +//// mFocusItem = new HbFrameItem(this); +//// mFocusItem->frameDrawer().setFrameGraphicsName("qtg_fr_list_pressed"); +//// mFocusItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); +//// mFocusItem->setZValue(-1); +//// mFocusItem->setVisible(false); +//// //style()->setItemName(mFocusItem, "highlight"); +//// } +//} +// +//void CntEditViewDetailItem::recreatePrimitives() +//{ +//// HbWidget::recreatePrimitives(); +//// +//// delete mIcon; +//// mIcon = 0; +//// +//// delete mLabel; +//// mLabel = 0; +//// +//// delete mContent; +//// mContent = 0; +//// +//// delete mFrameItem; +//// mFrameItem = 0; +//// +//// delete mFocusItem; +//// mFocusItem = 0; +//// +//// createPrimitives(); +//} +// +//void CntEditViewDetailItem::initGesture() +//{ +//// mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); +//// mGestureLongpressed = new HbGesture(HbGesture::longpress, 5); +//// mGestureFilter->addGesture(mGestureLongpressed); +//// mGestureFilter->setLongpressAnimation(true); +//// installSceneEventFilter(mGestureFilter); +//// +//// connect(mGestureLongpressed, SIGNAL(longPress(QPointF)), this, SLOT(onLongPress(QPointF))); +//} +// +//void CntEditViewDetailItem::onLongPress(const QPointF &point) +//{ +// mHasFocus = false; +// updatePrimitives(); +// emit longPressed(point); +//} +// +//void CntEditViewDetailItem::setDetail(const QContactDetail &detail, const QString &type) +//{ +//// bool doPolish = false; +//// if (!mDetail.isEmpty() && detail != mDetail) +//// { +//// text.clear(); +//// valueText.clear(); +//// icon.clear(); +//// doPolish = true; +//// } +//// mDetail = detail; +//// mType = type; +//// +//// QString context; +//// if (mDetail.contexts().count()) +//// { +//// context = mStringMapper.getMappedDetail(detail.contexts().at(0)); +//// } +//// +//// // phone number +//// if (mDetail.definitionName() == QContactPhoneNumber::DefinitionName) +//// { +//// QContactPhoneNumber number = mDetail; +//// if (number.isEmpty()) +//// { +//// text = hbTrId("txt_phob_list_add_phone_number"); +//// icon = HbIcon(mStringMapper.getMappedIcon(number.definitionName())); +//// } +//// else if ( !number.subTypes().isEmpty() ) +//// { +//// QStringList list; +//// list << mStringMapper.getMappedDetail(number.subTypes().at(0)) << context; +//// text = list.join(" "); +//// valueText = number.number(); +//// icon = HbIcon(mStringMapper.getMappedIcon(number.subTypes().at(0))); +//// } +//// } +//// +//// // email address +//// if (mDetail.definitionName() == QContactEmailAddress::DefinitionName) +//// { +//// QContactEmailAddress email = mDetail; +//// if (email.isEmpty()) +//// { +//// text = hbTrId("txt_phob_list_add_email_address"); +//// icon = HbIcon(mStringMapper.getMappedIcon(email.definitionName())); +//// } +//// else +//// { +//// QStringList list; +//// list << mStringMapper.getMappedDetail(email.definitionName()) << context; +//// text = list.join(" "); +//// valueText = email.emailAddress(); +//// icon = HbIcon(mStringMapper.getMappedIcon(email.definitionName())); +//// } +//// } +//// +//// // postal address +//// if (mDetail.definitionName() == QContactAddress::DefinitionName) +//// { +//// QContactAddress address = mDetail; +//// if (address.isEmpty()) +//// { +//// text = qtTrId("Add postal address"); +//// icon = HbIcon(mStringMapper.getMappedIcon(address.definitionName())); +//// } +//// else +//// { +//// QStringList nameList; +//// nameList << mStringMapper.getMappedDetail(address.definitionName()) << context; +//// text = nameList.join(" "); +//// QStringList list; +//// if (!address.street().isEmpty()) +//// list << address.street(); +//// if (!address.postcode().isEmpty()) +//// list << address.postcode(); +//// if (!address.postOfficeBox().isEmpty()) +//// list << address.postOfficeBox(); +//// if (!address.locality().isEmpty()) +//// list << address.locality(); +//// if (!address.region().isEmpty()) +//// list << address.region(); +//// if (!address.country().isEmpty()) +//// list << address.country(); +//// +//// QString data = list.join(", "); +//// valueText = data; +//// } +//// } +//// +//// // online account +//// if (mDetail.definitionName() == QContactOnlineAccount::DefinitionName) +//// { +//// QContactOnlineAccount account = mDetail; +//// if (account.isEmpty()) +//// { +//// text = hbTrId("Add IM address"); +//// icon = HbIcon(mStringMapper.getMappedIcon(account.definitionName())); +//// } +//// else if ( !account.subTypes().isEmpty() ) +//// { +//// QStringList list; +//// list << mStringMapper.getMappedDetail(account.subTypes().at(0)) << context; +//// text = list.join(" "); +//// valueText = account.accountUri(); +//// icon = HbIcon(mStringMapper.getMappedIcon(account.subTypes().at(0))); +//// } +//// } +//// +//// // url address +//// if (mDetail.definitionName() == QContactUrl::DefinitionName) +//// { +//// QContactUrl url = mDetail; +//// if (url.isEmpty()) +//// { +//// text = hbTrId("txt_phob_list_add_url_address"); +//// icon = HbIcon(mStringMapper.getMappedIcon(url.definitionName())); +//// } +//// else +//// { +//// QStringList list; +//// list << mStringMapper.getMappedDetail(url.definitionName()) << context; +//// text = list.join(" "); +//// valueText = url.url(); +//// icon = HbIcon(mStringMapper.getMappedIcon(url.definitionName())); +//// } +//// } +//// +//// // company details +//// if (mDetail.definitionName() == QContactOrganization::DefinitionName) +//// { +//// QContactOrganization org = mDetail; +//// +//// // general details +//// if (mType == QContactOrganization::DefinitionName) +//// { +//// text = mStringMapper.getMappedDetail(org.definitionName()); +//// QStringList list; +//// if(!org.title().isEmpty()) +//// list << org.title(); +//// if(!org.name().isEmpty()) +//// list << org.name(); +//// if(!org.department().isEmpty()) +//// list << org.department().join(" "); +//// valueText = list.join(", "); +//// +//// } +//// // assistant name +//// else if (mType == QContactOrganization::FieldAssistantName) +//// { +//// text = mStringMapper.getMappedDetail(QContactOrganization::FieldAssistantName); +//// valueText = org.assistantName(); +//// } +//// } +//// +//// // birthday +//// if (mDetail.definitionName() == QContactBirthday::DefinitionName) +//// { +//// QContactBirthday bDay = mDetail; +//// +//// text = mStringMapper.getMappedDetail(bDay.definitionName()); +//// valueText = bDay.date().toString("dd MMMM yyyy"); +//// } +//// +//// // anniversary +//// if (mDetail.definitionName() == QContactAnniversary::DefinitionName) +//// { +//// QContactAnniversary anniversary = mDetail; +//// +//// text = mStringMapper.getMappedDetail(anniversary.definitionName()); +//// valueText = anniversary.originalDate().toString("dd MMMM yyyy"); +//// } +//// +//// // ringing tone +//// if (mDetail.definitionName() == QContactAvatar::DefinitionName) +//// { +//// QContactAvatar avatar = mDetail; +//// +//// text = mStringMapper.getMappedDetail(QContactAvatar::SubTypeAudioRingtone); +//// valueText = avatar.avatar(); +//// } +//// +//// // note +//// if (mDetail.definitionName() == QContactNote::DefinitionName) +//// { +//// QContactNote note = mDetail; +//// +//// text = mStringMapper.getMappedDetail(note.definitionName()); +//// valueText = note.note(); +//// } +//// +//// // family details +//// if (mDetail.definitionName() == QContactFamily::DefinitionName) +//// { +//// QContactFamily family = mDetail; +//// +//// // spouse +//// if (mType == QContactFamily::FieldSpouse) +//// { +//// text = mStringMapper.getMappedDetail(QContactFamily::FieldSpouse); +//// valueText = family.spouse(); +//// +//// } +//// // children +//// else if (mType == QContactFamily::FieldChildren) +//// { +//// text = mStringMapper.getMappedDetail(QContactFamily::FieldChildren); +//// valueText = family.children().join(", "); +//// } +//// } +//// +//// recreatePrimitives(); +//// if (doPolish) +//// { +//// repolish(); +//// } +//} +// +//QContactDetail CntEditViewDetailItem::detail() +//{ +// return mDetail; +//} +// +//QString CntEditViewDetailItem::fieldType() +//{ +// return mType; +//} +// +//void CntEditViewDetailItem::updatePrimitives() +//{ +// //HbWidget::updatePrimitives(); +// if (mHasFocus) +// { +// mFocusItem->setVisible(true); +// HbEffect::start(mFocusItem, QString("frameitem"), QString("pressed")); +// } +// else +// { +// HbEffect::start(mFocusItem, QString("frameitem"), QString("released")); +// } +//} +// +//void CntEditViewDetailItem::mousePressEvent(QGraphicsSceneMouseEvent *event) +//{ +// HbInstantFeedback::play(HbFeedback::Basic); +// event->accept(); +// mHasFocus = true; +// updatePrimitives(); +//} +// +//void CntEditViewDetailItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +//{ +//// if (!rect().contains(event->pos()) && mHasFocus) +//// { +//// mHasFocus = false; +//// updatePrimitives(); +//// } +//// event->accept(); +//} +// +// +//void CntEditViewDetailItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +//{ +// bool hadFocus = mHasFocus; +// mHasFocus = false; +//// if (rect().contains(event->pos()) && hadFocus) +//// { +//// updatePrimitives(); +//// emit clicked(); +//// } +//// event->accept(); +//} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp --- a/phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnteditviewheadingitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -25,16 +25,17 @@ #include #include #include +#include #include CntEditViewHeadingItem::CntEditViewHeadingItem(QGraphicsItem *parent) : HbWidget(parent), - mIcon(0), - mLabel(0), - mSecondLabel(0), - mFrameItem(0), - mIconTouchArea(0), + mIcon(NULL), + mLabel(NULL), + mSecondLabel(NULL), + mFrameItem(NULL), + mIconTouchArea(NULL), mIconFocused(false), mTextFocused(false) { @@ -50,7 +51,7 @@ { if (!icon.isNull()) { - if (!mIcon) + if (!mIcon && mainWindow()->orientation() != Qt::Horizontal) { mIcon = new HbIconItem(this); mIcon->setIcon(icon); @@ -63,7 +64,7 @@ { delete mIcon; } - mIcon = 0; + mIcon = NULL; } if (!text.isNull()) @@ -83,7 +84,7 @@ { delete mLabel; } - mLabel = 0; + mLabel = NULL; } if (!second_text.isNull()) @@ -101,7 +102,7 @@ { delete mSecondLabel; } - mSecondLabel = 0; + mSecondLabel = NULL; } if (!mFrameItem) @@ -125,19 +126,19 @@ HbWidget::recreatePrimitives(); delete mIcon; - mIcon = 0; + mIcon = NULL; delete mLabel; - mLabel = 0; + mLabel = NULL; delete mSecondLabel; - mSecondLabel = 0; + mSecondLabel = NULL; delete mFrameItem; - mFrameItem = 0; + mFrameItem = NULL; delete mIconTouchArea; - mIconTouchArea = 0; + mIconTouchArea = NULL; createPrimitives(); } @@ -197,11 +198,15 @@ void CntEditViewHeadingItem::setIcon(const HbIcon newIcon) { - if (newIcon != icon) + if (newIcon != icon ) { icon = newIcon; + if (mIcon != NULL) + { + delete mIcon; + mIcon = NULL; + } createPrimitives(); - mIcon->setIcon(icon); repolish(); } } @@ -249,3 +254,27 @@ } event->accept(); } + +QVariant CntEditViewHeadingItem::itemChange(GraphicsItemChange change, const QVariant &value) +{ + if (change == QGraphicsItem::ItemSceneHasChanged) + { + HbMainWindow *window = mainWindow(); + if (window) + { + connect(window, SIGNAL(orientationChanged(Qt::Orientation)), + this, SLOT(orientationChanged(Qt::Orientation))); + } + else + { + QObject::disconnect(this, SLOT(orientationChanged(Qt::Orientation))); + } + } + return HbWidget::itemChange(change, value); +} + +void CntEditViewHeadingItem::orientationChanged(Qt::Orientation) +{ + recreatePrimitives(); + repolish(); +} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditviewitembuilder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cnteditviewitembuilder.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,443 @@ +/* +* 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 "cnteditviewitembuilder.h" +#include "cnteditviewlistmodel.h" +#include "cnteditviewdetailitem.h" +#include "cntviewparams.h" +#include "cntstringmapper.h" + +CntEditViewItemBuilder::CntEditViewItemBuilder() : +mMap( new CntStringMapper() ) +{ +} + +CntEditViewItemBuilder::~CntEditViewItemBuilder() +{ + delete mMap; +} + +QList CntEditViewItemBuilder::phoneNumberItems(QContact& aContact) +{ + QList list; + QList numbers = aContact.details(); + // template for editor launcher + if ( numbers.isEmpty() ) + { + QContactPhoneNumber number; + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + number, + QContactPhoneNumber::FieldNumber, + phoneNumberEditorView ); + detailItem->addText( hbTrId("txt_phob_list_add_phone_number") ); + detailItem->addIcon( HbIcon(mMap->getMappedIcon(QContactPhoneNumber::DefinitionName)) ); + list.append( detailItem ); + } + // existing phonenumber(s) + else + { + foreach ( QContactPhoneNumber number, numbers ) + { + if ( !number.subTypes().isEmpty() ) + { + QString context = number.contexts().isEmpty() ? "" : number.contexts().first(); + QString subtype = number.subTypes().first(); + + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + number, + QContactPhoneNumber::FieldNumber, + phoneNumberEditorView); + + detailItem->addIcon( mMap->getMappedIcon(subtype) ); + detailItem->addText( mMap->getLocString(subtype, context) ); + detailItem->addText( number.number() ); + list.append( detailItem ); + } + } + } + + QList urls = aContact.details(); + // template for editor launcher + if ( !urls.isEmpty() ) + { + foreach ( QContactOnlineAccount number, urls ) + { + if ( !number.subTypes().isEmpty() ) + { + QString context = number.contexts().isEmpty() ? "" : number.contexts().first(); + QString subtype = number.subTypes().first(); + + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + number, + QContactOnlineAccount::FieldAccountUri, + phoneNumberEditorView); + detailItem->addIcon( mMap->getMappedIcon(subtype) ); + + if ( subtype == QContactOnlineAccount::SubTypeSip ) + { + detailItem->addText( hbTrId("txt_phob_formlabel_val_sip") ); + } + else + { + if ( context == QContactOnlineAccount::ContextHome ) + detailItem->addText( hbTrId("txt_phob_dblist_internet_telephone_home") ); + else if ( context == QContactOnlineAccount::ContextWork ) + detailItem->addText( hbTrId("txt_phob_dblist_internet_telephone_work") ); + else + detailItem->addText( hbTrId("txt_phob_dblist_internet_telephone") ); + } + detailItem->addText( number.accountUri() ); + list.append( detailItem ); + } + } + } + + return list; +} + +QList CntEditViewItemBuilder::emailAddressItems(QContact& aContact) +{ + QList list; + QList emails = aContact.details(); + // template for editor launcher + if ( emails.isEmpty() ) + { + QContactEmailAddress email; + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + email, + QContactEmailAddress::FieldEmailAddress, + emailEditorView); + detailItem->addText( hbTrId("txt_phob_list_add_email_address") ); + detailItem->addIcon( HbIcon(mMap->getMappedIcon(QContactEmailAddress::DefinitionName)) ); + list.append( detailItem ); + } + // existing email(s) + else + { + foreach ( QContactEmailAddress address, emails ) + { + QString context = address.contexts().isEmpty() ? "" : address.contexts().first(); + + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + address, + QContactEmailAddress::FieldEmailAddress, + emailEditorView); + detailItem->addIcon( mMap->getMappedIcon(QContactEmailAddress::DefinitionName) ); + + if ( context == QContactEmailAddress::ContextHome ) + detailItem->addText(hbTrId("txt_phob_formlabel_email_home")); + else if ( context == QContactEmailAddress::ContextWork ) + detailItem->addText(hbTrId("txt_phob_formlabel_email_work")); + else + detailItem->addText( hbTrId("txt_phob_list_email") ); + + detailItem->addText( address.emailAddress() ); + list.append( detailItem ); + } + } + return list; +} + +QList CntEditViewItemBuilder::addressItems(QContact& aContact) +{ + QList list; + QList addresses = aContact.details(); + + if ( addresses.isEmpty() ) + { + QStringList fieldList; + fieldList << QContactAddress::FieldStreet << QContactAddress::FieldPostcode << QContactAddress::FieldPostOfficeBox; + fieldList << QContactAddress::FieldLocality << QContactAddress::FieldRegion << QContactAddress::FieldCountry; + + QContactAddress addr; + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + addr, + fieldList, + addressEditorView); + detailItem->addText( hbTrId("txt_phob_list_add_address") ); + detailItem->addIcon( HbIcon(mMap->getMappedIcon(QContactAddress::DefinitionName)) ); + list.append( detailItem ); + } + return list; +} + +QList CntEditViewItemBuilder::urlItems(QContact& aContact) +{ + QList list; + QList urls = aContact.details(); + // template for editor launcher + if ( urls.isEmpty() ) + { + QContactUrl url; + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + url, + QContactUrl::FieldUrl, + urlEditorView ); + detailItem->addText( hbTrId("txt_phob_list_add_url_address") ); + detailItem->addIcon( HbIcon(mMap->getMappedIcon(QContactUrl::DefinitionName)) ); + list.append( detailItem ); + } + // existing url(s) + else + { + foreach ( QContactUrl url, urls ) + { + QString context = url.contexts().isEmpty() ? "" : url.contexts().first(); + + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + url, + QContactUrl::FieldUrl, + urlEditorView ); + detailItem->addIcon( mMap->getMappedIcon(QContactUrl::DefinitionName) ); + + if ( context == QContactUrl::ContextHome ) + detailItem->addText( hbTrId("txt_phob_dblist_url_home") ); + else if ( context == QContactUrl::ContextWork ) + detailItem->addText( hbTrId("txt_phob_dblist_url_work") ); + else + detailItem->addText( hbTrId("txt_phob_list_url") ); + + detailItem->addText( url.url() ); + list.append( detailItem ); + } + } + return list; +} + +QList CntEditViewItemBuilder::addressDetails(QContact& aContact) +{ + QList list; + // Address + foreach( QContactAddress addr, aContact.details() ) + { + QStringList fieldList; + fieldList << QContactAddress::FieldStreet << QContactAddress::FieldPostcode << QContactAddress::FieldPostOfficeBox; + fieldList << QContactAddress::FieldLocality << QContactAddress::FieldRegion << QContactAddress::FieldCountry; + + QStringList valueList; + foreach ( QString str, fieldList ) + { + valueList << addr.value( str ); + } + + QString address = valueList.join(" ").trimmed(); + if ( !address.isEmpty() ) + { + QString context = addr.contexts().isEmpty() ? "" : mMap->getMappedDetail(addr.contexts().first() ); + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + addr, + fieldList, + addressEditorView); + + if ( context == QContactAddress::ContextHome ) + detailItem->addText(hbTrId("txt_phob_dblist_url_home")); + else if ( context == QContactAddress::ContextWork ) + detailItem->addText(hbTrId("txt_phob_dblist_url_work")); + else + detailItem->addText(hbTrId("txt_phob_list_address")); + + detailItem->addText( address ); + list.append( detailItem ); + } + } + return list; +} + +QList CntEditViewItemBuilder::companyDetails(QContact& aContact) +{ + QList list; + // Company + QContactOrganization org = aContact.detail(); + QStringList detailList; + detailList << org.title(); + detailList << org.name(); + detailList << org.department().join(" ").trimmed(); + + QString company = detailList.join(" ").trimmed(); + if ( !company.isEmpty() ) + { + QStringList fields; + fields << QContactOrganization::FieldTitle; + fields << QContactOrganization::FieldName; + fields << QContactOrganization::FieldDepartment; + + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + org, + fields, + companyEditorView); + detailItem->addText( hbTrId("txt_phob_list_company_details") ); + detailItem->addText( company ); + list.append( detailItem ); + } + + // Assistant + QString assistant = org.assistantName(); + if ( !assistant.isEmpty() ) + { + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + org, + QContactOrganization::FieldAssistantName, + companyEditorView); + detailItem->addText( hbTrId("txt_phob_formlabel_assistant") ); + detailItem->addText( assistant ); + list.append( detailItem ); + } + return list; +} + +QList CntEditViewItemBuilder::dateDetails(QContact& aContact) +{ + QList list; + // Birthday + QContactBirthday bd = aContact.detail(); + if ( bd.date().isValid() ) + { + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + bd, + QContactBirthday::FieldBirthday, + dateEditorView); + detailItem->addText( hbTrId("txt_phob_formlabel_birthday") ); + detailItem->addText(QLocale::system().toString( bd.date() )); + list.append( detailItem ); + } + + // Anniversary + QContactAnniversary anniversary = aContact.detail(); + if ( anniversary.originalDate().isValid() ) + { + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + anniversary, + QContactAnniversary::FieldOriginalDate, + dateEditorView); + detailItem->addText( hbTrId("txt_phob_formlabel_anniversary") ); + detailItem->addText( QLocale::system().toString( anniversary.originalDate() )); + list.append( detailItem ); + } + return list; +} + +QList CntEditViewItemBuilder::noteDetails(QContact& aContact) +{ + QList list; + // Note + foreach ( QContactNote note, aContact.details()) + { + QString text = note.note(); + if ( !text.isEmpty() ) + { + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + note, + QContactNote::FieldNote, + noteEditorView); + detailItem->addText( hbTrId("txt_phob_list_note") ); + detailItem->addText( text ); + list.append( detailItem ); + } + } + return list; +} + +QList CntEditViewItemBuilder::familyDetails(QContact& aContact) +{ + QList list; + // Spouse + QContactFamily family = aContact.detail(); + QString spouse = family.spouse(); + if ( !spouse.isEmpty() ) + { + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + family, + QContactFamily::FieldSpouse, + familyDetailEditorView); + detailItem->addText( hbTrId("txt_phob_formlabel_spouse") ); + detailItem->addText( spouse ); + list.append( detailItem ); + } + + // Children + QString children = family.children().join(", "); + if ( !children.isEmpty() ) + { + CntEditViewDetailItem* detailItem = new CntEditViewDetailItem( + family, + QContactFamily::FieldChildren, + familyDetailEditorView); + detailItem->addText( hbTrId("txt_phob_formlabel_children") ); + detailItem->addText( children ); + list.append( detailItem ); + } + return list; +} + +bool CntEditViewItemBuilder::isTemplateItem( const QString& aDefinition ) +{ + QStringList templateItems; + templateItems << QContactPhoneNumber::DefinitionName; + templateItems << QContactEmailAddress::DefinitionName; + templateItems << QContactAddress::DefinitionName; + templateItems << QContactUrl::DefinitionName; + + return templateItems.contains( aDefinition ); +} + +void CntEditViewItemBuilder::removeDetail( QContact& aContact, QContactDetail& aDetail, QStringList aFields ) +{ + if ( aDetail.definitionName() == QContactOrganization::DefinitionName ) + { + QContactOrganization org = aContact.detail(); + if ( aFields.contains(QContactOrganization::FieldAssistantName) ) + { + org.setAssistantName(QString()); // empty + } + else + { + org.setTitle( QString() ); + org.setName( QString() ); + org.setDepartment( QStringList() ); + } + + if ( org.assistantName().isEmpty() && + org.title().isEmpty() && + org.name().isEmpty() && + org.department().isEmpty() ) + aContact.removeDetail(&org); + else + aContact.saveDetail(&org); + } + + else if ( aDetail.definitionName() == QContactFamily::DefinitionName ) + { + QContactFamily family = aContact.detail(); + if ( aFields.contains(QContactFamily::FieldSpouse) ) + { + family.setSpouse( QString() ); + } + else + { + family.setChildren( QStringList() ); + } + + if ( family.spouse().isEmpty() && family.children().isEmpty() ) + aContact.removeDetail( &family ); + else + aContact.saveDetail( &family ); + } + else + { + aContact.removeDetail( &aDetail ); + } +} +// End of File diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditviewlistmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cnteditviewlistmodel.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,341 @@ +/* +* 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 "cnteditviewlistmodel.h" +#include "cntextensionmanager.h" +#include "cntuiextensionfactory.h" +#include "cnteditviewitemsupplier.h" +#include "cnteditviewdetailitem.h" +#include "cnteditviewitembuilder.h" +#include + +CntEditViewListModel::CntEditViewListModel( QContact* aContact ) : +mContact( aContact ) +{ + mLookupTable.insert( EPhonenumber, -1 ); + mLookupTable.insert( EEmailAddress, -1 ); + mLookupTable.insert( EAddressTemplate,-1 ); + mLookupTable.insert( EPluginItem, -1 ); + mLookupTable.insert( EUrl, -1 ); + mLookupTable.insert( ESeparator, -1 ); + mLookupTable.insert( EAddressDetail, -1 ); + mLookupTable.insert( ECompany, -1 ); + mLookupTable.insert( EDate, -1 ); + mLookupTable.insert( ERingingTone, -1 ); + mLookupTable.insert( ENote, -1 ); + mLookupTable.insert( EFamily, -1 ); + mLookupTable.insert( ESynchronization,-1 ); + + mLookupMap.insert( QContactPhoneNumber::DefinitionName, EPhonenumber ); + mLookupMap.insert( QContactOnlineAccount::DefinitionName, EPhonenumber ); + mLookupMap.insert( QContactEmailAddress::DefinitionName, EEmailAddress ); + mLookupMap.insert( QContactAddress::DefinitionName, EAddressDetail); + mLookupMap.insert( QContactUrl::DefinitionName, EUrl ); + mLookupMap.insert( QContactOrganization::DefinitionName, ECompany); + mLookupMap.insert( QContactBirthday::DefinitionName, EDate ); + mLookupMap.insert( QContactAnniversary::DefinitionName, EDate); + mLookupMap.insert( QContactNote::DefinitionName, ENote); + mLookupMap.insert( QContactFamily::DefinitionName, EFamily); + + mManager = new CntExtensionManager(); + mBuilder = new CntEditViewItemBuilder(); + mSeparator = new CntEditViewSeparator(); + + refresh(); +} + +CntEditViewListModel::~CntEditViewListModel() +{ + qDeleteAll( mItemList ); + + delete mBuilder; + delete mManager; +} + +int CntEditViewListModel::rowCount( const QModelIndex& aParent ) const +{ + Q_UNUSED( aParent ); + return mItemList.size(); +} + +QVariant CntEditViewListModel::data( const QModelIndex& aIndex, int aRole ) const +{ + if ( aIndex.row() >= 0 && aIndex.row() < mItemList.size() ) + { + CntEditViewItem* item = mItemList.at( aIndex.row() ); + return item->data( aRole ); + } + return QVariant(); +} + +Qt::ItemFlags CntEditViewListModel::flags(const QModelIndex& aIndex) const +{ + CntEditViewItem* item = mItemList.at( aIndex.row() ); + QVariant data = item->data( Hb::ItemTypeRole ); + if ( data.toInt() == Hb::SeparatorItem ) + { + return Qt::NoItemFlags; + } + + return QAbstractListModel::flags( aIndex ); +} + +CntEditViewItem* CntEditViewListModel::itemAt( const QModelIndex& aIndex ) const +{ + return mItemList.at( aIndex.row() ); +} + +void CntEditViewListModel::removeItem( CntEditViewItem* aItem, const QModelIndex& aIndex ) +{ + int index = mItemList.indexOf( aItem ); + if ( index >= 0 ) + { + beginRemoveRows( aIndex.parent(), index, index ); + // remove item from item list + int count = mItemList.count(); + CntEditViewItem* item = mItemList.takeAt( index ); + count = mItemList.count(); + + // get detailed information + QContactDetail detail = item->data(ERoleContactDetail).value(); + QStringList fields = item->data(ERoleContactDetailFields).toStringList(); + + // remove the detail from QContact + mBuilder->removeDetail( *mContact, detail, fields ); + + // Update lookup table. Note, in case of QContactAddress, + // we can't remove address template, so the mapping for address always points to address detail + KLookupKey lookupKey = mLookupMap.value( detail.definitionName() ); + removeItem( lookupKey ); + endRemoveRows(); + + // Remove separator item if needed + if (mItemList.last()->data( Hb::ItemTypeRole ) == QVariant(Hb::SeparatorItem)) + { + int separatorIndex = mItemList.indexOf( mSeparator ); + beginRemoveRows( aIndex.parent(), separatorIndex, separatorIndex ); + mItemList.removeAt( mItemList.indexOf(mSeparator) ); + removeItem( ESeparator ); + endRemoveRows(); + } + + + // Check if the removed item is -1 in lookuptable and if it needs a template + int lookupValue = mLookupTable.value( lookupKey ); + if ( lookupValue == -1 ) + { + beginResetModel(); + + if ( detail.definitionName() == QContactPhoneNumber::DefinitionName ) + insertItem( EPhonenumber, mBuilder->phoneNumberItems(*mContact) ); + + else if ( detail.definitionName() == QContactEmailAddress::DefinitionName ) + insertItem( EEmailAddress, mBuilder->emailAddressItems(*mContact) ); + + else if ( detail.definitionName() == QContactAddress::DefinitionName ) + insertItem( EAddressTemplate, mBuilder->addressItems(*mContact) ); + + else if ( detail.definitionName() == QContactUrl::DefinitionName ) + insertItem( EUrl, mBuilder->urlItems(*mContact) ); + + endResetModel(); + } + delete item; + } +} + +void CntEditViewListModel::refreshExtensionItems( const QModelIndex& aIndex ) +{ + beginResetModel(); + // remove all extension items + for( int i(mItemList.count()-1); i >= 0; i-- ) + { + CntEditViewItem* item = mItemList.at( i ); + if ( item->data(ERoleItemType) == QVariant(ETypeUiExtension) ) + { + mItemList.removeAt(i); + removeItem( EPluginItem ); + } + } + // query extension items again + int count = mManager->pluginCount(); + for ( int i(0); i < count; i++ ) + { + CntUiExtensionFactory* factory = mManager->pluginAt(i); + CntEditViewItemSupplier* supplier = factory->editViewItemSupplier( *mContact ); + if (supplier) + { + loadPluginItems( supplier ); + } + } + endResetModel(); +} + +void CntEditViewListModel::refresh() +{ + beginResetModel(); + + insertItem( EPhonenumber, mBuilder->phoneNumberItems(*mContact) ); + insertItem( EEmailAddress, mBuilder->emailAddressItems(*mContact) ); + insertItem( EAddressTemplate, mBuilder->addressItems(*mContact) ); + insertItem( EUrl, mBuilder->urlItems(*mContact) ); + + int count = mManager->pluginCount(); + for ( int i(0); i < count; i++ ) + { + CntUiExtensionFactory* factory = mManager->pluginAt(i); + CntEditViewItemSupplier* supplier = factory->editViewItemSupplier( *mContact ); + if (supplier) + { + loadPluginItems( supplier ); + } + } + + insertDetailItem( EAddressDetail, mBuilder->addressDetails(*mContact) ); + insertDetailItem( ECompany, mBuilder->companyDetails(*mContact) ); + insertDetailItem( EDate, mBuilder->dateDetails(*mContact) ); + insertDetailItem( ENote, mBuilder->noteDetails(*mContact) ); + insertDetailItem( EFamily, mBuilder->familyDetails(*mContact) ); + + endResetModel(); +} + +bool CntEditViewListModel::isEmptyItem( CntEditViewItem* aItem ) +{ + QContactDetail d = aItem->data( ERoleContactDetail ).value(); + QStringList fields = aItem->data( ERoleContactDetailFields ).toStringList(); + + foreach ( QString field, fields ) + { + if ( !d.value(field).isEmpty() ) + { + return false; + } + } + return true; +} + +void CntEditViewListModel::loadPluginItems( CntEditViewItemSupplier* aSupplier ) +{ + QList list; + int count = aSupplier->itemCount(); + for ( int i(0); i < count; i++ ) + { + CntEditViewItem* item = aSupplier->itemAt( i ); + if ( item ) + { + list << item; + } + } + + if ( !list.isEmpty() ) + insertItem( EPluginItem, list ); +} + +void CntEditViewListModel::insertDetailItem( KLookupKey aKey, QList aList ) +{ + if ( !aList.isEmpty() ) + { + insertSeparator(); + insertItem( aKey, aList ); + } +} + +void CntEditViewListModel::insertItem( KLookupKey aLookupKey, QList aList ) +{ + if ( !aList.isEmpty() ) + { + QList keys = mLookupTable.keys(); + int ind = keys.indexOf( aLookupKey ); + for ( int i=ind; i >= 0; i-- ) + { + KLookupKey key = keys.at( i ); + int lastIndexValue = mLookupTable.value( key ); + // search next suitable "lastindex" where to insert the items + if ( i != 0 && lastIndexValue == -1 ) + continue; + + // insert items to current index + for ( int j(0); j < aList.count(); j++ ) + { + mItemList.insert( lastIndexValue + j + 1, aList[j] ); + } + + // lookup keys value "lastindex" + int listCount = aList.count(); + lastIndexValue = lastIndexValue + listCount; + mLookupTable.insert( aLookupKey, lastIndexValue ); + // update all indexes in lookuptable + for ( int k(ind+1); k < keys.size(); k++ ) + { + int value = mLookupTable.value(keys[k]); + if ( value != -1 ) + { + mLookupTable.insert( keys[k], value + aList.count() ); + } + } + break; + } + } +} + +void CntEditViewListModel::removeItem( KLookupKey aKey ) +{ + QList keys = mLookupTable.keys(); + int ind = keys.indexOf( aKey ); + for ( int i(ind); i < keys.count(); i++ ) + { + KLookupKey key = keys.at( i ); + int lastIndexValue = mLookupTable.value( key ) - 1; + + // climb the keys (bottom to top) and see if somebody has the same value (then set value to -1) + for ( int j(ind); j >= 0; j-- ) + { + if ( mLookupTable.value(keys[j]) == lastIndexValue ) + { + lastIndexValue = -1; + break; + } + } + + mLookupTable.insert( key, lastIndexValue ); + // update rest of the keys by reducing one (top to bottom) + for ( int k(ind+1); k < keys.count(); k++ ) + { + KLookupKey tmp = keys.at( k ); + int value = mLookupTable.value( tmp ); + if ( value != -1 ) + { + mLookupTable.insert( tmp, value - 1 ); + } + } + + break; + } +} + +void CntEditViewListModel::insertSeparator() +{ + if ( mItemList.indexOf(mSeparator) == -1 ) + { + QList list; + list << mSeparator; + insertItem( ESeparator, list ); + } +} + +// End of File diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnteditviewseparator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cnteditviewseparator.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,47 @@ +/* +* 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 "cnteditviewlistmodel.h" +#include + +CntEditViewSeparator::CntEditViewSeparator() +{ +} + +CntEditViewSeparator::~CntEditViewSeparator() +{ +} + +QVariant CntEditViewSeparator::data(int role) const +{ + switch ( role ) + { + case Hb::ItemTypeRole: + return QVariant( Hb::SeparatorItem ); + case Qt::DisplayRole: + return QVariant(qtTrId("Details")); + default: + return QVariant(); + } +} +void CntEditViewSeparator::activated() +{ +} + +void CntEditViewSeparator::longPressed(const QPointF &coords) +{ + Q_UNUSED( coords ); +} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntemaileditorview.cpp --- a/phonebookui/pbkcommonui/src/cntemaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +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 "cntemaileditorview.h" -#include "cnteditordataviewitem.h" -#include - -CntEmailEditorView::CntEmailEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("Edit email details")); -} - -CntEmailEditorView::~CntEmailEditorView() -{ - -} - -void CntEmailEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - - if (mDetailList.at(i)->value(QContactEmailAddress::FieldEmailAddress).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -QStandardItemModel *CntEmailEditorView::itemModel() -{ - QStandardItemModel *fieldModel = new QStandardItemModel(); - - QString contextHome = QContactDetail::ContextHome; - QString contextWork = QContactDetail::ContextWork; - - QString emailField = QContactEmailAddress::FieldEmailAddress; - - QStandardItem *email = new QStandardItem; - email->setText(hbTrId("txt_phob_dblist_email")); - email->setData(emailField, Qt::UserRole); - 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(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(CNT_EMAIL_EDITOR_MAXLENGTH, Qt::UserRole+3); - fieldModel->appendRow(emailwork); - - return fieldModel; -} - -void CntEmailEditorView::initializeForm() -{ - QContactEmailAddress *buttonEmail = new QContactEmailAddress(); - mDetailList.append(buttonEmail); - CntEditorDataModelItem *buttonItem = new CntEditorDataModelItem(*buttonEmail, hbTrId("txt_phob_list_add_email_address"), - static_cast(HbDataFormModelItem::CustomItemBase+2)); - formModel()->appendDataFormItem(buttonItem, formModel()->invisibleRootItem()); - - QList details = mContact->details(); - - if (details.count() > 0) - { - for(int i = 0;i < details.count();i++) - { - QContactEmailAddress *email = new QContactEmailAddress(details.at(i)); - mDetailList.append(email); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*email, QContactEmailAddress::FieldEmailAddress, itemModel(), - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbEmailAddressFilter::instance()); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // check if this was the clicked item in edit view - if (mParamString != "add" && mParamString.toInt() == i) - { - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); - } - } - } - else - { - addDetail(); - } -} - -void CntEmailEditorView::addDetail() -{ - QContactEmailAddress *email = new QContactEmailAddress(); - mDetailList.append(email); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*email, QContactEmailAddress::FieldEmailAddress, itemModel(), - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbEmailAddressFilter::instance()); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntemaileditorviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntemaileditorviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntemaileditorviewitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -19,6 +19,7 @@ #include "cntdetailconst.h" #include +#include #include #include #include @@ -33,9 +34,11 @@ #include CntEmailEditorViewItem::CntEmailEditorViewItem( QGraphicsItem* aParent ) : -CntDetailViewItem( aParent ) +CntDetailViewItem( aParent ), +mBox(NULL), +mEdit(NULL), +mLayout(NULL) { - } CntEmailEditorViewItem::~CntEmailEditorViewItem() @@ -50,17 +53,21 @@ HbWidget* CntEmailEditorViewItem::createCustomWidget() { - QGraphicsLinearLayout* layout = new QGraphicsLinearLayout( itemView()->mainWindow()->orientation() ); + connect(itemView()->mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(changeOrientation(Qt::Orientation))); + mLayout = 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 ); + widget->setLayout( mLayout ); + mLayout->addItem( mBox ); + mLayout->addItem( mEdit ); + mLayout->setStretchFactor(mBox, 2); + mLayout->setStretchFactor(mEdit, 2); + connect( mBox, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int)) ); connect( mEdit, SIGNAL(textChanged(QString)),this, SLOT(textChanged(QString)) ); @@ -108,6 +115,13 @@ item->setDetail( address ); } +void CntEmailEditorViewItem::changeOrientation(Qt::Orientation aOrient) + { + if (mLayout) { + mLayout->setOrientation(aOrient); + } + } + void CntEmailEditorViewItem::constructSubTypeModel( QStringList aContext ) { QStandardItemModel* model = new QStandardItemModel(); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntextensionmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntextensionmanager.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,124 @@ +/* +* 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 "cntextensionmanager.h" + +CntExtensionManager::CntExtensionManager( QObject* aParent ): + mPluginsLoaded(false) +{ + setParent(aParent); +} + +CntExtensionManager::~CntExtensionManager() +{ + unloadExtensionPlugins(); +} + + +int CntExtensionManager::pluginCount() +{ + loadExtensionPlugins(); + return mPlugins.count(); +} + +CntUiExtensionFactory* CntExtensionManager::pluginAt( int index) +{ + loadExtensionPlugins(); + QPluginLoader* pluginLoader = mPlugins[index]; + QObject *plugin = pluginLoader->instance(); + if (plugin) + { + return qobject_cast(plugin); + } + return NULL; +} + +CntUiExtensionFactory* CntExtensionManager::servicePlugin(int serviceId) +{ + foreach(QPluginLoader* pluginLoader, mPlugins ) + { + QObject *plugin = pluginLoader->instance(); + if (plugin) + { + CntUiExtensionFactory* interfacePlugin = qobject_cast(plugin); + if(interfacePlugin && interfacePlugin->hasService(serviceId)) + { + return interfacePlugin; + } + } + } + return NULL; +} + +void CntExtensionManager::loadExtensionPlugins() +{ + if(mPluginsLoaded) + { + // Plugins already loaded, just return. + return; + } + // TBD: extension should be loaded when they are first time needed. + // This is needed due to performance impact on contacts startup. + // Also framework should provide means to load new plugins + // in runtime. It is very likely use case that new plugins will be + // installed in runtime while contacts is running => new plugin should + // be loaded when it is added to file system (assuming that this + // extension API will be open for 3rd party plugins) + + QDir pluginsDir(QLibraryInfo::location(QLibraryInfo::PluginsPath)); + foreach (QString fileName, pluginsDir.entryList(QDir::Files)) + { + // Create plugin loader + QPluginLoader* pluginLoader = new QPluginLoader( + pluginsDir.absoluteFilePath(fileName)); + if ( pluginLoader->load() ) + { + QObject *plugin = pluginLoader->instance(); + if (plugin) + { + CntUiExtensionFactory* interface = qobject_cast(plugin); + if ( interface ) + { + mPlugins.append(pluginLoader); + } + } + } + // If plugin loader was not for our plugins, delete loader handle + if ( !mPlugins.contains( pluginLoader ) ) + { + pluginLoader->unload(); + delete pluginLoader; + } + } + mPluginsLoaded = true; +} + +void CntExtensionManager::unloadExtensionPlugins() +{ + // Unload plugins and clear plugin array + foreach (QPluginLoader* pluginLoader, mPlugins) + { + pluginLoader->unload(); + delete pluginLoader; + } + mPlugins.clear(); + mPluginsLoaded = false; +} + diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntfamilydetaileditorview.cpp --- a/phonebookui/pbkcommonui/src/cntfamilydetaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +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 "cntfamilydetaileditorview.h" -#include "cnteditordataviewitem.h" - -CntFamilyDetailEditorView::CntFamilyDetailEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("txt_phob_subtitle_edit_family_details")); -} - -CntFamilyDetailEditorView::~CntFamilyDetailEditorView() -{ - -} - -void CntFamilyDetailEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - - if (mDetailList.at(i)->value(QContactFamily::FieldSpouse).isEmpty() && - mDetailList.at(i)->value(QContactFamily::FieldChildren).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -void CntFamilyDetailEditorView::initializeForm() -{ - QList familyDetails = mContact->details(); - QContactFamily *family = 0; - - if (familyDetails.count() > 0) - { - family = new QContactFamily(familyDetails.at(0)); - } - else - { - family = new QContactFamily(); - } - mDetailList.append(family); - - CntEditorDataModelItem *item = new CntEditorDataModelItem(*family, QContactFamily::FieldSpouse, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_spouse")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*family, QContactFamily::FieldChildren, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_children")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - // set focus to the correct field - if (mParamString == "spouse") - { - static_cast(dataForm()->itemByIndex(formModel()->index(0, 0, QModelIndex())))->focusLineEdit(); - } - else - { - static_cast(dataForm()->itemByIndex(formModel()->index(1, 0, QModelIndex())))->focusLineEdit(); - } -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp --- a/phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntfavoritesmemberview.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,36 +17,46 @@ #include "cntfavoritesmemberview.h" #include "cntgroupselectionpopup.h" +#include "qtpbkglobal.h" #include -#include #include #include +#include +#include +#include +#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) +CntFavoritesMemberView::CntFavoritesMemberView() : +mContact(NULL), +mModel(NULL), +mFavoriteListView(NULL), +mViewManager(NULL) { bool ok = false; - ok = loadDocument(CNT_FAVORITESMEMBERVIEW_XML); - + mDocumentLoader.load(CNT_FAVORITESMEMBERVIEW_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_favmember.docml"); } + + //back button + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); + + // menu actions + mManageFavoritesAction = static_cast(mDocumentLoader.findObject("cnt:manageFavorite")); + connect(mManageFavoritesAction, SIGNAL(triggered()), this, SLOT(manageFavorites())); } /*! @@ -54,44 +64,83 @@ */ CntFavoritesMemberView::~CntFavoritesMemberView() { -delete mManageFavoritesAction; -delete mFavoritesMenu; -delete mContact; + mView->deleteLater(); + + delete mManageFavoritesAction; + mManageFavoritesAction = 0; + + delete mContact; + mContact = 0; + + delete mModel; + mModel = 0; } -/*! -Save selections -*/ -void CntFavoritesMemberView::aboutToCloseView() +void CntFavoritesMemberView::showPreviousView() { CntViewParameters viewParameters; - viewManager()->back(viewParameters); + mViewManager->back(viewParameters); } -void CntFavoritesMemberView::activateView(const CntViewParameters &viewParameters) +void CntFavoritesMemberView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) { - //group box - HbGroupBox* groupBox = static_cast(findWidget(QString("groupBox"))); - mContact = new QContact(viewParameters.selectedContact()); + if (mView->navigationAction() != mSoftkey) + mView->setNavigationAction(mSoftkey); + + mContact = new QContact(aArgs.value(ESelectedContact).value()); + mViewManager = aMgr; - mFavoriteListView = static_cast(findWidget(QString("cnt_listview_favorites"))); + mFavoriteListView = static_cast (mDocumentLoader.findWidget("listView")); + mFavoriteListView->setUniformItemSizes(true); 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()); + HbFrameBackground frame; + frame.setFrameGraphicsName("qtg_fr_list_normal"); + frame.setFrameType(HbFrameDrawer::NinePieces); + mFavoriteListView->itemPrototypes().first()->setDefaultFrame(frame); + + mFavoriteListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail); + + if (!mModel) + { + QContactRelationshipFilter rFilter; + rFilter.setRelationshipType(QContactRelationship::HasMember); + rFilter.setRelatedContactRole(QContactRelationship::First); + rFilter.setRelatedContactId(mContact->id()); + + QContactSortOrder sortOrderFirstName; + sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldFirst); + sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive); + + QContactSortOrder sortOrderLastName; + sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldLast); + sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive); + + QList sortOrders; + sortOrders.append(sortOrderFirstName); + sortOrders.append(sortOrderLastName); + + mModel = new MobCntModel(mViewManager->contactManager(SYMBIAN_BACKEND), rFilter, sortOrders, false); } + mFavoriteListView->setModel(mModel); + + connect(mFavoriteListView, SIGNAL(activated (const QModelIndex&)), this, + SLOT(openContact(const QModelIndex&))); +} + +void CntFavoritesMemberView::deactivate() +{ + +} + void CntFavoritesMemberView::manageFavorites() { // call a dialog to display the contacts - CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(contactManager(), mContact); + CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(mViewManager->contactManager(SYMBIAN_BACKEND), mContact); mFavoriteListView->setModel(0); groupSelectionPopup->populateListOfContact(); @@ -102,23 +151,9 @@ } delete groupSelectionPopup; - mFavoriteListView->setModel(contactModel()); + mFavoriteListView->setModel(mModel); } -/*! -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 @@ -126,7 +161,7 @@ void CntFavoritesMemberView::onLongPressed (HbAbstractViewItem *aItem, const QPointF &aCoords) { QModelIndex index = aItem->modelIndex(); - QVariant variant = index.data(Qt::UserRole+1); + QVariant variant = index.data(Qt::UserRole+1); const QMap map = variant.toMap(); HbMenu *menu = new HbMenu(); @@ -169,18 +204,30 @@ void CntFavoritesMemberView::openContact(const QModelIndex &index) { - QContact selectedContact = contactModel()->contact(index); - CntViewParameters viewParameters(CntViewParameters::commLauncherView); - viewParameters.setSelectedContact(selectedContact); - viewManager()->changeView(viewParameters); + QContact selectedContact = mModel->contact(index); + + CntViewParameters viewParameters; + viewParameters.insert(EViewId, commLauncherView); + QVariant var; + var.setValue(selectedContact); + viewParameters.insert(ESelectedContact, var); + QVariant varGroup; + varGroup.setValue(*mContact); + viewParameters.insert(ESelectedGroupContact, varGroup); + viewParameters.insert(ESelectedAction, "FromGroupMemberView"); + mViewManager->changeView(viewParameters); } void CntFavoritesMemberView::editContact(const QModelIndex &index) { - QContact selectedContact = contactModel()->contact(index); - CntViewParameters viewParameters(CntViewParameters::editView); - viewParameters.setSelectedContact(selectedContact); - viewManager()->changeView(viewParameters); + QContact selectedContact = mModel->contact(index); + + CntViewParameters viewParameters; + viewParameters.insert(EViewId, editView); + QVariant var; + var.setValue(selectedContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); } /*! @@ -189,11 +236,11 @@ void CntFavoritesMemberView::removeFromFavorites(const QModelIndex &index) { // get contact id using index - QContact selectedContact = contactModel()->contact(index); + QContact selectedContact = mModel->contact(index); QContactRelationship relationship; relationship.setRelationshipType(QContactRelationship::HasMember); relationship.setFirst(mContact->id()); relationship.setSecond(selectedContact.id()); - contactManager()->removeRelationship(relationship); + mViewManager->contactManager(SYMBIAN_BACKEND)->removeRelationship(relationship); } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntfavoritesview.cpp --- a/phonebookui/pbkcommonui/src/cntfavoritesview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntfavoritesview.cpp Mon May 03 12:24:20 2010 +0300 @@ -26,10 +26,10 @@ const char *CNT_FAVORITE_UI_XML = ":/xml/contacts_favorite.docml"; CntFavoritesView::CntFavoritesView() : - mContact(0), - mView(0), - mSoftkey(0), - mViewManager(0) + mContact(NULL), + mView(NULL), + mSoftkey(NULL), + mViewManager(NULL) { bool ok = false; mDocumentLoader.load(CNT_FAVORITE_UI_XML, &ok); @@ -58,7 +58,7 @@ mContact = 0; } -void CntFavoritesView::activate( CntAbstractViewManager* aMgr, const CntViewParameters& aArgs ) +void CntFavoritesView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) { if (mView->navigationAction() != mSoftkey) mView->setNavigationAction(mSoftkey); @@ -67,7 +67,7 @@ connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); setOrientation(window->orientation()); - mContact = new QContact(aArgs.selectedContact()); + mContact = new QContact(aArgs.value(ESelectedContact).value()); mViewManager = aMgr; HbPushButton *addButton = static_cast(mDocumentLoader.findWidget(QString("cnt_button_add"))); @@ -90,8 +90,12 @@ { groupSelectionPopup->saveOldGroup(); delete groupSelectionPopup; - CntViewParameters viewParameters(CntViewParameters::FavoritesMemberView); - viewParameters.setSelectedContact(*mContact); + + CntViewParameters viewParameters; + viewParameters.insert(EViewId, FavoritesMemberView); + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); mViewManager->changeView(viewParameters); } else if (action == groupSelectionPopup->secondaryAction()) diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntgroupactionsview.cpp --- a/phonebookui/pbkcommonui/src/cntgroupactionsview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupactionsview.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,51 +17,48 @@ #include "cntgroupactionsview.h" -#include -#include -#include -#include -#include -#include -#include -#include "cntcontactcarddatacontainer.h" -#include "cntcontactcarddetailitem.h" -#include "cntcontactcardheadingitem.h" -#include "cntcommands.h" -#include +#include +#include +#include +#include +#include +#include #include #include - +#include +#include +#include +#include -const char *CNT_GROUPACTIONVIEW_XML = ":/xml/contacts_cc.docml"; +#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) -*/ -CntGroupActionsView::CntGroupActionsView(CntViewManager *viewManager, QGraphicsItem *parent) : - CntBaseView(viewManager, parent), - mGroupContact(0), - mScrollArea(0), - mContainerWidget(0), - mContainerLayout(0), - mDataContainer(0), - mHeadingItem(0), - mBanner(0) +const char *CNT_GROUPACTIONSVIEW_XML = ":/xml/contacts_groupactions.docml"; + +CntGroupActionsView::CntGroupActionsView() : +mGroupContact(NULL), +mModel(NULL), +mViewManager(NULL), +mListView(NULL) { bool ok = false; - ok = loadDocument(CNT_GROUPACTIONVIEW_XML); - + mDocumentLoader.load(CNT_GROUPACTIONSVIEW_XML, &ok); + if (ok) - { - QGraphicsWidget *content = findWidget(QString("content")); - setWidget(content); - } - else - { - qFatal("Unable to read :/xml/contacts_cc.docml"); - } - + { + mView = static_cast(mDocumentLoader.findWidget(QString("view"))); + } + else + { + qFatal("Unable to read :/xml/contacts_groupactions.docml"); + } + + //back button + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); + + // menu actions + mEditGrpDetailAction = static_cast(mDocumentLoader.findObject("cnt:editgroupdetail")); + connect(mEditGrpDetailAction, SIGNAL(triggered()), this, SLOT(editGroup())); } /*! @@ -69,175 +66,107 @@ */ CntGroupActionsView::~CntGroupActionsView() { + mView->deleteLater(); + + delete mEditGrpDetailAction; + mEditGrpDetailAction = NULL; + delete mGroupContact; - delete mDataContainer; + mGroupContact = NULL; + + delete mModel; + mModel = NULL; } void CntGroupActionsView::editGroup() { - CntViewParameters viewParameters(CntViewParameters::groupEditorView); - viewParameters.setSelectedAction("EditGroupMembers"); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->changeView(viewParameters); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, groupEditorView); + QVariant var; + var.setValue(*mGroupContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); + } -/*! -Launch contact editor -*/ -void CntGroupActionsView::editContact() -{ - commands()->editContact(*mGroupContact); -} /*! Activates a previous view */ -void CntGroupActionsView::aboutToCloseView() +void CntGroupActionsView::showPreviousView() { - CntViewParameters args; - args.setSelectedContact(*mGroupContact); - viewManager()->back( args ); + CntViewParameters viewParameters; + QVariant var; + var.setValue(*mGroupContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->back(viewParameters); } -void CntGroupActionsView::resizeEvent(QGraphicsSceneResizeEvent *event) -{ - if (mScrollArea) - { - mContainerWidget->resize(mScrollArea->size().width(), 0); - } - CntBaseView::resizeEvent(event); -} - -void CntGroupActionsView::addActionsToToolBar() +void CntGroupActionsView::deactivate() { } + /* Activates a default view and setup name label texts */ -void CntGroupActionsView::activateView(const CntViewParameters &viewParameters) -{ - QContact contact = viewParameters.selectedContact(); - mGroupContact = new QContact(contact); - - // add heading widget to the content - QGraphicsWidget *c = findWidget(QString("content")); - QGraphicsLinearLayout* l = static_cast(c->layout()); +void CntGroupActionsView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) +{ + if (mView->navigationAction() != mSoftkey) + mView->setNavigationAction(mSoftkey); + + mGroupContact = new QContact(aArgs.value(ESelectedContact).value()); + mViewManager = aMgr; QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName ); QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); - - mBanner = new HbGroupBox(this); - l->insertItem(0, mBanner); - mBanner->setHeading(groupName); + + + //group box + HbGroupBox* groupBox = static_cast(mDocumentLoader.findWidget(QString("groupBox"))); + groupBox->setHeading(groupName); + + // create list & model + mListView = static_cast (mDocumentLoader.findWidget("listView")); + mListView->setUniformItemSizes(true); + + HbFrameBackground frame; + frame.setFrameGraphicsName("qtg_fr_list_parent_normal"); + frame.setFrameType(HbFrameDrawer::NinePieces); + mListView->itemPrototypes().first()->setDefaultFrame(frame); + + mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::LargeIcon); - - // data - mDataContainer = new CntContactCardDataContainer(mGroupContact); - - mScrollArea = static_cast(findWidget(QString("scrollArea"))); - mScrollArea->setScrollDirections(Qt::Vertical); - - mContainerWidget = new QGraphicsWidget(mScrollArea); - mContainerWidget->setPreferredWidth(mScrollArea->size().width()); - mScrollArea->setContentWidget(mContainerWidget); - - mContainerLayout = new QGraphicsLinearLayout(Qt::Vertical); - mContainerLayout->setContentsMargins(0, 0, 0, 0); - mContainerLayout->setSpacing(0); - mContainerWidget->setLayout(mContainerLayout); + mModel = new QStandardItemModel(); - for (int index = 0; index < mDataContainer->rowCount(); index++) - { - // communication methods - if (mDataContainer->separatorIndex() == -1 || index < mDataContainer->separatorIndex()) - { - CntContactCardDetailItem* item = new CntContactCardDetailItem(index, mContainerWidget); - - connect(item, SIGNAL(clicked()), this, SLOT(onItemActivated())); - - HbIcon icon(""); - QString text; - QString valueText; - - // DecorationRole - QVariant decorationRole = mDataContainer->data(index, Qt::DecorationRole); - QVariantList variantList; - if (decorationRole.isValid()) - { - if (decorationRole.canConvert()) - { - icon = decorationRole.value(); - } - else if (decorationRole.canConvert< QList >()) - { - variantList = decorationRole.toList(); - for (int j = 0; j < variantList.count(); j++) - { - if (j==0 && variantList.at(0).canConvert()) - { - icon = variantList.at(0).value(); - } - } - } - } - - // DisplayRole - QVariant displayRole = mDataContainer->data(index, Qt::DisplayRole); - QStringList stringList; - if (displayRole.isValid()) - { - 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); - } - } - QString confCall("Conference Call"); - if(text==confCall) // conference call - { - item->setDetails(icon, text, valueText); - } - else - { - item->setDetails(icon, text); // for group Email and Message, we dont need any Value text - } - mContainerLayout->addItem(item); - } - } - - + QContactPhoneNumber confCallNumber = mGroupContact->detail(); + if(!confCallNumber.number().isEmpty()) + { + populatelist(hbTrId("txt_phob_dblist_conference_call"), HbIcon("qtg_large_call_group"),confCallNumber.number()); + } + + populatelist(hbTrId("txt_phob_dblist_send_message"),HbIcon("qtg_large_message_group"),hbTrId("txt_phob_dblist_send_message_val_members")); + populatelist(hbTrId("txt_phob_dblist_email"),HbIcon("qtg_large_email_group"),hbTrId("txt_phob_dblist_send_message_val_members")); + + mListView->setModel(mModel); + mListView->setSelectionMode(HbAbstractItemView::NoSelection); + } -/*! -Add actions to menu -*/ -void CntGroupActionsView::addMenuItems() +void CntGroupActionsView:: populatelist(QString primaryText,HbIcon icon,QString secondaryText) { - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:editgroupdetails"); - actions()->addActionsToMenu(menu()); - - connect(actions()->baseAction("cnt:editgroupdetails"), SIGNAL(triggered()), - this, SLOT (editGroup())); + QList items; + QStandardItem *labelItem = new QStandardItem(); + + QStringList textList; + + textList << primaryText << secondaryText; + + labelItem->setData(textList, Qt::DisplayRole); + labelItem->setData(icon, Qt::DecorationRole); + + items << labelItem ; + mModel->appendRow(items); } - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntgroupdeletepopup.cpp --- a/phonebookui/pbkcommonui/src/cntgroupdeletepopup.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupdeletepopup.cpp Mon May 03 12:24:20 2010 +0300 @@ -88,5 +88,5 @@ } QMap errors; - bool result = mContactManager->removeContacts(&selectionList, &errors); + bool result = mContactManager->removeContacts(selectionList, &errors); } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntgroupeditordataviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntgroupeditordataviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "cntgroupeditordataviewitem.h" -#include "cnteditordatamodelitem.h" -#include "cntgroupeditorview.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -CntGroupEditorDataViewItem::CntGroupEditorDataViewItem(CntGroupEditorView *view, QGraphicsItem *parent): - HbDataFormViewItem(parent), - mView(view), - mIconLabel(0), - mLineEdit(0) -{ -} - -CntGroupEditorDataViewItem::~CntGroupEditorDataViewItem() -{ -} - -HbAbstractViewItem* CntGroupEditorDataViewItem::createItem() -{ - return new CntGroupEditorDataViewItem(*this); -} - -HbWidget* CntGroupEditorDataViewItem::createCustomWidget() -{ - HbDataFormModelItem::DataItemType itemType = static_cast( - modelIndex().data(HbDataFormModelItem::ItemTypeRole).toInt()); - - switch(itemType) - { - // DataFormItem with label and lineedit - case HbDataFormModelItem::CustomItemBase: - { - HbWidget *widget = new HbWidget(); - QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); - widget->setLayout(layout); - - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - - HbLabel *label = new HbLabel(); - label->setPlainText(item->fieldLabel()); - label->setAlignment(Qt::AlignLeft); - layout->addItem(label); - - mLineEdit = new HbLineEdit(); - mLineEdit->setText(item->contactDetail().value(item->key())); - mLineEdit->setMaxLength(item->maxLength()); - setTextFilter(mLineEdit, item); - connect(mLineEdit, SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString))); - layout->addItem(mLineEdit); - - return widget; - } - // DataFormItem with push button - case HbDataFormModelItem::CustomItemBase + 1: - { - HbWidget *widget = new HbWidget(); - QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); - widget->setLayout(layout); - - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - - HbPushButton *button = new HbPushButton(); - button->setText(item->buttonLabel()); - connect(button, SIGNAL(clicked()), this, SLOT(buttonPushed())); - layout->addItem(button); - - return widget; - } - - default: - return 0; - } -} - -void CntGroupEditorDataViewItem::setTextFilter(QObject *aEditor, CntEditorDataModelItem *item) -{ - HbEditorInterface editorInterface(aEditor); - editorInterface.setFilter(item->inputFilter()); - - if (editorInterface.filter() == HbEmailAddressFilter::instance() || - editorInterface.filter() == HbInputLowerCaseFilter::instance()) - { - editorInterface.setTextCase(HbTextCaseLower); - } - else if (editorInterface.filter() == HbPhoneNumberFilter::instance()) - { - editorInterface.setUpAsPhoneNumberEditor(); - } -} - - -void CntGroupEditorDataViewItem::textChanged(QString text) -{ - HbDataForm* form = static_cast(itemView()); - HbDataFormModel* model = static_cast(form->model()); - CntEditorDataModelItem* item = static_cast(model->itemFromIndex(modelIndex())); - item->contactDetail().setValue(item->key(), text); -} - -void CntGroupEditorDataViewItem::buttonPushed() -{ -mView->itemPressed(); -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntgroupeditormodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntgroupeditormodel.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,80 @@ +/* +* 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 "cntgroupeditormodel.h" +#include "cntdetailconst.h" +#include +#include + +CntGroupEditorModel::CntGroupEditorModel(QContact* aContact) : + CntDetailEditorModel(aContact) +{ + QList nameDetails = mContact->details(); + if (nameDetails.isEmpty()) + { + QContactName emptyName; + nameDetails.append(emptyName); + } + + QList numberDetails = mContact->details(); + if (numberDetails.isEmpty()) + { + QContactPhoneNumber emptyNumber; + numberDetails.append(emptyNumber); + } + + iGroupName = nameDetails.first(); + iGroupConfCallNumber = numberDetails.first(); + + HbDataFormModelItem::DataItemType text = HbDataFormModelItem::TextItem; + HbDataFormModelItem* groupname = new HbDataFormModelItem(text, hbTrId("txt_phob_formlabel_group_name")); + HbDataFormModelItem* conferenceNumber = new HbDataFormModelItem(text, hbTrId("Conference Call number")); + + groupname->setContentWidgetData("text", iGroupName.customLabel()); + conferenceNumber->setContentWidgetData("text", iGroupConfCallNumber.number()); + + HbDataFormModelItem* root = invisibleRootItem(); + appendDataFormItem(groupname, root); + appendDataFormItem(conferenceNumber, root); +} + +CntGroupEditorModel::~CntGroupEditorModel() +{ +} + +void CntGroupEditorModel::saveContactDetails() +{ + HbDataFormModelItem* root = invisibleRootItem(); + + iGroupName.setCustomLabel(root->childAt( 0 )->contentWidgetData("text").toString().trimmed()); + iGroupConfCallNumber.setNumber(root->childAt( 1 )->contentWidgetData("text").toString().trimmed()); + + mContact->saveDetail( &iGroupName ); + mContact->saveDetail( &iGroupConfCallNumber ); + + // remove empty details + if (iGroupName.customLabel().isEmpty()) + { + mContact->removeDetail( &iGroupName ); + } + + if(iGroupConfCallNumber.number().isEmpty()) + { + mContact->removeDetail( &iGroupConfCallNumber ); + } +} + +// End of File diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntgroupeditorview.cpp --- a/phonebookui/pbkcommonui/src/cntgroupeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +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 "cntgroupeditorview.h" -#include "cnteditordataviewitem.h" - -//#include "cntgroupeditordataviewitem.h" -#include - -CntGroupEditorView::CntGroupEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("txt_phob_subtitle_edit_group_details")); -} - -CntGroupEditorView::~CntGroupEditorView() -{ - -} - -void CntGroupEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - } - contactManager()->saveContact(mContact); - CntBaseDetailEditorView::aboutToCloseView(); -} - - - -void CntGroupEditorView::initializeForm() -{ - QList nameDetails = mContact->details(); - QList numberDetails = mContact->details(); - - QContactName *groupName = 0; - QContactPhoneNumber *groupConfCallNumber = 0; - - if (nameDetails.count() > 0) - { - groupName = new QContactName(nameDetails.at(0)); - } - else - { - groupName = new QContactName(); - } - mDetailList.append(groupName); - - if (numberDetails.count() > 0) - { - groupConfCallNumber = new QContactPhoneNumber(numberDetails.at(0)); - } - else - { - groupConfCallNumber = new QContactPhoneNumber(); - } - mDetailList.append(groupConfCallNumber); - - // name of Group data item - CntEditorDataModelItem *item = new CntEditorDataModelItem(*groupName, QContactName::FieldCustomLabel, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_group_name")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - // Group Conference Call CntEditorDataModelItem *callItem - item = new CntEditorDataModelItem(*groupConfCallNumber, QContactPhoneNumber::FieldNumber,CNT_PHONENUMBER_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1),hbTrId("Conference Call number")); - item->setTextFilter(HbPhoneNumberFilter::instance()); - - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntgroupmemberview.cpp --- a/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupmemberview.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,23 +16,29 @@ */ #include "cntgroupmemberview.h" +#include "cntcontactcardheadingitem.h" +#include "cntgroupselectionpopup.h" #include "qtpbkglobal.h" -#include "cntcommands.h" +#include "cntimagelabel.h" #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include -#include -#include -#include + #include + #include -#include -#include -#include -#include -#include -#include "cntcontactcardheadingitem.h" -#include "cntgroupselectionpopup.h" +#include "cntdocumentloader.h" + +const char *CNT_GROUPMEMBERVIEW_XML = ":/xml/contacts_groupmembers.docml"; /*! \class CntGroupMemberView @@ -49,13 +55,53 @@ \a viewManager is the parent that creates this view. \a parent is a pointer to parent QGraphicsItem (by default this is 0) */ -CntGroupMemberView::CntGroupMemberView(CntViewManager *viewManager, QGraphicsItem *parent) - : CntBaseListView(viewManager, parent), - mNoGroupContactsPresent(0), - mGroupContact(0), - mHeadingItem(0), - mThumbnailManager(0) +CntGroupMemberView::CntGroupMemberView() : + mGroupContact(NULL), + mViewManager(NULL), + mHeadingItem(NULL), + mModel(NULL), + mListView(NULL), + mImageLabel(NULL) { + + mDocument = new CntDocumentLoader; + + bool ok; + mDocument->load( CNT_GROUPMEMBERVIEW_XML, &ok ); + if ( !ok ){ + qFatal( "Unable to load %S", CNT_GROUPMEMBERVIEW_XML ); + } + + mView = static_cast( mDocument->findWidget("view") ); + + //back button + mSoftkey = new HbAction(Hb::BackNaviAction, mView); + connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView())); + + mImageLabel = static_cast(mDocument->findWidget("editViewImage")); + connect( mImageLabel, SIGNAL(iconClicked()), this, SLOT(openImageEditor()) ); + + mListView = static_cast( mDocument->findWidget("listView") ); + connect(mListView, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this, + SLOT(showContextMenu(HbAbstractViewItem*,QPointF))); + connect(mListView, SIGNAL(activated (const QModelIndex&)), this, + SLOT(showContactView(const QModelIndex&))); + + mHeadingItem = static_cast( mDocument->findWidget("editViewHeading") ); + + // menu actions + mEditGroupAction = static_cast( mDocument->findObject("cnt:editgroupdetails")); + connect(mEditGroupAction, SIGNAL(triggered()), this, SLOT(editGroup())); + + // toolbar actions + mManageAction = static_cast( mDocument->findObject("cnt:managemembers")); + connect(mManageAction, SIGNAL(triggered()), this, SLOT(manageMembers())); + mDeleteAction = static_cast( mDocument->findObject("cnt:deletegroup")); + connect(mDeleteAction, SIGNAL(triggered()), this, SLOT(deleteGroup())); + mShowActionsAction = static_cast( mDocument->findObject("cnt:groupactions")); + connect(mShowActionsAction, SIGNAL(triggered()), this, SLOT(openGroupActions())); + + // thumbnail manager mThumbnailManager = new ThumbnailManager(this); mThumbnailManager->setMode(ThumbnailManager::Default); mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); @@ -70,56 +116,129 @@ */ CntGroupMemberView::~CntGroupMemberView() { + mView->deleteLater(); + delete mGroupContact; + mGroupContact = 0; + + delete mModel; + mModel = 0; } -void CntGroupMemberView::aboutToCloseView() +void CntGroupMemberView::setOrientation(Qt::Orientation orientation) { - CntViewParameters viewParameters;//(CntViewParameters::groupActionsView); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->back(viewParameters); + if (orientation == Qt::Vertical) + { + // reading "portrait" section + mDocument->load( CNT_GROUPMEMBERVIEW_XML, "portrait" ); + } + else + { + // reading "landscape" section + mDocument->load( CNT_GROUPMEMBERVIEW_XML, "landscape" ); + } } -/*! -Add actions also to toolbar -*/ -void CntGroupMemberView::addActionsToToolBar() +void CntGroupMemberView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) { - actions()->clearActionList(); - - + mViewManager = aMgr; + + if (mView->navigationAction() != mSoftkey) + { + mView->setNavigationAction(mSoftkey); + } - + QVariant contact = aArgs.value( ESelectedContact ); + mGroupContact = new QContact( contact.value() ); + + HbMainWindow* window = mView->mainWindow(); + if ( window ) + { + connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); + setOrientation(window->orientation()); + } + + mHeadingItem->setGroupDetails(mGroupContact); + + // avatar + QList details = mGroupContact->details(); + for (int i = 0;i < details.count();i++) + { + if (details.at(i).imageUrl().isValid()) + { + mThumbnailManager->getThumbnail(details.at(i).imageUrl().toString()); + break; + } + } - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:managemembers") << actions()->baseAction("cnt:deletegroup") - << actions()->baseAction("cnt:groupactions"); - actions()->addActionsToToolBar(toolBar()); + // create list & model + mListView->setFrictionEnabled(true); + mListView->setScrollingStyle(HbScrollArea::PanOrFlick); + mListView->setUniformItemSizes(true); + mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail); - 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())); + HbFrameBackground frame; + frame.setFrameGraphicsName("qtg_fr_list_normal"); + frame.setFrameType(HbFrameDrawer::NinePieces); + mListView->itemPrototypes().first()->setDefaultFrame(frame); + + QContactRelationshipFilter rFilter; + rFilter.setRelationshipType(QContactRelationship::HasMember); + rFilter.setRelatedContactRole(QContactRelationship::First); + rFilter.setRelatedContactId(mGroupContact->id()); - } + QContactSortOrder sortOrderFirstName; + sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldFirst); + sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive); + + QContactSortOrder sortOrderLastName; + sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName, + QContactName::FieldLast); + sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive); -void CntGroupMemberView::groupActions() -{ - CntViewParameters viewParameters(CntViewParameters::groupActionsView); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->changeView(viewParameters); + QList sortOrders; + sortOrders.append(sortOrderFirstName); + sortOrders.append(sortOrderLastName); + + mModel = new MobCntModel(mViewManager->contactManager(SYMBIAN_BACKEND), rFilter, sortOrders, false); + mListView->setModel(mModel); + + if (aArgs.value(ESelectedAction).toString() == "save") + { + QString name = mViewManager->contactManager(SYMBIAN_BACKEND)->synthesizedDisplayLabel(*mGroupContact); + HbNotificationDialog::launchDialog(hbTrId("Group \"%1\" saved").arg(name)); + } } +void CntGroupMemberView::deactivate() +{ + +} + +void CntGroupMemberView::showPreviousView() +{ + CntViewParameters viewParameters; + mViewManager->back(viewParameters); +} + +void CntGroupMemberView::openGroupActions() +{ + CntViewParameters viewParameters; + viewParameters.insert(EViewId, groupActionsView); + QVariant var; + var.setValue(*mGroupContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); +} void CntGroupMemberView::manageMembers() { // save the group here - CntGroupSelectionPopup *groupSelectionPopup = new CntGroupSelectionPopup(contactManager(), mGroupContact); - listView()->setModel(0); + CntGroupSelectionPopup *groupSelectionPopup = + new CntGroupSelectionPopup(mViewManager->contactManager(SYMBIAN_BACKEND), mGroupContact); + mListView->setModel(0); groupSelectionPopup->populateListOfContact(); - HbAction* action = groupSelectionPopup->exec(); if (action == groupSelectionPopup->primaryAction()) @@ -127,29 +246,17 @@ groupSelectionPopup->saveOldGroup(); } delete groupSelectionPopup; - listView()->setModel(contactModel()); -} -/*! -Add actions to menu -*/ -void CntGroupMemberView::addMenuItems() -{ - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:editgroupdetails"); - actions()->addActionsToMenu(menu()); - - connect(actions()->baseAction("cnt:editgroupdetails"), SIGNAL(triggered()), - this, SLOT (editGroup())); - - + mListView->setModel(mModel); } void CntGroupMemberView::editGroup() { - CntViewParameters viewParameters(CntViewParameters::groupEditorView); - viewParameters.setSelectedAction("EditGroupDetails"); - viewParameters.setSelectedContact(*mGroupContact); - viewManager()->changeView(viewParameters); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, groupEditorView); + QVariant var; + var.setValue(*mGroupContact); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); } void CntGroupMemberView::deleteGroup() @@ -157,51 +264,46 @@ // the delete command HbDialog popup; - // Set dismiss policy that determines what tap events will cause the dialog - // to be dismissed + // disable dismissing & timout popup.setDismissPolicy(HbDialog::NoDismiss); + popup.setTimeout(HbDialog::NoTimeout); - 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))); + QString groupName = mGroupContact->displayLabel(); + HbLabel *headingLabel = new HbLabel(hbTrId("Delete %1 group?").arg(groupName), &popup); + headingLabel->setFontSpec(HbFontSpec(HbFontSpec::Primary)); + popup.setHeadingWidget(headingLabel); // Set a label widget as content widget in the dialog - HbLabel *label = new HbLabel; + HbLabel *label = new HbLabel(&popup); label->setPlainText("Only group will be removed, contacts can be found from All contacts list"); label->setTextWrapping(Hb::TextWordWrap); + label->setElideMode(Qt::ElideNone); + label->setFontSpec(HbFontSpec(HbFontSpec::Secondary)); 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); + mViewManager->contactManager(SYMBIAN_BACKEND)->removeContact(mGroupContact->localId()); + showPreviousView(); } } /*! Called when a list item is longpressed */ -void CntGroupMemberView::onLongPressed (HbAbstractViewItem *aItem, const QPointF &aCoords) +void CntGroupMemberView::showContextMenu(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 *removeFromGroupAction = 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")); @@ -222,52 +324,49 @@ } else if (selectedAction == openContactAction) { - onListViewActivated(index); + showContactView(index); } - } menu->deleteLater(); } -void CntGroupMemberView::editContact(const QModelIndex &index) +/*! +Called after user clicked on the listview. +*/ +void CntGroupMemberView::showContactView(const QModelIndex &index) { - QContact selectedContact = contactModel()->contact(index); - CntViewParameters viewParameters(CntViewParameters::editView); - viewParameters.setSelectedContact(selectedContact); - viewManager()->changeView(viewParameters); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, commLauncherView); + QVariant var; + var.setValue(mModel->contact(index)); + viewParameters.insert(ESelectedContact, var); + QVariant varGroup; + varGroup.setValue(*mGroupContact); + viewParameters.insert(ESelectedGroupContact, varGroup); + viewParameters.insert(ESelectedAction, "FromGroupMemberView"); + mViewManager->changeView(viewParameters); + } void CntGroupMemberView::removeFromGroup(const QModelIndex &index) { // get contact id using index - QContact selectedContact = contactModel()->contact(index); + QContact selectedContact = mModel->contact(index); QContactRelationship relationship; relationship.setRelationshipType(QContactRelationship::HasMember); relationship.setFirst(mGroupContact->id()); relationship.setSecond(selectedContact.id()); - contactManager()->removeRelationship(relationship); + mViewManager->contactManager(SYMBIAN_BACKEND)->removeRelationship(relationship); } -/*! -Called after user clicked on the listview. -*/ -void CntGroupMemberView::onListViewActivated(const QModelIndex &index) +void CntGroupMemberView::editContact(const QModelIndex &index) { - CntViewParameters viewParameters(CntViewParameters::commLauncherView); - viewParameters.setSelectedContact(contactModel()->contact(index)); - viewParameters.setSelectedGroupContact(*mGroupContact); - viewParameters.setSelectedAction("FromGroupMemberView"); - viewManager()->changeView(viewParameters); - -} - -void CntGroupMemberView::handleExecutedCommand(QString command, QContact /*contact*/) -{ - if (command == "delete") - { - CntViewParameters viewParameters(CntViewParameters::collectionView); - viewManager()->changeView(viewParameters); - } + CntViewParameters viewParameters; + viewParameters.insert(EViewId, editView); + QVariant var; + var.setValue(mModel->contact(index)); + viewParameters.insert(ESelectedContact, var); + mViewManager->changeView(viewParameters); } void CntGroupMemberView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) @@ -275,62 +374,29 @@ 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); + + mImageLabel->clear(); + mImageLabel->setIcon(icon); + } } -void CntGroupMemberView::activateView(const CntViewParameters &viewParameters) +void CntGroupMemberView::openImageEditor() { - QContact contact = viewParameters.selectedContact(); - mGroupContact = new QContact(contact); - - //QContactName groupContactName = mGroupContact->detail( QContactName::DefinitionName ); - // QString groupName(groupContactName.value( QContactName::FieldCustomLabel )); - - //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); - - // 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.setRelatedContactRole(QContactRelationshipFilter::First); - rFilter.setRelatedContactId(mGroupContact->id()); - - mLocalIdList = contactManager()->contactIds(rFilter); - - contactModel()->setFilterAndSortOrder(rFilter); - - contactModel()->showMyCard(false); - if (viewParameters.selectedAction() == "save") - { - QString name = contactManager()->synthesizedDisplayLabel(viewParameters.selectedContact()); - HbNotificationDialog::launchDialog(hbTrId("Group \"%1\" saved").arg(name)); - } - - CntBaseListView::activateView(viewParameters); + QVariant var; + var.setValue(*mGroupContact); + + CntViewParameters viewParameters; + viewParameters.insert(ESelectedContact, var); + viewParameters.insert(EViewId, imageEditorView ); + + mViewManager->changeView( viewParameters ); } + + // end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntgroupselectionpopup.cpp --- a/phonebookui/pbkcommonui/src/cntgroupselectionpopup.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntgroupselectionpopup.cpp Mon May 03 12:24:20 2010 +0300 @@ -21,23 +21,21 @@ #include #include #include +#include #include #include #include #include #include +#include CntGroupSelectionPopup::CntGroupSelectionPopup(QContactManager *manager, QContact *contact, QGraphicsItem *parent): HbDialog(parent), - mListView(0), - mSearchPanel(0), - mEmptyListLabel(0), + mListView(NULL), + mEmptyListLabel(NULL), mContactManager(manager), - mCntModel(0), - mContact(contact), - mContainerWidget(0), - mContainerLayout(0) + mContact(contact) { QList sortOrders; QContactSortOrder sortOrderFirstName; @@ -60,7 +58,7 @@ mContainerLayout->setContentsMargins(0, 0, 0, 0); mContainerLayout->setSpacing(0); - mContainerWidget = new QGraphicsWidget; + mContainerWidget = new HbWidget(); } CntGroupSelectionPopup::~CntGroupSelectionPopup() @@ -68,9 +66,6 @@ delete mContainerWidget; mContainerWidget = 0; - delete mEmptyListLabel; - mEmptyListLabel = 0; - delete mCntModel; mCntModel = 0; } @@ -95,7 +90,7 @@ mCntModel->showMyCard(false); rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactRole(QContactRelationship::First); rFilter.setRelatedContactId(mContact->id()); QList contactsLocalIdList = mContactManager->contactIds(rFilter); int countContacts = contactsLocalIdList.count(); @@ -107,6 +102,8 @@ mListView->setSelectionMode(HbAbstractItemView::MultiSelection); mListView->setFrictionEnabled(true); mListView->setScrollingStyle(HbScrollArea::PanOrFlick); + HbListViewItem *prototype = mListView->listItemPrototype(); + prototype->setGraphicsSize(HbListViewItem::Thumbnail); for (int i=0; i < countContacts; i++ ) { @@ -116,13 +113,31 @@ mListView->selectionModel()->select(contactIndex, QItemSelectionModel::Select); } - setTimeout(0); + setTimeout(HbPopup::NoTimeout); + setDismissPolicy(HbPopup::NoDismiss); setModal(true); // Note that the layout takes ownership of the item(s) it contains. - mContainerLayout->addItem(mListView); + if (!mCntModel->rowCount()) + { + mListView->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); + mContainerLayout->insertItem(0, mEmptyListLabel); + } + } + else + { + mContainerLayout->addItem(mListView); + } mContainerLayout->addItem(mSearchPanel); mContainerWidget->setLayout(mContainerLayout); + mContainerWidget->setPreferredHeight(mainWindow()->size().height()); + mContainerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setContentWidget(mContainerWidget); @@ -159,7 +174,7 @@ // Use relationship filter to get list of contacts in the relationship (if any) QContactRelationshipFilter rFilter; rFilter.setRelationshipType(QContactRelationship::HasMember); - rFilter.setRelatedContactRole(QContactRelationshipFilter::First); + rFilter.setRelatedContactRole(QContactRelationship::First); rFilter.setRelatedContactId(mContact->id()); QList contactsLocalIdList = mContactManager->contactIds(rFilter); @@ -210,8 +225,9 @@ } } // save & remove relationships - mContactManager->removeRelationships(removedRelationships); - mContactManager->saveRelationships(&addedRelationships); + QMap errors; + mContactManager->removeRelationships(removedRelationships, &errors); + mContactManager->saveRelationships(&addedRelationships, &errors); } void CntGroupSelectionPopup::closeFind() @@ -241,7 +257,7 @@ // find matches and existing members QContactRelationshipFilter relationFilter; relationFilter.setRelationshipType(QContactRelationship::HasMember); - relationFilter.setRelatedContactRole(QContactRelationshipFilter::First); + relationFilter.setRelatedContactRole(QContactRelationship::First); relationFilter.setRelatedContactId(mContact->id()); QContactDetailFilter detailfilter; @@ -266,18 +282,30 @@ mListView->selectionModel()->select(contactIndex, QItemSelectionModel::Select); } - if (!mCntModel->rowCount()) { - if (mEmptyListLabel == 0) { + if (!mCntModel->rowCount()) + { + if (mEmptyListLabel == 0) + { + mListView->setVisible(false); + mContainerLayout->removeItem(mListView); + 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); + mContainerLayout->insertItem(0, mEmptyListLabel); } } - else { - mContainerLayout->removeItem(mEmptyListLabel); - delete mEmptyListLabel; - mEmptyListLabel = 0; + else + { + if (mEmptyListLabel != 0) + { + mListView->setVisible(true); + mContainerLayout->insertItem(0, mListView); + + mContainerLayout->removeItem(mEmptyListLabel); + delete mEmptyListLabel; + mEmptyListLabel = 0; + } } } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnthistoryview.cpp --- a/phonebookui/pbkcommonui/src/cnthistoryview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnthistoryview.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,36 +17,44 @@ #include "cnthistoryview.h" -#include #include #include -#include -#include +#include #include +#include +#include +#include #include -#include -#include "cnthistoryviewitem.h" +#include + +#include "cnthistoryviewitem.h" +#include "qtpbkglobal.h" const char *CNT_HISTORYVIEW_XML = ":/xml/contacts_history.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) */ -CntHistoryView::CntHistoryView(CntViewManager *viewManager, QGraphicsItem *parent) : - CntBaseView(viewManager, parent), - mHistoryListView(0), - mHistoryModel(0), - mContact(0), - mIsMyCard(false) +CntHistoryView::CntHistoryView() : + mHistoryListView(NULL), + mHistoryModel(NULL), + mDocumentLoader(NULL), + mViewMgr(NULL), + mContact(NULL) { bool ok = false; - ok = loadDocument(CNT_HISTORYVIEW_XML); - + + docLoader()->load(CNT_HISTORYVIEW_XML, &ok); + if (ok) { - QGraphicsWidget *content = findWidget(QString("content")); - setWidget(content); + mView = static_cast(docLoader()->findWidget(QString("view"))); + + // Create a back key action an set it as the default navigation + // action once the back key is pressed + mBackKey = new HbAction(Hb::BackNaviAction, mView); + mView->setNavigationAction(mBackKey); + connect(mBackKey, SIGNAL(triggered()), this, SLOT(showPreviousView())); } else { @@ -59,56 +67,63 @@ */ CntHistoryView::~CntHistoryView() { - delete mContact; - delete mHistoryModel; + if (mDocumentLoader) { + delete mDocumentLoader; + mDocumentLoader = NULL; + } + if (mHistoryModel) { + delete mHistoryModel; + mHistoryModel = NULL; + } + if (mContact) { + delete mContact; + mContact = NULL; + } } /*! -Activates a previous view -*/ -void CntHistoryView::aboutToCloseView() + * Deactivate the view + */ +void CntHistoryView::deactivate() { - CntViewParameters args;//( CntViewParameters::commLauncherView ); - args.setSelectedContact( *mContact ); - viewManager()->back( args ); - /* - viewManager()->previousViewParameters().setSelectedContact(*mContact); - viewManager()->onActivatePreviousView(); - */ } -void CntHistoryView::activateView(const CntViewParameters &viewParameters) -{ - QContact contact = viewParameters.selectedContact(); - mContact = new QContact(contact); +/** + * Activate the view + */ +void CntHistoryView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) +{ + mViewMgr = aMgr; + mContact = new QContact(aArgs.value(ESelectedContact).value()); - //group box - HbGroupBox* groupBox = static_cast(findWidget(QString("cnt_groupbox_history"))); - QString text = hbTrId("History with %1").arg(contactManager()->synthesizedDisplayLabel(contact)); - groupBox->setHeading(text); + // Set history view heading + HbGroupBox* groupBox = static_cast(docLoader()->findWidget(QString("groupBox"))); + groupBox->setHeading(hbTrId("txt_phob_subtitle_history_with_1").arg(mContact->displayLabel())); //construct listview - mHistoryListView = static_cast(findWidget(QString("cnt_listview_history"))); - - //bubble graphics - create our custom list view item to have different bubbles - //for incoming and outgoing messages + mHistoryListView = static_cast(docLoader()->findWidget(QString("listView"))); CntHistoryViewItem *item = new CntHistoryViewItem; mHistoryListView->setItemPrototype(item); //ownership is taken - connect(mHistoryListView, SIGNAL(longPressed(HbAbstractViewItem *, const QPointF &)), - this, SLOT(longPressed(HbAbstractViewItem *, const QPointF &))); + mHistoryListView->setUniformItemSizes(true); + + // Connect listview items to respective slots connect(mHistoryListView, SIGNAL(activated(const QModelIndex &)), - this, SLOT(pressed(const QModelIndex &))); - - mHistoryModel = new MobHistoryModel(contact.localId(), contactManager()); + this, SLOT(itemActivated(const QModelIndex &))); + mHistoryModel = new CntHistoryModel(mContact->localId(), + mViewMgr->contactManager(SYMBIAN_BACKEND)); 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())); + connect(mHistoryModel, SIGNAL(layoutChanged()), this, SLOT(updateScrollingPosition())); + + // Connect the menu options to respective slots + HbAction* clearHistory = static_cast(docLoader()->findObject("cnt:clearhistory")); + connect(clearHistory, SIGNAL(triggered()), this, SLOT(clearHistory())); } /*! @@ -117,59 +132,50 @@ void CntHistoryView::updateScrollingPosition() { int rowCnt = mHistoryModel->rowCount(); + + // Scroll to the last item in the list 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(); + // Ask the use if they want to clear the history + HbMessageBox *note = new HbMessageBox(hbTrId("txt_phob_info_clear_communications_history_with_1"), + 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()) + { + // Clear comm history + mHistoryModel->clearHistory(); + } + delete note; } /*! -Called when a list item is longpressed -*/ -void CntHistoryView::longPressed(HbAbstractViewItem *item, const QPointF &coords) +Once list item is pressed on the list view this slot handles the +emitted signal + */ +void CntHistoryView::itemActivated(const QModelIndex &index) { - Q_UNUSED(item); - - HbMenu* menu = new HbMenu(); - HbAction* clearAction = menu->addAction(hbTrId("txt_phob_menu_clear_history")); - - HbAction* selectedAction = menu->exec(coords); + QVariant itemType = index.data(CntHistoryModel::ItemTypeRole); - if (selectedAction && selectedAction == clearAction) { - // Clear comm history - mHistoryModel->clearHistory(); - } + if (!itemType.isValid()) + return; - menu->deleteLater(); -} - -void CntHistoryView::pressed(const QModelIndex &index) -{ - QVariant itemType = mHistoryModel->data(index, MobHistoryModel::ItemTypeRole); - - if (itemType.toInt() == MobHistoryModel::CallLog) { + // If the list item is a call log a call is made to that item + if (itemType.toInt() == CntHistoryModel::CallLog) { // Make a call - QVariant v = mHistoryModel->data(index, MobHistoryModel::PhoneNumberRole); + QVariant v = index.data(CntHistoryModel::PhoneNumberRole); + if (!v.isValid()) + return; + QString service("com.nokia.services.telephony"); QString type("dial(QString)"); XQServiceRequest snd(service, type, false); @@ -178,4 +184,27 @@ } } +/*! +Go back to previous view +*/ +void CntHistoryView::showPreviousView() +{ + CntViewParameters viewParameters; + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); + mViewMgr->back(viewParameters); +} + +/*! + * Document loader + */ +HbDocumentLoader* CntHistoryView::docLoader() +{ + if (!mDocumentLoader) { + mDocumentLoader = new HbDocumentLoader(); + } + return mDocumentLoader; +} + // end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnthistoryviewitem.cpp --- a/phonebookui/pbkcommonui/src/cnthistoryviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnthistoryviewitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,7 +17,7 @@ #include "cnthistoryviewitem.h" -#include +#include //--------------------------------------------------------------- // HbListViewItem::HbListViewItem @@ -25,8 +25,7 @@ //--------------------------------------------------------------- CntHistoryViewItem::CntHistoryViewItem(QGraphicsItem* parent) : HbAbstractViewItem(parent), -mLayout(0), -itemWidget(0) +itemWidget(NULL) { } @@ -53,32 +52,55 @@ //--------------------------------------------------------------- void CntHistoryViewItem::updateChildItems() { - //Create whole item layout - if (!mLayout) { - mLayout = new QGraphicsLinearLayout(this); - mLayout->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - mLayout->setOrientation(Qt::Horizontal); - mLayout->setContentsMargins(0,0,0,0); - } - - //Create item widget - if(!itemWidget) - { - itemWidget = new CntHistoryViewItemWidget(this); - mLayout->addItem(itemWidget); - } - - //Update item widget content QStringList data = modelIndex().data(Qt::DisplayRole).toStringList(); QString iconName = modelIndex().data(Qt::DecorationRole).toString(); bool incoming = false; + bool newMessage = false; bool status = false; - if (modelIndex().data(MobHistoryModel::DirectionRole).toInt(&status) == 0) { + if (modelIndex().data(CntHistoryModel::DirectionRole).toInt(&status) == CntHistoryModel::Incoming) { incoming = true; } - - itemWidget->setDetails(data.at(0), data.at(1), data.at(2), iconName, incoming); - - setLayout(mLayout); + // This indication applies to smses only + if (modelIndex().data(CntHistoryModel::ItemTypeRole).toInt(&status) == CntHistoryModel::Message && + modelIndex().data(CntHistoryModel::SeenStatusRole).toInt(&status) == CntHistoryModel::Unseen) { + newMessage = true; + } + + QGraphicsLinearLayout* currentLayout = static_cast(layout()); + + if (currentLayout == NULL) { + + currentLayout = new QGraphicsLinearLayout(this); + currentLayout->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + currentLayout->setOrientation(Qt::Horizontal); + currentLayout->setContentsMargins(0,0,0,0); + + //Create item widget + itemWidget = new CntHistoryViewItemWidget(this); + currentLayout->addItem(itemWidget); + + //Update item widget contents + itemWidget->setDetails(data.at(0), data.at(1), data.at(2), iconName, incoming, newMessage); + + setLayout(currentLayout); + + } else { + // Find the itemWidget item from the layout and remove it + int i = 0; + while( itemWidget != static_cast(currentLayout->itemAt(i)) ) { + i++; + } + currentLayout->removeAt(i); + delete itemWidget; + + //Create new item widget + itemWidget = new CntHistoryViewItemWidget(this); + currentLayout->addItem(itemWidget); + + //Update item widget contents + itemWidget->setDetails(data.at(0), data.at(1), data.at(2), iconName, incoming, newMessage); + + updateGeometry(); + } } // EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnthistoryviewitemwidget.cpp --- a/phonebookui/pbkcommonui/src/cnthistoryviewitemwidget.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnthistoryviewitemwidget.cpp Mon May 03 12:24:20 2010 +0300 @@ -24,14 +24,18 @@ #define INCOMING_EVENT_FRAME "qtg_fr_convlist_received_normal" #define OUTGOING_EVENT_FRAME "qtg_fr_convlist_sent_normal" +#define NEW_EVENT_FRAME "qtg_fr_list_new_item" CntHistoryViewItemWidget::CntHistoryViewItemWidget(QGraphicsItem *parent) : HbWidget(parent), - mIconLabel(0), - mTitleLabel(0), - mBodyTextLabel(0), - mTimeStampLabel(0), - mFrameLabel(0) + mIconLabel(NULL), + mTitleLabel(NULL), + mBodyTextLabel(NULL), + mTimeStampLabel(NULL), + mFrameLabel(NULL), + mNewItemLabel(NULL), + mIncoming(false), + mNewMessage(false) { } @@ -43,16 +47,21 @@ { //create frame first so it's painted below text labels if (!mFrameLabel) { - HbFrameDrawer* frameDrawer = 0; + HbFrameDrawer* frameDrawer = NULL; if (mIncoming) { frameDrawer = new HbFrameDrawer(INCOMING_EVENT_FRAME, HbFrameDrawer::NinePieces); - } - else { + } else { frameDrawer = new HbFrameDrawer(OUTGOING_EVENT_FRAME, HbFrameDrawer::NinePieces); } mFrameLabel = new HbFrameItem(frameDrawer, this); style()->setItemName(mFrameLabel, "frame"); } + + if (mNewMessage && !mNewItemLabel) { + HbFrameDrawer* frameDrawer = new HbFrameDrawer(NEW_EVENT_FRAME, HbFrameDrawer::ThreePiecesVertical); + mNewItemLabel = new HbFrameItem(frameDrawer, this); + style()->setItemName(mNewItemLabel, "newItem"); + } //create icon if (!mIcon.isNull()) { @@ -61,12 +70,11 @@ mIconLabel->setIcon(mIcon); style()->setItemName(mIconLabel, "icon"); } - } - else { + } else { if (mIconLabel) { delete mIconLabel; } - mIconLabel = 0; + mIconLabel = NULL; } //create title @@ -77,12 +85,11 @@ mTitleLabel->setTextWrapping(Hb::TextWordWrap); style()->setItemName(mTitleLabel, "title"); } - } - else { + } else { if (mTitleLabel) { delete mTitleLabel; } - mTitleLabel = 0; + mTitleLabel = NULL; } //create body text @@ -92,12 +99,11 @@ mBodyTextLabel->setText(mBodyText); style()->setItemName(mBodyTextLabel, "bodyText"); } - } - else { + } else { if (mBodyTextLabel) { delete mBodyTextLabel; } - mBodyTextLabel = 0; + mBodyTextLabel = NULL; } //create timestamp @@ -107,12 +113,11 @@ mTimeStampLabel->setText(mTimeStamp); style()->setItemName(mTimeStampLabel, "timeStamp"); } - } - else { + } else { if (mTimeStampLabel) { delete mTimeStampLabel; } - mTimeStampLabel = 0; + mTimeStampLabel = NULL; } } @@ -121,16 +126,16 @@ HbWidget::recreatePrimitives(); delete mIconLabel; - mIconLabel = 0; + mIconLabel = NULL; delete mTitleLabel; - mTitleLabel = 0; + mTitleLabel = NULL; delete mBodyTextLabel; - mBodyTextLabel = 0; + mBodyTextLabel = NULL; delete mTimeStampLabel; - mTimeStampLabel = 0; + mTimeStampLabel = NULL; createPrimitives(); } @@ -142,7 +147,7 @@ } void CntHistoryViewItemWidget::setDetails(QString title, QString bodyText, - QString timeStamp, QString iconName, bool incoming) + QString timeStamp, QString iconName, bool incoming, bool newMessage) { mIcon.clear(); mTitle.clear(); @@ -154,6 +159,7 @@ mBodyText = bodyText; mTimeStamp = timeStamp; mIncoming = incoming; + mNewMessage = newMessage; recreatePrimitives(); } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntimageeditorview.cpp --- a/phonebookui/pbkcommonui/src/cntimageeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntimageeditorview.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,6 +16,7 @@ */ #include "cntimageeditorview.h" +#include "cntimageutility.h" #include #include @@ -39,17 +40,13 @@ Constructor */ CntImageEditorView::CntImageEditorView() : - mContact(0), - mAvatar(0), - mImageLabel(0), - mRequest(0), - mThumbnailManager(0), - mView(0), - mSoftkey(0), - mRemoveImage(0), - mViewManager(0), - mListView(0), - mModel(0) + mContact(NULL), + mAvatar(NULL), + mImageLabel(NULL), + mRequest(NULL), + mViewManager(NULL), + mListView(NULL), + mModel(NULL) { bool ok = false; mDocumentLoader.load(CNT_IMAGE_XML, &ok); @@ -76,7 +73,7 @@ mThumbnailManager->setMode(ThumbnailManager::Default); mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailLarge); - + connect( mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), this, SLOT(thumbnailReady(QPixmap, void*, int, int)) ); } @@ -103,7 +100,7 @@ /*! Called when activating the view */ -void CntImageEditorView::activate( CntAbstractViewManager* aMgr, const CntViewParameters& aArgs ) +void CntImageEditorView::activate( CntAbstractViewManager* aMgr, const CntViewParameters aArgs ) { if (mView->navigationAction() != mSoftkey) mView->setNavigationAction(mSoftkey); @@ -112,31 +109,29 @@ connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); setOrientation(window->orientation()); - mContact = new QContact(aArgs.selectedContact()); + mContact = new QContact(aArgs.value(ESelectedContact).value()); mViewManager = aMgr; // set the correct image if the contact already has an image set mImageLabel = static_cast(mDocumentLoader.findWidget(QString("cnt_image_label"))); QList details = mContact->details(); - if (details.count() > 0) - { - for (int i = 0;i < details.count();i++) { - if (details.at(i).subType() == QContactAvatar::SubTypeImage) + for (int i = 0;i < details.count();i++) { - mAvatar = new QContactAvatar(details.at(i)); - mThumbnailManager->getThumbnail(mAvatar->avatar()); - break; + if (details.at(i).imageUrl().isValid()) + { + mAvatar = new QContactAvatar(details.at(i)); + mThumbnailManager->getThumbnail(mAvatar->imageUrl().toString()); + break; + } } } - } else - { + { mAvatar = new QContactAvatar(); - mAvatar->setSubType(QContactAvatar::SubTypeImage); mRemoveImage->setEnabled(false); - } + } // set up the list mListView = static_cast(mDocumentLoader.findWidget(QString("cnt_listview"))); @@ -150,6 +145,7 @@ mListView->itemPrototypes().first()->setDefaultFrame(frame); mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::LargeIcon); + mListView->setUniformItemSizes(true); mModel = new QStandardItemModel(); populateModel(mModel); @@ -192,7 +188,7 @@ delete mRequest; mRequest = 0; } - + mRequest = mAppManager.create(FETCHER_SERVICE, FETCHER_INTERFACE, FETCHER_OPERATION, false); if ( mRequest ) { @@ -208,22 +204,30 @@ { mContact->saveDetail(mAvatar); - if (mAvatar->avatar().isEmpty()) + if ( mAvatar->imageUrl().isEmpty()) { mContact->removeDetail(mAvatar); } CntViewParameters args; - args.setSelectedContact( *mContact ); + QVariant var; + var.setValue(*mContact); + args.insert(ESelectedContact, var); mViewManager->back( args ); } void CntImageEditorView::removeImage() { - mAvatar->setAvatar(QString()); - mImageLabel->clear(); - mImageLabel->setIcon(HbIcon("qtg_large_avatar")); - mRemoveImage->setEnabled(false); + int err; + CntImageUtility imageUtility; + if(!mAvatar->imageUrl().isEmpty() + && imageUtility.removeImage(mAvatar->imageUrl().toString(),err)) + { + mAvatar->setImageUrl(QUrl()); + mImageLabel->clear(); + mImageLabel->setIcon(HbIcon("qtg_large_avatar")); + mRemoveImage->setEnabled(false); + } } /*! @@ -231,11 +235,22 @@ */ void CntImageEditorView::handleImageChange(const QVariant &value) { - if (value.canConvert()) + if(value.canConvert()) { - mAvatar->setAvatar(value.toString()); - mThumbnailManager->getThumbnail(value.toString()); - mRemoveImage->setEnabled(true); + CntImageUtility imageUtility; + int err; + QString imagepath; + + if(imageUtility.createImage(value.toString(),imagepath,err)) + { + // If image exists, delete + if(!mAvatar->imageUrl().isEmpty()) + imageUtility.removeImage(mAvatar->imageUrl().toString(),err); + + mAvatar->setImageUrl(QUrl(imagepath)); + mThumbnailManager->getThumbnail(imagepath); + mRemoveImage->setEnabled(true); + } } } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntimagelabel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cntimagelabel.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,47 @@ +/* +* 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 "cntimagelabel.h" + +#include +#include + +CntImageLabel::CntImageLabel(QGraphicsItem *parent) : + HbLabel(parent) +{ + +} + +CntImageLabel::~CntImageLabel() +{ + +} + +void CntImageLabel::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + HbInstantFeedback::play(HbFeedback::Basic); + event->accept(); +} + +void CntImageLabel::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + if (rect().contains(event->pos())) + { + emit iconClicked(); + } + event->accept(); +} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntmainwindow.cpp --- a/phonebookui/pbkcommonui/src/cntmainwindow.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntmainwindow.cpp Mon May 03 12:24:20 2010 +0300 @@ -20,25 +20,35 @@ #include "cntmainwindow.h" #include "cntdefaultviewmanager.h" -#include "cntviewparameters.h" - #include +#include "cntviewnavigator.h" +#include -CntMainWindow::CntMainWindow(QWidget *parent, CntViewParameters::ViewId defaultView) - : HbMainWindow(parent),mViewManager(0) +CntMainWindow::CntMainWindow(QWidget *parent, int defaultView) + : HbMainWindow(parent), + mViewManager(NULL) { - if (defaultView != CntViewParameters::noView) + if (defaultView != noView) { - mViewManager = new CntDefaultViewManager(this,defaultView); + CntViewNavigator* navigator = new CntViewNavigator(this); + navigator->addException( editView, namesView ); + navigator->addException( FavoritesMemberView, collectionView ); + navigator->addEffect( groupMemberView, groupActionsView ); + navigator->addEffect( groupActionsView, groupMemberView ); + navigator->addEffect( commLauncherView, historyView ); + navigator->addEffect( historyView, commLauncherView ); + + mViewManager = new CntDefaultViewManager( this ); + mViewManager->setViewNavigator( navigator ); + + //activate the view + CntViewParameters viewParameters; + viewParameters.insert(EViewId, defaultView); + mViewManager->changeView( viewParameters ); } } CntMainWindow::~CntMainWindow() { - // TODO: Remove - // This is done because the HbMainWindow bug in wk04 platform. Next release, this must be removed. - // Another fix is in main.cpp (tsrc) where TestCntBaseSelectionView test was removed due KERN-EXEC 3. - // The KERN-EXEC 3 is caused by the following QCoreApplication::processEvents. Don't know why. - QCoreApplication::processEvents(); delete mViewManager; mViewManager=0; } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntmodelprovider.cpp --- a/phonebookui/pbkcommonui/src/cntmodelprovider.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "cntmodelprovider.h" - -#include -#include - -// TLS Object definiton -QThreadStorage tls; - - -/*! - \return pointer to the CntModelProvider object. If it is first call then it constructs itself, - on second instance call it just returns pointer stored in TLS. -*/ -CntModelProvider* CntModelProvider::instance() -{ - CntModelProvider* self=0; - - - //Check Thread local storage - if (!tls.hasLocalData()) - { - // create new provider - self = new CntModelProvider; - // and store it to TLS - tls.setLocalData(self); - } - else - { - // otherwise get data from TLS - self = tls.localData(); - } - // increase reference count i.e. how many instances there are - ++self->mRefCount; - // return to pointer to "this" object - return self; -} - -/*! - Releases "handle" to the class. Decreases reference count and if this is the last client for the class it will delete itself. -*/ -void CntModelProvider::release() -{ - // decrese reference count and delete the object if we are last one - --mRefCount; - if (mRefCount == 0) - { - tls.setLocalData(0); // this will invoke "delete this" - } -} - -/*! - Destructor -*/ -CntModelProvider::~CntModelProvider() -{ - mRefCount=0; - delete mContactModel; - mContactModel=0; - delete mContactManager; - mContactManager=0; - delete mContactSimManager; - mContactSimManager=0; -} - -/*! - Constructor. Initialize reference count and contactmodel pointer. -*/ -CntModelProvider::CntModelProvider(): - mRefCount(0), - mContactModel(0), - mContactManager(0), - mContactSimManager(0) -{ - -} - -/*! - \return pointer to the contact model. -*/ -MobCntModel *CntModelProvider::contactModel() -{ - // if no model exists, create a new one with default first name last name sort order - if (!mContactModel) - { - 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); - //create also a manager for SIM contacts - if (!mContactSimManager) - { - mContactSimManager=new QContactManager("symbiansim"); - } - } - return mContactModel; -} - -/*! - \return pointer to the contact manager. -*/ -QContactManager *CntModelProvider::contactManager() -{ - // if no model exists, create a new one - if (!mContactManager) - { - mContactManager=new QContactManager("symbian"); - } - return mContactManager; -} - -/*! - \return pointer to the SIM contacts manager. -*/ -QContactManager *CntModelProvider::contactSimManager() -{ - // if no model exists, create a new one - if (!mContactSimManager) - { - mContactSimManager=new QContactManager("symbiansim"); - } - return mContactSimManager; -} - -/*! - \return number of handles to this object -*/ -int CntModelProvider::referenceCount() -{ - return mRefCount; -} - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntmycardselectionview.cpp --- a/phonebookui/pbkcommonui/src/cntmycardselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntmycardselectionview.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,51 +16,58 @@ */ #include "cntmycardselectionview.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) -*/ -CntMyCardSelectionView::CntMyCardSelectionView(CntViewManager *viewManager, QGraphicsItem *parent, HbAbstractItemView::SelectionMode newMode) - : CntBaseSelectionView(viewManager, parent, newMode) +CntMyCardSelectionView::CntMyCardSelectionView() : CntBaseSelectionView() { - QContactDetailFilter contactsFilter; - contactsFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - contactsFilter.setValue(QString(QLatin1String(QContactType::TypeContact))); - contactModel()->setFilterAndSortOrder(contactsFilter); - contactModel()->showMyCard(false); + connect(mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(onListViewActivated(const QModelIndex&))); } -/*! -Destructor -*/ CntMyCardSelectionView::~CntMyCardSelectionView() { - } /*! -Set selection to mycard -*/ -void CntMyCardSelectionView::aboutToCloseView() -{ - CntViewParameters args; - viewManager()->back( args ); -} - - -/*! Set index to mycard */ void CntMyCardSelectionView::onListViewActivated(const QModelIndex& index) { if (index.isValid()) { - QContact contact = contactModel()->contact(index); - contactManager()->setSelfContactId(contact.localId()); - viewManager()->changeView(CntViewParameters::namesView); + QContact contact = mListModel->contact(index); + QContactManager* mgr = mMgr->contactManager(SYMBIAN_BACKEND); + mgr->setSelfContactId(contact.localId()); + + removeFromGroup(&contact); + + CntViewParameters params; + params.insert(EViewId, namesView); + mMgr->changeView(params); } } +void CntMyCardSelectionView::removeFromGroup(const QContact* aContact) +{ + QContactDetailFilter groupFilter; + groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + groupFilter.setValue(QLatin1String(QContactType::TypeGroup)); + QContactManager* mgr = mMgr->contactManager(SYMBIAN_BACKEND); + QList groupContactIds = mgr->contactIds(groupFilter); + if (!groupContactIds.isEmpty()) + { + for(int i = 0;i < groupContactIds.count();i++) + { + QContact groupContact = mgr->contact(groupContactIds.at(i)); + QContactRelationship relationship; + relationship.setRelationshipType(QContactRelationship::HasMember); + relationship.setFirst(groupContact.id()); + relationship.setSecond(aContact->id()); + mgr->removeRelationship(relationship); + } + } +} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntmycardview.cpp --- a/phonebookui/pbkcommonui/src/cntmycardview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntmycardview.cpp Mon May 03 12:24:20 2010 +0300 @@ -25,10 +25,8 @@ const char *CNT_MYCARD_UI_XML = ":/xml/contacts_mc.docml"; CntMyCardView::CntMyCardView() : - mContact(0), - mViewManager(0), - mView(0), - mSoftkey(0) + mContact(NULL), + mViewManager(NULL) { bool ok = false; mDocumentLoader.load(CNT_MYCARD_UI_XML, &ok); @@ -67,7 +65,7 @@ /* Activates a default view */ -void CntMyCardView::activate(CntAbstractViewManager* aMgr, const CntViewParameters& aArgs) +void CntMyCardView::activate(CntAbstractViewManager* aMgr, const CntViewParameters aArgs) { if (mView->navigationAction() != mSoftkey) mView->setNavigationAction(mSoftkey); @@ -76,7 +74,7 @@ connect(window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setOrientation(Qt::Orientation))); setOrientation(window->orientation()); - mContact = new QContact(aArgs.selectedContact()); + mContact = new QContact(aArgs.value(ESelectedContact).value()); mViewManager = aMgr; HbPushButton *newButton = static_cast(mDocumentLoader.findWidget(QString("cnt_button_new"))); @@ -124,8 +122,11 @@ mgr->saveContact(mContact); mgr->setSelfContactId(mContact->localId()); //open the contact editor - CntViewParameters viewParameters(CntViewParameters::editView); - viewParameters.setSelectedContact(*mContact); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, editView); + QVariant var; + var.setValue(*mContact); + viewParameters.insert(ESelectedContact, var); mViewManager->changeView(viewParameters); } @@ -134,7 +135,8 @@ */ void CntMyCardView::openMyCardSelectionView() { - CntViewParameters viewParameters(CntViewParameters::myCardSelectionView); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, myCardSelectionView); mViewManager->changeView(viewParameters); } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntnameseditorview.cpp --- a/phonebookui/pbkcommonui/src/cntnameseditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +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 "cntnameseditorview.h" -#include "cnteditordataviewitem.h" - -CntNamesEditorView::CntNamesEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("Edit name details")); -} - -CntNamesEditorView::~CntNamesEditorView() -{ - -} - -void CntNamesEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - if (mDetailList.at(i)->definitionName() == QContactNickname::DefinitionName && - mDetailList.at(i)->value(QContactNickname::FieldNickname).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - if (mDetailList.at(i)->definitionName() == QContactName::DefinitionName && - mDetailList.at(i)->value(QContactName::FieldFirst).isEmpty() && - mDetailList.at(i)->value(QContactName::FieldLast).isEmpty() && - mDetailList.at(i)->value(QContactName::FieldMiddle).isEmpty() && - mDetailList.at(i)->value(QContactName::FieldPrefix).isEmpty() && - mDetailList.at(i)->value(QContactName::FieldSuffix).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -void CntNamesEditorView::initializeForm() -{ - QList nameDetails = mContact->details(); - QList nickDetails = mContact->details(); - QContactName *name = 0; - QContactNickname *nick = 0; - - if (nameDetails.count() > 0) - { - name = new QContactName(nameDetails.at(0)); - } - else - { - name = new QContactName(); - } - mDetailList.append(name); - - if (nickDetails.count() > 0) - { - nick = new QContactNickname(nickDetails.at(0)); - } - else - { - nick = new QContactNickname(); - } - mDetailList.append(nick); - - CntEditorDataModelItem *item = new CntEditorDataModelItem(*name, QContactName::FieldFirst, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_first_name")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*name, QContactName::FieldLast, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_last_name")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*name, QContactName::FieldMiddle, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_middle_name")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*nick, QContactNickname::FieldNickname, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_nick_name")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*name, QContactName::FieldPrefix, CNT_PREFIXSUFFIX_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_prefix")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - item = new CntEditorDataModelItem(*name, QContactName::FieldSuffix, CNT_PREFIXSUFFIX_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("Suffix")); - formModel()->appendDataFormItem(item, formModel()->invisibleRootItem()); - - // set focus to first name field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->index(0, 0, QModelIndex())))->focusLineEdit(); -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntnamesview.cpp --- a/phonebookui/pbkcommonui/src/cntnamesview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntnamesview.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,12 +17,11 @@ #include "cntnamesview.h" #include "cntnamesview_p.h" -#include "cntviewparameters.h" #include -CntNamesView::CntNamesView() : -d_ptr( new CntNamesViewPrivate() ) +CntNamesView::CntNamesView(CntExtensionManager &extensionManager) : +d_ptr( new CntNamesViewPrivate(extensionManager) ) { Q_D(CntNamesView); d->q_ptr = this; @@ -37,7 +36,7 @@ delete d; } -void CntNamesView::activate(CntAbstractViewManager* aMgr, const CntViewParameters& aArgs) +void CntNamesView::activate(CntAbstractViewManager* aMgr, const CntViewParameters aArgs) { Q_D(CntNamesView); d->activate( aMgr, aArgs ); @@ -60,8 +59,8 @@ Q_D(const CntNamesView); return d->mIsDefault; } -CntViewParameters::ViewId CntNamesView::viewId() const -{ +int CntNamesView::viewId() const +{ Q_D(const CntNamesView); return d->mId; } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntnamesview_p.cpp --- a/phonebookui/pbkcommonui/src/cntnamesview_p.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntnamesview_p.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,8 +17,12 @@ #include "cntnamesview_p.h" #include "cntaction.h" +#include "cntextensionmanager.h" #include "qtpbkglobal.h" +#include +#include + #include #include #include @@ -31,6 +35,8 @@ #include #include #include +#include +#include #include #include #include @@ -43,21 +49,20 @@ const char *CNT_CONTACTLIST_XML = ":/xml/contacts_namelist.docml"; -CntNamesViewPrivate::CntNamesViewPrivate() : +CntNamesViewPrivate::CntNamesViewPrivate(CntExtensionManager &extensionManager) : QObject(), - mViewManager(0), - mListModel(0), - mView(0), - mListView(0), - mEmptyList(0), - mBanner(0), - mSearchPanel(0), - mLoader(0), - mLayout(0), - mVirtualKeyboard(0), - mMenuBuilder(0), + mExtensionManager(extensionManager), + mViewManager(NULL), + mListModel(NULL), + mListView(NULL), + mEmptyList(NULL), + mBanner(NULL), + mSearchPanel(NULL), + mLoader(NULL), + mLayout(NULL), + mMenuBuilder(NULL), mIsDefault(true), - mId( CntViewParameters::namesView ) + mId( namesView ) { bool ok; document()->load( CNT_CONTACTLIST_XML, &ok); @@ -76,12 +81,15 @@ HbAction* findContacts = static_cast (document()->findObject("cnt:find")); HbAction* groups = static_cast (document()->findObject("cnt:groups")); HbAction* importSim = static_cast (document()->findObject("cnt:importsim")); + + HbAction* extension = static_cast (document()->findObject("cnt:activity")); 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(importSim, SIGNAL(triggered()), this, SLOT(importSim())); + connect(extension, SIGNAL(triggered()), this, SLOT(handleExtensionAction())); connect(list(), SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this, SLOT(showContextMenu(HbAbstractViewItem*,QPointF))); connect(list(), SIGNAL(activated (const QModelIndex&)), this, @@ -94,56 +102,54 @@ mView->deleteLater(); delete mListModel; - mListModel = 0; + mListModel = NULL; delete mListView; - mListView = 0; + mListView = NULL; delete mSearchPanel; - mSearchPanel = 0; + mSearchPanel = NULL; delete mEmptyList; - mEmptyList = 0; + mEmptyList = NULL; delete mBanner; - mBanner = 0; + mBanner = NULL; delete mLoader; - mLoader = 0; + mLoader = NULL; delete mVirtualKeyboard; - mVirtualKeyboard = 0; + mVirtualKeyboard = NULL; delete mMenuBuilder; - mMenuBuilder = 0; + mMenuBuilder = NULL; } -void CntNamesViewPrivate::activate(CntAbstractViewManager* aMgr, const CntViewParameters& aArgs) +void CntNamesViewPrivate::activate(CntAbstractViewManager* aMgr, const CntViewParameters aArgs) { mViewManager = aMgr; if (!mListModel) { QContactSortOrder sortOrderFirstName; sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirst); + sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive); QContactSortOrder sortOrderLastName; sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldLast); + sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive); 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); + mListModel = new MobCntModel(mViewManager->contactManager(SYMBIAN_BACKEND), filter, sortOrders); } list()->setModel(mListModel); @@ -160,21 +166,21 @@ } QContactManager* contactManager = aMgr->contactManager( SYMBIAN_BACKEND ); - QString action = aArgs.selectedAction(); + QString action = aArgs.value(ESelectedAction).toString(); if ( action == "save" ) { - QString name = contactManager->synthesizedDisplayLabel( aArgs.selectedContact() ); + QString name = contactManager->synthesizedDisplayLabel( aArgs.value(ESelectedContact).value() ); HbNotificationDialog::launchDialog(qtTrId("Contact \"%1\" saved").arg(name)); - scrollTo( aArgs.selectedContact() ); + scrollTo( aArgs.value(ESelectedContact).value() ); } - else if ( aArgs.selectedAction() == "delete" ) + else if ( action == "delete" ) { - QString name = contactManager->synthesizedDisplayLabel( aArgs.selectedContact() ); + QString name = contactManager->synthesizedDisplayLabel( aArgs.value(ESelectedContact).value() ); HbNotificationDialog::launchDialog(qtTrId("%1 deleted").arg(name)); } - else if ( aArgs.selectedAction() == "failed") + else if ( action == "failed") { HbNotificationDialog::launchDialog(qtTrId("SAVING FAILED!")); } @@ -189,11 +195,11 @@ list()->setModel(NULL); delete mMenuBuilder; - mMenuBuilder = 0; + mMenuBuilder = NULL; // delete the hbsearch since we can not empty text from outside. delete mSearchPanel; - mSearchPanel = 0; + mSearchPanel = NULL; } void CntNamesViewPrivate::scrollTo(const QContact &aContact) @@ -315,6 +321,24 @@ hideFinder(); } +void CntNamesViewPrivate::handleExtensionAction() +{ + for(int i = 0;i < mExtensionManager.pluginCount();i++) + { + CntUiSocialExtension* socialExtension = mExtensionManager.pluginAt(i)->socialExtension(); + if (socialExtension) + { + CntViewParameters params; + socialExtension->handleToolbarAction(params); + if (params.count()) + { + mViewManager->changeView(params); + break; + } + } + } +} + void CntNamesViewPrivate::createNewContact() { QContact newContact; @@ -329,13 +353,16 @@ void CntNamesViewPrivate::showContactView( QContact& aContact ) { - CntViewParameters args(CntViewParameters::commLauncherView); + CntViewParameters args; + args.insert(EViewId, commLauncherView); if (aContact.localId() == mListModel->myCardId() && aContact.details().count() <= 4) { - args.setNextViewId(CntViewParameters::myCardView); + args.insert(EViewId, myCardView); } - args.setSelectedContact(aContact); + QVariant contact; + contact.setValue(aContact); + args.insert(ESelectedContact, contact); mViewManager->changeView(args); } @@ -380,15 +407,20 @@ void CntNamesViewPrivate::showContactEditorView(QContact& aContact) { - CntViewParameters args(CntViewParameters::editView); - args.setSelectedContact(aContact); + CntViewParameters args; + args.insert(EViewId, editView); + + QVariant contact; + contact.setValue(aContact); + args.insert(ESelectedContact, contact); mViewManager->changeView(args); } void CntNamesViewPrivate::showCollectionView() { - CntViewParameters args(CntViewParameters::collectionView); + CntViewParameters args; + args.insert(EViewId, collectionView); mViewManager->changeView(args); } @@ -454,13 +486,20 @@ prototype->setGraphicsSize(HbListViewItem::Thumbnail); mListView->setFrictionEnabled(true); - mListView->setScrollingStyle(HbScrollArea::PanOrFlick); + mListView->setScrollingStyle(HbScrollArea::PanWithFollowOn); mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail); - + mListView->verticalScrollBar()->setInteractive(true); + HbFrameBackground frame; frame.setFrameGraphicsName("qtg_fr_list_normal"); frame.setFrameType(HbFrameDrawer::NinePieces); mListView->itemPrototypes().first()->setDefaultFrame(frame); + + mListView->setUniformItemSizes(true); + + HbIndexFeedback *indexFeedback = new HbIndexFeedback(mView); + indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter); + indexFeedback->setItemView(mListView); } return mListView; } @@ -486,6 +525,7 @@ { if (!mSearchPanel) { mSearchPanel = new HbSearchPanel(); + mSearchPanel->setVisible( false ); connect(mSearchPanel, SIGNAL(exitClicked()), this, SLOT(hideFinder())); connect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this, SLOT(setFilter(QString))); } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntnoteeditormodel.cpp --- a/phonebookui/pbkcommonui/src/cntnoteeditormodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntnoteeditormodel.cpp Mon May 03 12:24:20 2010 +0300 @@ -31,7 +31,7 @@ HbDataFormModelItem* root = invisibleRootItem(); foreach ( QContactNote note, noteList ) { - CntDetailModelItem* item = new CntDetailModelItem( note, qtTrId("Note") ); + CntDetailModelItem* item = new CntDetailModelItem(note); appendDataFormItem( item, root ); } } @@ -43,7 +43,7 @@ void CntNoteEditorModel::insertDetailField() { QContactNote emptyNote; - appendDataFormItem( new CntDetailModelItem(emptyNote, qtTrId("Note")), invisibleRootItem() ); + appendDataFormItem( new CntDetailModelItem(emptyNote), invisibleRootItem() ); } void CntNoteEditorModel::saveContactDetails() diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntnoteeditorview.cpp --- a/phonebookui/pbkcommonui/src/cntnoteeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +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 "cntnoteeditorview.h" -#include "cnteditordataviewitem.h" - -CntNoteEditorView::CntNoteEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("Edit note detail")); -} - -CntNoteEditorView::~CntNoteEditorView() -{ - -} - -void CntNoteEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - - if (mDetailList.at(i)->value(QContactNote::FieldNote).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -void CntNoteEditorView::initializeForm() -{ - QContactNote *buttonNote = new QContactNote(); - mDetailList.append(buttonNote); - CntEditorDataModelItem *buttonItem = new CntEditorDataModelItem(*buttonNote, hbTrId("Add note"), - static_cast(HbDataFormModelItem::CustomItemBase+2)); - formModel()->appendDataFormItem(buttonItem, formModel()->invisibleRootItem()); - - QList noteDetails = mContact->details(); - - if (noteDetails.count() > 0) - { - for(int i = 0;i < noteDetails.count();i++) - { - QContactNote *note = new QContactNote(noteDetails.at(i)); - mDetailList.append(note); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*note, QContactNote::FieldNote, CNT_NOTE_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_note")); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // check if this was the clicked item in edit view - if (mParamString != "add" && mParamString.toInt() == i) - { - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); - } - } - } - else - { - addDetail(); - } -} - -void CntNoteEditorView::addDetail() -{ - QContactNote *note = new QContactNote(); - mDetailList.append(note); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*note, QContactNote::FieldNote, CNT_NOTE_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_note")); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntnoteeditorviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntnoteeditorviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntnoteeditorviewitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -19,10 +19,15 @@ #include "cntdetailmodelitem.h" #include #include +#include +#include #include +#include CntNoteEditorViewItem::CntNoteEditorViewItem( QGraphicsItem* aParent ) : -CntDetailViewItem(aParent) +CntDetailViewItem(aParent), +mEdit(NULL), +mLayout(NULL) { } @@ -49,14 +54,21 @@ HbDataFormModel* model = static_cast(itemView()->model()); CntDetailModelItem* item = static_cast( model->itemFromIndex(modelIndex()) ); QContactNote detail = item->detail(); - + + mLayout = new QGraphicsLinearLayout(Qt::Vertical); + HbWidget* widget = new HbWidget(); + 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() ); + + HbLabel* label = new HbLabel(hbTrId("Note")); + mLayout->addItem(label); + mLayout->addItem(mEdit); + widget->setLayout( mLayout ); - return mEdit; + return widget; } // End of File diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntonlineaccounteditorview.cpp --- a/phonebookui/pbkcommonui/src/cntonlineaccounteditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,138 +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 "cntonlineaccounteditorview.h" -#include "cnteditordataviewitem.h" -#include - -CntOnlineAccountEditorView::CntOnlineAccountEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("Edit account details")); -} - -CntOnlineAccountEditorView::~CntOnlineAccountEditorView() -{ - -} - -void CntOnlineAccountEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - - if (mDetailList.at(i)->value(QContactOnlineAccount::FieldAccountUri).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -QStandardItemModel *CntOnlineAccountEditorView::itemModel() -{ - QStandardItemModel *fieldModel = new QStandardItemModel(); - - QString contextHome = QContactDetail::ContextHome; - QString contextWork = QContactDetail::ContextWork; - - QString internetSubType = QContactOnlineAccount::SubTypeSipVoip; - QString sipSubType = QContactOnlineAccount::SubTypeSip; - QString shareVideoSubType = QContactOnlineAccount::SubTypeVideoShare; - - QStandardItem *internet = new QStandardItem; - internet->setText(hbTrId("Internet call")); - internet->setData(internetSubType, Qt::UserRole); - 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(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(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(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(CNT_ONLINEACCOUNT_EDITOR_MAXLENGTH, Qt::UserRole+3); - fieldModel->appendRow(shareVideo); - - return fieldModel; -} - -void CntOnlineAccountEditorView::initializeForm() -{ - QContactOnlineAccount *buttonAccount = new QContactOnlineAccount(); - mDetailList.append(buttonAccount); - CntEditorDataModelItem *buttonItem = new CntEditorDataModelItem(*buttonAccount, hbTrId("txt_phob_button_add_account"), - static_cast(HbDataFormModelItem::CustomItemBase+2)); - formModel()->appendDataFormItem(buttonItem, formModel()->invisibleRootItem()); - - QList details = mContact->details(); - - if (details.count() > 0) - { - for(int i = 0;i < details.count();i++) - { - QContactOnlineAccount *account = new QContactOnlineAccount(details.at(i)); - mDetailList.append(account); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*account, QContactOnlineAccount::FieldAccountUri, itemModel(), - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbInputLowerCaseFilter::instance()); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // check if this was the clicked item in edit view - if (mParamString != "add" && mParamString.toInt() == i) - { - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); - } - } - } - else - { - addDetail(); - } -} - -void CntOnlineAccountEditorView::addDetail() -{ - QContactOnlineAccount *account = new QContactOnlineAccount(); - account->setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - mDetailList.append(account); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*account, QContactOnlineAccount::FieldAccountUri, itemModel(), - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbInputLowerCaseFilter::instance()); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntphonenumbereditorview.cpp --- a/phonebookui/pbkcommonui/src/cntphonenumbereditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,188 +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 "cntphonenumbereditorview.h" -#include "cnteditordataviewitem.h" -#include - -CntPhoneNumberEditorView::CntPhoneNumberEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("Edit phone number details")); -} - -CntPhoneNumberEditorView::~CntPhoneNumberEditorView() -{ - -} - -void CntPhoneNumberEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - - if (mDetailList.at(i)->value(QContactPhoneNumber::FieldNumber).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -QStandardItemModel *CntPhoneNumberEditorView::itemModel() -{ - QStandardItemModel *fieldModel = new QStandardItemModel(); - - QString contextHome = QContactDetail::ContextHome; - QString contextWork = QContactDetail::ContextWork; - - QString mobileSubType = QContactPhoneNumber::SubTypeMobile; - QString landLineSubType = QContactPhoneNumber::SubTypeLandline; - QString faxSubType = QContactPhoneNumber::SubTypeFacsimile; - QString pagerSubType = QContactPhoneNumber::SubTypePager; - QString carPhoneSubType = QContactPhoneNumber::SubTypeCar; - QString dtmfSubType = QContactPhoneNumber::SubTypeDtmfMenu; - QString assistantSubType = QContactPhoneNumber::SubTypeAssistant; - - QStandardItem *mobile = new QStandardItem; - mobile->setText(hbTrId("txt_phob_dblist_mobile")); - mobile->setData(mobileSubType, Qt::UserRole); - 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(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(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); - fieldModel->appendRow(mobilework); - - QStandardItem *land = new QStandardItem; - land->setText(hbTrId("Phone")); - land->setData(landLineSubType, Qt::UserRole); - land->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); - fieldModel->appendRow(land); - QStandardItem *landhome = new QStandardItem; - landhome->setText(hbTrId("Phone (home)")); - landhome->setData(landLineSubType, Qt::UserRole); - landhome->setData(contextHome, Qt::UserRole+1); - landhome->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); - fieldModel->appendRow(landhome); - QStandardItem *landwork = new QStandardItem; - landwork->setText(hbTrId("Phone (work)")); - landwork->setData(landLineSubType, Qt::UserRole); - landwork->setData(contextWork, Qt::UserRole+1); - 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(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(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(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(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(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(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(CNT_DTMF_EDITOR_MAXLENGTH, Qt::UserRole+3); - fieldModel->appendRow(dtmf); - - return fieldModel; -} - -void CntPhoneNumberEditorView::initializeForm() -{ - QContactPhoneNumber *buttonNumber = new QContactPhoneNumber(); - mDetailList.append(buttonNumber); - CntEditorDataModelItem *buttonItem = new CntEditorDataModelItem(*buttonNumber, hbTrId("txt_phob_button_add_number"), - static_cast(HbDataFormModelItem::CustomItemBase+2)); - formModel()->appendDataFormItem(buttonItem, formModel()->invisibleRootItem()); - - QList details = mContact->details(); - - if (details.count() > 0) - { - for(int i = 0;i < details.count();i++) - { - QContactPhoneNumber *number = new QContactPhoneNumber(details.at(i)); - mDetailList.append(number); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*number, QContactPhoneNumber::FieldNumber, itemModel(), - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbPhoneNumberFilter::instance()); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // check if this was the clicked item in edit view - if (mParamString != "add" && mParamString.toInt() == i) - { - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); - } - } - } - else - { - addDetail(); - } -} - -void CntPhoneNumberEditorView::addDetail() -{ - QContactPhoneNumber *number = new QContactPhoneNumber(); - number->setSubTypes(QContactPhoneNumber::SubTypeMobile); - mDetailList.append(number); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*number, QContactPhoneNumber::FieldNumber, itemModel(), - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbPhoneNumberFilter::instance()); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntphonenumberviewitem.cpp --- a/phonebookui/pbkcommonui/src/cntphonenumberviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntphonenumberviewitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -38,9 +38,10 @@ CntPhoneNumberViewItem::CntPhoneNumberViewItem( QGraphicsItem* aParent ) : CntDetailViewItem( aParent ), -mBox(0), -mEdit(0), -mFilter( 0 ) +mBox(NULL), +mEdit(NULL), +mFilter(NULL), +mLayout(NULL) { } @@ -103,17 +104,29 @@ } } +void CntPhoneNumberViewItem::changeOrientation(Qt::Orientation aOrient) +{ + if (mLayout) { + mLayout->setOrientation(aOrient); + } +} + HbWidget* CntPhoneNumberViewItem::createCustomWidget() { - QGraphicsLinearLayout* layout = new QGraphicsLinearLayout( itemView()->mainWindow()->orientation() ); + connect(itemView()->mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(changeOrientation(Qt::Orientation))); + mLayout = 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 ); + widget->setLayout( mLayout ); + + mLayout->addItem( mBox ); + mLayout->addItem( mEdit ); + + mLayout->setStretchFactor(mBox, 2); + mLayout->setStretchFactor(mEdit, 2); connect( mBox, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int)) ); connect( mEdit, SIGNAL(textChanged(QString)),this, SLOT(textChanged(QString)) ); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntsnapshotwidget.cpp --- a/phonebookui/pbkcommonui/src/cntsnapshotwidget.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +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: Copied from Music Player snapshot widget. -* -*/ - -#include -#include -#include - -#include "cntsnapshotwidget.h" - - -/*! - Constructs the snapshot widget. - */ -CntSnapshotWidget::CntSnapshotWidget( QGraphicsItem *parent ) - : HbWidget(parent), - mSnapshot(0) -{ - -} - -/*! - Destructs the snapshot widget. - */ -CntSnapshotWidget::~CntSnapshotWidget() -{ - if (mSnapshot) - delete mSnapshot; -} - -/*! - Takes a snapshot of an \a item within \a graphicsView, also sets its position - and geometry so it can be used as a decoy for that itme. - */ -void CntSnapshotWidget::capture(QGraphicsView *graphicsView, QGraphicsItem *item) -{ - if (mSnapshot){ - delete mSnapshot; - mSnapshot = 0; - } - setGeometry(QRect(QPoint(0,0),item->sceneBoundingRect().toRect().size())); - setPos(item->sceneBoundingRect().toRect().topLeft()); - mSnapshot = new QImage( - item->sceneBoundingRect().toRect().size() , - QImage::Format_ARGB32_Premultiplied); - QPainter p( mSnapshot); - graphicsView->render( &p, rect(), item->sceneBoundingRect().toRect()); -} - -/*! - \reimp - */ -void CntSnapshotWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -{ - Q_UNUSED(widget) - Q_UNUSED(option) - if (mSnapshot) - painter->drawImage( rect(), *mSnapshot ); -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnturleditorview.cpp --- a/phonebookui/pbkcommonui/src/cnturleditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +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 "cnturleditorview.h" -#include "cnteditordataviewitem.h" -#include - -CntUrlEditorView::CntUrlEditorView(CntViewManager *viewManager, QGraphicsItem *parent): - CntBaseDetailEditorView(viewManager, parent) -{ - setHeader(hbTrId("Edit URL details")); -} - -CntUrlEditorView::~CntUrlEditorView() -{ - -} - -void CntUrlEditorView::aboutToCloseView() -{ - for (int i = 0; i < mDetailList.count(); i++) - { - mContact->saveDetail(mDetailList.at(i)); - - if (mDetailList.at(i)->value(QContactUrl::FieldUrl).isEmpty()) - { - mContact->removeDetail(mDetailList.at(i)); - } - } - CntBaseDetailEditorView::aboutToCloseView(); -} - -QStandardItemModel *CntUrlEditorView::itemModel() -{ - QStandardItemModel *fieldModel = new QStandardItemModel(); - - QString contextHome = QContactDetail::ContextHome; - QString contextWork = QContactDetail::ContextWork; - - QString urlField = QContactUrl::FieldUrl; - - QStandardItem *url = new QStandardItem; - url->setText(hbTrId("txt_phob_dblist_url")); - url->setData(urlField, Qt::UserRole); - 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(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(CNT_URL_EDITOR_MAXLENGTH, Qt::UserRole+3); - fieldModel->appendRow(urlwork); - - return fieldModel; -} - -void CntUrlEditorView::initializeForm() -{ - QContactUrl *buttonUrl = new QContactUrl(); - mDetailList.append(buttonUrl); - CntEditorDataModelItem *buttonItem = new CntEditorDataModelItem(*buttonUrl, hbTrId("Add URL"), - static_cast(HbDataFormModelItem::CustomItemBase+2)); - formModel()->appendDataFormItem(buttonItem, formModel()->invisibleRootItem()); - - QList details = mContact->details(); - - if (details.count() > 0) - { - for(int i = 0;i < details.count();i++) - { - QContactUrl *url = new QContactUrl(details.at(i)); - mDetailList.append(url); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*url, QContactUrl::FieldUrl, itemModel(), - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbUrlFilter::instance()); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // check if this was the clicked item in edit view - if (mParamString != "add" && mParamString.toInt() == i) - { - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); - } - } - } - else - { - addDetail(); - } -} - -void CntUrlEditorView::addDetail() -{ - QContactUrl *url = new QContactUrl(); - mDetailList.append(url); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*url, QContactUrl::FieldUrl, itemModel(), - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbEmailAddressFilter::instance()); - formModel()->insertDataFormItem(formModel()->rowCount() - 1, item, formModel()->invisibleRootItem()); - - // set focus to the added field's lineedit - static_cast(dataForm()->itemByIndex(formModel()->indexFromItem(item)))->focusLineEdit(); -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cnturleditorviewitem.cpp --- a/phonebookui/pbkcommonui/src/cnturleditorviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cnturleditorviewitem.cpp Mon May 03 12:24:20 2010 +0300 @@ -21,37 +21,46 @@ #include #include #include +#include #include #include #include CntUrlEditorViewItem::CntUrlEditorViewItem( QGraphicsItem* aParent ) : -CntDetailViewItem( aParent ) - { +CntDetailViewItem( aParent ), +mBox(NULL), +mEdit(NULL), +mLayout(NULL) +{ - } +} CntUrlEditorViewItem::~CntUrlEditorViewItem() - { - - } +{ +} HbAbstractViewItem* CntUrlEditorViewItem::createItem() - { +{ return new CntUrlEditorViewItem(*this); - } +} HbWidget* CntUrlEditorViewItem::createCustomWidget() - { - QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical); +{ + connect(itemView()->mainWindow(), SIGNAL(orientationChanged(Qt::Orientation)), + this, SLOT(changeOrientation(Qt::Orientation))); + + mLayout = new QGraphicsLinearLayout(itemView()->mainWindow()->orientation()); 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 ); + widget->setLayout( mLayout ); + mLayout->addItem( mBox ); + mLayout->addItem( mEdit ); + + mLayout->setStretchFactor(mBox, 2); + mLayout->setStretchFactor(mEdit, 2); connect( mBox, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int)) ); connect( mEdit, SIGNAL(textChanged(QString)),this, SLOT(textChanged(QString)) ); @@ -68,10 +77,10 @@ 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()) ); @@ -85,20 +94,25 @@ 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::changeOrientation(Qt::Orientation aOrient) +{ + mLayout->setOrientation(aOrient); +} void CntUrlEditorViewItem::constructSubTypeModel( QStringList aContext ) - { +{ QStandardItemModel* model = new QStandardItemModel(); QString contextHome = QContactDetail::ContextHome; @@ -137,6 +151,6 @@ break; } } - } +} // End of File diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntviewmanager.cpp --- a/phonebookui/pbkcommonui/src/cntviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,248 +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 "cntviewmanager.h" -#include "cntbaseview.h" -#include "cntmainwindow.h" - -#include "cntnamesview.h" -#include "cntfavoritesmemberview.h" -#include "cntcontactcardview.h" -#include "cntonlineaccounteditorview.h" -#include "cnteditview.h" -#include "cntmycardview.h" -#include "cntmycardselectionview.h" -#include "cntgroupeditorview.h" -#include "cntgroupmemberview.h" -#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. - - */ - -/*! - Constructor - */ -CntViewManager::CntViewManager(CntMainWindow *mainWindow, CntViewParameters::ViewId defaultView) : - mMainWindow(mainWindow), - mDefaultView(0), - mEditorFactory(0), - mCurrentViewId(CntViewParameters::noView) -{ - Q_UNUSED( defaultView ); - mEditorFactory = new CntEditorFactory(this); - HbStyleLoader::registerFilePath(":/style"); -} - -/*! - Destructor - */ -CntViewManager::~CntViewManager() -{ - delete mEditorFactory; -} - -/*! - \return Pointer to mainwindow - */ -CntMainWindow *CntViewManager::mainWindow() -{ - return mMainWindow; -} - -/*! - Set the default view - */ -void CntViewManager::setDefaultView(CntViewParameters::ViewId defaultView) -{ - CntViewParameters args(defaultView); - CntBaseView *view = getView(args); - - if (view && view != mDefaultView) { - addViewToWindow(view); - - // delete the old default view if it exists - if (mDefaultView) { - mainWindow()->removeView(mDefaultView); - mDefaultView->setParent(0); - mDefaultView->deleteLater(); - } - - //set the new view as default - mCurrentViewId = defaultView; - mDefaultView = view; - } -} - -void CntViewManager::removeDepracatedCurrentView() -{ - 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); - } -} -/*! - 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 not default view add the view to main window - if (view != mDefaultView) { - view->setupView(); - mainWindow()->addView(view); - } - - //set the view as current - mainWindow()->setCurrentView(view); - } -} - -/*! - Remove \a view from main window and delete it - */ -void CntViewManager::removeViewFromWindow(CntBaseView *view) -{ - if (view && view != mDefaultView) { - mainWindow()->removeView(view); - view->setParent(0); - view->deleteLater(); - } -} - -/*! - 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(); - - 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 = mEditorFactory->createNameEditorView(aArgs.selectedContact()); - break; - } - case CntViewParameters::urlEditorView: - { - view = mEditorFactory->createUrlEditorView(aArgs.selectedContact()); - break; - } - 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: - { - 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; -} - -// end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntviewnavigator.cpp --- a/phonebookui/pbkcommonui/src/cntviewnavigator.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/pbkcommonui/src/cntviewnavigator.cpp Mon May 03 12:24:20 2010 +0300 @@ -15,10 +15,12 @@ * */ #include "cntviewnavigator.h" +#include #include -CntViewNavigator::CntViewNavigator( QObject* aParent ) : QObject( aParent ), -iTop( CntViewParameters::noView ) +CntViewNavigator::CntViewNavigator( QObject* aParent ) : + QObject( aParent ), + iTop( noView ) { } @@ -26,22 +28,36 @@ { } -void CntViewNavigator::next( const CntViewParameters::ViewId& aId ) +void CntViewNavigator::next( const int& aId, QFlags &flags ) { + if ( !iViewStack.isEmpty() ) + { + int top = iViewStack.top(); + + // If any special effects are defined for the current (top) view and associated with the next view + if ( iEffects.contains( top ) && iEffects.value( top ) == aId ) + { + flags = Hb::ViewSwitchUseNormalAnim | Hb::ViewSwitchUseAltEvent; + } + else + { + flags = Hb::ViewSwitchUseNormalAnim; + } + } iViewStack.push( aId ); } -const CntViewParameters::ViewId& CntViewNavigator::back() +const int& CntViewNavigator::back( QFlags &flags ) { - qDebug() << "CntViewParameters::back() - IN"; - iTop = CntViewParameters::noView; + qDebug() << "CntViewNavigator::back() - IN"; + iTop = 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(); + int top = iViewStack.top(); // If any exception defined for the current (top) view if ( iExceptions.contains( top ) ) @@ -66,22 +82,45 @@ iTop = iViewStack.top(); } } + + // If any special effects are defined for the current (top) view and associated with the previous view + if ( iEffects.contains( top ) && iEffects.value( top ) == iTop ) + { + flags = Hb::ViewSwitchUseBackAnim | Hb::ViewSwitchUseAltEvent; + } + else + { + flags = Hb::ViewSwitchUseBackAnim; + } } - qDebug() << "CntViewParameters::back() - OUT"; + qDebug() << "CntViewNavigator::back() - OUT"; return iTop; } -void CntViewNavigator::addException( const CntViewParameters::ViewId& aCurrent, const CntViewParameters::ViewId& aBack ) +void CntViewNavigator::addException( const int& aCurrent, const int& aBack ) { iExceptions.insert( aCurrent, aBack ); } -void CntViewNavigator::removeException( const CntViewParameters::ViewId& aCurrent ) +void CntViewNavigator::removeException( const int& aCurrent ) { if ( iExceptions.contains(aCurrent) ) { iExceptions.remove( aCurrent ); } } + +void CntViewNavigator::addEffect( const int& aCurrent, const int& aBack ) +{ + iEffects.insert( aCurrent, aBack ); +} + +void CntViewNavigator::removeEffect( const int& aCurrent ) +{ + if ( iEffects.contains(aCurrent) ) + { + iEffects.remove( aCurrent ); + } +} // End of File diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/src/cntviewparameters.cpp --- a/phonebookui/pbkcommonui/src/cntviewparameters.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +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 "cntviewparameters.h" -#include - -CntViewParameters::CntViewParameters(CntViewParameters::ViewId activateView, CntViewParameters::ViewId previousViewId) : - mActivateViewId(activateView), - mPreviousViewId(previousViewId) -{ -} - -CntViewParameters::CntViewParameters( const CntViewParameters &viewParameters ) -{ - mActivateViewId = viewParameters.nextViewId(); - mPreviousViewId = viewParameters.previousViewId(); - - mContact = viewParameters.selectedContact(); - mDetail = viewParameters.selectedDetail(); - mGroupContact = viewParameters.selectedGroupContact(); - mParams = viewParameters.parameters(); -} - -CntViewParameters::~CntViewParameters() -{ -} - -void CntViewParameters::setNextViewId(const CntViewParameters::ViewId& activateViewId) -{ - mActivateViewId = activateViewId; -} - -CntViewParameters::ViewId CntViewParameters::nextViewId() const -{ - return mActivateViewId; -} - -void CntViewParameters::setPreviousViewId(const CntViewParameters::ViewId previousViewId) -{ - mPreviousViewId = previousViewId; -} - -CntViewParameters::ViewId CntViewParameters::previousViewId() const -{ - return mPreviousViewId; -} - -void CntViewParameters::setSelectedContact(const QContact &contact) -{ - mContact = contact; -} - -QContact CntViewParameters::selectedContact() const -{ - return mContact; -} - -void CntViewParameters::setSelectedDetail(const QContactDetail &detail) -{ - mDetail = detail; -} - -QContactDetail CntViewParameters::selectedDetail() const -{ - return mDetail; -} - -void CntViewParameters::setSelectedAction(const QString &action) -{ - mAction = action; -} - -QString CntViewParameters::selectedAction() const -{ - return mAction; -} - -void CntViewParameters::setSelectedGroupContact(const QContact &contact) -{ - mGroupContact = contact; -} - -QContact CntViewParameters::selectedGroupContact() const -{ - return mGroupContact; -} - -void CntViewParameters::setParameters(const QMap& aMap) -{ - mParams = aMap; -} - -QMap CntViewParameters::parameters() const -{ - return mParams; -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_cnteditview/editview.xml --- a/phonebookui/pbkcommonui/tsrc/ut_cnteditview/editview.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ - - - - 4.5.2-tower - 4.5.2-tower - - - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_cnteditview/runtest.cmd --- a/phonebookui/pbkcommonui/tsrc/ut_cnteditview/runtest.cmd Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -@echo off -rem -rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -rem All rights reserved. -rem This component and the accompanying materials are made available -rem under the terms of "Eclipse Public License v1.0" -rem which accompanies this distribution, and is available -rem at the URL "http://www.eclipse.org/legal/epl-v10.html". -rem -rem Initial Contributors: -rem Nokia Corporation - initial contribution. -rem -rem Contributors: -rem -rem Description: -rem -@echo on - -call del editview.xml -call del MON.sym -call del MON.dat -call qmake -call bldmake bldfiles -call abld clean -call abld reallyclean - -IF ["%1"] EQU [""] GOTO :NORMAL - -call ctcwrap -i d -C "EXCLUDE+*\moc*.cpp" -C "EXCLUDE+*\t_*.cpp" -C "EXCLUDE+*\stub_*.cpp" abld build winscw udeb -goto :FINAL - -:NORMAL -call abld build winscw udeb - -:FINAL -rem call shellstart -call \epoc32\release\winscw\udeb\ut_cnteditview.exe -xml -o c:\editview.xml -call copy R:\epoc32\winscw\c\editview.xml . -call type editview.xml -rem call fullstart \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_cnteditview/t_cnteditview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_cnteditview/t_cnteditview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,302 +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 -#include -#include - -#include "cntEditView.h" -#include "cntviewmanager.h" -#include "cntmainwindow.h" -#include "cntbaseview.h" - -#include "t_cnteditview.h" - - -void TestCntEditView::resetView() -{ - if (mEditView) - { - delete mEditView; - mEditView=0; - } - mEditView= new CntEditView(mViewManager,0); -} - - -void TestCntEditView::initTestCase() -{ - mWindow=0; - mViewManager=0; - mEditView=0; - - mWindow=new CntMainWindow(); - mViewManager=new CntViewManager(mWindow); -} - -void TestCntEditView::createView() -{ - resetView(); - QVERIFY(mWindow!=0); - QVERIFY(mViewManager!=0); - QVERIFY(mEditView!=0); - - -} - - - -void TestCntEditView::addSoftkeyAction() -{ - resetView(); - - mEditView->addSoftkeyAction(); - QVERIFY(mEditView->mSoftKeyQuitAction == mWindow->softKeyAction(Hb::SecondarySoftKey)); -} - -void TestCntEditView::signalMapper() -{ - - resetView(); - mEditView->signalMapper(); - QVERIFY(mEditView->signalMapper() != 0); -} - -void TestCntEditView::addActionsToToolBar() -{ - - resetView(); - mEditView->addActionsToToolBar(); - QVERIFY(mEditView->actions()->actionList().count()==1); -} - -void TestCntEditView::addMenuItems() -{ - - resetView(); - mEditView->addMenuItems(); - QVERIFY(mEditView->actions()->actionList().count() == 1); -} - -void TestCntEditView::activateView() -{ - - resetView(); - - - - //check that labels are empty - HbPushButton* nameButton = static_cast(mEditView->findWidget("nameButton")); - QVERIFY(nameButton->text()==tr("name")); - - //set view parameters and create contact - QContact* contact = new QContact(); - QContactName* name = new QContactName(); - name->setFirst("first"); - contact->saveDetail(name); - - mEditView->contactManager()->saveContact(contact); - - CntViewParameters viewParameters(CntViewParameters::noView); - - viewParameters.setSelectedContact(*contact); - mEditView->activateView(viewParameters); - - QVERIFY(nameButton->text()==tr("first")); - - delete name; - mEditView->contactManager()->removeContact(contact->localId()); - - - -} - - -void TestCntEditView::viewId() - { - resetView(); - QVERIFY(mEditView->viewId()== CntViewParameters::editView); - } -void TestCntEditView::prepareToEditContact() - { - resetView(); - CntViewParameters viewParameters(CntViewParameters::noView); - viewParameters=mEditView->prepareToEditContact(QContactName::DefinitionName,tr("Test")); - - - CntViewParameters viewParameters1(CntViewParameters::noView); - viewParameters1=mEditView->prepareToEditContact(QContactPhoneNumber::DefinitionName,tr("Test")); - - CntViewParameters viewParameters2(CntViewParameters::noView); - viewParameters2=mEditView->prepareToEditContact(QContactEmailAddress::DefinitionName,tr("Test")); - - CntViewParameters viewParameters3(CntViewParameters::noView); - viewParameters3=mEditView->prepareToEditContact(QContactAddress::DefinitionName,tr("Test")); - - CntViewParameters viewParameters4(CntViewParameters::noView); - viewParameters4=mEditView->prepareToEditContact(QContactOnlineAccount::DefinitionName,tr("Test")); - - CntViewParameters viewParameters5(CntViewParameters::noView); - viewParameters5=mEditView->prepareToEditContact(QContactUrl::DefinitionName,tr("Test")); - - CntViewParameters viewParameters6(CntViewParameters::noView); - viewParameters6=mEditView->prepareToEditContact(QContactNote::DefinitionName,tr("Test")); - - CntViewParameters viewParameters7(CntViewParameters::noView); - viewParameters7=mEditView->prepareToEditContact(QContactFamily::DefinitionName,tr("Test")); - - CntViewParameters viewParameters8(CntViewParameters::noView); - viewParameters8=mEditView->prepareToEditContact(QContactOrganization::DefinitionName,tr("Test")); - - CntViewParameters viewParameters9(CntViewParameters::noView); - viewParameters9=mEditView->prepareToEditContact(QContactBirthday::DefinitionName,tr("Test")); - - CntViewParameters viewParameters10(CntViewParameters::noView); - viewParameters10=mEditView->prepareToEditContact(QContactAnniversary::DefinitionName,tr("Test")); - - CntViewParameters viewParameters11(CntViewParameters::editView); - viewParameters11=mEditView->prepareToEditContact(tr("INVALID"),tr("Test")); - - QVERIFY(viewParameters.nextViewId()== CntViewParameters::namesEditorView); - QVERIFY(viewParameters1.nextViewId()== CntViewParameters::phoneNumberEditorView); - QVERIFY(viewParameters2.nextViewId()== CntViewParameters::emailEditorView); - QVERIFY(viewParameters3.nextViewId()== CntViewParameters::addressEditorView); - QVERIFY(viewParameters3.selectedAction()== tr("Test")); - QVERIFY(viewParameters4.nextViewId()== CntViewParameters::onlineAccountEditorView); - QVERIFY(viewParameters5.nextViewId()== CntViewParameters::urlEditorView); - QVERIFY(viewParameters6.nextViewId()== CntViewParameters::noteEditorView); - QVERIFY(viewParameters7.nextViewId()== CntViewParameters::familyDetailEditorView); - QVERIFY(viewParameters8.nextViewId()== CntViewParameters::companyEditorView); - QVERIFY(viewParameters9.nextViewId()== CntViewParameters::noView); - QVERIFY(viewParameters10.nextViewId()== CntViewParameters::noView); - QVERIFY(viewParameters11.nextViewId()== CntViewParameters::noView); - - - } - - - -void TestCntEditView::aboutToCloseView() - { - resetView(); - //TODO: How to test? - } -void TestCntEditView::onListViewActivated() - { - resetView(); - //TODO: How to test? - } -void TestCntEditView::deleteDetail() - { - resetView(); - // create listView - mEditView->listView(); - mEditView->listView()->setModel(mEditView->contactModel()); - - int oldCount=mEditView->listView()->indexCount(); - - QContact *contact=new QContact(); - QContactName *name=new QContactName(); - name->setFirst("first"); - contact->saveDetail(name); - mEditView->contactManager()->saveContact(contact); - mEditView->setContact(contact); - - int newCount=mEditView->listView()->indexCount(); - QVERIFY(newCount==oldCount+1); - mEditView->contactManager()->removeContact(contact->localId()); - - delete name; - - } - -void TestCntEditView::onLongPressed() - { - resetView(); - } - -void TestCntEditView::addField() - { - resetView(); - //TODO: How to test? - } - -void TestCntEditView::openNameEditor() - { - resetView(); - CntViewParameters viewParameters(CntViewParameters::namesEditorView); - QContact contact; - QContactName *name=new QContactName(); - name->setFirst("first"); - contact.saveDetail(name); - - viewParameters.setSelectedContact(contact); - mViewManager->onActivateView(viewParameters); - delete name; - - - - } - -void TestCntEditView::handleExecutedCommand() - { - resetView(); - - QContact *contact=new QContact(); - QContactName *name=new QContactName(); - name->setFirst("first"); - contact->saveDetail(name); - - mEditView->setContact(contact); - int result=mEditView->handleExecutedCommand(tr("delete"), *contact); - QVERIFY(result==0); - result=mEditView->handleExecutedCommand(tr("INVALID"), *contact); - QVERIFY(result==-1); - - delete name; - delete contact; - - } - - -void TestCntEditView::cleanupTestCase() -{ - if (mWindow) - { - mWindow->deleteLater(); - mWindow=0; - } - if (mViewManager) - { - mViewManager->deleteLater(); - mViewManager=0; - } - if (mEditView) - { - mEditView->setMenu(0); - mEditView->deleteLater(); - mEditView=0; - } - -} - -QTEST_MAIN(TestCntEditView) - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_cnteditview/t_cnteditview.h --- a/phonebookui/pbkcommonui/tsrc/ut_cnteditview/t_cnteditview.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 CntEditView; - -class TestCntEditView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createView(); - - - void addSoftkeyAction(); - void signalMapper(); - void addActionsToToolBar(); - void addMenuItems(); - void activateView(); - void viewId(); - void prepareToEditContact(); - void aboutToCloseView(); - void onListViewActivated(); - void deleteDetail(); - void onLongPressed(); - void addField(); - void openNameEditor(); - void handleExecutedCommand(); - void cleanupTestCase(); - -private: - void cleanupClasses(); - void resetView(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntEditView *mEditView; - -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_cnteditview/ut_cnteditview.pro --- a/phonebookui/pbkcommonui/tsrc/ut_cnteditview/ut_cnteditview.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -###################################################################### -# Automatically generated by qmake (2.01a) pe 27. helmi 08:49:52 2009 -###################################################################### - -TEMPLATE = app -TARGET = - -QT += testlib -CONFIG += qtestlib hb -DEFINES += PBK_UNIT_TEST - -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += ./inc -INCLUDEPATH += ../../inc -INCLUDEPATH += ../../resource -INCLUDEPATH += ../../../inc -INCLUDEPATH += ../stubs - -# Input - -HEADERS += t_cnteditview.h \ - ../../inc/cntbaseview.h \ - ../../inc/cntbaseselectionview.h \ - ../../inc/cntnamesview.h \ - ../../inc/cntbaselistview.h \ - ../../inc/cntlistview.h \ - ../../inc/cntcollectionview.h \ - ../../inc/cnteditview.h \ - ../../inc/cntfavoritesview.h \ - ../../inc/cntfavoritesselectionview.h \ - ../../inc/cntmainwindow.h \ - ../../inc/cntviewmanager.h \ - ../../inc/cntmodelprovider.h \ - ../../inc/cntviewparameters.h \ - ../../inc/cntactions.h \ - ../../inc/cntcommandobject.h \ - ../../inc/cntdocumentloader.h \ - ../../inc/cnteditviewmodel.h \ - ../../inc/cntdetailpopup.h \ - ../../inc/cntcommands.h - -SOURCES += t_cnteditview.cpp \ - ../../src/cnteditview.cpp\ - ../stubs/stub_cntbaseview.cpp \ - ../stubs/stub_cntbaselistview.cpp \ - ../stubs/stub_cntlistview.cpp \ - ../stubs/stub_cntbaseselectionview.cpp \ - ../stubs/stub_cntnamesview.cpp \ - ../stubs/stub_cntcollectionview.cpp \ - ../stubs/stub_cntfavoritesview.cpp \ - ../stubs/stub_cntfavoritesselectionview.cpp \ - ../stubs/stub_cntactions.cpp \ - ../stubs/stub_cntmainwindow.cpp \ - ../stubs/stub_cntviewmanager.cpp \ - ../stubs/stub_cntcommandobject.cpp \ - ../stubs/stub_cntviewparameters.cpp \ - ../stubs/stub_cntcommands.cpp \ - ../stubs/stub_cntdocumentloader.cpp \ - ../stubs/stub_cnteditviewmodel.cpp \ - ../stubs/stub_cntdetailpopup.cpp \ - ../stubs/stub_cntmodelprovider.cpp - - - - -RESOURCES += ../../resources/pbkcommonui.qrc - -# capability -TARGET.CAPABILITY = ALL -TCB - - -LIBS+=-lhbcore -lqtcontacts -lmobcntmodel diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_addresseditor.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_addresseditor.h Fri Apr 16 14:53:18 2010 +0300 +++ /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: -* -*/ -/* - * 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntactions.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntactions.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +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 - -class CntActions; - -class TestCntActions : public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - - void baseAction(); - - void addActionToToolBar(); - void addActionsToToolBar(); - - void addActionToMenu(); - void addActionsToMenu(); - - void actionList(); - void cleanupTestCase(); - -private: - - CntActions *mActions; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntaddresseditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntaddresseditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +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 - - -class CntMainWindow; -class CntViewManager; -class CntAddressEditorView; - -class TestCntAddressEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void initializeForm(); - void initializeFormOneData(); - void initializeFormAllData(); - - void cleanupTestCase(); - -public: - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntAddressEditorView *mAddressEditorView; - -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntbasedetaileditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntbasedetaileditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 CntViewManager; -class CntMainWindow; - -#include "cntbasedetaileditorview.h" -#include "cntviewparameters.h" - -class CntBaseDetailEditorTestView : public CntBaseDetailEditorView -{ - Q_OBJECT - -public: - CntBaseDetailEditorTestView(CntViewManager *viewManager, QGraphicsItem *parent = 0): - CntBaseDetailEditorView(viewManager, parent), mResult(false) { } - - CntViewParameters::ViewId viewId() const { return CntViewParameters::noView; } - void initializeForm() { } - void addDetail() { mResult = true; } - - bool mResult; -}; - -class TestCntBaseDetailEditorView : public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void addMenuItems(); - - void formModel(); - void dataForm(); - void setHeader(); - void header(); - - void activateView(); - - void cleanupTestCase(); - -private: - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntBaseDetailEditorTestView *mBaseDetailEditorView; - -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntbaselistview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntbaselistview.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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; - -#include "cntbaselistview.h" -#include "cntviewparameters.h" - -class CntBaseListTestView : public CntBaseListView -{ - Q_OBJECT - -public: - CntBaseListTestView(CntViewManager *viewManager, QGraphicsItem *parent = 0): - CntBaseListView(viewManager, parent) { } - - CntViewParameters::ViewId viewId() const { return CntViewParameters::noView; } - -}; - -class TestCntBaseListView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void setupView(); - void activateView(); - void onLongPress(); - void onListViewActivated(); - - void addItemsToLayout(); - - void setBannerName(); - void bannerName(); - void banner(); - void isBannerVisible(); - - void listLayout(); - void listView(); - - void setDataModel(); - - - void clearDataModelFilter(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntBaseListTestView *mBaseListView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntbaseselectionview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntbaseselectionview.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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; - -#include "cntbaseselectionview.h" -#include "cntviewparameters.h" - -class CntBaseSelectionTestView : public CntBaseSelectionView -{ - Q_OBJECT - -public: - CntBaseSelectionTestView(CntViewManager *viewManager, QGraphicsItem *parent = 0, - HbAbstractItemView::SelectionMode newMode = HbAbstractItemView::MultiSelection): - CntBaseSelectionView(viewManager, parent, newMode) { } - - CntViewParameters::ViewId viewId() const { return CntViewParameters::noView; } - -}; - -class TestCntBaseSelectionView : public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void setupView(); - - void addItemsToLayout(); - void listView(); - void activateView(); - void listLayout(); - void selectionModel(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntBaseSelectionTestView *mSelectionView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntbaseview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntbaseview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +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 "cntbaseview.h" -#include "cntviewparameters.h" - -class CntViewManager; -class CntMainWindow; - -class CntBaseTestView : public CntBaseView -{ - Q_OBJECT - -public: - CntBaseTestView(CntViewManager *viewManager, QGraphicsItem *parent = 0): - CntBaseView(viewManager, parent) { } - - CntViewParameters::ViewId viewId() const { return CntViewParameters::noView; } - -}; - -class TestCntBaseView : public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - // main funcs - void setupView(); - void viewManager(); - void contactModel(); - void contactManager(); - void commands(); - - void addSoftkeyAction(); - - void clearToolBar(); - void addToolBar(); - void setToolBarOrientation(); - - void actions(); - - void loadDocument(); - void findWidget(); - void findObject(); - - void keyPressEvent(); - - void cleanupTestCase(); - -private: - CntBaseTestView *mBaseView; - CntViewManager *mViewManager; - CntMainWindow *mWindow; - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionlistmodel.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionlistmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +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 - -QTM_USE_NAMESPACE - -class CntCollectionListModel; - -class TestCntCollectionListModel : public QObject -{ - Q_OBJECT - -private slots: - - void init(); - void cleanup(); - - - void data(); - void rowCount(); - void removeRows(); - void removeGroup(); - void initializeStaticGroups(); - void initializeUserGroups(); - void isFavoriteGroupCreated(); - void favoriteGroupId(); - -private: - - CntCollectionListModel *mModel; - QContactManager *mManager; -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcollectionview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +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 - -class TestViewManager; -class CntCollectionView; - -class TestCntCollectionView: public QObject -{ - Q_OBJECT - -private slots: - - void init(); - void cleanup(); - - void testActivate(); - void testShowPreviousView(); - void testOpenEmptyFavoritesGroup(); - void testOpenUserGroup(); - void testShowContextMenu(); - void testRefreshDataModel(); - - -private: - TestViewManager *mViewManager; - CntCollectionView *mCollectionView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcommands.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcommands.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +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 -class CntCommands; -class CntMainWindow; -class CntViewManager; - -QTM_USE_NAMESPACE - -class TestCntCommands : public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void newContact(); - void editContact(); - void openContact(); - void viewHistory(); - void launchDialer(); - void progress(); - void cleanupTestCase(); - -public: - -private: - - QContactManager *mManager; - QContactManager *mSimManager; - CntCommands *mCommands; - CntMainWindow *mWindow; - CntViewManager *mViewManager; - QContact mContact; - - }; - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcommhistoryview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcommhistoryview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +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 - -class CntMainWindow; -class CntViewManager; -class CntHistoryView; - -class TestCntCommHistoryView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - void aboutToCloseView(); - void activateView(); - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntHistoryView *mHistoryView; -}; - - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcompanyeditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcompanyeditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +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 - - -class CntMainWindow; -class CntViewManager; -class CntCompanyEditorView; - -class TestCntCompanyEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void initializeForm(); - void initializeFormData(); - - void cleanupTestCase(); - -public: - - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntCompanyEditorView *mCompanyEditorView; - -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcarddatacontainer.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcarddatacontainer.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +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 - -class CntContactCardDataContainer; - -QTM_USE_NAMESPACE - -class TestCntContactCardDataContainer : public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClass(QContact* contact); - void data(); - void rowCount(); - void initializeData(); - void addSeparator(); - void initializeDetailsData(); - void initializeDetailsDataWithMaptile(); - void actionDetails(); - void supportsDetail(); - void cleanupTestCase(); - -private: - CntContactCardDataContainer *mDataContainer; - }; - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcarddetailitem.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcarddetailitem.h Fri Apr 16 14:53:18 2010 +0300 +++ /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 -#include - -class CntContactCardDetailItem; - -class TestCntContactCardDetailItem : public QObject -{ - Q_OBJECT - -private slots: - void initTestCase(); - - void create(); - void createPrimitives(); - void recreatePrimitives(); - void updatePrimitives(); - void initGesture(); - void onLongPress(); - void setDetails(); - void index(); - - void cleanupTestCase(); - -private: - CntContactCardDetailItem *mDetailItem; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcardheadingitem.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcardheadingitem.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +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 - -class CntContactCardHeadingItem; - -class TestCntContactCardHeadingItem : public QObject -{ - Q_OBJECT - -private slots: - void initTestCase(); - - void create(); - void createPrimitives(); - void recreatePrimitives(); - void updatePrimitives(); - - void setDetails(); - void setIcon(); - - void isNickName(); - void isCompanyName(); - - void cleanupTestCase(); - -private: - CntContactCardHeadingItem *mHeadingItem; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcardview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntcontactcardview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +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 - -class CntMainWindow; -class CntViewManager; -class CntContactCardView; - -class TestCntContactCardView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void activateView(); - void addActionsToToolBar(); - void addMenuItems(); - void setAsFavorite(); - void removeFromFavorite(); - void isFavoriteGroupCreated(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntContactCardView *mContactCardView; - -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdateeditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdateeditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +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 - -class CntMainWindow; -class CntViewManager; -class CntDateEditorView; - -class TestCntDateEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void initializeForm(); - void initializeFormData(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntDateEditorView *mDateEditorView; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdefaultviewfactory.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdefaultviewfactory.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +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: -* -*/ - -#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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdefaultviewmanager.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdefaultviewmanager.h Fri Apr 16 14:53:18 2010 +0300 +++ /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: -* -*/ - -#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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdetailpopup.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntdetailpopup.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +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 - -class CntDetailPopup; - -class TestCntDetailPopup: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void listItemSelected(); - void selectDetail(); - void cleanupTestCase(); - -private: - - CntDetailPopup *mPopup; -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnteditordatamodelitem.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnteditordatamodelitem.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +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 - -class QStandardItemModel; -class CntEditorDataModelItem; - -QTM_USE_NAMESPACE - -class TestCntEditorDataModelItem : public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - - void contactDetail(); - void key(); - void buttonLabel(); - void fieldModel(); - void maxLength(); - void inputFilter(); - - void cleanupTestCase(); - -private: - - CntEditorDataModelItem *mComboItem; - CntEditorDataModelItem *mLabelItem; - CntEditorDataModelItem *mButtonItem; - QStandardItemModel *mModel; - QContactNote *mNote; - QContactEmailAddress *mEmail; - - }; - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnteditordataviewitem.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnteditordataviewitem.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "cntbasedetaileditorview.h" -#include "cntviewparameters.h" - -class CntEditorDataViewItem; -class CntViewManager; -class CntMainWindow; - -class CntDetailEditorTestView : public CntBaseDetailEditorView -{ - Q_OBJECT - -public: - CntDetailEditorTestView(CntViewManager *viewManager, QGraphicsItem *parent = 0): - CntBaseDetailEditorView(viewManager, parent), - addDetailSelected(false){ } - - CntViewParameters::ViewId viewId() const { return CntViewParameters::noView; } - void initializeForm() { } - void addDetail() { addDetailSelected = true; } - -public: - bool addDetailSelected; -}; -class TestCntEditorDataViewItem : public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createItem(); - void addDetail(); - void createCustomWidget(); - void modelPosition(); - void textChanged(); - void indexChanged(); - void cleanupTestCase(); - -private: - CntEditorDataViewItem *mViewItem; - CntDetailEditorTestView *mTestView; - CntViewManager *mViewManager; - CntMainWindow *mWindow; - - }; - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnteditviewdetailitem.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnteditviewdetailitem.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +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 - -class CntEditViewDetailItem; - -class TestCntEditViewDetailItem : public QObject -{ - Q_OBJECT - -private slots: - void initTestCase(); - - void create(); - void createPrimitives(); - void recreatePrimitives(); - void updatePrimitives(); - - void setDetail(); - - void detail(); - void fieldType(); - - void onLongPress(); - - void cleanupTestCase(); - -private: - CntEditViewDetailItem *mDetailItem; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnteditviewheadingitem.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnteditviewheadingitem.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +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 - -class CntEditViewHeadingItem; - -class TestCntEditViewHeadingItem : public QObject -{ - Q_OBJECT - -private slots: - void initTestCase(); - - void create(); - void createPrimitives(); - void recreatePrimitives(); - void updatePrimitives(); - - void setDetails(); - void setIcon(); - - void cleanupTestCase(); - -private: - CntEditViewHeadingItem *mHeadingItem; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntemaileditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntemaileditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 CntEmailEditorView; - -class TestCntEmailEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void itemModel(); - void initializeForm(); - void initializeFormAdd(); - void initializeFormFocusSecond(); - void initializeFormData(); - void addDetail(); - - void cleanupTestCase(); - -public: - - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntEmailEditorView *mEmailEditorView; - -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfamilydetaileditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfamilydetaileditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +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 - - -class CntMainWindow; -class CntViewManager; -class CntFamilyDetailEditorView; - -class TestCntFamilyDetailEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void initializeForm(); - void initializeFormData(); - - void cleanupTestCase(); - -public: - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntFamilyDetailEditorView *mFamilyDetailEditorView; - -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesmemberview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesmemberview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +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 - -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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesselectionview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesselectionview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +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 - -class CntMainWindow; -class CntViewManager; -class CntFavoritesSelectionView; - -class TestCntFavoritesSelectionView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - - void cleanupTestCase(); - -private: - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntFavoritesSelectionView *mSelectionView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntfavoritesview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +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 - -class CntMainWindow; -class CntViewManager; -class CntFavoritesView; - -class TestCntFavoritesView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void init(); - void cleanup(); - - void openNamesList(); - void aboutToCloseView(); - void activateView(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntFavoritesView *mFavoritesView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupactionsview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupactionsview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +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 - -class CntMainWindow; -class CntViewManager; -class CntGroupActionsView; - -class TestCntGroupActionsView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - void aboutToCloseView(); - void addActionsToToolBar(); - void addMenuItems(); - void editGroup(); - void activateView(); - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntGroupActionsView *mGroupActionsView; - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupdeletepopup.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupdeletepopup.h Fri Apr 16 14:53:18 2010 +0300 +++ /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 -#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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupdeletepopupmodel.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupdeletepopupmodel.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +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 - -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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupeditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupeditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +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 - -class CntMainWindow; -class CntViewManager; -class CntGroupEditorView; - -class TestCntGroupEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void initializeForm(); - void initializeFormData(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntGroupEditorView *mGroupEditorView; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupmemberselectionview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupmemberselectionview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +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 - -class CntMainWindow; -class CntViewManager; -class CntGroupMemberSelectionView; - -class TestCntGroupMemberSelectionView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - - void addActionsToToolBar(); - void saveGroup(); - - void OnCancel(); - void openGroupNameEditor(); - void activateView(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntGroupMemberSelectionView *mGroupMemberSelectionView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupmemberview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupmemberview.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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" - -class CntMainWindow; -class CntViewManager; -class CntGroupMemberView; - -QTM_BEGIN_NAMESPACE -class QContact; -QTM_END_NAMESPACE - -QTM_USE_NAMESPACE - -class TestCntGroupMemberView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - - void handleExecutedCommand(); - - void addActionsToToolBar(); - void deleteGroup(); - void removeFromGroup(); - void groupActions(); - void addMenuItems(); - void editContact(); - void onLongPressed(); - void onListViewActivated(); - void editGroup(); - void activateView(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntGroupMemberView *mGroupMemberView; - QContact *mContact; - QContact *mGroupContact; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupselectionpopup.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntgroupselectionpopup.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +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 "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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntimageeditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntimageeditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +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 - -class CntViewManager; -class CntMainWindow; -class CntImageEditorView; - -class TestCntImageEditorView : public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void aboutToCloseView(); - void activateView(); - void openGallery(); - void handleImageChange(); - void cleanupTestCase(); - -private: - CntImageEditorView *mImageEditorView; - CntViewManager *mViewManager; - CntMainWindow *mWindow; - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntmainwindow.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntmainwindow.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +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 - -class CntViewManager; -class CntMainWindow; - -class TestCntMainWindow: public QObject -{ - Q_OBJECT - -private slots: - void initTestCase(); - void create(); - void keyPressEvent(); - void cleanupTestCase(); - -private: - CntMainWindow *mWindow; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntmodelprovider.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntmodelprovider.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/* -* Copyright (c) 2008 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 CntModelProvider; - -class TestCntModelProvider: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - - void instance(); - void twoInstances(); - void release(); - void contactModel(); - void contactManager(); - void contactSimManager(); - - void cleanupTestCase(); - -private: - - CntModelProvider *mModelProvider; -}; - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntmycardselectionview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntmycardselectionview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +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 - -class CntMainWindow; -class CntViewManager; -class CntMyCardSelectionView; - -class TestCntMyCardSelectionView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void onListViewActivated(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntMyCardSelectionView *mMyCardSelectionView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntmycardview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntmycardview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +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 - -class CntMainWindow; -class CntViewManager; -class CntMyCardView; - -class TestCntMyCardView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - void activateView(); - void openNameEditor(); - void openMyCardSelectionView(); - void aboutToCloseView(); - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntMyCardView *mMyCardView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnamelist.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnamelist.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +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: -* -*/ - -#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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnameseditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnameseditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +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 - -class CntMainWindow; -class CntViewManager; -class CntNamesEditorView; - -class TestCntNamesEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void initializeForm(); - void initializeFormData(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntNamesEditorView *mNamesEditorView; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnamesview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnamesview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +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 - -class CntMainWindow; -class CntViewManager; -class CntNamesView; - -class TestCntNamesView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void addActionsToToolBar(); - void addMenuItems(); - void openCollections(); - void handleExecutedCommand(); - void activateView(); - - void showFind(); - void closeFind(); - void deActivateView(); - - void setFilter(); - - void cleanupTestCase(); - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntNamesView *mNamesView; -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnavigator.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnavigator.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +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: -* -*/ - -#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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnoteeditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntnoteeditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +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 - - -class CntMainWindow; -class CntViewManager; -class CntNoteEditorView; - - -class TestCntNoteEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void initializeForm(); - void initializeFormAdd(); - void initializeFormFocusSecond(); - void initializeFormData(); - void addDetail(); - - void cleanupTestCase(); - -public: - - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntNoteEditorView *mNoteEditorView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntonlineaccounteditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntonlineaccounteditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +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 - - -class CntMainWindow; -class CntViewManager; -class CntOnlineAccountEditorView; - -class TestCntOnlineAccountEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void itemModel(); - void initializeForm(); - void initializeFormAdd(); - void initializeFormFocusSecond(); - void initializeFormData(); - void addDetail(); - - void cleanupTestCase(); - -public: - - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntOnlineAccountEditorView *mOnlineAccountEditorView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntphonenumbereditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntphonenumbereditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +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 - - -class CntMainWindow; -class CntViewManager; -class CntPhoneNumberEditorView; - - -class TestCntPhoneNumberEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void itemModel(); - void initializeForm(); - void initializeFormAdd(); - void initializeFormFocusSecond(); - void initializeFormData(); - void addDetail(); - - void cleanupTestCase(); - -public: - - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntPhoneNumberEditorView *mPhoneNumberEditorView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntsnapshotwidget.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntsnapshotwidget.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +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 - -class CntSnapshotWidget; - -class TestCntSnapshotWidget : public QObject -{ - Q_OBJECT - -private slots: - void initTestCase(); - - void create(); - void capture(); - - void cleanupTestCase(); - -private: - CntSnapshotWidget *mSnap; - -}; - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnturleditorview.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cnturleditorview.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +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 - - -class CntMainWindow; -class CntViewManager; -class CntUrlEditorView; -class QStandardItemModel; - -class TestCntUrlEditorView: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createClasses(); - - void aboutToCloseView(); - void itemModel(); - void initializeForm(); - void initializeFormAdd(); - void initializeFormFocusSecond(); - void initializeFormData(); - void addDetail(); - - void cleanupTestCase(); - -public: - - -private: - - CntMainWindow *mWindow; - CntViewManager *mViewManager; - CntUrlEditorView *mUrlEditorView; - - }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntviewmanager.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntviewmanager.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +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 - -class CntMainWindow; -class CntViewManager; - -class TestCntViewManager: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void createViewManager(); - void mainWindow(); - void setDefaultView(); - void setPreviousViewParameters(); - - void onActivateViewId(); - void onActivateViewParams(); - void onActivatePreviousView(); - - void addViewToWindow(); - void removeViewFromWindow(); - void getView(); - void cleanupTestCase(); - -private: - - CntMainWindow *mMainWindow; - CntViewManager *mViewManager; - -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntviewparameters.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_cntviewparameters.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +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 - -QTM_USE_NAMESPACE - -class TestCntViewParameters: public QObject -{ - Q_OBJECT - -private slots: - - void initTestCase(); - void create(); - - void setNextViewId(); - void setPreviousViewId(); - - void selectedContact(); - void selectedDetail(); - void selectedGroupContact(); - void selectedAction(); - - void cleanupTestCase(); - -public: - - -private: - - QContact mContact; - QContact mSecondContact; - - }; - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_companyeditor.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_companyeditor.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +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: -* -*/ -/* - * 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_dateeditor.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_dateeditor.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_emaileditor.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_emaileditor.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +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: -* -*/ -/* - * 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_familyeditor.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_familyeditor.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +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: -* -*/ -/* - * 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_nameeditor.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_nameeditor.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +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: -* -*/ -/* - * 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_namelist.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_namelist.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +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: -* -*/ - -#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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_noteeditor.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_noteeditor.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +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: -* -*/ -/* - * 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_numbereditor.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_numbereditor.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +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: -* -*/ -/* - * 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_urleditor.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/t_urleditor.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +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: -* -*/ -/* - * 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/testrunner.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/inc/testrunner.h Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 TESTRUNNER_H -#define TESTRUNNER_H - -#include - - -class TestRunner : public QXmlDefaultHandler -{ -public: // Constructors and destructor - TestRunner(const QString& name); - ~TestRunner(); - -public: // New functions - - int runTests(QObject& testObject); - void printResults(); - -protected: // From QXmlContentHandler - bool startElement( - const QString& namespaceURI, - const QString& localName, - const QString& qName, - const QXmlAttributes& atts); - - bool endElement( - const QString& namespaceURI, - const QString& localName, - const QString& qName); - - bool characters(const QString& ch); - -private: // New functions - - void parse(const QString& fileName); - -private: // Data - QStringList mTestRunParams; - QString mHomeDir; - int mTestCount; - QStringList mErrors; - bool mParsingIncidentElement; - bool mParsingDescriptionElement; - bool mCurrentTestFailed; - QString mCurrentTestName; - QString mCurrentTestFile; - int mCurrentTestFailureLine; -}; - - -#endif // TESTRUNNER_H diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/main.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,250 +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 "testrunner.h" - -#include "t_cntactions.h" -#include "t_cntaddresseditorview.h" -#include "t_cntbasedetaileditorview.h" -#include "t_cntbaselistview.h" -#include "t_cntbaseselectionview.h" -#include "t_cntbaseview.h" -#include "t_cntcollectionlistmodel.h" -#include "t_cntcollectionview.h" -#include "t_cntcommands.h" -#include "t_cntcompanyeditorview.h" -#include "t_cntcontactcarddatacontainer.h" -#include "t_cntcontactcarddetailitem.h" -#include "t_cntcontactcardheadingitem.h" -#include "t_cntcontactcardview.h" -#include "t_cntdateeditorview.h" -#include "t_cntdetailpopup.h" -#include "t_cnteditordatamodelitem.h" -#include "t_cnteditordataviewitem.h" -#include "t_cnteditviewdetailitem.h" -#include "t_cnteditviewheadingitem.h" -#include "t_cntemaileditorview.h" -#include "t_cntfamilydetaileditorview.h" -#include "t_cntfavoritesmemberview.h" -#include "t_cntfavoritesview.h" -#include "t_cntgroupactionsview.h" -#include "t_cntgroupeditorview.h" -#include "t_cntgroupmemberview.h" -#include "t_cntimageeditorview.h" -#include "t_cntmainwindow.h" -#include "t_cntmycardselectionview.h" -#include "t_cntmycardview.h" -#include "t_cntnameseditorview.h" -#include "t_cntnoteeditorview.h" -#include "t_cntonlineaccounteditorview.h" -#include "t_cntphonenumbereditorview.h" -#include "t_cntsnapshotwidget.h" -#include "t_cnturleditorview.h" -#include "t_cntmodelprovider.h" -#include "t_cntviewmanager.h" -#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 - -int main(int argc, char *argv[]) -{ - bool promptOnExit(true); - for (int i=0; i -#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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntactions.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntactions.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +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 - -#include "cntactions.h" -#include "t_cntactions.h" - -#include "hbstubs_helper.h" - -void TestCntActions::initTestCase() -{ - mActions = new CntActions(this); -} - -void TestCntActions::baseAction() -{ - HbAction *action = 0; - action = mActions->baseAction("cnt:nameslist"); - QVERIFY(action); - - HbAction *sameAction = 0; - sameAction = mActions->baseAction("cnt:nameslist"); - QVERIFY(sameAction == action); - - action = mActions->baseAction("cnt:dummy"); - QVERIFY(!action); -} - -void TestCntActions::addActionToToolBar() -{ - HbAction *action = mActions->baseAction("cnt:nameslist"); - HbToolBar *toolBar = new HbToolBar(); - HbStubHelper::reset(); - mActions->addActionToToolBar(action, toolBar); - QVERIFY(HbStubHelper::widgetActionsCount() == 1); - - delete toolBar; -} - -void TestCntActions::addActionsToToolBar() -{ - mActions->actionList() << mActions->baseAction("cnt:nameslist") << mActions->baseAction("cnt:collections"); - HbToolBar *toolBar = new HbToolBar(); - HbStubHelper::reset(); - mActions->addActionsToToolBar(toolBar); - QVERIFY(HbStubHelper::widgetActionsCount() == 2); - - mActions->clearActionList(); - - delete toolBar; -} - -void TestCntActions::addActionToMenu() -{ - HbAction *action = mActions->baseAction("cnt:nameslist"); - HbMenu *menu = new HbMenu(); - HbStubHelper::reset(); - mActions->addActionToMenu(action, menu); - QVERIFY(HbStubHelper::widgetActionsCount() == 1); - - delete menu; -} - -void TestCntActions::addActionsToMenu() -{ - mActions->actionList() << mActions->baseAction("cnt:nameslist") << mActions->baseAction("cnt:collections"); - HbMenu *menu = new HbMenu(); - HbStubHelper::reset(); - mActions->addActionsToMenu(menu); - QVERIFY(HbStubHelper::widgetActionsCount() == 2); - - mActions->clearActionList(); - - delete menu; -} - -void TestCntActions::actionList() -{ - mActions->actionList() << mActions->baseAction("cnt:nameslist") << mActions->baseAction("cnt:collections"); - QVERIFY(mActions->actionList().count() == 2); - - mActions->clearActionList(); - QVERIFY(mActions->actionList().count() == 0); -} - -void TestCntActions::cleanupTestCase() -{ - delete mActions; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntaddresseditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntaddresseditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,271 +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 "cntaddresseditorview.h" -#include "cntviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntaddresseditorview.h" - -void TestCntAddressEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mAddressEditorView = 0; -} - -void TestCntAddressEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); - mAddressEditorView = new CntAddressEditorView(mViewManager, 0); - mWindow->addView(mAddressEditorView); - mWindow->setCurrentView(mAddressEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mAddressEditorView != 0); -} - -void TestCntAddressEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactAddress *address = new QContactAddress(); - mAddressEditorView->mDetailList.append(address); - mAddressEditorView->mContact = contact; - - // empty address isn't saved - mAddressEditorView->aboutToCloseView(); - QVERIFY(mAddressEditorView->mContact->details().count() == 0); - - // P.O.Box - address->setPostOfficeBox("123"); - mAddressEditorView->aboutToCloseView(); - QVERIFY(mAddressEditorView->mContact->details().count() == 1); - address->setPostOfficeBox(""); - // Street - address->setStreet("Street"); - mAddressEditorView->aboutToCloseView(); - QVERIFY(mAddressEditorView->mContact->details().count() == 1); - address->setStreet(""); - // Postcode - address->setPostcode("123"); - mAddressEditorView->aboutToCloseView(); - QVERIFY(mAddressEditorView->mContact->details().count() == 1); - address->setPostcode(""); - // Locality - address->setLocality("Locality"); - mAddressEditorView->aboutToCloseView(); - QVERIFY(mAddressEditorView->mContact->details().count() == 1); - address->setLocality(""); - // Region - address->setRegion("Region"); - mAddressEditorView->aboutToCloseView(); - QVERIFY(mAddressEditorView->mContact->details().count() == 1); - address->setRegion(""); - // Country - address->setCountry("Country"); - mAddressEditorView->aboutToCloseView(); - QVERIFY(mAddressEditorView->mContact->details().count() == 1); - - mWindow->removeView(mAddressEditorView); - delete mAddressEditorView; - mAddressEditorView = 0; -} - -void TestCntAddressEditorView::initializeForm() -{ - mAddressEditorView = new CntAddressEditorView(mViewManager, 0); - QContact *contact = new QContact(); - - mAddressEditorView->mContact = contact; - mAddressEditorView->mParamString = ""; - mAddressEditorView->initializeForm(); - - //Check count and that the first address is expanded - QVERIFY(mAddressEditorView->formModel()->rowCount(QModelIndex()) == 3); - QVERIFY(mAddressEditorView->dataForm()->isExpanded(mAddressEditorView->formModel()->index(0, 0, QModelIndex()))); - delete mAddressEditorView; - mAddressEditorView = 0; - - mAddressEditorView = new CntAddressEditorView(mViewManager, 0); - contact = new QContact(); - mAddressEditorView->mContact = contact; - QString home = QContactDetail::ContextHome; - mAddressEditorView->mParamString = home; - mAddressEditorView->initializeForm(); - - //Check count and that the second address is expanded - QVERIFY(mAddressEditorView->formModel()->rowCount(QModelIndex()) == 3); - QVERIFY(mAddressEditorView->dataForm()->isExpanded(mAddressEditorView->formModel()->index(1, 0, QModelIndex()))); - delete mAddressEditorView; - mAddressEditorView = 0; - - mAddressEditorView = new CntAddressEditorView(mViewManager, 0); - contact = new QContact(); - mAddressEditorView->mContact = contact; - QString work = QContactDetail::ContextWork; - mAddressEditorView->mParamString = work; - mAddressEditorView->initializeForm(); - - //Check count and that the third address is expanded - QVERIFY(mAddressEditorView->formModel()->rowCount(QModelIndex()) == 3); - QVERIFY(mAddressEditorView->dataForm()->isExpanded(mAddressEditorView->formModel()->index(2, 0, QModelIndex()))); - delete mAddressEditorView; - mAddressEditorView = 0; - - mAddressEditorView = new CntAddressEditorView(mViewManager, 0); - contact = new QContact(); - mAddressEditorView->mContact = contact; - mAddressEditorView->mParamString = "dummy"; - mAddressEditorView->initializeForm(); - - //Check count and none of the addresses is expanded - QVERIFY(mAddressEditorView->formModel()->rowCount(QModelIndex()) == 3); - QVERIFY(!mAddressEditorView->dataForm()->isExpanded(mAddressEditorView->formModel()->index(0, 0, QModelIndex()))); - QVERIFY(!mAddressEditorView->dataForm()->isExpanded(mAddressEditorView->formModel()->index(1, 0, QModelIndex()))); - QVERIFY(!mAddressEditorView->dataForm()->isExpanded(mAddressEditorView->formModel()->index(2, 0, QModelIndex()))); - delete mAddressEditorView; - mAddressEditorView = 0; -} - -void TestCntAddressEditorView::initializeFormOneData() - -{ - mAddressEditorView = new CntAddressEditorView(mViewManager, 0); - - QContactAddress *address = new QContactAddress(); - address->setStreet("Street"); - address->setPostcode("2090"); - address->setLocality("Locality"); - address->setRegion("Region"); - address->setCountry("Country"); - - QContact *contact= new QContact(); - contact->saveDetail(address); - - mAddressEditorView->mContact = contact; - - mAddressEditorView->initializeForm(); - QVERIFY(mAddressEditorView->formModel()->rowCount(QModelIndex()) == 3); - delete mAddressEditorView; - mAddressEditorView = 0; - - mAddressEditorView = new CntAddressEditorView(mViewManager, 0); - - address = new QContactAddress(); - address->setStreet("Street"); - address->setPostcode("2090"); - address->setLocality("Locality"); - address->setRegion("Region"); - address->setCountry("Country"); - address->setContexts(QContactDetail::ContextHome); - - contact= new QContact(); - contact->saveDetail(address); - - mAddressEditorView->mContact = contact; - - mAddressEditorView->initializeForm(); - QVERIFY(mAddressEditorView->formModel()->rowCount(QModelIndex()) == 3); - delete mAddressEditorView; - mAddressEditorView = 0; - -} - -void TestCntAddressEditorView::initializeFormAllData() - -{ - mAddressEditorView = new CntAddressEditorView(mViewManager, 0); - - QContactAddress *address = new QContactAddress(); - address->setStreet("Street"); - address->setPostcode("2090"); - address->setLocality("Locality"); - address->setRegion("Region"); - address->setCountry("Country"); - - QContactAddress *otherAddress = new QContactAddress(); - otherAddress->setStreet("Street"); - otherAddress->setPostcode("2090"); - otherAddress->setLocality("Locality"); - otherAddress->setRegion("Region"); - otherAddress->setCountry("Country"); - - QContactAddress *addressHome = new QContactAddress(); - addressHome->setStreet("Street"); - addressHome->setPostcode("2090"); - addressHome->setLocality("Locality"); - addressHome->setRegion("Region"); - addressHome->setCountry("Country"); - addressHome->setContexts(QContactDetail::ContextHome); - - QContactAddress *otherAddressHome = new QContactAddress(); - otherAddressHome->setStreet("Street"); - otherAddressHome->setPostcode("2090"); - otherAddressHome->setLocality("Locality"); - otherAddressHome->setRegion("Region"); - otherAddressHome->setCountry("Country"); - otherAddressHome->setContexts(QContactDetail::ContextHome); - - QContactAddress *addressWork = new QContactAddress(); - addressWork->setStreet("Street"); - addressWork->setPostcode("2090"); - addressWork->setLocality("Locality"); - addressWork->setRegion("Region"); - addressWork->setCountry("Country"); - addressWork->setContexts(QContactDetail::ContextWork); - - QContactAddress *otherAddressWork = new QContactAddress(); - otherAddressWork->setStreet("Street"); - otherAddressWork->setPostcode("2090"); - otherAddressWork->setLocality("Locality"); - otherAddressWork->setRegion("Region"); - otherAddressWork->setCountry("Country"); - otherAddressWork->setContexts(QContactDetail::ContextWork); - - QContact *contact= new QContact(); - - contact->saveDetail(address); - contact->saveDetail(otherAddress); - contact->saveDetail(addressHome); - contact->saveDetail(otherAddressHome); - contact->saveDetail(addressWork); - contact->saveDetail(otherAddressWork); - - mAddressEditorView->mContact = contact; - - mAddressEditorView->initializeForm(); - // duplicate address types (like 2x home or 2x work) are ignored and only first one of them is really used - QVERIFY(mAddressEditorView->formModel()->rowCount(QModelIndex()) == 3); - -} - -void TestCntAddressEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mAddressEditorView; - mAddressEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbasedetaileditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbasedetaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +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 "t_cntbasedetaileditorview.h" - -#include -#include -#include "hbstubs_helper.h" - -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include -#include - -void TestCntBaseDetailEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mBaseDetailEditorView = 0; -} - -void TestCntBaseDetailEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mBaseDetailEditorView = new CntBaseDetailEditorTestView(mViewManager, 0); - mWindow->addView(mBaseDetailEditorView); - mWindow->setCurrentView(mBaseDetailEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mBaseDetailEditorView != 0); -} - -void TestCntBaseDetailEditorView::addMenuItems() -{ - HbStubHelper::reset(); - mBaseDetailEditorView->addMenuItems(); - - QVERIFY(HbStubHelper::widgetActionsCount() == 1); -} - -void TestCntBaseDetailEditorView::formModel() -{ - HbDataFormModel *model = mBaseDetailEditorView->formModel(); - QVERIFY(model == mBaseDetailEditorView->formModel()); -} - -void TestCntBaseDetailEditorView::dataForm() -{ - HbDataForm *dataForm = mBaseDetailEditorView->dataForm(); - QVERIFY(dataForm == mBaseDetailEditorView->dataForm()); - QVERIFY(mBaseDetailEditorView->dataForm()->model() != 0); -} - -void TestCntBaseDetailEditorView::setHeader() -{ - mBaseDetailEditorView->setHeader("dummy"); - QVERIFY(mBaseDetailEditorView->header()->titleText() == "dummy"); -} - -void TestCntBaseDetailEditorView::header() -{ - HbGroupBox *heading = mBaseDetailEditorView->header(); - QVERIFY(heading == mBaseDetailEditorView->header()); -} - - -void TestCntBaseDetailEditorView::activateView() -{ - CntViewParameters params(CntViewParameters::namesView); // this doesnt' matter.. - QContact contact; - params.setSelectedContact(contact); - params.setSelectedAction("dummy"); - - mBaseDetailEditorView->activateView(params); - QVERIFY(mBaseDetailEditorView->mContact != 0); - QVERIFY(mBaseDetailEditorView->mParamString == "dummy"); - - params.setSelectedAction("add"); - - mBaseDetailEditorView->activateView(params); - QVERIFY(mBaseDetailEditorView->mResult); -} - -void TestCntBaseDetailEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaselistview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaselistview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,296 +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 "t_cntbaselistview.h" - -#include -#include -#include - -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" - -#include "hbstubs_helper.h" - -void TestCntBaseListView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mBaseListView = 0; -} - -void TestCntBaseListView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mBaseListView = new CntBaseListTestView(mViewManager, 0); - mWindow->addView(mBaseListView); - mWindow->setCurrentView(mBaseListView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mBaseListView != 0); -} - -void TestCntBaseListView::setupView() -{ - mBaseListView->setupView(); - - QVERIFY(mBaseListView->widget() != 0); - QVERIFY(mBaseListView->listLayout() != 0); -} - -void TestCntBaseListView::activateView() -{ - CntViewParameters params(CntViewParameters::noView); - mBaseListView->activateView(params); - QVERIFY(mBaseListView->listView()->model() != 0); -} - -void TestCntBaseListView::onLongPress() -{ - // clear all contacts/groups from database - QList ids = mBaseListView->contactManager()->contacts(); - mBaseListView->contactManager()->removeContacts(&ids); - - QModelIndex emptyMyCardIndex = mBaseListView->contactModel()->index(0); - - HbStubHelper::reset(); - mBaseListView->onLongPressed(mBaseListView->listView()->itemByIndex(emptyMyCardIndex), QPointF()); - QVERIFY(HbStubHelper::widgetActionsCount() == 0); - - QContact noActionsContact; - QContactName name; - name.setFirst("firstname"); - noActionsContact.saveDetail(&name); - mBaseListView->contactManager()->saveContact(&noActionsContact); - - QContact allActionsContact; - QContactName otherName; - otherName.setFirst("first"); - QContactPhoneNumber number; - number.setSubTypes(QContactPhoneNumber::SubTypeMobile); - number.setContexts(QContactDetail::ContextHome); - number.setNumber("123456"); - QContactEmailAddress email; - email.setContexts(QContactDetail::ContextWork); - email.setEmailAddress("email@mail.com"); - allActionsContact.saveDetail(&otherName); - allActionsContact.saveDetail(&number); - allActionsContact.saveDetail(&email); - mBaseListView->contactManager()->saveContact(&allActionsContact); - - QContact allActionsPreferredNoContextsContact; - QContactName thirdName; - thirdName.setFirst("first"); - QContactPhoneNumber otherNumber; - otherNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile); - otherNumber.setNumber("123456"); - QContactEmailAddress otherEmail; - otherEmail.setEmailAddress("email@mail.com"); - allActionsPreferredNoContextsContact.saveDetail(&thirdName); - allActionsPreferredNoContextsContact.saveDetail(&otherNumber); - allActionsPreferredNoContextsContact.saveDetail(&otherEmail); - allActionsPreferredNoContextsContact.setPreferredDetail("call", otherNumber); - allActionsPreferredNoContextsContact.setPreferredDetail("email", otherEmail); - mBaseListView->contactManager()->saveContact(&allActionsPreferredNoContextsContact); - - QModelIndex noActionsContactIndex = mBaseListView->contactModel()->indexOfContact(noActionsContact); - - HbStubHelper::reset(); - mBaseListView->onLongPressed(mBaseListView->listView()->itemByIndex(noActionsContactIndex), QPointF()); - QVERIFY(HbStubHelper::widgetActionsCount() == 3); - - QModelIndex allActionsContactIndex = mBaseListView->contactModel()->indexOfContact(allActionsContact); - - HbStubHelper::reset(); - mBaseListView->onLongPressed(mBaseListView->listView()->itemByIndex(allActionsContactIndex), QPointF()); - QVERIFY(HbStubHelper::widgetActionsCount() == 6); - - QModelIndex allActionsPreferredNoContextsContactIndex = mBaseListView->contactModel()->indexOfContact(allActionsPreferredNoContextsContact); - - HbStubHelper::reset(); - mBaseListView->onLongPressed(mBaseListView->listView()->itemByIndex(allActionsPreferredNoContextsContactIndex), QPointF()); - QVERIFY(HbStubHelper::widgetActionsCount() == 6); - - mBaseListView->contactManager()->setSelfContactId(allActionsContact.localId()); - - QModelIndex allActionsContactMyCardIndex = mBaseListView->contactModel()->indexOfContact(allActionsContact); - - HbStubHelper::reset(); - mBaseListView->onLongPressed(mBaseListView->listView()->itemByIndex(allActionsContactMyCardIndex), QPointF()); - QVERIFY(HbStubHelper::widgetActionsCount() == 3); -} - -void TestCntBaseListView::onListViewActivated() -{ - // clear all contacts/groups from database - QList ids = mBaseListView->contactManager()->contacts(); - mBaseListView->contactManager()->removeContacts(&ids); - - QModelIndex emptyMyCardIndex = mBaseListView->contactModel()->index(0); - - mBaseListView->onListViewActivated(emptyMyCardIndex); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::myCardView); - - delete mBaseListView; - mBaseListView = 0; - - mBaseListView = new CntBaseListTestView(mViewManager, 0); - mWindow->addView(mBaseListView); - mWindow->setCurrentView(mBaseListView); - - QContact noActionsContact; - QContactName name; - name.setFirst("firstname"); - noActionsContact.saveDetail(&name); - mBaseListView->contactManager()->saveContact(&noActionsContact); - - QModelIndex noActionsContactIndex = mBaseListView->contactModel()->indexOfContact(noActionsContact); - - mBaseListView->onListViewActivated(noActionsContactIndex); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::commLauncherView); - - delete mBaseListView; - mBaseListView = 0; - - mBaseListView = new CntBaseListTestView(mViewManager, 0); - mWindow->addView(mBaseListView); - mWindow->setCurrentView(mBaseListView); - - mBaseListView->contactManager()->setSelfContactId(noActionsContact.localId()); - - QModelIndex myCardContactIndex = mBaseListView->contactModel()->indexOfContact(noActionsContact); - - mBaseListView->onListViewActivated(myCardContactIndex); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::commLauncherView); -} - -void TestCntBaseListView::addItemsToLayout() -{ - mWindow->removeView(mBaseListView); - delete mBaseListView; - mBaseListView = 0; - - mBaseListView = new CntBaseListTestView(mViewManager, 0); - mWindow->addView(mBaseListView); - mWindow->setCurrentView(mBaseListView); - - mBaseListView->addItemsToLayout(); - QVERIFY(mBaseListView->widget() != 0); - QVERIFY(mBaseListView->listLayout() != 0); - QVERIFY(mBaseListView->listLayout()->count() == 1); -} - -void TestCntBaseListView::setBannerName() -{ - mBaseListView->setBannerVisibility(false); - mBaseListView->setBannerName("test"); - QVERIFY(mBaseListView->listLayout()->count() == 1); - - mBaseListView->setBannerVisibility(true); - mBaseListView->setBannerName("test"); - QVERIFY(mBaseListView->banner()->titleText() == "test"); - QVERIFY(mBaseListView->listLayout()->count() == 2); -} - -void TestCntBaseListView::bannerName() -{ - QVERIFY(mBaseListView->bannerName() == "test"); -} - -void TestCntBaseListView::banner() -{ - mWindow->removeView(mBaseListView); - delete mBaseListView; - mBaseListView = 0; - - mBaseListView = new CntBaseListTestView(mViewManager, 0); - mWindow->addView(mBaseListView); - mWindow->setCurrentView(mBaseListView); - - mBaseListView->mHasBanner = false; - mBaseListView->banner(); - QVERIFY(mBaseListView->banner() == 0); - - mBaseListView->mHasBanner = true; - mBaseListView->banner(); - QVERIFY(mBaseListView->banner() != 0); -} - -void TestCntBaseListView::isBannerVisible() -{ - mBaseListView->setBannerVisibility(true); - QVERIFY(mBaseListView->isBannerVisible()); - - mBaseListView->setBannerVisibility(false); - QVERIFY(!mBaseListView->isBannerVisible()); -} - - -void TestCntBaseListView::listLayout() -{ - mBaseListView->listLayout(); - QVERIFY(mBaseListView->listLayout() != 0); -} - -void TestCntBaseListView::listView() -{ - mBaseListView->listView(); - QVERIFY(mBaseListView->listView() != 0); -} - -void TestCntBaseListView::setDataModel() -{ - mWindow->removeView(mBaseListView); - delete mBaseListView; - mBaseListView = 0; - - mBaseListView = new CntBaseListTestView(mViewManager, 0); - mWindow->addView(mBaseListView); - mWindow->setCurrentView(mBaseListView); - - mBaseListView->setDataModel(); - - QVERIFY(mBaseListView->listView()->model() != 0); -} - -void TestCntBaseListView::clearDataModelFilter() -{ - delete mBaseListView; - mBaseListView = 0; - - mBaseListView = new CntBaseListTestView(mViewManager, 0); - mWindow->addView(mBaseListView); - mWindow->setCurrentView(mBaseListView); - - mBaseListView->clearDataModelFilter(); - - QVERIFY(mBaseListView->listView()->model() != 0); -} - -void TestCntBaseListView::cleanupTestCase() -{ -delete mBaseListView; -mBaseListView = 0; - delete mViewManager; - mViewManager = 0; - mWindow->deleteLater(); -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseselectionview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +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 - -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" - -#include "t_cntbaseselectionview.h" - -void TestCntBaseSelectionView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mSelectionView = 0; -} - -void TestCntBaseSelectionView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mSelectionView = new CntBaseSelectionTestView(mViewManager, 0); - mWindow->addView(mSelectionView); - mWindow->setCurrentView(mSelectionView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mSelectionView != 0); -} - -void TestCntBaseSelectionView::setupView() -{ - mSelectionView->setupView(); - - QVERIFY(mSelectionView->listLayout() != 0); - QVERIFY(mSelectionView->listView()->selectionMode() == HbAbstractItemView::MultiSelection); -} - -void TestCntBaseSelectionView::addItemsToLayout() -{ - mWindow->removeView(mSelectionView); - delete mSelectionView; - mSelectionView = 0; - - mSelectionView = new CntBaseSelectionTestView(mViewManager, 0); - mWindow->addView(mSelectionView); - mWindow->setCurrentView(mSelectionView); - - mSelectionView->addItemsToLayout(); - QVERIFY(mSelectionView->widget() != 0); - QVERIFY(mSelectionView->listLayout() != 0); - QVERIFY(mSelectionView->listLayout()->count() == 1); -} - -void TestCntBaseSelectionView::listLayout() -{ - mSelectionView->listLayout(); - QVERIFY(mSelectionView->listLayout() != 0); -} - -void TestCntBaseSelectionView::listView() -{ - mSelectionView->listView(); - QVERIFY(mSelectionView->listView() != 0); -} - -void TestCntBaseSelectionView::activateView() -{ - CntViewParameters params(CntViewParameters::noView); - mSelectionView->activateView(params); - QVERIFY(mSelectionView->listView()->model() != 0); -} - -void TestCntBaseSelectionView::selectionModel() -{ - mWindow->removeView(mSelectionView); - delete mSelectionView; - mSelectionView = 0; - - mSelectionView = new CntBaseSelectionTestView(mViewManager, 0); - mWindow->addView(mSelectionView); - mWindow->setCurrentView(mSelectionView); - - CntViewParameters params(CntViewParameters::noView); - mSelectionView->activateView(params); - - mSelectionView->selectionModel(); - QVERIFY(mSelectionView->listView() != 0); - QVERIFY(mSelectionView->selectionModel() != 0); -} - -void TestCntBaseSelectionView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntbaseview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +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 "t_cntbaseview.h" - -#include -#include - -#include -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" - -#include "hbstubs_helper.h" -#include "qthighway_stub_helper.h" - -void TestCntBaseView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mBaseView = 0; - -} - -void TestCntBaseView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mBaseView = new CntBaseTestView(mViewManager); - mWindow->addView(mBaseView); - mWindow->setCurrentView(mBaseView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mBaseView != 0); -} - -void TestCntBaseView::setupView() -{ - mBaseView->setupView(); - QVERIFY(mBaseView->toolBar() != 0); - QVERIFY(mBaseView->mSoftKeyBackAction != 0); -} - -void TestCntBaseView::viewManager() -{ - CntViewManager *viewManager = mBaseView->viewManager(); - QVERIFY(viewManager == mViewManager); -} - -void TestCntBaseView::contactModel() -{ - MobCntModel *model = mBaseView->contactModel(); - QVERIFY(model == mBaseView->contactModel()); -} - -void TestCntBaseView::contactManager() -{ - QContactManager *manager = mBaseView->contactManager(); - QVERIFY(manager == mBaseView->contactManager()); -} - -void TestCntBaseView::commands() -{ - CntCommands *commands = mBaseView->commands(); - QVERIFY(commands == mBaseView->commands()); -} - -void TestCntBaseView::addSoftkeyAction() -{ - mBaseView->addSoftkeyAction(); - QVERIFY(mBaseView->mSoftKeyBackAction == mBaseView->navigationAction()); -} - -void TestCntBaseView::clearToolBar() -{ - HbStubHelper::reset(); - mBaseView->toolBar()->addAction("testi"); - mBaseView->clearToolBar(); - QVERIFY(HbStubHelper::widgetActionsCount() == 0); -} - -void TestCntBaseView::addToolBar() -{ - mBaseView->addToolBar(); - QVERIFY(mBaseView->toolBar() != 0); -} - -void TestCntBaseView::setToolBarOrientation() -{ - mBaseView->setToolBarOrientation(); - QVERIFY(mBaseView->toolBar()->orientation() == Qt::Horizontal); -} - -void TestCntBaseView::actions() -{ - CntActions *actions = mBaseView->actions(); - QVERIFY(actions == mBaseView->actions()); -} - -void TestCntBaseView::loadDocument() -{ - QVERIFY(mBaseView->loadDocument(":/xml/contacts_ev.docml")); -} - -void TestCntBaseView::findWidget() -{ - QVERIFY(mBaseView->findWidget(QString("cnt_listview_labels")) != 0); -} - -void TestCntBaseView::findObject() -{ - QVERIFY(mBaseView->loadDocument(":/xml/contacts_actions.docml")); - QVERIFY(mBaseView->findObject(QString("cnt:nameslist")) != 0); -} - -void TestCntBaseView::keyPressEvent() -{ - QKeyEvent event(QEvent::KeyPress, Qt::Key_5, Qt::NoModifier); - mBaseView->keyPressEvent(&event); - QKeyEvent event2(QEvent::KeyRelease, Qt::Key_5, Qt::NoModifier); - - QtHighwayStubHelper::reset(); - QKeyEvent event3(QEvent::KeyPress, Qt::Key_Yes, Qt::NoModifier); - mBaseView->keyPressEvent(&event3); - QVERIFY(QtHighwayStubHelper::service() == "com.nokia.services.logsservices.starter"); - QVERIFY(QtHighwayStubHelper::message() == "start(int,bool)"); - QKeyEvent event4(QEvent::KeyRelease, Qt::Key_Yes, Qt::NoModifier); -} - -void TestCntBaseView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionlistmodel.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionlistmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,266 +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 "cntcollectionlistmodel.h" -#include "t_cntcollectionlistmodel.h" - -void TestCntCollectionListModel::init() -{ - // clear all contacts/groups from database - mManager = new QContactManager("symbian"); - QList ids = mManager->contactIds(); - mManager->removeContacts(&ids); - -// mModel = new CntCollectionListModel(mManager); -// QVERIFY(mModel->rowCount() == 1); - -} -// -//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); -// -// 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 - var = mModel->data(index, Qt::DisplayRole); - QVERIFY(var.isNull()); - - 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(0); // first user group - var = mModel->data(index, Qt::DisplayRole); - QVERIFY(var.canConvert()); - - var = mModel->data(index, Qt::DecorationRole); - QVERIFY(var.canConvert()); - - var = mModel->data(index, Qt::UserRole); - QVERIFY(var.canConvert()); - - var = mModel->data(index, Qt::UserRole+1); - QVERIFY(var.isNull()); -} - -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); // 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() == 3); - - QContactDetailFilter groupFilter; - groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup))); - - QList groupContactIds = mManager->contacts(groupFilter); - mModel->removeGroup(groupContactIds.at(1)); // first one has already been removed, take the second one - QVERIFY(mModel->rowCount() == 2); -} - -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->contactIds(); - mManager->removeContacts(&ids); - delete mManager; -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcollectionview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +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 -#include -#include - -#include "cntcollectionview.h" -#include "cntcollectionlistmodel.h" -#include "cntmainwindow.h" - -#include "hbstubs_helper.h" - -#include "t_cntcollectionview.h" - -void TestCntCollectionView::init() -{ - 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::testActivate() -{ - // 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::testShowPreviousView() -{ - mCollectionView->showPreviousView(); -} - -void TestCntCollectionView::testOpenEmptyFavoritesGroup() -{ - QModelIndex favIndex = mCollectionView->mListView->model()->index(0, 0); - - mCollectionView->openGroup(favIndex); -} - -void TestCntCollectionView::testOpenUserGroup() -{ - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - - mViewManager->contactManager("symbiam")->saveContact(&firstGroup); - mCollectionView->refreshDataModel(); - - QModelIndex userGroupIndex = mCollectionView->mListView->model()->index(1, 0); - - mCollectionView->openGroup(userGroupIndex); -} - -void TestCntCollectionView::testShowContextMenu() -{ - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - - mViewManager->contactManager("symbiam")->saveContact(&firstGroup); - mCollectionView->refreshDataModel(); - - QModelIndex favIndex = mCollectionView->mListView->model()->index(0, 0); - - HbStubHelper::reset(); - mCollectionView->showContextMenu(mCollectionView->mListView->itemByIndex(favIndex), QPointF()); - QVERIFY(HbStubHelper::widgetActionsCount() == 1); - - QModelIndex userGroupIndex = mCollectionView->mListView->model()->index(1, 0); - - HbStubHelper::reset(); - mCollectionView->showContextMenu(mCollectionView->mListView->itemByIndex(userGroupIndex), QPointF()); - QVERIFY(HbStubHelper::widgetActionsCount() == 2); -} - -void TestCntCollectionView::testRefreshDataModel() -{ - mCollectionView->refreshDataModel(); - QVERIFY(mCollectionView->mListView->model() == mCollectionView->mModel); -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommands.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommands.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +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 "cntcommands.h" -#include "t_cntcommands.h" -#include "cntdefaultviewmanager.h" -#include "cntbaseview.h" -#include "cntmainwindow.h" - -#include "qthighway_stub_helper.h" - -void TestCntCommands::initTestCase() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::namesView); - mManager = new QContactManager("symbian"); - mSimManager = new QContactManager("symbiansim"); - mCommands = new CntCommands(*mViewManager, mManager, mSimManager); -} - -void TestCntCommands::newContact() -{ - mCommands->newContact(); - - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::editView); -} - -void TestCntCommands::editContact() -{ - cleanupTestCase(); - initTestCase(); - - mCommands->editContact(mContact); - - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::editView); -} - -void TestCntCommands::openContact() -{ - cleanupTestCase(); - initTestCase(); - - mCommands->openContact(mContact); - - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::commLauncherView); -} - -void TestCntCommands::viewHistory() -{ - cleanupTestCase(); - initTestCase(); - - QContactName name; - name.setFirst("first"); - mContact.saveDetail(&name); - mManager->saveContact(&mContact); - mCommands->viewHistory(mContact); - - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::historyView); -} - -void TestCntCommands::launchDialer() -{ - cleanupTestCase(); - initTestCase(); - - QtHighwayStubHelper::reset(); - mCommands->launchDialer(); - QVERIFY(QtHighwayStubHelper::service() == "com.nokia.services.logsservices.starter"); - QVERIFY(QtHighwayStubHelper::message() == "start(int,bool)"); -} - -void TestCntCommands::progress() -{ - QList callActionDescriptors = QContactAction::actionDescriptors("call", "symbian"); - mCommands->mContactAction = QContactAction::action(callActionDescriptors.at(0)); - - mCommands->progress(QContactAction::Active, QVariantMap()); - QVERIFY(mCommands->mContactAction); - mCommands->progress(QContactAction::Finished, QVariantMap()); - QVERIFY(!mCommands->mContactAction); - - mCommands->mContactAction = QContactAction::action(callActionDescriptors.at(0)); - mCommands->progress(QContactAction::FinishedWithError, QVariantMap()); - QVERIFY(!mCommands->mContactAction); -} - -void TestCntCommands::cleanupTestCase() -{ - delete mViewManager; - mViewManager = 0; - // ORBIT BUG - so deleting main window removed - mWindow->deleteLater(); - mCommands = 0; - delete mManager; - mManager = 0; - delete mSimManager; - mSimManager = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommhistoryview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcommhistoryview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +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 "cnthistoryview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "mobhistorymodel.h" - -#include "t_cntcommhistoryview.h" - - -void TestCntCommHistoryView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mHistoryView = 0; -} - -void TestCntCommHistoryView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mHistoryView = new CntHistoryView(mViewManager,0); - - QVERIFY(mHistoryView->findWidget("content") != 0); - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mHistoryView != 0); -} - -void TestCntCommHistoryView::aboutToCloseView() -{ - mWindow = new CntMainWindow(0, CntViewParameters::commLauncherView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::commLauncherView); - mHistoryView = new CntHistoryView(mViewManager,0); - - mWindow->addView(mHistoryView); - mWindow->setCurrentView(mHistoryView); - - QContact *c = new QContact; - mHistoryView->mContact = c; - mHistoryView->aboutToCloseView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::commLauncherView); - //delete c; - - mWindow->deleteLater(); - mViewManager = 0; - delete mHistoryView; - mHistoryView = 0; -} - -void TestCntCommHistoryView::activateView() -{ - //create comm history view - createClasses(); - - //create my card - QContact c; - QContactName name; - name.setFirst("first"); - c.saveDetail(&name); - mHistoryView->contactManager()->saveContact(&c); - QVERIFY(c.localId() > 0); - mHistoryView->contactManager()->setSelfContactId(c.localId()); - - //activate view - CntViewParameters viewParameters(CntViewParameters::noView); - viewParameters.setSelectedContact(c); - mHistoryView->activateView(viewParameters); - - QVERIFY(mHistoryView->mHistoryListView != 0); - QVERIFY(mHistoryView->mHistoryModel != 0); - QVERIFY(mHistoryView->mContact != 0); - - //heading + list - QVERIFY(mHistoryView->findWidget("content")->layout()->count() == 2); - - //check number of events in the list (3 events) - QVERIFY(mHistoryView->mHistoryModel->rowCount() == 3); - - mHistoryView->updateScrollingPosition(); - - //delete my card - mHistoryView->contactManager()->removeContact(c.localId()); -} - -void TestCntCommHistoryView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mHistoryView; - mHistoryView = 0; -} - - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcompanyeditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcompanyeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +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 "cntcompanyeditorview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntcompanyeditorview.h" - -void TestCntCompanyEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mCompanyEditorView = 0; -} - -void TestCntCompanyEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mCompanyEditorView = new CntCompanyEditorView(mViewManager, 0); - mWindow->addView(mCompanyEditorView); - mWindow->setCurrentView(mCompanyEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mCompanyEditorView != 0); -} - -void TestCntCompanyEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactOrganization *company = new QContactOrganization(); - mCompanyEditorView->mDetailList.append(company); - mCompanyEditorView->mContact = contact; - - // empty detail isn't saved - mCompanyEditorView->aboutToCloseView(); - QVERIFY(mCompanyEditorView->mContact->details().count() == 0); - - // Company name - company->setName("Company name"); - mCompanyEditorView->aboutToCloseView(); - QVERIFY(mCompanyEditorView->mContact->details().count() == 1); - company->setName(""); - - // Title - company->setTitle("Company Title"); - mCompanyEditorView->aboutToCloseView(); - QVERIFY(mCompanyEditorView->mContact->details().count() == 1); - company->setTitle(""); - - // Department - QStringList list; - list << "Department"; - company->setDepartment(list); - mCompanyEditorView->aboutToCloseView(); - QVERIFY(mCompanyEditorView->mContact->details().count() == 1); - company->setDepartment(QStringList()); - - // Assistant name - company->setAssistantName("Assistant"); - mCompanyEditorView->aboutToCloseView(); - QVERIFY(mCompanyEditorView->mContact->details().count() == 1); - - mWindow->removeView(mCompanyEditorView); - delete mCompanyEditorView; - mCompanyEditorView = 0; -} - - -void TestCntCompanyEditorView::initializeForm() -{ - mCompanyEditorView = new CntCompanyEditorView(mViewManager, 0); - QContact *contact= new QContact(); - // create without data - mCompanyEditorView->mContact = contact; - mCompanyEditorView->mParamString = "company"; - mCompanyEditorView->initializeForm(); - - //Check count - QVERIFY(mCompanyEditorView->formModel()->rowCount(QModelIndex()) == 4); - delete mCompanyEditorView; - mCompanyEditorView = 0; -} - -void TestCntCompanyEditorView::initializeFormData() -{ - mCompanyEditorView = new CntCompanyEditorView(mViewManager, 0); - QContactOrganization *company = new QContactOrganization(); - company->setName("Company name"); - company->setTitle("Company Title"); - QStringList list; - list << "Department"; - company->setDepartment(list); - company->setAssistantName("Assistant"); - - QContact *contact= new QContact(); - - contact->saveDetail(company); - - mCompanyEditorView->mContact = contact; - - mCompanyEditorView->initializeForm(); - QVERIFY(mCompanyEditorView->formModel()->rowCount(QModelIndex()) == 4); - -} - -void TestCntCompanyEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - mViewManager = 0; - delete mCompanyEditorView; - mCompanyEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcarddatacontainer.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcarddatacontainer.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,356 +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 "cntcontactcarddatacontainer.h" -#include "t_cntcontactcarddatacontainer.h" - -#include - -void TestCntContactCardDataContainer::initTestCase() -{ - mDataContainer = 0; -} - -void TestCntContactCardDataContainer::createClass(QContact* contact) -{ - mDataContainer = new CntContactCardDataContainer(contact, this); - QVERIFY(mDataContainer != 0); -} - -void TestCntContactCardDataContainer::data() -{ - delete mDataContainer; - mDataContainer = 0; - - QContact* contact = new QContact(); - QContactName* name = new QContactName(); - name->setFirst("first"); - contact->saveDetail(name); - QContactPhoneNumber* number = new QContactPhoneNumber(); - number->setNumber("1234567890"); - number->setSubTypes(QContactPhoneNumber::SubTypeMobile); - contact->saveDetail(number); - QContactNote* note = new QContactNote(); - note->setNote("note"); - contact->saveDetail(note); - - createClass(contact); - - //phone number - QVERIFY(mDataContainer->data(-1, Qt::DisplayRole).isNull() == true); - QVERIFY(mDataContainer->data(0, Qt::DisplayRole).isNull() == false); - QVERIFY(mDataContainer->data(0, Qt::DecorationRole).isNull() == false); - QVERIFY(mDataContainer->data(0, Qt::UserRole+1).isNull() == false); - QVERIFY(mDataContainer->data(0, Qt::UserRole+2).isNull() == true); - //separator - QVERIFY(mDataContainer->data(mDataContainer->mSeparatorIndex, Qt::DisplayRole).isNull() == false); - QVERIFY(mDataContainer->data(mDataContainer->mSeparatorIndex, Qt::DecorationRole).isNull() == true); - QVERIFY(mDataContainer->data(mDataContainer->mSeparatorIndex, Qt::BackgroundRole).isNull() == true); - //note - QVERIFY(mDataContainer->data(3, Qt::DecorationRole).isNull() == true); - QVERIFY(mDataContainer->data(3, Qt::DisplayRole).isNull() == false); - - delete contact; - delete number; - delete note; -} - -void TestCntContactCardDataContainer::rowCount() -{ - delete mDataContainer; - mDataContainer = 0; - - QContact* contact = new QContact(); - createClass(contact); - - QVERIFY(mDataContainer->mDataPointer->mDataList.count() == mDataContainer->rowCount()); -} - -void TestCntContactCardDataContainer::initializeData() -{ - delete mDataContainer; - mDataContainer = 0; - - //Test #1 contact without details - QContact* contact = new QContact(); - - //calls also mDataContainer->initializeData() - createClass(contact); - - QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 0); - delete contact; - - delete mDataContainer; - mDataContainer = 0; - - //Test #2 contact witht number + email - contact = new QContact(); - QContactName* name = new QContactName(); - name->setFirst("first"); - contact->saveDetail(name); - QContactPhoneNumber* number = new QContactPhoneNumber(); - number->setNumber("1234567890"); - number->setSubTypes(QContactPhoneNumber::SubTypeMobile); - contact->saveDetail(number); - QContactEmailAddress* email = new QContactEmailAddress(); - email->setEmailAddress("email@email.email"); - contact->saveDetail(email); - - //calls also mDataContainer->initializeData() - createClass(contact); - - QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 3); - QVERIFY(mDataContainer->mDataPointer->mDataList.count() == mDataContainer->rowCount() ); - - QVariantList values = mDataContainer->mDataPointer->mDataList.value(0); - QVERIFY(values[0].toString().compare("call") == 0); - QVERIFY(values[1].toString().compare("call mobile", Qt::CaseInsensitive) == 0); - QVERIFY(values[2].toString().compare("1234567890") == 0); - - QVariantList values1 = mDataContainer->mDataPointer->mDataList.value(1); - QVERIFY(values1[0].toString().compare("message") == 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); - QVERIFY(values2[0].toString().compare("email") == 0); - QVERIFY(values2[1].toString().compare("mail email", Qt::CaseInsensitive) == 0); - QVERIFY(values2[2].toString().compare("email@email.email") == 0); - - delete contact; - delete number; - delete email; -} - -void TestCntContactCardDataContainer::actionDetails() -{ - delete mDataContainer; - mDataContainer = 0; - - QContact* contact = new QContact(); - QContactEmailAddress* email = new QContactEmailAddress(); - email->setEmailAddress("email@email.email"); - contact->saveDetail(email); - - createClass(contact); - - QList details = mDataContainer->actionDetails("email", *contact); - QVERIFY(details.count() == 1); - - details = mDataContainer->actionDetails("call", *contact); - QVERIFY(details.count() == 0); - - delete contact; - delete email; -} - -void TestCntContactCardDataContainer::supportsDetail() -{ - delete mDataContainer; - mDataContainer = 0; - - QContact* contact = new QContact(); - QContactEmailAddress* email = new QContactEmailAddress(); - email->setEmailAddress("email@email.email"); - contact->saveDetail(email); - - createClass(contact); - - QVERIFY(mDataContainer->supportsDetail("email", *email) == true); - QVERIFY(mDataContainer->supportsDetail("call", *email) == false); - - delete contact; - delete email; -} - -void TestCntContactCardDataContainer::addSeparator() -{ - delete mDataContainer; - mDataContainer = 0; - - QContact* contact = new QContact(); - createClass(contact); - - mDataContainer->mSeparatorIndex = -1; - mDataContainer->addSeparator(1); - QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 1); - QVERIFY(mDataContainer->mSeparatorIndex == 1); - - delete mDataContainer; - mDataContainer = 0; - - createClass(contact); - - mDataContainer->mSeparatorIndex = 1; - mDataContainer->addSeparator(-1); - QVERIFY(mDataContainer->mDataPointer->mDataList.count() == 0); - QVERIFY(mDataContainer->mSeparatorIndex == 1); - - delete contact; -} - -void TestCntContactCardDataContainer::initializeDetailsData() -{ - delete mDataContainer; - mDataContainer = 0; - - QContact* contact = new QContact(); - QContactName* name = new QContactName(); - name->setFirst("first"); - contact->saveDetail(name); - QContactNote* note = new QContactNote(); - note->setNote("note"); - contact->saveDetail(note); - QContactBirthday* day = new QContactBirthday(); - day->setDate(QDate(1,1,1)); - contact->saveDetail(day); - QContactAddress* address = new QContactAddress(); - address->setPostOfficeBox("1"); - address->setStreet("s"); - address->setPostcode("12345"); - address->setLocality("l"); - address->setRegion("r"); - address->setCountry("c"); - contact->saveDetail(address); - - //calls also mDataContainer->initializeDetailsData() - createClass(contact); - - //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(hbTrId("txt_phob_subtitle_details")) == 0); - - QVariantList values1 = mDataContainer->mDataPointer->mDataList.value(1); - QVERIFY(values1[0].toString().compare("") == 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(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(hbTrId("txt_phob_formlabel_note2")) == 0); - QVERIFY(values3[2].toString().compare(note->note()) == 0); - - delete contact; - delete note; - delete day; - delete address; - - delete mDataContainer; - mDataContainer = 0; - - contact = new QContact(); - address = new QContactAddress(); - address->setCountry("sweden"); - contact->saveDetail(address); - - //calls also mDataContainer->initializeDetailsData() - createClass(contact); - - //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(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; -} - -// EOF - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcarddetailitem.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcarddetailitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +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 -#include - -#include "cntcontactcarddetailitem.h" -#include "t_cntcontactcarddetailitem.h" - - -void TestCntContactCardDetailItem::initTestCase() -{ - mDetailItem = 0; -} - -void TestCntContactCardDetailItem::create() -{ - mDetailItem = new CntContactCardDetailItem(0); - QVERIFY(mDetailItem); - QVERIFY(mDetailItem->mGestureFilter); - QVERIFY(mDetailItem->mGestureLongpressed); -} - -void TestCntContactCardDetailItem::createPrimitives() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - - // no given data - mDetailItem->createPrimitives(); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(!mDetailItem->mFirstLineText); - QVERIFY(!mDetailItem->mPrimaryText); - QVERIFY(!mDetailItem->mSecondLineText); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); - - // all data given - mDetailItem->text = "text"; - mDetailItem->primaryText = "primaryText"; - mDetailItem->valueText = "valueText"; - mDetailItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - - mDetailItem->createPrimitives(); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mFirstLineText); - QVERIFY(mDetailItem->mPrimaryText); - QVERIFY(mDetailItem->mSecondLineText); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); - - // calling this a second time shouldn't have any effect - mDetailItem->createPrimitives(); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mFirstLineText); - QVERIFY(mDetailItem->mPrimaryText); - QVERIFY(mDetailItem->mSecondLineText); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); - - // remove all data - mDetailItem->text.clear(); - mDetailItem->primaryText.clear(); - mDetailItem->valueText.clear(); - mDetailItem->icon.clear(); - - mDetailItem->createPrimitives(); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(!mDetailItem->mFirstLineText); - QVERIFY(!mDetailItem->mPrimaryText); - QVERIFY(!mDetailItem->mSecondLineText); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); -} - -void TestCntContactCardDetailItem::recreatePrimitives() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - - mDetailItem->text = "text"; - mDetailItem->primaryText = "primaryText"; - mDetailItem->valueText = "valueText"; - mDetailItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - - mDetailItem->createPrimitives(); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mFirstLineText); - QVERIFY(mDetailItem->mPrimaryText); - QVERIFY(mDetailItem->mSecondLineText); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); - - mDetailItem->recreatePrimitives(); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mFirstLineText); - QVERIFY(mDetailItem->mPrimaryText); - QVERIFY(mDetailItem->mSecondLineText); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); -} - -void TestCntContactCardDetailItem::updatePrimitives() -{ - mDetailItem->updatePrimitives(); - QVERIFY(!mDetailItem->mFocusItem->isVisible()); - mDetailItem->mHasFocus = true; - mDetailItem->updatePrimitives(); - QVERIFY(mDetailItem->mFocusItem->isVisible()); -} - - -void TestCntContactCardDetailItem::onLongPress() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - - QSignalSpy spy(mDetailItem, SIGNAL(longPressed(const QPointF&))); - - mDetailItem->mHasFocus = true; - mDetailItem->onLongPress(QPointF()); - QCOMPARE(spy.count(), 1); - QVERIFY(!mDetailItem->mHasFocus); -} - -void TestCntContactCardDetailItem::setDetails() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - mDetailItem->setDetails(HbIcon(":/icons/qtg_large_avatar.svg"), "text", "valueText"); - - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mFirstLineText); - QVERIFY(!mDetailItem->mPrimaryText); - QVERIFY(mDetailItem->mSecondLineText); - QVERIFY(mDetailItem->mValueTextElideMode == Qt::ElideRight); - - // remove all data - mDetailItem->text.clear(); - mDetailItem->primaryText.clear(); - mDetailItem->valueText.clear(); - mDetailItem->icon.clear(); - - mDetailItem->setDetails(HbIcon(":/icons/qtg_large_avatar.svg"), "primaryText"); - QVERIFY(mDetailItem->mIcon); - QVERIFY(!mDetailItem->mFirstLineText); - QVERIFY(mDetailItem->mPrimaryText); - QVERIFY(!mDetailItem->mSecondLineText); -} - -void TestCntContactCardDetailItem::initGesture() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - mDetailItem->initGesture(); - QVERIFY(mDetailItem->mGestureFilter); - QVERIFY(mDetailItem->mGestureLongpressed); -} - -void TestCntContactCardDetailItem::index() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - QVERIFY(mDetailItem->index() == 0); -} - -void TestCntContactCardDetailItem::cleanupTestCase() -{ - delete mDetailItem; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcardheadingitem.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcardheadingitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,232 +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 "cntcontactcardheadingitem.h" -#include "t_cntcontactcardheadingitem.h" - - -void TestCntContactCardHeadingItem::initTestCase() -{ - mHeadingItem = 0; -} - -void TestCntContactCardHeadingItem::create() -{ - mHeadingItem = new CntContactCardHeadingItem(); - QVERIFY(mHeadingItem); -} - -void TestCntContactCardHeadingItem::createPrimitives() -{ - delete mHeadingItem; - mHeadingItem = 0; - - create(); - - // no given data - mHeadingItem->createPrimitives(); - QVERIFY(!mHeadingItem->mIcon); - QVERIFY(!mHeadingItem->mFirstLineText); - QVERIFY(!mHeadingItem->mPrimaryText); - QVERIFY(!mHeadingItem->mSecondLineText); - QVERIFY(!mHeadingItem->mSecondaryText); - QVERIFY(!mHeadingItem->mMarqueeItem); - QVERIFY(mHeadingItem->mFrameItem); - - // all data given - mHeadingItem->firstLineText = "firstLineText"; - mHeadingItem->primaryText = "primaryText"; - mHeadingItem->secondLineText = "secondLineText"; - mHeadingItem->secondaryText = "secondaryText"; - mHeadingItem->tinyMarqueeText = "tinyMarqueeText"; - mHeadingItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - - mHeadingItem->createPrimitives(); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mFirstLineText); - QVERIFY(mHeadingItem->mPrimaryText); - QVERIFY(mHeadingItem->mSecondLineText); - QVERIFY(mHeadingItem->mSecondaryText); - QVERIFY(mHeadingItem->mMarqueeItem); - - // calling this a second time shouldn't have any effect - mHeadingItem->createPrimitives(); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mFirstLineText); - QVERIFY(mHeadingItem->mPrimaryText); - QVERIFY(mHeadingItem->mSecondLineText); - QVERIFY(mHeadingItem->mSecondaryText); - QVERIFY(mHeadingItem->mMarqueeItem); - - // remove all data - mHeadingItem->firstLineText.clear(); - mHeadingItem->primaryText.clear(); - mHeadingItem->secondLineText.clear(); - mHeadingItem->secondaryText.clear(); - mHeadingItem->tinyMarqueeText.clear(); - mHeadingItem->icon.clear(); - - mHeadingItem->createPrimitives(); - QVERIFY(!mHeadingItem->mIcon); - QVERIFY(!mHeadingItem->mFirstLineText); - QVERIFY(!mHeadingItem->mPrimaryText); - QVERIFY(!mHeadingItem->mSecondLineText); - QVERIFY(!mHeadingItem->mSecondaryText); - QVERIFY(!mHeadingItem->mMarqueeItem); - QVERIFY(mHeadingItem->mFrameItem); -} - -void TestCntContactCardHeadingItem::recreatePrimitives() -{ - delete mHeadingItem; - mHeadingItem = 0; - - create(); - - mHeadingItem->firstLineText = "firstLineText"; - mHeadingItem->primaryText = "primaryText"; - mHeadingItem->secondLineText = "secondLineText"; - mHeadingItem->secondaryText = "secondaryText"; - mHeadingItem->tinyMarqueeText = "tinyMarqueeText"; - mHeadingItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - - mHeadingItem->createPrimitives(); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mFirstLineText); - QVERIFY(mHeadingItem->mPrimaryText); - QVERIFY(mHeadingItem->mSecondLineText); - QVERIFY(mHeadingItem->mSecondaryText); - QVERIFY(mHeadingItem->mMarqueeItem); - - mHeadingItem->recreatePrimitives(); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mFirstLineText); - QVERIFY(mHeadingItem->mPrimaryText); - QVERIFY(mHeadingItem->mSecondLineText); - QVERIFY(mHeadingItem->mSecondaryText); - QVERIFY(mHeadingItem->mMarqueeItem); - -} - -void TestCntContactCardHeadingItem::isNickName() -{ - // empty contact - QContact contact; - QVERIFY(mHeadingItem->isNickName(&contact) == false); - // nickname saved - QContactNickname nick; - nick.setNickname("nick"); - contact.saveDetail(&nick); - QVERIFY(mHeadingItem->isNickName(&contact) == true); - -} - -void TestCntContactCardHeadingItem::isCompanyName() -{ - // empty contact - QContact contact; - QVERIFY(mHeadingItem->isCompanyName(&contact) == false); - // title - QContactOrganization organization; - organization.setTitle("title"); - contact.saveDetail(&organization); - QVERIFY(mHeadingItem->isCompanyName(&contact) == true); - organization.setName("name"); - contact.saveDetail(&organization); - QVERIFY(mHeadingItem->isCompanyName(&contact) == true); -} - -void TestCntContactCardHeadingItem::updatePrimitives() -{ - mHeadingItem->updatePrimitives(); // NOP -} - -void TestCntContactCardHeadingItem::setDetails() -{ - delete mHeadingItem; - mHeadingItem = 0; - - create(); - - // empty contact - QContact contact; - - mHeadingItem->setDetails(&contact); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(!mHeadingItem->mFirstLineText); - QVERIFY(mHeadingItem->mPrimaryText); - QVERIFY(!mHeadingItem->mSecondLineText); - QVERIFY(!mHeadingItem->mSecondaryText); - QVERIFY(!mHeadingItem->mMarqueeItem); - QVERIFY(mHeadingItem->mFrameItem); - - // nickname saved - QContactNickname nick; - nick.setNickname("nick"); - contact.saveDetail(&nick); - - mHeadingItem->setDetails(&contact); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mFirstLineText); - QVERIFY(!mHeadingItem->mPrimaryText); - QVERIFY(!mHeadingItem->mSecondLineText); - QVERIFY(mHeadingItem->mSecondaryText); - QVERIFY(!mHeadingItem->mMarqueeItem); - QVERIFY(mHeadingItem->mFrameItem); - - // nickname and organization - QContactOrganization organization; - organization.setTitle("title"); - organization.setName("name"); - contact.saveDetail(&organization); - - mHeadingItem->setDetails(&contact); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mFirstLineText); - QVERIFY(!mHeadingItem->mPrimaryText); - QVERIFY(!mHeadingItem->mSecondLineText); - QVERIFY(mHeadingItem->mSecondaryText); - QVERIFY(mHeadingItem->mMarqueeItem); - QVERIFY(mHeadingItem->mFrameItem); -} - -void TestCntContactCardHeadingItem::setIcon() -{ - delete mHeadingItem; - mHeadingItem = 0; - - create(); - - mHeadingItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - mHeadingItem->setIcon(HbIcon(":/icons/qtg_large_avatar.svg")); - QVERIFY(!mHeadingItem->mIcon); - - mHeadingItem->setIcon(HbIcon(":/icons/qtg_large_custom.svg")); - QVERIFY(mHeadingItem->mIcon); -} - -void TestCntContactCardHeadingItem::cleanupTestCase() -{ - delete mHeadingItem; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcardview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntcontactcardview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,306 +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 - -#include "cntcontactcardview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" - -#include "t_cntcontactcardview.h" - - -void TestCntContactCardView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mContactCardView = 0; -} - -void TestCntContactCardView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mContactCardView = new CntContactCardView(mViewManager,0); - - //check that docml - QVERIFY(mContactCardView->findWidget("content") != 0); - - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mContactCardView != 0); - QVERIFY(mContactCardView->mThumbnailManager != 0); -} - -void TestCntContactCardView::activateView() -{ - delete mContactCardView; - mContactCardView = 0; - - mContactCardView = new CntContactCardView(mViewManager, 0); - - //set view parameters and create contact - CntViewParameters viewParameters(CntViewParameters::noView); - QContact* contact = new QContact(); - - viewParameters.setSelectedContact(*contact); - mContactCardView->activateView(viewParameters); - - QVERIFY(mContactCardView->mContact != 0); - QVERIFY(mContactCardView->mHeadingItem != 0); - QVERIFY(mContactCardView->mDataContainer != 0); - QVERIFY(mContactCardView->mScrollArea != 0); - QVERIFY(mContactCardView->mContainerWidget != 0); - QVERIFY(mContactCardView->mContainerLayout != 0); - - //heading + scroll area - QVERIFY(mContactCardView->findWidget("content")->layout()->count() == 2); - //no items - QVERIFY(mContactCardView->mContainerLayout->count() == 0); - - - delete contact; - - //---------------------------------------------------------------------------------- - - //test #2 only name with number - delete mContactCardView; - mContactCardView = 0; - - mContactCardView = new CntContactCardView(mViewManager,0); - - //set view parameters and create contact - CntViewParameters viewParameters2(CntViewParameters::noView); - - QContact* contact2 = new QContact(); - QContactName* name = new QContactName(); - name->setFirst("first"); - contact2->saveDetail(name); - QContactPhoneNumber* number = new QContactPhoneNumber(); - number->setNumber("123456789"); - number->setSubTypes(QContactPhoneNumber::SubTypeMobile); - contact2->saveDetail(number); - QContactNote* note = new QContactNote(); - note->setNote("note"); - contact2->saveDetail(note); - QContactAvatar* avatar = new QContactAvatar(); - avatar->setAvatar("no_icon.svg"); - contact2->saveDetail(avatar); - - viewParameters2.setSelectedContact(*contact2); - mContactCardView->activateView(viewParameters2); - - QVERIFY(mContactCardView->mContact != 0); - QVERIFY(mContactCardView->mHeadingItem != 0); - QVERIFY(mContactCardView->mDataContainer != 0); - QVERIFY(mContactCardView->mScrollArea != 0); - QVERIFY(mContactCardView->mContainerWidget != 0); - QVERIFY(mContactCardView->mContainerLayout != 0); - - //call + messaging + separator + company - QVERIFY(mContactCardView->mContainerLayout->count() == 4); -} - -void TestCntContactCardView::addActionsToToolBar() -{ - delete mContactCardView; - mContactCardView=0; - - mContactCardView= new CntContactCardView(mViewManager,0); - - mContactCardView->addActionsToToolBar(); - 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() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mContactCardView; - mContactCardView = 0; -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdateeditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdateeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +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 "cntdateeditorview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntdateeditorview.h" - -void TestCntDateEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mDateEditorView = 0; -} - -void TestCntDateEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mDateEditorView = new CntDateEditorView(mViewManager, 0); - mWindow->addView(mDateEditorView); - mWindow->setCurrentView(mDateEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mDateEditorView != 0); -} - -void TestCntDateEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactBirthday *bDay = new QContactBirthday(); - QContactAnniversary *anniversary = new QContactAnniversary(); - - mDateEditorView->mDetailList.append(bDay); - mDateEditorView->mDetailList.append(anniversary); - mDateEditorView->mContact = contact; - - // empty detail isn't saved - mDateEditorView->aboutToCloseView(); - QVERIFY(mDateEditorView->mContact->details().count() == 0); - QVERIFY(mDateEditorView->mContact->details().count() == 0); - - // Birthday - bDay->setDate(QDate::currentDate()); - mDateEditorView->aboutToCloseView(); - QVERIFY(mDateEditorView->mContact->details().count() == 1); - QVERIFY(mDateEditorView->mContact->details().count() == 0); - bDay->setDate(QDate()); - - // Anniversary - anniversary->setOriginalDate(QDate::currentDate()); - mDateEditorView->aboutToCloseView(); - QVERIFY(mDateEditorView->mContact->details().count() == 0); - QVERIFY(mDateEditorView->mContact->details().count() == 1); - bDay->setDate(QDate()); - - mWindow->removeView(mDateEditorView); - delete mDateEditorView; - mDateEditorView = 0; -} - - -void TestCntDateEditorView::initializeForm() -{ - mDateEditorView = new CntDateEditorView(mViewManager, 0); - QContact *contact= new QContact; - // create without any dates specified - mDateEditorView->mContact = contact; - mDateEditorView->initializeForm(); - - //Check count is 2 - QVERIFY(mDateEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mDateEditorView; - mDateEditorView = 0; -} - -void TestCntDateEditorView::initializeFormData() -{ - mDateEditorView = new CntDateEditorView(mViewManager, 0); - QContact *contact = new QContact(); - QContactBirthday *bDay = new QContactBirthday(); - QContactAnniversary *anniversary = new QContactAnniversary(); - - bDay->setDate(QDate::currentDate()); - anniversary->setOriginalDate(QDate::currentDate()); - - contact->saveDetail(bDay); - contact->saveDetail(anniversary); - - mDateEditorView->mContact = contact; - - mDateEditorView->initializeForm(); - QVERIFY(mDateEditorView->formModel()->rowCount(QModelIndex()) == 2); -} - -void TestCntDateEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mDateEditorView; - mDateEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdetailpopup.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntdetailpopup.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +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 -#include - -#include "cntdetailpopup.h" -#include "t_cntdetailpopup.h" - -QTM_USE_NAMESPACE - -void TestCntDetailPopup::initTestCase() -{ - QStringList list; - mPopup = new CntDetailPopup(list); - - QVERIFY(mPopup->mListView); - QVERIFY(mPopup->mListModel); - QVERIFY(mPopup->mListModel->rowCount(QModelIndex()) == 6); - - delete mPopup; - mPopup = 0; - - list << QContactNote::DefinitionName << QContactAvatar::SubTypeAudioRingtone << - QContactBirthday::DefinitionName << QContactOrganization::DefinitionName << QContactFamily::FieldSpouse; - mPopup = new CntDetailPopup(list); - - QVERIFY(mPopup->mListView); - QVERIFY(mPopup->mListModel); - QVERIFY(mPopup->mListModel->rowCount(QModelIndex()) == 1); - - delete mPopup; - mPopup = 0; - list.clear(); - - list << QContactNote::DefinitionName << QContactAvatar::SubTypeAudioRingtone << - QContactAnniversary::DefinitionName << QContactOrganization::FieldAssistantName << QContactFamily::FieldChildren; - mPopup = new CntDetailPopup(list); - - QVERIFY(mPopup->mListView); - QVERIFY(mPopup->mListModel); - QVERIFY(mPopup->mListModel->rowCount(QModelIndex()) == 1); -} - -void TestCntDetailPopup::listItemSelected() -{ - // take the first item - QModelIndex index = mPopup->mListModel->index(0,0); - - mPopup->listItemSelected(index); - QVERIFY(!mPopup->selectedDetail().isEmpty()); -} - -void TestCntDetailPopup::selectDetail() -{ - // only this case can be tested (popup closed without selecting anything) - QString empty = CntDetailPopup::selectDetail(QStringList()); - QVERIFY(empty.isEmpty()); -} - -void TestCntDetailPopup::cleanupTestCase() -{ - delete mPopup; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditordatamodelitem.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditordatamodelitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +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 "cnteditordatamodelitem.h" -#include "t_cnteditordatamodelitem.h" -#include - -void TestCntEditorDataModelItem::initTestCase() -{ - mNote = new QContactNote(); - - mLabelItem = new CntEditorDataModelItem(*mNote, QContactNote::FieldNote, 1500, - static_cast(HbDataFormModelItem::CustomItemBase+1)); - - mEmail = new QContactEmailAddress; - mModel = new QStandardItemModel(); - mComboItem = new CntEditorDataModelItem(*mEmail, QContactEmailAddress::FieldEmailAddress, mModel, - HbDataFormModelItem::CustomItemBase); - - mButtonItem = new CntEditorDataModelItem(*mEmail, tr("Add email address"), - static_cast(HbDataFormModelItem::CustomItemBase+2)); -} - -void TestCntEditorDataModelItem::contactDetail() -{ - QVERIFY(mLabelItem->contactDetail().definitionName() == QContactNote::DefinitionName); - QVERIFY(mComboItem->contactDetail().definitionName() == QContactEmailAddress::DefinitionName); -} - -void TestCntEditorDataModelItem::key() -{ - QVERIFY(mLabelItem->key() == QContactNote::FieldNote); - QVERIFY(mComboItem->key() == QContactEmailAddress::FieldEmailAddress); -} - -void TestCntEditorDataModelItem::buttonLabel() -{ - QVERIFY(mButtonItem->buttonLabel() == tr("Add email address")); -} - -void TestCntEditorDataModelItem::fieldModel() -{ - QVERIFY(mComboItem->fieldModel() == mModel); -} - -void TestCntEditorDataModelItem::maxLength() -{ - QVERIFY(mLabelItem->maxLength() == 1500); -} - -void TestCntEditorDataModelItem::inputFilter() -{ - mComboItem->setTextFilter(HbEmailAddressFilter::instance()); - QVERIFY(mLabelItem->inputFilter() == 0); - QVERIFY(mComboItem->inputFilter() != 0); -} - -void TestCntEditorDataModelItem::cleanupTestCase() -{ - delete mLabelItem; - mLabelItem = 0; - delete mButtonItem; - mButtonItem = 0; - delete mComboItem; - mComboItem = 0; - delete mModel; - mModel = 0; - delete mNote; - mNote = 0; - delete mEmail; - mEmail = 0; -} - - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditordataviewitem.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditordataviewitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,306 +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 - -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" - -#include "cnteditordataviewitem.h" -#include "t_cnteditordataviewitem.h" - -void TestCntEditorDataViewItem::initTestCase() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mTestView = new CntDetailEditorTestView(mViewManager, 0); - mWindow->addView(mTestView); - mWindow->setCurrentView(mTestView); - - mViewItem = new CntEditorDataViewItem(mTestView); - QVERIFY(mViewItem != 0); - QVERIFY(mViewItem->contentWidget() == 0); -} - -void TestCntEditorDataViewItem::createItem() -{ - QVERIFY(mViewItem->createItem() != 0); -} - -void TestCntEditorDataViewItem::addDetail() -{ - mViewItem->addDetail(); - QVERIFY(mTestView->addDetailSelected); -} - -void TestCntEditorDataViewItem::createCustomWidget() -{ - HbDataForm *datas = new HbDataForm(); - datas->setItemPrototype(mViewItem); - - HbDataFormModel *model = new HbDataFormModel(); - - //CustomItemBase - QContactPhoneNumber *number = new QContactPhoneNumber(); - number->setSubTypes(QContactPhoneNumber::SubTypeMobile); - QStandardItemModel *fieldModel = new QStandardItemModel(); - QStandardItem *mobile = new QStandardItem; - mobile->setText("Mobile"); - QString temp = QContactPhoneNumber::SubTypeMobile; - mobile->setData(temp, 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); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*number, QContactPhoneNumber::FieldNumber, fieldModel, - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbPhoneNumberFilter::instance()); - model->appendDataFormItem(item, model->invisibleRootItem()); - - //CustomItemBase +1 (note) - QContactNote *note = new QContactNote(); - item = new CntEditorDataModelItem(*note, QContactNote::FieldNote, CNT_NOTE_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1)); - model->appendDataFormItem(item, model->invisibleRootItem()); - - //CustomItemBase +1 (nickname) - QContactNickname *nick = new QContactNickname(); - item = new CntEditorDataModelItem(*nick, QContactNickname::FieldNickname, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1)); - model->appendDataFormItem(item, model->invisibleRootItem()); - - //CustomItemBase +2 - CntEditorDataModelItem *buttonItem = new CntEditorDataModelItem(*number, tr("Add number"), - static_cast(HbDataFormModelItem::CustomItemBase+2)); - model->appendDataFormItem(buttonItem, model->invisibleRootItem()); - - //CustomItemBase +3 (empty date) - QContactBirthday *birthday = new QContactBirthday(); - birthday->setDate(QDate()); - item = new CntEditorDataModelItem(*birthday, QContactBirthday::FieldBirthday, 0, - static_cast(HbDataFormModelItem::CustomItemBase+3), hbTrId("txt_phob_formlabel_birthday")); - model->appendDataFormItem(item, model->invisibleRootItem()); - - //CustomItemBase +3 (valid date) - QContactAnniversary *anniversary = new QContactAnniversary(); - anniversary->setOriginalDate(QDate(2000, 2, 2)); - item = new CntEditorDataModelItem(*anniversary, QContactBirthday::FieldBirthday, 0, - static_cast(HbDataFormModelItem::CustomItemBase+3), hbTrId("txt_phob_formlabel_birthday")); - model->appendDataFormItem(item, model->invisibleRootItem()); - - //CustomItemBase DEFAULT - buttonItem = new CntEditorDataModelItem(*number, tr("Add number"), - static_cast(HbDataFormModelItem::CustomItemBase+5)); - model->appendDataFormItem(buttonItem, model->invisibleRootItem()); - - datas->setModel(model); - - delete number; - delete note; - delete nick; - delete birthday; - delete anniversary; - - delete model; - delete datas; -} - -void TestCntEditorDataViewItem::modelPosition() -{ - QStandardItemModel *fieldModel = new QStandardItemModel(); - - QString mobileType = QContactPhoneNumber::SubTypeMobile; - QString contextHome = QContactDetail::ContextHome; - - QStandardItem *mobile = new QStandardItem; - mobile->setText("Mobile"); - mobile->setData(mobileType, Qt::UserRole); - mobile->setData(contextHome, Qt::UserRole+1); - mobile->setData(":/icons/qgn_prop_nrtyp_mobile.svg", Qt::UserRole+2); - mobile->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); - fieldModel->appendRow(mobile); - - QContactPhoneNumber number; - number.setSubTypes(mobileType); - number.setContexts(contextHome); - - QVERIFY(mViewItem->modelPosition(fieldModel, number) == 0); - - QContactPhoneNumber number2; - number2.setSubTypes(mobileType); - - QVERIFY(mViewItem->modelPosition(fieldModel, number2) == 1); - - QContactOnlineAccount account; - account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - - QVERIFY(mViewItem->modelPosition(fieldModel, account) == 1); - - QContactEmailAddress email; - email.setContexts(contextHome); - - QVERIFY(mViewItem->modelPosition(fieldModel, email) == 1); - - QContactUrl url; - - QVERIFY(mViewItem->modelPosition(fieldModel, url) == 1); - - delete fieldModel; -} - -void TestCntEditorDataViewItem::textChanged() -{ - mViewItem = 0; - mViewItem = new CntEditorDataViewItem(mTestView); - - HbDataForm *datas = new HbDataForm(); - datas->setItemPrototype(mViewItem); - - HbDataFormModel *model = new HbDataFormModel(); - - QContactNickname *nick = new QContactNickname(); - CntEditorDataModelItem *item = new CntEditorDataModelItem(*nick, QContactNickname::FieldNickname, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1)); - model->appendDataFormItem(item, model->invisibleRootItem()); - - QContactOrganization *company = new QContactOrganization(); - CntEditorDataModelItem *itemOrg = new CntEditorDataModelItem(*company, QContactOrganization::FieldDepartment, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_department")); - model->appendDataFormItem(itemOrg, model->invisibleRootItem()); - - QContactFamily *family = new QContactFamily(); - CntEditorDataModelItem *itemFamily = new CntEditorDataModelItem(*family, QContactFamily::FieldChildren, CNT_NAMES_EDITOR_MAXLENGTH, - static_cast(HbDataFormModelItem::CustomItemBase+1), hbTrId("txt_phob_formlabel_children")); - model->appendDataFormItem(itemFamily, model->invisibleRootItem()); - - datas->setModel(model); - - static_cast(datas->itemByIndex(model->indexFromItem(item)))->textChanged("nickname"); - QVERIFY(static_cast(item->contactDetail()).nickname() == "nickname"); - - static_cast(datas->itemByIndex(model->indexFromItem(item)))->textChanged(" "); - QVERIFY(static_cast(item->contactDetail()).nickname().isEmpty()); - - static_cast(datas->itemByIndex(model->indexFromItem(item)))->textChanged(" nik "); - QVERIFY(static_cast(item->contactDetail()).nickname() == "nik"); - - static_cast(datas->itemByIndex(model->indexFromItem(itemOrg)))->textChanged("department"); - QVERIFY(static_cast(itemOrg->contactDetail()).department().join("") == "department"); - - static_cast(datas->itemByIndex(model->indexFromItem(itemFamily)))->textChanged("child"); - QVERIFY(static_cast(itemFamily->contactDetail()).children().join("") == "child"); - - delete nick; - delete company; - delete family; - - delete model; - delete datas; -} - -void TestCntEditorDataViewItem::indexChanged() -{ - mViewItem = 0; - mViewItem = new CntEditorDataViewItem(mTestView); - - HbDataForm *datas = new HbDataForm(); - datas->setItemPrototype(mViewItem); - - HbDataFormModel *model = new HbDataFormModel(); - - QContactPhoneNumber *number = new QContactPhoneNumber(); - number->setSubTypes(QContactPhoneNumber::SubTypeMobile); - - QStandardItemModel *fieldModel = new QStandardItemModel(); - QStandardItem *mobile = new QStandardItem; - mobile->setText("Mobile"); - QString temp = QContactPhoneNumber::SubTypeMobile; - mobile->setData(temp, 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 *landlinehome = new QStandardItem; - landlinehome->setText("Landline (home)"); - QString land = QContactPhoneNumber::SubTypeLandline; - landlinehome->setData(land, Qt::UserRole); - QString home = QContactDetail::ContextHome; - landlinehome->setData(home, Qt::UserRole+1); - landlinehome->setData(":/icons/qgn_prop_nrtyp_mobile.svg", Qt::UserRole+2); - landlinehome->setData(CNT_PHONENUMBER_EDITOR_MAXLENGTH, Qt::UserRole+3); - fieldModel->appendRow(landlinehome); - - CntEditorDataModelItem *item = new CntEditorDataModelItem(*number, QContactPhoneNumber::FieldNumber, fieldModel, - HbDataFormModelItem::CustomItemBase); - item->setTextFilter(HbPhoneNumberFilter::instance()); - model->appendDataFormItem(item, model->invisibleRootItem()); - - QContactOnlineAccount *account = new QContactOnlineAccount(); - account->setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - - QStandardItemModel *onlineAccountFieldModel = new QStandardItemModel(); - QStandardItem *internet = new QStandardItem; - internet->setText(hbTrId("Internet call")); - QString internetSubType = QContactOnlineAccount::SubTypeSipVoip; - 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); - onlineAccountFieldModel->appendRow(internet); - QStandardItem *sip = new QStandardItem; - sip->setText(hbTrId("SIP")); - QString sipSubType = QContactOnlineAccount::SubTypeSip; - 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); - onlineAccountFieldModel->appendRow(sip); - - CntEditorDataModelItem *accountItem = new CntEditorDataModelItem(*account, QContactOnlineAccount::FieldAccountUri, onlineAccountFieldModel, - HbDataFormModelItem::CustomItemBase); - accountItem->setTextFilter(HbInputLowerCaseFilter::instance()); - model->appendDataFormItem(accountItem, model->invisibleRootItem()); - - datas->setModel(model); - - static_cast(datas->itemByIndex(model->indexFromItem(item)))->indexChanged(1); - QVERIFY(static_cast(item->contactDetail()).subTypes().first() == QContactPhoneNumber::SubTypeLandline); - QVERIFY(static_cast(item->contactDetail()).contexts().first() == QContactDetail::ContextHome); - - static_cast(datas->itemByIndex(model->indexFromItem(item)))->indexChanged(0); - QVERIFY(static_cast(item->contactDetail()).subTypes().first() == QContactPhoneNumber::SubTypeMobile); - QVERIFY(!static_cast(item->contactDetail()).contexts().count()); - - static_cast(datas->itemByIndex(model->indexFromItem(accountItem)))->indexChanged(1); - QVERIFY(static_cast(accountItem->contactDetail()).subTypes().first() == QContactOnlineAccount::SubTypeSip); - QVERIFY(!static_cast(accountItem->contactDetail()).contexts().count()); - - delete number; - delete account; - - delete model; - delete datas; -} - -void TestCntEditorDataViewItem::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditviewdetailitem.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditviewdetailitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,403 +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 -#include - -#include "cnteditviewdetailitem.h" -#include "t_cnteditviewdetailitem.h" - - -void TestCntEditViewDetailItem::initTestCase() -{ - mDetailItem = 0; -} - -void TestCntEditViewDetailItem::create() -{ - mDetailItem = new CntEditViewDetailItem(); - QVERIFY(mDetailItem); - QVERIFY(mDetailItem->mGestureFilter); - QVERIFY(mDetailItem->mGestureLongpressed); -} - -void TestCntEditViewDetailItem::createPrimitives() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - - // no given data - mDetailItem->createPrimitives(); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(!mDetailItem->mLabel); - QVERIFY(!mDetailItem->mContent); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); - - // all data given - mDetailItem->text = "text"; - mDetailItem->valueText = "valueText"; - mDetailItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - - mDetailItem->createPrimitives(); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); - - // calling this a second time shouldn't have any effect - mDetailItem->createPrimitives(); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); - - // remove all data - mDetailItem->text.clear(); - mDetailItem->valueText.clear(); - mDetailItem->icon.clear(); - - mDetailItem->createPrimitives(); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(!mDetailItem->mLabel); - QVERIFY(!mDetailItem->mContent); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); -} - -void TestCntEditViewDetailItem::recreatePrimitives() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - - mDetailItem->text = "text"; - mDetailItem->valueText = "valueText"; - mDetailItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - - mDetailItem->createPrimitives(); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); - - mDetailItem->recreatePrimitives(); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - QVERIFY(mDetailItem->mFrameItem); - QVERIFY(mDetailItem->mFocusItem); -} - -void TestCntEditViewDetailItem::updatePrimitives() -{ - mDetailItem->updatePrimitives(); - QVERIFY(!mDetailItem->mFocusItem->isVisible()); - mDetailItem->mHasFocus = true; - mDetailItem->updatePrimitives(); - QVERIFY(mDetailItem->mFocusItem->isVisible()); -} - -void TestCntEditViewDetailItem::setDetail() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - - // mobile home & special update case - QContactPhoneNumber number; - - mDetailItem->setDetail(number); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(!mDetailItem->mContent); - - number.setSubTypes(QContactPhoneNumber::SubTypeMobile); - number.setContexts(QContactDetail::ContextHome); - number.setNumber("123"); - mDetailItem->setDetail(number); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - mDetailItem->setDetail(number); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - // email address - QContactEmailAddress email; - - mDetailItem->setDetail(email); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(!mDetailItem->mContent); - - email.setEmailAddress("email@email.fi"); - mDetailItem->setDetail(email); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - // postal address - QContactAddress address; - - mDetailItem->setDetail(address); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(!mDetailItem->mContent); - - address.setStreet("street"); - mDetailItem->setDetail(address); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - address.setStreet(QString()); - address.setPostcode("postcode"); - address.setPostOfficeBox("123"); - address.setLocality("locality"); - address.setRegion("region"); - address.setCountry("country"); - mDetailItem->setDetail(address); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - // online account - QContactOnlineAccount account; - mDetailItem->setDetail(account); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(!mDetailItem->mContent); - - account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - account.setAccountUri("accounturi"); - mDetailItem->setDetail(account); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - // url - QContactUrl url; - mDetailItem->setDetail(url); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(!mDetailItem->mContent); - - url.setUrl("http://www.nokia.com"); - mDetailItem->setDetail(url); - QVERIFY(mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - // company details - QContactOrganization org; - QStringList departments; - departments << "department"; - org.setDepartment(departments); - mDetailItem->setDetail(org, QContactOrganization::DefinitionName); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - org.setDepartment(QStringList()); - org.setTitle("title"); - org.setName("name"); - mDetailItem->setDetail(org, QContactOrganization::DefinitionName); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - org.setAssistantName("assistant"); - mDetailItem->setDetail(org, QContactOrganization::FieldAssistantName); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - // birthday - QContactBirthday bDay; - bDay.setDate(QDate::currentDate()); - mDetailItem->setDetail(bDay); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - // anniversary - QContactAnniversary anniversary; - anniversary.setOriginalDate(QDate::currentDate()); - mDetailItem->setDetail(anniversary); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - // ringing tone - QContactAvatar avatar; - avatar.setAvatar("path"); - avatar.setSubType(QContactAvatar::SubTypeAudioRingtone); - mDetailItem->setDetail(avatar); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - // note - QContactNote note; - note.setNote("note"); - mDetailItem->setDetail(note); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - // family details - QContactFamily family; - family.setSpouse("spouse"); - QStringList children; - children << "child"; - family.setChildren(children); - - mDetailItem->setDetail(family, QContactFamily::FieldSpouse); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); - - delete mDetailItem; - mDetailItem = 0; - - create(); - - mDetailItem->setDetail(family, QContactFamily::FieldChildren); - QVERIFY(!mDetailItem->mIcon); - QVERIFY(mDetailItem->mLabel); - QVERIFY(mDetailItem->mContent); -} - -void TestCntEditViewDetailItem::detail() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - - QContactPhoneNumber number; - number.setSubTypes(QContactPhoneNumber::SubTypeMobile); - number.setNumber("123"); - mDetailItem->setDetail(number); - - QVERIFY(mDetailItem->detail().definitionName() == QContactPhoneNumber::DefinitionName); - QVERIFY(static_cast(mDetailItem->detail()).number() == "123"); -} - -void TestCntEditViewDetailItem::fieldType() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - - QContactDetail detail; - mDetailItem->setDetail(detail, "dummytype"); - - QVERIFY(mDetailItem->fieldType() == "dummytype"); -} - -void TestCntEditViewDetailItem::onLongPress() -{ - delete mDetailItem; - mDetailItem = 0; - - create(); - - QSignalSpy spy(mDetailItem, SIGNAL(longPressed(const QPointF&))); - - mDetailItem->mHasFocus = true; - mDetailItem->onLongPress(QPointF()); - QCOMPARE(spy.count(), 1); - QVERIFY(!mDetailItem->mHasFocus); -} - -void TestCntEditViewDetailItem::cleanupTestCase() -{ - delete mDetailItem; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditviewheadingitem.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnteditviewheadingitem.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,184 +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 "cnteditviewheadingitem.h" -#include "t_cnteditviewheadingitem.h" - - -void TestCntEditViewHeadingItem::initTestCase() -{ - mHeadingItem = 0; -} - -void TestCntEditViewHeadingItem::create() -{ - mHeadingItem = new CntEditViewHeadingItem(); - QVERIFY(mHeadingItem); -} - -void TestCntEditViewHeadingItem::createPrimitives() -{ - delete mHeadingItem; - mHeadingItem = 0; - - create(); - - // no given data - mHeadingItem->createPrimitives(); - QVERIFY(!mHeadingItem->mIcon); - QVERIFY(!mHeadingItem->mLabel); - QVERIFY(!mHeadingItem->mSecondLabel); - QVERIFY(mHeadingItem->mFrameItem); - QVERIFY(mHeadingItem->mIconTouchArea); - - // all data given - mHeadingItem->text = "text"; - mHeadingItem->second_text = "secondText"; - mHeadingItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - - mHeadingItem->createPrimitives(); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mLabel); - QVERIFY(mHeadingItem->mSecondLabel); - QVERIFY(mHeadingItem->mFrameItem); - QVERIFY(mHeadingItem->mIconTouchArea); - - // calling this a second time shouldn't have any effect - mHeadingItem->createPrimitives(); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mLabel); - QVERIFY(mHeadingItem->mSecondLabel); - QVERIFY(mHeadingItem->mFrameItem); - QVERIFY(mHeadingItem->mIconTouchArea); - - // remove all data - mHeadingItem->text.clear(); - mHeadingItem->second_text.clear(); - mHeadingItem->icon.clear(); - - mHeadingItem->createPrimitives(); - QVERIFY(!mHeadingItem->mIcon); - QVERIFY(!mHeadingItem->mLabel); - QVERIFY(!mHeadingItem->mSecondLabel); - QVERIFY(mHeadingItem->mFrameItem); - QVERIFY(mHeadingItem->mIconTouchArea); -} - -void TestCntEditViewHeadingItem::recreatePrimitives() -{ - delete mHeadingItem; - mHeadingItem = 0; - - create(); - - mHeadingItem->text = "text"; - mHeadingItem->second_text = "secondText"; - mHeadingItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - - mHeadingItem->createPrimitives(); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mLabel); - QVERIFY(mHeadingItem->mSecondLabel); - QVERIFY(mHeadingItem->mFrameItem); - QVERIFY(mHeadingItem->mIconTouchArea); - - mHeadingItem->recreatePrimitives(); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mLabel); - QVERIFY(mHeadingItem->mSecondLabel); - QVERIFY(mHeadingItem->mFrameItem); - QVERIFY(mHeadingItem->mIconTouchArea); - -} - -void TestCntEditViewHeadingItem::updatePrimitives() -{ - mHeadingItem->updatePrimitives(); // NOP -} - -void TestCntEditViewHeadingItem::setDetails() -{ - delete mHeadingItem; - mHeadingItem = 0; - - create(); - - // empty contact - QContact contact; - - mHeadingItem->setDetails(&contact); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mLabel); - QVERIFY(!mHeadingItem->mSecondLabel); - QVERIFY(mHeadingItem->mFrameItem); - QVERIFY(mHeadingItem->mIconTouchArea); - - // nickname saved - QContactNickname nick; - nick.setNickname("nick"); - contact.saveDetail(&nick); - - mHeadingItem->setDetails(&contact); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(!mHeadingItem->mLabel); - QVERIFY(mHeadingItem->mSecondLabel); - QVERIFY(mHeadingItem->mFrameItem); - QVERIFY(mHeadingItem->mIconTouchArea); - - // nickname and full name saved - QContactName name; - name.setPrefix("prefix"); - name.setFirst("first"); - name.setMiddle("middle"); - name.setLast("last"); - name.setSuffix("suffix"); - contact.saveDetail(&name); - - mHeadingItem->setDetails(&contact); - QVERIFY(mHeadingItem->mIcon); - QVERIFY(mHeadingItem->mLabel); - QVERIFY(mHeadingItem->mSecondLabel); - QVERIFY(mHeadingItem->mFrameItem); - QVERIFY(mHeadingItem->mIconTouchArea); -} - -void TestCntEditViewHeadingItem::setIcon() -{ - delete mHeadingItem; - mHeadingItem = 0; - - create(); - - mHeadingItem->icon = HbIcon(":/icons/qtg_large_avatar.svg"); - mHeadingItem->setIcon(HbIcon(":/icons/qtg_large_avatar.svg")); - QVERIFY(!mHeadingItem->mIcon); - - mHeadingItem->setIcon(HbIcon(":/icons/qtg_large_custom.svg")); - QVERIFY(mHeadingItem->mIcon); -} - -void TestCntEditViewHeadingItem::cleanupTestCase() -{ - delete mHeadingItem; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntemaileditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntemaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,165 +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 "cntemaileditorview.h" -#include "cntviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntemaileditorview.h" - -void TestCntEmailEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mEmailEditorView = 0; -} - -void TestCntEmailEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); - mEmailEditorView = new CntEmailEditorView(mViewManager, 0); - mWindow->addView(mEmailEditorView); - mWindow->setCurrentView(mEmailEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mEmailEditorView != 0); -} - -void TestCntEmailEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactEmailAddress *email = new QContactEmailAddress(); - mEmailEditorView->mDetailList.append(email); - mEmailEditorView->mContact = contact; - - // empty email not saved - mEmailEditorView->aboutToCloseView(); - QVERIFY(mEmailEditorView->mContact->details().count() == 0); - - // one address - email->setEmailAddress("dummy@dummy.fi"); - mEmailEditorView->aboutToCloseView(); - QVERIFY(mEmailEditorView->mContact->details().count() == 1); - - mWindow->removeView(mEmailEditorView); - delete mEmailEditorView; - mEmailEditorView = 0; -} - -void TestCntEmailEditorView::itemModel() -{ - mEmailEditorView = new CntEmailEditorView(mViewManager, 0); - QStandardItemModel *itemModel = new QStandardItemModel(); - QContact *contact= new QContact; - - mEmailEditorView->mContact = contact; - itemModel = mEmailEditorView->itemModel(); - QVERIFY(itemModel->rowCount(QModelIndex()) == 3 ); -} - -void TestCntEmailEditorView::initializeForm() -{ - mEmailEditorView->initializeForm(); - - //Check count - QVERIFY(mEmailEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mEmailEditorView; - mEmailEditorView = 0; -} - -void TestCntEmailEditorView::initializeFormAdd() -{ - QContact *contact= new QContact; - mEmailEditorView = new CntEmailEditorView(mViewManager, 0); - mEmailEditorView->mContact = contact; - - QContactEmailAddress *email = new QContactEmailAddress(); - email->setEmailAddress("dummy@something"); - contact->saveDetail(email); - - mEmailEditorView->mParamString = "add"; - mEmailEditorView->initializeForm(); - - //Check count - QVERIFY(mEmailEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mEmailEditorView; - mEmailEditorView = 0; -} - -void TestCntEmailEditorView::initializeFormFocusSecond() -{ - QContact *contact= new QContact; - mEmailEditorView = new CntEmailEditorView(mViewManager, 0); - mEmailEditorView->mContact = contact; - - QContactEmailAddress *email = new QContactEmailAddress(); - email->setEmailAddress("dummy@something"); - contact->saveDetail(email); - - QContactEmailAddress *email2 = new QContactEmailAddress(); - email2->setEmailAddress("dummy2@something"); - contact->saveDetail(email2); - - mEmailEditorView->mParamString = "1"; // focus the second one, not verifiable tho - mEmailEditorView->initializeForm(); - - //Check count - QVERIFY(mEmailEditorView->formModel()->rowCount(QModelIndex()) == 3); - delete mEmailEditorView; - mEmailEditorView = 0; -} - -void TestCntEmailEditorView::initializeFormData() -{ - QContact *contact= new QContact; - mEmailEditorView = new CntEmailEditorView(mViewManager, 0); - mEmailEditorView->mContact = contact; - - QContactEmailAddress *email = new QContactEmailAddress(); - email->setEmailAddress("dummy@something"); - - contact->saveDetail(email); - - mEmailEditorView->initializeForm(); - QVERIFY(mEmailEditorView->formModel()->rowCount(QModelIndex()) == 2); - -} - -void TestCntEmailEditorView::addDetail() -{ - mEmailEditorView->addDetail(); - QVERIFY(mEmailEditorView->formModel()->rowCount(QModelIndex()) == 3); -} - - -void TestCntEmailEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mEmailEditorView; - mEmailEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfamilydetaileditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfamilydetaileditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +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 "cntfamilydetaileditorview.h" -#include "cntviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntfamilydetaileditorview.h" - -void TestCntFamilyDetailEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mFamilyDetailEditorView = 0; -} - -void TestCntFamilyDetailEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); - mFamilyDetailEditorView = new CntFamilyDetailEditorView(mViewManager, 0); - mWindow->addView(mFamilyDetailEditorView); - mWindow->setCurrentView(mFamilyDetailEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mFamilyDetailEditorView != 0); -} - -void TestCntFamilyDetailEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactFamily *family = new QContactFamily(); - mFamilyDetailEditorView->mDetailList.append(family); - mFamilyDetailEditorView->mContact = contact; - - // empty address isn't saved - mFamilyDetailEditorView->aboutToCloseView(); - QVERIFY(mFamilyDetailEditorView->mContact->details().count() == 0); - // Spouse - family->setSpouse("Spouse"); - mFamilyDetailEditorView->aboutToCloseView(); - QVERIFY(mFamilyDetailEditorView->mContact->details().count() == 1); - family->setSpouse(""); - // Children - family->setChildren(QStringList("Children")); - mFamilyDetailEditorView->aboutToCloseView(); - QVERIFY(mFamilyDetailEditorView->mContact->details().count() == 1); - - mWindow->removeView(mFamilyDetailEditorView); - delete mFamilyDetailEditorView; - mFamilyDetailEditorView = 0; -} - - -void TestCntFamilyDetailEditorView::initializeForm() -{ - mFamilyDetailEditorView = new CntFamilyDetailEditorView(mViewManager, 0); - - QContact *contact= new QContact(); - mFamilyDetailEditorView->mContact = contact; - mFamilyDetailEditorView->mParamString = "spouse"; - mFamilyDetailEditorView->initializeForm(); - - //Check count - QVERIFY(mFamilyDetailEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mFamilyDetailEditorView; - mFamilyDetailEditorView = 0; -} - -void TestCntFamilyDetailEditorView::initializeFormData() -{ - mFamilyDetailEditorView = new CntFamilyDetailEditorView(mViewManager, 0); - QContactFamily *family = new QContactFamily(); - - family->setSpouse("Spouse"); - family->setChildren(QStringList("children")); - - QContact *contact= new QContact(); - - contact->saveDetail(family); - mFamilyDetailEditorView->mContact = contact; - - mFamilyDetailEditorView->initializeForm(); - QVERIFY(mFamilyDetailEditorView->formModel()->rowCount(QModelIndex()) == 2); - -} - -void TestCntFamilyDetailEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mFamilyDetailEditorView; - mFamilyDetailEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesmemberview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesmemberview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,262 +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 "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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntfavoritesview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +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 "cntfavoritesview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntfavoritesview.h" -#include "cntgroupselectionpopup.h" - -#include "hbstubs_helper.h" - -void TestCntFavoritesView::initTestCase() -{ - /*mWindow = 0; - mViewManager = 0; - mFavoritesView = 0;*/ -} - -void TestCntFavoritesView::init() -{ - /*mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mFavoritesView = new CntFavoritesView(mViewManager, 0); - mWindow->addView(mFavoritesView); - mWindow->setCurrentView(mFavoritesView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mFavoritesView != 0);*/ -} - -void TestCntFavoritesView::activateView() -{ - /*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() -{ -// 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 ? - -} - -void TestCntFavoritesView::aboutToCloseView() -{ - /*mWindow->addView(mFavoritesView); - mWindow->setCurrentView(mFavoritesView); - - mFavoritesView->aboutToCloseView(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == - CntViewParameters::collectionView);*/ -} - - -void TestCntFavoritesView::cleanup() -{ - /*delete mFavoritesView; - mFavoritesView = 0; - delete mViewManager; - mViewManager = 0; - mWindow->deleteLater();*/ -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupactionsview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupactionsview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +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 -#include "cntgroupactionsview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "hbstubs_helper.h" -#include -#include "t_cntgroupactionsview.h" - -void TestCntGroupActionsView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mGroupActionsView = 0; -} - -void TestCntGroupActionsView::createClasses() -{ - mWindow = new CntMainWindow(0, 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); - QVERIFY(mViewManager != 0); - QVERIFY(mGroupActionsView != 0); -} - -void TestCntGroupActionsView::aboutToCloseView() -{ - -} - -void TestCntGroupActionsView::editGroup() -{ - // 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::addActionsToToolBar() -{ - HbStubHelper::reset(); - mGroupActionsView->addActionsToToolBar(); - QVERIFY(HbStubHelper::widgetActionsCount() == 0); -} - -void TestCntGroupActionsView::addMenuItems() -{ - - HbStubHelper::reset(); - mGroupActionsView->addMenuItems(); - - QVERIFY(HbStubHelper::widgetActionsCount() == 1); -} - - -void TestCntGroupActionsView::activateView() -{ - //set view parameters and create contact - CntViewParameters viewParameters(CntViewParameters::noView); - QContact* contact = new QContact(); - contact->setType(QContactType::TypeGroup); - - viewParameters.setSelectedContact(*contact); - mGroupActionsView->activateView(viewParameters); - - QVERIFY(mGroupActionsView->mGroupContact != 0); - QVERIFY(mGroupActionsView->mDataContainer != 0); - QVERIFY(mGroupActionsView->mScrollArea != 0); - QVERIFY(mGroupActionsView->mContainerWidget != 0); - QVERIFY(mGroupActionsView->mContainerLayout != 0); - - QVERIFY(mGroupActionsView->mContainerLayout->count() == 2); - - delete contact; - - CntViewParameters newViewParameters(CntViewParameters::noView); - QContact* newContact = new QContact(); - newContact->setType(QContactType::TypeGroup); - - QContactPhoneNumber* number = new QContactPhoneNumber(); - number->setNumber("123456789"); - newContact->saveDetail(number); - - newViewParameters.setSelectedContact(*contact); - mGroupActionsView->activateView(newViewParameters); - - QVERIFY(mGroupActionsView->mGroupContact != 0); - QVERIFY(mGroupActionsView->mDataContainer != 0); - QVERIFY(mGroupActionsView->mScrollArea != 0); - QVERIFY(mGroupActionsView->mContainerWidget != 0); - QVERIFY(mGroupActionsView->mContainerLayout != 0); - - QVERIFY(mGroupActionsView->mContainerLayout->count() == 3); - - delete newContact; - -} -void TestCntGroupActionsView::cleanupTestCase() -{ - delete mViewManager; - mViewManager = 0; - mWindow ->deleteLater(); - //mWindow = 0; - delete mGroupActionsView; - mGroupActionsView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupdeletepopup.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupdeletepopup.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +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 - -#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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupdeletepopupmodel.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupdeletepopupmodel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupeditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +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 "cntgroupeditorview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntgroupeditorview.h" - -void TestCntGroupEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mGroupEditorView = 0; -} - -void TestCntGroupEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mGroupEditorView = new CntGroupEditorView(mViewManager, 0); - mWindow->addView(mGroupEditorView); - mWindow->setCurrentView(mGroupEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mGroupEditorView != 0); -} - -void TestCntGroupEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactName *groupName = new QContactName(); - QContactPhoneNumber *confCallNumber = new QContactPhoneNumber(); - - mGroupEditorView->mDetailList.append(groupName); - mGroupEditorView->mDetailList.append(confCallNumber); - mGroupEditorView->mContact = contact; - - // empty detail isn't saved - mGroupEditorView->aboutToCloseView(); - qDebug() << mGroupEditorView->mContact->details().count(); - QVERIFY(mGroupEditorView->mContact->details().count() == 0); - - // Group name - groupName->setCustomLabel("Group Name"); - mGroupEditorView->aboutToCloseView(); - QVERIFY(mGroupEditorView->mContact->details().count() == 1); - groupName->setCustomLabel(""); - - // Conference Call number - confCallNumber->setNumber("0501234567"); - mGroupEditorView->aboutToCloseView(); - QVERIFY(mGroupEditorView->mContact->details().count() == 1); - confCallNumber->setNumber(""); - - delete mGroupEditorView; - mGroupEditorView = 0; -} - -void TestCntGroupEditorView::initializeForm() -{ - mGroupEditorView = new CntGroupEditorView(mViewManager, 0); - QContact *contact= new QContact; - // create without group name and conference call number - mGroupEditorView->mContact = contact; - mGroupEditorView->initializeForm(); - - //Check count is 2 - QVERIFY(mGroupEditorView->formModel()->rowCount(QModelIndex()) == 2); - - delete mGroupEditorView; - mGroupEditorView = 0; -} - -void TestCntGroupEditorView::initializeFormData() -{ - mGroupEditorView = new CntGroupEditorView(mViewManager, 0); - QContactName *groupName = new QContactName(); - QContactPhoneNumber *confCallNumber = new QContactPhoneNumber(); - - groupName->setCustomLabel("Group Name"); - confCallNumber->setNumber("0501234567"); - - QContact *contact= new QContact; - - contact->saveDetail(groupName); - contact->saveDetail(confCallNumber); - - mGroupEditorView->mContact = contact; - - mGroupEditorView->initializeForm(); - QVERIFY(mGroupEditorView->formModel()->rowCount(QModelIndex()) == 2); -} - -void TestCntGroupEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - //mWindow = 0; - delete mViewManager; - mViewManager = 0; - delete mGroupEditorView; - mGroupEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberselectionview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,180 +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 -#include - -#include "cntgroupmemberselectionview.h" -#include "cntviewmanager.h" -#include "cntmainwindow.h" - -#include "hbstubs_helper.h" - -#include "t_cntgroupmemberselectionview.h" - -void TestCntGroupMemberSelectionView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mGroupMemberSelectionView = 0; -} - -void TestCntGroupMemberSelectionView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); - mGroupMemberSelectionView = new CntGroupMemberSelectionView(mViewManager); - mWindow->addView(mGroupMemberSelectionView); - mWindow->setCurrentView(mGroupMemberSelectionView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mGroupMemberSelectionView != 0); -} - -void TestCntGroupMemberSelectionView::aboutToCloseView() -{ - // create a group - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupMemberSelectionView->contactManager()->saveContact(&firstGroup); - - mGroupMemberSelectionView->mContact = &firstGroup; - - mGroupMemberSelectionView->aboutToCloseView(); - //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); -} - -void TestCntGroupMemberSelectionView::saveGroup() -{ - mGroupMemberSelectionView->listView()->setModel(mGroupMemberSelectionView->contactModel()); - // create a group - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupMemberSelectionView->contactManager()->saveContact(&firstGroup); - - // create and save contact to the group - QContact firstContact; - firstContact.setType(QContactType::TypeContact); - mGroupMemberSelectionView->contactManager()->saveContact(&firstContact); - - // set selection model, and saveGroup - - QModelIndex index = mGroupMemberSelectionView->contactModel()->indexOfContact(firstContact); - mGroupMemberSelectionView->selectionModel()->select(index, QItemSelectionModel::Select); - - mGroupMemberSelectionView->mContact = &firstGroup; - // Now that there is a contact in selection Model, call save Group and then check if it is part of the relationship - mGroupMemberSelectionView->saveGroup(); - - // Use relationship filter to get list of contacts in the relationship (if any) - QContactRelationshipFilter filter; - filter.setRelationshipType(QContactRelationship::HasMember); - filter.setRole(QContactRelationshipFilter::First); - filter.setOtherParticipantId(firstContact.id()); - - QList mContactsList = mGroupMemberSelectionView->contactManager()->contacts(filter); - int count = mContactsList.count(); - - QVERIFY(count == 0); - - - -} - - - -void TestCntGroupMemberSelectionView::addActionsToToolBar() -{ - HbStubHelper::reset(); - mGroupMemberSelectionView->addActionsToToolBar(); - QVERIFY(HbStubHelper::widgetActionsCount() == 3); -} - - -void TestCntGroupMemberSelectionView::OnCancel() -{ - mGroupMemberSelectionView->OnCancel(); - //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); -} - - -void TestCntGroupMemberSelectionView::openGroupNameEditor() -{ - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupMemberSelectionView->contactManager()->saveContact(&firstGroup); - mGroupMemberSelectionView->mContact = &firstGroup; - - - mGroupMemberSelectionView->openGroupNameEditor(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::groupEditorView); -} - -void TestCntGroupMemberSelectionView::activateView() -{ - CntViewParameters params(CntViewParameters::groupMemberSelectionView); - - // create a group - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupMemberSelectionView->contactManager()->saveContact(&firstGroup); - - // create and save contact to the group - QContact firstContact; - firstContact.setType(QContactType::TypeContact); - mGroupMemberSelectionView->contactManager()->saveContact(&firstContact); - - // save the group - QContactRelationship relationship; - relationship.setRelationshipType(QContactRelationship::HasMember); - relationship.setFirst(firstGroup.id()); - relationship.setSecond(firstContact.id()); - - mGroupMemberSelectionView->contactManager()->saveRelationship(&relationship); - - // set contact as the group id - params.setSelectedContact(firstGroup); - - // call activate view - mGroupMemberSelectionView->activateView(params); - - QVERIFY(mGroupMemberSelectionView->selectionModel()->hasSelection() == true); - -} -void TestCntGroupMemberSelectionView::cleanupTestCase() -{ - delete mViewManager; - mViewManager = 0; - mWindow->deleteLater(); -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupmemberview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,312 +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 - -#include "cntgroupmemberview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" - -#include "hbstubs_helper.h" - -#include "t_cntgroupmemberview.h" - -void TestCntGroupMemberView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mGroupMemberView = 0; - mGroupContact = 0; - mContact = 0; -} - -void TestCntGroupMemberView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mGroupMemberView = new CntGroupMemberView(mViewManager); - mWindow->addView(mGroupMemberView); - mWindow->setCurrentView(mGroupMemberView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mGroupMemberView != 0); -} - -void TestCntGroupMemberView::aboutToCloseView() -{ - QFAIL( "Commented code below panic'd when executed." ); -// mGroupMemberView->aboutToCloseView(); - //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); - -} - -void TestCntGroupMemberView::deleteGroup() -{ - delete mContact; - delete mGroupContact; - - mContact = 0; - mGroupContact = 0; - - // create a group - mGroupContact = new QContact(); - mGroupContact->setType(QContactType::TypeGroup); - mGroupMemberView->contactManager()->saveContact(mGroupContact); - mGroupMemberView->mGroupContact = mGroupContact; - - mContact = new QContact(); - mContact->setType(QContactType::TypeGroup); - mGroupMemberView->contactManager()->saveContact(mContact); - - QContactRelationship relationship; - relationship.setRelationshipType(QContactRelationship::HasMember); - relationship.setFirst(mGroupContact->id()); - relationship.setSecond(mContact->id()); - mGroupMemberView->contactManager()->saveRelationship(&relationship); - - // delete the group - mGroupMemberView->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 = mGroupMemberView->contactManager()->contacts(groupFilter); - int count = groupContactIds.count(); - - // check presence - QVERIFY(count >= 1); - - -} -void TestCntGroupMemberView::removeFromGroup() -{ - - // 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->removeFromGroup(index); - - // retrieve contcats in the relationship and check if it is empty - QList retrieveList; - retrieveList = mGroupMemberView->contactManager()->relationships(firstGroup.id(), QContactRelationshipFilter::First); - QVERIFY(retrieveList.count() != 0); - -} - -void TestCntGroupMemberView::handleExecutedCommand() -{ - mGroupMemberView->handleExecutedCommand("delete", QContact()); - //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); -} - -void TestCntGroupMemberView::addActionsToToolBar() -{ - HbStubHelper::reset(); - mGroupMemberView->addActionsToToolBar(); - 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() -{ - - // create a contact - QContact firstContact; - firstContact.setType(QContactType::TypeContact); - mGroupMemberView->contactManager()->saveContact(&firstContact); - - - QModelIndex index = mGroupMemberView->contactModel()->indexOfContact(firstContact); - - HbStubHelper::reset(); - //mGroupMemberView->onLongPressed(mGroupMemberView->listView()->itemByIndex(index), QPointF()); - //QVERIFY(HbStubHelper::widgetActionsCount() == 2); - -} - -void TestCntGroupMemberView::onListViewActivated() -{ - - // create a contact - QContact firstContact; - firstContact.setType(QContactType::TypeContact); - mGroupMemberView->contactManager()->saveContact(&firstContact); - - QModelIndex index = mGroupMemberView->contactModel()->indexOfContact(firstContact); - - mGroupMemberView->onListViewActivated(index); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::commLauncherView); - - -} - - -void TestCntGroupMemberView::editGroup() -{ - // 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->editGroup(); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::groupEditorView); -} - -void TestCntGroupMemberView::activateView() -{ - CntViewParameters params(CntViewParameters::groupMemberView); - - // create a group - QContact firstGroup; - firstGroup.setType(QContactType::TypeGroup); - QContactName firstGroupName; - firstGroupName.setCustomLabel("groupname"); - firstGroup.saveDetail(&firstGroupName); - mGroupMemberView->contactManager()->saveContact(&firstGroup); - mGroupMemberView->mGroupContact = &firstGroup; - - - // create and save contact to the group - QContact firstContact; - firstContact.setType(QContactType::TypeContact); - mGroupMemberView->contactManager()->saveContact(&firstContact); - - // create another contact but dont save it to group - QContact secondContact; - secondContact.setType(QContactType::TypeContact); - mGroupMemberView->contactManager()->saveContact(&secondContact); - - // save the group - QContactRelationship relationship; - relationship.setRelationshipType(QContactRelationship::HasMember); - relationship.setFirst(firstGroup.id()); - relationship.setSecond(firstContact.id()); - - mGroupMemberView->contactManager()->saveRelationship(&relationship); - - // set contact as the group id - params.setSelectedContact(firstGroup); - - // call activate view - mGroupMemberView->activateView(params); - - // retrieve list of contacts in the relationship is done in activateView function - // check if list contains 1 contact - - QContactDetailFilter groupFilter; - groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - groupFilter.setValue(QString(QLatin1String(QContactType::TypeContact))); - - QList groupContactIds = mGroupMemberView->contactManager()->contacts(groupFilter); - - - QVERIFY(groupContactIds.count() != 0); - - -} -void TestCntGroupMemberView::cleanupTestCase() -{ - delete mViewManager; - mViewManager = 0; - mWindow->deleteLater(); - mGroupMemberView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupselectionpopup.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntgroupselectionpopup.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntimageeditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntimageeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,144 +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 "t_cntimageeditorview.h" - -#include -#include - -#include "cntimageeditorview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" - -#include "qthighway_stub_helper.h" - -void TestCntImageEditorView::initTestCase() -{ - /*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);*/ -} - -void TestCntImageEditorView::aboutToCloseView() -{ - /*QContact *contact= new QContact(); - QContactAvatar *avatar = new QContactAvatar(); - mImageEditorView->mAvatar = avatar; - mImageEditorView->mContact = contact; - - // empty image isn't saved - mImageEditorView->aboutToCloseView(); - QVERIFY(mImageEditorView->mContact->details().count() == 0); - // Spouse - avatar->setAvatar("avatar"); - mImageEditorView->aboutToCloseView(); - QVERIFY(mImageEditorView->mContact->details().count() == 1); - - delete mImageEditorView; - mImageEditorView = 0; - - mWindow->removeView(mImageEditorView); - mImageEditorView = new CntImageEditorView(mViewManager); - QVERIFY(mImageEditorView != 0);*/ -} - -void TestCntImageEditorView::activateView() -{ - // no avatar set - /*CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); // these don't matter.. - QContact contact; - params.setSelectedContact(contact); - - mImageEditorView->activateView(params); - - QVERIFY(mImageEditorView->mAvatar != 0); - QVERIFY(mImageEditorView->mAvatar->avatar().isEmpty()); - - delete mImageEditorView; - mImageEditorView = 0; - mImageEditorView = new CntImageEditorView(mViewManager); - QVERIFY(mImageEditorView != 0); - - CntViewParameters params2(CntViewParameters::namesView, CntViewParameters::collectionView); // these don't matter.. - QContact contact2; - QContactAvatar ringtone; - ringtone.setSubType(QContactAvatar::SubTypeAudioRingtone); - contact2.saveDetail(&ringtone); - QContactAvatar image; - image.setSubType(QContactAvatar::SubTypeImage); - image.setAvatar("dummypath"); - contact2.saveDetail(&image); - params2.setSelectedContact(contact2); - - mImageEditorView->activateView(params2); - - QVERIFY(mImageEditorView->mAvatar != 0); - QVERIFY(mImageEditorView->mAvatar->avatar() == "dummypath");*/ -} - -void TestCntImageEditorView::openGallery() -{ - /*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;*/ -} - -void TestCntImageEditorView::handleImageChange() -{ - /*mImageEditorView = new CntImageEditorView(mViewManager); - QVERIFY(mImageEditorView != 0); - - QContact *contact= new QContact(); - QContactAvatar *avatar = new QContactAvatar(); - avatar->setAvatar("path"); - mImageEditorView->mAvatar = avatar; - mImageEditorView->mContact = contact; - - QVariant var; - QIcon icon; - var.setValue(icon); - - mImageEditorView->handleImageChange(var); - QVERIFY(mImageEditorView->mAvatar->avatar() == "path"); - - QVariant var2; - QString temp("test"); - var2.setValue(temp); - - mImageEditorView->handleImageChange(var2); - QVERIFY(mImageEditorView->mAvatar->avatar() == "test");*/ -} - -void TestCntImageEditorView::cleanupTestCase() -{ - /*mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mImageEditorView; - mImageEditorView = 0;*/ -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmainwindow.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmainwindow.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +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 - -#include "cntmainwindow.h" -#include "t_cntmainwindow.h" - - -void TestCntMainWindow::initTestCase() -{ - mWindow = 0; -} - -void TestCntMainWindow::create() -{ - mWindow = new CntMainWindow(); - QVERIFY(mWindow != 0); - QVERIFY(mWindow->mViewManager != 0); - mWindow = new CntMainWindow(0, CntViewParameters::noView); - QVERIFY(mWindow != 0); - QVERIFY(mWindow->mViewManager == 0); -} - -void TestCntMainWindow::keyPressEvent() -{ - QSignalSpy spy(mWindow, SIGNAL(keyPressed(QKeyEvent*))); - - QKeyEvent event(QEvent::KeyPress, Qt::Key_5, Qt::NoModifier); - mWindow->keyPressEvent(&event); - QCOMPARE(spy.count(), 0); - QKeyEvent event2(QEvent::KeyRelease, Qt::Key_5, Qt::NoModifier); - - QKeyEvent event3(QEvent::KeyPress, Qt::Key_Yes, Qt::NoModifier); - mWindow->keyPressEvent(&event3); - QCOMPARE(spy.count(), 1); - QKeyEvent event4(QEvent::KeyRelease, Qt::Key_Yes, Qt::NoModifier); - - QKeyEvent event5(QEvent::KeyPress, Qt::Key_No, Qt::NoModifier); - mWindow->keyPressEvent(&event5); - QCOMPARE(spy.count(), 2); - QKeyEvent event6(QEvent::KeyRelease, Qt::Key_No, Qt::NoModifier); -} - -void TestCntMainWindow::cleanupTestCase() -{ - mWindow->deleteLater(); -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmodelprovider.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmodelprovider.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/* -* Copyright (c) 2008 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 "cntmodelprovider.h" -#include "t_cntmodelprovider.h" - -void TestCntModelProvider::initTestCase() -{ - mModelProvider = 0; -} - - -void TestCntModelProvider::instance() -{ - mModelProvider = CntModelProvider::instance(); - QVERIFY(mModelProvider != 0); - - int refcount = mModelProvider->referenceCount(); - QVERIFY(refcount == 1); - mModelProvider->release(); -} - -void TestCntModelProvider::twoInstances() -{ - mModelProvider = 0; - QVERIFY(mModelProvider == 0); - mModelProvider = CntModelProvider::instance(); - QVERIFY(mModelProvider != 0); - int refcount = mModelProvider->referenceCount(); - QVERIFY(refcount == 1); - - - CntModelProvider *provider = 0; - provider = CntModelProvider::instance(); - - refcount = mModelProvider->referenceCount(); - QVERIFY(refcount == 2); - - - mModelProvider->release(); - - refcount = mModelProvider->referenceCount(); - QVERIFY(refcount == 1); - - provider->release(); -} - -void TestCntModelProvider::release() -{ - mModelProvider = 0; - QVERIFY(mModelProvider == 0); - mModelProvider = CntModelProvider::instance(); - QVERIFY(mModelProvider != 0); - int refcount = mModelProvider->referenceCount(); - QVERIFY(refcount == 1); - mModelProvider->release(); -} - -void TestCntModelProvider::contactModel() -{ - mModelProvider = 0; - QVERIFY(mModelProvider == 0); - mModelProvider = CntModelProvider::instance(); - QVERIFY(mModelProvider != 0); - int refcount = mModelProvider->referenceCount(); - QVERIFY(refcount == 1); - MobCntModel *model = mModelProvider->contactModel(); - QVERIFY(model != 0); - MobCntModel *otherModel = mModelProvider->contactModel(); - QVERIFY(model == otherModel); - mModelProvider->release(); -} - -void TestCntModelProvider::contactManager() -{ - mModelProvider = 0; - QVERIFY(mModelProvider == 0); - mModelProvider = CntModelProvider::instance(); - QVERIFY(mModelProvider != 0); - int refcount = mModelProvider->referenceCount(); - QVERIFY(refcount == 1); - QContactManager *manager = mModelProvider->contactManager(); - QVERIFY(manager != 0); - QContactManager *othermanager = mModelProvider->contactManager(); - QVERIFY(manager == othermanager); - mModelProvider->release(); -} - -void TestCntModelProvider::contactSimManager() -{ - mModelProvider = 0; - QVERIFY(mModelProvider == 0); - mModelProvider = CntModelProvider::instance(); - QVERIFY(mModelProvider != 0); - int refcount = mModelProvider->referenceCount(); - QVERIFY(refcount == 1); - QContactManager *manager = mModelProvider->contactSimManager(); - QVERIFY(manager != 0); - QContactManager *othermanager = mModelProvider->contactSimManager(); - QVERIFY(manager == othermanager); - mModelProvider->release(); -} - -void TestCntModelProvider::cleanupTestCase() -{ - -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardselectionview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +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 "t_cntmycardselectionview.h" -#include "cntmycardselectionview.h" - -#include -#include - -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" - -void TestCntMyCardSelectionView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mMyCardSelectionView = 0; -} - -void TestCntMyCardSelectionView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mMyCardSelectionView = new CntMyCardSelectionView(mViewManager, 0); - mWindow->addView(mMyCardSelectionView); - mWindow->setCurrentView(mMyCardSelectionView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mMyCardSelectionView != 0); -} - -void TestCntMyCardSelectionView::aboutToCloseView() -{ - CntViewParameters args; - mViewManager->back( args ); - - mMyCardSelectionView->aboutToCloseView(); - //QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::collectionView); this can't be right anyways? -} - -void TestCntMyCardSelectionView::onListViewActivated() -{ - delete mMyCardSelectionView; - mMyCardSelectionView = 0; - - mMyCardSelectionView = new CntMyCardSelectionView(mViewManager, 0); - mWindow->addView(mMyCardSelectionView); - mWindow->setCurrentView(mMyCardSelectionView); - - QList ids = mMyCardSelectionView->contactManager()->contacts(); - mMyCardSelectionView->contactManager()->removeContacts(&ids); - - QContact contact; - QContactName name; - name.setFirst("first"); - contact.saveDetail(&name); - mMyCardSelectionView->contactManager()->saveContact(&contact); - - QModelIndex empty = mMyCardSelectionView->contactModel()->index(100); - - mMyCardSelectionView->onListViewActivated(empty); - QVERIFY(static_cast(mWindow->currentView())->viewId() == CntViewParameters::myCardSelectionView); - - QModelIndex notEmpty = mMyCardSelectionView->contactModel()->indexOfContact(contact); - - mMyCardSelectionView->onListViewActivated(notEmpty); - - QVERIFY(mMyCardSelectionView->contactManager()->selfContactId() == contact.localId()); -} - -void TestCntMyCardSelectionView::cleanupTestCase() -{ - delete mViewManager; - mViewManager = 0; - mWindow->deleteLater(); -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntmycardview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +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 - -#include "cntmycardview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" - -#include "hbstubs_helper.h" - -#include "t_cntmycardview.h" - -void TestCntMyCardView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mMyCardView = 0; -} - -void TestCntMyCardView::createClasses() -{ -// 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()); -} - -void TestCntMyCardView::openNameEditor() -{ -// 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); -} - -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); -} - -void TestCntMyCardView::cleanupTestCase() -{ -// delete mViewManager; -// mViewManager = 0; -// mWindow->deleteLater(); -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnameseditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnameseditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,151 +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 "cntnameseditorview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntnameseditorview.h" - -void TestCntNamesEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mNamesEditorView = 0; -} - -void TestCntNamesEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mNamesEditorView = new CntNamesEditorView(mViewManager, 0); - mWindow->addView(mNamesEditorView); - mWindow->setCurrentView(mNamesEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mNamesEditorView != 0); -} - -void TestCntNamesEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactName *name = new QContactName(); - QContactNickname *nickName = new QContactNickname(); - - mNamesEditorView->mDetailList.append(name); - mNamesEditorView->mDetailList.append(nickName); - mNamesEditorView->mContact = contact; - - // empty detail isn't saved - mNamesEditorView->aboutToCloseView(); - QVERIFY(mNamesEditorView->mContact->details().count() == 0); - - // First name - name->setFirst("First"); - mNamesEditorView->aboutToCloseView(); - QVERIFY(mNamesEditorView->mContact->details().count() == 1); - name->setFirst(""); - - // Last name - name->setLast("Last"); - mNamesEditorView->aboutToCloseView(); - QVERIFY(mNamesEditorView->mContact->details().count() == 1); - name->setLast(""); - - // Middle name - name->setMiddle("Middle"); - mNamesEditorView->aboutToCloseView(); - QVERIFY(mNamesEditorView->mContact->details().count() == 1); - name->setMiddle(""); - - // Name Prefix - name->setPrefix("Prefix"); - mNamesEditorView->aboutToCloseView(); - QVERIFY(mNamesEditorView->mContact->details().count() == 1); - name->setPrefix(""); - - // Name Suffix - name->setSuffix("Suffix"); - mNamesEditorView->aboutToCloseView(); - QVERIFY(mNamesEditorView->mContact->details().count() == 1); - name->setSuffix(""); - - // NickName - nickName->setNickname("Nickname"); - mNamesEditorView->aboutToCloseView(); - QVERIFY(mNamesEditorView->mContact->details().count() == 1); - nickName->setNickname(""); - - mWindow->removeView(mNamesEditorView); - delete mNamesEditorView; - mNamesEditorView = 0; -} - -void TestCntNamesEditorView::initializeForm() -{ - mNamesEditorView = new CntNamesEditorView(mViewManager, 0); - QContact *contact= new QContact; - // create without name and nickname - mNamesEditorView->mContact = contact; - mNamesEditorView->initializeForm(); - - //Check count is 6 - QVERIFY(mNamesEditorView->formModel()->rowCount(QModelIndex()) == 6); - delete mNamesEditorView; - mNamesEditorView = 0; -} - -void TestCntNamesEditorView::initializeFormData() -{ - mNamesEditorView = new CntNamesEditorView(mViewManager, 0); - QContactName *name = new QContactName(); - QContactNickname *nickName = new QContactNickname(); - - name->setFirst("First"); - name->setLast("Last"); - name->setMiddle("Middle"); - name->setPrefix("Prefix"); - name->setSuffix("Suffix"); - nickName->setNickname("Nick"); - - QContact *contact= new QContact; - - contact->saveDetail(name); - contact->saveDetail(nickName); - - mNamesEditorView->mContact = contact; - - mNamesEditorView->initializeForm(); - QVERIFY(mNamesEditorView->formModel()->rowCount(QModelIndex()) == 6); - -} - -void TestCntNamesEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mNamesEditorView; - mNamesEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnavigator.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnavigator.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +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 "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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnoteeditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntnoteeditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,163 +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 "cntnoteeditorview.h" -#include "cntviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntnoteeditorview.h" - -void TestCntNoteEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mNoteEditorView = 0; -} - -void TestCntNoteEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntViewManager(mWindow, CntViewParameters::noView); - mNoteEditorView = new CntNoteEditorView(mViewManager, 0); - mWindow->addView(mNoteEditorView); - mWindow->setCurrentView(mNoteEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mNoteEditorView != 0); -} - -void TestCntNoteEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactNote *note = new QContactNote(); - mNoteEditorView->mDetailList.append(note); - mNoteEditorView->mContact = contact; - - // empty detail isn't saved - mNoteEditorView->aboutToCloseView(); - QVERIFY(mNoteEditorView->mContact->details().count() == 0); - - // Note field - note->setNote("Note"); - mNoteEditorView->aboutToCloseView(); - QVERIFY(mNoteEditorView->mContact->details().count() == 1); - note->setNote(""); - - mWindow->removeView(mNoteEditorView); - delete mNoteEditorView; - mNoteEditorView = 0; -} - - -void TestCntNoteEditorView::initializeForm() -{ - mNoteEditorView = new CntNoteEditorView(mViewManager, 0); - QContact *contact= new QContact; - // create without data - mNoteEditorView->mContact = contact; - mNoteEditorView->initializeForm(); - - //Check count - QVERIFY(mNoteEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mNoteEditorView; - mNoteEditorView = 0; -} - -void TestCntNoteEditorView::initializeFormAdd() -{ - QContact *contact= new QContact; - mNoteEditorView = new CntNoteEditorView(mViewManager, 0); - mNoteEditorView->mContact = contact; - - QContactNote *note = new QContactNote(); - note->setNote("Note"); - contact->saveDetail(note); - - mNoteEditorView->mParamString = "add"; - mNoteEditorView->initializeForm(); - - //Check count - QVERIFY(mNoteEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mNoteEditorView; - mNoteEditorView = 0; -} - -void TestCntNoteEditorView::initializeFormFocusSecond() -{ - QContact *contact= new QContact; - mNoteEditorView = new CntNoteEditorView(mViewManager, 0); - mNoteEditorView->mContact = contact; - - QContactNote *note = new QContactNote(); - note->setNote("Note"); - contact->saveDetail(note); - - QContactNote *note2 = new QContactNote(); - note->setNote("Note2"); - contact->saveDetail(note2); - - mNoteEditorView->mParamString = "1"; // focus the second one, not verifiable tho - mNoteEditorView->initializeForm(); - - //Check count - QVERIFY(mNoteEditorView->formModel()->rowCount(QModelIndex()) == 3); - delete mNoteEditorView; - mNoteEditorView = 0; -} - -void TestCntNoteEditorView::initializeFormData() - -{ // create with data - mNoteEditorView = new CntNoteEditorView(mViewManager, 0); - QContactNote *note = new QContactNote(); - note->setNote("Note"); - - QContact *contact= new QContact; - - contact->saveDetail(note); - - - mNoteEditorView->mContact = contact; - - mNoteEditorView->initializeForm(); - QVERIFY(mNoteEditorView->formModel()->rowCount(QModelIndex()) == 2); - -} - -void TestCntNoteEditorView::addDetail() -{ - mNoteEditorView->addDetail(); - QVERIFY(mNoteEditorView->formModel()->rowCount(QModelIndex()) == 3); -} - -void TestCntNoteEditorView::cleanupTestCase() -{ - delete mWindow; - mWindow = 0; - delete mViewManager; - mViewManager = 0; - delete mNoteEditorView; - mNoteEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntonlineaccounteditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntonlineaccounteditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,171 +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 "cntonlineaccounteditorview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntonlineaccounteditorview.h" - -void TestCntOnlineAccountEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mOnlineAccountEditorView = 0; -} - -void TestCntOnlineAccountEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mOnlineAccountEditorView = new CntOnlineAccountEditorView(mViewManager, 0); - mWindow->addView(mOnlineAccountEditorView); - mWindow->setCurrentView(mOnlineAccountEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mOnlineAccountEditorView != 0); -} - -void TestCntOnlineAccountEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactOnlineAccount *onlineAccount = new QContactOnlineAccount(); - mOnlineAccountEditorView->mDetailList.append(onlineAccount); - mOnlineAccountEditorView->mContact = contact; - - // empty detail isn't saved - mOnlineAccountEditorView->aboutToCloseView(); - QVERIFY(mOnlineAccountEditorView->mContact->details().count() == 0); - - // Online Account name set - onlineAccount->setAccountUri("Test Account"); - mOnlineAccountEditorView->aboutToCloseView(); - QVERIFY(mOnlineAccountEditorView->mContact->details().count() == 1); - onlineAccount->setAccountUri(""); - - mWindow->removeView(mOnlineAccountEditorView); - delete mOnlineAccountEditorView; - mOnlineAccountEditorView = 0; -} - -void TestCntOnlineAccountEditorView::itemModel() -{ - mOnlineAccountEditorView = new CntOnlineAccountEditorView(mViewManager, 0); - QStandardItemModel *itemModel = new QStandardItemModel(); - QContact *contact= new QContact; - - mOnlineAccountEditorView->mContact = contact; - itemModel = mOnlineAccountEditorView->itemModel(); - QVERIFY(itemModel->rowCount(QModelIndex()) == 5 ); -} - -void TestCntOnlineAccountEditorView::initializeForm() -{ - mOnlineAccountEditorView->initializeForm(); - - //Check count - QVERIFY(mOnlineAccountEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mOnlineAccountEditorView; - mOnlineAccountEditorView = 0; -} - -void TestCntOnlineAccountEditorView::initializeFormAdd() -{ - QContact *contact= new QContact; - mOnlineAccountEditorView = new CntOnlineAccountEditorView(mViewManager, 0); - mOnlineAccountEditorView->mContact = contact; - - QContactOnlineAccount *onlineAccount = new QContactOnlineAccount(); - onlineAccount->setAccountUri("Test Account"); - onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - contact->saveDetail(onlineAccount); - - mOnlineAccountEditorView->mParamString = "add"; - mOnlineAccountEditorView->initializeForm(); - - //Check count - QVERIFY(mOnlineAccountEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mOnlineAccountEditorView; - mOnlineAccountEditorView = 0; -} - -void TestCntOnlineAccountEditorView::initializeFormFocusSecond() -{ - QContact *contact= new QContact; - mOnlineAccountEditorView = new CntOnlineAccountEditorView(mViewManager, 0); - mOnlineAccountEditorView->mContact = contact; - - QContactOnlineAccount *onlineAccount = new QContactOnlineAccount(); - onlineAccount->setAccountUri("Test Account"); - onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - contact->saveDetail(onlineAccount); - - QContactOnlineAccount *onlineAccount2 = new QContactOnlineAccount(); - onlineAccount2->setAccountUri("Test Account 2"); - onlineAccount2->setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - contact->saveDetail(onlineAccount2); - - mOnlineAccountEditorView->mParamString = "1"; // focus the second one, not verifiable tho - mOnlineAccountEditorView->initializeForm(); - - //Check count - QVERIFY(mOnlineAccountEditorView->formModel()->rowCount(QModelIndex()) == 3); - delete mOnlineAccountEditorView; - mOnlineAccountEditorView = 0; -} - -void TestCntOnlineAccountEditorView::initializeFormData() - -{ // create with onlineaccount address - QContact *contact= new QContact; - mOnlineAccountEditorView = new CntOnlineAccountEditorView(mViewManager, 0); - mOnlineAccountEditorView->mContact = contact; - - QContactOnlineAccount *onlineAccount = new QContactOnlineAccount(); - onlineAccount->setAccountUri("Test Account"); - onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - - contact->saveDetail(onlineAccount); - - mOnlineAccountEditorView->initializeForm(); - QVERIFY(mOnlineAccountEditorView->formModel()->rowCount(QModelIndex()) == 2); - -} - -void TestCntOnlineAccountEditorView::addDetail() -{ - mOnlineAccountEditorView->addDetail(); - QVERIFY(mOnlineAccountEditorView->formModel()->rowCount(QModelIndex()) == 3); -} - - -void TestCntOnlineAccountEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mOnlineAccountEditorView; - mOnlineAccountEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntphonenumbereditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntphonenumbereditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "cntphonenumbereditorview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "t_cntphonenumbereditorview.h" - -void TestCntPhoneNumberEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mPhoneNumberEditorView = 0; -} - -void TestCntPhoneNumberEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mPhoneNumberEditorView = new CntPhoneNumberEditorView(mViewManager, 0); - mWindow->addView(mPhoneNumberEditorView); - mWindow->setCurrentView(mPhoneNumberEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mPhoneNumberEditorView != 0); -} - -void TestCntPhoneNumberEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactPhoneNumber *number = new QContactPhoneNumber(); - mPhoneNumberEditorView->mDetailList.append(number); - mPhoneNumberEditorView->mContact = contact; - - // empty detail isn't saved - mPhoneNumberEditorView->aboutToCloseView(); - QVERIFY(mPhoneNumberEditorView->mContact->details().count() == 0); - - // Phone Number field set - number->setNumber("123456789"); - mPhoneNumberEditorView->aboutToCloseView(); - QVERIFY(mPhoneNumberEditorView->mContact->details().count() == 1); - number->setNumber(""); - - mWindow->removeView(mPhoneNumberEditorView); - delete mPhoneNumberEditorView; - mPhoneNumberEditorView = 0; -} - -void TestCntPhoneNumberEditorView::itemModel() -{ - mPhoneNumberEditorView = new CntPhoneNumberEditorView(mViewManager, 0); - QStandardItemModel *itemModel = new QStandardItemModel(); - QContact *contact= new QContact(); - - mPhoneNumberEditorView->mContact = contact; - itemModel = mPhoneNumberEditorView->itemModel(); - QVERIFY(itemModel->rowCount(QModelIndex()) == 13 ); -} - -void TestCntPhoneNumberEditorView::initializeForm() -{ - mPhoneNumberEditorView->initializeForm(); - - //Check count - QVERIFY(mPhoneNumberEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mPhoneNumberEditorView; - mPhoneNumberEditorView = 0; -} - -void TestCntPhoneNumberEditorView::initializeFormAdd() -{ - QContact *contact= new QContact; - mPhoneNumberEditorView = new CntPhoneNumberEditorView(mViewManager, 0); - mPhoneNumberEditorView->mContact = contact; - - QContactPhoneNumber *number = new QContactPhoneNumber(); - number->setNumber("123456789"); - number->setSubTypes(QContactPhoneNumber::SubTypeMobile); - contact->saveDetail(number); - - mPhoneNumberEditorView->mParamString = "add"; - mPhoneNumberEditorView->initializeForm(); - - //Check count - QVERIFY(mPhoneNumberEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mPhoneNumberEditorView; - mPhoneNumberEditorView = 0; -} - -void TestCntPhoneNumberEditorView::initializeFormFocusSecond() -{ - QContact *contact= new QContact; - mPhoneNumberEditorView = new CntPhoneNumberEditorView(mViewManager, 0); - mPhoneNumberEditorView->mContact = contact; - - QContactPhoneNumber *number = new QContactPhoneNumber(); - number->setNumber("123456789"); - number->setSubTypes(QContactPhoneNumber::SubTypeMobile); - contact->saveDetail(number); - - QContactPhoneNumber *number2 = new QContactPhoneNumber(); - number2->setNumber("987654321"); - number2->setSubTypes(QContactPhoneNumber::SubTypeMobile); - contact->saveDetail(number2); - - mPhoneNumberEditorView->mParamString = "1"; // focus the second one, not verifiable tho - mPhoneNumberEditorView->initializeForm(); - - //Check count - QVERIFY(mPhoneNumberEditorView->formModel()->rowCount(QModelIndex()) == 3); - delete mPhoneNumberEditorView; - mPhoneNumberEditorView = 0; -} - -void TestCntPhoneNumberEditorView::initializeFormData() -{ - QContact *contact= new QContact; - mPhoneNumberEditorView = new CntPhoneNumberEditorView(mViewManager, 0); - mPhoneNumberEditorView->mContact = contact; - - QContactPhoneNumber *number = new QContactPhoneNumber(); - number->setNumber("123456789"); - number->setSubTypes(QContactPhoneNumber::SubTypeMobile); - - contact->saveDetail(number); - - mPhoneNumberEditorView->initializeForm(); - QVERIFY(mPhoneNumberEditorView->formModel()->rowCount(QModelIndex()) == 2); -} - -void TestCntPhoneNumberEditorView::addDetail() -{ - mPhoneNumberEditorView->addDetail(); - QVERIFY(mPhoneNumberEditorView->formModel()->rowCount(QModelIndex()) == 3); -} - -void TestCntPhoneNumberEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mPhoneNumberEditorView; - mPhoneNumberEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntsnapshotwidget.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntsnapshotwidget.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +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 - -#include "cntsnapshotwidget.h" -#include "t_cntsnapshotwidget.h" - - -void TestCntSnapshotWidget::initTestCase() -{ - mSnap = 0; -} - -void TestCntSnapshotWidget::create() -{ - mSnap = new CntSnapshotWidget(); -} - -void TestCntSnapshotWidget::capture() -{ - delete mSnap; - mSnap = 0; - - create(); - - QGraphicsView *graphicsView = new QGraphicsView(); - HbView *view = new HbView(); - - mSnap->capture(graphicsView, view); - QVERIFY(mSnap->mSnapshot); - - mSnap->capture(graphicsView, view); - QVERIFY(mSnap->mSnapshot); - - delete graphicsView; - delete view; -} - -void TestCntSnapshotWidget::cleanupTestCase() -{ - delete mSnap; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnturleditorview.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cnturleditorview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +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 "cnturleditorview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "t_cnturleditorview.h" - -void TestCntUrlEditorView::initTestCase() -{ - mWindow = 0; - mViewManager = 0; - mUrlEditorView = 0; -} - -void TestCntUrlEditorView::createClasses() -{ - mWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mWindow, CntViewParameters::noView); - mUrlEditorView = new CntUrlEditorView(mViewManager, 0); - mWindow->addView(mUrlEditorView); - mWindow->setCurrentView(mUrlEditorView); - - // check that we have a view - QVERIFY(mWindow != 0); - QVERIFY(mViewManager != 0); - QVERIFY(mUrlEditorView != 0); -} - -void TestCntUrlEditorView::aboutToCloseView() -{ - QContact *contact= new QContact(); - QContactUrl *url = new QContactUrl(); - mUrlEditorView->mDetailList.append(url); - mUrlEditorView->mContact = contact; - - // empty detail isn't saved - mUrlEditorView->aboutToCloseView(); - QVERIFY(mUrlEditorView->mContact->details().count() == 0); - - // Url field set - url->setUrl("http://www.testurl.net"); - mUrlEditorView->aboutToCloseView(); - QVERIFY(mUrlEditorView->mContact->details().count() == 1); - url->setUrl(""); - - mWindow->removeView(mUrlEditorView); - delete mUrlEditorView; - mUrlEditorView = 0; -} - -void TestCntUrlEditorView::itemModel() -{ - mUrlEditorView = new CntUrlEditorView(mViewManager, 0); - QStandardItemModel *itemModel = new QStandardItemModel(); - QContact *contact= new QContact; - - mUrlEditorView->mContact = contact; - itemModel = mUrlEditorView->itemModel(); - QVERIFY(itemModel->rowCount(QModelIndex()) == 3 ); -} - -void TestCntUrlEditorView::initializeForm() -{ - mUrlEditorView->initializeForm(); - - //Check count - QVERIFY(mUrlEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mUrlEditorView; - mUrlEditorView = 0; -} - -void TestCntUrlEditorView::initializeFormAdd() -{ - QContact *contact= new QContact; - mUrlEditorView = new CntUrlEditorView(mViewManager, 0); - mUrlEditorView->mContact = contact; - - QContactUrl *url = new QContactUrl(); - url->setUrl("http://www.testurl.net"); - contact->saveDetail(url); - - mUrlEditorView->mParamString = "add"; - mUrlEditorView->initializeForm(); - - //Check count - QVERIFY(mUrlEditorView->formModel()->rowCount(QModelIndex()) == 2); - delete mUrlEditorView; - mUrlEditorView = 0; -} - -void TestCntUrlEditorView::initializeFormFocusSecond() -{ - QContact *contact= new QContact; - mUrlEditorView = new CntUrlEditorView(mViewManager, 0); - mUrlEditorView->mContact = contact; - - QContactUrl *url = new QContactUrl(); - url->setUrl("http://www.testurl.net"); - contact->saveDetail(url); - - QContactUrl *url2 = new QContactUrl(); - url2->setUrl("http://www.testurl2.com"); - contact->saveDetail(url2); - - mUrlEditorView->mParamString = "1"; // focus the second one, not verifiable tho - mUrlEditorView->initializeForm(); - - //Check count - QVERIFY(mUrlEditorView->formModel()->rowCount(QModelIndex()) == 3); - delete mUrlEditorView; - mUrlEditorView = 0; -} - -void TestCntUrlEditorView::initializeFormData() -{ - QContact *contact= new QContact; - mUrlEditorView = new CntUrlEditorView(mViewManager, 0); - mUrlEditorView->mContact = contact; - - QContactUrl *url = new QContactUrl(); - url->setUrl("http://www.testurl.net"); - - contact->saveDetail(url); - - mUrlEditorView->initializeForm(); - QVERIFY(mUrlEditorView->formModel()->rowCount(QModelIndex()) == 2); -} - -void TestCntUrlEditorView::addDetail() -{ - mUrlEditorView->addDetail(); - QVERIFY(mUrlEditorView->formModel()->rowCount(QModelIndex()) == 3); -} - -void TestCntUrlEditorView::cleanupTestCase() -{ - mWindow->deleteLater(); - delete mViewManager; - mViewManager = 0; - delete mUrlEditorView; - mUrlEditorView = 0; -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewmanager.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,277 +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 "t_cntviewmanager.h" - -#include -#include - -#include "cnthistoryview.h" -#include "cntdefaultviewmanager.h" -#include "cntmainwindow.h" -#include "cntbaseview.h" - - -void TestCntViewManager::initTestCase() -{ - QContactManager manager("symbian"); - QList ids = manager.contacts(); - manager.removeContacts(&ids); - - mViewManager = 0; - mMainWindow = 0; -} - -void TestCntViewManager::createViewManager() -{ - mMainWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mMainWindow, CntViewParameters::defaultView); - - QVERIFY(mViewManager->mDefaultView == mViewManager->getView(CntViewParameters::namesView)); - // QVERIFY(mViewManager->mDefaultViewId == CntViewParameters::namesView); - // QVERIFY(mMainWindow->currentView() == mViewManager->mDefaultView); -} - -void TestCntViewManager::mainWindow() -{ - CntMainWindow *win = 0; - win = mViewManager->mainWindow(); - QVERIFY(win == mMainWindow); -} - -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); - - // 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::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()); -} - -void TestCntViewManager::onActivateViewId() -{ -// 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); -} - -void TestCntViewManager::onActivatePreviousView() -{ -// QVERIFY(static_cast(mMainWindow->currentView())->viewId() != -// CntViewParameters::myCardView); -// -// mViewManager->onActivatePreviousView(); -// -// QVERIFY(static_cast(mMainWindow->currentView())->viewId() == -// CntViewParameters::myCardView); -} - -void TestCntViewManager::addViewToWindow() -{ - delete mViewManager; - delete mMainWindow; - mViewManager = 0; - mMainWindow = 0; - - mMainWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mMainWindow, CntViewParameters::noView); - - mViewManager->addViewToWindow(0); - QVERIFY(mMainWindow->currentView() == 0); - - CntBaseView *view = new CntHistoryView(mViewManager); - - mViewManager->addViewToWindow(view); - - QVERIFY(static_cast(mMainWindow->currentView()) == view); -} - -void TestCntViewManager::removeViewFromWindow() -{ - // removing a null view doesn't change the viewCount - mViewManager->removeViewFromWindow(mViewManager->getView(CntViewParameters::noView)); - QVERIFY(mMainWindow->views().count() == 1); - - mViewManager->removeViewFromWindow(static_cast(mMainWindow->currentView())); - QVERIFY(mMainWindow->views().count() == 0); -} - -void TestCntViewManager::getView() -{ - delete mViewManager; - delete mMainWindow; - mViewManager = 0; - mMainWindow = 0; - - mMainWindow = new CntMainWindow(0, CntViewParameters::noView); - mViewManager = new CntDefaultViewManager(mMainWindow, CntViewParameters::noView); - - CntBaseView *view = mViewManager->getView(CntViewParameters::commLauncherView); - QVERIFY(view->viewId() == CntViewParameters::commLauncherView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::emailEditorView); - QVERIFY(view->viewId() == CntViewParameters::emailEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::namesEditorView); - QVERIFY(view->viewId() == CntViewParameters::namesEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::urlEditorView); - QVERIFY(view->viewId() == CntViewParameters::urlEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::companyEditorView); - QVERIFY(view->viewId() == CntViewParameters::companyEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::phoneNumberEditorView); - QVERIFY(view->viewId() == CntViewParameters::phoneNumberEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::onlineAccountEditorView); - QVERIFY(view->viewId() == CntViewParameters::onlineAccountEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::noteEditorView); - QVERIFY(view->viewId() == CntViewParameters::noteEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::familyDetailEditorView); - QVERIFY(view->viewId() == CntViewParameters::familyDetailEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::addressEditorView); - QVERIFY(view->viewId() == CntViewParameters::addressEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::dateEditorView); - QVERIFY(view->viewId() == CntViewParameters::dateEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::editView); - QVERIFY(view->viewId() == CntViewParameters::editView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::myCardSelectionView); - QVERIFY(view->viewId() == CntViewParameters::myCardSelectionView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::groupEditorView); - QVERIFY(view->viewId() == CntViewParameters::groupEditorView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::groupMemberView); - QVERIFY(view->viewId() == CntViewParameters::groupMemberView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::groupActionsView); - QVERIFY(view->viewId() == CntViewParameters::groupActionsView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::historyView); - QVERIFY(view->viewId() == CntViewParameters::historyView); - delete view; - view = 0; - - view = mViewManager->getView(CntViewParameters::noView); - QVERIFY(view == 0); - - mViewManager->setDefaultView(CntViewParameters::namesView); - view = mViewManager->getView(CntViewParameters::namesView); - QVERIFY(view == mViewManager->getView(CntViewParameters::namesView)); -} - -void TestCntViewManager::cleanupTestCase() -{ - delete mViewManager; - delete mMainWindow; -} - -//EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewparameters.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_cntviewparameters.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 "cntviewparameters.h" -#include "t_cntviewparameters.h" - - -void TestCntViewParameters::initTestCase() -{ - -} - -void TestCntViewParameters::create() -{ - CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); - QVERIFY(params.nextViewId() == CntViewParameters::namesView); - QVERIFY(params.previousViewId() == CntViewParameters::collectionView); - - CntViewParameters secondParams(params); - QVERIFY(secondParams.nextViewId() == params.nextViewId()); - QVERIFY(secondParams.previousViewId() == params.previousViewId()); -} - -void TestCntViewParameters::setNextViewId() -{ - //CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); - //params.setNextViewId(CntViewParameters::editView); - //QVERIFY(params.nextViewId() == CntViewParameters::editView); -} - -void TestCntViewParameters::setPreviousViewId() -{ - CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); - params.setPreviousViewId(CntViewParameters::editView); - QVERIFY(params.previousViewId() == CntViewParameters::editView); -} - -void TestCntViewParameters::selectedContact() -{ - CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); - params.setSelectedContact(mContact); - QVERIFY(params.selectedContact() == mContact); - - params.setSelectedContact(mSecondContact); - QVERIFY(params.selectedContact() == mSecondContact); -} - -void TestCntViewParameters::selectedDetail() -{ - QContactDetail detail; - QContactDetail otherDetail; - CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); - params.setSelectedDetail(detail); - QVERIFY(params.selectedDetail() == detail); - - params.setSelectedDetail(otherDetail); - QVERIFY(params.selectedDetail() == otherDetail); -} - -void TestCntViewParameters::selectedGroupContact() -{ - CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); - params.setSelectedGroupContact(mContact); - QVERIFY(params.selectedGroupContact() == mContact); - - params.setSelectedGroupContact(mSecondContact); - QVERIFY(params.selectedGroupContact() == mSecondContact); -} - -void TestCntViewParameters::selectedAction() -{ - CntViewParameters params(CntViewParameters::namesView, CntViewParameters::collectionView); - params.setSelectedAction("test"); - QVERIFY(params.selectedAction() == "test"); -} - -void TestCntViewParameters::cleanupTestCase() -{ - -} - -// EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_companyeditor.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_companyeditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_dateeditor.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_dateeditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_emaileditor.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_emaileditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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. -* 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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_familyeditor.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_familyeditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +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 "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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_nameeditor.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_nameeditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +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 "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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_namelist.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_namelist.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +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 "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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_noteeditor.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_noteeditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +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 "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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_numbereditor.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_numbereditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,180 +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 "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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_urleditor.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/t_urleditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,176 +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 "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 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/testrunner.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/src/testrunner.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,176 +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 "testrunner.h" -#include -#include -#include - -const char testFunctionElement[] = "TestFunction"; -const char incidentElement[] = "Incident"; -const char descriptionElement[] = "Description"; -const char nameAttr[] = "name"; -const char typeAttr[] = "type"; -const char fileAttr[] = "file"; -const char lineAttr[] = "line"; -const char attrValueFail[] = "fail"; - - -TestRunner::TestRunner(const QString& name) -: mTestCount(0), - mParsingIncidentElement(false), - mParsingDescriptionElement(false), - mCurrentTestFailed(false), - mCurrentTestFailureLine(0) -{ - mTestRunParams.append(name); - mTestRunParams.append("-xml"); - mTestRunParams.append("-o"); - mHomeDir = QDir::homePath(); - mTestRunParams.append(QString()); // Initial result file name - - if (!mHomeDir.endsWith(QString::fromAscii("/"))) - mHomeDir += QString::fromAscii("/"); -} - -TestRunner::~TestRunner() -{ -} - -int TestRunner::runTests(QObject& testObject) -{ - QString className(testObject.metaObject()->className()); - printf("Running tests for %s ... ", className.toUtf8().data()); - QString resultFileName = mHomeDir + className + ".xml"; - mTestRunParams.replace(mTestRunParams.count()-1,resultFileName); - int errorsBefore = mErrors.count(); - int error = QTest::qExec(&testObject, mTestRunParams); - parse(resultFileName); - printf("Failures: %d\n",mErrors.count()-errorsBefore); - fflush(stdout); - return error; -} - -void TestRunner::printResults() -{ - printf("\nTests executed: %d\n",mTestCount); - if (mErrors.count() > 0) { - printf("Failures (%d):\n", mErrors.count()); - foreach(QString error, mErrors) { - printf("\n%s", error.toUtf8().data()); - } - printf("\n"); - } else { - 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) -{ - QFile file(fileName); - QXmlInputSource inputSource(&file); - QXmlSimpleReader reader; - reader.setContentHandler(this); - reader.parse(inputSource); -} - -bool TestRunner::startElement( - const QString& /*namespaceURI*/, - const QString& /*localName*/, - const QString& qName, - const QXmlAttributes& atts) -{ - if (qName == QString::fromAscii(testFunctionElement)) { - mTestCount++; - mCurrentTestName = atts.value(QString::fromAscii(nameAttr)); - return true; - } - if (qName == QString::fromAscii(incidentElement)) { - mParsingIncidentElement = true; - if (atts.value(QString::fromAscii(typeAttr)) == QString::fromAscii(attrValueFail)) { - mCurrentTestFailed = true; - mCurrentTestFile = atts.value(QString::fromAscii(fileAttr)); - mCurrentTestFailureLine = atts.value(QString::fromAscii(lineAttr)).toInt(); - } - return true; - } - mParsingDescriptionElement = - (qName == QString::fromAscii(descriptionElement)); - return true; -} - -bool TestRunner::endElement( - const QString& /*namespaceURI*/, - const QString& /*localName*/, - const QString& qName) -{ - if (qName == QString::fromAscii(incidentElement)) { - mParsingIncidentElement = false; - mCurrentTestFailed = false; - return true; - } - if (qName == QString::fromAscii(descriptionElement)) { - mParsingDescriptionElement = false; - } - return true; -} - -bool TestRunner::characters(const QString& ch) -{ - if (mParsingIncidentElement && - mParsingDescriptionElement && - mCurrentTestFailed) { - QByteArray testResult = mCurrentTestName.toAscii() + " failed:\n"; - testResult += "File: "; - testResult += mCurrentTestFile.toAscii(); - testResult += "\n"; - testResult += "Line: "; - testResult += QByteArray::number(mCurrentTestFailureLine); - testResult += "\n"; - testResult += "Reason: "; - testResult += ch.toAscii(); - testResult += "\n"; - mErrors.append(QString::fromAscii(testResult.data())); - } - return true; -} - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/stubs/hbstubs.cpp --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/stubs/hbstubs.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,256 +0,0 @@ -/* -* 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: HbMenu2 implementation. -* -*/ - - -#include -#include -#include -#include -#include -#include "hbstubs_helper.h" -#include - -int actionCount = 0; -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; - dialogOpened = false; -} - -int HbStubHelper::widgetActionsCount() -{ - return actionCount; -} - -bool HbStubHelper::notificationDialogOpened() -{ - return dialogOpened; -} - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// - -void HbNotificationDialog::launchDialog(const QString &text, QGraphicsScene *scene) -{ - Q_UNUSED(text) - Q_UNUSED(scene) - dialogOpened = true; -} - -HbAction *HbMenu::exec(const QPointF &pos, HbAction *action ) -{ - Q_UNUSED(action) - Q_UNUSED(pos) - return 0; -} - -HbAction *HbMenu::addAction(const QString &text) -{ - Q_UNUSED(text) - actionCount++; - return new HbAction(); -} - -HbAction *HbDialog::exec() -{ - return 0; -} - -void QGraphicsWidget::addAction(QAction *action) -{ - Q_UNUSED(action) - actionCount++; -} - -void HbWidget::clearActions() -{ - actionCount = 0; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// - - -class MobHistoryModelData : public QSharedData -{ -public: - MobHistoryModelData(): QSharedData() {} - ~MobHistoryModelData() {} -}; - -MobHistoryModel::MobHistoryModel(QContactLocalId contactId, - QContactManager* manager, - QObject *parent) -: QAbstractListModel(parent) -{ - Q_UNUSED(contactId); - Q_UNUSED(manager); -} - -MobHistoryModel::~MobHistoryModel() -{ -} - -QVariant MobHistoryModel::data(const QModelIndex& index, int role) const -{ - Q_UNUSED(index); - Q_UNUSED(role); - QStringList list; - list << "title" << "message" << "time"; - return QVariant(list); -} - -int MobHistoryModel::rowCount(const QModelIndex& parent) const -{ - 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 -#include -#include -#include -#include -#include "qthighway_stub_helper.h" - -QString qtHighwayStubService; -QString qtHighwayStubMessage; -QString qtHighwayStubOperation; - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// - -void QtHighwayStubHelper::reset() -{ - qtHighwayStubService.clear(); - qtHighwayStubMessage.clear(); - qtHighwayStubOperation.clear(); -} - -QString QtHighwayStubHelper::service() -{ - return qtHighwayStubService; -} - -QString QtHighwayStubHelper::message() -{ - return qtHighwayStubMessage; -} - -QString QtHighwayStubHelper::operation() -{ - return qtHighwayStubOperation; -} -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -XQServiceProvider::XQServiceProvider( const QString& service, QObject *parent ) -{ - Q_UNUSED(service); - Q_UNUSED(parent); -} - -XQServiceProvider::~XQServiceProvider() -{ - -} - -void XQServiceProvider::SetPlugin(QObject* impl_plugin) -{ - Q_UNUSED(impl_plugin); -} - -void XQServiceProvider::publishAll() -{ - -} - -int XQServiceProvider::setCurrentRequestAsync() -{ - return 0; -} - -bool XQServiceProvider::completeRequest(int index, const QVariant& retValue) -{ - Q_UNUSED(index); - Q_UNUSED(retValue); - return true; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -XQApplicationManager::XQApplicationManager() -{ - -} - -XQApplicationManager::~XQApplicationManager() -{ - -} - -XQAiwRequest *XQApplicationManager::create(const QString& interface, const QString& operation, bool embedded) -{ - qtHighwayStubService = interface; - qtHighwayStubMessage = operation; - return 0; -} - -XQAiwRequest *XQApplicationManager::create(const QString& service, const QString& interface, const QString& operation, bool embedded) -{ - qtHighwayStubService = service; - qtHighwayStubMessage = interface; - qtHighwayStubOperation = operation; - return 0; -} - - -bool XQAiwRequest::send() -{ - return true; -} - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -XQServiceRequest::XQServiceRequest( - const QString& service, const QString& message, const bool& synchronous) -{ - qtHighwayStubService = service; - qtHighwayStubMessage = message; -} - -XQServiceRequest::~XQServiceRequest() -{ - -} - - -void XQServiceRequest::setArguments(const QList &arguments) -{ - Q_UNUSED(arguments) -} - -QString XQServiceRequest::service() const -{ - return qtHighwayStubService; -} - -QString XQServiceRequest::message() const -{ - return qtHighwayStubMessage; -} - -bool XQServiceRequest::send(QVariant& retValue) -{ - return true; -} - -bool XQServiceRequest::send() -{ - return true; -} - -void XQServiceRequest::addArg(const QVariant& v) -{ - -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/stubs/qthighway_stub_helper.h --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/stubs/qthighway_stub_helper.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +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: -* -*/ - -/** -* Helper class to control logcli stub behavior -* -*/ -class QtHighwayStubHelper{ - public: - static void reset(); - static QString service(); - static QString message(); - static QString operation(); -}; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/ut_pbkcommonui.pro --- a/phonebookui/pbkcommonui/tsrc/ut_pbkcommonui/ut_pbkcommonui.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,288 +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: -# -# - -TEMPLATE = app -TARGET = - -TARGET.EPOCSTACKSIZE = 0x40000 -TARGET.EPOCHEAPSIZE = 0x020000 0x1500000 -QT += testlib sql xml -CONFIG += hb -HB += hbcore hbwidgets hbtools hbfeedback -DEFINES += QT_NO_DEBUG_OUTPUT -DEFINES += QT_NO_WARNING_OUTPUT -DEFINES += PBK_UNIT_TEST -RESOURCES += ../../resources/pbkcommonui.qrc - -MOC_DIR = moc - -INCLUDEPATH += . -INCLUDEPATH += stubs #must be before orbit includes -INCLUDEPATH += ../../ -INCLUDEPATH += ../../inc -INCLUDEPATH += ../../../inc -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - -# Input -HEADERS += inc/testrunner.h -HEADERS += inc/t_cntactions.h -HEADERS += inc/t_addresseditor.h -HEADERS += inc/t_cntbasedetaileditorview.h -HEADERS += inc/t_cntbaselistview.h -HEADERS += inc/t_cntbaseselectionview.h -HEADERS += inc/t_cntbaseview.h -HEADERS += inc/t_cntcollectionlistmodel.h -HEADERS += inc/t_cntcollectionview.h -HEADERS += inc/t_cntcommands.h -HEADERS += inc/t_companyeditor.h -HEADERS += inc/t_cntcontactcarddatacontainer.h -HEADERS += inc/t_cntcontactcarddetailitem.h -HEADERS += inc/t_cntcontactcardheadingitem.h -HEADERS += inc/t_cntcontactcardview.h -HEADERS += inc/t_dateeditor.h -HEADERS += inc/t_cntdetailpopup.h -HEADERS += inc/t_cnteditordatamodelitem.h -HEADERS += inc/t_cnteditordataviewitem.h -HEADERS += inc/t_cnteditviewdetailitem.h -HEADERS += inc/t_cnteditviewheadingitem.h -HEADERS += inc/t_emaileditor.h -HEADERS += inc/t_familyeditor.h -HEADERS += inc/t_cntfavoritesmemberview.h -HEADERS += inc/t_cntfavoritesview.h -HEADERS += inc/t_cntgroupeditorview.h -HEADERS += inc/t_cntgroupactionsview.h -HEADERS += inc/t_cntgroupmemberview.h -HEADERS += inc/t_cntimageeditorview.h -HEADERS += inc/t_cntmainwindow.h -HEADERS += inc/t_cntmodelprovider.h -HEADERS += inc/t_cntmycardselectionview.h -HEADERS += inc/t_cntmycardview.h -HEADERS += inc/t_nameeditor.h -HEADERS += inc/t_noteeditor.h -HEADERS += inc/t_cntonlineaccounteditorview.h -HEADERS += inc/t_numbereditor.h -HEADERS += inc/t_cntsnapshotwidget.h -HEADERS += inc/t_urleditor.h -HEADERS += inc/t_cntviewmanager.h -HEADERS += inc/t_cntviewparameters.h -HEADERS += inc/t_cntcommhistoryview.h -HEADERS += inc/t_cntgroupselectionpopup.h -HEADERS += inc/t_cntgroupdeletepopupmodel.h -HEADERS += inc/t_cntnavigator.h -HEADERS += inc/t_namelist.h -HEADERS += inc/t_cntgroupdeletepopup.h -HEADERS += \ - ../../inc/cntviewnavigator.h \ - ../../inc/cntnamesview_p.h \ - ../../inc/cntabstractviewmanager.h \ - ../../inc/cntabstractview.h \ - ../../inc/cntabstractviewfactory.h \ - ../../inc/cntdefaultviewmanager.h \ - ../../inc/cntactionmenubuilder.h \ - ../../inc/cntaction.h \ - ../../inc/cntactions.h \ - ../../inc/cntbaselistview.h \ - ../../inc/cntbaseview.h \ - ../../inc/cntbasedetaileditorview.h \ - ../../inc/cntbaseselectionview.h \ - ../../inc/cntcollectionview.h \ - ../../inc/cntcollectionlistmodel.h \ - ../../inc/cntcommands.h \ - ../../inc/cntdetailpopup.h \ - ../../inc/cnteditordataviewitem.h \ - ../../inc/cnteditordatamodelitem.h \ - ../../inc/cntonlineaccounteditorview.h \ - ../../inc/cntimageeditorview.h \ - ../../inc/cntfavoritesmemberview.h \ - ../../inc/cntfavoritesview.h \ - ../../inc/cntmainwindow.h \ - ../../inc/cntmodelprovider.h \ - ../../inc/cntnamesview.h \ - ../../inc/cntviewmanager.h \ - ../../inc/cntviewparameters.h \ - ../../inc/cntcontactcardheadingitem.h \ - ../../inc/cntcontactcarddatacontainer.h \ - ../../inc/cntcontactcardview.h \ - ../../inc/cntcontactcarddetailitem.h \ - ../../inc/cntdocumentloader.h \ - ../../inc/cnteditview.h \ - ../../inc/cnteditviewdetailitem.h \ - ../../inc/cnteditviewheadingitem.h \ - ../../inc/cntstringmapper.h \ - ../../inc/cntmycardselectionview.h \ - ../../inc/cntmycardview.h \ - ../../inc/cntgroupeditorview.h \ - ../../inc/cntgroupmemberview.h \ - ../../inc/cntgroupactionsview.h \ - ../../inc/cntsnapshotwidget.h \ - ../../inc/cnthistoryview.h \ - ../../inc/cnthistoryviewitem.h \ - ../../inc/cnthistoryviewitemwidget.h \ - ../../inc/cntgroupselectionpopup.h \ - ../../inc/cntgroupdeletepopupmodel.h \ - ../../inc/cntgroupdeletepopup.h \ - ../../inc/cntdetailconst.h \ - ../../inc/cntdetaileditormodel.h \ - ../../inc/cnteditorfactory.h \ - ../../inc/cntdetaileditor.h \ - ../../inc/cntphonenumberviewitem.h \ - ../../inc/cntphonenumbermodel.h \ - ../../inc/cntdetailmodelitem.h \ - ../../inc/cntemaileditormodel.h \ - ../../inc/cntemaileditorviewitem.h \ - ../../inc/cntaddressmodel.h \ - ../../inc/cntaddressviewitem.h \ - ../../inc/cnturleditormodel.h \ - ../../inc/cnturleditorviewitem.h \ - ../../inc/cntnameeditormodel.h \ - ../../inc/cntnoteeditormodel.h \ - ../../inc/cntnoteeditorviewitem.h \ - ../../inc/cntdateeditormodel.h \ - ../../inc/cntdateeditorviewitem.h \ - ../../inc/cntcompanyeditormodel.h \ - ../../inc/cntfamilyeditormodel.h \ - ../../inc/qlocationpickeritem_temp.h \ - ../../inc/cntdetailviewitem.h - -SOURCES += src/testrunner.cpp -SOURCES += src/main.cpp -SOURCES += src/t_cntactions.cpp -SOURCES += src/t_addresseditor.cpp -SOURCES += src/t_cntbasedetaileditorview.cpp -SOURCES += src/t_cntbaselistview.cpp -SOURCES += src/t_cntbaseselectionview.cpp -SOURCES += src/t_cntbaseview.cpp -SOURCES += src/t_cntcollectionlistmodel.cpp -SOURCES += src/t_cntcollectionview.cpp -SOURCES += src/t_cntcommands.cpp -SOURCES += src/t_companyeditor.cpp -SOURCES += src/t_cntcontactcarddatacontainer.cpp -SOURCES += src/t_cntcontactcarddetailitem.cpp -SOURCES += src/t_cntcontactcardheadingitem.cpp -SOURCES += src/t_cntcontactcardview.cpp -SOURCES += src/t_dateeditor.cpp -SOURCES += src/t_cntdetailpopup.cpp -SOURCES += src/t_cnteditordatamodelitem.cpp -SOURCES += src/t_cnteditordataviewitem.cpp -SOURCES += src/t_cnteditviewdetailitem.cpp -SOURCES += src/t_cnteditviewheadingitem.cpp -SOURCES += src/t_emaileditor.cpp -SOURCES += src/t_familyeditor.cpp -SOURCES += src/t_cntfavoritesmemberview.cpp -SOURCES += src/t_cntfavoritesview.cpp -SOURCES += src/t_cntgroupactionsview.cpp -SOURCES += src/t_cntgroupeditorview.cpp -SOURCES += src/t_cntgroupmemberview.cpp -SOURCES += src/t_cntimageeditorview.cpp -SOURCES += src/t_cntmainwindow.cpp -SOURCES += src/t_cntmodelprovider.cpp -SOURCES += src/t_cntmycardselectionview.cpp -SOURCES += src/t_cntmycardview.cpp -SOURCES += src/t_nameeditor.cpp -SOURCES += src/t_noteeditor.cpp -SOURCES += src/t_cntonlineaccounteditorview.cpp -SOURCES += src/t_numbereditor.cpp -SOURCES += src/t_cntsnapshotwidget.cpp -SOURCES += src/t_urleditor.cpp -SOURCES += src/t_cntviewmanager.cpp -SOURCES += src/t_cntviewparameters.cpp -SOURCES += src/t_cntcommhistoryview.cpp -SOURCES += src/t_cntgroupselectionpopup.cpp -SOURCES += src/t_cntgroupdeletepopupmodel.cpp -SOURCES += src/t_cntnavigator.cpp -SOURCES += src/t_namelist.cpp -SOURCES += src/t_cntgroupdeletepopup.cpp -SOURCES += \ - ../../src/cntviewnavigator.cpp \ - ../../src/cntdefaultviewfactory.cpp \ - ../../src/cntnamesview_p.cpp \ - ../../src/cntdefaultviewmanager.cpp \ - ../../src/cntactionmenubuilder.cpp \ - ../../src/cntaction.cpp \ - ../../src/cntactions.cpp \ - ../../src/cntbaselistview.cpp \ - ../../src/cntbaseview.cpp \ - ../../src/cntbasedetaileditorview.cpp \ - ../../src/cntbaseselectionview.cpp \ - ../../src/cntcollectionview.cpp \ - ../../src/cntcollectionlistmodel.cpp \ - ../../src/cntcommands.cpp \ - ../../src/cntdetailpopup.cpp \ - ../../src/cnteditordataviewitem.cpp \ - ../../src/cnteditordatamodelitem.cpp \ - ../../src/cntonlineaccounteditorview.cpp \ - ../../src/cntimageeditorview.cpp \ - ../../src/cntfavoritesmemberview.cpp \ - ../../src/cntfavoritesview.cpp \ - ../../src/cntmainwindow.cpp \ - ../../src/cntmodelprovider.cpp \ - ../../src/cntnamesview.cpp \ - ../../src/cntviewmanager.cpp \ - ../../src/cntviewparameters.cpp \ - ../../src/cntcontactcarddetailitem.cpp \ - ../../src/cntcontactcarddatacontainer.cpp \ - ../../src/cntcontactcardview.cpp \ - ../../src/cntcontactcardheadingitem.cpp \ - ../../src/cntdocumentloader.cpp \ - ../../src/cnteditview.cpp \ - ../../src/cnteditviewdetailitem.cpp \ - ../../src/cnteditviewheadingitem.cpp \ - ../../src/cntmycardselectionview.cpp \ - ../../src/cntmycardview.cpp \ - ../../src/cntgroupeditorview.cpp \ - ../../src/cntgroupmemberview.cpp\ - ../../src/cntgroupactionsview.cpp \ - ../../src/cntsnapshotwidget.cpp \ - ../../src/cnthistoryview.cpp \ - ../../src/cnthistoryviewitem.cpp \ - ../../src/cnthistoryviewitemwidget.cpp \ - ../../src/cntgroupselectionpopup.cpp \ - ../../src/cntgroupdeletepopupmodel.cpp \ - ../../src/cntgroupdeletepopup.cpp \ - ../../src/cntaddressmodel.cpp \ - ../../src/cntaddressviewitem.cpp \ - ../../src/cntcompanyeditormodel.cpp \ - ../../src/cntdateeditormodel.cpp \ - ../../src/cntdateeditorviewitem.cpp \ - ../../src/cntdetaileditor.cpp \ - ../../src/cntdetailmodelitem.cpp \ - ../../src/cnteditorfactory.cpp \ - ../../src/cntemaileditormodel.cpp \ - ../../src/cntemaileditorviewitem.cpp \ - ../../src/cntfamilyeditormodel.cpp \ - ../../src/cntnameeditormodel.cpp \ - ../../src/cntnoteeditormodel.cpp \ - ../../src/cntnoteeditorviewitem.cpp \ - ../../src/cntphonenumbermodel.cpp \ - ../../src/cntphonenumberviewitem.cpp \ - ../../src/cnturleditormodel.cpp \ - ../../src/cnturleditorviewitem.cpp - -SOURCES += ./stubs/hbstubs.cpp -SOURCES += ./stubs/qthighway_stub.cpp - -# capability -TARGET.CAPABILITY = ALL \ - -TCB - -LIBS+= -lxqservice \ - -lQtContacts \ - -lmobcntmodel \ - -lthumbnailmanagerqt \ - -lmobhistorymodel \ - -lcntmaptileservice - diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookapp/phonebookapp.pro --- a/phonebookui/phonebookapp/phonebookapp.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookapp/phonebookapp.pro Mon May 03 12:24:20 2010 +0300 @@ -53,8 +53,7 @@ SOURCES += src/cntappservicehandler.cpp # capability -TARGET.CAPABILITY = ALL \ - -TCB +TARGET.CAPABILITY = CAP_APPLICATION TRANSLATIONS = contacts.ts diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookapp/tsrc/ut_cntappservicehandler/ut_cntappservicehandler.pro --- a/phonebookui/phonebookapp/tsrc/ut_cntappservicehandler/ut_cntappservicehandler.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookapp/tsrc/ut_cntappservicehandler/ut_cntappservicehandler.pro Mon May 03 12:24:20 2010 +0300 @@ -1,6 +1,18 @@ -###################################################################### -# Automatically generated by qmake (2.01a) pe 27. helmi 08:49:52 2009 -###################################################################### +# +# 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 TARGET = diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntserviceassigncontactcardview.h --- a/phonebookui/phonebookservices/inc/cntserviceassigncontactcardview.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntserviceassigncontactcardview.h Mon May 03 12:24:20 2010 +0300 @@ -22,11 +22,12 @@ #include #include "cntcontactcardview.h" -#include "cntviewparameters.h" class CntServiceHandler; +class CntAbstractViewManager; QTM_BEGIN_NAMESPACE +class QContact; class QContactDetail; QTM_END_NAMESPACE @@ -38,22 +39,24 @@ public slots: - void aboutToCloseView(); + void doCloseView(); void addActionsToToolBar(); void addToContacts(); void saveNew(); void updateExisting(); + void doViewActivated(QContact contact, QContactDetail detail); public: - CntServiceAssignContactCardView(CntServiceHandler *aServiceHandler, CntViewManager *viewManager, QGraphicsItem *parent = 0); + CntServiceAssignContactCardView(CntServiceHandler *aServiceHandler); ~CntServiceAssignContactCardView(); - CntViewParameters::ViewId viewId() const { return CntViewParameters::serviceAssignContactCardView; } - void activateView(const CntViewParameters &viewParameters); + int viewId() const { return serviceAssignContactCardView; } private: - CntServiceHandler *mServiceHandler; - QContactDetail mDetail; + CntServiceHandler *mServiceHandler; + CntAbstractViewManager *mViewManager; + QContact mContact; + QContactDetail mDetail; }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntservicecontactcardview.h --- a/phonebookui/phonebookservices/inc/cntservicecontactcardview.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntservicecontactcardview.h Mon May 03 12:24:20 2010 +0300 @@ -20,7 +20,6 @@ #include #include "cntcontactcardview.h" -#include "cntviewparameters.h" class CntServiceHandler; @@ -28,16 +27,15 @@ { Q_OBJECT -public slots: +private slots: - void aboutToCloseView(); - void editContact(); + void doShowPreviousView(); public: - CntServiceContactCardView(CntServiceHandler *aServiceHandler, CntViewManager *viewManager, QGraphicsItem *parent = 0); + CntServiceContactCardView(CntServiceHandler *aServiceHandler); ~CntServiceContactCardView(); - CntViewParameters::ViewId viewId() const { return CntViewParameters::serviceContactCardView; } + int viewId() const { return serviceContactCardView; } private: CntServiceHandler *mServiceHandler; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntservicecontactfetchview.h --- a/phonebookui/phonebookservices/inc/cntservicecontactfetchview.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntservicecontactfetchview.h Mon May 03 12:24:20 2010 +0300 @@ -21,7 +21,6 @@ #include #include "cntbaseselectionview.h" -#include "cntviewparameters.h" class CntServiceHandler; @@ -30,19 +29,16 @@ Q_OBJECT public: - CntServiceContactFetchView(CntServiceHandler *aServiceHandler, CntViewManager *aViewManager, QGraphicsItem *aParent = 0); + CntServiceContactFetchView( CntServiceHandler *aServiceHandler ); ~CntServiceContactFetchView(); + int viewId() const { return serviceContactFetchView; } + public slots: + void aboutToOpenView(const CntViewParameters viewParameters); void aboutToCloseView(); void cancelFetch(); -public: - void setActionFilter(QString action, QString filter); - void addMenuItems(); - CntViewParameters::ViewId viewId() const { return CntViewParameters::serviceContactFetchView; } - void activateView(const CntViewParameters &viewParameters); - private: CntServiceHandler *mServiceHandler; }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntservicecontactselectionview.h --- a/phonebookui/phonebookservices/inc/cntservicecontactselectionview.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntservicecontactselectionview.h Mon May 03 12:24:20 2010 +0300 @@ -21,8 +21,8 @@ #include #include "cntbaseselectionview.h" -#include "cntviewparameters.h" +class QModelIndex; class CntServiceHandler; class CntServiceContactSelectionView : public CntBaseSelectionView @@ -30,18 +30,16 @@ Q_OBJECT public: - CntServiceContactSelectionView(CntServiceHandler *aServiceHandler, CntViewManager *aViewManager, - QGraphicsItem *aParent = 0, HbAbstractItemView::SelectionMode newMode = HbAbstractItemView::NoSelection); + CntServiceContactSelectionView(CntServiceHandler *aServiceHandler); ~CntServiceContactSelectionView(); + int viewId() const { return serviceContactSelectionView; } + public slots: void onListViewActivated(const QModelIndex &aIndex); + void aboutToOpenView(const CntViewParameters viewParameters); void aboutToCloseView(); - -public: - void activateView(const CntViewParameters &viewParameters); - CntViewParameters::ViewId viewId() const { return CntViewParameters::serviceContactSelectionView; } - + private: CntServiceHandler *mServiceHandler; QContactDetail mDetail; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntserviceeditview.h --- a/phonebookui/phonebookservices/inc/cntserviceeditview.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntserviceeditview.h Mon May 03 12:24:20 2010 +0300 @@ -20,7 +20,6 @@ #include #include "cnteditview.h" -#include "cntviewparameters.h" class CntServiceHandler; @@ -31,16 +30,20 @@ public: - CntServiceEditView(CntServiceHandler *aServiceHandler, CntViewManager *aViewManager, QGraphicsItem *aParent = 0); + CntServiceEditView(CntServiceHandler *aServiceHandler ); ~CntServiceEditView(); - CntViewParameters::ViewId viewId() const { return CntViewParameters::serviceEditView; } - -public slots: + int viewId() const { return serviceEditView; } - void aboutToCloseView(); - int handleExecutedCommand(QString aCommand, const QContact &aContact); - void discardAllChanges(); +private slots: + void doContactUpdated(); + void doContactRemoved(); + void doChangesDiscarded(); + +//public slots: +// void aboutToCloseView(); +// int handleExecutedCommand(QString aCommand, const QContact &aContact); +// void discardAllChanges(); private: CntServiceHandler *mServiceHandler; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntservicehandler.h --- a/phonebookui/phonebookservices/inc/cntservicehandler.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntservicehandler.h Mon May 03 12:24:20 2010 +0300 @@ -18,8 +18,9 @@ #ifndef CNTSERVICEHANDLER_H #define CNTSERVICEHANDLER_H -#include "cntservicescontact.h" +#include #include +#include #include QTM_USE_NAMESPACE @@ -30,28 +31,56 @@ public: CntServiceHandler(QObject *parent = 0); ~CntServiceHandler(); + + enum CntServiceViewParams + { + ETitle = ECustomParam, + EFilter + }; public: void completeFetch(const CntServicesContactList &contactList); void completeEdit(int result); public slots: - void fetch(const QString &title, const QString &action = KCntActionAll, const QString &filter = KCntFilterDisplayAll); + // Services offered to clients + void fetch(const QString &title, + const QString &action, + const QString &filter); + + void Dofetch(const QString &title, + const QString &action, + const QString &filter, + const QString &mode = KCntNoSelectionMode); + void editCreateNew(const QString &definitionName, const QString &value); + void editCreateNew(const QString &vCardFile); void editUpdateExisting(const QString &definitionName, const QString &value); void open(int contactId); void open(const QString &definitionName, const QString &value); signals: - void launchFetch(const QString &title, const QString &action, const QString &filter); + void launchFetch(const QString &title, + const QString &action, + const QString &filter); + + void launchFetchVerified(const QString &title, + const QString &action, + const QString &filter, + const QString &mode); + void launchEditor(QContact contact); void launchContactSelection(QContactDetail detail); void launchContactCard(QContact contact); void launchAssignContactCard(QContact contact, QContactDetail detail); + +private: + void removeFields(QContact& contact); + void removeDetails(QContact& contact); private: int mCurrentRequestIndex; - + QStringList m_definitionNames; }; #endif /* CNTSERVICEHANDLER_H */ diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntservicescontact.h --- a/phonebookui/phonebookservices/inc/cntservicescontact.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +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: -* -*/ - -#ifndef CNTSERVICESCONTACT_H_ -#define CNTSERVICESCONTACT_H_ - -#include -#include -#include - -/*Supported actions*/ -const QString KCntActionAll("all"); -const QString KCntActionCall("call"); -const QString KCntActionSms("sms"); -const QString KCntActionEmail("email"); - -/*Supported filters*/ -const QString KCntFilterDisplayAll("all"); -const QString KCntFilterDisplayFavorites("favorites"); - - -class CntServicesContact -{ -public: - CntServicesContact() {}; - virtual ~CntServicesContact() {}; - - QString mDisplayName; - QString mPhoneNumber; - QString mEmailAddress; - int mContactId; //should be changed to QContactUniqueId - - template void serialize(Stream &stream) const; - template void deserialize(Stream &stream); -}; - -template inline void CntServicesContact::serialize(Stream &s) const -{ - s << mDisplayName; - s << mPhoneNumber; - s << mEmailAddress; - s << mContactId; -} - -template inline void CntServicesContact::deserialize(Stream &s) -{ - s >> mDisplayName; - s >> mPhoneNumber; - s >> mEmailAddress; - s >> mContactId; -} - -typedef QList CntServicesContactList; - -Q_DECLARE_USER_METATYPE(CntServicesContact) -Q_DECLARE_USER_METATYPE_NO_OPERATORS(CntServicesContactList) - -#endif /* CNTSERVICESCONTACT_H_ */ diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntservicesubeditview.h --- a/phonebookui/phonebookservices/inc/cntservicesubeditview.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntservicesubeditview.h Mon May 03 12:24:20 2010 +0300 @@ -20,7 +20,6 @@ #include #include "cnteditview.h" -#include "cntviewparameters.h" class CntServiceHandler; @@ -31,16 +30,15 @@ public: - CntServiceSubEditView(CntServiceHandler *aServiceHandler, CntViewManager *aViewManager, QGraphicsItem *aParent = 0); + CntServiceSubEditView( CntServiceHandler *aServiceHandler ); ~CntServiceSubEditView(); - CntViewParameters::ViewId viewId() const { return CntViewParameters::serviceSubEditView; } - -public slots: + int viewId() const { return serviceSubEditView; } - void aboutToCloseView(); - int handleExecutedCommand(QString aCommand, const QContact &aContact); - void discardAllChanges(); +//public slots: +// void aboutToCloseView(); +// int handleExecutedCommand(QString aCommand, const QContact &aContact); +// void discardAllChanges(); private: CntServiceHandler *mServiceHandler; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntserviceviewfactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/phonebookservices/inc/cntserviceviewfactory.h Mon May 03 12:24:20 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: +* +*/ + +#ifndef CNTSERVICEVIEWFACTORY_H_ +#define CNTSERVICEVIEWFACTORY_H_ + +#include "cntabstractviewfactory.h" + +class CntAbstractView; +class CntServiceHandler; + +class CntServiceViewFactory : public CntDefaultViewFactory +{ +public: + CntServiceViewFactory( CntServiceHandler* aService ); + ~CntServiceViewFactory(); + +public: + CntAbstractView* createView( int aViewId ); + +private: + CntServiceHandler* mService; +}; +#endif /* CNTSERVICEVIEWFACTORY_H_ */ diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/inc/cntserviceviewmanager.h --- a/phonebookui/phonebookservices/inc/cntserviceviewmanager.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/inc/cntserviceviewmanager.h Mon May 03 12:24:20 2010 +0300 @@ -18,10 +18,11 @@ #ifndef CNTSERVICEVIEWMANAGER_H #define CNTSERVICEVIEWMANAGER_H -#include "cntviewparameters.h" #include "cntdefaultviewmanager.h" +#include #include +#include class CntBaseView; class CntServiceHandler; @@ -31,21 +32,18 @@ Q_OBJECT public: - CntServiceViewManager(CntMainWindow *mainWindow, CntViewParameters::ViewId defaultView, - CntServiceHandler *aHandler); + CntServiceViewManager(HbMainWindow *mainWindow, CntServiceHandler *aHandler); ~CntServiceViewManager(); public slots: - void launchFetch(const QString &title, const QString &action, const QString &filter); + void handleFetch(const QString &title, const QString &action, const QString &filter); + void launchFetch(const QString &title, const QString &action, const QString &filter, const QString &mode = KCntMultiSelectionMode); void launchEditor(QContact contact); void launchContactSelection(QContactDetail detail); void launchContactCard(QContact contact); void launchAssignContactCard(QContact contact, QContactDetail detail); private: - CntBaseView *getView(const CntViewParameters &aArgs); - -private: CntServiceHandler *mServiceHandler; }; diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/phonebookservices.pro --- a/phonebookui/phonebookservices/phonebookservices.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/phonebookservices.pro Mon May 03 12:24:20 2010 +0300 @@ -19,6 +19,8 @@ INCLUDEPATH += ../pbkcommonui/inc \ ../inc + +INCLUDEPATH += ../../phonebookengines/cntimageutility/inc INCLUDEPATH += . \ inc @@ -31,13 +33,13 @@ HEADERS += inc/cntservicemainwindow.h \ inc/cntserviceviewmanager.h \ inc/cntservicehandler.h \ - inc/cntservicescontact.h \ inc/cntservicecontactfetchview.h \ inc/cntservicecontactselectionview.h \ inc/cntserviceeditview.h \ inc/cntservicecontactcardview.h \ inc/cntservicesubeditview.h \ - inc/cntserviceassigncontactcardview.h + inc/cntserviceassigncontactcardview.h \ + inc/cntserviceviewfactory.h SOURCES += src/main.cpp \ src/cntservicemainwindow.cpp \ @@ -48,11 +50,11 @@ src/cntserviceeditview.cpp \ src/cntservicecontactcardview.cpp \ src/cntservicesubeditview.cpp \ - src/cntserviceassigncontactcardview.cpp + src/cntserviceassigncontactcardview.cpp \ + src/cntserviceviewfactory.cpp # capability -TARGET.CAPABILITY = ALL \ - -TCB +TARGET.CAPABILITY = CAP_APPLICATION TRANSLATIONS = contacts.ts @@ -63,20 +65,10 @@ -lhbcore \ -lqtcontacts \ -lmobcntmodel \ - -lpbkcommonui + -lpbkcommonui \ + -lqtversit \ + -lcntimageutility SERVICE.FILE = service_conf.xml SERVICE.OPTIONS = embeddable SERVICE.OPTIONS += hidden - -# export the header file -CNT_SERVICES_PUBLIC_HEADERS += cntservicescontact.h - -symbian { - deploy.path = / - headers.sources = $$CNT_SERVICES_PUBLIC_HEADERS - headers.path = epoc32/include - DEPLOYMENT += exportheaders - - for(header, headers.sources):BLD_INF_RULES.prj_exports += "./inc/$$header $$deploy.path$$headers.path/$$basename(header)" -} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp --- a/phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntserviceassigncontactcardview.cpp Mon May 03 12:24:20 2010 +0300 @@ -18,21 +18,28 @@ #include "cntserviceassigncontactcardview.h" #include "cntservicehandler.h" +#include #include #include #include #include +#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) */ -CntServiceAssignContactCardView::CntServiceAssignContactCardView(CntServiceHandler *aServiceHandler, CntViewManager *viewManager, QGraphicsItem *parent) : - CntContactCardView(viewManager, parent), +CntServiceAssignContactCardView::CntServiceAssignContactCardView(CntServiceHandler *aServiceHandler) : + CntContactCardView(), mServiceHandler(aServiceHandler) { - + connect(this, SIGNAL(backPressed()), this, SLOT(doCloseView())); + connect(this, SIGNAL(viewActivated(QContact, QContactDetail)), this, SLOT(doViewActivated(QContact,QContactDetail))); + + addActionsToToolBar(); } /*! @@ -48,20 +55,16 @@ */ void CntServiceAssignContactCardView::addActionsToToolBar() { - //Add Action to the toolbar - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:addtocontacts"); - actions()->addActionsToToolBar(toolBar()); - - connect(actions()->baseAction("cnt:addtocontacts"), SIGNAL(triggered()), - this, SLOT(addToContacts())); + view()->toolBar()->clearActions(); + HbAction* addToContact = view()->toolBar()->addAction("txt_phob_button_add_to_contacts"); + connect(addToContact, SIGNAL(triggered()), this, SLOT(addToContacts())); } /*! Opens the Add to Contacts popup */ void CntServiceAssignContactCardView::addToContacts() -{ +{ HbDialog *popup = new HbDialog(); popup->setDismissPolicy(HbDialog::NoDismiss); popup->setHeadingWidget(new HbLabel(hbTrId("txt_phob_title_add_to_contacts"), popup)); @@ -86,9 +89,12 @@ */ void CntServiceAssignContactCardView::saveNew() { - CntViewParameters viewParameters(CntViewParameters::serviceEditView); - viewParameters.setSelectedContact(*mContact); - viewManager()->changeView(viewParameters); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, serviceEditView); + QVariant var; + var.setValue(mContact); + viewParameters.insert(ESelectedContact, var); + //viewManager()->changeView(viewParameters); } /*! @@ -96,21 +102,27 @@ */ void CntServiceAssignContactCardView::updateExisting() { - CntViewParameters viewParameters(CntViewParameters::serviceContactSelectionView); - viewParameters.setSelectedDetail(mDetail); - viewManager()->changeView(viewParameters); + CntViewParameters viewParameters; + viewParameters.insert(EViewId, serviceContactSelectionView); + QVariant var; + var.setValue(mDetail); + viewParameters.insert(ESelectedDetail, var); + //viewManager()->changeView(viewParameters); } -void CntServiceAssignContactCardView::activateView(const CntViewParameters &viewParameters) +/*! +Called after the view has been activated +*/ +void CntServiceAssignContactCardView::doViewActivated(QContact contact, QContactDetail detail) { - CntContactCardView::activateView(viewParameters); - mDetail = viewParameters.selectedDetail(); + mContact = contact; + mDetail = detail; } /*! Close the view (quits the service as well) */ -void CntServiceAssignContactCardView::aboutToCloseView() +void CntServiceAssignContactCardView::doCloseView() { qApp->quit(); } diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntservicecontactcardview.cpp --- a/phonebookui/phonebookservices/src/cntservicecontactcardview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntservicecontactcardview.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,18 +16,18 @@ */ #include "cntservicecontactcardview.h" - #include "cntservicehandler.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) */ -CntServiceContactCardView::CntServiceContactCardView(CntServiceHandler *aServiceHandler, CntViewManager *viewManager, QGraphicsItem *parent) : - CntContactCardView(viewManager, parent), +CntServiceContactCardView::CntServiceContactCardView(CntServiceHandler *aServiceHandler) : + CntContactCardView(), mServiceHandler(aServiceHandler) { - + connect(this, SIGNAL(backPressed()), this, SLOT(doShowPreviousView())); } /*! @@ -39,19 +39,9 @@ } /*! -Launch contact editor -*/ -void CntServiceContactCardView::editContact() -{ - CntViewParameters viewParameters(CntViewParameters::serviceSubEditView); - viewParameters.setSelectedContact(*mContact); - viewManager()->changeView(viewParameters); -} - -/*! Close the view (quits the service as well) */ -void CntServiceContactCardView::aboutToCloseView() +void CntServiceContactCardView::doShowPreviousView() { int result = -2; connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp --- a/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntservicecontactfetchview.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,31 +17,34 @@ #include "cntservicecontactfetchview.h" -#include "cntservicescontact.h" +#include +#include #include "cntservicehandler.h" #include +#include +#include +#include +#include -CntServiceContactFetchView::CntServiceContactFetchView(CntServiceHandler *aServiceHandler, CntViewManager *aViewManager, QGraphicsItem *aParent): - CntBaseSelectionView(aViewManager,aParent), - mServiceHandler(aServiceHandler) +#include + +CntServiceContactFetchView::CntServiceContactFetchView(CntServiceHandler *aServiceHandler): +CntBaseSelectionView(), +mServiceHandler(aServiceHandler) { - + HbAction* cancel = static_cast( mDocument->findObject( "cnt:cancel" ) ); + mView->menu()->addAction( cancel ); + + connect(cancel, SIGNAL(triggered()), this, SLOT(cancelFetch()) ); + connect( this, SIGNAL(viewClosed()), this, SLOT(aboutToCloseView()) ); + connect( this, SIGNAL(viewOpened(const CntViewParameters)), this, SLOT(aboutToOpenView(const CntViewParameters)) ); } CntServiceContactFetchView::~CntServiceContactFetchView() { } -void CntServiceContactFetchView::addMenuItems() -{ - actions()->clearActionList(); - actions()->actionList() << actions()->baseAction("cnt:cancel"); - actions()->addActionsToMenu(menu()); - - connect(actions()->baseAction("cnt:cancel"), SIGNAL(triggered()), - this, SLOT (cancelFetch())); -} void CntServiceContactFetchView::cancelFetch() { @@ -53,14 +56,15 @@ void CntServiceContactFetchView::aboutToCloseView() { CntServicesContactList serviceList; - QModelIndexList temp = selectionModel()->selection().indexes(); + QContactManager* mgr = mMgr->contactManager(SYMBIAN_BACKEND); + QModelIndexList temp = mListView->selectionModel()->selection().indexes(); for(int i = 0; i < temp.count(); i++ ) { - QContact contact = contactModel()->contact(temp.at(i)); + QContact contact = mListModel->contact(temp.at(i)); CntServicesContact servicesContact; //get the name - servicesContact.mDisplayName = contactManager()->synthesizedDisplayLabel(contact); + servicesContact.mDisplayName = mgr->synthesizedDisplayLabel(contact); //get the phonenumber QList phonenumbers = contact.details(); @@ -90,57 +94,47 @@ mServiceHandler->completeFetch(serviceList); } -void CntServiceContactFetchView::activateView(const CntViewParameters &aArgs) +void CntServiceContactFetchView::aboutToOpenView(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); + QString title = aArgs.value(CntServiceHandler::ETitle).toString(); + mView->setTitle(title); - CntBaseSelectionView::activateView(aArgs); -} - -void CntServiceContactFetchView::setActionFilter(QString action, QString filter) -{ - Q_UNUSED(filter); - + // Set action filter + QString filter = aArgs.value(CntServiceHandler::EFilter).toString(); + QString action = aArgs.value(ESelectedAction).toString(); if (action == KCntActionSms) - { - QContactActionFilter actionFilter; - actionFilter.setActionName("message"); - contactModel()->setFilterAndSortOrder(actionFilter); - } - else if (action == KCntActionCall) - { - QContactActionFilter actionFilter; - actionFilter.setActionName("call"); - contactModel()->setFilterAndSortOrder(actionFilter); - } - else if (action == KCntActionEmail) - { - QContactActionFilter actionFilter; - actionFilter.setActionName("email"); - contactModel()->setFilterAndSortOrder(actionFilter); - } - else - { - QContactDetailFilter filter; - filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); - QString typeContact = QContactType::TypeContact; - filter.setValue(typeContact); - contactModel()->setFilterAndSortOrder(filter); - } + { + QContactActionFilter actionFilter; + actionFilter.setActionName("message"); + mListModel->setFilterAndSortOrder(actionFilter); + } + else if (action == KCntActionCall) + { + QContactActionFilter actionFilter; + actionFilter.setActionName("call"); + mListModel->setFilterAndSortOrder(actionFilter); + } + else if (action == KCntActionEmail) + { + QContactActionFilter actionFilter; + actionFilter.setActionName("email"); + mListModel->setFilterAndSortOrder(actionFilter); + } + else + { + QContactDetailFilter filter; + filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); + QString typeContact = QContactType::TypeContact; + filter.setValue(typeContact); + mListModel->setFilterAndSortOrder(filter); + } - // hide my card if it's not set - if (contactManager()->selfContactId() == 0) - { - contactModel()->showMyCard(false); - } + // hide my card if it's not set + if ( mListModel->myCardId() == 0 ) + { + mListModel->showMyCard( false ); + } } // EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntservicecontactselectionview.cpp --- a/phonebookui/phonebookservices/src/cntservicecontactselectionview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntservicecontactselectionview.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,14 +17,19 @@ #include "cntservicecontactselectionview.h" +#include +#include #include "cntservicehandler.h" +#include +#include -CntServiceContactSelectionView::CntServiceContactSelectionView(CntServiceHandler *aServiceHandler, CntViewManager *aViewManager, - QGraphicsItem *aParent, HbAbstractItemView::SelectionMode newMode): - CntBaseSelectionView(aViewManager, aParent, newMode), - mServiceHandler(aServiceHandler) +CntServiceContactSelectionView::CntServiceContactSelectionView(CntServiceHandler *aServiceHandler): +CntBaseSelectionView(), +mServiceHandler(aServiceHandler) { - + connect(mListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(onListViewActivated(const QModelIndex&))); + connect( this, SIGNAL(viewClosed()), this, SLOT(aboutToCloseView()) ); + connect( this, SIGNAL(viewOpened(const CntViewParameters)), this, SLOT(aboutToOpenView(const CntViewParameters)) ); } CntServiceContactSelectionView::~CntServiceContactSelectionView() @@ -34,11 +39,15 @@ void CntServiceContactSelectionView::onListViewActivated(const QModelIndex &aIndex) { - CntViewParameters viewParameters(CntViewParameters::serviceEditView); - QContact contact = contactModel()->contact(aIndex); + QContact contact = mListModel->contact(aIndex); contact.saveDetail(&mDetail); - viewParameters.setSelectedContact(contact); - viewManager()->changeView(viewParameters); + + CntViewParameters params; + params.insert(EViewId, serviceEditView); + QVariant var; + var.setValue(contact); + params.insert(ESelectedContact, var); + mMgr->changeView(params); } void CntServiceContactSelectionView::aboutToCloseView() @@ -47,21 +56,19 @@ mServiceHandler->completeEdit(0); } -void CntServiceContactSelectionView::activateView(const CntViewParameters &viewParameters) +void CntServiceContactSelectionView::aboutToOpenView(const CntViewParameters viewParameters) { QContactDetailFilter filter; filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType); QString typeContact = QContactType::TypeContact; filter.setValue(typeContact); - contactModel()->setFilterAndSortOrder(filter); + mListModel->setFilterAndSortOrder(filter); // hide my card if it's not set - if (contactManager()->selfContactId() == 0) + if (mListModel->myCardId() == 0) { - contactModel()->showMyCard(false); + mListModel->showMyCard(false); } - mDetail = viewParameters.selectedDetail(); - - CntBaseSelectionView::activateView(viewParameters); + mDetail = viewParameters.value(ESelectedDetail).value(); } // EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntserviceeditview.cpp --- a/phonebookui/phonebookservices/src/cntserviceeditview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntserviceeditview.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,64 +16,83 @@ */ #include "cntserviceeditview.h" - #include "cntservicehandler.h" +#include -CntServiceEditView::CntServiceEditView(CntServiceHandler *aServiceHandler, CntViewManager *aViewManager, QGraphicsItem *aParent) : - CntEditView(aViewManager, aParent), - mServiceHandler(aServiceHandler) +CntServiceEditView::CntServiceEditView(CntServiceHandler *aServiceHandler ) : CntEditView(), +mServiceHandler(aServiceHandler) { - + connect( this, SIGNAL(contactUpdated()), this, SLOT(doContactUpdated()) ); + connect( this, SIGNAL(contactRemoved()), this, SLOT(doContactRemoved()) ); + connect( this, SIGNAL(changesDiscarded()), this, SLOT(doChangesDiscarded()) ); } CntServiceEditView::~CntServiceEditView() { +} +void CntServiceEditView::doContactUpdated() +{ + connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); + mServiceHandler->completeEdit(1); } -/*! -Saves the contact -*/ -void CntServiceEditView::aboutToCloseView() +void CntServiceEditView::doContactRemoved() { - int result = 0; - // save contact if there is one - if (contact()) - { - bool isSaved = contactManager()->saveContact(contact()); - if (isSaved) - { - result = 1; - } - } - connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); - mServiceHandler->completeEdit(result); + mServiceHandler->completeEdit(-1); } -/*! -Cancel all changes made and return to the application editor was opened from -*/ -void CntServiceEditView::discardAllChanges() +void CntServiceEditView::doChangesDiscarded() { connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); mServiceHandler->completeEdit(0); } -/* -Handle signals emitted from CntCommands, only used for delete command for now. -*/ -int CntServiceEditView::handleExecutedCommand(QString aCommand, const QContact &aContact) -{ - Q_UNUSED(aContact); - int result=-1; - if (aCommand == "delete") - { - connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); - mServiceHandler->completeEdit(result); - result = 0; - } - return result; -} +// +///*! +//Saves the contact +//*/ +//void CntServiceEditView::aboutToCloseView() +//{ +// int result = 0; +// // save contact if there is one +// if (contact() && !contact()->isEmpty()) +// { +// bool isSaved = contactManager()->saveContact(contact()); +// if (isSaved) +// { +// result = 1; +// } +// } +// +// connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); +// mServiceHandler->completeEdit(result); +//} +// +///*! +//Cancel all changes made and return to the application editor was opened from +//*/ +//void CntServiceEditView::discardAllChanges() +//{ +// connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); +// mServiceHandler->completeEdit(0); +//} +// +///* +//Handle signals emitted from CntCommands, only used for delete command for now. +//*/ +//int CntServiceEditView::handleExecutedCommand(QString aCommand, const QContact &aContact) +//{ +// Q_UNUSED(aContact); +// int result=-1; +// if (aCommand == "delete") +// { +// connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); +// mServiceHandler->completeEdit(result); +// result = 0; +// } +// return result; +//} // EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntservicehandler.cpp --- a/phonebookui/phonebookservices/src/cntservicehandler.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntservicehandler.cpp Mon May 03 12:24:20 2010 +0300 @@ -16,6 +16,14 @@ */ #include "cntservicehandler.h" +#include "cntimageutility.h" + +#include +#include +#include + +#include +#include /* NOTE! THIS SERVICE WILL BE RENAMED TO com.nokia.services.phonebook.Services */ CntServiceHandler::CntServiceHandler(QObject *parent): @@ -23,6 +31,25 @@ mCurrentRequestIndex(0) { publishAll(); + + // Definition names supported in symbian back-end + QString def("%1"); + m_definitionNames << def.arg(QContactName::DefinitionName); + m_definitionNames << def.arg(QContactNickname::DefinitionName); + m_definitionNames << def.arg(QContactPhoneNumber::DefinitionName); + m_definitionNames << def.arg(QContactEmailAddress::DefinitionName); + m_definitionNames << def.arg(QContactAddress::DefinitionName); + m_definitionNames << def.arg(QContactUrl::DefinitionName); + m_definitionNames << def.arg(QContactBirthday::DefinitionName); + m_definitionNames << def.arg(QContactOrganization::DefinitionName); + m_definitionNames << def.arg(QContactSyncTarget::DefinitionName); + m_definitionNames << def.arg(QContactNote::DefinitionName); + m_definitionNames << def.arg(QContactFamily::DefinitionName); + m_definitionNames << def.arg(QContactAvatar::DefinitionName); + m_definitionNames << def.arg(QContactAnniversary::DefinitionName); + m_definitionNames << def.arg(QContactGeoLocation::DefinitionName); + m_definitionNames << def.arg(QContactGender::DefinitionName); + m_definitionNames << def.arg(QContactOnlineAccount::DefinitionName); } CntServiceHandler::~CntServiceHandler() @@ -56,7 +83,15 @@ void CntServiceHandler::fetch(const QString &title, const QString &action, const QString &filter) { emit launchFetch(title, action, filter); + mCurrentRequestIndex = setCurrentRequestAsync(); +} +/* +Launch fetch service with given parameters. Fetching mode is No-select by default. +*/ +void CntServiceHandler::Dofetch(const QString &title, const QString &action, const QString &filter, const QString &mode) +{ + emit launchFetchVerified(title, action, filter, mode); mCurrentRequestIndex = setCurrentRequestAsync(); } @@ -86,7 +121,7 @@ account.setAccountUri(value); account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip); contact.saveDetail(&account); - } + } emit launchEditor(contact); @@ -94,6 +129,304 @@ } /* +Launch new contact editor with a given vCard filename +*/ +void CntServiceHandler::editCreateNew(const QString &vCardFile) +{ + CntImageUtility imageUtility; + QContact contact; + QVersitReader reader; + QFile file(vCardFile); + file.open(QIODevice::ReadOnly); + reader.setDevice(&file); + + reader.startReading(); + reader.waitForFinished(); + // Use the resulting document(s)... + QVersitContactImporter importer; + QList versitDocuments = reader.results(); + if(versitDocuments.count() > 0) + { + contact = importer.importContacts(versitDocuments).first(); + } + file.close(); + + // Save photo to image file + // image file used in phonebook to generate thumbnail + QList details = contact.details(); + if (details.count() > 0) + { + for (int i = 0;i < details.count();i++) + { + if (details.at(i).subType() == QContactAvatar::SubTypeImage) + { + if(!details.at(i).pixmap().isNull()) + { + int err; + QString imagepath; + QPixmap pixmap(details.at(i).pixmap()); + if(imageUtility.createImage(pixmap,imagepath,err)) + { + // Update contact detail + QContactAvatar detail=details.at(i); + detail.setAvatar(imagepath); + contact.saveDetail(&detail); + } + } + } + } + } + removeDetails(contact); + removeFields(contact); + emit launchEditor(contact); + + mCurrentRequestIndex = setCurrentRequestAsync(); +} + +/* +* Remove details not supported in symbian back-end. +*/ +void CntServiceHandler::removeDetails(QContact& contact) +{ + // Check definition map, remove details not supported + for (int i=0; i < contact.details().count(); i++) + { + if (!m_definitionNames.contains(contact.details().at(i).definitionName())) + { + QContactDetail detail= contact.details().at(i); + contact.removeDetail(&detail); + } + } +} +/* +* Remove fields not supported in symbian back-end. +*/ +void CntServiceHandler::removeFields(QContact& contact) +{ + // Replace contact + QContactManager cm("symbian"); + for (int i=0; i < contact.details().count(); i++) + { + QContactDetail detail = contact.details().at(i); + if(detail.definitionName() == QContactBirthday::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactBirthday saveBod; + QContactBirthday bodDetail = static_cast(detail); + + if(!bodDetail.date().isNull()) + saveBod.setDate(bodDetail.date()); + + contact.removeDetail(&bodDetail); + contact.saveDetail(&saveBod); + } + else if(detail.definitionName() == QContactNickname::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactNickname saveName; + QContactNickname nameDetail = static_cast(detail); + + if(!nameDetail.nickname().isEmpty()) + saveName.setNickname(nameDetail.nickname()); + + contact.removeDetail(&nameDetail); + contact.saveDetail(&saveName); + } + else if(detail.definitionName() == QContactNote::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactNote saveNote; + QContactNote noteDetail = static_cast(detail); + + if(!noteDetail.note().isEmpty()) + saveNote.setNote(noteDetail.note()); + + contact.removeDetail(¬eDetail); + contact.saveDetail(&saveNote); + } + else if(detail.definitionName() == QContactOrganization::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactOrganization saveOrg; + QContactOrganization orgDetail = static_cast(detail); + + if(!orgDetail.name().isEmpty()) + saveOrg.setName(orgDetail.name()); + if(!orgDetail.title().isEmpty()) + saveOrg.setTitle(orgDetail.title()); + if(!orgDetail.assistantName().isEmpty()) + saveOrg.setAssistantName(orgDetail.assistantName()); + if(!orgDetail.department().isEmpty()) + saveOrg.setDepartment(orgDetail.department()); + + if(orgDetail.contexts().size() > 0 + && (orgDetail.contexts().contains(QContactDetail::ContextHome) + || orgDetail.contexts().contains(QContactDetail::ContextWork))) + { + saveOrg.setContexts(orgDetail.contexts()); + } + + contact.removeDetail(&orgDetail); + contact.saveDetail(&saveOrg); + } + else if(detail.definitionName() == QContactAddress::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactAddress saveAddr; + QContactAddress addrDetail = static_cast(detail); + + if(!addrDetail.street().isEmpty()) + saveAddr.setStreet(addrDetail.street()); + if(!addrDetail.locality().isEmpty()) + saveAddr.setLocality(addrDetail.locality()); + if(!addrDetail.region().isEmpty()) + saveAddr.setRegion(addrDetail.region()); + if(!addrDetail.postcode().isEmpty()) + saveAddr.setPostcode(addrDetail.postcode()); + if(!addrDetail.country().isEmpty()) + saveAddr.setCountry(addrDetail.country()); + if(!addrDetail.postOfficeBox().isEmpty()) + saveAddr.setPostOfficeBox(addrDetail.postOfficeBox()); + + if(addrDetail.contexts().size() > 0 + && (addrDetail.contexts().contains(QContactDetail::ContextHome) + || addrDetail.contexts().contains(QContactDetail::ContextWork))) + { + saveAddr.setContexts(addrDetail.contexts()); + } + + contact.removeDetail(&addrDetail); + contact.saveDetail(&saveAddr); + } + else if(detail.definitionName() == QContactAnniversary::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactAnniversary saveAnniv; + QContactAnniversary annivDetail = static_cast(detail); + + if(!annivDetail.originalDate().isNull()) + saveAnniv.setOriginalDate(annivDetail.originalDate()); + if(!annivDetail.event().isEmpty()) + saveAnniv.setEvent(annivDetail.event()); + + contact.removeDetail(&annivDetail); + contact.saveDetail(&saveAnniv); + } + else if(detail.definitionName() == QContactGender::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactGender saveGender; + QContactGender genderDetail = static_cast(detail); + + if(!genderDetail.gender().isEmpty()) + saveGender.setGender(genderDetail.gender()); + + contact.removeDetail(&genderDetail); + contact.saveDetail(&saveGender); + } + else if(detail.definitionName() == QContactGeoLocation::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactGeoLocation saveGeo; + QContactGeoLocation geoDetail = static_cast(detail); + + QString latitude,longitude; + latitude.setNum(geoDetail.latitude()); + longitude.setNum(geoDetail.longitude()); + + if(!latitude.isEmpty()) + saveGeo.setLatitude(geoDetail.latitude()); + if(!longitude.isEmpty()) + saveGeo.setLongitude(geoDetail.longitude()); + + if(geoDetail.contexts().size() > 0 + && (geoDetail.contexts().contains(QContactDetail::ContextHome) + || geoDetail.contexts().contains(QContactDetail::ContextWork))) + { + saveGeo.setContexts(geoDetail.contexts()); + } + + contact.removeDetail(&geoDetail); + contact.saveDetail(&saveGeo); + } + else if(detail.definitionName() == QContactPhoneNumber::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactPhoneNumber savePhone; + QContactPhoneNumber phoneDetail = static_cast(detail); + + if(!phoneDetail.number().isEmpty()) + savePhone.setNumber(phoneDetail.number()); + + if(phoneDetail.subTypes().size() > 0) + savePhone.setSubTypes(phoneDetail.subTypes()); + + if(phoneDetail.contexts().size() > 0 + && (phoneDetail.contexts().contains(QContactDetail::ContextHome) + || phoneDetail.contexts().contains(QContactDetail::ContextWork))) + { + savePhone.setContexts(phoneDetail.contexts()); + } + + contact.removeDetail(&phoneDetail); + contact.saveDetail(&savePhone); + } + else if(detail.definitionName() == QContactOnlineAccount::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactOnlineAccount saveOnlineAcc; + QContactOnlineAccount onlineAccDetail = static_cast(detail); + + if(!onlineAccDetail.accountUri().isEmpty()) + saveOnlineAcc.setAccountUri(onlineAccDetail.accountUri()); + if(!onlineAccDetail.serviceProvider().isEmpty()) + saveOnlineAcc.setServiceProvider(onlineAccDetail.serviceProvider()); + if(!onlineAccDetail.presence().isEmpty()) + saveOnlineAcc.setPresence(onlineAccDetail.presence()); + if(!onlineAccDetail.statusMessage().isEmpty()) + saveOnlineAcc.setStatusMessage(onlineAccDetail.statusMessage()); + + if(onlineAccDetail.subTypes().size() > 0) + saveOnlineAcc.setSubTypes(onlineAccDetail.subTypes()); + + if(onlineAccDetail.contexts().size() > 0 + && (onlineAccDetail.contexts().contains(QContactDetail::ContextHome) + || onlineAccDetail.contexts().contains(QContactDetail::ContextWork))) + { + saveOnlineAcc.setContexts(onlineAccDetail.contexts()); + } + + contact.removeDetail(&onlineAccDetail); + contact.saveDetail(&saveOnlineAcc); + } + else if(detail.definitionName() == QContactUrl::DefinitionName) + { + // Not all fields are supported in symbian back-end, replace + QContactUrl saveUrl; + QContactUrl urlDetail = static_cast(detail); + + if(!urlDetail.url().isEmpty()) + saveUrl.setUrl(urlDetail.url()); + + QString stype=QContactUrl::SubTypeHomePage; + if(urlDetail.subType().compare(stype) == 0) + { + saveUrl.setSubType(stype); + } + + if(urlDetail.contexts().size() > 0 + && (urlDetail.contexts().contains(QContactDetail::ContextHome) + || urlDetail.contexts().contains(QContactDetail::ContextWork))) + { + saveUrl.setContexts(urlDetail.contexts()); + } + + contact.removeDetail(&urlDetail); + contact.saveDetail(&saveUrl); + } + } +} +/* Launch contact selection view with a given detail (selecting detail there opens the editor and adds the new detail) */ void CntServiceHandler::editUpdateExisting(const QString &definitionName, const QString &value) diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntservicemainwindow.cpp --- a/phonebookui/phonebookservices/src/cntservicemainwindow.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntservicemainwindow.cpp Mon May 03 12:24:20 2010 +0300 @@ -18,13 +18,18 @@ #include "cntservicemainwindow.h" #include "cntservicehandler.h" #include "cntserviceviewmanager.h" +#include "cntviewnavigator.h" CntServiceMainWindow::CntServiceMainWindow(CntServiceHandler *handler, QWidget *parent): - CntMainWindow(parent,CntViewParameters::noView), + CntMainWindow(parent, noView), mServiceHandler(handler), mServiceViewManager(0) { - mServiceViewManager = new CntServiceViewManager(this, CntViewParameters::noView, mServiceHandler); + CntViewNavigator* navigator = new CntViewNavigator( this ); + navigator->addException( serviceEditView, noView ); + + mServiceViewManager = new CntServiceViewManager(this, mServiceHandler); + mServiceViewManager->setViewNavigator( navigator ); } CntServiceMainWindow::~CntServiceMainWindow() diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntservicesubeditview.cpp --- a/phonebookui/phonebookservices/src/cntservicesubeditview.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntservicesubeditview.cpp Mon May 03 12:24:20 2010 +0300 @@ -1,4 +1,4 @@ -/* + /* * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available @@ -16,12 +16,10 @@ */ #include "cntservicesubeditview.h" - #include "cntservicehandler.h" -CntServiceSubEditView::CntServiceSubEditView(CntServiceHandler *aServiceHandler, CntViewManager *aViewManager, QGraphicsItem *aParent) : - CntEditView(aViewManager, aParent), - mServiceHandler(aServiceHandler) +CntServiceSubEditView::CntServiceSubEditView(CntServiceHandler *aServiceHandler) : CntEditView(), +mServiceHandler(aServiceHandler) { } @@ -30,48 +28,53 @@ { } - -/*! -Saves the contact -*/ -void CntServiceSubEditView::aboutToCloseView() -{ - // save contact if there is one - if (contact()) - { - contactManager()->saveContact(contact()); - } - CntViewParameters viewParameters;//(CntViewParameters::serviceContactCardView); - viewParameters.setSelectedContact(*contact()); - viewManager()->back(viewParameters); -} - -/*! -Cancel all changes made and return to comm launcher view -*/ -void CntServiceSubEditView::discardAllChanges() -{ - QContact oldContact = contactManager()->contact(contact()->localId()); - CntViewParameters viewParameters;//(CntViewParameters::serviceContactCardView); - viewParameters.setSelectedContact(oldContact); - viewManager()->back(viewParameters); -} - -/* -Handle signals emitted from CntCommands, only used for delete command for now. -*/ -int CntServiceSubEditView::handleExecutedCommand(QString aCommand, const QContact &aContact) -{ - Q_UNUSED(aContact); - int result = -1; - if (aCommand == "delete") - { - connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); - mServiceHandler->completeEdit(result); - result = 0; - } - return result; -} +///*! +//Saves the contact +//*/ +//void CntServiceSubEditView::aboutToCloseView() +//{ +// // save contact if there is one +// if (contact()) +// { +// contactManager()->saveContact(contact()); +// } +// +// CntViewParameters viewParameters; +// QVariant var; +// var.setValue(*contact()); +// viewParameters.insert(ESelectedContact, var); +// viewManager()->back(viewParameters); +//} +// +///*! +//Cancel all changes made and return to comm launcher view +//*/ +//void CntServiceSubEditView::discardAllChanges() +//{ +// QContact oldContact = contactManager()->contact(contact()->localId()); +// +// CntViewParameters viewParameters; +// QVariant var; +// var.setValue(oldContact); +// viewParameters.insert(ESelectedContact, var); +// viewManager()->back(viewParameters); +//} +// +///* +//Handle signals emitted from CntCommands, only used for delete command for now. +//*/ +//int CntServiceSubEditView::handleExecutedCommand(QString aCommand, const QContact &aContact) +//{ +// Q_UNUSED(aContact); +// int result = -1; +// if (aCommand == "delete") +// { +// connect(mServiceHandler, SIGNAL(returnValueDelivered()), qApp, SLOT(quit())); +// mServiceHandler->completeEdit(result); +// result = 0; +// } +// return result; +//} // EOF diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntserviceviewfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/phonebookservices/src/cntserviceviewfactory.cpp Mon May 03 12:24:20 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 "cntserviceviewfactory.h" +#include "cntabstractview.h" +#include "cntserviceeditview.h" +#include "cntservicesubeditview.h" +#include "cntservicecontactfetchview.h" +#include "cntservicecontactselectionview.h" + +CntServiceViewFactory::CntServiceViewFactory(CntServiceHandler* aHandler) : +CntDefaultViewFactory(), +mService( aHandler ) +{ +} + +CntServiceViewFactory::~CntServiceViewFactory() +{ +} + +CntAbstractView* CntServiceViewFactory::createView( int aViewId ) +{ + switch ( aViewId ) + { + // contact fetch service view (fetching contacts from for example messaging) + case serviceContactFetchView: + return new CntServiceContactFetchView( mService ); + + // contact selection service view (selecting contact to edit when updating existing contact) + case serviceContactSelectionView: + return new CntServiceContactSelectionView( mService ); + + case serviceEditView: + return new CntServiceEditView( mService ); + + case serviceSubEditView: + return new CntServiceSubEditView( mService ); + + case serviceContactCardView: + return new CntServiceEditView( mService ); + + case serviceAssignContactCardView: + return new CntServiceSubEditView( mService ); + + default: + return CntDefaultViewFactory::createView( aViewId ); + } +} diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/src/cntserviceviewmanager.cpp --- a/phonebookui/phonebookservices/src/cntserviceviewmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/src/cntserviceviewmanager.cpp Mon May 03 12:24:20 2010 +0300 @@ -17,7 +17,6 @@ #include "cntserviceviewmanager.h" -#include "cntbaseview.h" #include "cntservicehandler.h" #include "cntservicecontactfetchview.h" @@ -26,16 +25,25 @@ #include "cntservicecontactcardview.h" #include "cntservicesubeditview.h" #include "cntserviceassigncontactcardview.h" +#include "cntserviceviewfactory.h" +#include /*! Constructor */ -CntServiceViewManager::CntServiceViewManager(CntMainWindow *mainWindow, CntViewParameters::ViewId defaultView, CntServiceHandler *aHandler): - CntDefaultViewManager(mainWindow, defaultView), +CntServiceViewManager::CntServiceViewManager(HbMainWindow *mainWindow, CntServiceHandler *aHandler): + CntDefaultViewManager(mainWindow), mServiceHandler(aHandler) { + + setViewFactory( new CntServiceViewFactory(mServiceHandler) ); connect(mServiceHandler, SIGNAL(launchFetch(const QString&, const QString&, const QString&)), - this, SLOT(launchFetch(const QString&, const QString&, const QString&))); + this, SLOT(handleFetch(const QString&, const QString&, const QString&))); + + // Handles signal with mode selected. + connect(mServiceHandler, SIGNAL(launchFetchVerified(const QString&, const QString&, const QString&, const QString&)), + this, SLOT(launchFetch(const QString&, const QString&, const QString&, const QString&))); + connect(mServiceHandler, SIGNAL(launchEditor(QContact)), this, SLOT(launchEditor(QContact))); connect(mServiceHandler, SIGNAL(launchContactSelection(QContactDetail)), this, SLOT(launchContactSelection(QContactDetail))); connect(mServiceHandler, SIGNAL(launchContactCard(QContact)), this, SLOT(launchContactCard(QContact))); @@ -52,16 +60,30 @@ } /*! -Launch fetch service view +Launch fetch service view. */ -void CntServiceViewManager::launchFetch(const QString &title, const QString &action, const QString &filter) +void CntServiceViewManager::handleFetch(const QString &title, const QString &action, const QString &filter) +{ + launchFetch(title,action,filter); +} + +/*! +Launch fetch service view. Uses a mode to determine fetching type. +*/ +void CntServiceViewManager::launchFetch(const QString &title, const QString &action, const QString &filter, const QString &mode) { - 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); + CntViewParameters params; + params.insert(EViewId, serviceContactFetchView); + params.insert(ESelectionMode, action); + params.insert(CntServiceHandler::EFilter, filter); + params.insert(CntServiceHandler::ETitle, title); + + if (!mode.compare(KCntSingleSelectionMode, Qt::CaseSensitive)) { + params.insert(ESelectionMode, HbAbstractItemView::SingleSelection); + } + else { + params.insert(ESelectionMode, HbAbstractItemView::MultiSelection); + } changeView(params); } @@ -70,8 +92,11 @@ */ void CntServiceViewManager::launchEditor(QContact contact) { - CntViewParameters params(CntViewParameters::serviceEditView); - params.setSelectedContact(contact); + CntViewParameters params; + params.insert(EViewId, serviceEditView); + QVariant var; + var.setValue(contact); + params.insert(ESelectedContact, var); changeView(params); } @@ -80,8 +105,11 @@ */ void CntServiceViewManager::launchContactSelection(QContactDetail detail) { - CntViewParameters params(CntViewParameters::serviceContactSelectionView); - params.setSelectedDetail(detail); + CntViewParameters params; + params.insert(EViewId, serviceContactSelectionView); + QVariant var; + var.setValue(detail); + params.insert(ESelectedDetail, var); changeView(params); } @@ -90,8 +118,11 @@ */ void CntServiceViewManager::launchContactCard(QContact contact) { - CntViewParameters params(CntViewParameters::serviceContactCardView); - params.setSelectedContact(contact); + CntViewParameters params; + params.insert(EViewId, serviceContactCardView); + QVariant var; + var.setValue(contact); + params.insert(ESelectedContact, var); changeView(params); } @@ -100,67 +131,15 @@ */ void CntServiceViewManager::launchAssignContactCard(QContact contact, QContactDetail detail) { - CntViewParameters params(CntViewParameters::serviceAssignContactCardView); - params.setSelectedContact(contact); - params.setSelectedDetail(detail); + CntViewParameters params; + params.insert(EViewId, serviceAssignContactCardView); + QVariant var; + var.setValue(contact); + params.insert(ESelectedContact, var); + QVariant varDetail; + varDetail.setValue(detail); + params.insert(ESelectedDetail, varDetail); changeView(params); } -/*! -Create a view based on ID. \Return pointer to new object if success, 0 if not. -*/ -CntBaseView *CntServiceViewManager::getView(const CntViewParameters &aArgs) -{ - CntBaseView* view(0); - - CntViewParameters::ViewId id = aArgs.nextViewId(); - - switch (id) - { - // contact fetch service view (fetching contacts from for example messaging) - case CntViewParameters::serviceContactFetchView: - { - view = new CntServiceContactFetchView(mServiceHandler, this); - break; - } - // contact selection service view (selecting contact to edit when updating existing contact) - case CntViewParameters::serviceContactSelectionView: - { - view = new CntServiceContactSelectionView(mServiceHandler, this); - break; - } - // communication launcher service view - case CntViewParameters::serviceContactCardView: - { - view = new CntServiceContactCardView(mServiceHandler, this); - break; - } - // communication launcher service view - case CntViewParameters::serviceAssignContactCardView: - { - view = new CntServiceAssignContactCardView(mServiceHandler, this); - break; - } - // contact edit service view (editing a contact from outside phonebook app) - case CntViewParameters::serviceEditView: - { - view = new CntServiceEditView(mServiceHandler, this); - break; - } - // edit view when editor opened from comm laucher service view - case CntViewParameters::serviceSubEditView: - { - view = new CntServiceSubEditView(mServiceHandler, this); - break; - } - default: - { - view = CntDefaultViewManager::getView( aArgs ); - break; - } - } - - return view; -} - // end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/main.cpp --- a/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/main.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/main.cpp Mon May 03 12:24:20 2010 +0300 @@ -67,6 +67,12 @@ HbPushButton *button9 = new HbPushButton("Update contact with online account"); QObject::connect(button9, SIGNAL(pressed()), service, SLOT(launchUpdateEditorOnlineAccount())); + HbPushButton *button10 = new HbPushButton("Launch single fetch"); + QObject::connect(button10, SIGNAL(pressed()), service, SLOT(launchSingleFetch())); + + HbPushButton *button11 = new HbPushButton("Launch editor with vCard"); + QObject::connect(button11, SIGNAL(pressed()), service, SLOT(launchEditorVCard())); + mainLayout->addItem(button1); mainLayout->addItem(button2); mainLayout->addItem(button3); @@ -76,6 +82,9 @@ mainLayout->addItem(button7); mainLayout->addItem(button8); mainLayout->addItem(button9); + mainLayout->addItem(button10); + mainLayout->addItem(button11); + view->setLayout(mainLayout); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/qtpbkservicestestapp.pro --- a/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/qtpbkservicestestapp.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/qtpbkservicestestapp.pro Mon May 03 12:24:20 2010 +0300 @@ -1,6 +1,18 @@ -###################################################################### -# Automatically generated by qmake (2.01a) Wed 13. May 16:21:48 2009 -###################################################################### +# +# 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 TARGET = @@ -20,3 +32,7 @@ testpbkservices.cpp TARGET.CAPABILITY = ALL -TCB + +BLD_INF_RULES.prj_exports += \ + "testvcard.vcf \epoc32\winscw\c\data\others\testvcard.vcf" + \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.cpp --- a/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.cpp Mon May 03 12:24:20 2010 +0300 @@ -100,6 +100,24 @@ bool res=mSndEdit->send(retValue); } +void testPbkServices::launchEditorVCard() +{ + if (mSndEdit) + { + delete mSndEdit; + mSndEdit=0; + } + + mSndEdit = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "editCreateNew(QString)", false); + connect(mSndEdit, SIGNAL(requestCompleted(QVariant)), this, SLOT(onEditCompleted(QVariant))); + + QString filename("C:\\data\\Others\\testvcard.vcf"); + *mSndEdit << filename; + + QVariant retValue; + bool res=mSndEdit->send(retValue); +} + void testPbkServices::launchUpdateEditorNumber() { if (mSndEdit) @@ -199,6 +217,26 @@ } +void testPbkServices::launchSingleFetch() +{ + if (mSndFetch) + { + delete mSndFetch; + mSndFetch=0; + } + + mSndFetch = new XQServiceRequest("com.nokia.services.phonebookservices.Fetch", "Dofetch(QString,QString,QString,QString)",false); + connect(mSndFetch, SIGNAL(requestCompleted(QVariant)), this, SLOT(onRequestCompleted(QVariant))); + + *mSndFetch << "Single-fetching"; + *mSndFetch << KCntActionAll; + *mSndFetch << KCntFilterDisplayAll; + *mSndFetch << KCntSingleSelectionMode; + + QVariant retValue; + bool res=mSndFetch->send(retValue); +} + void testPbkServices::launchSmsFilteredFetch() { diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.h --- a/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.h Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testpbkservices.h Mon May 03 12:24:20 2010 +0300 @@ -32,11 +32,13 @@ public slots: void launchFetch(); + void launchSingleFetch(); void launchSmsFilteredFetch(); void launchEmailFilteredFetch(); void launchEditorNumber(); void launchEditorEmail(); void launchEditorOnlineAccount(); + void launchEditorVCard(); void launchUpdateEditorNumber(); void launchUpdateEditorEmail(); void launchUpdateEditorOnlineAccount(); diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testvcard.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/phonebookservices/tsrc/qtpbkservicestestapp/testvcard.vcf Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,320 @@ +BEGIN:VCARD +VERSION:3.0 +FN:Alice Jones +N:Jones;Alice;;; +TEL;TYPE=HOME,CELL:555-4444 +TEL;TYPE=WORK,FAX:555-1212 +ADR;TYPE=WORK:;;Leeds West Yorkshire;;New York;10087;United States +EMAIL:mailto:alice.jones@nokia.com +TITLE:Assistant Manager +ORG:;Services +NOTE:This is the note for the vCard. +BDAY:20100101 +X-SIP:Alice@yahoo.com +PHOTO;TYPE=PNG;ENCODING=B:/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAASw + AA/+4ADkFkb2JlAGTAAAAAAf/bAIQAAwICAgICAwICAwUDAwMFBQQDAwQFBgUFBQUFBggGBwcHB + wYICAkKCgoJCAwMDAwMDA4ODg4OEBAQEBAQEBAQEAEDBAQGBgYMCAgMEg4MDhIUEBAQEBQREBAQ + EBARERAQEBAQEBEQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ/8AAEQgBLAEsAwERAAIRAQM + RAf/EANcAAQAABwEBAAAAAAAAAAAAAAABAgUGBwgJAwQBAQABBQEBAAAAAAAAAAAAAAABAgQFBg + cDCBAAAQMDAgQEAwMFBwwNDQAAAQACAxEEBQYHITESCEFREwlhIhRxgTKRQiMVGaFSM9M0Fhjws + YLSUySEJXWVFzjB0eFicpKyQ3S01DVlg6OzRFRklKTERYUmJxEAAgEDAgMCCAgMBQQDAAAAAAEC + EQMEIQUxEgZBUWFxgZGxIjITocHR4VIUFQfw8UJiorLiIzMkNBZyglM1F8LSQyZEJTb/2gAMAwE + AAhEDEQA/AOqaAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAI + AgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAI + AgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAI + AgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAI + AgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAI + AgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAI + AgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAI + AgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAI + AgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAI + AgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAggIoAgIIAgIoAgCAIAgCAggCAICKAIC + CAVQEUAQBAQQEUBAmiAVQEUAQBAEAQBAEAQBAEBA1pwSoJC4gqFqySNSVS6kEOojmqm0KEanmUY + qiPEngVFAeczngijgKcx5qltrVqoqlxIteSRwp9qiM3JcKFOpP8AmqutCohWqlSTAr5IB1E8Cqg + KnzSqAqQmgoQB81TIiqIOLvA0+1Q02tCGn2BvX18TX4ImqFVVwJuo14BQqgVKrDRKXOHAn71S2U + 6vgRcSQADxUvgVUFXDhVCKqoL6eKjVFVGC5xHAqFIgfMeSqTqidCbiqWnUggSQqwQqaoU0Yc6g8 + vtVLdCqqROOSqBFAEAQBAEAQBAEBJKaAfaqJxbRKMDbq96OyWzGtLnQmuLy8iyttHHNLHb2hlYG + ytD2/N1DwK2jb+m8/Msq5ZhzIxV3Pt2rjjJlo/tJO2Q/+v5EfH6E/wBuskujN3f/AIX8B4/a2P3 + n24P3Ee2nO5Wzw8OWvLaW9kZBFNdWnpQte9waC9/WaCp5q3u9H7tFVdl6eIrjuuO+02Tjuop4Y7 + i3cJY5Gh8cjTUOa4VBB8iFpzfK2no1pQy0eWSqj1B6vmCh6ktUZYW8u9WhditNRat1/LNDj5Zm2 + zX28XrP9Rw4VFQsttu25ObcduzHmdKlrkXrduKc3QwuPcj7ZC6gyGRqCBxsSOJ5fnrZX0Xuy1dv + Txli91sU0Zshg9Q2Oo8HjdR45xdY5S3ivLZ7qNJimYJGkjw4FaVctStzlCfFOhlITUrfMYU3G76 + e3PbK/ucTlM+7K39k4su7LDxfWSRPBp0u4sbWvkVs2L0tuV6PNC06d704mNnuViPFli/tQ+2v/w + Bl1CP/AMU3+PWR/sjdn/46eU8vtfG+kQ/ah9tnP6XUFP8AJTf49F0Puy/IT8o+18b6RH9qH22eF + rqD/Nbf45T/AGRu3+n8I+2MfvPW29zvtqubhluY85AHf8/LjA2MfaRMT+4p/sfdv9P4SPtjH7zO + +12+W1+82Ofktus/b5f0QDc2sbum4gr4SROo4Favuez5uBJLItuNeFeD8RksfItXfZZSN7O5TbH + YD9Vncee4g/W/qfRfTw+tX0iOqvEU5r12vZszcE/cRrTj4CjIy42NZGLT7k3bC3qe6/yLS3zsTx + Hwo8rNS6L3SEeeUKLxlp9p2OKZszh8vb5rF2mYsSXW99FHcWxcOkmOVvU2o86Fafdi4ScXxTMs5 + JpNH1iYO5cSK1+7hT7V48zSqVUdDDm8PdpshsflbfT+uM0TlZm+qcdZx/UTQx8g6QAgNBIIC2Tb + +ntxzoc9i25R+l2GPvZ9qzo2Y+PuSds1CDf5AU4EGxPP/jrLS6N3VL+Hr4yyW72qmWdmO4HQ+/F + te5HQUF++wselsmRu7X0LZ8jj/BxvLj1OA4mgp8VrW4bVkYU+W9pL6PavGZW1dhdXMjH2s+/nt6 + 0LqzLaM1Fe3seRwtw60vxHaF8bZWUrR3UK81nMXpPdMm1G5at1TVSynudqE+VlW2r70tkd5dY2+ + gtEXV5Llblj5IWT2vpMc2Npe4h3UeQCtdy6Y3HEsO5ehypUKrGfavT5U9TPVagA8Fq70Rk6Ern9 + HDx5pKXq1JSMXb19yO1mwMWMk3DvpIX5Zz22dvbR+vKRGKue5tRRvhXzWd2vZc3PUvcQ5uXj4Cx + ycq3aS5mYs/aRdsxFW3+Rd5Btjx/5azr6M3ZL+E/gLH7Xx12mQ9mu63Z3frL3+B0DfzSX+Phbcz + W93B6DnQlwZ1RguPUATxWH3Lp/P2+2p37bSfAu7GbYvcGZlaeAWATMgTKQEAQBAEAQBAEBJKKto + qZEp0OQPuKUb3Q5wGv8msKiv/u0a+pugly7TCna36Wc23ht5Mq+D0GtMbXPLumtGCr3AV6W+Z/K + t8jedTBtUIOa0/o3AOB/NPiOVHfFJTrHmpwPSp0b9vru2uNQx2uxW5V8H5K2ZTS2UlfR11CwfyV + 5PAvbQ9Hi4cByXz51x0osZvJtaxb9bwN9xum17gperI32DyOFOHEg+AC4+3SOhtulKmn3ueua7Y + XHvI6h+tbY08OC6j93Scs+VdNPjNa3xJ2U69pywDz1MNPzm14+JcvpK4/WpxRodtJvVnVbuO3Lz + G2XZDgbjT8xtcnmsVisZb3cZo6Jk1vGZi37Yw4fCq+bNq2+3m9Q3YT9lTnLhWur0OgZN73OEqdy + +I5UBge6hJdU/jdxq7nUE8acePxX0lasJJqPYvgOfyl2v8NS9cTslu5n8dDmMRo7K3NncjrguGW + M/TI3wc2rORWt3epNrjNxd6jWjLxYN+Sqon1f0fd8By0Plj/gU39qqf7n2pf+ZfCVfZ+R9H0D+j + 9vgOP8xssaeH0U/wDaqH1TtP8ArR8zKlt2Q+z0Fuao0RrPRd1FZ6rwl7hZLhvVCy9t5IPUA/el4 + ANPGiy+37ji5zf1eSly8fwZa3se5aVZqhdfbzuRnNq949M6qwty6Gl3FbZKIE9M9rI4CSN/mCsb + 1BttvNw5wmlzLhpWhcYmRK1cTTNv/daeHDb51BRzL0mviKxGi5b92cVz3k21ojZ9+p7uPec+J3t + 6ZT0mhb+aeNPED7l3CUUseUaV0ZpVtVcde0717ZV/0daYHP8AxdaAH7IW/ur4x3FfzU/8T0OsWa + e6VDWXvC74cZs+y40Bto6HK6xkb0XlySH2+MDqj5qVDpQfzfDxW+9L9IXtwau3U1ZXdSr8j7DC7 + hukYepF1Zy6zeay2fyl7qHUN3JkL+7kdLfXly4vfJI81JLnVPjy8Avo6OPbsUVuKgkl6qpTx6d5 + otycrk/Weptl2mdh2e3clttd7qMmw2kAQ+1sGj0rvJ9JHAg0cyIitSaE+HDiuWdUdbWrFbGMoym + 9G9Vy+I2Hb9qlL1p6I6g6Z0zgtI4S105puxix2MsWCK0s4GBkbGDyA8fM+K4Bfv3b03O5Jyk+16 + s3eFqMI0XA4o90Ly3uH3GZw45ievDhXpbxX1x006bZZdPyEcyzlTKZkj27Kf0ocEB4Wt9Q/wCDS + LB9df7Rc019X9ZFztP9XGnhOvgHHyXyynVUZ0jU+HMZKww2Pusvk5mwWllDJcXU7jQRxxtLnOP3 + Ar3tWpTkoR1bdEimcuWFWcTe5feu/wB+t2ctrOdzhjIXGxwFvUkRWUZ+VwB4/pKeofi5fWvTOzx + 2/BUZKk37Ve/yHMs/Id117NTFVHHn+H76flW0yq7Tro6cDG0SL02e3Pzezm5OG3GwBJmxsoN3b0 + FJrWQdE0VDTiWF1PJ1FhN729blhOw9KLQvsXIdqVWdxtFaxwuutK4rWGAmE+Py9vHc20jTX5Xip + Bpwq08D8V8g5WPPHvStTXrRdGdNs3Izgmiuh9RVW57EQaqKgipAQBAEAQBASu5KHwByC9xQB3dF + nfP6SwPHw/vaNfUPREqbRb8cv1mc33l/zUvJ6CzuzTHY3N9yOj8RlYGXdjezSw3lpOwPilY6F4I + cDULL9Uydnar04uj5dPA6ot9vgpZEVLtZWu8DteyXbzrd1xiIXz6Nzb3yYW+oXNtnVqbWUmtC0H + 5KniAsV0j1Lb3PG9zN0uQomu9d9a6svN0wHYlzLgzAtjeXWOuoMlYTyQXlvI2a1uIXdMkcrHVBa + 5tCHA04+C3qUVcqp0a7qVRhudxacTrh2V901lv7owaf1JM2HW+BjazJW5IH1kDQGtuWU51/PHgV + 8udW9N3NsyOeCrblwfy9x0LAzo34KNdUWt7n4/8A4JY08crb1WY+7xfz83+b8Zbb7/Bj4zleD87 + a/vm0/KF9G3OBoUFqdG++MEdmW2R8m4k//ILgnSv/AOhveOfpZu25a4cPEvQjnOxpbNE0UaTJH8 + QB1Dku9OUeauvA0uLjU776KAZpDDCJoawWluGhoDRQRilAOS+LM11vzb+k/SdZsJK2vEVsEnxVl + RrVM9yD69B4/fzSLrxINF/datbcbY6HvegC5GbkibNSrxG6yle5gPkS0GnwXV/u8lN504J0VPkN + b3yEfcps506P46rww87u3qfteF9C5jfu34viNFt+0b3e61/BbeDxLLz+vEuJfduv317yG376vVi + c+ZgDBIKnlTh8fH7l229rF1NPte0jfjuB78P1Jt/idqNk7snIsx1tbZ3VLKBtuRC0Phtqg1fQ8X + 04eS4ns/R7v5c7+WqQ5qxVeOvajbcrdoxsqFvjTuNDw+fIX4eTJd3Fw+nWXOkmllkdzJJJc5zuH + ErtzsxtW+VUSppp6TVXzNVfFnRftB7AYMFLY7mb4W0V5ejoucLpg/PDAXUc2W6BqHvFeDOQ8arg + PVHWk8iDxsbSOlZUalVcaa8PCbftu009e5xN8oYY4Y2RwtaxjQGMjYAGBreQAHIBcgc23rqzbKd + iPRg5gcvM8yqdV4iTh33Rf6xm43+Wbj/ktX2H03/tdj/Cjl25f1EvG/SZJ9unj3RYL/o1/wD9Vl + WB69b+yp/5f1kXWz/1UfL6Dr259OPh4r5cR0Vtmj3uU9wjdMaXh2R0xcdGW1CwT517DQwY8E9LC + RQh0jqEf70HzXWugdh+sZDypr1IcPH8xrO9ZihH3aevac0IIJZ5Yre2ifPM9zY4IWCsj3EhrWsA + 5k8gF9CXLvu3KfYlV+JcTSI1k6LtOmUHY1ZHs3Og5bSIa8fGM+6+aA4nIhpeIOulfT6D09Pmvnd + 9VS+23e5n7jmolrw76V7ze/s2KxHp61DmhdW1xZXU1pexOtp7V74poJAQ+ORpo6NwP5wPA/FfRF + q5GVtTb1eqoaPJONYvib8+2f3A+hPd7B6nuj6cvXe6Uc8khrh/DWwJ4D9+0eJJXEOv9ilBLNhw0 + jLh29vA2vZsxL93J8TomwcKDlzXDotVNx4Mnjr1EHwVdFUpq6nopKggCAIAgCAldyUMHID3FQD3 + S5vn/JbCv/w0a+qeglF7RCvfL9ZnPN3p9ZnXuXoLb7I2tHdJoUNr/KZP/QvXp1PNvachS7I/Gi1 + 2n+phXvOt26W2OlN39EZLQesrUXOPyEZaSKdUMg/BIwnkWHiF8v7fuFzCv++stqSOi3bCuwpJHF + /fLZjVOw+4V7obVTT0QkSYzI9JEV7aOJEczDQceBafGoX1psm9Wt1s+8g6PtrRa9ulWc1zcV2J8 + pb+3+vtVbY6vxuuNIXbrHKY2VssRBPQ9oqHRyN4dTXCoKvtwwbW4Y8rEo6NeI8bF+VmXNHsN3+7 + ffTS3cF2gYfWWnXhl1FlLaHO40uHqWV20Ava9vPpPNjhwoR4rj3S203du3q7ZnwUVR60aqu3wdp + su4ZccjGi1xrr5jn8a9bByJcwgD8NCQu43OBqcOJ0b74iP6GO2VP3mJ5/5PXBOlV/7De/xT9LN0 + 3JfykPEvQjnMwv9eGvJr4y7hWgLxw+1d/m4N8Hwf4fCabCMTv3o8EaUw4cOki0txT7IwviXMivf + zf5z9J1m17Cp3FYAANVbVVCujqQJ4KlMqoaOe6y4f6K9D0/F+vnmn+ATgrqX3e1+0JOn5PyGr79 + /BS8Jzk0fw1XhQPG7gp/xwvojMX7p+I0m37aN7/da/gtu6eLLyn/AJpcU+7f+Pe8ht+/ezE58SH + pikcaijT8wFSOHku3XvYb8Bptv2kdCd/+xK31jt1it1tmrRtvqF2Ns7jM6fhp6V+BAC99vWgbL8 + OTvtXDtp6xePmTsZT5oczUZUXMte3wG4Ze1KVlThxoc/bm1msrp9leRSW1xbudFJbyNMcsb2cC1 + 7eYdUeVV3KOQrsFKDr4qUp4eJqcuZaS4o3P7R+/fLbfSWG3W8tzJkNLuDbexzz/AJ7rHEmjGynm + +Eef4m+AK5F1P0TG/F5GIqTWsk2/W8WhtG27uo0hc8h0ww+axecx0GXwt3FfWN4wS2t1A8SRPYe + NWubULgly1O3JwmqNcUzb1NcVqj72Oq4j8n3ry4o9a9pw77ov9YzcYf8AjFxT8jV9gdNf7VY/wn + L9yX8xLxv0mSfbp/1osGfO2v8A/qsqwPXv+1S/y/rIudn/AKqPl9B1U3H17gdsdEZjXup5hFj8N + byXMvEVcWirWNHi5xoAF814WFPLyIWocW/xvxHQbl2MYuTOH+624ue3Z1/mtf6kk67vLTulDK1Z + DDX9HG3ya0cgvsLbtvjgYsMeC0SOX5GS7t1yfaV7t41vt/tvunitfbj4y6y1hgy65ssfZxxvLrx + v8FI71HsFGOHUrHqDbsnMxJWLElFvi5d3bwqemHdt2rlZ6+I3rHuo7S8HO0nmeFajptjx+H6Xku + LP7tc9RVblvzv/ALTa/t6xXg/gNGO4TXGgNzd0crr/AG1xlxiLHNkXOQsL5sYIvXcZJWem5wo9x + Lj8V2XYcDKwMaNm/KMpLg13eFmqZt21cuc0Uyx9K6lzWi9Q4zVmnbk2mUxFzHeWV0ePRLEeB+xZ + rOx7WRB27irCSoy3hc5LqlHsO3ewu7eK3v2uwu4WLAidfRBmQtA6ptrqP5ZYj/wXL4/3fa7mBky + sT7Ho+9dh1DGyFetpoyIz8ZpyosOmuHaXZ6KogIAgCAIAgJJa9HDnUKKrtJRyC9xN7h3Q53h+K1 + sBWnlbR+K+o+hI02m3Xg3L9ZnON4XNlS8noLY7H3tHdFoRgrX6qWp8P4F6u+rava7yfBR+NFtt0 + X9ah4ztAQAR5HiV8o0TOnSbqjC/dF26YPuL2+mwNy9tlnLAuuNP5d7a+hOB+B9OJjfSjlsew75P + bMhTXsv2o9/i8Jjtww1fttdpxu1XpXPaC1Pk9G6rs32WYxMroLy3fxIe00q3za7mD4r61xM21k2 + Y37ck4SWi7fxnN8nHnalyspsN9eW9pNjoZXC2uix11A0nok9N3U3qHKoXtKxGcuaWtOB5qToeNf + 0jB/vm8/8AhBHcTXs8CmC1On3djorKau7G9M5HFQOupNP2GHyD4o2l7zD9OyJzgBzDWvqfgvnfp + /MtY3UVx3NE5zXws33MtueGqLgjmA6WoBYeNKsq6hA514EflX0WrUuLdU9fIaEoupsBpTvv7mtH + 4Gz09j9TRXNnYxtgs/qbO2klbE0Ua10np1dQDmVpF7o/aJybdnV/nT+Uy0d1yIqilSngRV/2i3d + IeWctB5j6C2/i1brobaUv4f6U/lPT7ZyfpfAvkH7RXukPA5y1p8LC3/i1H9kbT/pfpT+Uj7Zyfp + fAjF27/cHuvvrcWMu5WX+vjx3V9BaRwxW8UTnj5nERNbU+FSti2rZMHbpN48eVy46t+ksr+bdvq + k3XzFM2Z0lkdcbq6T0niY3SXeRyFu0Bo/AwOq57vJracSvTesuGPiSuTlwRGNZlduJRN0/dWb0s + 28Y8ElrL0FopXgYguS/dq/317xG0b9H92mc+J29UUoaC0BvCvOv3Lt12L9xJp9hp0UvVo+J3t20 + p/o4005nD/F1nTgf7i1fGe5L+aud/M/SdVsqlpU7jXHu/7I8LvdbT6629EWK1rE0l8NGxWuUNal + sxp8sh8HinH8S3XpbrG9tv7q5WVnu0r532GJz9shdXPFescs87gM5pTM3um9R2clhkcfI6C8sJ2 + lskb2UDuBFCOVD94X0li5Vm+lO26qla1rx7NDQ7tuUJUkqMzn2u94WtO3XJx4u8a/N6KnePr8KZ + P0lsDw9W0c40aRwJZXpIr40WjdRdJ425xdy2vd3F2uvrGZ27dJ2nyydYnWPbTc/RW7WlbXWGhMl + HkcdcgOqxw9SJ54lkrObHg8wV835uBkYl1wvRcX4U0bzZyIXY1icae6No/pGbhioI/XFxQ8q8Gn + kV9W9P862rGaf5HxnOdy/qJ/h2mRvbrFO6LCDj/Jr8t++2kWN+8KKhtLp28v6yPfaIv63B+P0My + j7le/w1Dn7XYzTU4Nlh3tu9RzRuqH3gFY7dw8oxR33rSugdiduKzrq71Ff9VTJ7znVraXA0gxth + d5bI2WIx8Rnu76aK2tYG+L53Bjf3SAu15FyHuncboo6t18HA1i1Zd2fLE2xg9sff+WFkrr/FxPe + 0F7DK6rS4VINPKtFyh/eNhKbpCb8qM+tju07ice2Dv4KUyGJ4eUjlC+8XA5ub3Uq+NEvY7veiSf + 2xt/o43yR32Kkc1rnNYyVzS4tHBoqacSvX/kjCfG3Lzoqjst1OtTU/LY29xGWu8PkIjbXthLJa3 + VuR8zJYnljqg/EcF1GzOE4xuKS5ZJNeX5DXblqVpuMja328e4Ru2O479ttRTlun9Xvay3dWrbfI + gUY414NY5oLTT86i5d11sDysb6xBVuQfh9nUz+zZTty5W9Dq3C7qcR8OBXzlHvN946nsqwEAQBA + EAQEkn4fOqpkqolGpW/vYLhd+NzL7ca+1bPipr6OGL6OO1bK1ogjbGOJkb5eS6PsvWUsDFjY93z + ctfyqcXX6LNczNp+sXObmp5PnKfsx7dmB2c3Lwm5FprG4yMuFkdKyzfZtibKXNLaF3qupz8lc7t + 1tLOx52fd8vMqe1X/pRGPsys3Iz5uD7vnNwgARxPDyXMKGxJkPTA+Yn7D8CoohF0NeO5fsu0J3F + ZSx1LPfP07nLZoguMpawiR11bipEcreptek8nV+C3np7qq9tqcGnO3rSNaJN9q0Ziszbo5DrWhh + Ae1Jpo8Rr+6pSlfoG/wActvh95corldiv+f8AYMN/b35/wfORHtR6ZBY/+f8AdcCCP7xaK0Nf7s + k/vJa0Vin+f9kmOwcsk+f4PnN1tP6SssJonHaGuKX9nY2MWMkMzeE8UUIhIc2pFHN5rkORkyvZM + r+sW5OXiq6m0xglDkqaq7ke2JtDqvJT5TROUutIPuSXusoWC5so3E1/RwucwtHmOoro2B94G4Wl + S83cSpTWnxGCvbOp8JfB85j79kvIaj/SgRX/AMEH/a1sv/J1umuKq/4/2SxfT/5/wfOP2Szxy3R + P+ZG/9sVK+8/ux/0/2B/b6+n8Hzg+0u/x3QP+ZAP/AKtT/wAnV/8Aj/p/sj+319P4PnPosPaas4 + bkSZHcqW4g49UcWJbC8/2f1Tv6y8J/eS5cMf8AT/ZH9v8A5/wfObKbBdom0fb7NLl9MWsl9nLhn + py5y/eJZ2sIFWQ8B0MJFacftXOd46jzdwThOT5OKj2Gcw8CFhacT4e6DtQxvc0cE7I5+XBjCCcR + mGATGT1i0k8XtpTpV10z1M9oc3yc7mqcafEyc3B+srjTyfOYDl9qLTLmOB19cnqBbU2DeNfE/pl + t9z7wpyhyK1TT6X7JhYbDyyrzVp4PnN6NNYZunsBjtPskMzcdbw2rZiKF4iYGVp9y5Jeuu7dlOl + Ktvzm0xilFRPucCKuJ5cAvOa9XTie0pJIwN3H9nu3PcWLbJX5OE1Da0EeftIw6WSL+5zNq3rA8K + ngtv6e6nyNt01nb+hWir38GYnK2+3f10T8XzmBG+1DpkENbr+64Cjv7wb/HLeV95Lr62PX/ADfs + mGewxb0n8HzmSNjOx3ObBatj1Hozcu7FrM5jcrhZbEG0vYWni17fW4Op+Fw4j4rWN56os7hCk7F + JfS5qtfol/i7ZKxWk61VOBbm5ntq4DcfcPUGvrnWtxZy568lvn2os2yCJ0gA6Q4yio4eSym3dey + xsOON7rm5VTm5qf9Jb3tl95NycuPg+crWxXYFititwbfcPEaxnv7u1guYLeGWzDWB1xE6MONJTX + pLq08VZbv1nPNxXYna401cq8HXuXpPTG2pWbilzcPB85Z2b9rvGahzGQ1Bmdxr24yGTmlu7y5fZ + NLnyTPLiambwrQfBZi394StWo2oY/LBKlFN/9p5XdjVyTfPq/B85d2yft26I2j3DsNwchqCXUku + IDpMbZXFs2KNlwR0tkPzv6i0E0FOfFYbd+t72XiuxCLhV6vmrVd3A9MPZ3Yuc3NXyfObcw9TiSR + SvHpryXN3xNj7eJ69J8kqySXoPI8vBHLvQNRN7/bv0bvBuJkNxLPUUunp8t0vyFnBbNmZJcAdLp + QetlKtA4U+K6Vs3W13BxFjyg7iTqqypT9Fmu5mzxvz5lKnk+csSH2p8DazxXdpuFdw3Fu9sltMy + xAdG5h6muB9bmHAGqz//ACS5RcJWKpqnt/slstjpwn8Hzm8elcbkcPgrDE5W/OUu7OCKCfIuZ6b + rh8bQ0yObU/M6lTx5rjt65CdyTiqJvh3GzWoOEEm6lYXkegQBAEAQBASS/h+9BU8nH4ceYovJLX + wkNNo+G1z+Du7j6W0yNvPNxIhinje80ND8rSTwXtK3OCrJNLwkNx0T4n3B1a/1VVNRFUrUPJDae + PkUSbepNF2kG+BcfuUcrXaGu1ESWcwfxcKImmyKkS5lA3kfBUr2tSXRMhX82nCnA+KPWtdCG3zE + 4IA5pVIqfEiSBxqnhJJeoNNTwryVVK8CFVkTI0AfFQ2l2gh1ivL+vVFqK9xbk+4Oi7LVsGg7vN2 + sWoLuP6i2xLpmC4kiqW1a0mvEjkrqOJelZd3lpBOlTxlkQ51BvUr7T1M6j8oPEfYrNRqerjXgTU + HDjwPjyXsTRoma9v4l5QlzBa6h7qjp81Dk4kOjAYACAq1w0FexHg65tovllmawjn1OANPvUJ07R + pHQna9rj6rHdTPBwII/KqW1XiOTUm6mk+Xn9q9KNiUqEatePjXijSITrxBdQ1fw+xRHVaBrWpK1 + wIqOPGhKToTzV4E3U0fM3h5qaJBpE3V8fsU1KSzNe7w7dbY3mLsddZmPFT5qUW+LZIyRxnkcQ0N + HQ11OJ8VksXb8jJi5Wo1S4lvdybdppSdKl4NdHLGJAatdRzSPIrFet28S6UlTQg+SJtGuPM0UUf + EmLq6I9Y3tcflP3KqOupTXWh6KoqCAIAgCAIDzlNGj7VTKVEQzSDvT3D1zr/drSXattjlJsRNmX + R3Oo8havLHMhe8fK5zCHdLGfpCARVdR6WwbOPjXM+9FPlTcK6ptfhQ1zcbkrl2NqLprr5jJ23/Y + 1tTt3qXTmsMNkszJmtOSi5E02QLo7qXoLSJmFtCw1JoKfasLldWZORauWpW7ajcVPZ9bya6Mu8f + bIWpqfNKvhehW9wu83t+2w1NPpHU+ourK2lW3lvYwSXQgeDxZI6Ooa4eRVngdLZ2Xb54xST4cz5 + dPKemRuNiw2pVfi1Mm6D3I0VuZpmLV+hspFl8VNUC4gd1dLwA4scOYcAeIWvZmLdxbvu7ipJMvb + d2Nxc0dUzG+W7xe3/A6SttZ5LUnRY3tzdWNpbiF77qWeyeI5+mAfN0scQCVsK6Zz5Zn1aiU+Xm4 + qmtO0t3nWFHnroXZtDvztfvjj7m/24y7MgLFwbeWr2GK4hr+EvjdxANOBVju2zZW3XPd34pN9qf + MvOj0x8q1fjzQ7C3Mv3cbEYDC5jPZXUAt48LfSYu5tnxO+pfdxU6mRRfifz5hXVvpvPuzhGMV6y + qm3SPlk+B5yz7XM4viio7RdzGz2+N1d2G3mZ+tvrBokuLCWJ0E4jJA9QMfQloJpXzVvu2yZW30d + 9LXti+ZfAelrLt3J8qep927W/8AtVshZW91uJmm2Ml6T9FZRtM11OB+JzImfMWjxKtdr2q/uE6W + FXx6LzlV/Mt2nSXE8doe4vaXe8XkW3eabf3NjR13YytMFzGw8BIY3/N0k+Ku942LL26SjeSVe58 + y867SnHy4XX6rPbdruA2p2QtLa43GzcdhNefyOxaDLdTNr0lzIm/MWg8yrPa9qyc6fJaSr4XRec + jKy4WKcz492pZDe97YO50Fk9wrTJXT8Xirq3x08jrCZrxdXjZDA0McASHem7jyWcu9K59rIhjyU + eadeWkk1pSuvlPB7haVty1ovAYR7Uu9zT2Svc1id2s/eTZrVGoGs0tYfTumjhtr2QRQxNfG0BoD + nAOryW09R9JXrVmF21FKMIevquPgRjdu3OEpSWur00Kth8h2i7od39hrjCZzKP1/ZXE1s3F+i5l + jLd2RdA55c9hPDpIoHUPkvDIs7nibI7NyFv3MnGXNWs/W4I9IXrFzKrV8y7KGwub7k9m9MZHVGL + 1Hn48dc6RERzDLhjmUM7S5girxkJpSgWi2toyrtuNyMaxm6V7PK+wyk8y3CVGykbV922xm8WpP5 + qaIzply5Y6WCxu4H2z5msFXekJPxEDiaeCvc/pzMwbCu3EuRvsfN6Dys51u7Kka18JeO6G8W32z + Onv5y7jZePF2jnenAHVdLPJ+9iZzceKxO37XfzbvJaj8VPGy8v342o8z4Fg4vvP7es3pLM6us9R + n6TBOhGRtpIHxXbRPK2CNzYHfM5pe8CoWdyOmdxtZMLPKqzWlGmtPCWq3Gz7r3nYZvsruHI2Fvf + WriYbmNksTiKEskaHDn8CtVvQlBuL4p+hmQjLm1Rz3310hDud7hlntvncnkrTDZHFWDpmY+8ltv + mZbzv4Brump6fJdu2bMWF019ZhCEp88l66TNYyLTu5fJzU/EeG9+isz2K640NuVtrqvLXulsvem + w1BhsxePu29Df00lCQGhpZWnCod48aKnacq3vuLes37cYStx54u3FR14alOVZliTUoydGbpbk75 + bZ7UaUstU7g5dmLtclG19nCR13Excxr6RRt4uLQRWi5RgbXkZd92rUatPi9F5+Bnp5du1BTmUna + Lud2a3svrjC7fZwXWQtY/VfjrmN1vcPirQyMY/i5oPAkK63bYMzb2nfSo/ovm8/cUY+favv1XqV + vdnefbnZXDRZzcjLMxdvcv9OyjoZJ55BxLY428XEDiaK023bb+Zc93YWr79EvKet3Lt2IvnZRNo + e5/ZnfDIXGG0HnBPkreP13Y24idbXLoagGRkclC5oJFSFc7psGbt9JZEVR/RfN5yjHzbVyqi9Sr + 6n3z2w0ZqybRepswzG5K3xz83M65BZA2zjcWucZeVR0k08laW9qy71r3tqNVXl4lVzKtwVWyytE + 96vbvr3V1rozAakP6yv3mKy+pgkggmk/NayR9Gku/N81nM3pbcsbGd2cY0SVaST4+I8VuNmTiq8 + eGhgz3H/m1ls04/hbm4CSQDQ/UMpVbF0cozxL6/DgzE7smrsZeD4zb3Xu5OitqdInV+vspFicZA + 2Nhnl/PkePljYB+JxpwAXP8ADwb+Xf8AdWVzNt+TxmfnfjbtqUvAWFth3dbDbvahj0ppPPg5aUd + VpZXkL7V85ALumIS06jQE0Cyud05n4Fn3l6Ko3T1XzegtbGdbuSai9fMZph4yPIFBy/qC1lUoZN + 0PdSQEAQBAEAQHnN+D7+K85pulBSpoXhLE5D3VM9czPr+rccDCw8W/pcNCD/XXX8vlj0lZp7Tk1 + +lI1ZJy3F+T0I273m1PNofafVerbQF02Kx1xcQt50eGEA8aVoTVc12jDWTnWbc+2SM/m3eSzKXc + jWD269q9KZvZLIbjatx8WazOsL++jyV7fME8r4oZXQljnOrwcR1Eea3brDcb0cmNmD5VaikqaeE + xW2YsPductWy3+zR8+2Xc7vDsfjpiMFC593jrF7z+gkH6RxY11OHQ9rfsAWV6n/ndss5TWq5Yun + h8PkLPb77t5LtNPtfmPi9vDbLS+pNWbj6/1HYRX13isobHCNlHW22ZN1vnc1ruAc4gUPlVXPX2f + K07di26RpzPvrSnxnjtGNblGVaunylb2J0/YaB9wvc3SGmoxZ4qXHwXEtnF8sZdPDHdU6Bw4PeS + sdvUnd6cxLsva55Vfiqi8xIK3l3Iw4fiLS7RtstNa47td1NS6ktGZBul7yV9hbXA9SJlxdyH9KG + u4FzRHwNPFZTqXcLtrZMW3B0jcj63e6fjPHFsxuZc2+CLhmwmM0d7n+CsdMwjHW2Wx0kmRtYAGR + SP/Vc0n4R5uHUfirCzJ3el7s5ttqS8nrIqlBQ3CKXB/Iy2sFqnb/X3flrPVe9WVtLfDaNjdZaas + cs5ogDmNaG9LXcOpj+p/wDZfBXd/GyMbYY27CblNqTa8OvzHnZlC9luU+zvPtyeptvcJ7gWgtRb + OZK0mx+sojaZ6HGSNMDz6by75G8A5zw1zvPpVvas5E+nZxupJxlJ+txKpuuapQfq6FU2nw2J7he + +vcDUuu4G5Gz0HA2HC4q5aJLeNzJfpQ5rDX8L4y+v77iqM67LC6dx3ZaXvXJSa4s98d+9y7jfD8 + RuLq/RekbjSObtrjCWhiktZpJYzBGQ58EMnpvpTiW9RofCq5jZvXI3oST1TWpmrtuPu2u9Gn3td + 6T0znNq87l8vire8v7TLRPt7qaFr3xOZEHsdG5wqCHCq6d17cvc2PzvV266aV17TBbNCNbjpwfx + E2tMNh8J7lGjbbD2UdkyTG/UTMt29DHySPlL3OA8SeanHuzn0tcq9feL4hL1c/Xh8xQYdvsBuZ7 + kGdxGp4W3eNxMTMsbCX+BnlgaGRh7ePWAX9VD4hXX1yWL0nH3TalKbi/h8x4uMLmfVVpT5Cqd1+ + nMJpPvN2SzemrOLGXmavLG3yctq0RNnY++EJDw0CpLD018uC8elrksjZcuNxtqEJcvg9VlW4W3D + MttcOZelHpupY2++HuF6d251OBd6c0lYsvP1VMOqKSSMF8nU08w9xYf7FUbdclgdP3px9q8vNqU + 35O5nxT4J0+MpfucbZaWwFnobX+FsIbG8u7/APU939O0RsmjEZuIy9jQKlvp0B5hXX3e7j692xP + g6S1493xkbviwhFSWlO4310e0DSGE/wCg2nn4Qt81yPLSeRcpw5n6WbTafqR8SNFd0tT4HR/uY4 + vPamv4cZjrXE2Pr3ly/ojb1W1w0cT8V1jExve9K/u4tydx/hQ1rJuK1nKT4U+JHx94W52i+6zVe + 3+xGzN+dSTOyX1OburJrnwW8Eg9GshLRQMr1E8qLw6ax57bjZN7IVOeDUU6VbWveV59z6xK2oaq + qPj1tldDau79bbTm7l/DBpDb7GRxWNvkXhlo68tI2UBDuDvUL608ekeSuMaxkY2x1sLmlfVZaVa + 14+ChbylG5l+7m9I6fASb/a52rwPdjtLuTtBlbGe4v54sZnXYpzH9brm4Zax9YBHH05CBw+Kja3 + lvYMm3eWlVTmWumvE9clQt5UPdfAXNNb2m9vuPX+ntbxC9xWgLN4xePf8AwZkjhjuGPLeRo+Y18 + +C8sef1XpWdy06SlcVe32tNPMTJK/n8k+CXobPDvf0zY7Sb2bU7z6Fto8TkJr+GzyP0zej1x6sc + bS5jeBpE57fvXr0Ve+u4eTi39YqMpeHh3+MnPte4vRuQdK6eY+Tus0li9xO+rbLSuXHq4vIWUDs + jbGobPBHc9b4nEcel44FT05luxsV+VPyZU8x4Z8VLJS72kXV7j21mlcPtHhNxtNYqKwyumspZW8 + VxbRtic21eSTUilekxN6ViuiNwu3Mt483WF1etXWlPxl1uuJC3aU4aOPDylld5WobjV+E7bdUXx + L7jLy4i+mcRSr7kQvd+65ZnY8eFuWbGOihNqPi9ZIs9wk7lu1Xi1X0FT7v8vgNZd2G2O2m4V7FZ + aHxNrb5TMRXjxHA9z5JA9rz5OYxgCs9hsTtbTfybKrccml36JdnnPXLfNft25P1aIo3erqfZAZX + bXcPaHNY46iwmUtbZ7cRI0H6IPa75+ilQOnpHwcVedIQyqX7WQmoOEpeuu2nY34yvcJWoSjK09d + FodDsLdtyNjbZJren6uGKYNrWgkYH0+6q4srcYvQ2eOqUu8qKrKggCAIAgCAkkJoKeJUMHP3c65 + j2X9yLTu4eo5PSxWsbT6eO6JLIYjLbtxo9Vx4fK5lfsXX8Om4dPfV4P1rTcmu/XmVDVrk1Yy+eX + CRt7vvgLvV+yustP45wkmyGLuW2/SQer5OoUPxA4Lnmy5McbcLM56KMlXwGYzbfvbE4rtRgn2zt + U4zJ9uMWnoZGm9wGQvm30buDmC7mdcRlwPKrT4rYOs8WcMxXaVVxJr0fOWe1Xoe75FpQx/wBqYZ + rvvM3n3IxlZsdbCSCG7f8AOXF5NuQx3nWE8PKnmtg6ilLF2eziSdJScJU8Ba4FZ3pzfFVLm9tjh + iN0W8T/APsAoTz/AASeKsev+X6zafD1fkK9lbdp9/N8ZDb2h9zDcsk//abDp8v+7oK/1BTuMJf2 + xiuunPP0s9rP9bc8S9CKd2Mtd/SO31rw/vyEeI/5yXwPFe/VVHtOF/hdPgLba9b9z8O1nnq0Ee6 + dpF3KuMl4+B/xRPyXrhU/tPIf58f1kVXH/wDYQX4eyyytrNvdvMl3z7n7dbu4aDLPyTn3WCZeMp + FI5rWzFzC6lSWvDftBWSztzyVs1u/jS5UuWL08FDHwx7Ty3C6q1NzdM9uOx+lMzZ6l07o2yx+Ss + ZRPZ3ccRbJE8AgOFeRAJC5dkb/n3Yu1cuVi69i+JGyWtusWZVgqM1f7YpYduu+jd3ROo5mw5PUM + Pr4xoIpPWY3gp5H05B963ze177p3Fna1UHKq8ehjMSTt5s4z7fmN19UFztM5kUJcLK6HAVJPou5 + DmuW2qK5Hxoz1yScZJLsNNvarkptBqmEOpIzKxeowu4tcbcGhB/CSundfpu5ipp0938Zgtmm07n + Ppqjz3KaX+5dok+WJj58RQul8lXhv/ANVup/6mnwEXV/PrxfKS7bNb+0w1u3jU4h9a8aAPi5L0y + XH+0bdV63vXR+ci2+XOp4PkJO9Tqb3a9vkbKf8AeNhSgJIJyTQPyc1R0e2tozm/a5Jfqsq3N1v2 + ++q9KPDUVxHt17mGNyudcIrPU+ObbWNy/wCVhkuWkdJceHAx/uqvGh9d6fmocbK1854XHG3nKsX + q+PkJvdL1Hiv5ube6QZLXI/rV+SNsHDqFs23kg6iK1p1PCo+77FuLIlfkm4L1X6SN+vQooPXizd + nRoI0jggfCwtOP/kGLl+Z/UTa4c0v1mbLY/hx8S9Bonu3pLTGt/crxenNWWEeRx11ibAXFlMKxS + dNtcOHUF1/bsu/i9LOdqXK+dmuX7MbudyzVVT5DdPRm1W2+2/WND6cscO+T5ZZbW3Y2Z7SeTpKd + RaPKtFyTN3DIy5N3ZuVPEbBYxbdrSCojRvK6M0Rc+5JmNObt2EGQxmp7F8uJs7thMctzO1noUrS + pHpSAUXW7edkvYISxZNO0lzcOFX8pqt23CWZKN1VjJ/EbeY7td7f8VkLbKY7ROPt7y1ljnt5mRl + rmSxOEjHN4/mkcFzi51FuN2DhK4+V6PRGfsbfi2X6ipXwv46ms2kaaE9zbUzdQOEDdXWck+Kkk+ + TrLrWGNjR1c+oxOAot3uNXelfUTbhcjWnx+cxijTcqvu9J6e4Xkv5ybk7RbY4YC4y13kYrySJh4 + xxNuI6lw5gFtT9y9eiYuzayL04vkcJRT7K8rG5yhO7CKfb6ak++TDH7hu1cVaNZjmsDnV4hszgK + 058l5bHGmxXqfRl6DyzJJ5sar8qJcnuXausGbRYnba2mbNnNS5a0ba49tHTOgjcWvcGjjzeKLF9 + GWbkMqWW4+paWr8Zd7tcTtqEeLMY942nLjSOD7btK3ZJuMNJiLGZg5l9v6Ebifvatm2K+r7zZrh + KbfkfMzH5sXFWa9ioVDugwmlIu+Xbi+3LsorvSmosfZ2UjrlpbaCYyytAe40HDgT5BwTp+/ej0/ + fjZdbiuNpcXwWtKHrnQh9ZhKa9Wi/D4TaSDtT7crZ8dxb6FxscjC10bmR8QQeoU405jgudT6m3S + UaSuN18C+QysduxFPRKvjMu2MMVvBHBA30442hkcfLpa0UA/ItbrXwmWUVFUXYfSpJCAIAgCAIC + WQVH+2oaqSjF++3b1t53AaZZp3XNu/1LVzpcZlLV3p3dpKRTqjfQ8D4grL7Xu2RgzbtOil7S7yw + ysSF6OvHsMZbd9k1toPVenNST7h5/L22m5hc2WFurlxtHOaxzA17S49TaONQfFZzN6gt3rMoRsR + i2va7fQWuPhXINOU6pdlPnPj1j2D6DzGrMxqrQ2pMtol2f6jl8fiZzHayufxf0xjp6Q4kk0P2L1 + xep7itK3kwV6ipHm/JXctCi7tqk3yPlr5fkMvbJ7D6D2F0e/R+g7eRkVw909/fXD/AFLm7uHtDX + SyyUFTQCi13ct2v591TvP2dIrsUVw8xf4+LG1WnbxPl2L7fNIbCWues9JXN1OzUF3+sLwXcgkLJ + KOFGUAoPmVe77pd3CUXd/JVERi40bNadrIYft70lhN9c7v7b3N0c7nraG0u7Z0gNq1kMLIAWspU + HpYPFVXN4vTwYYjdYQba8ohjpXZT70eG0nbfo7Z/W+rtd6du7ue91jKyfIR3MgfGxzC536MACg+ + ZU5u73cnHt2ZcLfApxsWNqUmu0kyPbdo3KdwWM7ipry7bqDGQPtobRso+kc11u62qWUrXpefFVW + t5v28GeIvZm0/M6/ERLETve8KVvt2m7d77ZOw1TkLi6wGp8b0ttdRYuT0bgxtJIZJ006gCTTkrj + bd8vYsPcy9e1WrtvhUoycGN2XMvVl3lL2y7QLHQOuLDX+Z13n9UZDFhwsIb68ItwHMLCJIxwdwP + Cqr3XfI5Fvkt2IwXbT8RFjEuQlzSuN+QqW+/aPt5vpmcdqy9urvT2psaR9Pn8VJ6Nw+MH5WSEfi + DfzePBU7Tv97ChyNc1tr2H7JVk4KuyUovll38a/Cffsn25wbQ3Wbvr3VeU1fdZuOOCeTLzGRrI4 + +oUY0Ggr1HqPivHc9zhlOLt21bp9H8RXj48oN1lUxj+z60jitR5bMaI1vm9M2GYuBc3mIsLgMiP + zdXQDwo0cm8KgeJWel1c79iML9pXJQXKpN608xYy2xttqdK+D5zKeQ7aNGZDerA73T3t47NYCxi + x1rAZQYHshaWtL20qSa1PHmsBHfLscOWH+TJ81C9+q/vVc7lQ9sJ236NwO+uU39s7u8dnctbGzn + tHytNq1rnNcS1lAa/L5qme83pYCw/yVLmJWMve+87SXdXtv0buvuPo3c3PXd3Bk9Ezw3OOhtpA2 + KR0E4uG+oKGvzDwVe37xexLF2zClLicX5VQm9iRu3Iyb4GPO76x7WNV3GJ0vvznm6XzTGPusBnW + vfbT24JHU1szWuFCQKtP5Vl+nvtSKn9UhKcHTniuDLTN9xJ8smlJLj2mnG8+gtjr12kNBbB6lut + zNa6hykAyeYknkv5bWwjbToY51BCzro4jjwBXTNqv7hiu5eybfubC1ce81+/YhdahCXOzqxgbGT + GYPHYycgyWdtBBIW/h6o4w00+8LguRdVy7KS4Nt+ds3a3Fxgk+4xfk+2rRuT7gbXuHnu7sZ+zto + bSK2EoFr0QxvjHydNakSGvFZeO9XY4P1N+zVvzlp9X/fe88Blt0YIA+4eQWuSquytS+ehh3uA7W + 9ue4SGxuNRtmxmbxTgcZqLHv9G8hANejqHNhPGnBbNtO939vi7a9a3L2ovtLDKxFeo+DLO0N2U4 + /TGssRq/Pbgah1DJgn+rjrO5vHMgDh/dWgnrHwV5m77Zu2HC1YhCvFrV+gt7eDKFxScmy7d/+1v + b3uAmxuXzclziNQ4Yg43UGNl9G5jaCSGPcPxNBJNFYbbv2ThL3MW3alrKHYy4vYkZy5lpLvKBtF + 2YaA2y1w7crM5S/wBY6oY3ps8rmZTMbfhTqjbxo6lRX4ngshunU17Kte4tL3VvthHg33nhY29Ru + c8nU147udHjcDvg2+0c3KTYWTIYwNbkbJ1LiIidxD2nwK3jpfLhj7Pec7amqPR+LXzmHz6yyY6f + lI2A207Hts9Da1g3F1LksjrTUNi7rx95mpzNFbP5dbIjUdXxr9y0fK6lvuzLHxoqzbn7Sj2rxsz + WPhxtSbbrUvPe3tw0bvplNMZPVV5d28mlbqO/sG2cojD5Y3iQepUGoqOSx22bxfw7UoQ4S4npkY + iuNSfYfVvr296A7gtKQaa1rC9r7F/q4zJ2zhHdWktAOqN9OTgAHDxXjtG8X8G67tvSvFdjQysRX + opGJMR2E4y2vMUc7uVqXKY3ESwT22LN66JnVbPbJG0uBcS0FoqPELOZXUli5alC3jwhJ/lKrPFY + MuZPm4eA2ti/EeFK1J+0laWqmYZ6qopCAIAgCAICV4JHBQ2+wpZIWucfmCcUVdhKY3OrxpxXnSu + vcJaqhBsbiCCKU4DxUuFVx4kUpwPRsdBTn5fBVcpLZDoNafuqCOJHopw+4/FHKVSoBhaeaSb7A3 + UemTz+4I+HhBL6Z5kfcqeXUh6EOgippSvML0UdSOKIti86/wC4vPkpxdSaETGSKAkfEKp6Eolax + wJBHL4c0j4ijWp6dFaGqlKhXUgWnqH+yoqyCV0dTSnDy8CqiE9S3NW7aaB19GyLW+nMfnWRcIRk + LSK49Ov7wyNJB+xXuLm5OM37m5KNePK2qnjcsW5usop+NFO0fsrtVt9eOyOitJY3EXjgWuvLW0i + jmLTzb1hodT4VXrl7pm348ty7KUfotunmIhjWoOsYpPwIvYNIpwWLjrqz3Y6XE8UcE3VkogWFxF + eFP3VVUpcaslEby414D4KOZ11R6N1QETmupUkFVI8lBrtIiMt4c1S+NSpskc2UyEdIoBwPinLR8 + 1Sp+zVcS3MjtnoXNassteZbA2lzqHHMMdllZIWOuImE1o15FeavLeXfjbcIzai+yp4O1GTq1qXJ + 0OBqG+NanirJ6HtJtExY+oNOXJQ4VdahaIiY68+KqcmuBFCX0yOJJNfNRFt8URy+E9I2lvNVIlK + hOpJCAIAgCAIAgIKKAEKQEBFAEBCnGqAEVUAIApAQEUAUAgpBFAQQBAEAQEUAQBAQUAIBQqQQ6U + 7QR6QoYFFIIoAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAIAgC + AIAgCAIAgCAIAgCAIAgCAIAgCAIAgCAID//Z +UID:00000000de2f6d21-00e16017db094b12-56 +REV:2010-03-22T14:48:55 +END:VCARD diff -r 76a2435edfd4 -r de1630741fbe phonebookui/phonebookui.pro --- a/phonebookui/phonebookui.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/phonebookui.pro Mon May 03 12:24:20 2010 +0300 @@ -19,7 +19,7 @@ TEMPLATE = subdirs -SUBDIRS = mobhistorymodel pbkcommonui phonebookapp phonebookservices +SUBDIRS = cnthistorymodel pbkcommonui phonebookapp phonebookservices CONFIG += ordered deploy.path = /epoc32/rom/include/core/app/ diff -r 76a2435edfd4 -r de1630741fbe phonebookui/rom/pbk.iby --- a/phonebookui/rom/pbk.iby Fri Apr 16 14:53:18 2010 +0300 +++ b/phonebookui/rom/pbk.iby Mon May 03 12:24:20 2010 +0300 @@ -27,12 +27,13 @@ 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\cnthistorymodel.dll SHARED_LIB_DIR\cnthistorymodel.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 +file=ABI_DIR\BUILD_DIR\cntimageutility.dll SHARED_LIB_DIR\cntimageutility.dll UNPAGED // UI file=ABI_DIR\BUILD_DIR\pbkcommonui.dll SHARED_LIB_DIR\pbkcommonui.dll UNPAGED diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_commonstartwithcap_steps/testcase_02/i_to_r_dataphase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_commonstartwithcap_steps/testcase_02/i_to_r_dataphase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - - - 0 - 3801 - - 6f69 - - - - - 320 - 258 - 18 - 0 - - - - Copy_Bluehills_10.jpg - 20090302T193600 - 20090303T193600.0 - - \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_commonstartwithcap_steps/testcase_02/testcase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_commonstartwithcap_steps/testcase_02/testcase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ - - - - - - 100c - 1 - ${auto} - 10001 - ffffffff - 0 - 0 - 0 - - - i_to_r_dataphase.xml - - 2001 - 1 - ${auto} - 10001 - ffffffff - - 0 - 0 - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_commonstartwithcap_steps/testcase_03/bluehills.jpg Binary file pimprotocols/mtpcontactdp/test/cit/data/ovi_commonstartwithcap_steps/testcase_03/bluehills.jpg has changed diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_commonstartwithcap_steps/testcase_03/testcase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_commonstartwithcap_steps/testcase_03/testcase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ - - - - - - 100d - 1 - ${auto} - 0 - 0 - 0 - 0 - 0 - - - Bluehills.jpg - - 2001 - 1 - ${auto} - 0 - 0 - 0 - 0 - 0 - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_end_steps/testcase_2/r_to_i_dataphase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_end_steps/testcase_2/r_to_i_dataphase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ - - - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_end_steps/testcase_2/testcase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_end_steps/testcase_2/testcase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ - - - - - - 1007 - 1 - ${auto} - 10001 - 3801 - 0 - 0 - 0 - - r_to_i_dataphase.xml - - - 2001 - 1 - ${auto} - 0 - 0 - 0 - 0 - 0 - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_end_steps/testcase_3/testcase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_end_steps/testcase_3/testcase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ - - - - - - 100b - 1 - ${auto} - ${ThumbnailHandle,UINT32} - 0 - 0 - 0 - 0 - - - - - 2001 - 1 - ${auto} - 0 - 0 - 0 - 0 - 0 - - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_end_steps/testcase_4/testcase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_end_steps/testcase_4/testcase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ - - - - - - 1003 - 1 - ${auto} - 0 - 0 - 0 - 0 - 0 - - - - - 2001 - 1 - ${auto} - 0 - 0 - 0 - 0 - 0 - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailsender_0020/testcase_02/i_to_r_dataphase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailsender_0020/testcase_02/i_to_r_dataphase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - - - 0 - 3801 - - 6f69 - - - - - 320 - 258 - 18 - 0 - - - - Copy_invalid.jpg - 20090302T193600 - 20090303T193600.0 - - \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailsender_0020/testcase_02/testcase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailsender_0020/testcase_02/testcase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ - - - - - - 100c - 1 - ${auto} - 10001 - ffffffff - 0 - 0 - 0 - - - i_to_r_dataphase.xml - - 2001 - 1 - ${auto} - 10001 - ffffffff - - 0 - 0 - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailsender_0020/testcase_03/invalid.jpg --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailsender_0020/testcase_03/invalid.jpg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,608 +0,0 @@ - - - - - -0 - -ffff - - 20090703T103022 - - - - -0 - -4004 - - GivenName - - - - -0 - -4004 - - MiddleName - - - - -0 - -4004 - - FamilyName - - - - -0 - -4004 - - Title - - - - -0 - -4004 - - Suffix - - - - -0 - -4004 - - personal@nokia.com - - - - -0 - -4004 - - 555 Dial Drive - - - - -0 - -4004 - - 888 Dial Drive - - - - -0 - -4004 - - Beijing - - - - -0 - -4004 - - China - - - - -0 - -4004 - - 710021 - - - - -0 - -4004 - - China_Beijing - - - - -0 - -4004 - - Dan ling Street - - - - -0 - -4004 - - CEC plaza - - - - -0 - -4004 - - Beijing - - - - -0 - -4004 - - 000001 - - - - -0 - -4004 - - England - - - - -0 - -4004 - - Wall Street - - - - -0 - -4004 - - Chang an Avenue - - - - -0 - -4004 - - Chang an Avenue - - - - -0 - -4004 - - New York - - - - -0 - -4004 - - U.S.A - - - - -0 - -4004 - - 123456 - - - - -0 - -4004 - - Netherland - - - - -0 - -4004 - - email.symbian.com - - - - -0 - -4004 - - business_email@symbian.com - - - - -0 - -4004 - - 1234567 - - - -0 - -4004 - - 1398888888 - - - - -0 - -4004 - - 65860000 - - - - -0 - -4004 - - 13411111111 - - - - -0 - -4004 - - 800-123-9876 - - - - -0 - -4004 - - 6586000021 - - - - -0 - -4004 - - Pager - - - - -0 - -4004 - - https://www.showmywebaddress.com - - - - -0 - -4004 - - www.businesswebaddress.com - - - - -0 - -4004 - - symbian fundation - - - - -0 - -4004 - - software engineer - - - - -0 - -4004 - - 888-999-666 - - - - -0 - -4004 - - Liu Yifei - - - - -0 - -4004 - - Xiao Gui Dang Jia - - - - -0 - -4004 - - Mr Hu - - - - -0 - -ffff - - 19810701 - - - - -0 - -ffff - - 20050903 - - - - -0 - -6 - - 0 - - - - -0 - -4004 - - contact body - - - - -0 - -4004 - - mobilephone3-ovi-12811111 - - - - -0 - -4004 - - assistantphone-ovi-12811111 - - - - -0 - -4004 - - nickname-ovi-peppy - - - - -0 - -4004 - - nickname-ovi-peppy - - - - -0 - -4004 - - video-ovi-123456779 - - - - -0 - -4004 - - personalvideo-ovi-123456779 - - - - -0 - -4004 - - businessvideo-ovi-123456779 - - - - -0 - -4004 - - voipphone-ovi-09876543 - - - - -0 - -4004 - - personalvoipphone-ovi-09876543 - - - - -0 - -4004 - - businessvoipphone-ovi-09876543 - - - - -0 - -4004 - - pobox-ovi-cecplaza - - - - -0 - -4004 - - personalpobox-ovi-cecplaza - - - - -0 - -4004 - - businesspobox-ovi-cecplaza - - - - -0 - -4004 - - department-ovi-cecplaza - - - - -0 - -4004 - - providerovi-nokia@ovi.com - - - - -0 - -4004 - - providerovi-nokia@ovi.com - - - - -0 - -4004 - - providermsn-nokia@hotmail.com - - - - -0 - -4004 - - providergoogle-nokia@gmail.com - - - - -0 - -4004 - - provideryahoo-nokia@yahoo.com - - - - -0 - -4004 - - providerfacebook-nokia@facebook.com - - - - -0 - -4004 - - providerskype-nokia@skype.com - - - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailsender_0020/testcase_03/testcase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailsender_0020/testcase_03/testcase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ - - - - - - 100d - 1 - 2 - 0 - 0 - 0 - 0 - 0 - - - invalid.jpg - - 2001 - 1 - 2 - 0 - 0 - 0 - 0 - 0 - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailstart_steps/testcase_05/r_to_i_dataphase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailstart_steps/testcase_05/r_to_i_dataphase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ - - - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailstart_steps/testcase_05/testcase.xml --- a/pimprotocols/mtpcontactdp/test/cit/data/ovi_thumbnailstart_steps/testcase_05/testcase.xml Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ - - - - - - 1007 - 1 - ${auto} - 10001 - 3801 - 0 - 0 - 0 - - r_to_i_dataphase.xml - - - 2001 - 1 - ${auto} - 0 - 0 - 0 - 0 - 0 - - - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/pbap/inc/pbapfolderclient.h --- a/pimprotocols/pbap/inc/pbapfolderclient.h Fri Apr 16 14:53:18 2010 +0300 +++ b/pimprotocols/pbap/inc/pbapfolderclient.h Mon May 03 12:24:20 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2006-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" @@ -23,6 +23,7 @@ class MPbapErrorReporter; class CPbapContactDbViews; class CPbapLogWrapper; +class CPbapVCardExporterUtil; class MVirtualFolderClient { @@ -32,6 +33,7 @@ virtual MPbapErrorReporter& ErrorReporter() =0; virtual CPbapContactDbViews& ContactDbViews() =0; virtual CPbapLogWrapper& LogClient() const =0; + virtual CPbapVCardExporterUtil& ExporterUtil() = 0; }; #endif //PBAPFOLDERCLIENT_H diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/pbap/inc/pbapserver.h --- a/pimprotocols/pbap/inc/pbapserver.h Fri Apr 16 14:53:18 2010 +0300 +++ b/pimprotocols/pbap/inc/pbapserver.h Mon May 03 12:24:20 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2007-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" @@ -36,6 +36,7 @@ class RFs; class CPbapLogWrapper; class CPbapAuthPasswordGetter; +class CPbapVCardExporterUtil; const TUint KPbapServerShutdownDelay = 5000000; @@ -149,7 +150,8 @@ virtual MPbapErrorReporter& ErrorReporter(); virtual CPbapContactDbViews& ContactDbViews(); virtual CPbapLogWrapper& LogClient() const; - + virtual CPbapVCardExporterUtil& ExporterUtil(); + private: // from MPbapExporter virtual void StartExport(); diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/pbap/inc/pbapvcardexporterutil.h --- a/pimprotocols/pbap/inc/pbapvcardexporterutil.h Fri Apr 16 14:53:18 2010 +0300 +++ b/pimprotocols/pbap/inc/pbapvcardexporterutil.h Mon May 03 12:24:20 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2006-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" @@ -52,6 +52,7 @@ TVCardVersion aFormat, TUint64 aFilter); void ExportEmptyVCardL(RWriteStream& aWriteStream, TVCardVersion aFormat); + TContactItemId FindContactIdFromNumberL(const TDesC& aNumber); public: /** PBAP clients are supposed to provide any information regarding the contact item represented by aContactId. @@ -74,6 +75,7 @@ CContactDatabase& iDatabase; CPbapLogWrapper* iLogWrapper; const CLogEvent* iLogEvent; + TContactItemId iLogEventContactId; TVCardVersion iFormat; TUint64 iFilter; RTz iTzClient; diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/pbap/server/pbapchexporter.cpp --- a/pimprotocols/pbap/server/pbapchexporter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/pimprotocols/pbap/server/pbapchexporter.cpp Mon May 03 12:24:20 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2006-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" @@ -239,6 +239,14 @@ TInt handle = aEventIndex + 1; // call history handles start from 1 TContactItemId contactId = aEvent.Contact(); + + if (contactId == KNullContactId && aEvent.RemoteParty() != KNullDesC) + { + // The S60 phonebook uses the remote party for the name, so if there isn't a name + // there won't be a contact, so we only look up the contact if there is a Remote Party + contactId = iClient.ExporterUtil().FindContactIdFromNumberL(aEvent.Number()); + } + if (contactId != KNullContactId) { // a contact is associated with the log event so read its name from the database diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/pbap/server/pbapserver.cpp --- a/pimprotocols/pbap/server/pbapserver.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/pimprotocols/pbap/server/pbapserver.cpp Mon May 03 12:24:20 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2007-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" @@ -401,6 +401,11 @@ return *static_cast(this); } +/*virtual*/ CPbapVCardExporterUtil& CPbapServer::ExporterUtil() + { + LOG_FUNC + return *iVCardExporter; + } /*virtual*/ MPbapErrorReporter& CPbapServer::ErrorReporter() { diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/pbap/server/pbapvcardexporterutil.cpp --- a/pimprotocols/pbap/server/pbapvcardexporterutil.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/pimprotocols/pbap/server/pbapvcardexporterutil.cpp Mon May 03 12:24:20 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2006-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" @@ -107,11 +107,19 @@ LOG_FUNC TContactItemId contactId = aLogEvent.Contact(); + if (contactId == KNullContactId && aLogEvent.RemoteParty() != KNullDesC) + { + // The S60 phonebook uses the remote party for the name, so if there isn't a name + // there won't be a contact, so we only look up the contact if there is a Remote Party + contactId = FindContactIdFromNumberL(aLogEvent.Number()); + } + if (ContactExistsL(contactId)) { // store the log event, format and filter parameters to use in the callback // from the contacts vCard converter iLogEvent = &aLogEvent; + iLogEventContactId = contactId; iFormat = aFormat; iFilter = aFilter; @@ -150,6 +158,22 @@ } } +TContactItemId CPbapVCardExporterUtil::FindContactIdFromNumberL(const TDesC& aNumber) + { + TContactItemId ret = KNullContactId; + CContactItemFieldDef* fieldDef; + fieldDef = new(ELeave) CContactItemFieldDef; + CleanupStack::PushL(fieldDef); + fieldDef->AppendL(KUidContactFieldPhoneNumber); + CContactIdArray* contactIdArray = iDatabase.FindLC(aNumber, fieldDef); + if (contactIdArray->Count() > 0) + { + ret = (*contactIdArray)[0]; + } + CleanupStack::PopAndDestroy(2); // contactIdArray, fieldDef + return ret; + } + /** Writes a vCard to the stream containing only the mandatory properties defined in the PBAP specification with all properties set to empty (null) values @@ -181,7 +205,7 @@ CArrayPtr* aPropertyList) { LOG_FUNC - if(iLogEvent && iLogEvent->Contact() == aContactId) + if(iLogEvent && iLogEventContactId == aContactId) { CParserProperty* property; diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/phonebooksync/Test/TE_Sync/te_sync_setup_trptsy.script --- a/pimprotocols/phonebooksync/Test/TE_Sync/te_sync_setup_trptsy.script Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -// 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" -// 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: -// - -RUN_UTILS DeleteFile C:\Config.txt - -ced z:\TestData\Configs\TE_Sync_TRPTSY.cfg ced.log diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/phonebooksync/Test/TE_Sync/te_sync_trptsy.cfg --- a/pimprotocols/phonebooksync/Test/TE_Sync/te_sync_trptsy.cfg Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2735 +0,0 @@ -############################################################ -## AUTO-GENERATED CONFIGURATION FILE -## CommsDat Database Dump Utility -## 1.0 -############################################################ - -############################################################ -## Network -## -[Network] -ADD_SECTION -# COMMDB_ID = 1 - Name=Intranet - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 2 - Name=mRouter - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 3 - Name=Vodafone Network - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 4 - Name=Orange Network - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 5 - Name=Cellnet Network - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 6 - Name=T-Mobile Network 1 - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 7 - Name=T-Mobile Network 2 - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 8 - Name=T-Mobile Network 3 - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 9 - Name=T-Mobile Network 4 - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 10 - Name=SFR Network - FIELD_COUNT=1 -END_ADD - - -############################################################ -## ModemBearer -## -[ModemBearer] -ADD_TEMPLATE - Name=Default Modem - IfName=PPP - PortName=COMM::0 - TSYName=MM - CSYName=ECUART - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=0 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=CSD.agt - FIELD_COUNT=69 -END_TEMPLATE - -ADD_SECTION -# COMMDB_ID = 2 - Name=Null Modem 115200bps - IfName=PPP - PortName=COMM::0 - TSYName=MM - CSYName=ECUART - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=4 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=CSD.agt - BCAStack=C32Bca - FIELD_COUNT=70 -END_ADD - -ADD_SECTION -# COMMDB_ID = 3 - Name=US Robotics Sportster - IfName=PPP - PortName=COMM::0 - TSYName=MM - CSYName=ECUART - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=57600 - Handshaking=244 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=AFTERDIALUNTILANSWER - SpeakerVolPref=QUIET - ModemInitString=AT&F1 - DataInitString=AT - FaxInitString=AT&d2 - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=CSD.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 4 - Name=Dacom Surfer - IfName=PPP - PortName=COMM::0 - TSYName=MM - CSYName=ECUART - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=57600 - Handshaking=244 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=AFTERDIALUNTILANSWER - SpeakerVolPref=QUIET - ModemInitString=AT&F - DataInitString=AT - FaxInitString=AT&d2 - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=CSD.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 5 - Name=GSM Mobile Phone via Infrared - IfName=PPP - PortName=IRCOMM::0 - TSYName=MM - CSYName=IRCOMM - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=196 - SpecialRate=0 - XonChar=17 - XoffChar=19 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=ATZ - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=CSD.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 6 - Name=GSM Mobile Phone via Serial - IfName=PPP - PortName=COMM::0 - TSYName=MM - CSYName=ECUART - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=19200 - Handshaking=196 - SpecialRate=0 - XonChar=17 - XoffChar=19 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=ATZ - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=CSD.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 7 - Name=GPRS Ericsson R520m via IR - IfName=PPP - PortName=IRCOMM::0 - TSYName=MM - CSYName=IRCOMM - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=4 - SpecialRate=0 - XonChar=17 - XoffChar=19 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=ATZ - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=PSD.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 8 - Name=GPRS Ericsson R520m/T68i via Serial - IfName=PPP - PortName=COMM::0 - TSYName=MM - CSYName=ECUART - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=19200 - Handshaking=4 - SpecialRate=0 - XonChar=17 - XoffChar=19 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=ATZ - DataInitString=AT - FaxInitString=AT - IspInitString=*99***1# - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=PSD.agt - FIELD_COUNT=70 -END_ADD - -ADD_SECTION -# COMMDB_ID = 9 - Name=GPRS Motorola Mobile Phone via Serial - IfName=PPP - PortName=COMM::0 - TSYName=MM - CSYName=ECUART - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=57600 - Handshaking=4 - SpecialRate=0 - XonChar=17 - XoffChar=19 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=ATZ - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=PSD.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 10 - Name=WinTunnel Modem - IfName=PPP - PortName=COMM::6 - TSYName=MM - CSYName=ECUART - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=4 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=null.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 11 - Name=mRouterWinsBearer - IfName=PPP - PortName=WINS::0 - TSYName=MM - CSYName=WINSCSY - LastSocketActivityTimeout=9999 - LastSessionClosedTimeout=180 - LastSocketClosedTimeout=30 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=4 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=mRouterAgent.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 12 - Name=mRouterRs232Bearer - IfName=PPP - PortName=COMM::0 - TSYName=MM - CSYName=ECUART - LastSocketActivityTimeout=9999 - LastSessionClosedTimeout=180 - LastSocketClosedTimeout=30 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=4 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=mRouterAgent.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 13 - Name=mRouterIrBearer - IfName=PPP - PortName=IRCOMM::0 - TSYName=MM - CSYName=IRCOMM - LastSocketActivityTimeout=9999 - LastSessionClosedTimeout=180 - LastSocketClosedTimeout=30 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=4 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=mRouterAgent.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 14 - Name=mRouterBtBearer - IfName=PPP - PortName=BTCOMM::0 - TSYName=MM - CSYName=BTCOMM - LastSocketActivityTimeout=9999 - LastSessionClosedTimeout=180 - LastSocketClosedTimeout=30 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=4 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=mRouterAgent.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 15 - Name=mRouterUsbBearer - IfName=PPP - PortName=ACM::0 - TSYName=MM - CSYName=ECACM - LastSocketActivityTimeout=9999 - LastSessionClosedTimeout=180 - LastSocketClosedTimeout=30 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=4 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOff=Q0 - QuietOn=Q1 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+44123456789 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - CommRole=0 - SIRSettings=0 - Agent=mRouterAgent.agt - FIELD_COUNT=69 -END_ADD - -ADD_SECTION -# COMMDB_ID = 16 - Name=trpat_psd - Agent=trp.agt - IfName=rawip - PortName=not used - BCAStack=C32Bca - ControlChannelPortName=COMM::0 - TSYName=TRPAT - CSYName=CSY27010 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=0 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOn=Q1 - QuietOff=Q0 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+447973100973 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - LastSocketActivityTimeout=300 - LastSessionClosedTimeout=300 - LastSocketClosedTimeout=300 - SIRSettings=0 - CommRole=0 - FIELD_COUNT=71 -END_ADD - -ADD_SECTION -# COMMDB_ID = 17 - Name=trpat_csd - Agent=csd.agt - IfName=PPP - PortName=not used - ControlChannelPortName=COMM::0 - TSYName=TRPAT - CSYName=CSY27010 - DataBits=8 - StopBits=1 - Parity=NONE - Rate=115200 - Handshaking=0 - SpecialRate=0 - XonChar=0 - XoffChar=0 - FaxClassPref=AUTO - SpeakerPref=NEVER - SpeakerVolPref=QUIET - ModemInitString=AT - DataInitString=AT - FaxInitString=AT - DialPauseLength=S8= - SpeakerVolContorlLow=L0 - SpeakerVolControlMedium=L1 - SpeakerVolControlHigh=L2 - SpeakerAlwaysOff=M0 - SpeakerOnUntilCarrier=M1 - SpeakerAlwaysOn=M2 - SpeakerOnAfterUntilCarrier=M3 - DialToneWaitModifier=W - CallProgress1=X1 - CallProgress2=X2 - CallProgress3=X3 - CallProgress4=X4 - EchoOff=E0 - VerboseText=V1 - QuietOn=Q1 - QuietOff=Q0 - DialCommandStateModifier=; - OnLine=O - ResetConfiguration=Z - ReturnToFactoryDefs=&F - DCDOnDuringLink=&C1 - DTRHangUp=&D2 - DSRAlwaysOn=&S0 - RTSCTSHandshake=&K3 - XonXoffHandshake=&K4 - EscapeCharacter=+ - EscapeGuardPeriod=S12 - NoDialTone=NO DIAL TONE - Busy=BUSY - NoAnswer=NO ANSWER - Carrier=CARRIER - Connect=CONNECT - CompressionClass5=COMPRESSION:CLASS 5 - CompressionV42bis=COMPRESSION:V.42 bis - CompressionNone=COMPRESSION:NONE - ProtocolLAPD=PROTOCOL:LAPD - ProtocolALT=PROTOCOL:ALT - ProtocolALTCELLULAR=PROTOCOL:ALT-CELLULAR - ProtocolNone=PROTOCOL:NONE - MessageCentreNumber=+447973100973 - MessageValidityPeriod=1440 - MessageDeliveryReport=FALSE - MinimumSignalLevel=9905 - LastSocketActivityTimeout=300 - LastSessionClosedTimeout=300 - LastSocketClosedTimeout=300 - SIRSettings=0 - CommRole=0 - FIELD_COUNT=70 -END_ADD - - -############################################################ -## LANBearer -## -[LANBearer] -ADD_SECTION -# COMMDB_ID = 1 - Name=EKA1 Assabet on-board Ethernet - IfName=ethint - LDDFilename=ethercard - LDDName=EtherCard - PDDFilename=EtherSmc - PDDName=EtherCard.Smc - PacketDriverName=EtherPkt.drv - LastSocketActivityTimeout=-1 - LastSessionClosedTimeout=-1 - LastSocketClosedTimeout=-1 - Agent=nullagt.agt - FIELD_COUNT=11 -END_ADD - -ADD_SECTION -# COMMDB_ID = 2 - Name=EKA2 Assabet on-board Ethernet - IfName=ethint - LDDFilename=enet - LDDName=Ethernet - PDDFilename=ethernet - PDDName=Ethernet.Assabet - PacketDriverName=EtherPkt.drv - LastSocketActivityTimeout=-1 - LastSessionClosedTimeout=-1 - LastSocketClosedTimeout=-1 - Agent=nullagt.agt - FIELD_COUNT=11 -END_ADD - -ADD_SECTION -# COMMDB_ID = 3 - Name=EKA1 emulator Ethernet - IfName=ethint - LDDFilename=ethercard - LDDName=Ethercard - PDDFilename=etherwins - PDDName=Ethercard.wins - PacketDriverName=EtherPkt.drv - LastSocketActivityTimeout=-1 - LastSessionClosedTimeout=-1 - LastSocketClosedTimeout=-1 - Agent=nullagt.agt - FIELD_COUNT=11 -END_ADD - -ADD_SECTION -# COMMDB_ID = 4 - Name=EKA2 emulator Ethernet - IfName=ethint - LDDFilename=enet - LDDName=Ethernet - PDDFilename=ethernet - PDDName=Ethernet.Wins - PacketDriverName=EtherPkt.drv - LastSocketActivityTimeout=-1 - LastSessionClosedTimeout=-1 - LastSocketClosedTimeout=-1 - Agent=nullagt.agt - FIELD_COUNT=11 -END_ADD - - -############################################################ -## Location -## -[Location] -ADD_TEMPLATE - Name=Default Location - IntlPrefixCode=+ - NatPrefixCode=0 - NatCode=44 - Mobile=TRUE - UsePulseDial=FALSE - WaitForDialTone=FALSE - PauseAfterDialout=0 - FIELD_COUNT=8 -END_TEMPLATE - -ADD_SECTION -# COMMDB_ID = 2 - Name=Office - IntlPrefixCode=00 - NatPrefixCode=0 - NatCode=44 - AreaCode=171 - DialOutCode=9, - Mobile=FALSE - UsePulseDial=FALSE - WaitForDialTone=FALSE - PauseAfterDialout=0 - FIELD_COUNT=10 -END_ADD - -ADD_SECTION -# COMMDB_ID = 3 - Name=Office Direct Dial - IntlPrefixCode=00 - NatPrefixCode=0 - NatCode=44 - AreaCode=171 - Mobile=FALSE - UsePulseDial=FALSE - WaitForDialTone=FALSE - PauseAfterDialout=0 - FIELD_COUNT=9 -END_ADD - -ADD_SECTION -# COMMDB_ID = 4 - Name=Mobile - IntlPrefixCode=+ - NatPrefixCode=0 - NatCode=44 - Mobile=TRUE - UsePulseDial=FALSE - WaitForDialTone=FALSE - PauseAfterDialout=0 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 5 - Name=Home - IntlPrefixCode=00 - NatPrefixCode=0 - NatCode=44 - AreaCode=181 - Mobile=FALSE - UsePulseDial=TRUE - WaitForDialTone=TRUE - PauseAfterDialout=0 - FIELD_COUNT=9 -END_ADD - - -############################################################ -## Chargecard -## -[Chargecard] -ADD_SECTION -# COMMDB_ID = 1 - Name=Dummy BT Chargecard - AccountNumber=144,12345678 - Pin=0000 - LocalRule=HG - NatRule=HFG - IntlRule=HEFG - FIELD_COUNT=6 -END_ADD - -ADD_SECTION -# COMMDB_ID = 2 - Name=Dummy Mercury Chargecard - AccountNumber=0500800800,,12345678 - Pin=**** - LocalRule=HG - NatRule=J,K,0FG - IntlRule=HEFG - FIELD_COUNT=6 -END_ADD - - -############################################################ -## GlobalSettings -## -[GlobalSettings] -ADD_SECTION -# COMMDB_ID = 1 - Name=DefaultRecordName-1 - WAPAccessPoint=1 - ConnectionAttempts=2 - RedialAttempts=3 - SmsBearer=1 - SmsReceiveMode=2 - GPRSAttachMode=1 - AcceptIncomingGprs=1 - GPRSClassCBearer=GSM - ModemForDataAndFax=16 - ModemForPhoneServicesAndSMS=16 - LocationForDataAndFax=2 - LocationForPhoneServicesAndSMS=2 - MaxMBufHeap=2 - DefaultNetwork=1 - BearerAvailabilityCheckTSY=TRPAT - FIELD_COUNT=16 -END_ADD - - -############################################################ -## DialOutISP -## -[DialOutISP] -ADD_TEMPLATE - Name=Default Dial Out ISP - DialResolution=TRUE - UseLoginScript=FALSE - PromptForLogin=TRUE - DisplayPCT=FALSE - IfPromptForAuth=TRUE - IfCallbackEnabled=FALSE - CallbackTimeout=0 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - BearerService=0 - BearerProtocol=UNSPECIFIED - RlpVersion=0 - IwfToMs=0 - MsToIwf=0 - AckTimer=0 - RetransmissionAttempts=0 - ResequencePeriod=0 - V42Compression=0 - V42Codewords=0 - V42MaxLength=0 - Asymmetry=0 - UserInitUpgrade=FALSE - UseEdge=FALSE - FIELD_COUNT=28 -END_TEMPLATE - -ADD_SECTION -# COMMDB_ID = 2 - Name=NT RAS - Description=Test - Type=INTERNETONLY - DialResolution=TRUE - UseLoginScript=TRUE - LoginScript=CHARMAP \[windows-1252\]\nLOOP 10\n{\nSEND "CLIENT"+<0x0d>\nWAIT 3\n{\n"SERVER" OK\n}\n}\nEXIT KErrNoAnswer$\n\nOK:\nEXIT\n - PromptForLogin=FALSE - DisplayPCT=FALSE - IfNetworks=ip - IfPromptForAuth=FALSE - IfAuthName=RasUser - IfAuthPass=pass - AuthRetries=0 - IfCallbackEnabled=FALSE - CallbackTimeout=0 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - BearerService=0 - BearerProtocol=UNSPECIFIED - RlpVersion=0 - IwfToMs=0 - MsToIwf=0 - AckTimer=0 - RetransmissionAttempts=0 - ResequencePeriod=0 - V42Compression=0 - V42Codewords=0 - V42MaxLength=0 - Asymmetry=0 - UserInitUpgrade=FALSE - UseEdge=FALSE - FIELD_COUNT=35 -END_ADD - -ADD_SECTION -# COMMDB_ID = 3 - Name=ISP01 - Description=PlaceHolder for ISP01 - Type=INTERNETONLY - DialResolution=TRUE - UseLoginScript=FALSE - PromptForLogin=FALSE - DisplayPCT=FALSE - IfNetworks=ip - IfPromptForAuth=TRUE - IfAuthName=xxx - IfAuthPass=yyy - AuthRetries=0 - IfCallbackEnabled=FALSE - CallbackTimeout=0 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - BearerService=0 - BearerProtocol=UNSPECIFIED - RlpVersion=0 - IwfToMs=0 - MsToIwf=0 - AckTimer=0 - RetransmissionAttempts=0 - ResequencePeriod=0 - V42Compression=0 - V42Codewords=0 - V42MaxLength=0 - Asymmetry=0 - UserInitUpgrade=FALSE - UseEdge=FALSE - FIELD_COUNT=34 -END_ADD - -ADD_SECTION -# COMMDB_ID = 4 - Name=ISP02 - Description=PlaceHolder for ISP02 - Type=INTERNETONLY - DialResolution=TRUE - UseLoginScript=FALSE - PromptForLogin=FALSE - DisplayPCT=FALSE - IfNetworks=ip - IfPromptForAuth=TRUE - IfAuthName=xxx - IfAuthPass=yyy - AuthRetries=0 - IfCallbackEnabled=FALSE - CallbackTimeout=0 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - BearerService=0 - BearerProtocol=UNSPECIFIED - RlpVersion=0 - IwfToMs=0 - MsToIwf=0 - AckTimer=0 - RetransmissionAttempts=0 - ResequencePeriod=0 - V42Compression=0 - V42Codewords=0 - V42MaxLength=0 - Asymmetry=0 - UserInitUpgrade=FALSE - UseEdge=FALSE - FIELD_COUNT=34 -END_ADD - -ADD_SECTION -# COMMDB_ID = 5 - Name=ISP03 - Description=PlaceHolder for ISP03 - Type=INTERNETONLY - DialResolution=TRUE - UseLoginScript=FALSE - PromptForLogin=FALSE - DisplayPCT=FALSE - IfNetworks=ip - IfPromptForAuth=TRUE - IfAuthName=xxx - IfAuthPass=yyy - AuthRetries=0 - IfCallbackEnabled=FALSE - CallbackTimeout=0 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - BearerService=0 - BearerProtocol=UNSPECIFIED - RlpVersion=0 - IwfToMs=0 - MsToIwf=0 - AckTimer=0 - RetransmissionAttempts=0 - ResequencePeriod=0 - V42Compression=0 - V42Codewords=0 - V42MaxLength=0 - Asymmetry=0 - UserInitUpgrade=FALSE - UseEdge=FALSE - FIELD_COUNT=34 -END_ADD - -ADD_SECTION -# COMMDB_ID = 6 - Name=ISP04 - Description=PlaceHolder for ISP04 - Type=INTERNETONLY - DialResolution=TRUE - UseLoginScript=FALSE - PromptForLogin=FALSE - DisplayPCT=FALSE - IfNetworks=ip - IfPromptForAuth=TRUE - IfAuthName=xxx - IfAuthPass=yyy - AuthRetries=0 - IfCallbackEnabled=FALSE - CallbackTimeout=0 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - BearerService=0 - BearerProtocol=UNSPECIFIED - RlpVersion=0 - IwfToMs=0 - MsToIwf=0 - AckTimer=0 - RetransmissionAttempts=0 - ResequencePeriod=0 - V42Compression=0 - V42Codewords=0 - V42MaxLength=0 - Asymmetry=0 - UserInitUpgrade=FALSE - UseEdge=FALSE - FIELD_COUNT=34 -END_ADD - -ADD_SECTION -# COMMDB_ID = 7 - Name=ISP05 - Description=PlaceHolder for ISP05 - Type=INTERNETONLY - DialResolution=TRUE - UseLoginScript=FALSE - PromptForLogin=FALSE - DisplayPCT=FALSE - IfNetworks=ip - IfPromptForAuth=TRUE - IfAuthName=xxx - IfAuthPass=yyy - AuthRetries=0 - IfCallbackEnabled=FALSE - CallbackTimeout=0 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - BearerService=0 - BearerProtocol=UNSPECIFIED - RlpVersion=0 - IwfToMs=0 - MsToIwf=0 - AckTimer=0 - RetransmissionAttempts=0 - ResequencePeriod=0 - V42Compression=0 - V42Codewords=0 - V42MaxLength=0 - Asymmetry=0 - UserInitUpgrade=FALSE - UseEdge=FALSE - FIELD_COUNT=34 -END_ADD - -ADD_SECTION -# COMMDB_ID = 8 - Name=mRouterDialOutIsp - Description=mRouterDialOutIsp - Type=INTERNETONLY - DialResolution=TRUE - UseLoginScript=FALSE - PromptForLogin=FALSE - DisplayPCT=FALSE - IfNetworks=ip - IfPromptForAuth=FALSE - IfAuthName=IfAuthPass= - IfAuthPass=AuthRetries=0 - AuthRetries=0 - IfCallbackEnabled=FALSE - CallbackTimeout=0 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - BearerService=0 - BearerProtocol=UNSPECIFIED - RlpVersion=0 - IwfToMs=0 - MsToIwf=0 - AckTimer=0 - RetransmissionAttempts=0 - ResequencePeriod=0 - V42Compression=0 - V42Codewords=0 - V42MaxLength=0 - Asymmetry=0 - UserInitUpgrade=FALSE - UseEdge=FALSE - FIELD_COUNT=34 -END_ADD - -ADD_SECTION -# COMMDB_ID = 9 - Name=Pipex CSD - Description=Pipex Service Provider - Type=INTERNETONLY - DefaultTelNum=08450885336 - DialResolution=TRUE - UseLoginScript=FALSE - PromptForLogin=FALSE - DisplayPCT=FALSE - IfNetworks=ip - IfPromptForAuth=FALSE - IfAuthName=solabf75 - IfAuthPass=oodifama - AuthRetries=0 - IfCallbackEnabled=FALSE - CallbackTimeout=0 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=FALSE - IpNameServer1=158.43.128.1 - IpNameServer2=158.43.192.1 - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - BearerName=ASYNCHRONOUS - BearerSpeed=UNSPECIFIED - BearerCE=UNSPECIFIED - BearerType=CSD - ChannelCoding=UNSPECIFIED - Aiur=0 - RequestedTimeSlots=0 - MaximumTimeSlots=0 - BearerService=0 - BearerProtocol=UNSPECIFIED - RlpVersion=0 - IwfToMs=0 - MsToIwf=0 - AckTimer=0 - RetransmissionAttempts=0 - ResequencePeriod=0 - V42Compression=0 - V42Codewords=0 - V42MaxLength=0 - Asymmetry=0 - UserInitUpgrade=FALSE - UseEdge=FALSE - FIELD_COUNT=45 -END_ADD - - -############################################################ -## DialInISP -## -[DialInISP] -ADD_TEMPLATE - Name=Default Dial In ISP - UseLoginScript=FALSE - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - UseEdge=FALSE - FIELD_COUNT=9 -END_TEMPLATE - -ADD_SECTION -# COMMDB_ID = 2 - Name=Dial In ISP01 - UseLoginScript=FALSE - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableIPHeaderComp=FALSE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - EnableSWComp=FALSE - UseEdge=FALSE - FIELD_COUNT=9 -END_ADD - - -############################################################ -## OutgoingGPRS -## -[OutgoingGPRS] -ADD_SECTION -# COMMDB_ID = 1 - Name=GPRS01 - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 2 - Name=GPRS02 - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 3 - Name=GPRS03 - FIELD_COUNT=1 -END_ADD - -ADD_SECTION -# COMMDB_ID = 4 - Name=Orange - APN=orangeinternet - PDPType=IPV4 - ReqPrecedence=1 - ReqDelay=1 - ReqReliability=1 - ReqPeakThroughput=1 - ReqMeanThroughput=1 - MinPrecedence=8 - MinDelay=16 - MinReliability=32 - MinPeakThroughput=2 - MinMeanThroughput=2 - DataCompression=FALSE - HeaderCompression=FALSE - GprsUseEdge=FALSE - AnonymousAccess=FALSE - IfParams=psd - IfNetworks=ip - IfPromptForAuth=FALSE - IfAuthName=web - IfAuthPass=web - AuthRetries=1 - IpNetMask=255.255.255.0 - IpGateway=192.168.224.10 - IpDNSAddrFromServer=TRUE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - IpAddrFromServer=TRUE - GprsAccessPointType=0 - QosWarningTimeout=0 - FIELD_COUNT=31 -END_ADD - -ADD_SECTION -# COMMDB_ID = 5 - Name=Vodafone - APN=internet - PDPType=IPV4 - ReqPrecedence=1 - ReqDelay=1 - ReqReliability=1 - ReqPeakThroughput=1 - ReqMeanThroughput=1 - MinPrecedence=8 - MinDelay=16 - MinReliability=32 - MinPeakThroughput=2 - MinMeanThroughput=2 - DataCompression=FALSE - HeaderCompression=FALSE - GprsUseEdge=FALSE - AnonymousAccess=FALSE - IfParams=nullagt - IfNetworks=ip - IfPromptForAuth=FALSE - IfAuthName=web - IfAuthPass=web - AuthRetries=1 - IpNetMask=255.255.255.0 - IpGateway=1.2.3.4 - IpDNSAddrFromServer=TRUE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - IpAddrFromServer=TRUE - GprsAccessPointType=0 - QosWarningTimeout=0 - FIELD_COUNT=31 -END_ADD - -ADD_SECTION -# COMMDB_ID = 6 - Name=Cellnet - APN=mobile.o2.co.uk - PDPType=IPV4 - ReqPrecedence=1 - ReqDelay=1 - ReqReliability=1 - ReqPeakThroughput=1 - ReqMeanThroughput=1 - MinPrecedence=8 - MinDelay=16 - MinReliability=32 - MinPeakThroughput=2 - MinMeanThroughput=2 - DataCompression=FALSE - HeaderCompression=FALSE - GprsUseEdge=FALSE - AnonymousAccess=FALSE - IfParams=nullagt - IfNetworks=ip - IfPromptForAuth=FALSE - IfAuthName=web - IfAuthPass=password - AuthRetries=1 - IpNetMask=255.255.255.0 - IpGateway=1.2.3.4 - IpDNSAddrFromServer=TRUE - EnableLCPExtension=FALSE - DisablePlainTextAuth=FALSE - IpAddrFromServer=TRUE - GprsAccessPointType=0 - QosWarningTimeout=0 - FIELD_COUNT=31 -END_ADD - -ADD_SECTION -# COMMDB_ID = 7 - Name=T-Mobile - APN=general.t-mobile.uk - PDPType=IPV4 - ReqPrecedence=1 - ReqDelay=1 - ReqReliability=1 - ReqPeakThroughput=1 - ReqMeanThroughput=1 - MinPrecedence=8 - MinDelay=16 - MinReliability=32 - MinPeakThroughput=2 - MinMeanThroughput=2 - DataCompression=FALSE - HeaderCompression=FALSE - GprsUseEdge=FALSE - AnonymousAccess=FALSE - IfParams=psd - IfNetworks=ip - IfPromptForAuth=FALSE - IfAuthName=user - IfAuthPass=one2one - AuthRetries=1 - IpNetMask=255.255.255.0 - IpGateway=149.254.211.10 - IpDNSAddrFromServer=TRUE - IpNameServer1=149.254.1.15 - IpNameServer2=149.254.1.14 - EnableLCPExtension=TRUE - DisablePlainTextAuth=TRUE - IpAddrFromServer=TRUE - GprsAccessPointType=0 - QosWarningTimeout=-1 - FIELD_COUNT=33 -END_ADD - -ADD_SECTION -# COMMDB_ID = 8 - Name=SFR - APN=websfr - PDPType=IPV4 - ReqPrecedence=1 - ReqDelay=1 - ReqReliability=1 - ReqPeakThroughput=1 - ReqMeanThroughput=1 - MinPrecedence=8 - MinDelay=16 - MinReliability=32 - MinPeakThroughput=2 - MinMeanThroughput=2 - DataCompression=FALSE - HeaderCompression=FALSE - GprsUseEdge=FALSE - AnonymousAccess=FALSE - IfParams=psd - IfNetworks=ip - IfPromptForAuth=FALSE - IfAuthName=none - IfAuthPass=none - AuthRetries=1 - IpNetMask=255.255.255.0 - IpGateway=1.2.3.4 - IpDNSAddrFromServer=TRUE - IpNameServer1=172.20.2.10 - IpNameServer2=194.6.128.4 - EnableLCPExtension=TRUE - DisablePlainTextAuth=TRUE - IpAddrFromServer=TRUE - GprsAccessPointType=0 - QosWarningTimeout=-1 - FIELD_COUNT=33 -END_ADD - - -############################################################ -## IncomingGPRS -## -[IncomingGPRS] -ADD_SECTION -# COMMDB_ID = 1 - Name=Incoming GPRS Settings PlaceHolder - FIELD_COUNT=1 -END_ADD - - -############################################################ -## DefaultGPRS -## -[DefaultGPRS] -ADD_SECTION -# COMMDB_ID = 1 - Name=Dummy Default GPRS Settings - Usage=1 - APN=Access point name - PDPType=IPV6 - PDPAddress=www.wid.com - Precedence=1 - Delay=1 - Reliability=1 - PeakThroughput=1 - MeanThroughput=1 - MinPrecedence=1 - MinDelay=1 - MinReliability=1 - MinPeakThroughput=1 - MinMeanThroughput=1 - DataCompression=TRUE - HeaderCompression=TRUE - GprsUseEdge=FALSE - AnonymousAccess=TRUE - FIELD_COUNT=19 -END_ADD - - -############################################################ -## CDMA2000PacketServiceTable -## -[CDMA2000PacketServiceTable] -ADD_SECTION -# COMMDB_ID = 1 - Name=test name cdma2000 - IwfName=Test2000 - ServiceOption=HIGHSPEEDCDMA2000DATA - PDPType=IPV4 - ReqFwdPriority=PRIORITY04 - ReqRevPriority=PRIORITY04 - ReqFwdBitrate=32KBPS - ReqRevBitrate=32KBPS - ReqFwdLoss=LOSS1 - ReqRevLoss=LOSS1 - ReqFwdMaxdelay=40MS - ReqRevMaxdelay=40MS - MinFwdBitrate=32KBPS - MinRevBitrate=32KBPS - AccptFwdLoss=LOSS2 - AccptRevLoss=LOSS2 - AccptFwdMaxdelay=120MS - AccptRevMaxdelay=120MS - AnonymousAccess=FALSE - IfNetworks=ip - IfPromptForAuth=FALSE - IfAuthName=RasUser - IfAuthPass=pass - AuthRetries=1 - IpNetMask=255.255.255.0 - IpGateway=10.0.0.1 - IpAddrFromServer=TRUE - IpDNSAddrFromServer=TRUE - EnableLCPExtension=TRUE - DisablePlainTextAuth=TRUE - ApType=2 - QosWarningTimeout=1000000 - RlpMode=TRANSPARENT - CDMANaiType=0 - EnableIPHeaderComp=FALSE - CDMAMobileIP=FALSE - CDMAMobileIPTimeout=10000000 - FIELD_COUNT=37 -END_ADD - - -############################################################ -## LANService -## -[LANService] -ADD_SECTION -# COMMDB_ID = 1 - Name=Ethernet - IfNetworks=ip,ip6 - IpNetMask=255.255.255.0 - IpGateway=194.72.6.1 - IpAddrFromServer=TRUE - IpAddr=192.168.0.100 - IpDNSAddrFromServer=FALSE - IpNameServer1=194.72.6.51 - IpNameServer2=194.72.6.52 - FIELD_COUNT=9 -END_ADD - - -############################################################ -## IAP -## -[IAP] -ADD_SECTION -# COMMDB_ID = 1 - Name=NT RAS with Null Modem - IAPServiceType=DialOutISP - IAPService=2 - IAPBearerType=ModemBearer - IAPBearer=2 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 2 - Name=CSD IAP PlaceHolder01 - IAPServiceType=DialOutISP - IAPService=3 - IAPBearerType=ModemBearer - IAPBearer=2 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 3 - Name=CSD IAP PlaceHolder02 - IAPServiceType=DialOutISP - IAPService=4 - IAPBearerType=ModemBearer - IAPBearer=2 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 4 - Name=GPRS IAP PlaceHolder01 - IAPServiceType=OutgoingGPRS - IAPService=1 - IAPBearerType=ModemBearer - IAPBearer=8 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=4 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 5 - Name=GPRS IAP PlaceHolder02 - IAPServiceType=OutgoingGPRS - IAPService=2 - IAPBearerType=ModemBearer - IAPBearer=8 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=4 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 6 - Name=mRouter Rs232 - IAPServiceType=DialOutISP - IAPService=8 - IAPBearerType=ModemBearer - IAPBearer=12 - IAPNetwork=2 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 7 - Name=mRouter Ir - IAPServiceType=DialOutISP - IAPService=8 - IAPBearerType=ModemBearer - IAPBearer=13 - IAPNetwork=2 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 8 - Name=mRouter BT - IAPServiceType=DialOutISP - IAPService=8 - IAPBearerType=ModemBearer - IAPBearer=14 - IAPNetwork=2 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 9 - Name=mRouter USB - IAPServiceType=DialOutISP - IAPService=8 - IAPBearerType=ModemBearer - IAPBearer=15 - IAPNetwork=2 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 10 - Name=mRouter Wins - IAPServiceType=DialOutISP - IAPService=8 - IAPBearerType=ModemBearer - IAPBearer=11 - IAPNetwork=2 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 11 - Name=VPN IAP - IAPServiceType=VpnService - IAPService=2 - IAPBearerType=VirtualBearer - IAPBearer=2 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 12 - Name=EKA1 Assabet on-board ethernet - IAPServiceType=LANService - IAPService=1 - IAPBearerType=LANBearer - IAPBearer=1 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 13 - Name=EKA2 Assabet on-board ethernet - IAPServiceType=LANService - IAPService=1 - IAPBearerType=LANBearer - IAPBearer=2 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 14 - Name=EKA1 emulator ethernet - IAPServiceType=LANService - IAPService=1 - IAPBearerType=LANBearer - IAPBearer=3 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 15 - Name=EKA2 emulator ethernet - IAPServiceType=LANService - IAPService=1 - IAPBearerType=LANBearer - IAPBearer=4 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 16 - Name=Pipex CSD - IAPServiceType=DialOutISP - IAPService=9 - IAPBearerType=ModemBearer - IAPBearer=17 - IAPNetwork=1 - IAPNetworkWeighting=0 - Location=4 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 17 - Name=Vodafone - IAPService=5 - IAPServiceType=OutgoingGPRS - IAPBearer=16 - IAPBearerType=ModemBearer - IAPNetwork=3 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 18 - Name=Orange - IAPService=4 - IAPServiceType=OutgoingGPRS - IAPBearer=16 - IAPBearerType=ModemBearer - IAPNetwork=4 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 19 - Name=Cellnet - IAPService=6 - IAPServiceType=OutgoingGPRS - IAPBearer=16 - IAPBearerType=ModemBearer - IAPNetwork=5 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 20 - Name=T-Mobile 1 - IAPService=7 - IAPServiceType=OutgoingGPRS - IAPBearer=16 - IAPBearerType=ModemBearer - IAPNetwork=6 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 21 - Name=T-Mobile 2 - IAPService=7 - IAPServiceType=OutgoingGPRS - IAPBearer=16 - IAPBearerType=ModemBearer - IAPNetwork=6 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 22 - Name=T-Mobile 3 - IAPService=7 - IAPServiceType=OutgoingGPRS - IAPBearer=16 - IAPBearerType=ModemBearer - IAPNetwork=7 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 23 - Name=T-Mobile 4 - IAPService=7 - IAPServiceType=OutgoingGPRS - IAPBearer=16 - IAPBearerType=ModemBearer - IAPNetwork=7 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - -ADD_SECTION -# COMMDB_ID = 24 - Name=SFR - IAPService=8 - IAPServiceType=OutgoingGPRS - IAPBearer=16 - IAPBearerType=ModemBearer - IAPNetwork=10 - IAPNetworkWeighting=0 - Location=2 - FIELD_COUNT=8 -END_ADD - - -############################################################ -## ConnectionPreferences -## -[ConnectionPreferences] -ADD_SECTION -# COMMDB_ID = 1 - Ranking=1 - Direction=OUTGOING - DialogPref=DONOTPROMPT - BearerSet=CSD & WCDMA - IAP=17 - FIELD_COUNT=5 -END_ADD - -ADD_SECTION -# COMMDB_ID = 2 - Ranking=2 - Direction=OUTGOING - BearerSet=CSD - DialogPref=DONOTPROMPT - IAP=16 - FIELD_COUNT=5 -END_ADD - - -############################################################ -## Proxies -## -[Proxies] -ADD_SECTION -# COMMDB_ID = 1 - Name=DefaultRecordName-1 - ISP=2 - ProxyServiceType=DialOutISP - UseProxyServer=TRUE - ProxyServerName=www.dummyproxy.com - ProtocolName=http - PortNumber=80 - Exceptions=www.dummyproxy.com/exception - FIELD_COUNT=8 -END_ADD - - -############################################################ -## WAPAccessPoint -## -[WAPAccessPoint] -ADD_TEMPLATE - Name=Default Dial In ISP - CurrentBearer=WAPIPBearer - FIELD_COUNT=2 -END_TEMPLATE - -ADD_SECTION -# COMMDB_ID = 2 - Name=Dummy WAP Settings - CurrentBearer=WAPIPBearer - StartPage=www.wapstart.com - FIELD_COUNT=3 -END_ADD - - -############################################################ -## WAPIPBearer -## -[WAPIPBearer] -ADD_TEMPLATE - Name=DefaultRecordName-1 - AccessPointId=0 - IAP=0 - Security=FALSE - ProxyPortNumber=0 - FIELD_COUNT=5 -END_TEMPLATE - -ADD_SECTION -# COMMDB_ID = 2 - Name=DefaultRecordName-2 - AccessPointId=2 - GatewayAddress=www.wapgateway.com - IAP=1 - Security=FALSE - ProxyPortNumber=1 - FIELD_COUNT=6 -END_ADD - - -############################################################ -## WAPSMSBearer -## -[WAPSMSBearer] -ADD_TEMPLATE - Name=DefaultRecordName-1 - AccessPointId=0 - WSPOption=CONNECTIONLESS - Security=FALSE - FIELD_COUNT=4 -END_TEMPLATE - -ADD_SECTION -# COMMDB_ID = 2 - Name=DefaultRecordName-2 - AccessPointId=2 - GatewayAddress=+4412345678901 - ServiceCentreAddress=+442071234567 - WSPOption=CONNECTIONORIENTED - Security=FALSE - FIELD_COUNT=6 -END_ADD - - -############################################################ -## SecureSocketTable -## -[SecureSocketTable] -ADD_SECTION -# COMMDB_ID = 1 - Name=DefaultRecordName-1 - ProtocolName=ssl3.0 - ProtoLibrary=ssladaptor.dll - FIELD_COUNT=3 -END_ADD - -ADD_SECTION -# COMMDB_ID = 2 - Name=DefaultRecordName-2 - ProtocolName=tls1.0 - ProtoLibrary=ssladaptor.dll - FIELD_COUNT=3 -END_ADD - - -############################################################ -## VirtualBearer -## -[VirtualBearer] -ADD_TEMPLATE - Name=Default VPN Bearer - IfName=VPN.nif - LastSocketActivityTimeout=180 - LastSessionClosedTimeout=30 - LastSocketClosedTimeout=60 - Agent=VPN.agt - FIELD_COUNT=6 -END_TEMPLATE - -ADD_SECTION -# COMMDB_ID = 2 - Name=VPN Bearer1 - IfName=ppp.nif - LastSocketActivityTimeout=-1 - LastSessionClosedTimeout=-1 - LastSocketClosedTimeout=-1 - Agent=ntras.agt - FIELD_COUNT=6 -END_ADD - - -############################################################ -## VpnService -## -[VpnService] -ADD_TEMPLATE - Name=Default VPN - Policy=DefaultVPNpolicy - HomeIAP=1 - HomeNetwork=0 - FIELD_COUNT=4 -END_TEMPLATE - -ADD_SECTION -# COMMDB_ID = 2 - Name=VPN1 - Policy=VPNpolicy1 - HomeIAP=2 - HomeNetwork=1 - FIELD_COUNT=4 -END_ADD - diff -r 76a2435edfd4 -r de1630741fbe pimprotocols/phonebooksync/Test/TE_Sync/te_sync_trptsy.script --- a/pimprotocols/phonebooksync/Test/TE_Sync/te_sync_trptsy.script Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,441 +0,0 @@ -// 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" -// 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: -// - -RUN_SCRIPT z:\TestData\Scripts\TE_Sync_Setup_TRPTSY.script - -LOAD_SUITE TE_Sync - -//!@file -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0001 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0001 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test connection and disconnection test -//!@SYMTestPriority High -//!@SYMTestActions Connects and disconnects -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestOpen - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0001 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0002 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0002 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Do Synchronisation test -//!@SYMTestPriority High -//!@SYMTestActions Synchronises -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestDoSynchronisation - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0002 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0003 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0003 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing of contact to ICC -//!@SYMTestPriority High -//!@SYMTestActions Writes Contact to ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0003 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0004 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0004 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing of Contact to ICC - Overwrite existing entry -//!@SYMTestPriority High -//!@SYMTestActions Writes Contact to ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCOverwriteTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0004 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0005 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0005 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing of a new entry to the ICC. The index field is -//! not specified -//!@SYMTestPriority High -//!@SYMTestActions Writes a new entry to the ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCNoSlotTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0005 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0006 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0006 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing Contact to ICC - Invalid Slot number test -//!@SYMTestPriority High -//!@SYMTestActions Writes Contact to ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCInvalidSlotTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0006 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0007 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0007 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing of Contact to ICC - Blank Number test -//!@SYMTestPriority High -//!@SYMTestActions Writes Contact to ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCBlankNumTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0007 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0008 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0008 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing of Contact to ICC - Blank Name test -//!@SYMTestPriority High -//!@SYMTestActions Writes Contact to ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCBlankNameTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0008 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0009 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0009 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing of Contact to ICC - Exceed Max Number test -//!@SYMTestPriority High -//!@SYMTestActions Writes Contact to ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCExceedMaxNumTest - -// -// TestWriteContactToICCExceedMaxNameTest cannot be run at the moment since -// SIMTSY doesn't support this test yet. -// - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0009 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0010 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0010 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing of Contact to ICC - Max Number test -//!@SYMTestPriority High -//!@SYMTestActions Writes Contact to ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCMaxNumTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0010 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0011 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0011 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing of Contact to ICC - Max Name test -//!@SYMTestPriority High -//!@SYMTestActions Writes Contact to ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCMaxNameTest - -// -// TestWriteContactToICCNumLettersTest cannot be run at the moment since -// SIMTSY doesn't support this test yet. -// - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0011 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0012 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0012 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing of Contact to ICC - Name with non-alphabetical -//! characters test -//!@SYMTestPriority High -//!@SYMTestActions Writes Contact to ICC -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteContactToICCObsecureTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0012 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0013 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0013 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test validating of Contact -//!@SYMTestPriority High -//!@SYMTestActions Validates Contact -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestValidateContact - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0013 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0014 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0014 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test validating of Contact - ICC PIN locked test -//!@SYMTestPriority High -//!@SYMTestActions Validates Contact -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestValidateContactAccessLockedTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0014 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0015 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0015 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test validating of Contact - Invalid UID test -//!@SYMTestPriority High -//!@SYMTestActions Validates Contac -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestValidateContactInvalidUIDTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0015 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0016 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0016 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test updating of look-up table - Failure test -//!@SYMTestPriority High -//!@SYMTestActions Updates look-up table -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestUpdateLookUpTableFailure - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0016 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0017 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0017 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test updating of look-up table - Success test -//!@SYMTestPriority High -//!@SYMTestActions Updates look-up table -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestUpdateLookUpTableSuccess - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0017 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0018 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0018 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test getting of Sync Mode -//!@SYMTestPriority High -//!@SYMTestActions Gets Sync Mode -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestGetSyncMode - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0018 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0019 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0019 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test setting of Sync Mode - Auto/Same/Manual test -//!@SYMTestPriority High -//!@SYMTestActions Sets Sync Mode -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestSetSyncMode - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0019 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0020 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0020 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test deleting of Contact from ICC -//!@SYMTestPriority High -//!@SYMTestActions Deletes Contact from ICC test -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestDeleteContactFromICC - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0020 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0021 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0021 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test deleting of Contact with invalid ID from ICC test -//!@SYMTestPriority High -//!@SYMTestActions Deletes Contact -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestDeleteContactInvalidIdFromICC - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0021 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0022 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0022 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Get Contact Format test. This method gets the current -//! contact format. The expected output test results may not be -//! valid for different ICCs/Phones -//!@SYMTestPriority High -//!@SYMTestActions Gets Contact Format -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestGetContactFormat - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0022 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0023 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0023 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Get Cache state test -//!@SYMTestPriority High -//!@SYMTestActions Gets Cache state -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestGetPhoneBookCacheState - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0023 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0024 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0024 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test Version -//!@SYMTestPriority High -//!@SYMTestActions Gets version number of PhBkSync -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestVersionTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0024 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0025 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0025 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc GetLastSyncError function test -//!@SYMTestPriority High -//!@SYMTestActions Gets last synchronisation error -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestGetLastSyncError - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0025 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0026 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0026 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test notifying of cache state change -//!@SYMTestPriority High -//!@SYMTestActions Notifyies of cache state change -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestNotifyCacheStateChange - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0026 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0027 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0027 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test getting PhoneBook Id Test -//!@SYMTestPriority High -//!@SYMTestActions Gets PhoneBook Id -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestGetPhoneBookId - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0027 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0028 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0028 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Reset test -//!@SYMTestPriority High -//!@SYMTestActions Resets test -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestReset - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0028 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0029 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0029 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Slot Handling Test -//!@SYMTestPriority High -//!@SYMTestActions Gets slots number, gets free slots, and gets slots id -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestSlotHandlingTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0029 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0030 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0030 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test writing to slot -//!@SYMTestPriority High -//!@SYMTestActions Writes to slot -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestWriteToSlotTest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0030 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0031 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0031 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test cancelling of write request -//!@SYMTestPriority High -//!@SYMTestActions Cancels write request -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestCancelWriteRequest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0031 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0032 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0032 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test cancelling of delete request -//!@SYMTestPriority High -//!@SYMTestActions Cancels delete request -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestCancelDeleteRequest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0032 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0033 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0033 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test cancelling of DoSync request -//!@SYMTestPriority High -//!@SYMTestActions Cancels DoSync request -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestCancelDoSyncRequest - -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0033 - -START_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0034 -//!@SYMTestCaseID PIM-PHBKSYNC-NA-TRPTSY-0034 -//!@SYMREQ REQ0000 -//!@SYMTestCaseDesc Test connection and disconnection -//!@SYMTestPriority High -//!@SYMTestActions Connects and disconnects -//!@SYMTestExpectedResults Pass, if any APIs fail the step will leave -//!@SYMTestType CT -RUN_TEST_STEP 300 TE_Sync TestConnectionTest -END_TESTCASE PIM-PHBKSYNC-NA-TRPTSY-0034 - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/DEPRECATION --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/DEPRECATION Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,233 @@ +Deprecation guide (23 March 2010) +================= +Known source breaks: + There are a number of source breaks that nearly all just affect engine writers - marked with [!] in this document. Largely + these fall into two classes - 1) interface functions becoming pure virtual and 2) return type changing. + + Of these categories, client code is only somewhat likely to encounter the second case (QContactRelationshipFilter::relatedContactRole + changed return type from QContactRelationshipFilter::Role to QContactRelationship::Role). You can search and replace this + change, however. This function is usually more useful to engine writers, though. + + The other category of break in this release affects engine writers. All engines that were in the + qtmobility repository have been updated. + + The QContactManagerEngine interface has been made largely pure virtual to avoid problems when implementing an engine + and not using the correct signature (or when the interface changes). In addition, any non const refs (e.g. + QContactManager::Error &) have been replaced with a pointer, or with explicit functions (in QContactChangeset). + +New classes: + QContactThumbnail [Detail - QImage for list view purposes] + QContactRingtone [Detail - audio/video ringtones] + QContactPresence [Detail - presence information from a service] + QContactGlobalPresence [Detail - aggregated presence] + QContactTag [Detail - Tag/category for a contact] + + QContactFetchHint [Hints for fetching contacts - details, relationships, blobs etc] + +New functionality: + qHash for QContact, QContactActionDescriptor, QContactDetail, QContactId, QContactRelationship, QVersitDocument, QVersitProperty + qDebug streaming for QContact, QContactDetail, QContactId, QContactRelationship, QVersitDocument, QVersitProperty + operator< for QContactId, QContactActionDescriptor + +General changes: + Q_DECLARE_LATIN1_LITERAL -> Q_DECLARE_LATIN1_CONSTANT and Latin1Literal -> QLatin1Constant - Don't use the old ones. + QContactRelationshipFilter::Role moved to QContactRelationship::Role (affects all places that deal with relationships) + QContactLocalId - definition moved to qcontactid.h from qtcontactsglobal.h (old header includes new one right now) + +QContact: + Deprecated members: + setRelationshipOrder() [No replacement] + relationshipOrder() [No replacement] + relatedContacts(... taking a QCRF::Role) [use relatedContacts taking a QCR::Role instead] + + New members: + relatedContacts(... taking a QCR::Role) + preferredDetails() [Returns a map of detail preferences] + +QContactManager: + General changes: + All fetch functions taking a list of detail definitions to retrieve have been changed to use QContactFetchHint instead + Some functions now take a const List& rather than a List* + Functions returning a QList are replaced with parameters pointing to an error map to fill in + Deprecated members: + 2 x contacts(.. QStringList definitionRestrictions ..) [use contacts functions that takes QContactFetchHint instead] + contact(.. QStringList definitionRestrictions ..) [use contact function that takes QContactFetchHint instead] + removeContacts(QList* contacts, ...) [use removeContacts(const QList&, ...) instead] + 2 x relationships(.. taking a QCRF::Role ..) [use relationships functions that take QContactRelationship::Role instead] + QList saveRelationships(...) [use bool saveRelationships(...) instead] + QList removeRelationships(...) [use bool removeRelationships(...) instead] + QSL supportedRelationshipTypes() [use bool isRelationshipTypeSupported(QString) instead] + New members: + contact,contacts,relationships taking a QContactRelationship::Role instead + saveRelationships/removeRelationships taking a QMap* parameter instead + bool isRelationshipTypeSupported(const QString&) const + compatibleContact - given an input contact, return a contact that can be saved in this manager (by stripping unsupported fields etc) + +QContactManagerEngine: + General changes: + [!] There have been a large number of changes here... + Nearly all functions are now pure virtual and must be implemented in the engine. Default implementations exist, + but the engine writer must make the conscious decision to use them. + The QCME API is now smaller than the QCM API, and several QCM functions are now convenience wrappers around + QCME functions (particularly w.r.t. contact fetching) + The actual API changes themselves follow the QCM API (e.g. taking pointers to error map rather than returning error lists) + Deprecated members: + The updateXXXXXRequest functions now allow you to specify the request state atomically with results. The old functions are deprecated, + with the addition of an extra parameter at the end of the parameter list. + +QContactRelationshipFilter: + Deprecated members: + enum Role has been moved to QContactRelationship + setRelatedContactRole(QCRF::Role..) [use setRelatedContactRole(QCR::Role) instead] + Changed members (Source break): + [!] relatedContactRole now returns a QCR::Role instead of a QCRF::Role + +QContactFetchRequest: + This class has changed to use QContactFetchHint instead of the list of detail definitions + Deprecated members: + setDefinitionRestrictions [use setFetchHint() with an appropriate QContactFetchHint] + definitionRestrictions [use fetchHint() and retrieve the detailDefinitionHint] + New members: + fetchHint() + setFetchHint() + +QContactDetail: + Deprecated members: + preferredActions [No replacement] + setPreferredActions [No replacement] + +QContactRelationship: + QContactRelationshipFilter::Role enum moved here + +QContactActionDescriptor: + Constructor is now explicit, no other change + +QContactChangeSet: + Class for engine writers, some large changes: + Non-const refs in API deprecated - split into const accessor and insert/clear functions + Old and new self contact API changed to explicit function rather than QPair + +QContactAddress: + DefinitionName (value changed from StreetAddress -> Address) + +QContactAvatar: + The avatar class has been split into 3 classes (QContactAvatar, QContactThumbnail and QContactRingtone), + and individual fields rather than subtypes with a single value. + + Deprecated members: + FieldAvatar [Use QContactAvatar::FieldImageUrl or FieldVideoUrl] + FieldAvatarPixmap [Use QContactThumbnail::Thumbnail] + FieldSubType [No replacement] + SubTypeImage [No replacement, image stored in QContactThumbnail::thumbnail() or QContactAvatar::imageUrl()] + SubTypeVideo [No replacement, stored in QContactAvatar::videoUrl()] + SubTypeTexturedMesh [No replacement] + SubTypeAudioRingtone [No replacement, stored in QContactRingtone::audioRingtone()] + SubTypeVideoRingtone [No replacement, stored in QContactRingtone::videoRingtone()] + avatar() [Use QContactAvatar::imageUrl() or QContactAvatar::videoUrl()] + setAvatar() [Use QContactAvatar::setImageUrl() or QContactAvatar::setVideoUrl()] + pixmap() [Use QContactThumbnail::thumbnail() - QImage instead of QPixmap] + setPixmap() [Use QContactThumbnail::setThumbnail() - QImage instead of QPixmap] + subType() [No replacement - explicit fields instead of subtypes + setSubType() [No replacement - explicit fields instead of subtypes + + New members: + FieldImageUrl + FieldVideoUrl + void setImageUrl(const QUrl& imageUrl); + QUrl imageUrl() const; + void setVideoUrl(const QUrl& videoUrl); + QUrl videoUrl() const; + +QContactOrganization: + Deprecated members: + FieldLogo [Use QContactOrganization::FieldLogoUrl] + logo() [Use logoUrl() instead] + setLogo() [Use setLogoUrl() instead] + + New members: + FieldLogoUrl + void setLogoUrl(); + QUrl logoUrl(); + +QContactPhoneNumber: + Deprecated members: + SubTypeFacsimile [Use SubTypeFax instead] + + New members: + SubTypeFax + +QContactOnlineAccount: + General: + Presence information has been removed from here and put into QContactPresence. + QContactPresence details are expected to be linked to this via linkedDetailUri(); + Deprecated members: + FieldPresence [Use QContactPresence::FieldPresenceState] + FieldNickname [Use QContactPresence::FieldNickname] + FieldStatusMessage [Use QContactPresence::FieldStatusText or FieldCustomMessage] + PresenceAvailable [Use QContactPresence::PresenceAvailable - enum, not string constant] + PresenceHidden [Use QContactPresence::PresenceHidden - enum, not string constant] + PresenceAway [Use QContactPresence::PresenceAway - enum, not string constant] + PresenceBusy [Use QContactPresence::PresenceBusy - enum, not string constant] + PresenceExtendedAway [Use QContactPresence::PresenceExtendedAway - enum, not string constant] + PresenceOffline [Use QContactPresence::PresenceOffline - enum, not string constant] + PresenceUnknown [Use QContactPresence::PresenceUnknown - enum, not string constant] + setPresence() [Use QContactPresence::setPresenceState()] + presence() [Use QContactPresence::presenceState()] + setNickname() [Use QContactPresence::setNickname()] + nickname() [Use QContactPresence::nickname()] + setStatusMessage() [Use QContactPresence::setPresenceStateText() or setCustomMessage()] + statusMessage() [Use QContactPresence::presenceStateText() or customMessage()] + +QContactPresence: + General: + This deprecated class header was left in the tree for a while, but not included in the + grouped header files, or compiled or linked. Now it has been resurrected. + Previous code (if any) that was using it will most likely break. + QContactOnlineAccount previously held presence information, and that information will + now be held here, and linked via linkedDetailUri() instead. + +QVersitContactExporter: + General: + Added simple error reporting + Changed to be more consistent with contacts + Deprecated members: + QList exportContacts() [use bool exportContacts(contacts, doctype), and documents()] + New members: + QList documents() [result of export operation] + QMap errors() [errors in export operation] + bool exportContacts(QList, QVD::DocType) [do export] + +QVersitContactImporter: + General: + Added simple error reporting + Changed to be more consistent with contacts + Deprecated members: + QList importContacts(QList) [use importDocuments(QList), and contacts() instead] + New members: + QList contacts() [result of import operation] + QMap errors() [errors in import operation] + bool importDocuments(const QList&) [do import] + +QVersitDocument: + Added ctor with versit document type parameter + +QVersitProperty: + New members: + enum for semantic type of value (plain, compound, list, binary, versit document) + setter/getter for above - intended to be used by QVersitReader/QVersitWriter + +QVersitReader: + General: + Added capability of reading from bytearray directly (no QBuffer needed) + Added ctors with iodevice & bytearray for source + startReading() & cancel() are now slots + waitForFinished() is now an invokable too + Deprecated members: + resultsAvailable(QList) signal [use resultsAvailable() and results() separately] + +QVersitWriter: + General: + Added capability of writing directly to a qbytearray + Added ctors with iodevice and bytearray for destination + startWriting() and cancel() are now slots + waitForFinished() is now an invokable diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/common.pri --- a/qtcontactsmobility/common.pri Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/common.pri Mon May 03 12:24:20 2010 +0300 @@ -4,14 +4,19 @@ # ###################################################################### + CONFIG(debug, debug|release) { WAS_IN_DEBUG=debug } else { WAS_IN_DEBUG=release } -include(pathconfig.pri) -include($$QT_MOBILITY_BUILD_TREE/config.pri) +include(staticconfig.pri) + +symbian:contains(symbian_symbols_unfrozen,1) { + #see configure.bat for details + MMP_RULES+="EXPORTUNFROZEN" +} mac { contains(QT_CONFIG, qt_framework):contains(TEMPLATE, lib) { @@ -80,8 +85,12 @@ !testcase { OBJECTS_DIR = $$OUTPUT_DIR/build/$$SUBDIRPART/$$TARGET !plugin { - contains(TEMPLATE,.*lib):DESTDIR = $$OUTPUT_DIR/lib - else:DESTDIR = $$OUTPUT_DIR/bin + contains(TEMPLATE,.*lib) { + DESTDIR = $$OUTPUT_DIR/lib + symbian:defFilePath=../s60installs + } else { + DESTDIR = $$OUTPUT_DIR/bin + } } else { testplugin:DESTDIR = $$OUTPUT_DIR/build/tests/bin/plugins/$$PLUGIN_TYPE !testplugin:DESTDIR = $$OUTPUT_DIR/plugins/$$PLUGIN_TYPE @@ -104,11 +113,20 @@ QMAKE_RPATHDIR += $$OUTPUT_DIR/lib } +contains(TEMPLATE,.*lib):DEFINES += QT_SHARED + maemo6 { DEFINES+= Q_WS_MAEMO_6 + contains(TEMPLATE,.*app.*): QMAKE_LIB_FLAGS+= -Wl,-rpath-link $$[QT_INSTALL_LIBS] + QMAKE_LIB_FLAGS+= -Wl,-rpath-link $$[QT_INSTALL_LIBS] + QMAKE_RPATHDIR += $$[QT_INSTALL_LIBS] } maemo5 { DEFINES+= Q_WS_MAEMO_5 + LIBS += -lgconf-2 -lrtcom-eventlogger -lmodest-dbus-client-1.0 -losso -ldbus-glib-1 -ldbus-1 -lgobject-2.0 -lglib-2.0 -ltpsession -ltelepathy-qt4} +maemo* { + LIBS += -L/opt/qt4-maemo5/lib + QMAKE_LFLAGS += -Wl,-rpath,/opt/qt4-maemo5/lib } wince* { @@ -151,5 +169,7 @@ } LIBS += -L$$OUTPUT_DIR/lib + DEPENDPATH += . $$SOURCE_DIR INCLUDEPATH += $$SOURCE_DIR/src/global + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/config.tests/lbt/lbt.pro --- a/qtcontactsmobility/config.tests/lbt/lbt.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/config.tests/lbt/lbt.pro Mon May 03 12:24:20 2010 +0300 @@ -11,5 +11,5 @@ # Input SOURCES += main.cpp -INCLUDEPATH += $$EPOCROOT\epoc32\include\LBTHeaders +INCLUDEPATH += $${EPOCROOT}epoc32\include\LBTHeaders LIBS += -llbt diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/config.tests/snap/snap.pro --- a/qtcontactsmobility/config.tests/snap/snap.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/config.tests/snap/snap.pro Mon May 03 12:24:20 2010 +0300 @@ -8,6 +8,7 @@ TARGET = DEPENDPATH += INCLUDEPATH += . +INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE SOURCES += main.cpp LIBS += -lcmmanager diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/configure --- a/qtcontactsmobility/configure Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/configure Mon May 03 12:24:20 2010 +0300 @@ -93,6 +93,7 @@ echo "-modules ... Restrict list of modules to build (default all supported)" echo " Choose from: bearer contacts location publishsubscribe" echo " messaging multimedia systeminfo serviceframework versit" + echo " sensors" echo " Modules should be separated by a space and surrounded" echo " by double quotation. If a" echo " selected module depends on other modules dependencies" @@ -208,10 +209,29 @@ findframeworks +findUniversal() +{ + if [ -e "mac.inc" ]; then + rm mac.inc + fi + echo "contains(QT_CONFIG,x86): system(echo CONFIG+=x86 >> mac.inc)" > 2.pro + echo "contains(QT_CONFIG,ppc): system(echo CONFIG+=ppc >> mac.inc)" >> 2.pro + echo "contains(QT_CONFIG,ppc64): system(echo CONFIG+=ppc64 >> mac.inc)" >> 2.pro + echo "contains(QT_CONFIG,x86_64): system(echo CONFIG+=x86_64 >> mac.inc)" >> 2.pro + SOMETIME=`qmake 2.pro 2>&1` + rm 2.pro + if [ -e "mac.inc" ]; then + echo "exists(mac.inc): include(mac.inc)" >> "$CONFIG_IN" + fi +} + + if [ -n "$BUILD_SILENT" ]; then echo "CONFIG += silent" > "$CONFIG_IN" fi +findUniversal + if [ -z "$RELEASEMODE" ]; then RELEASEMODE="debug" fi @@ -347,7 +367,7 @@ cd config.tests/$2 fi - qmake "$relpath/config.tests/$2/$2.pro" >> "$CONFIG_LOG" + qmake "$relpath/config.tests/$2/$2.pro" 2>> "$CONFIG_LOG" >> "$CONFIG_LOG" printf " ." "$MAKE" clean >> "$CONFIG_LOG" printf "." @@ -367,6 +387,7 @@ compileTest QMF qmf compileTest NetworkManager networkmanager compileTest "CoreWLAN (MacOS 10.6)" corewlan +compileTest "Maemo ICD" maemo-icd # Now module selection # using 'expr match ....' should help a bit @@ -378,6 +399,7 @@ # It's a lot easier to make qmake do the dependency checking... echo "mobility_modules = $MOBILITY_MODULES" >> "$CONFIG_IN" echo "contains(mobility_modules,versit): mobility_modules *= contacts" >> "$CONFIG_IN" +echo "maemo5|maemo6:contains(maemo-icd_enabled, no): mobility_modules -= bearer" >> "$CONFIG_IN" # Ideally we'd skip generating headers for modules that are not enabled echo "Generating Mobility Headers..." @@ -409,7 +431,6 @@ ;; multimedia) $relpath/bin/syncheaders $shadowpath/include $relpath/src/multimedia - $relpath/bin/syncheaders $shadowpath/include $relpath/src/multimedia/experimental ;; messaging) $relpath/bin/syncheaders $shadowpath/include $relpath/src/messaging @@ -433,6 +454,9 @@ mv "$CONFIG_IN" config.pri mkdir -p "$shadowpath/features" +if [ "$shadowpath" != "$relpath" ]; then + cp -f "$relpath/features/strict_flags.prf" "$shadowpath/features" +fi echo "Running qmake..." if qmake -recursive "$relpath/qtcontactsmobility.pro"; then diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/configure.bat --- a/qtcontactsmobility/configure.bat Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/configure.bat Mon May 03 12:24:20 2010 +0300 @@ -71,24 +71,25 @@ set QMAKE_CACHE= :cmdline_parsing -if "%1" == "" goto startProcessing -if "%1" == "-debug" goto debugTag -if "%1" == "-release" goto releaseTag -if "%1" == "-silent" goto silentTag -if "%1" == "-prefix" goto prefixTag -if "%1" == "-libdir" goto libTag -if "%1" == "-bindir" goto binTag -if "%1" == "-headerdir" goto headerTag -if "%1" == "-tests" goto testTag -if "%1" == "-examples" goto exampleTag -if "%1" == "-qt" goto qtTag -if "%1" == "-vc" goto vcTag -if "%1" == "-no-docs" goto nodocsTag -if "%1" == "-modules" goto modulesTag -if "%1" == "/?" goto usage -if "%1" == "-h" goto usage -if "%1" == "-help" goto usage -if "%1" == "--help" goto usage +if "%1" == "" goto startProcessing +if "%1" == "-debug" goto debugTag +if "%1" == "-release" goto releaseTag +if "%1" == "-silent" goto silentTag +if "%1" == "-prefix" goto prefixTag +if "%1" == "-libdir" goto libTag +if "%1" == "-bindir" goto binTag +if "%1" == "-headerdir" goto headerTag +if "%1" == "-tests" goto testTag +if "%1" == "-examples" goto exampleTag +if "%1" == "-qt" goto qtTag +if "%1" == "-vc" goto vcTag +if "%1" == "-no-docs" goto nodocsTag +if "%1" == "-modules" goto modulesTag +if "%1" == "/?" goto usage +if "%1" == "-h" goto usage +if "%1" == "-help" goto usage +if "%1" == "--help" goto usage +if "%1" == "-symbian-unfrozen" goto unfrozenTag echo Unknown option: "%1" @@ -120,6 +121,7 @@ echo -modules ^ ... Build only the specified modules (default all) echo Choose from: bearer contacts location publishsubscribe echo messaging multimedia systeminfo serviceframework versit + echo sensors echo Modules should be separated by a space and surrounded echo by double quotation. If a echo selected module depends on other modules dependencies @@ -177,6 +179,18 @@ shift goto cmdline_parsing +:unfrozenTag +REM Should never be used in release builds +REM Some SDK's seem to exclude Q_AUTOTEST_EXPORT symbols if the +REM libraries are frozen. This breaks unit tests relying on the auto test exports +REM This flag unfreezes the SYMBIAN libraries for the purpose of unit test building. +REM Ideally this should be connected to '-tests' option but that would prevent +REM integration testing for frozen symbols as the CI system should test unit tests +REM and frozen symbol compliance. +echo symbian_symbols_unfrozen = 1 >> %PROJECT_CONFIG% +shift +goto cmdline_parsing + :testTag set BUILD_UNITTESTS=yes shift @@ -432,6 +446,7 @@ REM compile tests go here. call :compileTest LBT lbt call :compileTest SNAP snap +call :compileTest OCC occ call :compileTest SymbianContactSIM symbiancntsim echo End of compile tests echo. @@ -439,6 +454,7 @@ REM we could skip generating headers if a module is not enabled if not exist "%BUILD_PATH%\features" mkdir %BUILD_PATH%\features +copy %SOURCE_PATH%\features\strict_flags.prf %BUILD_PATH%\features echo Generating Mobility Headers... rd /s /q %BUILD_PATH%\include mkdir %BUILD_PATH%\include diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/examples.pri --- a/qtcontactsmobility/examples/examples.pri Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/examples.pri Mon May 03 12:24:20 2010 +0300 @@ -1,4 +1,4 @@ -include($$QT_MOBILITY_BUILD_TREE/config.pri) +include(../staticconfig.pri) !contains(build_examples, yes):error(Please use the -examples configure switch to enable building of examples) @@ -32,7 +32,18 @@ maemo6 { DEFINES+= Q_WS_MAEMO_6 + DEFINES+= QTM_EXAMPLES_SMALL_SCREEN + DEFINES+= QTM_EXAMPLES_PREFER_LANDSCAPE } maemo5 { DEFINES+= Q_WS_MAEMO_5 + DEFINES+= QTM_EXAMPLES_SMALL_SCREEN + DEFINES+= QTM_EXAMPLES_PREFER_LANDSCAPE } +symbian { + DEFINES+= QTM_EXAMPLES_SMALL_SCREEN +} +maemo* { + LIBS += -L/opt/qt4-maemo5/lib + QMAKE_LFLAGS += -Wl,-rpath,/opt/qt4-maemo5/lib +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/examples.pro --- a/qtcontactsmobility/examples/examples.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/examples.pro Mon May 03 12:24:20 2010 +0300 @@ -1,20 +1,25 @@ -include($$QT_MOBILITY_BUILD_TREE/config.pri) +include(../staticconfig.pri) TEMPLATE = subdirs #ServiceFramework examples contains(mobility_modules,serviceframework) { SUBDIRS += filemanagerplugin \ - bluetoothtransferplugin \ - servicebrowser + bluetoothtransferplugin \ + notesmanagerplugin \ + servicebrowser + + !symbian:SUBDIRS+= servicenotesmanager/sfw-notes + + contains(QT_CONFIG, declarative) { + SUBDIRS += servicenotesmanager/declarative-sfw-notes \ + declarative-sfw-dialer + } } #BearerManagement examples contains(mobility_modules,bearer) { SUBDIRS += bearermonitor bearercloud - contains(QT_CONFIG, declarative) { - SUBDIRS += declarative - } } #Location examples @@ -34,7 +39,7 @@ #Contacts examples contains(mobility_modules,contacts) { SUBDIRS += samplephonebook - contains(QT_CONFIG, declarative) { + contains(mobility_modules,versit):contains(QT_CONFIG, declarative) { SUBDIRS += qmlcontacts } } @@ -58,31 +63,24 @@ 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 { +contains(qmf_enabled,yes)|wince*|win32|symbian|maemo5 { + contains(mobility_modules,messaging) { !win32-g++ { - SUBDIRS += \ + SUBDIRS += \ querymessages \ writemessage \ serviceactions - contains(mobility_modules,contacts) { - SUBDIRS += keepintouch - } - } + contains(mobility_modules,contacts) { + SUBDIRS += keepintouch + } + } } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qml-contacts/qmlcontact.cpp --- a/qtcontactsmobility/examples/qml-contacts/qmlcontact.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,146 +0,0 @@ -#include "qmlcontact.h" -#include -#include - - -QT_USE_NAMESPACE -QTM_USE_NAMESPACE - -QTM_BEGIN_NAMESPACE - -QmlContact::QmlContact(QContact& contact, QObject *parent) - : QObject(parent), m_contact(contact) -{ -} - -QmlContact::QmlContact() -{ - -} - -QmlContact::~QmlContact() -{ - -} - -QContact &QmlContact::contact() -{ - return m_contact; -} - -void QmlContact::setContact(QContact& contact) -{ - m_contact = contact; - emit contactChanged(this); -} - -QString QmlContact::name() -{ - QList allNames = m_contact.details(QContactName::DefinitionName); - - const QLatin1String space(" "); - - // synthesise the display label from the name. - for (int i=0; i < allNames.size(); i++) { - const QContactName& name = allNames.at(i); - - QString result; - if (!name.value(QContactName::FieldPrefix).trimmed().isEmpty()) { - result += name.value(QContactName::FieldPrefix); - } - - if (!name.value(QContactName::FieldFirst).trimmed().isEmpty()) { - if (!result.isEmpty()) - result += space; - result += name.value(QContactName::FieldFirst); - } - - if (!name.value(QContactName::FieldMiddle).trimmed().isEmpty()) { - if (!result.isEmpty()) - result += space; - result += name.value(QContactName::FieldMiddle); - } - - if (!name.value(QContactName::FieldLast).trimmed().isEmpty()) { - if (!result.isEmpty()) - result += space; - result += name.value(QContactName::FieldLast); - } - - if (!name.value(QContactName::FieldSuffix).trimmed().isEmpty()) { - if (!result.isEmpty()) - result += space; - result += name.value(QContactName::FieldSuffix); - } - - if (!result.isEmpty()) { - return result; - } - } - - - return QString("noName"); -} - -void QmlContact::setName(QString name) -{ - Q_UNUSED(name); - qWarning() << "Not implemented yet"; - emit nameChanged(this); -} - -QStringList QmlContact::availableActions() -{ - QList actions = m_contact.availableActions(); - QStringList names; - - foreach (const QContactActionDescriptor& action, actions) { - names << action.actionName(); - } - return names; -} -QStringList QmlContact::details() -{ - QStringList dets; - QList ld = m_contact.details(); - QContactDetail d; - foreach(d, ld){ - dets += d.definitionName(); - } - return dets; -} - -QStringList QmlContact::contexts() -{ - QStringList dets; - QList ld = m_contact.details(); - QContactDetail d; - foreach(d, ld){ - dets += d.contexts(); - } - return dets; -} - -//QStringList QmlContact::values(QString definitionId) -QVariantMap QmlContact::values(QString definitionId) -{ - QStringList strlist; - QContactDetail detail = m_contact.detail(definitionId); - - QVariantMap map = detail.values(); - //qWarning() << "Number of e: " << map.count(); - return map; - -// QMap::const_iterator i = map.constBegin(); -// while (i != map.constEnd()) { -// qWarning() << "Key: " << i.key() << " Value: " << i.value(); -// strlist += i.key() + ": " + i.value().toString(); -// ++i; -// } -// -// return strlist; -} - -#include "moc_qmlcontact.cpp" -QTM_END_NAMESPACE -QML_DEFINE_TYPE(QmlContact, 1, 0, QmlContact, QmlContact) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qml-contacts/qmlcontact.h --- a/qtcontactsmobility/examples/qml-contacts/qmlcontact.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -#ifndef QMLCONTACT_H -#define QMLCONTACT_H - -#include -#include -#include - - -QTM_BEGIN_NAMESPACE -class QmlContact : public QObject { -Q_OBJECT -Q_PROPERTY(QContact contact READ contact WRITE setContact NOTIFY contactChanged) -Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) -Q_PROPERTY(QString test READ test) -Q_PROPERTY(QStringList availableActions READ availableActions) -Q_PROPERTY(QStringList details READ details) -Q_PROPERTY(QStringList contexts READ contexts) -public: - QmlContact(QContact& contact, QObject *parent = 0); - QmlContact(); - ~QmlContact(); - - QContact& contact(); - void setContact(QContact& contact); - - QString name(); - void setName(QString name); - - QStringList availableActions(); - QStringList details(); - - QStringList contexts(); - - Q_INVOKABLE QVariantMap values(QString definitionId); - - QString test() { return "test string"; } - -signals: - void contactChanged(QmlContact* qmlcontact); - void nameChanged(QmlContact* qmlcontact); - -private: - QContact m_contact; -}; - -QML_DECLARE_TYPE(QmlContact); - -QTM_END_NAMESPACE - -#endif // QMLCONTACT_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/ScrollBar.qml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/ScrollBar.qml Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,34 @@ +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" + property alias bgColor: background.color + property alias fgColor: thumb.color + + // 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 { + id: thumb + 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/contents/MediaButton.qml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/contents/MediaButton.qml Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,35 @@ +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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/contents/default.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/contents/default.svg Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + weather-clear + January 2006 + + + Ryan Collier (pseudo) + + + + + http://www.tango-project.org + + + http://www.pseudocode.org + + + weather + applet + notification + + + + + + Garrett LeSage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/contents/example.vcf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/contents/example.vcf Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,198 @@ +BEGIN:VCARD +VERSION:2.1 +N:Clark;Andy; +FN:Mr. Andy Clark +ORG:Example; +TITLE:Engineer +NOTE: +TEL;WORK;VOICE:07-2342322 +TEL;HOME;VOICE: +TEL;CELL;VOICE: +TEL;PAGER;VOICE: +TEL;WORK;FAX: +TEL;HOME;FAX: +ADR;WORK:;;;;;; +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:BusinessOffice=0D=0A=0D=0A, =0D=0A +ADR;HOME:;;;;;; +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=0D=0A, =0D=0A +URL;HOME: +URL;WORK: +BDAY:1/01/4500 +EMAIL;PREF;INTERNET:andy@example.com +End:VCARD +BEGIN:VCARD +VERSION:2.1 +N:Green;Bob; +FN:Mr. Bob Green +ORG:Example; +TITLE:Engineer +NOTE: +TEL;WORK;VOICE:07-3242325 +TEL;HOME;VOICE: +TEL;CELL;VOICE: +TEL;PAGER;VOICE: +TEL;WORK;FAX: +TEL;HOME;FAX: +ADR;WORK:;;;;;; +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:BusinessOffice=0D=0A=0D=0A, =0D=0A +ADR;HOME:;;;;;; +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=0D=0A, =0D=0A +URL;HOME: +URL;WORK: +BDAY:1/01/4500 +EMAIL;PREF;INTERNET:bob@example.com +End:VCARD +BEGIN:VCARD +VERSION:2.1 +N:Brows;Charles; +FN:Mr. Charles Brows +ORG:Example; +TITLE:Engineer +NOTE: +TEL;WORK;VOICE:32324534233 +TEL;HOME;VOICE: +TEL;CELL;VOICE: +TEL;PAGER;VOICE: +TEL;WORK;FAX: +TEL;HOME;FAX: +ADR;WORK:;;;;;; +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:BusinessOffice=0D=0A=0D=0A, =0D=0A +ADR;HOME:;;;;;; +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=0D=0A, =0D=0A +URL;HOME: +URL;WORK: +BDAY:1/01/4500 +EMAIL;PREF;INTERNET:charles@example.com +End:VCARD +BEGIN:VCARD +VERSION:2.1 +N:Edie;David; +FN:Mr. David Edie +ORG:Example; +TITLE:Manager +NOTE: +TEL;WORK;VOICE:(07) 3245-2323 +TEL;HOME;VOICE: +TEL;CELL;VOICE: +TEL;PAGER;VOICE: +TEL;WORK;FAX: +TEL;HOME;FAX: +ADR;WORK:;;;;;; +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:BusinessOffice=0D=0A=0D=0A, =0D=0A +ADR;HOME:;;;;;; +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=0D=0A, =0D=0A +URL;HOME: +URL;WORK: +BDAY:1/01/4500 +EMAIL;PREF;INTERNET:david@example.com +End:VCARD +BEGIN:VCARD +VERSION:2.1 +N:Eden;Carol; +FN:Mrs. Carol Eden +ORG:Example; +TITLE:Manager +NOTE: +TEL;WORK;VOICE:2323242 +TEL;HOME;VOICE: +TEL;CELL;VOICE: +TEL;PAGER;VOICE: +TEL;WORK;FAX: +TEL;HOME;FAX: +ADR;WORK:;;;;;; +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:BusinessOffice=0D=0A=0D=0A, =0D=0A +ADR;HOME:;;;;;; +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=0D=0A, =0D=0A +URL;HOME: +URL;WORK: +BDAY:1/01/4500 +EMAIL;PREF;INTERNET:carol@example.com +End:VCARD +BEGIN:VCARD +VERSION:2.1 +N:Chilton;Bill; +FN:Mr. Bill Chilton +ORG:Example; +TITLE:Manager +NOTE: +TEL;WORK;VOICE:564412232 +TEL;HOME;VOICE: +TEL;CELL;VOICE: +TEL;PAGER;VOICE: +TEL;WORK;FAX: +TEL;HOME;FAX: +ADR;WORK:;;;;;; +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:BusinessOffice=0D=0A=0D=0A, =0D=0A +ADR;HOME:;;;;;; +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=0D=0A, =0D=0A +URL;HOME: +URL;WORK: +BDAY:1/01/4500 +EMAIL;PREF;INTERNET:bill@example.com +End:VCARD +BEGIN:VCARD +VERSION:2.1 +N:Gates;Aaron; +FN:Ms. Aaron Gates +ORG:Example; +TITLE:Engineer +NOTE: +TEL;WORK;VOICE:33333 +TEL;HOME;VOICE: +TEL;CELL;VOICE: +TEL;PAGER;VOICE: +TEL;WORK;FAX: +TEL;HOME;FAX: +ADR;WORK:;;;;;; +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:BusinessOffice=0D=0A=0D=0A, =0D=0A +ADR;HOME:;;;;;; +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=0D=0A, =0D=0A +URL;HOME: +URL;WORK: +BDAY:1/01/4500 +EMAIL;PREF;INTERNET:aaron@example.com +End:VCARD +BEGIN:VCARD +VERSION:2.1 +N:Black;Jason; +FN:Mr. Jason Black +ORG:Example; +TITLE:Engineer +NOTE: +TEL;WORK;VOICE:33333333333 +TEL;HOME;VOICE: +TEL;CELL;VOICE: +TEL;PAGER;VOICE: +TEL;WORK;FAX: +TEL;HOME;FAX: +ADR;WORK:;;;;;; +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:BusinessOffice=0D=0A=0D=0A, =0D=0A +ADR;HOME:;;;;;; +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=0D=0A, =0D=0A +URL;HOME: +URL;WORK: +BDAY:1/01/4500 +EMAIL;PREF;INTERNET:jason@example.com +End:VCARD +BEGIN:VCARD +VERSION:2.1 +N:Mcdonald;Alexander; +FN:Mr. Alexander Mcdonald +ORG:Example; +TITLE:Engineer +NOTE: +TEL;WORK;VOICE:111111111 +TEL;HOME;VOICE: +TEL;CELL;VOICE: +TEL;PAGER;VOICE: +TEL;WORK;FAX: +TEL;HOME;FAX: +ADR;WORK:;;;;;; +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:BusinessOffice=0D=0A=0D=0A, =0D=0A +ADR;HOME:;;;;;; +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:=0D=0A, =0D=0A +URL;HOME: +URL;WORK: +BDAY:1/01/4500 +EMAIL;PREF;INTERNET:alex@example.com +End:VCARD diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/example.qml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/example.qml Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,238 @@ +import QMLContactManagerAsync 1.0 +import QmlContact 1.0 +import Qt 4.6 + +Rectangle { + id: topItem + width: 320 + height: 480 + x: 0 + y: 0 + + color: "#080808"; + + Script { + function startup() { + manager.contacts(); + } + function gotContacts(c) { + if(c == undefined){ + return; + } +/* + print("Got contacts: " + c.name); + print(" Available actions: " + c.availableActions); + print(" details: " + c.details);detailsOpacity +*/ + var o = c.values("OnlineAccount"); + var q = c.values("Presence"); + + nameModel.append({"name": c.name, "accountPath": "Account: " + o.AccountPath, "presence": "Status: " + q.Presence, "email": c.email, "avatarSource": "qrc:/default.svg"}); + +/* + 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: "manager" + + manager: "memory" + onDataChanged: print("Data changed!"); + onContactsAdded: print("Contacts added: " + contactIds); + onContactsLoaded: gotContacts(contact); + } + + Component { + id: listdelegate + Rectangle { + id: wrapper + border.width: 2 + height: 30; + + property color topColor: "#333333"; + property color bottomColor: "#111111"; + property real detailsOpacity: 0 + + gradient: Gradient { + GradientStop { position: 0.0; color: topColor } + GradientStop { position: 1.0; color: bottomColor } + } + + Item { + id: mainAvatar; + anchors.left: parent.left; + anchors.top: parent.top; + width: avatarFrame.width; + height: avatarFrame.height; + anchors.leftMargin:4; + + Rectangle { + id: avatarFrame; + border.width: 2; + radius: 4; + height: wrapper.height-6 + width: height; + x: 3; y: 3; + } + + Image { + id: avatar + anchors.fill: avatarFrame; + anchors.leftMargin: 3; + anchors.rightMargin: 3; + anchors.topMargin: 3; + anchors.bottomMargin: 3; + + source: avatarSource + fillMode: Image.PreserveAspectFit + } + } + + Item { + id: mainLabel; + height: nameTxt.height + 16; + property real contactId: 0; + anchors.left: mainAvatar.right; + anchors.right: parent.right; + anchors.leftMargin:8; + anchors.rightMargin: 4; + anchors.topMargin: 4; + anchors.bottomMargin: 4; + + Text { + x:8; y:8; + anchors.left: parent.left; + anchors.right: parent.right; + id: nameTxt + text: name + color: "white"; + } + } + + Item { + id: details + property color textColor: "#ffffdd"; + anchors.top: mainLabel.bottom; + anchors.bottom: parent.bottom; + anchors.left: mainAvatar.right; + anchors.right: parent.right; + anchors.leftMargin:8; + anchors.rightMargin: 4; + anchors.bottomMargin: 4; + opacity: wrapper.detailsOpacity + + Column { + Text { + id: emailId + text: email + color: details.textColor; + } + Row { + spacing: 5 + Text { + id: accountPathId + text: accountPath + color: details.textColor; + } + Text { + id: presenceId + text: presence + color: details.textColor; + } + } + } + } + + states: State { + name: "Details" + PropertyChanges { target: wrapper; detailsOpacity: 1; } + PropertyChanges { target: wrapper; topColor: "#666666"; } + PropertyChanges { target: wrapper; bottomColor: "#222222"; } + PropertyChanges { target: wrapper; height: mainLabel.height + emailId.height + accountPathId.height + presenceId.height; } + } + + transitions: Transition { + from: "" + to: "Details" + reversible: true + ParallelAnimation { + ColorAnimation { duration: 150; properties: "topColor, bottomColor";} + NumberAnimation { duration: 100; properties: "detailsOpacity,height" } + } + } + MouseArea { + 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 + orientation: "Vertical" + position: mainList.visibleArea.yPosition + pageSize: mainList.visibleArea.heightRatio + width: 20 + height: mainList.height + anchors.right: mainList.right + fgColor: "white" + // 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/main.cpp Mon May 03 12:24:20 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 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 +#include +#include +#include +#include +#include +#include +#include "qmlcontactsa.h" +#include "qmlcontact.h" +QT_USE_NAMESPACE +QTM_USE_NAMESPACE + +int main(int argc, char ** argv) +{ + QApplication app(argc, argv); + + + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine, ":example.qml"); + + qmlRegisterType("QmlContact", 1, 0, "QmlContact"); + qmlRegisterType("QMLContactManagerAsync", 1, 0, "QMLContactManagerAsync"); + + QWidget *b = new QWidget(); + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setMargin(0); + + QDeclarativeView *view = new QDeclarativeView(b); + view->setFocusPolicy(Qt::StrongFocus); + view->setResizeMode(QDeclarativeView::SizeViewToRootObject); + view->setSource(QUrl("qrc:/example.qml")); + vbox->addWidget(view); + b->setLayout(vbox); +// b->resize(800,480); + b->show(); + + return app.exec(); +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/qmlcontact.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/qmlcontact.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,149 @@ +/**************************************************************************** +** +** 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 "qmlcontact.h" +#include +#include +#include + +QT_USE_NAMESPACE +QTM_USE_NAMESPACE + +QmlContact::QmlContact(const QContact& contact, QObject *parent) + : QObject(parent), m_contact(contact) +{ +} + +QmlContact::QmlContact() +{ + +} + +QmlContact::~QmlContact() +{ + +} + +QContact &QmlContact::contact() +{ + return m_contact; +} + +void QmlContact::setContact(QContact& contact) +{ + m_contact = contact; + emit contactChanged(this); +} + +QString QmlContact::name() +{ + return m_contact.displayLabel(); +} + +void QmlContact::setName(QString name) +{ + Q_UNUSED(name); + qWarning() << "Not implemented yet"; + emit nameChanged(this); +} + +QString QmlContact::email() +{ + QList allEmails = m_contact.details(QContactEmailAddress::DefinitionName); + + QStringList emails; + foreach (const QContactDetail& email, allEmails) { + emails << email.value(QContactEmailAddress::FieldEmailAddress); + } + return emails.join(QString::fromLatin1(",")); +} + +void QmlContact::setEmail(QString email) +{ + Q_UNUSED(email); + qWarning() << "Not implemented yet"; + emit emailChanged(this); +} + + +QStringList QmlContact::availableActions() +{ + QList actions = m_contact.availableActions(); + QStringList names; + + foreach (const QContactActionDescriptor& action, actions) { + names << action.actionName(); + } + return names; +} + +QStringList QmlContact::details() +{ + QStringList dets; + QList ld = m_contact.details(); + QContactDetail d; + foreach(d, ld){ + dets += d.definitionName(); + } + return dets; +} + +QStringList QmlContact::contexts() +{ + QStringList dets; + QList ld = m_contact.details(); + QContactDetail d; + foreach(d, ld){ + dets += d.contexts(); + } + return dets; +} + +QVariantMap QmlContact::values(QString definitionId) +{ + QStringList strlist; + QContactDetail detail = m_contact.detail(definitionId); + + QVariantMap map = detail.variantValues(); + return map; +} + +#include "moc_qmlcontact.cpp" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/qmlcontact.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/qmlcontact.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** 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 QMLCONTACT_H +#define QMLCONTACT_H + +#include +#include +#include +#include + +QTM_USE_NAMESPACE + +class QmlContact : public QObject { +Q_OBJECT +Q_PROPERTY(QContact contact READ contact WRITE setContact NOTIFY contactChanged) +Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) +Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged) +Q_PROPERTY(QString test READ test) +Q_PROPERTY(QStringList availableActions READ availableActions) +Q_PROPERTY(QStringList details READ details) +Q_PROPERTY(QStringList contexts READ contexts) +public: + explicit QmlContact(const QContact& contact, QObject *parent = 0); + QmlContact(); + ~QmlContact(); + + QContact& contact(); + void setContact(QContact& contact); + + QString name(); + void setName(QString name); + + QString email(); + void setEmail(QString email); + + QStringList availableActions(); + QStringList details(); + + QStringList contexts(); + + Q_INVOKABLE QVariantMap values(QString definitionId); + + QString test() { return "test string"; } + +signals: + void contactChanged(QmlContact* qmlcontact); + void nameChanged(QmlContact* qmlcontact); + void emailChanged(QmlContact* qmlcontact); + +private: + QContact m_contact; +}; + +QML_DECLARE_TYPE(QmlContact) + +#endif // QMLCONTACT_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/qmlcontacts.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/qmlcontacts.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,183 @@ +/**************************************************************************** +** +** 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 "qmlcontactsa.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +QT_USE_NAMESPACE +QTM_USE_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::fillContactsIntoMemoryEngine(QContactManager* manager) +{ + QVersitReader reader; + QFile file(":/contents/example.vcf"); + bool ok = file.open(QIODevice::ReadOnly); + if (ok) { + reader.setDevice(&file); + if (reader.startReading() && reader.waitForFinished()) { + QVersitContactImporter importer; + importer.importDocuments(reader.results()); + QList contacts = importer.contacts(); + manager->saveContacts(&contacts, 0); + } + } +} + +void QMLContactManagerAsync::setManager(QString manager) +{ + delete qc; + qc = new QContactManager(manager); + 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))); + + if (manager == "memory" && qc->contactIds().isEmpty()) { + fillContactsIntoMemoryEngine(qc); + } + + qWarning() << "Changed backend to: " << manager; +} + + +QString QMLContactManagerAsync::contactListToQString(const QList& contactIds) const +{ + QString list; + + for (int i = 0; i < contactIds.count(); i++) { + list += QString::number(contactIds.at(i)) + ' '; + } + + return list; +} + +QStringList QMLContactManagerAsync::contactListToQString(const QList& contact) const +{ + QStringList list; + + for (int i = 0; i < contact.count(); i++) { + list += qc->synthesizedDisplayLabel(contact.at(i)); + } + + return list; +} + +int QMLContactManagerAsync::numContacts() +{ + return qc->contactIds().count(); +} + +void QMLContactManagerAsync::contacts() +{ + m_contactIds.clear(); + QContactFetchRequest* req = new QContactFetchRequest; + QContactLocalIdFilter idFil; + idFil.setIds(qc->contactIds()); + req->setFilter(idFil); + req->setManager(qc); + connect(req, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(contactProgress(QContactAbstractRequest::State))); + req->start(); +} + +void QMLContactManagerAsync::contactProgress(QContactAbstractRequest::State newState) +{ + QContactFetchRequest *request = qobject_cast(sender()); + + // first, check to make sure that the request is still valid. + if (qc != request->manager() || + newState == QContactAbstractRequest::CanceledState) { + request->deleteLater(); + return; // ignore these results. + } + + if(request->contacts().count() > 0) { + foreach(const QContact& c, request->contacts()) { + QmlContact qmlc(c); + emit contactsLoaded(&qmlc); + } + } + + // check to see if the request status is "finished" - clean up. + if (newState == QContactAbstractRequest::FinishedState) { + request->deleteLater(); + emit contactsLoadedDone(); + } +} + +QString QMLContactManagerAsync::idToName(QString name) +{ + QContact c = qc->contact(name.toInt()); + return qc->synthesizedDisplayLabel(c); +} + +// ![0] + +#include "moc_qmlcontactsa.cpp" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/qmlcontacts.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/qmlcontacts.pro Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,39 @@ +TEMPLATE = app +TARGET = qmlcontacts + +CONFIG += mobility +MOBILITY = contacts versit + +DEPENDPATH += . +INCLUDEPATH += . \ + ../../include \ + ../../src/contacts \ + ../../src/contacts/requests \ + ../../src/contacts/details \ + ../../src/contacts/filters \ + ../../src/versit + +QT += declarative +QT += script + + +# Input +SOURCES += main.cpp \ + qmlcontacts.cpp \ + qmlcontact.cpp +HEADERS += qmlcontactsa.h \ + qmlcontact.h +RESOURCES += qmlcontacts.qrc +OTHER_FILES += example.qml \ + contents/example.vcf \ + contents/MediaButton.qml \ + ScrollBar.qml + +symbian: { + TARGET.CAPABILITY = ReadUserData \ + WriteUserData \ + ReadDeviceData \ + WriteDeviceData \ + SwEvent +} +include(../examples.pri) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/qmlcontacts.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/qmlcontacts.qrc Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,9 @@ + + + example.qml + contents/MediaButton.qml + ScrollBar.qml + contents/example.vcf + contents/default.svg + + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/qmlcontacts/qmlcontactsa.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/examples/qmlcontacts/qmlcontactsa.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** 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 QMLCONTACTS_H +#define QMLCONTACTS_H + +#include +#include +#include +#include + +#include "qmlcontact.h" + +QTM_BEGIN_NAMESPACE +class QContactFetchRequest; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +// ![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(QContactAbstractRequest::State newState); + +private: + QContactManager *qc; + //QStringList m_contacts; + QList m_contactIds; + void fillContactsIntoMemoryEngine(QContactManager* manager); + QString contactListToQString(const QList& contactIds) const; + QStringList contactListToQString(const QList& contact) const; +}; +QML_DECLARE_TYPE(QMLContactManagerAsync) +// ![0] + +#endif // QMLCONTACTS_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/s60installs/s60installs.pro --- a/qtcontactsmobility/examples/s60installs/s60installs.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/s60installs/s60installs.pro Mon May 03 12:24:20 2010 +0300 @@ -3,7 +3,7 @@ TEMPLATE = app TARGET = S60Examples -include($$QT_MOBILITY_BUILD_TREE/config.pri) +include(../../staticconfig.pri) TEMPLATE = subdirs diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/samplephonebook/contacteditor.cpp --- a/qtcontactsmobility/examples/samplephonebook/contacteditor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/samplephonebook/contacteditor.cpp Mon May 03 12:24:20 2010 +0300 @@ -49,60 +49,72 @@ m_manager = 0; m_contactId = QContactLocalId(0); -#ifdef Q_OS_SYMBIAN - // In symbian "save" and "cancel" buttons are softkeys. - m_saveBtn = new QAction("Save", this); - m_saveBtn->setSoftKeyRole(QAction::PositiveSoftKey); - addAction(m_saveBtn); - connect(m_saveBtn, SIGNAL(triggered(bool)), this, SLOT(saveClicked())); - m_cancelBtn = new QAction("Cancel", this); - m_cancelBtn->setSoftKeyRole(QAction::NegativeSoftKey); - addAction(m_cancelBtn); - connect(m_cancelBtn, SIGNAL(triggered(bool)), this, SLOT(cancelClicked())); -#else - m_saveBtn = new QPushButton("Save", this); - connect(m_saveBtn, SIGNAL(clicked()), this, SLOT(saveClicked())); - m_cancelBtn = new QPushButton("Cancel", this); - connect(m_cancelBtn, SIGNAL(clicked()), this, SLOT(cancelClicked())); -#endif - m_nameEdit = new QLineEdit(this); m_phoneEdit = new QLineEdit(this); m_emailEdit = new QLineEdit(this); m_addrEdit = new QLineEdit(this); - m_avatarBtn = new QPushButton("Add image", this); + m_avatarBtn = new QPushButton(tr("Add image"), this); m_avatarBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); connect(m_avatarBtn, SIGNAL(clicked()), this, SLOT(avatarClicked())); + QFormLayout *detailsLayout = new QFormLayout; - detailsLayout->addRow(new QLabel("Name", this)); - detailsLayout->addRow(m_nameEdit); - detailsLayout->addRow(new QLabel("Phone", this)); - detailsLayout->addRow(m_phoneEdit); - detailsLayout->addRow(new QLabel("Email", this)); - detailsLayout->addRow(m_emailEdit); - detailsLayout->addRow(new QLabel("Address", this)); - detailsLayout->addRow(m_addrEdit); - detailsLayout->addRow(new QLabel("Avatar", this)); - detailsLayout->addRow(m_avatarBtn); + QLabel *nameLabel = new QLabel(tr("Name"), this); + QLabel *phoneLabel = new QLabel(tr("Phone"), this); + QLabel *emailLabel = new QLabel(tr("Email"), this); + QLabel *addressLabel = new QLabel(tr("Address"), this); + QLabel *avatarLabel = new QLabel(tr("Avatar"), this); + if (QApplication::desktop()->availableGeometry().width() < 360) { + // Narrow screen: put label on separate line to textbox + detailsLayout->addRow(nameLabel); + detailsLayout->addRow(m_nameEdit); + detailsLayout->addRow(phoneLabel); + detailsLayout->addRow(m_phoneEdit); + detailsLayout->addRow(emailLabel); + detailsLayout->addRow(m_emailEdit); + detailsLayout->addRow(addressLabel); + detailsLayout->addRow(m_addrEdit); + detailsLayout->addRow(avatarLabel); + detailsLayout->addRow(m_avatarBtn); + } else { + // Wide screen: put label on same line as textbox + detailsLayout->addRow(nameLabel, m_nameEdit); + detailsLayout->addRow(phoneLabel, m_phoneEdit); + detailsLayout->addRow(emailLabel, m_emailEdit); + detailsLayout->addRow(addressLabel, m_addrEdit); + detailsLayout->addRow(avatarLabel, m_avatarBtn); + } detailsLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); detailsLayout->setSizeConstraint(QLayout::SetMinAndMaxSize); - + QScrollArea *detailsScrollArea = new QScrollArea(this); detailsScrollArea->setWidgetResizable(true); QWidget *detailsContainer = new QWidget(detailsScrollArea); detailsContainer->setLayout(detailsLayout); detailsScrollArea->setWidget(detailsContainer); -#ifndef Q_OS_SYMBIAN + QVBoxLayout *editLayout = new QVBoxLayout; + editLayout->addWidget(detailsScrollArea); + +#ifdef Q_OS_SYMBIAN + // In symbian "save" and "cancel" buttons are softkeys. + m_saveBtn = new QAction(tr("Save"), this); + m_saveBtn->setSoftKeyRole(QAction::PositiveSoftKey); + addAction(m_saveBtn); + connect(m_saveBtn, SIGNAL(triggered(bool)), this, SLOT(saveClicked())); + m_cancelBtn = new QAction(tr("Cancel"), this); + m_cancelBtn->setSoftKeyRole(QAction::NegativeSoftKey); + addAction(m_cancelBtn); + connect(m_cancelBtn, SIGNAL(triggered(bool)), this, SLOT(cancelClicked())); +#else + m_saveBtn = new QPushButton(tr("&Save"), this); + m_saveBtn->setDefault(true); + connect(m_saveBtn, SIGNAL(clicked()), this, SLOT(saveClicked())); + m_cancelBtn = new QPushButton(tr("&Cancel"), this); + connect(m_cancelBtn, SIGNAL(clicked()), this, SLOT(cancelClicked())); QHBoxLayout *btnLayout = new QHBoxLayout; btnLayout->addWidget(m_saveBtn); btnLayout->addWidget(m_cancelBtn); -#endif - - QVBoxLayout *editLayout = new QVBoxLayout; - editLayout->addWidget(detailsScrollArea); -#ifndef Q_OS_SYMBIAN editLayout->addLayout(btnLayout); #endif @@ -119,18 +131,16 @@ m_contactId = currentId; m_newAvatarPath = QString(); - if (manager == 0 || currentId == 0) { - // clear the UI and return. - m_nameEdit->setText(""); - m_phoneEdit->setText(""); - m_emailEdit->setText(""); - m_addrEdit->setText(""); - m_avatarBtn->setText("Add image"); - m_avatarBtn->setIcon(QIcon()); + // Clear UI + m_nameEdit->clear(); + m_phoneEdit->clear(); + m_emailEdit->clear(); + m_addrEdit->clear(); + m_avatarBtn->setText("Add image"); + m_avatarBtn->setIcon(QIcon()); - if (manager == 0) - m_saveBtn->setEnabled(false); - + if (manager == 0) { + m_saveBtn->setEnabled(false); return; } @@ -138,30 +148,65 @@ m_saveBtn->setEnabled(true); // otherwise, build from the contact details. - QContact curr = manager->contact(m_contactId); - QContactName nm = curr.detail(QContactName::DefinitionName); + QContact curr; + if (m_contactId != QContactLocalId(0)) + curr = manager->contact(m_contactId); + + // Disable fields & buttons according to what the backend supports + QMap defs = m_manager->detailDefinitions(QContactType::TypeContact); + + // name + //QContactName nm = curr.detail(QContactName::DefinitionName); + if (m_contactId != QContactLocalId(0)) + m_nameEdit->setText(manager->synthesizedDisplayLabel(curr)); + + // phonenumber QContactPhoneNumber phn = curr.detail(QContactPhoneNumber::DefinitionName); - QContactEmailAddress em = curr.detail(QContactEmailAddress::DefinitionName); - QContactAddress adr = curr.detail(QContactAddress::DefinitionName); - QContactAvatar av = curr.detail(QContactAvatar::DefinitionName); - - 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. - - m_avatarBtn->setText(QString()); - m_avatarBtn->setIcon(QIcon()); - - if (av.pixmap().isNull()) { - if (av.avatar().isEmpty()) { - m_avatarBtn->setText("Add image"); + + // email + if (defs.contains(QContactEmailAddress::DefinitionName)) { + QContactEmailAddress em = curr.detail(QContactEmailAddress::DefinitionName); + m_emailEdit->setText(em.value(QContactEmailAddress::FieldEmailAddress)); + m_emailEdit->setReadOnly(false); + } else { + m_emailEdit->setText(""); + m_emailEdit->setReadOnly(true); + } + + // address + if (defs.contains(QContactAddress::DefinitionName)) { + QContactAddress adr = curr.detail(QContactAddress::DefinitionName); + m_addrEdit->setText(adr.value(QContactAddress::FieldStreet)); // ugly hack. + m_addrEdit->setReadOnly(false); + } else { + m_addrEdit->setText(""); + m_addrEdit->setReadOnly(true); + } + + // avatar button + if (defs.contains(QContactAvatar::DefinitionName)) { + QContactAvatar av = curr.detail(QContactAvatar::DefinitionName); + QContactThumbnail thumb = curr.detail(QContactThumbnail::DefinitionName); + m_avatarBtn->setText(QString()); + m_avatarBtn->setIcon(QIcon()); + if (thumb.thumbnail().isNull()) { + if (av.imageUrl().isEmpty()) { + m_avatarBtn->setText("Add image"); + } else { + m_avatarBtn->setIcon(QIcon(QPixmap(av.imageUrl().toLocalFile()))); + m_thumbnail = QImage(av.imageUrl().toLocalFile()); + } } else { - m_avatarBtn->setIcon(QIcon(QPixmap(av.avatar()))); + m_newAvatarPath = av.imageUrl().toLocalFile(); + m_thumbnail = thumb.thumbnail(); + m_avatarBtn->setIcon(QIcon(QPixmap::fromImage(thumb.thumbnail()))); } + m_avatarBtn->setDisabled(false); } else { - m_newAvatarPath = av.avatar(); - m_avatarBtn->setIcon(QIcon(av.pixmap())); + m_avatarBtn->setIcon(QIcon()); + m_avatarBtn->setText(""); + m_avatarBtn->setDisabled(true); } } @@ -175,8 +220,8 @@ QContactDetailDefinition nameDef = defs.value(QContactName::DefinitionName); if (nameDef.fields().keys().contains(QContactName::FieldCustomLabel)) { return QString(QLatin1String(QContactName::FieldCustomLabel)); - } else if (nameDef.fields().keys().contains(QContactName::FieldFirst)) { - return QString(QLatin1String(QContactName::FieldFirst)); + } else if (nameDef.fields().keys().contains(QContactName::FieldFirstName)) { + return QString(QLatin1String(QContactName::FieldFirstName)); } else { return QString(); } @@ -187,9 +232,10 @@ // put up a file dialog, and update the new avatar path. QString fileName = QFileDialog::getOpenFileName(this, tr("Select Avatar Image"), ".", tr("Image Files (*.png *.jpg *.bmp)")); - + if (!fileName.isEmpty()) { m_newAvatarPath = fileName; + m_thumbnail = QImage(m_newAvatarPath); m_avatarBtn->setText(QString()); m_avatarBtn->setIcon(QIcon(m_newAvatarPath)); } @@ -203,38 +249,52 @@ QContact curr; if (m_contactId != QContactLocalId(0)) curr = m_manager->contact(m_contactId); - QContactName nm = curr.detail(QContactName::DefinitionName); - QContactPhoneNumber phn = curr.detail(QContactPhoneNumber::DefinitionName); - QContactEmailAddress em = curr.detail(QContactEmailAddress::DefinitionName); - QContactAddress adr = curr.detail(QContactAddress::DefinitionName); - QContactAvatar av = curr.detail(QContactAvatar::DefinitionName); + + if (m_nameEdit->text().isEmpty()) { + QMessageBox::information(this, "Failed!", "You must give a name for the contact!"); + return; + } - QString saveNameField = nameField(); - if (!saveNameField.isEmpty()) { + if (m_nameEdit->text() != m_manager->synthesizedDisplayLabel(curr)) { // 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->synthesizedDisplayLabel(curr)) { - nm.setValue(nameField(), m_nameEdit->text()); + QString saveNameField = nameField(); + if (!saveNameField.isEmpty()) { + QContactName nm = curr.detail(QContactName::DefinitionName); + nm.setValue(saveNameField, m_nameEdit->text()); + curr.saveDetail(&nm); } } + + QContactPhoneNumber phn = curr.detail(QContactPhoneNumber::DefinitionName); phn.setNumber(m_phoneEdit->text()); - em.setEmailAddress(m_emailEdit->text()); - adr.setStreet(m_addrEdit->text()); - av.setAvatar(m_newAvatarPath); + curr.saveDetail(&phn); + + if (!m_emailEdit->isReadOnly()) { + QContactEmailAddress em = curr.detail(QContactEmailAddress::DefinitionName); + em.setEmailAddress(m_emailEdit->text()); + curr.saveDetail(&em); + } - QPixmap pix(m_newAvatarPath); - av.setPixmap(pix); + if (!m_addrEdit->isReadOnly()) { + QContactAddress adr = curr.detail(QContactAddress::DefinitionName); + adr.setStreet(m_addrEdit->text()); + curr.saveDetail(&adr); + } - curr.saveDetail(&nm); - curr.saveDetail(&phn); - curr.saveDetail(&em); - curr.saveDetail(&adr); - curr.saveDetail(&av); + if (m_avatarBtn->isEnabled()) { + QContactAvatar av = curr.detail(QContactAvatar::DefinitionName); + av.setImageUrl(QUrl(m_newAvatarPath)); + curr.saveDetail(&av); + + QContactThumbnail thumb = curr.detail(QContactThumbnail::DefinitionName); + QImage img(m_thumbnail); + thumb.setThumbnail(img); + curr.saveDetail(&thumb); + } bool success = m_manager->saveContact(&curr); - if (success) - QMessageBox::information(this, "Success!", "Contact saved successfully!"); - else - QMessageBox::information(this, "Failed!", "Failed to save contact!"); + if (!success) + QMessageBox::information(this, "Failed!", QString("Failed to save contact!\n(error code %1)").arg(m_manager->error())); } emit showListPage(); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/samplephonebook/contacteditor.h --- a/qtcontactsmobility/examples/samplephonebook/contacteditor.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/samplephonebook/contacteditor.h Mon May 03 12:24:20 2010 +0300 @@ -96,6 +96,7 @@ QContactManager *m_manager; QContactLocalId m_contactId; QString m_newAvatarPath; + QImage m_thumbnail; }; #endif // CONTACTEDITOR_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/samplephonebook/contactlistpage.cpp --- a/qtcontactsmobility/examples/samplephonebook/contactlistpage.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/samplephonebook/contactlistpage.cpp Mon May 03 12:24:20 2010 +0300 @@ -49,59 +49,119 @@ #include -ContactListPage::ContactListPage(QWidget *parent) - : QWidget(parent) +ContactListPage::ContactListPage(QMainWindow *mainWindow, QWidget *parent) + : QWidget(parent), m_mainWindow(mainWindow) { m_manager = 0; m_currentFilter = QContactFilter(); m_backendsCombo = new QComboBox(this); QStringList availableManagers = QContactManager::availableManagers(); + availableManagers.removeAll("invalid"); + foreach(QString managerName, availableManagers) { + + QMap params; + QString managerUri = QContactManager::buildUri(managerName, params); + + // Add some parameters to SIM backend so that we can use + // all the stores. + if (managerName == "symbiansim") { + availableManagers.removeAll("symbiansim"); + + availableManagers.append("symbiansim:adn"); + params.insert("store", "ADN"); + managerUri = QContactManager::buildUri(managerName, params); + m_availableManagers.insert(availableManagers.last(), managerUri); + + availableManagers.append("symbiansim:fdn"); + params.clear(); + params.insert("store", "FDN"); + managerUri = QContactManager::buildUri(managerName, params); + m_availableManagers.insert(availableManagers.last(), managerUri); + + availableManagers.append("symbiansim:sdn"); + params.clear(); + params.insert("store", "SDN"); + managerUri = QContactManager::buildUri(managerName, params); + m_availableManagers.insert(availableManagers.last(), managerUri); + } + else { + m_availableManagers.insert(managerName, managerUri); + } + } m_backendsCombo->addItems(availableManagers); connect(m_backendsCombo, SIGNAL(currentIndexChanged(QString)), this, SLOT(backendSelected())); - m_filterActiveLabel = new QLabel("Inactive"); + m_filterActiveLabel = new QLabel(tr("Filter active")); m_filterActiveLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); + QVBoxLayout *bookLayout = new QVBoxLayout; + QFormLayout *backendLayout = new QFormLayout; + backendLayout->addRow(tr("Store:"), m_backendsCombo); + backendLayout->addRow(m_filterActiveLabel); + bookLayout->addLayout(backendLayout); + m_contactsList = new QListWidget(this); + bookLayout->addWidget(m_contactsList); - QPushButton* m_addContactBtn = new QPushButton("Add", this); - connect(m_addContactBtn, SIGNAL(clicked()), this, SLOT(addContactClicked())); - QPushButton* m_editBtn = new QPushButton("Edit", this); - connect(m_editBtn, SIGNAL(clicked()), this, SLOT(editClicked())); - QPushButton* m_deleteBtn = new QPushButton("Delete", this); - connect(m_deleteBtn, SIGNAL(clicked()), this, SLOT(deleteClicked())); - 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())); + // Action buttons at the bottom + QHBoxLayout *btnLayout1 = new QHBoxLayout; + QPushButton* addBtn = new QPushButton(tr("&Add"), this); + connect(addBtn, SIGNAL(clicked()), this, SLOT(addClicked())); + btnLayout1->addWidget(addBtn); - QFormLayout *backendLayout = new QFormLayout; - backendLayout->addRow("Store:", m_backendsCombo); - backendLayout->addRow("Filter:", m_filterActiveLabel); - - QHBoxLayout *btnLayout1 = new QHBoxLayout; - btnLayout1->addWidget(m_addContactBtn); - btnLayout1->addWidget(m_editBtn); - btnLayout1->addWidget(m_deleteBtn); - btnLayout1->addWidget(m_filterBtn); + QPushButton* editBtn = new QPushButton(tr("&Edit"), this); + connect(editBtn, SIGNAL(clicked()), this, SLOT(editClicked())); + btnLayout1->addWidget(editBtn); - QHBoxLayout *btnLayout2 = new QHBoxLayout; - btnLayout2->addWidget(m_importBtn); - btnLayout2->addWidget(m_exportBtn); + QPushButton* deleteBtn = new QPushButton(tr("&Delete"), this); + connect(deleteBtn, SIGNAL(clicked()), this, SLOT(deleteClicked())); + btnLayout1->addWidget(deleteBtn); - QVBoxLayout *bookLayout = new QVBoxLayout; - bookLayout->addLayout(backendLayout); - bookLayout->addWidget(m_contactsList); bookLayout->addLayout(btnLayout1); -#ifdef BUILD_VERSIT - bookLayout->addLayout(btnLayout2); -#endif setLayout(bookLayout); + // Add items to the menu + if (m_mainWindow) { +#if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) + QMenuBar *optionsMenu = m_mainWindow->menuBar(); +#else + QMenu *optionsMenu = new QMenu(tr("&Contacts"), this); + m_mainWindow->menuBar()->addMenu(optionsMenu); +#endif + QAction* addAction = new QAction(tr("&Add Contact..."), this); + connect(addAction, SIGNAL(triggered()), this, SLOT(addClicked())); + optionsMenu->addAction(addAction); + QAction* editAction = new QAction(tr("&Edit Contact..."), this); + connect(editAction, SIGNAL(triggered()), this, SLOT(editClicked())); + optionsMenu->addAction(editAction); + QAction* deleteAction = new QAction(tr("&Delete Contact"), this); + connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteClicked())); + optionsMenu->addAction(deleteAction); + optionsMenu->addSeparator(); + QAction* filterAction = new QAction(tr("Apply &Filter..."), this); + connect(filterAction, SIGNAL(triggered()), this, SLOT(filterClicked())); + optionsMenu->addAction(filterAction); + QAction* clearFilterAction = new QAction(tr("&Clear Filter"), this); + connect(clearFilterAction, SIGNAL(triggered()), this, SIGNAL(clearFilter())); + optionsMenu->addAction(clearFilterAction); + optionsMenu->addSeparator(); + +#ifdef BUILD_VERSIT + QAction* importAction = new QAction(tr("&Import contacts..."), this); + connect(importAction, SIGNAL(triggered()), this, SLOT(importClicked())); + optionsMenu->addAction(importAction); + QAction* exportAction = new QAction(tr("Ex&port contacts..."), this); + connect(exportAction, SIGNAL(triggered()), this, SLOT(exportClicked())); + optionsMenu->addAction(exportAction); + optionsMenu->addSeparator(); +#endif + QAction* exitAction = new QAction(tr("E&xit"), this); + connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit())); + optionsMenu->addAction(exitAction); + } + // force update to backend. QTimer::singleShot(0, this, SLOT(backendSelected())); } @@ -117,18 +177,24 @@ void ContactListPage::backendSelected() { - QString backend = m_backendsCombo->currentText(); + QString managerUri = m_availableManagers.value(m_backendsCombo->currentText()); // first, check to see if they reselected the same backend. - if (m_manager && m_manager->managerName() == backend) + if (m_manager && m_manager->managerUri() == managerUri) return; // the change is real. update. - if (m_initialisedManagers.contains(backend)) { - m_manager = m_initialisedManagers.value(backend); + if (m_initialisedManagers.contains(managerUri)) { + m_manager = m_initialisedManagers.value(managerUri); } else { - m_manager = new QContactManager(backend); - m_initialisedManagers.insert(backend, m_manager); + m_manager = QContactManager::fromUri(managerUri); + if (m_manager->error()) { + QMessageBox::information(this, tr("Failed!"), QString("Failed to open store!\n(error code %1)").arg(m_manager->error())); + delete m_manager; + m_manager = 0; + return; + } + m_initialisedManagers.insert(managerUri, m_manager); } // signal that the manager has changed. @@ -140,14 +206,11 @@ void ContactListPage::rebuildList(const QContactFilter& filter) { - // first, check to see whether the filter does anything - if (filter == QContactFilter()) - m_filterActiveLabel->setText("Inactive"); - else - m_filterActiveLabel->setText("Active"); + m_currentFilter = QContactManagerEngine::canonicalizedFilter(filter); + + m_filterActiveLabel->setVisible(m_currentFilter != QContactFilter()); QContact currContact; - m_currentFilter = filter; m_contactsList->clear(); m_idToListIndex.clear(); QList contactIds = m_manager->contactIds(m_currentFilter); @@ -161,9 +224,10 @@ } } -void ContactListPage::addContactClicked() +void ContactListPage::addClicked() { - emit showEditorPage(QContactLocalId(0)); + if (m_manager) + emit showEditorPage(QContactLocalId(0)); } void ContactListPage::editClicked() @@ -175,7 +239,8 @@ void ContactListPage::filterClicked() { - emit showFilterPage(m_currentFilter); + if (m_manager) + emit showFilterPage(m_currentFilter); } void ContactListPage::deleteClicked() @@ -189,12 +254,11 @@ qWarning() << "Nothing to delete."; return; } - + QContactLocalId contactId = QContactLocalId(m_contactsList->currentItem()->data(Qt::UserRole).toUInt()); bool success = m_manager->removeContact(contactId); if (success) { delete m_contactsList->takeItem(m_contactsList->currentRow()); - QMessageBox::information(this, "Success!", "Contact deleted successfully!"); } else QMessageBox::information(this, "Failed!", "Failed to delete contact!"); @@ -216,10 +280,12 @@ 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); + if (importer.importDocuments(reader.results())) { + QList contacts = importer.contacts(); + QMap errorMap; + m_manager->saveContacts(&contacts, &errorMap); + rebuildList(m_currentFilter); + } } } #endif @@ -232,7 +298,7 @@ qWarning() << "No manager selected; cannot import"; return; } - QList contacts = m_manager->contacts(QList(), QStringList()); + QList contacts = m_manager->contacts(QList(), QContactFetchHint()); QString fileName = QFileDialog::getSaveFileName(this, tr("Save vCard"), "./contacts.vcf", tr("vCards (*.vcf)")); @@ -240,11 +306,13 @@ file.open(QIODevice::WriteOnly); if (file.isWritable()) { QVersitContactExporter exporter; - QList documents = exporter.exportContacts(contacts); - QVersitWriter writer; - writer.setDevice(&file); - writer.startWriting(documents); - writer.waitForFinished(); + if(exporter.exportContacts(contacts, QVersitDocument::VCard30Type)) { + QList documents = exporter.documents(); + QVersitWriter writer; + writer.setDevice(&file); + writer.startWriting(documents); + writer.waitForFinished(); + } } #endif } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/samplephonebook/contactlistpage.h --- a/qtcontactsmobility/examples/samplephonebook/contactlistpage.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/samplephonebook/contactlistpage.h Mon May 03 12:24:20 2010 +0300 @@ -54,6 +54,7 @@ class QComboBox; class QLabel; class QLineEdit; +class QMainWindow; QT_END_NAMESPACE QTM_USE_NAMESPACE @@ -63,7 +64,7 @@ Q_OBJECT public: - ContactListPage(QWidget *parent = 0); + ContactListPage(QMainWindow *mainWindow = 0, QWidget *parent = 0); ~ContactListPage(); void rebuildList(const QContactFilter& filter); @@ -72,10 +73,11 @@ void showEditorPage(QContactLocalId contactId); void showFilterPage(const QContactFilter& filter); void managerChanged(QContactManager *manager); + void clearFilter(); private slots: void backendSelected(); - void addContactClicked(); + void addClicked(); void editClicked(); void filterClicked(); void deleteClicked(); @@ -89,6 +91,8 @@ QListWidget *m_contactsList; + // The main window that the page can add actions to + QMainWindow *m_mainWindow; // data QContactManager *m_manager; @@ -96,6 +100,7 @@ QMap m_initialisedManagers; QContactFilter m_currentFilter; + QMap m_availableManagers; }; #endif // CONTACTLISTPAGE_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/samplephonebook/filterpage.cpp --- a/qtcontactsmobility/examples/samplephonebook/filterpage.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/samplephonebook/filterpage.cpp Mon May 03 12:24:20 2010 +0300 @@ -46,83 +46,62 @@ FilterPage::FilterPage(QWidget* parent) : QWidget(parent) { - m_valueCriteriaEdit = new QLineEdit(this); - m_fieldCriteriaCombo = new QComboBox(this); - m_criteriaTypeCombo = new QComboBox(this); - m_joinMethodCombo = new QComboBox(this); - m_cumulativeExpressionLabel = new QLabel("Match All Contacts", this); - m_cumulativeExpressionLabel->setWordWrap(true); - m_cumulativeExpressionLabel->setFocusPolicy(Qt::StrongFocus); - -#ifdef Q_OS_SYMBIAN - // In symbian use softkeys instead of normal buttons - m_addBtn = new QAction("Add", this); - m_addBtn->setSoftKeyRole(QAction::PositiveSoftKey); - addAction(m_addBtn); - connect(m_addBtn, SIGNAL(triggered(bool)), this, SLOT(addClicked())); - m_filterBtn = new QAction("Filter", this); - m_filterBtn->setSoftKeyRole(QAction::NegativeSoftKey); - addAction(m_filterBtn); - connect(m_filterBtn, SIGNAL(triggered(bool)), this, SLOT(filterClicked())); -#else - m_addBtn = new QPushButton("Add", this); - connect(m_addBtn, SIGNAL(clicked()), this, SLOT(addClicked())); - m_filterBtn = new QPushButton("Filter", this); - connect(m_filterBtn, SIGNAL(clicked()), this, SLOT(filterClicked())); -#endif - m_clearBtn = new QPushButton("Clear", this); - connect(m_clearBtn, SIGNAL(clicked()), this, SLOT(clearClicked())); - - QStringList filterableFields; - filterableFields.append("Name"); - filterableFields.append("Phone Number"); - filterableFields.append("Email"); - m_fieldCriteriaCombo->addItems(filterableFields); + m_nameEdit = new QLineEdit(this); + m_phoneEdit = new QLineEdit(this); + m_emailEdit = new QLineEdit(this); + m_addressEdit = new QLineEdit(this); + QLabel *nameLabel = new QLabel(tr("Name"), this); + QLabel *phoneLabel = new QLabel(tr("Phone"), this); + QLabel *emailLabel = new QLabel(tr("Email"), this); + QLabel *addressLabel = new QLabel(tr("Address"), this); - 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); + QFormLayout *formLayout = new QFormLayout; + if (QApplication::desktop()->availableGeometry().width() < 360) { + // Narrow screen: put label on separate line to textbox + formLayout->addRow(nameLabel); + formLayout->addRow(m_nameEdit); + formLayout->addRow(phoneLabel); + formLayout->addRow(m_phoneEdit); + formLayout->addRow(emailLabel); + formLayout->addRow(m_emailEdit); + formLayout->addRow(addressLabel); + formLayout->addRow(m_addressEdit); + } else { + // Wide screen: put label on same line as textbox + formLayout->addRow(nameLabel, m_nameEdit); + formLayout->addRow(phoneLabel, m_phoneEdit); + formLayout->addRow(emailLabel, m_emailEdit); + formLayout->addRow(addressLabel, m_addressEdit); + } - QStringList joinTypes; - joinTypes.append("AND"); - joinTypes.append("OR"); - m_joinMethodCombo->addItems(joinTypes); - - QFormLayout *formLayout = new QFormLayout; - formLayout->addRow(new QLabel("Search String:", this)); - formLayout->addRow(m_valueCriteriaEdit); - formLayout->addRow(new QLabel("Search Field:", this)); - formLayout->addRow(m_fieldCriteriaCombo); - formLayout->addRow(new QLabel("Criteria Type:", this)); - formLayout->addRow(m_criteriaTypeCombo); - formLayout->addRow(new QLabel("Join Method:", this)); - formLayout->addRow(m_joinMethodCombo); - QFrame* separatorFrame = new QFrame(this); - separatorFrame->setFrameShape(QFrame::HLine); - separatorFrame->setFrameShadow(QFrame::Plain); - separatorFrame->setLineWidth(2); - formLayout->addRow(separatorFrame); - formLayout->addRow(new QLabel("Filter Expression:", this)); - formLayout->addRow(m_cumulativeExpressionLabel); -#ifdef Q_OS_SYMBIAN - formLayout->addRow(m_clearBtn); -#endif - QVBoxLayout *pageLayout = new QVBoxLayout; - + QScrollArea *formScrollArea = new QScrollArea(this); formScrollArea->setWidgetResizable(true); QWidget *formContainer = new QWidget(formScrollArea); formContainer->setLayout(formLayout); formScrollArea->setWidget(formContainer); pageLayout->addWidget(formScrollArea); - -#ifndef Q_OS_SYMBIAN + +#ifdef Q_OS_SYMBIAN + m_filterBtn = new QAction(tr("Filter"), this); + m_filterBtn->setSoftKeyRole(QAction::PositiveSoftKey); + addAction(m_filterBtn); + connect(m_filterBtn, SIGNAL(triggered(bool)), this, SLOT(filterClicked())); + m_cancelBtn = new QAction(tr("Cancel"), this); + m_cancelBtn->setSoftKeyRole(QAction::NegativeSoftKey); + addAction(m_cancelBtn); + connect(m_cancelBtn, SIGNAL(triggered(bool)), this, SLOT(cancelClicked())); +#else + m_filterBtn = new QPushButton(tr("&Filter"), this); + m_filterBtn->setDefault(true); + connect(m_filterBtn, SIGNAL(clicked()), this, SLOT(filterClicked())); + m_cancelBtn = new QPushButton(tr("&Cancel"), this); + connect(m_cancelBtn, SIGNAL(clicked()), this, SLOT(cancelClicked())); + QHBoxLayout *btnLayout = new QHBoxLayout; - btnLayout->addWidget(m_addBtn); - btnLayout->addWidget(m_clearBtn); btnLayout->addWidget(m_filterBtn); + btnLayout->addWidget(m_cancelBtn); pageLayout->addLayout(btnLayout); #endif @@ -133,94 +112,90 @@ { } -void FilterPage::addClicked() +void FilterPage::clearFilter() { - QContactDetailFilter fil; - QString defName; - QString fieldName; - QString exprName; - QString exprMatch; - QString exprJoin; - switch (m_fieldCriteriaCombo->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 = "Phone Number"; - } - break; - - default: - { - // email address - defName = QString(QLatin1String(QContactEmailAddress::DefinitionName)); - fieldName = QString(QLatin1String(QContactEmailAddress::FieldEmailAddress)); - - exprName = "Email Address"; - } - break; - - } - fil.setDetailDefinitionName(defName, fieldName); - fil.setValue(m_valueCriteriaEdit->text()); - - 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) { - QContactUnionFilter ufil; - ufil << m_cumulativeFilter << fil; - QContactIntersectionFilter ifil; - ifil << ufil; - m_cumulativeFilter = ifil; - exprJoin = "OR"; - } else { - // otherwise, just AND. - QContactIntersectionFilter ifil(m_cumulativeFilter); - ifil << fil; - m_cumulativeFilter = ifil; - exprJoin = "AND"; - } - - // set the expression so far - if (!m_cumulativeExpression.isEmpty()) - m_cumulativeExpression += " " + exprJoin + " "; - m_cumulativeExpression += exprName + " " + exprMatch + " \"" + m_valueCriteriaEdit->text() + "\""; - - // and clear the UI ready for the next filter expression. - m_valueCriteriaEdit->setText(""); - m_fieldCriteriaCombo->setCurrentIndex(0); - m_criteriaTypeCombo->setCurrentIndex(0); - m_joinMethodCombo->setCurrentIndex(0); - m_cumulativeExpressionLabel->setText(m_cumulativeExpression); -} - -void FilterPage::clearClicked() -{ - m_cumulativeExpression = QString(); - m_valueCriteriaEdit->setText(""); - m_fieldCriteriaCombo->setCurrentIndex(0); - m_criteriaTypeCombo->setCurrentIndex(0); - m_joinMethodCombo->setCurrentIndex(0); - m_cumulativeExpressionLabel->setText("Match All Contacts"); - m_cumulativeFilter = QContactFilter(); + m_name.clear(); + m_phone.clear(); + m_email.clear(); + m_address.clear(); + m_nameEdit->clear(); + m_phoneEdit->clear(); + m_emailEdit->clear(); + m_addressEdit->clear(); + m_currentFilter = QContactIntersectionFilter(); + emit showListPage(m_currentFilter); } void FilterPage::filterClicked() { - emit showListPage(m_cumulativeFilter); + m_name = m_nameEdit->text(); + m_phone = m_phoneEdit->text(); + m_email = m_emailEdit->text(); + m_address = m_addressEdit->text(); + // The intersection filter ensures that non-empty field value must be found in the contact. + m_currentFilter = QContactIntersectionFilter(); + if (!m_nameEdit->text().isEmpty()) { + // Search all fields of the name by building a union filter + QContactUnionFilter nameFilter; + QStringList nameFields; + nameFields << QContactName::FieldCustomLabel; + nameFields << QContactName::FieldFirstName; + nameFields << QContactName::FieldLastName; + nameFields << QContactName::FieldMiddleName; + nameFields << QContactName::FieldPrefix; + nameFields << QContactName::FieldSuffix; + foreach (const QString& fieldName, nameFields) { + QContactDetailFilter subFilter; + subFilter.setDetailDefinitionName(QContactName::DefinitionName, fieldName); + subFilter.setValue(m_nameEdit->text()); + subFilter.setMatchFlags(QContactFilter::MatchContains); + nameFilter.append(subFilter); + } + m_currentFilter.append(nameFilter); + } + if (!m_phoneEdit->text().isEmpty()) { + QContactDetailFilter phoneFilter; + phoneFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, + QContactPhoneNumber::FieldNumber); + phoneFilter.setValue(m_phoneEdit->text()); + phoneFilter.setMatchFlags(QContactFilter::MatchContains); + m_currentFilter.append(phoneFilter); + } + if (!m_emailEdit->text().isEmpty()) { + QContactDetailFilter emailFilter; + emailFilter.setDetailDefinitionName(QContactEmailAddress::DefinitionName, + QContactEmailAddress::FieldEmailAddress); + emailFilter.setValue(m_emailEdit->text()); + emailFilter.setMatchFlags(QContactFilter::MatchContains); + m_currentFilter.append(emailFilter); + } + if (!m_addressEdit->text().isEmpty()) { + // Search all fields of the address by building a union filter + QContactUnionFilter addressFilter; + QStringList addressFields; + addressFields << QContactAddress::FieldCountry; + addressFields << QContactAddress::FieldLocality; + addressFields << QContactAddress::FieldPostcode; + addressFields << QContactAddress::FieldPostOfficeBox; + addressFields << QContactAddress::FieldRegion; + addressFields << QContactAddress::FieldStreet; + foreach (const QString& fieldName, addressFields) { + QContactDetailFilter subFilter; + subFilter.setDetailDefinitionName(QContactAddress::DefinitionName, fieldName); + subFilter.setValue(m_addressEdit->text()); + subFilter.setMatchFlags(QContactFilter::MatchContains); + addressFilter.append(subFilter); + } + m_currentFilter.append(addressFilter); + } + emit showListPage(m_currentFilter); } + +void FilterPage::cancelClicked() +{ + m_nameEdit->setText(m_name); + m_phoneEdit->setText(m_phone); + m_emailEdit->setText(m_email); + m_addressEdit->setText(m_address); + emit showListPage(m_currentFilter); +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/samplephonebook/filterpage.h --- a/qtcontactsmobility/examples/samplephonebook/filterpage.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/samplephonebook/filterpage.h Mon May 03 12:24:20 2010 +0300 @@ -70,31 +70,30 @@ void showListPage(const QContactFilter& filter); public slots: + void clearFilter(); private slots: - void addClicked(); - void clearClicked(); void filterClicked(); + void cancelClicked(); private: - QLineEdit *m_valueCriteriaEdit; - QComboBox *m_fieldCriteriaCombo; - QComboBox *m_criteriaTypeCombo; - QComboBox *m_joinMethodCombo; - - QLabel *m_cumulativeExpressionLabel; + QString m_name; + QString m_phone; + QString m_email; + QString m_address; + QLineEdit *m_nameEdit; + QLineEdit *m_phoneEdit; + QLineEdit *m_emailEdit; + QLineEdit *m_addressEdit; #ifdef Q_OS_SYMBIAN - QAction *m_addBtn; QAction *m_filterBtn; + QAction *m_cancelBtn; #else - QPushButton *m_addBtn; QPushButton *m_filterBtn; + QPushButton *m_cancelBtn; #endif - QPushButton *m_clearBtn; - - QString m_cumulativeExpression; - QContactFilter m_cumulativeFilter; + QContactIntersectionFilter m_currentFilter; }; #endif // FILTERPAGE_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/examples/samplephonebook/phonebook.cpp --- a/qtcontactsmobility/examples/samplephonebook/phonebook.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/examples/samplephonebook/phonebook.cpp Mon May 03 12:24:20 2010 +0300 @@ -57,10 +57,11 @@ m_filterPage = new FilterPage(centralWidget); connect(m_filterPage, SIGNAL(showListPage(QContactFilter)), this, SLOT(activateList(QContactFilter))); - m_listPage = new ContactListPage(centralWidget); + m_listPage = new ContactListPage(this, centralWidget); connect(m_listPage, SIGNAL(showEditorPage(QContactLocalId)), this, SLOT(activateEditor(QContactLocalId))); connect(m_listPage, SIGNAL(showFilterPage(QContactFilter)), this, SLOT(activateFind())); connect(m_listPage, SIGNAL(managerChanged(QContactManager*)), this, SLOT(managerChanged(QContactManager*))); + connect(m_listPage, SIGNAL(clearFilter()), m_filterPage, SLOT(clearFilter())); m_stackedWidget = new QStackedWidget(centralWidget); m_stackedWidget->addWidget(m_listPage); @@ -81,24 +82,32 @@ void PhoneBook::activateEditor(QContactLocalId contactId) { + menuBar()->setVisible(false); m_editorPage->setCurrentContact(m_manager, contactId); m_stackedWidget->setCurrentIndex(1); // list = 0, editor = 1, find = 2. } void PhoneBook::activateList(const QContactFilter& filter) -{ +{ +#if !(defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6)) + menuBar()->setVisible(true); +#endif m_currentFilter = filter; activateList(); // call base now. } void PhoneBook::activateList() { +#if !(defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6)) + menuBar()->setVisible(true); +#endif m_listPage->rebuildList(m_currentFilter); m_stackedWidget->setCurrentIndex(0); // list = 0, editor = 1, find = 2. } void PhoneBook::activateFind() { + menuBar()->setVisible(false); m_stackedWidget->setCurrentIndex(2); // list = 0, editor = 1, find = 2. } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/features/mobility.prf --- a/qtcontactsmobility/features/mobility.prf Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/features/mobility.prf Mon May 03 12:24:20 2010 +0300 @@ -7,11 +7,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 + contains(MOBILITY,bearer|location|publishsubscribe|systeminfo|multimedia|messaging|serviceframework|sensors) { + INCLUDEPATH+=$$MW_LAYER_SYSTEMINCLUDE } } mac: LIBS += -F$${MOBILITY_LIB} @@ -55,12 +55,16 @@ 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\"}" + "(0x2002AC89), 1, 0, 0, {\"QtMobility\"}" DEPLOYMENT += mobility_default_deployment } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/features/mobility.prf.template --- a/qtcontactsmobility/features/mobility.prf.template Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/features/mobility.prf.template Mon May 03 12:24:20 2010 +0300 @@ -7,7 +7,7 @@ INCLUDEPATH+=$$APP_LAYER_SYSTEMINCLUDE } - contains(MOBILITY,bearer|location|publishsubscribe|systeminfo|multimedia|messaging|serviceframework) { + contains(MOBILITY,bearer|location|publishsubscribe|systeminfo|multimedia|messaging|serviceframework|sensors) { INCLUDEPATH+=$$MW_LAYER_SYSTEMINCLUDE } } @@ -62,7 +62,7 @@ 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\"}" + "(0x2002AC89), 1, 0, 0, {\"QtMobility\"}" DEPLOYMENT += mobility_default_deployment } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/features/strict_flags.prf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/features/strict_flags.prf Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,38 @@ +# This functionality is opt-in via the STRICT environment variable +# export STRICT=1 on Unix +# set STRICT=1 on Windows +STRICT=$$(STRICT) +equals(STRICT,1) { + win32 { + QMAKE_CXXFLAGS+=-WX + } else { + QMAKE_CXXFLAGS+=-Werror + QMAKE_CXXFLAGS+=-Wall + # There are legitimate cases that conflict with this warning (QSensorFilter::filter) + #QMAKE_CXXFLAGS+=-Woverloaded-virtual + # This breaks in QML headers + #QMAKE_CXXFLAGS+=-Wold-style-cast + # This breaks in QML headers + #QMAKE_CXXFLAGS+=-pedantic + QMAKE_CXXFLAGS+=-ansi + QMAKE_CXXFLAGS+=-Wno-long-long + # This breaks in Qt headers + #QMAKE_CXXFLAGS+=-Wshadow + # This breaks everywhere + #QMAKE_CXXFLAGS+=-Wunreachable-code + QMAKE_CXXFLAGS+=-Wundef + QMAKE_CXXFLAGS+=-Wformat-nonliteral + QMAKE_CXXFLAGS+=-Wformat-security + QMAKE_CXXFLAGS+=-Wcast-align + QMAKE_CXXFLAGS+=-Wchar-subscripts + # This breaks in Qt headers + #QMAKE_CXXFLAGS+=-Wfloat-equal + QMAKE_LFLAGS+=-Wl,-no-undefined + } + + contains(TEMPLATE,lib) { + DEFINES += QT_NO_CAST_FROM_ASCII + CONFIG += no_keywords + } +} + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/pathconfig.pri --- a/qtcontactsmobility/pathconfig.pri Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -# -# Fix up QT_MOBILITY_SOURCE_TREE if it isn't defined -# - -isEmpty(QT_MOBILITY_SOURCE_TREE):QT_MOBILITY_SOURCE_TREE = $$PWD -isEmpty(QT_MOBILITY_BUILD_TREE):QT_MOBILITY_BUILD_TREE = $$PWD - - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/contacts.pro --- a/qtcontactsmobility/plugins/contacts/contacts.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/contacts.pro Mon May 03 12:24:20 2010 +0300 @@ -11,7 +11,7 @@ # SIM backend depends on etel MM APIs contains(symbiancntsim_enabled, yes) { SUBDIRS += symbiansim - contains(build_unit_tests, yes):SUBDIRS += symbiansim/tsrc + #contains(build_unit_tests, yes):SUBDIRS += symbiansim/tsrc message("Symbian SIM backend enabled") } else { message("Symbian SIM backend disabled") @@ -19,3 +19,4 @@ } wince*:SUBDIRS += wince maemo6:SUBDIRS += qtcontacts-tracker +maemo5:SUBDIRS += maemo5 diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/bwins/mobapicontactspluginsymbianu.def --- a/qtcontactsmobility/plugins/contacts/symbian/bwins/mobapicontactspluginsymbianu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -EXPORTS - qt_plugin_instance @ 1 NONAME - qt_plugin_query_verification_data @ 2 NONAME - ?trUtf8@CntSymbianFactory@@SA?AVQString@@PBD0H@Z @ 3 NONAME ; class QString CntSymbianFactory::trUtf8(char const *, char const *, int) - ?staticMetaObject@CntSymbianFactory@@2UQMetaObject@@B @ 4 NONAME ; struct QMetaObject const CntSymbianFactory::staticMetaObject - ?trUtf8@CntSymbianFactory@@SA?AVQString@@PBD0@Z @ 5 NONAME ; class QString CntSymbianFactory::trUtf8(char const *, char const *) - ?qt_metacall@CntSymbianFactory@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 6 NONAME ; int CntSymbianFactory::qt_metacall(enum QMetaObject::Call, int, void * *) - ?qt_metacast@CntSymbianFactory@@UAEPAXPBD@Z @ 7 NONAME ; void * CntSymbianFactory::qt_metacast(char const *) - ?metaObject@CntSymbianFactory@@UBEPBUQMetaObject@@XZ @ 8 NONAME ; struct QMetaObject const * CntSymbianFactory::metaObject(void) const - ??_ECntSymbianFactory@@UAE@I@Z @ 9 NONAME ; CntSymbianFactory::~CntSymbianFactory(unsigned int) - ?tr@CntSymbianFactory@@SA?AVQString@@PBD0@Z @ 10 NONAME ; class QString CntSymbianFactory::tr(char const *, char const *) - ?getStaticMetaObject@CntSymbianFactory@@SAABUQMetaObject@@XZ @ 11 NONAME ; struct QMetaObject const & CntSymbianFactory::getStaticMetaObject(void) - ?engine@CntSymbianFactory@@UAEPAVQContactManagerEngine@QtMobility@@ABV?$QMap@VQString@@V1@@@AAW4Error@QContactManager@3@@Z @ 12 NONAME ; class QtMobility::QContactManagerEngine * CntSymbianFactory::engine(class QMap const &, enum QtMobility::QContactManager::Error &) - ?managerName@CntSymbianFactory@@UBE?AVQString@@XZ @ 13 NONAME ; class QString CntSymbianFactory::managerName(void) const - ??0CntSymbianFactory@@QAE@XZ @ 14 NONAME ; CntSymbianFactory::CntSymbianFactory(void) - ??1CntSymbianFactory@@UAE@XZ @ 15 NONAME ; CntSymbianFactory::~CntSymbianFactory(void) - ?tr@CntSymbianFactory@@SA?AVQString@@PBD0H@Z @ 16 NONAME ; class QString CntSymbianFactory::tr(char const *, char const *, int) - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/eabi/mobapicontactspluginsymbianu.def --- a/qtcontactsmobility/plugins/contacts/symbian/eabi/mobapicontactspluginsymbianu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -EXPORTS - _ZN17CntSymbianFactory11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME - _ZN17CntSymbianFactory11qt_metacastEPKc @ 2 NONAME - _ZN17CntSymbianFactory16staticMetaObjectE @ 3 NONAME DATA 16 - _ZN17CntSymbianFactory19getStaticMetaObjectEv @ 4 NONAME - _ZN17CntSymbianFactory6engineERK4QMapI7QStringS1_ERN10QtMobility15QContactManager5ErrorE @ 5 NONAME - _ZNK17CntSymbianFactory10metaObjectEv @ 6 NONAME - _ZNK17CntSymbianFactory11managerNameEv @ 7 NONAME - _ZTI17CntSymbianFactory @ 8 NONAME - _ZTV17CntSymbianFactory @ 9 NONAME - _ZThn8_N17CntSymbianFactory6engineERK4QMapI7QStringS1_ERN10QtMobility15QContactManager5ErrorE @ 10 NONAME - _ZThn8_NK17CntSymbianFactory11managerNameEv @ 11 NONAME - qt_plugin_instance @ 12 NONAME - qt_plugin_query_verification_data @ 13 NONAME - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/cntabstractrelationship.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntabstractrelationship.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntabstractrelationship.h Mon May 03 12:24:20 2010 +0300 @@ -56,10 +56,10 @@ virtual ~CntAbstractRelationship(); public: - virtual QList relationshipsL(const QContactId &participantId, QContactRelationshipFilter::Role role, QContactManager::Error &error) = 0; - virtual bool saveRelationshipL(QSet *affectedContactIds, QContactRelationship *relationship, QContactManager::Error &error) = 0; - virtual bool removeRelationshipL(QSet *affectedContactIds, const QContactRelationship &relationship, QContactManager::Error &error) = 0; - virtual bool validateRelationship(const QContactRelationship &relationship, QContactManager::Error &error) = 0; + virtual QList relationshipsL(const QContactId &participantId, QContactRelationship::Role role, QContactManager::Error *error) = 0; + virtual bool saveRelationshipL(QSet *affectedContactIds, QContactRelationship *relationship, QContactManager::Error *error) = 0; + virtual bool removeRelationshipL(QSet *affectedContactIds, const QContactRelationship &relationship, QContactManager::Error *error) = 0; + virtual bool validateRelationship(const QContactRelationship &relationship, QContactManager::Error *error) = 0; QString relationshipType() const; protected: diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/cntdisplaylabel.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntdisplaylabel.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntdisplaylabel.h Mon May 03 12:24:20 2010 +0300 @@ -62,7 +62,7 @@ CntDisplayLabel(); virtual ~CntDisplayLabel(); - QString synthesizedDisplayLabel( 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; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/cntrelationship.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntrelationship.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntrelationship.h Mon May 03 12:24:20 2010 +0300 @@ -57,13 +57,13 @@ public: /* 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(QSet *affectedContactIds, QContactRelationship *relationship, QContactManager::Error &error); - QList saveRelationships(QSet *affectedContactIds, QList *relationships, QContactManager::Error &error); - bool removeRelationship(QSet *affectedContactIds, const QContactRelationship &relationship, QContactManager::Error &error); - QList removeRelationships(QSet *affectedContactIds, const QList &relationships, QContactManager::Error &error); - bool validateRelationship(const QContactRelationship &relationship, QContactManager::Error &error); + bool isRelationshipTypeSupported(const QString& relationshipType, const QString& contactType) const; + QList relationships(const QString &relationshipType, const QContactId &participantId, QContactRelationship::Role role, QContactManager::Error *error) const; + bool saveRelationship(QSet *affectedContactIds, QContactRelationship *relationship, QContactManager::Error *error); + bool saveRelationships(QSet *affectedContactIds, QList *relationships, QMap* errorMap, QContactManager::Error *error); + bool removeRelationship(QSet *affectedContactIds, const QContactRelationship &relationship, QContactManager::Error *error); + bool removeRelationships(QSet *affectedContactIds, const QList &relationships, QMap* errorMap, QContactManager::Error *error); + bool validateRelationship(const QContactRelationship &relationship, QContactManager::Error *error); private: CContactDatabase *m_contactDatabase; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/cntrelationshipgroup.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntrelationshipgroup.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntrelationshipgroup.h Mon May 03 12:24:20 2010 +0300 @@ -52,10 +52,10 @@ virtual ~CntRelationshipGroup(); public: - QList relationshipsL(const QContactId &participantId, QContactRelationshipFilter::Role role, QContactManager::Error &error); - bool saveRelationshipL(QSet *affectedContactIds, QContactRelationship *relationship, QContactManager::Error &error); - bool removeRelationshipL(QSet *affectedContactIds, const QContactRelationship &relationship, QContactManager::Error &error); - bool validateRelationship(const QContactRelationship &relationship, QContactManager::Error &error); + QList relationshipsL(const QContactId &participantId, QContactRelationship::Role role, QContactManager::Error *error); + bool saveRelationshipL(QSet *affectedContactIds, QContactRelationship *relationship, QContactManager::Error *error); + bool removeRelationshipL(QSet *affectedContactIds, const QContactRelationship &relationship, QContactManager::Error *error); + bool validateRelationship(const QContactRelationship &relationship, QContactManager::Error *error); private: void isGroupMemberL(const CContactItem *contactItem, const TContactItemId groupId) const; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiandatabase.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiandatabase.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiandatabase.h Mon May 03 12:24:20 2010 +0300 @@ -70,7 +70,7 @@ Q_OBJECT public: - CntSymbianDatabase(QContactManagerEngine *engine, QContactManager::Error& error); + CntSymbianDatabase(QContactManagerEngine *engine, QContactManager::Error* error); ~CntSymbianDatabase(); public: @@ -83,6 +83,12 @@ void HandleDatabaseEventL(TContactDbObserverEvent aEvent); private: + void initializeL(); + void updateGroupMembershipsL(); + void updateGroupMembershipsL(QContactLocalId groupId, QSet &added, QSet &removed); + QSet groupMembersL(QContactLocalId groupId); + +private: CContactDatabase* m_contactDatabase; #ifndef SYMBIAN_BACKEND_USE_SQLITE CContactChangeNotifier* m_contactChangeNotifier; @@ -90,6 +96,7 @@ QContactManagerEngine *m_engine; QList m_contactsEmitted; QContactLocalId m_currentOwnCardId; + QMap > m_groupContents; #ifdef CNTSYMBIANDATABASE_UNIT_TEST friend class TestCntSymbianDatabase; #endif //CNTSYMBIANDATABASE_UNIT_TEST diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianengine.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianengine.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbianengine.h Mon May 03 12:24:20 2010 +0300 @@ -86,66 +86,75 @@ Q_OBJECT public: - CntSymbianEngine(const QMap& parameters, QContactManager::Error& error); - CntSymbianEngine(const CntSymbianEngine& other); + CntSymbianEngine(const QMap& parameters, QContactManager::Error* error); ~CntSymbianEngine(); - void deref(); /* URI reporting */ QString managerName() const; + /* XXX TODO - implement these correctly */ + QMap managerParameters() const {return QMap();} + int managerVersion() const { return 1;} + QContact compatibleContact(const QContact& contact, QContactManager::Error* error) const {return QContactManagerEngine::compatibleContact(contact, error);} + bool validateContact(const QContact& contact, QContactManager::Error* error) const {return QContactManagerEngine::validateContact(contact, error);} + bool validateDefinition(const QContactDetailDefinition& def, QContactManager::Error* error) const {return QContactManagerEngine::validateDefinition(def, error);} + QContactDetailDefinition detailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error) const {return QContactManagerEngine::detailDefinition(definitionId, contactType, error);} + bool saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error* error) {return QContactManagerEngine::saveDetailDefinition(def, contactType, error);} + bool removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error) {return QContactManagerEngine::removeDetailDefinition(definitionId, contactType, error);} + QStringList supportedContactTypes() const {return QContactManagerEngine::supportedContactTypes();} + + /* Functions that are optional in the base API */ + bool saveRelationship(QContactRelationship* relationship, QContactManager::Error* error); + bool removeRelationship(const QContactRelationship& relationship, QContactManager::Error* error); + bool saveContact(QContact* contact, QContactManager::Error* error); + bool removeContact(const QContactLocalId& contactId, QContactManager::Error* error); + /* Contacts - Accessors and Mutators */ - 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); - bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error& error); - bool removeContact(const QContactLocalId& contactId, QContactManager::Error& error); - bool removeContacts(QList* contactIds, QMap* errorMap, QContactManager::Error& error); + QList contactIds(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error* error) const; + QList contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fetchHint, QContactManager::Error* error) const; + QContact contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const; + + bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error* error); + bool removeContacts(const QList& contactIds, QMap* errorMap, QContactManager::Error* error); /* Synthesize the display label of a contact */ - QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const; + 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; + bool setSelfContactId(const QContactLocalId& contactId, QContactManager::Error* error); + QContactLocalId selfContactId(QContactManager::Error* error) const; /* Relationships between contacts */ - 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); + QList relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const; + bool saveRelationships(QList* relationships, QMap* errorMap, QContactManager::Error* error); + bool removeRelationships(const QList& relationships, QMap* errorMap, QContactManager::Error* error); /* Definitions - Accessors and Mutators */ - QMap detailDefinitions(const QString& contactType, QContactManager::Error& error) const; + QMap detailDefinitions(const QString& contactType, QContactManager::Error* error) const; /* Capabilities reporting */ bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const; - QStringList supportedRelationshipTypes(const QString& contactType) const; + bool isRelationshipTypeSupported(const QString& relationshipType, const QString& contactType) const; bool isFilterSupported(const QContactFilter& filter) const; QList supportedDataTypes() 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); + 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 QStringList& definitionRestrictions) const; /* Add contact */ - bool addContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error& qtError); + bool addContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error* qtError); int addContactL(QContact &contact); /* Update contact */ - bool updateContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error& qtError); + bool updateContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error* qtError); void updateContactL(QContact &contact); /* Remove contact */ - bool removeContact(const QContactLocalId &id, QContactChangeSet& changeSet, QContactManager::Error& qtError); + bool removeContact(const QContactLocalId &id, QContactChangeSet& changeSet, QContactManager::Error* qtError); int removeContactL(QContactLocalId id); void updateDisplayLabel(QContact& contact) const; @@ -172,15 +181,16 @@ QQueue m_asynchronousOperations; // async requests to be performed. #ifdef PBK_UNIT_TEST friend class TestSymbianEngine; + friend class TestCntRelationship; #endif //PBK_UNIT_TEST }; #ifndef PBK_UNIT_TEST -class Q_DECL_EXPORT CntSymbianFactory : public QObject, public QContactManagerEngineFactory +class CntSymbianFactory : public QObject, public QContactManagerEngineFactory { Q_OBJECT Q_INTERFACES(QtMobility::QContactManagerEngineFactory) public: - QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error& error); + QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error* error); QString managerName() const; }; #endif //PBK_UNIT_TEST diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiantransformerror.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiantransformerror.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/cntsymbiantransformerror.h Mon May 03 12:24:20 2010 +0300 @@ -52,7 +52,7 @@ class CntSymbianTransformError { public: - static void transformError(TInt symbianError, QContactManager::Error& qtError); + static void transformError(TInt symbianError, QContactManager::Error* qtError); }; #endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactfilter.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactfilter.h Mon May 03 12:24:20 2010 +0300 @@ -53,18 +53,26 @@ { public: enum FilterSupport { - /* The filter not supported */ + /* The filter is not supported */ NotSupported = 0, - /* The filter is supported */ + /* The filter is illegal. Filtering is not allowed and the operation + * should fail immediately with an error. + */ + IllegalFilter, + /* The filter is supported natively */ 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 filter is not fully natively 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). */ + * using QContactManagerEngine::testFilter). + */ SupportedPreFilterOnly }; public: @@ -72,7 +80,7 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error) = 0; + QContactManager::Error* error) = 0; virtual bool filterSupported(const QContactFilter& filter) = 0; }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactsorter.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactsorter.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntabstractcontactsorter.h Mon May 03 12:24:20 2010 +0300 @@ -53,12 +53,12 @@ public: virtual QList contacts( const QList& sortOrders, - QContactManager::Error& error) = 0; + QContactManager::Error* error) = 0; virtual QList sort( QList contactIds, const QList& sortOrders, - QContactManager::Error& error) = 0; + QContactManager::Error* error) = 0; virtual bool sortOrderSupported(const QList& sortOrders) = 0; }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdbinfo.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdbinfo.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdbinfo.h Mon May 03 12:24:20 2010 +0300 @@ -44,8 +44,12 @@ #define CNTDBINFO_H_ #include +#include #include -#include +#include +#include + +QTM_USE_NAMESPACE class CntSymbianSrvConnection; class CntSymbianFilter; @@ -63,20 +67,20 @@ CntDbInfo(); virtual ~CntDbInfo(); - void getDbTableAndColumnName( const quint32 fieldId , - QString& tableName, - QString& columnName ) const; - bool SupportsUid(int uid); + void getDbTableAndColumnName( const QString definitionName, + const QString fieldName, + QString& tableName, + QString& columnName, + bool& isSubType) const; + bool SupportsDetail(QString definitionName, QString fieldName); + + QString getSortQuery(const QList &sortOrders, + const QString& selectQuery, + QContactManager::Error* error); private: - QHash contactsTableIdColumNameMapping; - QHash commAddrTableIdColumNameMapping; - + QHash contactsTableIdColumNameMapping; + QHash > commAddrTableIdColumNameMapping; }; - - - - - #endif /* CNTDBINFO_H_ */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdisplaylabelsqlfilter.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdisplaylabelsqlfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntdisplaylabelsqlfilter.h Mon May 03 12:24:20 2010 +0300 @@ -56,7 +56,7 @@ void createSqlQuery(const QContactDetailFilter& filter, QString& sqlQuery, - QContactManager::Error& error); + 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; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilteraction.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilteraction.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilteraction.h Mon May 03 12:24:20 2010 +0300 @@ -55,12 +55,12 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error); + QContactManager::Error* error); bool filterSupported(const QContactFilter& filter); void createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error); + QContactManager::Error* error); private: protected: diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterchangelog.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterchangelog.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterchangelog.h Mon May 03 12:24:20 2010 +0300 @@ -55,12 +55,12 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error); + QContactManager::Error* error); bool filterSupported(const QContactFilter& filter); void createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error); + QContactManager::Error* error); private: protected: diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdefault.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdefault.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdefault.h Mon May 03 12:24:20 2010 +0300 @@ -55,12 +55,12 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error); + QContactManager::Error* error); bool filterSupported(const QContactFilter& filter); void createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error); + QContactManager::Error* error); private: protected: diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetail.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetail.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetail.h Mon May 03 12:24:20 2010 +0300 @@ -44,7 +44,6 @@ #include "cntabstractcontactfilter.h" #include "cntsymbiansrvconnection.h" -#include "qcontactdetailfilter.h" #include "cntdbinfo.h" #include @@ -60,7 +59,7 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error); + QContactManager::Error* error); bool filterSupported(const QContactFilter& filter) ; //bool isFilterSupported(const QContactFilter& filter) const; @@ -68,19 +67,19 @@ void getTableNameWhereClause( const QContactDetailFilter& filter, QString& tableName, QString& sqlWhereClause , - QContactManager::Error& error) const; + QContactManager::Error* error) const; void createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error); + QContactManager::Error* error); private: void updateForMatchFlag( const QContactDetailFilter& filter, QString& fieldToUpdate , - QContactManager::Error& error) const; + QContactManager::Error* error) const; QList HandlePhonenumberDetailFilter(const QContactFilter& filter); QList HandlePredictiveSearchFilter(const QContactFilter& filter, - QContactManager::Error& error); + QContactManager::Error* error); TInt CntFilterDetail::searchPhoneNumbers( CContactIdArray*& idArray, diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetaildisplaylabel.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetaildisplaylabel.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetaildisplaylabel.h Mon May 03 12:24:20 2010 +0300 @@ -59,10 +59,10 @@ public: QString createSelectQuery(const QContactFilter& filter, const QList& sortOrders, - QContactManager::Error& error) const; + QContactManager::Error* error) const; void createSelectQuery(const QContactFilter& detailFilter, QString& sqlQuery, - QContactManager::Error& error); + 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; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetailrange.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetailrange.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterdetailrange.h Mon May 03 12:24:20 2010 +0300 @@ -55,12 +55,12 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error); + QContactManager::Error* error); bool filterSupported(const QContactFilter& filter); void createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error); + QContactManager::Error* error); private: protected: diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterintersection.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterintersection.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterintersection.h Mon May 03 12:24:20 2010 +0300 @@ -44,8 +44,8 @@ #include "cntabstractcontactfilter.h" #include "cntsymbiansrvconnection.h" +#include "cntdbinfo.h" #include "qcontactdetailfilter.h" -#include "cntdbinfo.h" class CntFilterIntersection : public CntAbstractContactFilter { @@ -57,21 +57,21 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error) ; + QContactManager::Error* error) ; bool filterSupported(const QContactFilter& filter); void getSqlQuery( const QContactIntersectionFilter& filter, - QString& tableName, - QString& sqlWhereClause , - QContactManager::Error& error) const; + QString& tableName, + QString& sqlWhereClause , + QContactManager::Error* error) const; void createSelectQuery(const QContactFilter& filter, QString& selectquery, - QContactManager::Error& error); + QContactManager::Error* error); private: - void getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error& error); - + void getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error* error); + protected: CContactDatabase& m_contactdatabase; CntSymbianSrvConnection &m_srvConnection; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterinvalid.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterinvalid.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterinvalid.h Mon May 03 12:24:20 2010 +0300 @@ -55,11 +55,11 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error); + QContactManager::Error* error); bool filterSupported(const QContactFilter& filter); void createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error); + QContactManager::Error* error); private: protected: diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterlocalid.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterlocalid.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterlocalid.h Mon May 03 12:24:20 2010 +0300 @@ -56,12 +56,12 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error); + QContactManager::Error* error); bool filterSupported(const QContactFilter& filter); void createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error); + QContactManager::Error* error); private: protected: diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterrelationship.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterrelationship.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterrelationship.h Mon May 03 12:24:20 2010 +0300 @@ -44,7 +44,6 @@ #include "cntabstractcontactfilter.h" #include "cntsymbiansrvconnection.h" -#include "qcontactdetailfilter.h" #include "cntdbinfo.h" #include @@ -60,17 +59,17 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error); + 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; + QContactManager::Error* error) const; void CntFilterRelationship::createSelectQuery(const QContactFilter& detailFilter, QString& sqlQuery, - QContactManager::Error& error); + QContactManager::Error* error); protected: CContactDatabase& m_contactdatabase; CntSymbianSrvConnection &m_srvConnection; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterunion.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterunion.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntfilterunion.h Mon May 03 12:24:20 2010 +0300 @@ -44,7 +44,6 @@ #include "cntabstractcontactfilter.h" #include "cntsymbiansrvconnection.h" -#include "qcontactdetailfilter.h" #include "cntdbinfo.h" #include @@ -60,16 +59,16 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupported, - QContactManager::Error &error) ; + QContactManager::Error* error) ; bool filterSupported(const QContactFilter& filter) ; void createSelectQuery(const QContactFilter& filter, QString& selectquery, - QContactManager::Error& error); + QContactManager::Error* error); private: - void getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error& error); - + void getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error* error); + protected: CContactDatabase& m_contactdatabase; CntSymbianSrvConnection &m_srvConnection; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsqlsearch.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsqlsearch.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsqlsearch.h Mon May 03 12:24:20 2010 +0300 @@ -43,6 +43,13 @@ #include #include +// If this macro is defined, searches like "102" are made on one table only +#define SEARCH_FROM_ONE_TABLE + +// If defined, De Morgan's laws are used to replace ORs with ANDs in the +// SELECT statement. +#define USE_DEMORGAN + class CntSqlSearch : public QObject { @@ -56,33 +63,42 @@ private: - QString SelectTableView(const QString &pattern); - - bool IsSubStringSearch(const QString &pattern); + QString SelectTable(const QString &pattern) const; - QStringList GetNumber(const QString &pattern); + QStringList GetTokens(const QString& pattern) const; - QString CreateSubStringSearch(const QString &pattern); - - QString CreateStringSearch(const QString &pattern); + QString CreateQuery(const QString& pattern) const; - QString CreateSpaceStringSearch(QStringList numbers, const QString &pattern); - - QString CreateSpaceSimpleSearch(QStringList numbers); + QString ExactMatchSearch(const QString& pattern) const; - QString CreateLimit(QString pattern ); + QString CreateSpaceStringSearch(QStringList numbers, const QString &pattern) const; - QString CreateJoinTableLimit(QString low, QString upp, QString table); + QString IntersectionSearch(const QString& pattern, + const QStringList& numbers) const; + QString SearchTokensFromOneTable(const QString& pattern, + const QStringList& tokens) const; - QString CreateJoinTableSearch(QStringList numbers); + QString IdenticalTokensSearch(const QString& pattern, + const QStringList& tokens) const; - QString Order(QStringList numbers); + QString CompareTwoColumns(const QString& lower, + const QString& upper, + const QString& lower2, + const QString& upper2) const; + + QString ExactMatch(const QString& pattern, QString table = "") const; - QString upperLimit( const QString &pattern ) const; + QString CreateJoinTableSearch(QString pattern, QStringList numbers) const; + + QString ExactMatchColumns(QStringList numbers) const; + + QString Order(QStringList numbers) const; + + QString UpperLimit( const QString &pattern ) const; - QString lowerLimit( const QString &pattern ) const; + QString LowerLimit( const QString &pattern ) const; - QString pad( const QString &pattern, char padChar ) const; + QString Pad( const QString &pattern, char padChar ) const; friend class UT_CntSqlSearch; }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfilterdbms.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfilterdbms.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfilterdbms.h Mon May 03 12:24:20 2010 +0300 @@ -69,13 +69,13 @@ QList contacts(const QContactFilter& filter, const QList& sortOrders, bool &filterSupported, - QContactManager::Error& error); + QContactManager::Error* error); bool filterSupported(const QContactFilter& filter); private: FilterSupport filterSupportLevel(const QContactFilter& filter); QList filterContacts(const QContactFilter& filter, - QContactManager::Error& error); + QContactManager::Error* error); void transformDetailFilterL(const QContactDetailFilter& detailFilter, CContactItemFieldDef*& fieldDef); TInt findContacts( CContactIdArray*& idArray, @@ -94,7 +94,7 @@ CntAbstractContactSorter *m_contactSorter; CntTransformContact *m_transformContact; #ifdef PBK_UNIT_TEST - friend class ut_cntfilteringdbms; + friend class tst_cntfilteringdbms; #endif }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersql.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersql.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersql.h Mon May 03 12:24:20 2010 +0300 @@ -64,7 +64,7 @@ const QContactFilter& filter, const QList& sortOrders, bool &filterSupportedflag, - QContactManager::Error& error) ; + QContactManager::Error* error) ; void initializeFilters(); @@ -72,7 +72,7 @@ protected: void createSelectQuery(const QContactFilter& /*detailFilter*/, QString& /*sqlQuery*/, - QContactManager::Error& /*error*/){}; + QContactManager::Error* /*error*/){}; private: CContactDatabase& m_contactDatabase; CntDbInfo* m_dbInfo; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersqlhelper.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbianfiltersqlhelper.h Fri Apr 16 14:53:18 2010 +0300 +++ /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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansorterdbms.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansorterdbms.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansorterdbms.h Mon May 03 12:24:20 2010 +0300 @@ -59,11 +59,11 @@ /* from CntAbstractContactFilter */ QList contacts( const QList& sortOrders, - QContactManager::Error& error); + QContactManager::Error* error); QList sort( QList contactIds, const QList& sortOrders, - QContactManager::Error& error); + QContactManager::Error* error); bool sortOrderSupported(const QList& sortOrders); private: diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansrvconnection.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansrvconnection.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/filtering/cntsymbiansrvconnection.h Mon May 03 12:24:20 2010 +0300 @@ -65,7 +65,7 @@ public: /* QT like functions */ QList searchContacts(const QString& searchQuery, - QContactManager::Error& error); + QContactManager::Error* error); private: /* Symbian Leaving functions */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformavatarsimple.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformavatarsimple.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +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" - -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontact.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontact.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontact.h Mon May 03 12:24:20 2010 +0300 @@ -75,7 +75,7 @@ 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; + 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: @@ -97,6 +97,8 @@ Geolocation, Note, Family, + Ringtone, + Thumbnail, Empty }; @@ -105,7 +107,8 @@ 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; - + void resetTransformObjects() const; + private: QMap m_transformContactData; }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontactdata.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontactdata.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformcontactdata.h Mon May 03 12:24:20 2010 +0300 @@ -73,6 +73,8 @@ 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; + + virtual void reset(){}; }; #endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformonlineaccount.h --- a/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformonlineaccount.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformonlineaccount.h Mon May 03 12:24:20 2010 +0300 @@ -60,7 +60,9 @@ EPresenceExtendedAway, EPresenceUnknown }; - +public: + CntTransformOnlineAccount(); + protected: QList transformDetailL(const QContactDetail &detail); QContactDetail *transformItemField(const CContactItemField& field, const QContact &contact); @@ -70,10 +72,14 @@ bool supportsSubType(const QString& subType) const; quint32 getIdForField(const QString& fieldName) const; void detailDefinitions(QMap &definitions, const QString& contactType) const; + void reset(); private: quint32 encodePresence(QString aPresence); QString decodePresence(quint32 aPresence); + +private: + quint32 m_detailCounter; }; #endif // TRANSFORMONLINEACCOUNT_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformringtone.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformringtone.h Mon May 03 12:24:20 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 TRANSFORMRINGTONE_H +#define TRANSFORMRINGTONE_H + +#include "cnttransformcontactdata.h" + +QTM_USE_NAMESPACE + +class CntTransformRingtone : 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformthumbnail.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/inc/transform/cnttransformthumbnail.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** 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 TRANSFORMTHUMBNAIL_H +#define TRANSFORMTHUMBNAIL_H + +#include "cnttransformcontactdata.h" +#include "cntthumbnailcreator.h" + +QTM_USE_NAMESPACE + +class CntTransformThumbnail : public CntTransformContactData +{ +public: + CntTransformThumbnail(); + ~CntTransformThumbnail(); + +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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/runtest.cmd --- a/qtcontactsmobility/plugins/contacts/symbian/runtest.cmd Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -cd tsrc -call del MON.sym -call del MON.dat -call del profile.txt - -call qmake -call bldmake bldfiles -call abld clean -call abld reallyclean -call ctcwrap -i d -C "EXCLUDE+*\moc*.cpp" -C "EXCLUDE+..\src\cnttransformanniversarysimple.cpp" -C "EXCLUDE+..\src\cnttransformavatarsimple.cpp" -C "EXCLUDE+..\src\cnttransformempty.cpp" abld build winscw udeb - -call \epoc32\release\winscw\udeb\ut_cntsymbianengine.exe -xml -o c:\testresults_symbianengine.xml -call \epoc32\release\winscw\udeb\ut_transformcontactdata.exe -xml -o c:\testresults_transformcontactdata.xml -call \epoc32\release\winscw\udeb\ut_cntfiltering.exe -xml -o c:\testresults_cntfiltering.xml -call \epoc32\release\winscw\udeb\ut_cntsymbiandatabase.exe -xml -o c:\testresults_symbiandatabase.xml -call \epoc32\release\winscw\udeb\ut_cntrelationship.exe -xml -o c:\testresults_relationship.xml -rem call \epoc32\release\winscw\udeb\tst_details.exe -xml -o c:\testresults_details.xml - -call ctcpost MON.sym MON.dat -p profile.txt -call ctc2html -i profile.txt -nsb -cd .. \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/cntdisplaylabel.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntdisplaylabel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntdisplaylabel.cpp Mon May 03 12:24:20 2010 +0300 @@ -74,8 +74,8 @@ //Contact //Preferred details QList > contactPrefferedDisplayLabelDetails; - contactPrefferedDisplayLabelDetails.append(qMakePair(QLatin1String(QContactName::DefinitionName), QLatin1String(QContactName::FieldFirst))); - contactPrefferedDisplayLabelDetails.append(qMakePair(QLatin1String(QContactName::DefinitionName), QLatin1String(QContactName::FieldLast))); + contactPrefferedDisplayLabelDetails.append(qMakePair(QLatin1String(QContactName::DefinitionName), QLatin1String(QContactName::FieldFirstName))); + contactPrefferedDisplayLabelDetails.append(qMakePair(QLatin1String(QContactName::DefinitionName), QLatin1String(QContactName::FieldLastName))); m_contactDisplayLabelDetails.append(contactPrefferedDisplayLabelDetails); //if preferred details doesn't exist use these @@ -95,10 +95,10 @@ * \a error On return, contains the possible error. * \return synthesised display label */ -QString CntDisplayLabel::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const +QString CntDisplayLabel::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const { QString displayLabel; - error = QContactManager::NoError; + *error = QContactManager::NoError; //contact if(contact.type() == QContactType::TypeContact) { @@ -112,7 +112,7 @@ //invalid type else { - error = QContactManager::InvalidContactTypeError; + *error = QContactManager::InvalidContactTypeError; } return displayLabel; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/cntrelationship.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntrelationship.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntrelationship.cpp Mon May 03 12:24:20 2010 +0300 @@ -71,6 +71,7 @@ { QMap::iterator itr; + /* XXX maybe use qDeleteAll? */ for (itr = m_relationshipMap.begin(); itr != m_relationshipMap.end(); ++itr) { CntAbstractRelationship* value = itr.value(); @@ -80,18 +81,21 @@ } /*! - * \return The supported relationship types. + * \return whether relationships of type \a relationshipType is supported by contacts of \a contactType */ -QStringList CntRelationship::supportedRelationshipTypes(const QString &contactType) const +bool CntRelationship::isRelationshipTypeSupported(const QString &relationshipType, const QString &contactType) const { Q_UNUSED(contactType); - + return m_relationshipMap.contains(relationshipType); + + /* XXX Old code: QStringList supportedTypes; foreach(const QString& type, m_relationshipMap.keys()) { supportedTypes.append(type); } return supportedTypes; + */ } /* ! @@ -102,10 +106,10 @@ * \a role The contact role * \a error Error returned */ -QList CntRelationship::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role, QContactManager::Error& error) const +QList CntRelationship::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const { QList returnValue; - error = QContactManager::NoError; + *error = QContactManager::NoError; // if relationshipType is empty, relationships of any type are returned. if (relationshipType.isEmpty()) @@ -116,7 +120,7 @@ CntAbstractRelationship *abstractRelationship = m_relationshipMap.value(type); // retrieve the relationships - TRAPD(symbianError, QT_TRYCATCH_LEAVING(returnValue.append(abstractRelationship->relationshipsL(participantId, role, error)))); + TRAPD(symbianError, returnValue.append(abstractRelationship->relationshipsL(participantId, role, error))); // if error translate it into a qt error if (symbianError != KErrNone){ @@ -124,14 +128,14 @@ } // return empty list if there was an error - if (error != QContactManager::NoError && error != QContactManager::DoesNotExistError) { + if (*error != QContactManager::NoError && *error != QContactManager::DoesNotExistError) { return QList(); } } // if relationships found, update error - if (!returnValue.isEmpty() && error == QContactManager::DoesNotExistError) { + if (!returnValue.isEmpty() && *error == QContactManager::DoesNotExistError) { // this can be the case if nothing is found for last relationship type - error = QContactManager::NoError; + *error = QContactManager::NoError; } } //check if we support the relationship @@ -141,7 +145,7 @@ CntAbstractRelationship *abstractRelationship = m_relationshipMap.value(relationshipType); //retrieve the relationships - TRAPD(symbianError, QT_TRYCATCH_LEAVING(returnValue = abstractRelationship->relationshipsL(participantId, role, error))); + TRAPD(symbianError, returnValue = abstractRelationship->relationshipsL(participantId, role, error)); //if error translate it into a qt error if (symbianError != KErrNone){ @@ -149,12 +153,12 @@ } } else{ - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; } // No relationships found? - if (error == QContactManager::NoError && returnValue.count() == 0 ) { - error = QContactManager::DoesNotExistError; + if (*error == QContactManager::NoError && returnValue.count() == 0 ) { + *error = QContactManager::DoesNotExistError; } return returnValue; @@ -167,10 +171,10 @@ * \a relationship to be saved * \a error Error returned */ -bool CntRelationship::saveRelationship(QSet *affectedContactIds, QContactRelationship* relationship, QContactManager::Error& error) +bool CntRelationship::saveRelationship(QSet *affectedContactIds, QContactRelationship* relationship, QContactManager::Error* error) { bool returnValue(false); - error = QContactManager::NoError; + *error = QContactManager::NoError; if (validateRelationship(*relationship, error)) { // Update manager uri to this manager if it is empty @@ -184,7 +188,7 @@ CntAbstractRelationship *abstractRelationship = m_relationshipMap.value(relationship->relationshipType()); //save the relationship - TRAPD(symbianError, QT_TRYCATCH_LEAVING(returnValue = abstractRelationship->saveRelationshipL(affectedContactIds, relationship, error))); + TRAPD(symbianError, returnValue = abstractRelationship->saveRelationshipL(affectedContactIds, relationship, error)); //if symbian error translate it into a qt error if (symbianError != KErrNone){ @@ -200,24 +204,31 @@ * * \a affectedContactIds will include the affected contact ids * \a relationships to be saved - * \return a list of errors + * \a errorMap storage place for errors + * \return true if there were no errors saving */ -QList CntRelationship::saveRelationships(QSet *affectedContactIds, QList* relationships, QContactManager::Error& error) +bool CntRelationship::saveRelationships(QSet *affectedContactIds, QList* relationships, QMap* errorMap, QContactManager::Error* error) { - QList returnValue; - error = QContactManager::NoError; QContactManager::Error singleError; + bool returnValue(true); + + *error = QContactManager::NoError; // loop through the relationships for (int i = 0; i < relationships->count(); i++) { // save the relationship - saveRelationship(affectedContactIds, &(relationships->operator[](i)), singleError); - returnValue.append(singleError); + saveRelationship(affectedContactIds, &(relationships->operator[](i)), &singleError); + if (errorMap && singleError != QContactManager::NoError) { + errorMap->insert(i, singleError); + } // update the total error - if (singleError != QContactManager::NoError) - error = singleError; + if (singleError != QContactManager::NoError) { + *error = singleError; + returnValue = false; + } + } return returnValue; @@ -231,16 +242,16 @@ * \a error Error returned * \return true if no error otherwise false */ -bool CntRelationship::removeRelationship(QSet *affectedContactIds, const QContactRelationship &relationship, QContactManager::Error& error) +bool CntRelationship::removeRelationship(QSet *affectedContactIds, const QContactRelationship &relationship, QContactManager::Error* error) { bool returnValue(false); - error = QContactManager::NoError; + *error = QContactManager::NoError; if (validateRelationship(relationship, error)) { //get the relationship CntAbstractRelationship *abstractRelationship = m_relationshipMap.value(relationship.relationshipType()); - TRAPD(symbianError, QT_TRYCATCH_LEAVING(returnValue = abstractRelationship->removeRelationshipL(affectedContactIds, relationship, error))); + TRAPD(symbianError, returnValue = abstractRelationship->removeRelationshipL(affectedContactIds, relationship, error)); //if symbian error translate it into a qt error if (symbianError != KErrNone){ @@ -256,35 +267,39 @@ * * \a affectedContactIds will include the affected contact ids * \a relationships to be removed - * \return a list of errors + * \a errorMap storage place for errors + * \return true if there were no errors removing, false otherwise */ -QList CntRelationship::removeRelationships(QSet *affectedContactIds, const QList& relationships, QContactManager::Error& error) +bool CntRelationship::removeRelationships(QSet *affectedContactIds, const QList& relationships, QMap* errorMap, QContactManager::Error* error) { - QList returnValue; - error = QContactManager::NoError; + bool returnValue(true); + *error = QContactManager::NoError; QContactManager::Error qtError(QContactManager::NoError); //loop through the relationships for(int i = 0; i < relationships.count(); i++) { //remove the relationships - removeRelationship(affectedContactIds, relationships.at(i), qtError); - returnValue.append(qtError); + removeRelationship(affectedContactIds, relationships.at(i), &qtError); + if (errorMap && qtError != QContactManager::NoError) + errorMap->insert(i, qtError); // update the total error - if (qtError != QContactManager::NoError) - error = qtError; + if (qtError != QContactManager::NoError) { + returnValue = false; + *error = qtError; + } } return returnValue; } -bool CntRelationship::validateRelationship(const QContactRelationship &relationship, QContactManager::Error& error) +bool CntRelationship::validateRelationship(const QContactRelationship &relationship, QContactManager::Error* error) { - error = QContactManager::NoError; + *error = QContactManager::NoError; // check if supported in this manager if (!m_relationshipMap.contains(relationship.relationshipType())) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return false; } @@ -293,13 +308,13 @@ // zero id contacts not accepted if (!(first.localId() && second.localId())) { - error = QContactManager::InvalidRelationshipError; + *error = QContactManager::InvalidRelationshipError; return false; } // "first" must be a contact in this manager if (!first.managerUri().isEmpty() && first.managerUri() != m_managerUri) { - error = QContactManager::InvalidRelationshipError; + *error = QContactManager::InvalidRelationshipError; return false; } @@ -307,7 +322,7 @@ CContactItem* contact = 0; TRAP_IGNORE(contact = m_contactDatabase->ReadContactL(first.localId())); if (!contact) { - error = QContactManager::InvalidRelationshipError; + *error = QContactManager::InvalidRelationshipError; return false; } delete contact; @@ -317,7 +332,7 @@ { // circular relationships not allowed if (first.localId() == second.localId()) { - error = QContactManager::InvalidRelationshipError; + *error = QContactManager::InvalidRelationshipError; return false; } @@ -325,7 +340,7 @@ contact = 0; TRAP_IGNORE(contact = m_contactDatabase->ReadContactL(second.localId())); if (!contact) { - error = QContactManager::InvalidRelationshipError; + *error = QContactManager::InvalidRelationshipError; return false; } delete contact; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/cntrelationshipgroup.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntrelationshipgroup.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntrelationshipgroup.cpp Mon May 03 12:24:20 2010 +0300 @@ -69,7 +69,7 @@ * \a relationship to be saved * \a error t */ -bool CntRelationshipGroup::saveRelationshipL(QSet *affectedContactIds, QContactRelationship* relationship, QContactManager::Error& error) +bool CntRelationshipGroup::saveRelationshipL(QSet *affectedContactIds, QContactRelationship* relationship, QContactManager::Error* error) { //get the ids of the relationship QScopedPointer groupId(new QContactId(relationship->first())); @@ -83,11 +83,11 @@ affectedContactIds->insert(groupId->localId()); affectedContactIds->insert(contactId->localId()); - error = QContactManager::NoError; + *error = QContactManager::NoError; return true; } -bool CntRelationshipGroup::removeRelationshipL(QSet *affectedContactIds, const QContactRelationship& relationship, QContactManager::Error& error) +bool CntRelationshipGroup::removeRelationshipL(QSet *affectedContactIds, const QContactRelationship& relationship, QContactManager::Error* error) { //get the ids of the relationship QScopedPointer groupId(new QContactId(relationship.first())); @@ -110,15 +110,15 @@ CleanupStack::PopAndDestroy(contact); CleanupStack::PopAndDestroy(groupContact); - error = QContactManager::NoError; + *error = QContactManager::NoError; return true; } -bool CntRelationshipGroup::validateRelationship(const QContactRelationship &relationship, QContactManager::Error& error) +bool CntRelationshipGroup::validateRelationship(const QContactRelationship &relationship, QContactManager::Error* error) { // check that "second" is in this manager if (!relationship.second().managerUri().isEmpty() && relationship.second().managerUri() != managerUri()) { - error = QContactManager::InvalidRelationshipError; + *error = QContactManager::InvalidRelationshipError; return false; } @@ -162,20 +162,20 @@ } //retrieve all the groups that the contact is part of -QList CntRelationshipGroup::relationshipsL(const QContactId& participantId, QContactRelationshipFilter::Role role, QContactManager::Error& error) +QList CntRelationshipGroup::relationshipsL(const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) { QList returnValue; if (participantId != QContactId()) { //role is a group - if(role == QContactRelationshipFilter::First || role == QContactRelationshipFilter::Either) + if(role == QContactRelationship::First || role == QContactRelationship::Either) { fetchGroupMembersL(participantId.localId(), &returnValue); } //role is member of a group - if(role == QContactRelationshipFilter::Second || role == QContactRelationshipFilter::Either) + if(role == QContactRelationship::Second || role == QContactRelationship::Either) { fetchMemberOfGroupsL(participantId.localId(), &returnValue); } @@ -188,7 +188,7 @@ } if (returnValue.isEmpty()) - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return returnValue; } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiandatabase.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiandatabase.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiandatabase.cpp Mon May 03 12:24:20 2010 +0300 @@ -41,6 +41,7 @@ //system includes #include #include +#include //user includes #include "cntsymbiandatabase.h" @@ -51,37 +52,51 @@ // Constant typedef QPair QOwnCardPair; -CntSymbianDatabase::CntSymbianDatabase(QContactManagerEngine *engine, QContactManager::Error& error) : +CntSymbianDatabase::CntSymbianDatabase(QContactManagerEngine *engine, QContactManager::Error* error) : + m_engine(engine), m_contactDatabase(0), m_currentOwnCardId(0) { - TRAPD(err, m_contactDatabase = CContactDatabase::OpenL()) + TRAPD(err, initializeL()); + CntSymbianTransformError::transformError(err, error); +} - //Database not found, create it - if(err == KErrNotFound) - { - TRAP(err, m_contactDatabase = CContactDatabase::CreateL()) +void CntSymbianDatabase::initializeL() +{ + User::LeaveIfNull(m_engine); + + TRAPD(err, m_contactDatabase = CContactDatabase::OpenL()); + + // Database not found, create it + if(err == KErrNotFound) { + m_contactDatabase = CContactDatabase::CreateL(); } - //Database opened successfully - if (err == KErrNone) - { +#ifndef SYMBIAN_BACKEND_USE_SQLITE // In pre 10.1 platforms the AddObserverL & RemoveObserver functions are not // exported so we need to use CContactChangeNotifier. -#ifndef SYMBIAN_BACKEND_USE_SQLITE - TRAP(err, m_contactChangeNotifier = CContactChangeNotifier::NewL(*m_contactDatabase, this)); + TRAP(err, m_contactChangeNotifier = CContactChangeNotifier::NewL(*m_contactDatabase, this)); #else - TRAP(err, m_contactDatabase->AddObserverL(*this)); + TRAP(err, m_contactDatabase->AddObserverL(*this)); #endif - if (err == KErrNone) - m_engine = engine; + + // Read current own card id (self contact id) + TContactItemId myCard = m_contactDatabase->OwnCardId(); + if (myCard > 0) + m_currentOwnCardId = QContactLocalId(myCard); - // Read current own card id (self contact id) - TContactItemId myCard = m_contactDatabase->OwnCardId(); - if (myCard > 0) - m_currentOwnCardId = QContactLocalId(myCard); - } - CntSymbianTransformError::transformError(err, error); + // Currently the group membership check is only used in pre-10.1 + // platforms. In 10.1 we need to check the performance penalty + // caused in the instantiation of QContactManager. If the + // performance is too bad, then the MContactDbObserver API needs to + // be changed in 10.1 so that we don't need the group membership + // buffer in the engine level. In other words events like + // EContactDbObserverEventGroupMembersAdded and + // EContactDbObserverEventGroupMembersRemoved need to be added to + // MContactDbObserver. +#ifndef SYMBIAN_BACKEND_USE_SQLITE + updateGroupMembershipsL(); +#endif } CntSymbianDatabase::~CntSymbianDatabase() @@ -130,46 +145,87 @@ if(m_contactsEmitted.contains(id)) m_contactsEmitted.removeOne(id); else - changeSet.addedContacts().insert(id); + changeSet.insertAddedContact(id); break; case EContactDbObserverEventOwnCardDeleted: + m_currentOwnCardId = QContactLocalId(0); + // ...and send contact deleted event case EContactDbObserverEventContactDeleted: if(m_contactsEmitted.contains(id)) m_contactsEmitted.removeOne(id); else - changeSet.removedContacts().insert(id); + changeSet.insertRemovedContact(id); break; case EContactDbObserverEventContactChanged: if(m_contactsEmitted.contains(id)) m_contactsEmitted.removeOne(id); else - changeSet.changedContacts().insert(id); + changeSet.insertChangedContact(id); break; case EContactDbObserverEventGroupAdded: - if(m_contactsEmitted.contains(id)) - m_contactsEmitted.removeOne(id); - else - changeSet.addedRelationshipsContacts().insert(id); + if(m_contactsEmitted.contains(id)) { + // adding a group triggers also a "changed" event. The work-around + // is to leave the id to m_contactsEmitted + } else { + changeSet.insertAddedContact(id); + m_contactsEmitted.append(id); + } break; case EContactDbObserverEventGroupDeleted: if(m_contactsEmitted.contains(id)) m_contactsEmitted.removeOne(id); else - changeSet.removedRelationshipsContacts().insert(id); + changeSet.insertRemovedContact(id); break; case EContactDbObserverEventGroupChanged: if(m_contactsEmitted.contains(id)) m_contactsEmitted.removeOne(id); - else - changeSet.changedContacts().insert(id); //group is a contact + else { +#ifndef SYMBIAN_BACKEND_USE_SQLITE + // Contact DB observer API does not give information of contacts + // possibly added to or removed from the group + QSet added; + QSet removed; + TRAPD(err, updateGroupMembershipsL(id, added, removed)); + if(err != KErrNone){ + changeSet.setDataChanged(true); + } else if(removed.count()) { + // The group changed event was caused by removing contacts + // from the group + changeSet.insertRemovedRelationshipsContact(id); + changeSet.insertRemovedRelationshipsContacts(removed.toList()); + } else if(added.count()) { + // The group changed event was caused by adding contacts + // to the group + changeSet.insertAddedRelationshipsContact(id); + changeSet.insertAddedRelationshipsContacts(added.toList()); + } else { + // The group changed event was caused by modifying the group + changeSet.insertChangedContact(id); + } +#else + // Currently the group membership check is only used in pre-10.1 + // platforms. In 10.1 we need to check the performance penalty + // caused in the instantiation of QContactManager. If the + // performance is too bad, then the MContactDbObserver API needs to + // be changed in 10.1 so that we don't need the group membership + // buffer in the engine level. In other words events like + // EContactDbObserverEventGroupMembersAdded and + // EContactDbObserverEventGroupMembersRemoved need to be added to + // MContactDbObserver. + changeSet.insertChangedContact(id); //group is a contact +#endif + } break; case EContactDbObserverEventOwnCardChanged: - { + if(m_contactsEmitted.contains(id)) + m_contactsEmitted.removeOne(id); + else { QOwnCardPair ownCard(m_currentOwnCardId, QContactLocalId(id)); - changeSet.oldAndNewSelfContactId() = ownCard; + changeSet.setOldAndNewSelfContactId(ownCard); m_currentOwnCardId = QContactLocalId(id); - break; } + break; default: break; // ignore other events } @@ -177,8 +233,62 @@ changeSet.emitSignals(m_engine); } +/* + * Private implementation for updating the buffer containing the members of all + * groups. + */ +void CntSymbianDatabase::updateGroupMembershipsL() +{ + CContactIdArray *groupIds = m_contactDatabase->GetGroupIdListL(); + for (TInt i(0); i < groupIds->Count(); ++i) { + QContactLocalId id = (*groupIds)[i]; + QSet dummySet; + updateGroupMembershipsL(id, dummySet, dummySet); + } + delete groupIds; +} - +/* + * Private implementation for updating the buffer containing the members of a + * group. + */ +void CntSymbianDatabase::updateGroupMembershipsL( + QContactLocalId groupId, + QSet &added, + QSet &removed) +{ + QSet groupMembersNew = groupMembersL(groupId); + QSet groupMembersOld = m_groupContents.value(groupId); + if(groupMembersOld.count() < groupMembersNew.count()) { + added = groupMembersNew - groupMembersOld; + m_groupContents.remove(groupId); + m_groupContents.insert(groupId, groupMembersNew); + } else if(groupMembersOld.count() > groupMembersNew.count()) { + removed = groupMembersOld - groupMembersNew; + m_groupContents.remove(groupId); + m_groupContents.insert(groupId, groupMembersNew); + } +} +/* + * Private implementation for fetching the members of a group. + */ +QSet CntSymbianDatabase::groupMembersL(QContactLocalId groupId) +{ + QSet groupMembers; + CContactItem *contactItem = m_contactDatabase->ReadContactLC(TContactItemId(groupId)); + Q_ASSERT(contactItem && contactItem->Type() == KUidContactGroup); + CContactGroup *group = static_cast(contactItem); + + const CContactIdArray *idArray = group->ItemsContained(); + + //loop through all the contacts and add them to the list + for (int i(0); i < idArray->Count(); i++) { + groupMembers.insert((*idArray)[i]); + } + CleanupStack::PopAndDestroy(contactItem); + + return groupMembers; +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp Mon May 03 12:24:20 2010 +0300 @@ -74,14 +74,14 @@ #define QT_TRYCATCH_LEAVING QT_TRANSLATE_EXCEPTION_TO_SYMBIAN_LEAVE #endif -CntSymbianEngine::CntSymbianEngine(const QMap& parameters, QContactManager::Error& error) +CntSymbianEngine::CntSymbianEngine(const QMap& parameters, QContactManager::Error* error) { - error = QContactManager::NoError; + *error = QContactManager::NoError; m_dataBase = new CntSymbianDatabase(this, error); //Database opened successfully - if(error == QContactManager::NoError) { + if(*error == QContactManager::NoError) { m_managerUri = QContactManager::buildUri(CNT_SYMBIAN_MANAGER_NAME, parameters); m_transformContact = new CntTransformContact; #ifdef SYMBIAN_BACKEND_USE_SQLITE @@ -95,18 +95,6 @@ } } -CntSymbianEngine::CntSymbianEngine(const CntSymbianEngine& other) - : QContactManagerEngine(), - m_dataBase(other.m_dataBase), - m_managerUri(other.m_managerUri), - m_transformContact(other.m_transformContact), - m_contactFilter(other.m_contactFilter), - m_contactSorter(other.m_contactSorter), - m_relationship(other.m_relationship), - m_displayLabel(other.m_displayLabel) -{ -} - CntSymbianEngine::~CntSymbianEngine() { delete m_contactFilter; // needs to be deleted before database @@ -117,11 +105,6 @@ delete m_displayLabel; } -void CntSymbianEngine::deref() -{ - delete this; -} - /*! * 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 either the Symbian backend native filtering or in case of an @@ -130,54 +113,32 @@ QList CntSymbianEngine::contactIds( const QContactFilter& filter, const QList& sortOrders, - QContactManager::Error& error) const + QContactManager::Error* error) const { - error = QContactManager::NoError; + *error = QContactManager::NoError; QList result; - - if (filter.type() == QContactFilter::RelationshipFilter) - { - 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); - } + bool filterSupported(true); + result = m_contactFilter->contacts(filter, sortOrders, filterSupported, error); #ifdef SYMBIAN_BACKEND_USE_SQLITE // Remove possible false positives - if(!filterSupported && error == QContactManager::NotSupportedError) + if(!filterSupported && *error == QContactManager::NotSupportedError) + { result = slowFilter(filter, result, error); - + + //slow sorting until it's supported in SQL requests + result = slowSort(result, sortOrders, error); + } + #else // Remove possible false positives - if(!filterSupported && error == QContactManager::NoError) + if(!filterSupported && *error == QContactManager::NoError) result = slowFilter(filter, result, error); // Sort the matching contacts - if(!sortOrders.isEmpty()&& error == QContactManager::NoError ) { + if(!sortOrders.isEmpty()&& *error == QContactManager::NoError ) { if(m_contactSorter->sortOrderSupported(sortOrders)) { result = m_contactSorter->sort(result, sortOrders, error); } else { @@ -185,11 +146,13 @@ } } #endif - } + return result; } -QList CntSymbianEngine::contactIds(const QList& sortOrders, QContactManager::Error& error) const +#if 0 +// These functions are not used anymore - there is always a filter (which may be the default filter) +QList CntSymbianEngine::contactIds(const QList& sortOrders, QContactManager::Error* error) const { // Check if sorting is supported by backend if(m_contactSorter->sortOrderSupported(sortOrders)) @@ -201,22 +164,22 @@ // Get unsorted contact ids QList noSortOrders; QList unsortedIds = m_contactSorter->contacts(noSortOrders, error); - if (error != QContactManager::NoError) + if (*error != QContactManager::NoError) return QList(); // Sort contacts return slowSort(unsortedIds, sortOrders, error); } -QList CntSymbianEngine::contacts(const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const +QList CntSymbianEngine::contacts(const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error* error) const { - error = QContactManager::NoError; + *error = QContactManager::NoError; QList contacts; QList contactIds = this->contactIds(sortOrders, error); - if (error == QContactManager::NoError ) { + if (*error == QContactManager::NoError ) { foreach (QContactLocalId id, contactIds) { QContact contact = this->contact(id, definitionRestrictions, error); - if (error != QContactManager::NoError) { + if (*error != QContactManager::NoError) { return QList(); // return empty list if error occurred } contacts.append(contact); @@ -224,16 +187,17 @@ } return contacts; } +#endif -QList CntSymbianEngine::contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const +QList CntSymbianEngine::contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fh, QContactManager::Error* error) const { - error = QContactManager::NoError; + *error = QContactManager::NoError; QList contacts; QList contactIds = this->contactIds(filter, sortOrders, error); - if (error == QContactManager::NoError ) { + if (*error == QContactManager::NoError ) { foreach (QContactLocalId id, contactIds) { - QContact contact = this->contact(id, definitionRestrictions, error); - if (error != QContactManager::NoError) { + QContact contact = this->contact(id, fh, error); + if (*error != QContactManager::NoError) { return QList(); // return empty list if error occurred } contacts.append(contact); @@ -250,22 +214,23 @@ * \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, const QStringList& definitionRestrictions, QContactManager::Error& error) const +QContact CntSymbianEngine::contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const { QContact* contact = new QContact(); - TRAPD(err, *contact = fetchContactL(contactId, definitionRestrictions)); + TRAPD(err, *contact = fetchContactL(contactId, fetchHint.detailDefinitionsHint())); CntSymbianTransformError::transformError(err, error); - if(error == QContactManager::NoError) { + if(*error == QContactManager::NoError) { updateDisplayLabel(*contact); //check relationship only if there are no definition restrictions, otherwise //skip this time expensive operation. - if( definitionRestrictions.isEmpty()) { + if( (!fetchHint.optimizationHints() & QContactFetchHint::NoRelationships)) { QContactManager::Error relationshipError; - QList relationships = this->relationships(QString(), contact->id(), QContactRelationshipFilter::Either, relationshipError); + // XXX can also consult fetchHint.relationships list + QList relationships = this->relationships(QString(), contact->id(), QContactRelationship::Either, &relationshipError); if (relationshipError != QContactManager::NoError && relationshipError != QContactManager::DoesNotExistError) { // means that no relationships found - error = relationshipError; + *error = relationshipError; } QContactManagerEngine::setContactRelationships(contact, relationships); } @@ -273,7 +238,7 @@ return *QScopedPointer(contact); } -bool CntSymbianEngine::saveContact(QContact* contact, QContactManager::Error& error) +bool CntSymbianEngine::saveContact(QContact* contact, QContactManager::Error* error) { QContactChangeSet changeSet; TBool ret = doSaveContact(contact, changeSet, error); @@ -282,17 +247,17 @@ } /*! \reimp */ -bool CntSymbianEngine::saveContacts(QList *contacts, QMap *errorMap, QContactManager::Error& error) +bool CntSymbianEngine::saveContacts(QList *contacts, QMap *errorMap, QContactManager::Error* error) { - error = QContactManager::NoError; - + *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; + *error = QContactManager::BadArgumentError; return false; } @@ -300,8 +265,8 @@ for (int i = 0; i < contacts->count(); i++) { QContact current = contacts->at(i); QContactManager::Error functionError = QContactManager::NoError; - if (!doSaveContact(¤t, changeSet, functionError)) { - error = functionError; + if (!doSaveContact(¤t, changeSet, &functionError)) { + *error = functionError; if (errorMap) { errorMap->insert(i, functionError); } @@ -310,7 +275,7 @@ } } changeSet.emitSignals(this); - return (error == QContactManager::NoError); + return (*error == QContactManager::NoError); } /*! @@ -321,7 +286,7 @@ QList CntSymbianEngine::slowFilter( const QContactFilter& filter, const QList& contacts, - QContactManager::Error& error + QContactManager::Error* error ) const { QList result; @@ -329,7 +294,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, QStringList(), error))) + if(QContactManagerEngine::testFilter(filter, contact(id, QContactFetchHint(), error))) result << id; } return result; @@ -338,20 +303,20 @@ QList CntSymbianEngine::slowSort( const QList& contactIds, const QList& sortOrders, - QContactManager::Error& error) const + QContactManager::Error* error) const { // Get unsorted contacts QList unsortedContacts; foreach (QContactLocalId id, contactIds) { - QContact c = contact(id, QStringList(), error); - if (error != QContactManager::NoError) + QContact c = contact(id, QContactFetchHint(), error); + if (*error != QContactManager::NoError) return QList(); unsortedContacts << c; } return QContactManagerEngine::sortContacts(unsortedContacts, sortOrders); } -bool CntSymbianEngine::doSaveContact(QContact* contact, QContactChangeSet& changeSet, QContactManager::Error& error) +bool CntSymbianEngine::doSaveContact(QContact* contact, QContactChangeSet& changeSet, QContactManager::Error* error) { bool ret = false; if(contact && !validateContact(*contact, error)) @@ -367,7 +332,7 @@ QContactManager::Error err; QList localIdList = contactIds(guidFilter, - QList(), err); + QList(), &err); if (err == QContactManager::NoError && localIdList.count() > 0) { QScopedPointer contactId(new QContactId()); contactId->setLocalId(localIdList.at(0)); @@ -378,14 +343,14 @@ // Check parameters if(!contact) { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; ret = false; // Update an existing contact } else if(contact->localId()) { if(contact->id().managerUri() == m_managerUri) { ret = updateContact(*contact, changeSet, error); } else { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; ret = false; } // Create new contact @@ -433,7 +398,7 @@ * \param qtError Qt error code. * \return Error status */ -bool CntSymbianEngine::addContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error& qtError) +bool CntSymbianEngine::addContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error* qtError) { // Attempt to persist contact, trapping errors int err(0); @@ -441,7 +406,7 @@ TRAP(err, id = addContactL(contact)); if(err == KErrNone) { - changeSet.addedContacts().insert(id); + changeSet.insertAddedContact(id); m_dataBase->appendContactEmitted(id); } CntSymbianTransformError::transformError(err, qtError); @@ -487,10 +452,13 @@ contactId->setLocalId(QContactLocalId(id)); contactId->setManagerUri(m_managerUri); contact.setId(*contactId); + CleanupStack::PopAndDestroy(contactItem); + contactItem = 0; //update contact, will add the fields to the already saved group updateContactL(contact); // Transform details that are not available until the contact has been saved + contactItem = m_dataBase->contactDatabase()->ReadContactLC(id); m_transformContact->transformPostSaveDetailsL(*contactItem, contact, *m_dataBase->contactDatabase(), m_managerUri); CleanupStack::PopAndDestroy(contactItem); @@ -512,14 +480,14 @@ * \param qtError Qt error code. * \return Error status. */ -bool CntSymbianEngine::updateContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error& qtError) +bool CntSymbianEngine::updateContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error* qtError) { int err(0); TRAP(err, updateContactL(contact)); if(err == KErrNone) { //TODO: check what to do with groupsChanged - changeSet.changedContacts().insert(contact.localId()); + changeSet.insertChangedContact(contact.localId()); m_dataBase->appendContactEmitted(contact.localId()); } CntSymbianTransformError::transformError(err, qtError); @@ -570,14 +538,14 @@ * \param qtError Qt error code. * \return Error status. */ -bool CntSymbianEngine::removeContact(const QContactLocalId &id, QContactChangeSet& changeSet, QContactManager::Error& qtError) +bool CntSymbianEngine::removeContact(const QContactLocalId &id, QContactChangeSet& changeSet, QContactManager::Error* qtError) { // removeContactL() can't throw c++ exception TRAPD(err, removeContactL(id)); if(err == KErrNone) { //TODO: check what to do with groupsChanged? - changeSet.removedContacts().insert(id); + changeSet.insertRemovedContact(id); m_dataBase->appendContactEmitted(id); } CntSymbianTransformError::transformError(err, qtError); @@ -616,15 +584,15 @@ return 0; } -bool CntSymbianEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error& error) +bool CntSymbianEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error* error) { QContactManager::Error err; - QContactLocalId selfCntId = selfContactId(err); // err ignored + QContactLocalId selfCntId = selfContactId(&err); // err ignored QContactChangeSet changeSet; TBool ret = removeContact(contactId, changeSet, error); if (ret && contactId == selfCntId ) { QOwnCardPair ownCard(selfCntId, QContactLocalId(0)); - changeSet.oldAndNewSelfContactId() = ownCard; + changeSet.setOldAndNewSelfContactId(ownCard); } changeSet.emitSignals(this); return ret; @@ -633,73 +601,74 @@ void CntSymbianEngine::updateDisplayLabel(QContact& contact) const { QContactManager::Error error(QContactManager::NoError); - QString label = synthesizedDisplayLabel(contact, error); + QString label = synthesizedDisplayLabel(contact, &error); if(error == QContactManager::NoError) { - contact = setContactDisplayLabel(label, contact); + setContactDisplayLabel(&contact, label); } } -bool CntSymbianEngine::removeContacts(QList *contactIds, QMap *errorMap, QContactManager::Error& error) +bool CntSymbianEngine::removeContacts(const QList& contactIds, QMap *errorMap, QContactManager::Error* error) { - error = QContactManager::NoError; + *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; + if (contactIds.count() == 0) { + *error = QContactManager::BadArgumentError; return false; } - + QContactManager::Error err; - QContactLocalId selfCntId = selfContactId(err); // err ignored + QContactLocalId selfCntId = selfContactId(&err); // err ignored QContactChangeSet changeSet; - for (int i = 0; i < contactIds->count(); i++) { - QContactLocalId current = contactIds->at(i); + for (int i = 0; i < contactIds.count(); i++) { + QContactLocalId current = contactIds.at(i); QContactManager::Error functionError = QContactManager::NoError; - if (!removeContact(current, changeSet, functionError)) { - error = functionError; + 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; + changeSet.setOldAndNewSelfContactId(ownCard); } } } changeSet.emitSignals(this); - return (error == QContactManager::NoError); + return (*error == QContactManager::NoError); } /* relationships */ -QStringList CntSymbianEngine::supportedRelationshipTypes(const QString& contactType) const +bool CntSymbianEngine::isRelationshipTypeSupported(const QString &relationshipType, const QString &contactType) const { - return m_relationship->supportedRelationshipTypes(contactType); + return m_relationship->isRelationshipTypeSupported(relationshipType, contactType); } -QList CntSymbianEngine::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role, QContactManager::Error& error) const +QList CntSymbianEngine::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const { //retrieve the relationships return m_relationship->relationships(relationshipType, participantId, role, error); } -bool CntSymbianEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error& error) +bool CntSymbianEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error* error) { //affected contacts QContactChangeSet changeSet; //save the relationship - bool returnValue = m_relationship->saveRelationship(&changeSet.addedRelationshipsContacts(), relationship, error); + QSet affectedContactIds; + bool returnValue = m_relationship->saveRelationship(&affectedContactIds, relationship, error); + changeSet.insertAddedRelationshipsContacts(affectedContactIds.toList()); //add contacts to the list that shouldn't be emitted - m_dataBase->appendContactsEmitted(changeSet.addedRelationshipsContacts().toList()); + m_dataBase->appendContactsEmitted(affectedContactIds.toList()); //emit signals changeSet.emitSignals(this); @@ -707,16 +676,18 @@ return returnValue; } -QList CntSymbianEngine::saveRelationships(QList* relationships, QContactManager::Error& error) +bool CntSymbianEngine::saveRelationships(QList* relationships, QMap* errorMap, QContactManager::Error* error) { //affected contacts QContactChangeSet changeSet; //save the relationships - QList returnValue = m_relationship->saveRelationships(&changeSet.addedRelationshipsContacts(), relationships, error); + QSet affectedContactIds; + bool returnValue = m_relationship->saveRelationships(&affectedContactIds, relationships, errorMap, error); + changeSet.insertAddedRelationshipsContacts(affectedContactIds.toList()); //add contacts to the list that shouldn't be emitted - m_dataBase->appendContactsEmitted(changeSet.addedRelationshipsContacts().toList()); + m_dataBase->appendContactsEmitted(affectedContactIds.toList()); //emit signals changeSet.emitSignals(this); @@ -724,16 +695,18 @@ return returnValue; } -bool CntSymbianEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error& error) +bool CntSymbianEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error* error) { //affected contacts QContactChangeSet changeSet; //remove the relationship - bool returnValue = m_relationship->removeRelationship(&changeSet.removedRelationshipsContacts(), relationship, error); + QSet affectedContactIds; + bool returnValue = m_relationship->removeRelationship(&affectedContactIds, relationship, error); + changeSet.insertRemovedRelationshipsContacts(affectedContactIds.toList()); //add contacts to the list that shouldn't be emitted - m_dataBase->appendContactsEmitted(changeSet.removedRelationshipsContacts().toList()); + m_dataBase->appendContactsEmitted(affectedContactIds.toList()); //emit signals changeSet.emitSignals(this); @@ -741,16 +714,18 @@ return returnValue; } -QList CntSymbianEngine::removeRelationships(const QList& relationships, QContactManager::Error& error) +bool CntSymbianEngine::removeRelationships(const QList& relationships, QMap* errorMap, QContactManager::Error* error) { //affected contacts QContactChangeSet changeSet; //remove the relationships - QList returnValue = m_relationship->removeRelationships(&changeSet.removedRelationshipsContacts(), relationships, error); + QSet affectedContactIds; + bool returnValue = m_relationship->removeRelationships(&affectedContactIds, relationships, errorMap, error); + changeSet.insertRemovedRelationshipsContacts(affectedContactIds.toList()); //add contacts to the list that shouldn't be emitted - m_dataBase->appendContactsEmitted(changeSet.removedRelationshipsContacts().toList()); + m_dataBase->appendContactsEmitted(affectedContactIds.toList()); //emit signals changeSet.emitSignals(this); @@ -758,15 +733,15 @@ return returnValue; } -QMap CntSymbianEngine::detailDefinitions(const QString& contactType, QContactManager::Error& error) const +QMap CntSymbianEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const { // TODO: update for SIM contacts later if (contactType != QContactType::TypeContact && contactType != QContactType::TypeGroup) { - error = QContactManager::InvalidContactTypeError; + *error = QContactManager::InvalidContactTypeError; return QMap(); } - error = QContactManager::NoError; + *error = QContactManager::NoError; // First get the default definitions QMap > schemaDefinitions = QContactManagerEngine::schemaDefinitions(); @@ -821,16 +796,16 @@ } /* Synthesise the display label of a contact */ -QString CntSymbianEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const +QString CntSymbianEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const { - error = QContactManager::NoError; + *error = QContactManager::NoError; return m_displayLabel->synthesizedDisplayLabel(contact, error); } -bool CntSymbianEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error) +bool CntSymbianEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error* error) { if (contactId <= 0) { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; return false; } @@ -845,14 +820,14 @@ return (err==KErrNone); } -QContactLocalId CntSymbianEngine::selfContactId(QContactManager::Error& error) const +QContactLocalId CntSymbianEngine::selfContactId(QContactManager::Error* error) const { - error = QContactManager::NoError; + *error = QContactManager::NoError; QContactLocalId id = 0; TContactItemId myCard = m_dataBase->contactDatabase()->OwnCardId(); if (myCard < 0) { - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; } else { id = myCard; @@ -960,15 +935,13 @@ QContactFetchRequest* r = static_cast(currentRequest); QContactFilter filter = r->filter(); QList sorting = r->sorting(); - QStringList defs = r->definitionRestrictions(); + QContactFetchHint fh = r->fetchHint(); QContactManager::Error operationError; - QList requestedContacts = QContactManagerEngine::contacts(filter, sorting, defs, operationError); + QList requestedContacts = contacts(filter, sorting, fh, &operationError); // update the request with the results. - if (!requestedContacts.isEmpty() || operationError != QContactManager::NoError) - updateContactFetchRequest(r, requestedContacts, operationError); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateContactFetchRequest(r, requestedContacts, operationError, QContactAbstractRequest::FinishedState); // emit resultsAvailable() } break; @@ -979,11 +952,9 @@ QList sorting = r->sorting(); QContactManager::Error operationError = QContactManager::NoError; - QList requestedContactIds = QContactManagerEngine::contactIds(filter, sorting, operationError); + QList requestedContactIds = contactIds(filter, sorting, &operationError); - if (!requestedContactIds.isEmpty() || operationError != QContactManager::NoError) - updateContactLocalIdFetchRequest(r, requestedContactIds, operationError); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateContactLocalIdFetchRequest(r, requestedContactIds, operationError, QContactAbstractRequest::FinishedState); } break; @@ -994,10 +965,9 @@ QContactManager::Error operationError = QContactManager::NoError; QMap errorMap; - saveContacts(&contacts, &errorMap, operationError); + saveContacts(&contacts, &errorMap, &operationError); - updateContactSaveRequest(r, contacts, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateContactSaveRequest(r, contacts, operationError, errorMap, QContactAbstractRequest::FinishedState); // there will always be results of some form. emit resultsAvailable(). } break; @@ -1015,17 +985,15 @@ for (int i = 0; i < contactsToRemove.size(); i++) { QContactManager::Error tempError; - removeContact(contactsToRemove.at(i), changeSet, tempError); + removeContact(contactsToRemove.at(i), changeSet, &tempError); + errorMap.insert(i, tempError); if (tempError != QContactManager::NoError) { - errorMap.insert(i, tempError); operationError = tempError; } } - if (!errorMap.isEmpty() || operationError != QContactManager::NoError) - updateContactRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateContactRemoveRequest(r, operationError, errorMap, QContactAbstractRequest::FinishedState); } break; @@ -1037,84 +1005,41 @@ QMap requestedDefinitions; QStringList names = r->definitionNames(); if (names.isEmpty()) - names = detailDefinitions(r->contactType(), operationError).keys(); // all definitions. + 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); + QContactDetailDefinition current = detailDefinition(names.at(i), r->contactType(), &tempError); requestedDefinitions.insert(names.at(i), current); + errorMap.insert(i, tempError); if (tempError != QContactManager::NoError) { - errorMap.insert(i, tempError); operationError = tempError; } } - if (!errorMap.isEmpty() || !requestedDefinitions.isEmpty() || operationError != QContactManager::NoError) - updateDefinitionFetchRequest(r, requestedDefinitions, operationError, errorMap); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateDefinitionFetchRequest(r, requestedDefinitions, operationError, errorMap, QContactAbstractRequest::FinishedState); } break; -// 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::DetailDefinitionSaveRequest: + { + // symbian engine currently does not support mutable definitions. + } + break; + + case QContactAbstractRequest::DetailDefinitionRemoveRequest: + { + // symbian engine currently does not support mutable definitions. + } + break; case QContactAbstractRequest::RelationshipFetchRequest: { QContactRelationshipFetchRequest* r = static_cast(currentRequest); QContactManager::Error operationError = QContactManager::NoError; QList operationErrors; - QList allRelationships = relationships(QString(), QContactId(), QContactRelationshipFilter::Either, operationError); + QList allRelationships = relationships(QString(), QContactId(), QContactRelationship::Either, &operationError); QList requestedRelationships; // select the requested relationships. @@ -1130,9 +1055,7 @@ } // update the request with the results. - if (!requestedRelationships.isEmpty() || operationError != QContactManager::NoError) - updateRelationshipFetchRequest(r, requestedRelationships, operationError); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateRelationshipFetchRequest(r, requestedRelationships, operationError, QContactAbstractRequest::FinishedState); } break; @@ -1143,23 +1066,17 @@ QList relationshipsToRemove = r->relationships(); QMap errorMap; - bool foundMatch = false; for (int i = 0; i < relationshipsToRemove.size(); i++) { QContactManager::Error tempError; - removeRelationship(relationshipsToRemove.at(i), tempError); + removeRelationship(relationshipsToRemove.at(i), &tempError); + errorMap.insert(i, tempError); if (tempError != QContactManager::NoError) { - errorMap.insert(i, tempError); operationError = tempError; } } - if (foundMatch == false && operationError == QContactManager::NoError) - operationError = QContactManager::DoesNotExistError; - - if (!errorMap.isEmpty() || operationError != QContactManager::NoError) - updateRelationshipRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateRelationshipRemoveRequest(r, operationError, errorMap, QContactAbstractRequest::FinishedState); } break; @@ -1174,18 +1091,17 @@ QContactManager::Error tempError; for (int i = 0; i < requestRelationships.size(); i++) { QContactRelationship current = requestRelationships.at(i); - saveRelationship(¤t, tempError); + saveRelationship(¤t, &tempError); savedRelationships.append(current); + errorMap.insert(i, tempError); if (tempError != QContactManager::NoError) { - errorMap.insert(i, tempError); operationError = tempError; } } // update the request with the results. - updateRelationshipSaveRequest(r, savedRelationships, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateRelationshipSaveRequest(r, savedRelationships, operationError, errorMap, QContactAbstractRequest::FinishedState); } break; @@ -1199,7 +1115,7 @@ #ifndef PBK_UNIT_TEST /* Factory lives here in the basement */ -QContactManagerEngine* CntSymbianFactory::engine(const QMap& parameters, QContactManager::Error& error) +QContactManagerEngine* CntSymbianFactory::engine(const QMap& parameters, QContactManager::Error* error) { return new CntSymbianEngine(parameters, error); } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiantransformerror.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiantransformerror.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/cntsymbiantransformerror.cpp Mon May 03 12:24:20 2010 +0300 @@ -46,59 +46,59 @@ * \param symbianError Symbian error. * \param QtError Qt error. */ -void CntSymbianTransformError::transformError(TInt symbianError, QContactManager::Error& qtError) +void CntSymbianTransformError::transformError(TInt symbianError, QContactManager::Error* qtError) { switch(symbianError) { case KErrNone: { - qtError = QContactManager::NoError; + *qtError = QContactManager::NoError; break; } case KErrNotFound: { - qtError = QContactManager::DoesNotExistError; + *qtError = QContactManager::DoesNotExistError; break; } case KErrAlreadyExists: { - qtError = QContactManager::AlreadyExistsError; + *qtError = QContactManager::AlreadyExistsError; break; } case KErrLocked: { - qtError = QContactManager::LockedError; + *qtError = QContactManager::LockedError; break; } case KErrAccessDenied: case KErrPermissionDenied: { - qtError = QContactManager::PermissionsError; + *qtError = QContactManager::PermissionsError; break; } case KErrNoMemory: { - qtError = QContactManager::OutOfMemoryError; + *qtError = QContactManager::OutOfMemoryError; break; } case KErrNotSupported: { - qtError = QContactManager::NotSupportedError; + *qtError = QContactManager::NotSupportedError; break; } case KErrArgument: { - qtError = QContactManager::BadArgumentError; + *qtError = QContactManager::BadArgumentError; break; } case KErrInvalidContactDetail: { - qtError = QContactManager::InvalidDetailError; + *qtError = QContactManager::InvalidDetailError; break; } default: { - qtError = QContactManager::UnspecifiedError; + *qtError = QContactManager::UnspecifiedError; break; } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdbinfo.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdbinfo.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdbinfo.cpp Mon May 03 12:24:20 2010 +0300 @@ -40,24 +40,20 @@ ****************************************************************************/ #include #include "cntdbinfo.h" -#include "cntmodelextuids.h" +#include "cntfilterdetail.h" CntDbInfo::CntDbInfo() { + QString id("%1.%2"); + contactsTableIdColumNameMapping.insert(id.arg(QContactName::DefinitionName, QContactName::FieldFirstName), "first_name"); + contactsTableIdColumNameMapping.insert(id.arg(QContactName::DefinitionName, QContactName::FieldLastName), "last_name"); + contactsTableIdColumNameMapping.insert(id.arg(QContactOrganization::DefinitionName, QContactOrganization::FieldName), "company_name"); + contactsTableIdColumNameMapping.insert(id.arg(QContactName::DefinitionName, QContactName::FieldCustomLabel), "text_fields"); - 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 ); + commAddrTableIdColumNameMapping.insert(id.arg(QContactOnlineAccount::DefinitionName, QContactOnlineAccount::FieldSubTypes), QPair(ESipAddress,true)); + commAddrTableIdColumNameMapping.insert(id.arg(QContactEmailAddress::DefinitionName, QContactEmailAddress::FieldEmailAddress), QPair(EEmailAddress,false)); + commAddrTableIdColumNameMapping.insert(id.arg(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes), QPair(EPhoneNumber,true)); } CntDbInfo::~CntDbInfo() @@ -67,16 +63,17 @@ commAddrTableIdColumNameMapping.clear(); } -bool CntDbInfo::SupportsUid(int uid) - { - if(contactsTableIdColumNameMapping.contains(uid) ) +bool CntDbInfo::SupportsDetail(QString definitionName, QString fieldName) +{ + QString fieldId = QString("%1.%2").arg(definitionName, fieldName); + if (contactsTableIdColumNameMapping.contains(fieldId)) return true; - else if (commAddrTableIdColumNameMapping.contains(uid)) + else if (commAddrTableIdColumNameMapping.contains(fieldId)) return true; else return false; - - } +} + /*! * Converts filed id to column name of the database table. * QContactManager::contacts function. @@ -84,34 +81,99 @@ * \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 +void CntDbInfo::getDbTableAndColumnName( const QString definitionName, + const QString fieldName, + QString& tableName, + QString& columnName, + bool& isSubType) const { - //Uncomment later - + //check contacts table + QString fieldId = definitionName + "." + fieldName; - //check contacts table columnName = ""; tableName = ""; + isSubType = false; if (contactsTableIdColumNameMapping.contains(fieldId)){ columnName = contactsTableIdColumNameMapping.value(fieldId); tableName = "contact"; } - if( (columnName.isEmpty()) || (tableName.isEmpty())){ + 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"; - } - + if (commAddrTableIdColumNameMapping.contains(fieldId)) { + // communication address table has slightly differnt format, so we make the column name as + // "type = and value " + QPair val = commAddrTableIdColumNameMapping.value(fieldId); + int typeval = val.first; + isSubType = val.second; + columnName = QString(" TYPE = %1").arg(typeval); + columnName += " and value " ; + tableName = "comm_addr"; + } } - } +QString CntDbInfo::getSortQuery( const QList &sortOrders, + const QString& selectQuery, + QContactManager::Error* error) +{ + // Set to initial select query + QString sortQuery = selectQuery; + + if(*error == QContactManager::NoError) + { + QList list; + foreach(const QContactSortOrder& s, sortOrders ) + { + QString tableName; + QString columnName; + bool isSubType; + + // Get column names for sort order + getDbTableAndColumnName(s.detailDefinitionName(), s.detailFieldName(), tableName, columnName, isSubType); + + if (tableName.compare("contact") != 0 || columnName.isEmpty()) { + // Skip invalid sort clause + continue; + } + else { + if (s.direction() == Qt::DescendingOrder) { + QString col; + if (s.caseSensitivity() == Qt::CaseInsensitive) + col = ' ' + columnName + ' ' + "COLLATE NOCASE DESC"; + else + col = ' ' + columnName + ' ' + "DESC"; + list.append(col); + } + else { + // Default sort order + QString col; + if(s.caseSensitivity() == Qt::CaseInsensitive) + col= ' ' + columnName + ' ' + "COLLATE NOCASE ASC"; + else + col= ' ' + columnName + ' ' + "ASC"; + list.append(col); + } + } + } + + if (list.count() > 0) { + // Recreate query + // SELECT DISTINCT contact_id FROM contact WHERE contact_id in ( + // SELECT .. + // ) ORDER BY + sortQuery = " SELECT DISTINCT contact_id FROM contact WHERE contact_id in ("; + QString clause = " ORDER BY " + list.at(0); + for (int i = 1; i < list.size(); ++i) { + clause += " ," + list.at(i); + } + sortQuery += selectQuery + ')'; + sortQuery += clause; + } + } + + return sortQuery; +} + + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdisplaylabelsqlfilter.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdisplaylabelsqlfilter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntdisplaylabelsqlfilter.cpp Mon May 03 12:24:20 2010 +0300 @@ -59,9 +59,9 @@ void CntDisplayLabelSqlFilter::createSqlQuery(const QContactDetailFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { - error = QContactManager::NoError; + *error = QContactManager::NoError; //get the contact fields that should be checked CntDisplayLabel displayLabel; @@ -101,12 +101,12 @@ sqlQuery += " AND (" + subQuery + ')'; } - error = QContactManager::NoError; + *error = QContactManager::NoError; } //if specified more filter criterias than contact fields return error else if(searchStrings.count() > contactFields.count()){ - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; } } @@ -171,12 +171,12 @@ //Name detail if(detail.first == QContactName::DefinitionName) { - if(detail.second == QContactName::FieldFirst) + if(detail.second == QContactName::FieldFirstName) { columnName = "first_name"; } - else if(detail.second == QContactName::FieldLast) + else if(detail.second == QContactName::FieldLastName) { columnName = "last_name"; } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilteraction.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilteraction.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilteraction.cpp Mon May 03 12:24:20 2010 +0300 @@ -60,14 +60,14 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error* error) { Q_UNUSED(sortOrders); Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QList(); } QList idList; @@ -77,7 +77,7 @@ createSelectQuery( filter,sqlQuery,error); //fetch the contacts - if(error != QContactManager::NotSupportedError) + if(*error != QContactManager::NotSupportedError) { idList = m_srvConnection.searchContacts(sqlQuery, error); } @@ -103,13 +103,13 @@ void CntFilterAction::createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; } //For default filter, just return the below query sqlQuery = ""; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterchangelog.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterchangelog.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterchangelog.cpp Mon May 03 12:24:20 2010 +0300 @@ -60,14 +60,14 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error* error) { Q_UNUSED(sortOrders); Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QList(); } QList idList; @@ -77,7 +77,7 @@ createSelectQuery( filter,sqlQuery,error); //fetch the contacts - if(error != QContactManager::NotSupportedError) + if(*error != QContactManager::NotSupportedError) { idList = m_srvConnection.searchContacts(sqlQuery, error); } @@ -103,13 +103,13 @@ void CntFilterChangeLog::createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; } //Not supported yet. sqlQuery = ""; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdefault.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdefault.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdefault.cpp Mon May 03 12:24:20 2010 +0300 @@ -60,14 +60,14 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error* error) { Q_UNUSED(sortOrders); Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QList(); } QList idList; @@ -77,7 +77,7 @@ createSelectQuery( filter,sqlQuery,error); //fetch the contacts - if(error == QContactManager::NoError) + if(*error == QContactManager::NoError) { idList = m_srvConnection.searchContacts(sqlQuery, error); } @@ -101,13 +101,13 @@ void CntFilterDefault::createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetail.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetail.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetail.cpp Mon May 03 12:24:20 2010 +0300 @@ -42,7 +42,6 @@ #include #include "cntfilterdetail.h" -#include "cnttransformcontact.h" #include "cntfilterdetaildisplaylabel.h" //todo rename class to follow naming pattern CntFilterDetailDisplayLabel #include "cntsqlsearch.h" @@ -74,25 +73,25 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error* error) { - Q_UNUSED(sortOrders); Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed if(!filterSupported(filter) ) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QList(); } QList idList; QContactDetailFilter detailFilter(filter); QString sqlQuery; //Check for phonenumber. Special handling needed - if(detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName ) + if( (detailFilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName ) && + (detailFilter.detailFieldName() != QContactPhoneNumber::FieldSubTypes)) { //Handle phonenumber ... - idList = HandlePhonenumberDetailFilter(filter); + } else if (detailFilter.matchFlags() == QContactFilter::MatchKeypadCollation) { @@ -104,10 +103,12 @@ else { createSelectQuery(filter,sqlQuery,error); - if(error == QContactManager::NoError) + QString sortQuery = m_dbInfo.getSortQuery(sortOrders, sqlQuery, error); + + if(*error == QContactManager::NoError) { //fetch the contacts - idList = m_srvConnection.searchContacts(sqlQuery, error); + idList = m_srvConnection.searchContacts(sortQuery, error); } } @@ -131,12 +132,12 @@ void CntFilterDetail::createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { if(!filterSupported(filter) ) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return; } QContactDetailFilter detailFilter(filter); @@ -173,7 +174,7 @@ QString sqlWhereClause; getTableNameWhereClause(detailFilter,tableName,sqlWhereClause,error); //Create the sql query - sqlQuery += "SELECT DISTINCT contact_id FROM " + tableName + " WHERE " + sqlWhereClause; + sqlQuery += "SELECT DISTINCT contact_id FROM " + tableName + " WHERE " + sqlWhereClause; } } @@ -183,7 +184,7 @@ */ void CntFilterDetail::updateForMatchFlag( const QContactDetailFilter& filter, QString& fieldToUpdate , - QContactManager::Error& error) const + QContactManager::Error* error) const { // Modify the filed depending on the query switch(filter.matchFlags()) @@ -194,7 +195,7 @@ // " ='xyz'" fieldToUpdate = " ='" + filter.value().toString() + '\''; - error = QContactManager::NoError; + *error = QContactManager::NoError; break; } case QContactFilter::MatchContains: @@ -202,7 +203,7 @@ // Pattern for MatchContains: // " LIKE '%xyz%'" fieldToUpdate = " LIKE '%" + filter.value().toString() + "%'" ; - error = QContactManager::NoError; + *error = QContactManager::NoError; break; } case QContactFilter::MatchStartsWith: @@ -210,7 +211,7 @@ // Pattern for MatchStartsWith: // " LIKE 'xyz%'" fieldToUpdate = " LIKE '" + filter.value().toString() + "%'" ; - error = QContactManager::NoError; + *error = QContactManager::NoError; break; } case QContactFilter::MatchEndsWith: @@ -218,22 +219,22 @@ // Pattern for MatchEndsWith: // " LIKE '%xyz'" fieldToUpdate = " LIKE '%" + filter.value().toString() + '\'' ; - error = QContactManager::NoError; + *error = QContactManager::NoError; break; } case QContactFilter::MatchFixedString: { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; break; } case QContactFilter::MatchCaseSensitive: { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; break; } default: { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; break; } } @@ -243,45 +244,43 @@ void CntFilterDetail::getTableNameWhereClause( const QContactDetailFilter& detailfilter, QString& tableName, QString& sqlWhereClause , - QContactManager::Error& error) const + QContactManager::Error* error) const { //Get the table name and the column name + QString columnName; bool isSubType; - QString columnName; + + m_dbInfo.getDbTableAndColumnName(detailfilter.detailDefinitionName(), detailfilter.detailFieldName(), tableName, columnName, isSubType); - //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 if tableName is empty + if(tableName.isEmpty()) + { + *error = QContactManager::NotSupportedError; return; - } + } //check columnName - if(columnName.isEmpty()) { - error = QContactManager::NotSupportedError; + if(columnName.isEmpty()) + { + *error = QContactManager::NotSupportedError; return; - } - else if(isSubType) { + } + else if (isSubType) + { sqlWhereClause += columnName; sqlWhereClause += " NOT NULL "; - } - else { - + } + 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) +QList CntFilterDetail::HandlePredictiveSearchFilter(const QContactFilter& filter,QContactManager::Error* error) { QString sqlQuery; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetaildisplaylabel.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetaildisplaylabel.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetaildisplaylabel.cpp Mon May 03 12:24:20 2010 +0300 @@ -79,7 +79,7 @@ void CntFilterDetailDisplayLabel::createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { //Commented currently since this will be checked in contacts call intially @@ -87,7 +87,7 @@ { const QContactDetailFilter detailFilter(filter); - error = QContactManager::NoError; + *error = QContactManager::NoError; //get the contact fields that should be checked CntDisplayLabel displayLabel; @@ -127,12 +127,12 @@ sqlQuery += " AND (" + subQuery + ')'; } - error = QContactManager::NoError; + *error = QContactManager::NoError; } //if specified more filter criterias than contact fields return error else if(searchStrings.count() > contactFields.count()){ - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; } } @@ -140,7 +140,7 @@ QString CntFilterDetailDisplayLabel::createSelectQuery(const QContactFilter& filter, const QList& sortOrders, - QContactManager::Error& error) const + QContactManager::Error* error) const { Q_UNUSED(sortOrders); QString result; @@ -149,7 +149,7 @@ { const QContactDetailFilter detailFilter(filter); - error = QContactManager::NoError; + *error = QContactManager::NoError; //get the contact fields that should be checked CntDisplayLabel displayLabel; @@ -189,12 +189,12 @@ result += " AND (" + subQuery + ')'; } - error = QContactManager::NoError; + *error = QContactManager::NoError; } //if specified more filter criterias than contact fields return error else if(searchStrings.count() > contactFields.count()){ - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; } } @@ -262,12 +262,12 @@ //Name detail if(detail.first == QContactName::DefinitionName) { - if(detail.second == QContactName::FieldFirst) + if(detail.second == QContactName::FieldFirstName) { columnName = "first_name"; } - else if(detail.second == QContactName::FieldLast) + else if(detail.second == QContactName::FieldLastName) { columnName = "last_name"; } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetailrange.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetailrange.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterdetailrange.cpp Mon May 03 12:24:20 2010 +0300 @@ -61,14 +61,14 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error* error) { Q_UNUSED(sortOrders); Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QList(); } QList idList; @@ -78,7 +78,7 @@ createSelectQuery( filter,sqlQuery,error); //fetch the contacts - if(error != QContactManager::NotSupportedError) + if(*error != QContactManager::NotSupportedError) { idList = m_srvConnection.searchContacts(sqlQuery, error); } @@ -103,13 +103,13 @@ void CntFilterdetailrange::createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; } //Not yet supported sqlQuery = ""; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterintersection.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterintersection.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterintersection.cpp Mon May 03 12:24:20 2010 +0300 @@ -45,7 +45,6 @@ #include "cntfilterdefault.h" #include "cntfilterrelationship.h" #include "cnttransformcontact.h" -#include "qcontactintersectionfilter.h" CntFilterIntersection::CntFilterIntersection(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) : m_contactdatabase(contactDatabase), @@ -65,23 +64,24 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error* error) { Q_UNUSED(sortOrders); Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed if(filterSupported(filter) == false) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QList(); } QList idList; - QString sqlQuery; - this->createSelectQuery( filter,sqlQuery,error) ; + QString sqlQuery; + createSelectQuery(filter,sqlQuery,error); + QString sortQuery = m_dbInfo.getSortQuery(sortOrders, sqlQuery, error); //fetch the contacts - if(error == QContactManager::NoError ) + if(*error == QContactManager::NoError ) { - idList = m_srvConnection.searchContacts(sqlQuery, error); + idList = m_srvConnection.searchContacts(sortQuery, error); } return idList; } @@ -100,13 +100,13 @@ void CntFilterIntersection::createSelectQuery(const QContactFilter& filter, QString& selectquery, - QContactManager::Error& error) + QContactManager::Error* error) { const QContactIntersectionFilter& intersectionfilter = static_cast(filter); if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return; } QList individualFilters = intersectionfilter.filters(); @@ -120,7 +120,7 @@ QString query; getSelectQueryforFilter(individualFilters[i],query,error); - if(error == QContactManager::NoError ) + if(*error == QContactManager::NoError ) { selectquery.append(" INTERSECT "); selectquery += query; @@ -130,7 +130,8 @@ } -void CntFilterIntersection::getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error& error) + +void CntFilterIntersection::getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error* error) { switch(filter.type()) { @@ -145,7 +146,7 @@ QContactDetailFilter detailfilter(filter); if(detailfilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName ) { - error=QContactManager::NotSupportedError; + *error=QContactManager::NotSupportedError; } else { @@ -178,7 +179,7 @@ } default: { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; break; } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterinvalid.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterinvalid.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterinvalid.cpp Mon May 03 12:24:20 2010 +0300 @@ -60,7 +60,7 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error* error) { Q_UNUSED(filter); Q_UNUSED(sortOrders); @@ -75,22 +75,22 @@ bool CntFilterInvalid::filterSupported(const QContactFilter& filter) { bool result = false; - if(QContactFilter::InvalidFilter == filter.type()) - { - result = true; - } + if(QContactFilter::InvalidFilter == filter.type()) + { + result = true; + } - return result; + return result; } void CntFilterInvalid::createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { - Q_UNUSED(filter); Q_UNUSED(sqlQuery); - Q_UNUSED(error); - //Not implementation needed in this case - + if(!filterSupported(filter)) + { + *error = QContactManager::NotSupportedError; + } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterlocalid.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterlocalid.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterlocalid.cpp Mon May 03 12:24:20 2010 +0300 @@ -59,14 +59,14 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error* error) { Q_UNUSED(sortOrders); Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QList(); } QList idList; @@ -76,7 +76,7 @@ createSelectQuery( filter,sqlQuery,error); //fetch the contacts - if(error != QContactManager::NotSupportedError) + if(*error != QContactManager::NotSupportedError) { idList = m_srvConnection.searchContacts(sqlQuery, error); } @@ -101,13 +101,13 @@ void CntFilterLocalId::createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; } //Not yet supported sqlQuery = ""; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterrelationship.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterrelationship.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterrelationship.cpp Mon May 03 12:24:20 2010 +0300 @@ -40,14 +40,13 @@ ****************************************************************************/ #include "cntfilterrelationship.h" -#include "qcontactrelationshipfilter.h" #include "cnttransformcontact.h" QTM_USE_NAMESPACE - - -CntFilterRelationship::CntFilterRelationship(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) +CntFilterRelationship::CntFilterRelationship( CContactDatabase& contactDatabase, + CntSymbianSrvConnection &cntServer, + CntDbInfo& dbInfo) : m_contactdatabase(contactDatabase), m_srvConnection(cntServer), m_dbInfo(dbInfo) @@ -64,23 +63,23 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error *error) { - Q_UNUSED(sortOrders); Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed - if(!filterSupported(filter) ) - { - error = QContactManager::NotSupportedError; + if (!filterSupported(filter)) { + *error = QContactManager::NotSupportedError; return QList(); } QList idList; - QString sqlQuery; - createSelectQuery(filter,sqlQuery,error); - //fetch the contacts - if(error == QContactManager::NoError ) + QString sqlQuery, sortQuery; + + createSelectQuery(filter, sqlQuery, error); + sortQuery = m_dbInfo.getSortQuery(sortOrders, sqlQuery, error); + + if(*error == QContactManager::NoError ) { - idList = m_srvConnection.searchContacts(sqlQuery, error); + idList = m_srvConnection.searchContacts(sortQuery, error); } return idList; } @@ -89,11 +88,9 @@ bool CntFilterRelationship::filterSupported(const QContactFilter& filter) { bool result = false; - if(QContactFilter::RelationshipFilter == filter.type()) - { + if (QContactFilter::RelationshipFilter == filter.type()) { QContactRelationshipFilter relationfilter(filter); - if(relationfilter.relationshipType() == QContactRelationship::HasMember) - { + if(relationfilter.relationshipType() == QContactRelationship::HasMember) { result = true; } } @@ -103,38 +100,37 @@ void CntFilterRelationship::createSelectQuery(const QContactFilter& filter, QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { - if(!filterSupported(filter)) - { - error = QContactManager::NotSupportedError; + if (!filterSupported(filter)) { + *error = QContactManager::NotSupportedError; return; } QContactRelationshipFilter relationfilter(filter); QContactId id_to_search = relationfilter.relatedContactId(); - if(relationfilter.relatedContactRole() == QContactRelationshipFilter::First ) + if(relationfilter.relatedContactRole() == QContactRelationship::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 ) + else if(relationfilter.relatedContactRole() == QContactRelationship::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 ) + else if(relationfilter.relatedContactRole() == QContactRelationship::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()); + 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 + QContactManager::Error* error) const { Q_UNUSED(relationfilter); Q_UNUSED(sqlquery); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterunion.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterunion.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntfilterunion.cpp Mon May 03 12:24:20 2010 +0300 @@ -45,7 +45,6 @@ #include "cntfilterrelationship.h" #include "cntfilterintersection.h" #include "cnttransformcontact.h" -#include "qcontactunionfilter.h" CntFilterUnion::CntFilterUnion(CContactDatabase& contactDatabase,CntSymbianSrvConnection &cntServer,CntDbInfo& dbInfo) : m_contactdatabase(contactDatabase), @@ -65,23 +64,24 @@ const QContactFilter &filter, const QList &sortOrders, bool &filterSupportedflag, - QContactManager::Error &error) + QContactManager::Error* error) { Q_UNUSED(sortOrders); Q_UNUSED(filterSupportedflag); //Check if any invalid filter is passed if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QList(); } QList idList; QString sqlQuery; - this->createSelectQuery( filter,sqlQuery,error) ; + createSelectQuery(filter,sqlQuery,error); + QString sortQuery = m_dbInfo.getSortQuery(sortOrders, sqlQuery, error); //fetch the contacts - if(error == QContactManager::NoError ) + if(*error == QContactManager::NoError ) { - idList = m_srvConnection.searchContacts(sqlQuery, error); + idList = m_srvConnection.searchContacts(sortQuery, error); } return idList; } @@ -102,13 +102,13 @@ void CntFilterUnion::createSelectQuery(const QContactFilter& filter, QString& selectquery, - QContactManager::Error& error) + QContactManager::Error* error) { const QContactUnionFilter& unionfilter = static_cast(filter); if(!filterSupported(filter)) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return; } QList individualFilters = unionfilter.filters(); @@ -122,7 +122,7 @@ QString query; getSelectQueryforFilter(individualFilters[i],query,error); - if(error == QContactManager::NoError ) + if(*error == QContactManager::NoError ) { selectquery.append(" UNION "); selectquery += query; @@ -132,7 +132,8 @@ } -void CntFilterUnion::getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error& error) + +void CntFilterUnion::getSelectQueryforFilter(const QContactFilter& filter,QString& sqlSelectQuery,QContactManager::Error* error) { switch(filter.type()) { @@ -147,7 +148,7 @@ QContactDetailFilter detailfilter(filter); if(detailfilter.detailDefinitionName() == QContactPhoneNumber::DefinitionName ) { - error=QContactManager::NotSupportedError; + *error=QContactManager::NotSupportedError; } else { @@ -180,7 +181,7 @@ } default: { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; break; } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsqlsearch.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsqlsearch.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsqlsearch.cpp Mon May 03 12:24:20 2010 +0300 @@ -42,58 +42,87 @@ #include "cntsqlsearch.h" -const char LimitLength = 15; -const char LowerLimitPadding = '0'; -const char UpperLimitPadding = 'F'; +const char KLimitLength = 15; +const int KTwoTokens = 2; +const int KOneToken = 1; +const char KLowerLimitPadding = '0'; +const char KUpperLimitPadding = 'F'; +const int KMinimumSearchPatternLength = 1; + + +#define ORDER_BY_FIRSTNAME_LASTNAME " ORDER BY first_name, last_name ASC;" +#define SELECT_CONTACT_ID "SELECT contact_id FROM " + +// TODO: Since the column names are repeated several times, replace them with +// shorter names like w, x, y & z. Also replace contact_id by id etc. + +// Predictive search table's columns +const QString KColumn1 = "nbr"; +const QString KColumn2 = "nbr2"; +const QString KColumn3 = "nbr3"; +const QString KColumn4 = "nbr4"; CntSqlSearch::CntSqlSearch() -{ + { + } - -} +// Basic cases: +// 1: "0", "5" +// Just one digit. Select all contact ids from the table. No need to compare +// values. +// +// 2: "123", "01", "10", "010", "00" +// No zeros which have non-zeros in their both sides +// One or zero tokens, when pattern is split using '0'. +// +// 3: "101", "1001" +// Same digit of both sides of the zero +// Two tokens, each with length of 1 and tokens are the same. +// The queries of case 3 could also be handled with case 4 query, but that +// would yield a longer SQL statement. +// +// 4: "102", "1002" +// One or more zeros in the middle, just one digit on either side of the zero(s) +// and those digits are not the same. +// Two tokens, each with length of 1 and tokens are different. +// +// 5: "1023", "0102", "1010", "00100200", "10203", "01020304050" +// Two tokens, at least one of them has length > 1. +// If tokens are identical, handle as case 3, otherwise handle as case 4. +// ("10203" -> tokens "1" and "203" +// "0010023004560" -> tokens "001" and "23004560") +// +// 6: "10", "1000" +// Two tokens, last token ends zero. +// In this case, query should look-up first toke and number ("10", "1000"). QString CntSqlSearch::CreatePredictiveSearch(const QString &pattern) -{ - if (pattern.length() > 15) + { + int len = pattern.length(); + // For best performance, handle 1 digit case first + if (len == KMinimumSearchPatternLength) { - return QString(""); - } - else if (pattern.length() == 1) - { - return "SELECT contact_id FROM " + SelectTableView(pattern) + " ORDER BY first_name, last_name ASC;"; + // Case 1 + return SELECT_CONTACT_ID + SelectTable(pattern) + ORDER_BY_FIRSTNAME_LASTNAME; } - else + if (len <= KLimitLength && len > KMinimumSearchPatternLength) { - return CreateSubStringSearch(pattern); - } -} + return CreateQuery(pattern); + } -QString CntSqlSearch::SelectTableView(const QString &pattern) -{ + return QString(""); // Invalid pattern + } + +QString CntSqlSearch::SelectTable(const QString &pattern) const + { QString predictivesearch; - int index; - int num; - if (pattern.contains("0")) + if (pattern.length() == 0) + { + return ""; + } + switch (pattern.at(0).digitValue()) { - 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"); @@ -144,207 +173,454 @@ predictivesearch = QString("predictivesearch9"); } break; + default: // error + predictivesearch = ""; + break; } -return predictivesearch; -} + return predictivesearch; + } + +// Even if there are over 2 tokens, make 2 tokens. +// If there are two or more tokens, include the leading zeros in the first +// token the and trailing zeros in the second token. +// E.g. "0010230" results tokens "001" and "230" and +// "001230045067800900" tokens "00123" and "45067800900". +QStringList CntSqlSearch::GetTokens(const QString& pattern) const + { + const QChar KZero('0'); + QStringList tokens = pattern.split(KZero, QString::SkipEmptyParts); + if (tokens.count() < KTwoTokens) + { + return tokens; + } + + QStringList twoTokens; + int i(0); + while (pattern[i] == KZero) // Skip leading zeros + { + ++i; + } + while (pattern[i] != KZero) // Skip non-zeros to find where first token ends + { + ++i; + } + twoTokens.append(pattern.left(i)); + + while (pattern[i] == KZero) // Skip zeros to find where second token begins + { + ++i; + } + twoTokens.append(pattern.mid(i)); + return twoTokens; + } + +// pattern length is between KMinimumSearchPatternLength...KLimitLength +QString CntSqlSearch::CreateQuery(const QString& pattern) const + { + QStringList tokens = GetTokens(pattern); + if (tokens.count() < KTwoTokens) + { + if( tokens.count() == KOneToken && !tokens.at(0).contains("0") && !pattern.startsWith('0') && pattern.endsWith('0')) + { + return IdenticalTokensSearch(pattern, tokens) + Order(tokens); // Case 6 + } + else + { + return ExactMatchSearch(pattern) + Order(tokens); // Case 2 + } + } + else + { + if (tokens.at(0) == tokens.at(1)) + { + return IdenticalTokensSearch(pattern, tokens); // Case 3 + } + else + { + return IntersectionSearch(pattern, tokens); // Case 4 + } + } + } + +QString CntSqlSearch::ExactMatchSearch(const QString& pattern) const + { + return QString(SELECT_CONTACT_ID + SelectTable(pattern) + + " WHERE " + ExactMatch(pattern)); + } -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; - } -} +// It has been checked that tokens are different, but they might begin with +// the same digit. +QString CntSqlSearch::IntersectionSearch(const QString& pattern, + const QStringList& tokens) const + { +#if defined(SEARCH_FROM_ONE_TABLE) + return SearchTokensFromOneTable(pattern, tokens); +#else +/* Query for pattern = "205": +SELECT predictivesearch2.contact_id FROM predictivesearch2 WHERE EXISTS +(SELECT contact_id FROM predictivesearch5 WHERE predictivesearch2.contact_id = predictivesearch5.contact_id) +OR +(SELECT contact_id FROM predictivesearch2 +WHERE(predictivesearch2.nbr>145522562959409152 AND predictivesearch2.nbr<145804037936119807) OR +(predictivesearch2.nbr2>145522562959409152 AND predictivesearch2.nbr2<145804037936119807) OR +(predictivesearch2.nbr3>145522562959409152 AND predictivesearch2.nbr3<145804037936119807) OR +(predictivesearch2.nbr4>145522562959409152 AND predictivesearch2.nbr4<145804037936119807)) +ORDER BY predictivesearch2.first_name, predictivesearch2.last_name ASC; + +This query works if both tokens have just one digit (e.g. "102", but not "1023") +*/ + if (tokens.at(0).length() == KMinimumSearchPatternLength && + tokens.at(1).length() == KMinimumSearchPatternLength) + { + // Case 4 + QString firstTable = SelectTable(tokens.at(0)); + QString secondTable = SelectTable(tokens.at(1)); + QString query = + "SELECT " + firstTable + ".contact_id FROM " + firstTable + + " WHERE EXISTS (" + SELECT_CONTACT_ID + secondTable + " WHERE " + + firstTable + ".contact_id = " + secondTable + ".contact_id) OR (" + + SELECT_CONTACT_ID + firstTable + " WHERE " + ExactMatch(pattern, firstTable) + ")"; + return query + Order(tokens); + } + if (tokens.at(0).at(0) == tokens.at(1).at(0) || + tokens.at(0).length() > 1 && tokens.at(1).length() > 1) + { + // Tokens begin with same digit or both tokens are longer than one digit. + // Must search from one table. + return SearchTokensFromOneTable(pattern, tokens); + } + return CreateJoinTableSearch(pattern, tokens); // Case 5 +#endif + } + +// Find the exact match, or a column whose value is within +// lower..upper(exclusive) and another column whose value is within +// lower2..upper2(exclusive). +// In this case the limits are is different, so there are 12 combinations the +// two values can exist in four columns: +// +// (column = X AND column2 = Y) OR +// (column = X AND column3 = Y) OR +// (column = X AND column4 = Y) OR +// (column2 = X AND column3 = Y) OR +// (column2 = X AND column4 = Y) OR +// (column3 = X AND column4 = Y) OR +// (column = Y AND column2 = X) OR +// (column = Y AND column3 = X) OR +// (column = Y AND column4 = X) OR +// (column2 = Y AND column3 = X) OR +// (column2 = Y AND column4 = X) OR +// (column3 = Y AND column4 = X) +// +// Where X means: (value > lower-limit AND value < upper-limit) +// and Y means: (value > lower-limit-2 AND value < upper-limit-2) +QString CntSqlSearch::SearchTokensFromOneTable(const QString& pattern, + const QStringList& tokens) const + { + QString token = tokens.at(0); + QString lower = LowerLimit(token); + QString upper = UpperLimit(token); + QString lower2 = LowerLimit(tokens.at(1)); + QString upper2 = UpperLimit(tokens.at(1)); -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); + QString query = +#if defined(USE_DEMORGAN) + SELECT_CONTACT_ID + SelectTable(pattern) + " WHERE NOT(NOT" + + ExactMatch(pattern) + " AND NOT" + + CompareTwoColumns(lower, upper, lower2, upper2) + " AND NOT" + + CompareTwoColumns(lower2, upper2, lower, upper) + ")"; +#else + SELECT_CONTACT_ID + SelectTable(token) + " WHERE (" + + // exact match (e.g. "102") + ExactMatch(pattern) + ") OR " + + CompareTwoColumns(lower, upper, lower2, upper2) + " OR " + + CompareTwoColumns(lower2, upper2, lower, upper); +#endif + query += Order(tokens); + return query; + } + +// Either an exact match is required, or tokens must be found, but not in the +// same column. +// Since tokens are identical, they have same limits, and one call to +// CompareTwoColumns() is enough. +QString CntSqlSearch::IdenticalTokensSearch(const QString& pattern, + const QStringList& tokens) const + { + QString token = tokens.at(0); + QString lower = LowerLimit(token); + QString upper = UpperLimit(token); +#if defined(USE_DEMORGAN) + QString query(SELECT_CONTACT_ID + SelectTable(pattern) + " WHERE NOT(NOT" + + ExactMatch(pattern) + + " AND NOT" + CompareTwoColumns(lower, upper, lower, upper) + ")"); +#else + QString query(SELECT_CONTACT_ID + SelectTable(pattern) + " WHERE (" + + ExactMatch(pattern) + // exact match (e.g. "101") + ") OR " + CompareTwoColumns(lower, upper, lower, upper)); +#endif + query += Order(tokens); + return query; + } -if (IsSubStringSearch(pattern) && numbers.count() > 1 ) +// Put individual AND / OR operations in such order that in most cases there is +// no need to evaluate all arguments of the AND / OR. +// In case of AND, put the less likely condition on the left side of AND. +// In case of OR, put the more likely condition on the left side of OR. +// Since 2nd column is more likely to be empty, compare it before 1st column. +// Since 1st & 2nd columns are more likely to contain a match, compare them +// before other column combinations (1st & 3rd, 2nd & 3rd etc) +QString CntSqlSearch::CompareTwoColumns(const QString& lower, + const QString& upper, + const QString& lower2, + const QString& upper2) const + { +#if defined(USE_DEMORGAN) + // Using De Morgan's law to replace ORs with ANDs: + // A || B || C || D || E || F --> !(!A && !B && !C && !D && !E && !F) + // + // As A (match found in columns 1 and 2) is more likely true than other + // combinations, then !A is more likely false than other combinations, so + // it is put first in the AND statement. + QString query = + "(NOT(NOT(" + + // 2nd & 1st column (='A') + KColumn2 + ">" + lower2 + " AND " + KColumn2 + "<" + upper2 + " AND " + + KColumn1 + ">" + lower + " AND " + KColumn1 + "<" + upper + + ") AND NOT(" + + // 3nd & 1st column (='B') + KColumn3 + ">" + lower2 + " AND " + KColumn3 + "<" + upper2 + " AND " + + KColumn1 + ">" + lower + " AND " + KColumn1 + "<" + upper + + ") AND NOT(" + + // 3rd & 2nd column (='C') + KColumn3 + ">" + lower2 + " AND " + KColumn3 + "<" + upper2 + " AND " + + KColumn2 + ">" + lower + " AND " + KColumn2 + "<" + upper + + ") AND NOT(" + + // 4th & 1st column (='D') + KColumn4 + ">" + lower2 + " AND " + KColumn4 + "<" + upper2 + " AND " + + KColumn1 + ">" + lower + " AND " + KColumn1 + "<" + upper + + ") AND NOT(" + + // 4th & 2nd column (='E') + KColumn4 + ">" + lower2 + " AND " + KColumn4 + "<" + upper2 + " AND " + + KColumn2 + ">" + lower + " AND " + KColumn2 + "<" + upper + + ") AND NOT(" + + // 4th & 3rd column (='F') + KColumn4 + ">" + lower2 + " AND " + KColumn4 + "<" + upper2 + " AND " + + KColumn3 + ">" + lower + " AND " + KColumn3 + "<" + upper + ")))"; +#else + QString query = + "(" + + // 2nd & 1st column + KColumn2 + ">" + lower2 + " AND " + KColumn2 + "<" + upper2 + " AND " + + KColumn1 + ">" + lower + " AND " + KColumn1 + "<" + upper + + ") OR (" + + // 3nd & 1st column + KColumn3 + ">" + lower2 + " AND " + KColumn3 + "<" + upper2 + " AND " + + KColumn1 + ">" + lower + " AND " + KColumn1 + "<" + upper + + ") OR (" + + // 3rd & 2nd column + KColumn3 + ">" + lower2 + " AND " + KColumn3 + "<" + upper2 + " AND " + + KColumn2 + ">" + lower + " AND " + KColumn2 + "<" + upper + + ") OR (" + + // 4th & 1st column + KColumn4 + ">" + lower2 + " AND " + KColumn4 + "<" + upper2 + " AND " + + KColumn1 + ">" + lower + " AND " + KColumn1 + "<" + upper + + ") OR (" + + // 4th & 2nd column + KColumn4 + ">" + lower2 + " AND " + KColumn4 + "<" + upper2 + " AND " + + KColumn2 + ">" + lower + " AND " + KColumn2 + "<" + upper + + ") OR (" + + // 4th & 3rd column + KColumn4 + ">" + lower2 + " AND " + KColumn4 + "<" + upper2 + " AND " + + KColumn3 + ">" + lower + " AND " + KColumn3 + "<" + upper + ")"; +#endif + return query; + } + +QString CntSqlSearch::ExactMatch(const QString& pattern, QString table) const { - //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); + QString lower = LowerLimit(pattern); + QString upper = UpperLimit(pattern); + + if (table.length() > 0) + { + table += "."; + } +#if defined(USE_DEMORGAN) + // Using De Morgan's law to replace ORs with ANDs: + // column1 || column2 || column3 || column4 + // -> + // (NOT(NOT(column1) AND NOT(column2) AND NOT(column3) AND NOT(column4)) + // + // Which means: + // (NOT(NOT(N>lower && < Nlower && < N2lower && < N3lower && < N" + lower + " AND " + table + KColumn1 + "<" + upper + ") AND NOT(" + + table + KColumn2 + ">" + lower + " AND " + table + KColumn2 + "<" + upper + ") AND NOT(" + + table + KColumn3 + ">" + lower + " AND " + table + KColumn3 + "<" + upper + ") AND NOT(" + + table + KColumn4 + ">" + lower + " AND " + table + KColumn4 + "<" + upper + ")))"); +#else + // Since first column has always some value, and 2nd column is more likely to + // have a value than 3rd column etc. Put columns in that order: + // (column 1 comparison) OR (column 2 comparison) OR (column 3 comparison) OR + // (column 4 comparison) + // If 1st column results true, there is no need to compare other columns etc. + return QString("(" + + table + KColumn1 + ">" + lower + " AND " + table + KColumn1 + "<" + upper + ") OR (" + + table + KColumn2 + ">" + lower + " AND " + table + KColumn2 + "<" + upper + ") OR (" + + table + KColumn3 + ">" + lower + " AND " + table + KColumn3 + "<" + upper + ") OR (" + + table + KColumn4 + ">" + lower + " AND " + table + KColumn4 + "<" + upper + ")"); +#endif } -return queryString; -} + +// TODO: if SEARCH_FROM_ONE_TABLE case is slower than the one that searches from +// two tables, then this function is needed for cases where pattern is: +// "1023", "12300450" +// +/* This query makes sub-query into table 5 and searches for a number that begins +with 56606. but it does not support cases where both tokens are longer than one digit. + +SELECT predictivesearch5.contact_id FROM predictivesearch5 WHERE EXISTS (SELECT contact_id FROM predictivesearch5 +WHERE (predictivesearch5.nbr>389005014883893248 AND predictivesearch5.nbr<389006114395521023) OR +(predictivesearch5.nbr2>389005014883893248 AND predictivesearch5.nbr2<389006114395521023) OR +(predictivesearch5.nbr3>389005014883893248 AND predictivesearch5.nbr3<389006114395521023) OR +(predictivesearch5.nbr4>389005014883893248 AND predictivesearch5.nbr4<389006114395521023)) +OR +(SELECT predictivesearch5.contact_id FROM predictivesearch5 JOIN predictivesearch6 ON +predictivesearch5.contact_id = predictivesearch6.contact_id +WHERE(predictivesearch5.nbr>388998417814126592 AND predictivesearch5.nbr<389279892790837247) OR +(predictivesearch5.nbr2>388998417814126592 AND predictivesearch5.nbr2<389279892790837247) OR +(predictivesearch5.nbr3>388998417814126592 AND predictivesearch5.nbr3<389279892790837247) OR +(predictivesearch5.nbr4>388998417814126592 AND predictivesearch5.nbr4<389279892790837247)) +ORDER BY predictivesearch5.first_name, predictivesearch5.last_name ASC; -QString CntSqlSearch::CreateStringSearch(const QString &pattern ) -{ -QString queryString; +SELECT contact_id +FROM +( +SELECT predictivesearch5.contact_id, predictivesearch5.first_name, predictivesearch5.last_name FROM predictivesearch5 +WHERE (predictivesearch5.nbr>387415121070129152 AND predictivesearch5.nbr<387432713256173567) OR +(predictivesearch5.nbr2>387415121070129152 AND predictivesearch5.nbr2<387432713256173567) OR +(predictivesearch5.nbr3>387415121070129152 AND predictivesearch5.nbr3<387432713256173567) OR +(predictivesearch5.nbr4>387415121070129152 AND predictivesearch5.nbr4<387432713256173567) +UNION +SELECT predictivesearch5.contact_id, predictivesearch5.first_name, predictivesearch5.last_name FROM predictivesearch5 JOIN predictivesearch6 ON predictivesearch5.contact_id = predictivesearch6.contact_id +WHERE((predictivesearch5.nbr>387309567953862656 AND predictivesearch5.nbr<391813167581233151) OR (predictivesearch5.nbr2>387309567953862656 AND predictivesearch5.nbr2<391813167581233151) OR (predictivesearch5.nbr3>387309567953862656 AND predictivesearch5.nbr3<391813167581233151) OR (predictivesearch5.nbr4>387309567953862656 AND predictivesearch5.nbr4<391813167581233151) +AND +(predictivesearch6.nbr>387309567953862656 AND predictivesearch6.nbr<391813167581233151) OR (predictivesearch6.nbr2>387309567953862656 AND predictivesearch6.nbr2<391813167581233151) OR (predictivesearch6.nbr3>387309567953862656 AND predictivesearch6.nbr3<391813167581233151) OR (predictivesearch6.nbr4>387309567953862656 AND predictivesearch6.nbr4<391813167581233151)) +) AS PR +ORDER BY PR.first_name, PR.last_name ASC; +Here is a De Morgan version -return QString("SELECT contact_id FROM " + SelectTableView(pattern) + - " WHERE " + CreateLimit(pattern)); -} +SELECT contact_id +FROM +( +SELECT predictivesearch5.contact_id, predictivesearch5.first_name, predictivesearch5.last_name FROM predictivesearch5 +WHERE NOT((NOT (predictivesearch5.nbr >= 387415121070129152 AND predictivesearch5.nbr <= 387432713256173567)) AND (NOT (predictivesearch5.nbr2 >= 387415121070129152 AND predictivesearch5.nbr2 <= 387432713256173567)) AND (NOT (predictivesearch5.nbr3 >= 387415121070129152 AND predictivesearch5.nbr3 <= 387432713256173567)) AND (NOT (predictivesearch5.nbr4 >= 387415121070129152 AND predictivesearch5.nbr4 <= 387432713256173567))) +UNION +SELECT predictivesearch5.contact_id, predictivesearch5.first_name, predictivesearch5.last_name FROM predictivesearch5 JOIN predictivesearch6 ON predictivesearch5.contact_id = predictivesearch6.contact_id +WHERE NOT((NOT (predictivesearch5.nbr >= 387309567953862656 AND predictivesearch5.nbr <= 391813167581233151)) AND (NOT (predictivesearch5.nbr2 >= 387309567953862656 AND predictivesearch5.nbr2 <= 391813167581233151)) AND (NOT (predictivesearch5.nbr3 >= 387309567953862656 AND predictivesearch5.nbr3 <= 391813167581233151)) AND (NOT (predictivesearch5.nbr4 >= 387309567953862656 AND predictivesearch5.nbr4 <= 391813167581233151))) +AND +NOT((NOT (predictivesearch6.nbr >= 387309567953862656 AND predictivesearch6.nbr <= 391813167581233151)) AND (NOT (predictivesearch6.nbr2 >= 387309567953862656 AND predictivesearch6.nbr2 <= 391813167581233151)) AND (NOT (predictivesearch6.nbr3 >= 387309567953862656 AND predictivesearch6.nbr3 <= 391813167581233151)) AND (NOT (predictivesearch6.nbr4 >= 387309567953862656 AND predictivesearch6.nbr4 <= 391813167581233151))) +) AS PR +ORDER BY PR.first_name, PR.last_name ASC; -QString CntSqlSearch::CreateSpaceStringSearch(QStringList numbers, const QString &pattern) -{ -/*if(numbers.at(0) == numbers.at(1)) - { +*/ +QString CntSqlSearch::CreateJoinTableSearch(QString pattern, QStringList numbers) const + { + // It has been checked earlier that tables are not same + QString firstTable = SelectTable(numbers.at(0)); + QString secondTable = SelectTable(numbers.at(1)); + + QString queryString = QString("SELECT contact_id FROM (SELECT " + + firstTable + ".contact_id, " + firstTable + ".first_name, " + firstTable + ".last_name FROM " + firstTable + + " WHERE " + ExactMatch(pattern, firstTable) + + " UNION SELECT " + firstTable + ".contact_id, " + firstTable + ".first_name, " + firstTable + ".last_name FROM " + firstTable + " JOIN " + secondTable + " ON " + firstTable + ".contact_id = " + secondTable + ".contact_id WHERE" + + ExactMatchColumns(numbers) + ") AS PR ORDER BY PR.first_name, PR.last_name ASC;"); + return queryString; + } + +QString CntSqlSearch::ExactMatchColumns(QStringList numbers) const + { + + QString firstColumn = numbers.at(0); + QString secondColumn = numbers.at(1); - } -else*/ + if( firstColumn.count() > 1 && secondColumn.count() > 1) + { + return "(" + ExactMatch(numbers.at(0), SelectTable(numbers.at(0))) + " AND " + ExactMatch(numbers.at(1), SelectTable(numbers.at(1))) + ")"; + } + else if(firstColumn.count() > 1) + { + return ExactMatch(numbers.at(0), SelectTable(numbers.at(0))); + } + else + { + return ExactMatch(numbers.at(1), SelectTable(numbers.at(1))); + } + } + +QString CntSqlSearch::Order(QStringList tokens) const + { + if (tokens.count() > 1 ) + { + QString table = SelectTable(tokens.at(0)); + return QString(" ORDER BY " + table + ".first_name, " + table + ".last_name ASC;"); + } + return QString(ORDER_BY_FIRSTNAME_LASTNAME); + } + +QString CntSqlSearch::Pad( const QString &pattern, char padChar ) const { - if((numbers.at(0).length() > 1 || numbers.at(1).length() > 1) && - (pattern.startsWith('0') || pattern.endsWith('0'))) + int padCount = KLimitLength - pattern.length(); + QString result; + if ( padCount < 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); + result = pattern.left(KLimitLength); } else { - return CreateSpaceSimpleSearch(numbers); + result = pattern; + for( int i = 0; i < padCount ;i++ ) + { + result.append(padChar); + } } - } -} - -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 + ")");*/ + const int KHexadecimalBase = 16; + bool ok; + // Use signed int to prevent underflow when replaced is "00...00" + qint64 value = result.toLongLong(&ok, KHexadecimalBase); + if (!ok) + { + // TODO: handle error (=invalid characters in pattern) + } -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"); + // In order to write queries using '>' and '<' instead of '>=' and '<=', + // expand the limit by one. + if (padChar == KUpperLimitPadding) + { + ++value; + } + else + { + --value; + } - -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 QString::number(value, 10); } -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 ) +QString CntSqlSearch::UpperLimit( const QString &pattern ) const { - 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 &sortOrders, bool &filterSupportedFlag, - QContactManager::Error &error) + QContactManager::Error* error) { QList result; @@ -134,7 +141,7 @@ && (static_cast(filter)).value().type() == QVariant::StringList) { QStringList values = (static_cast(filter)).value().toStringList(); QContactIntersectionFilter intersectionFilter; - foreach(QString value, values) { + foreach(const QString& value, values) { QContactDetailFilter detailFilter = filter; detailFilter.setValue(value); intersectionFilter.append(detailFilter); @@ -142,15 +149,20 @@ // The resulting filter is handled with a recursive function call result = contacts(intersectionFilter, sortOrders, filterSupportedFlag, error); } else { - if (filterSupportLevel(filter) == Supported) { + FilterSupport filterSupport = filterSupportLevel(filter); + if (filterSupport == Supported) { filterSupportedFlag = true; // Filter supported, use as the result directly result = filterContacts(filter, error); - } else if (filterSupportLevel(filter) == SupportedPreFilterOnly) { + } else if (filterSupport == SupportedPreFilterOnly) { // Filter only does pre-filtering, the caller is responsible of // removing possible false positives after filtering filterSupportedFlag = false; result = filterContacts(filter, error); + } else if (filterSupport == IllegalFilter) { + // Don't do filtering; fail with an error + filterSupportedFlag = false; + *error = QContactManager::NotSupportedError; } else { // Don't do filtering here, return all contact ids and tell the // caller to do slow filtering @@ -225,13 +237,29 @@ if (defName == QContactPhoneNumber::DefinitionName) { if (matchFlags == QContactFilter::MatchPhoneNumber) { - return Supported; - } - - if (matchFlags == QContactFilter::MatchExactly || - matchFlags == QContactFilter::MatchEndsWith || - matchFlags == QContactFilter::MatchFixedString) { - return SupportedPreFilterOnly; + if (detailFilter.value().canConvert(QVariant::String)) { + if (detailFilter.value().toString().length() >= 7) { + return Supported; + } else { + // It is a feature of Symbian contact model that phone + // number match requires at least 7 digits. In case of + // phone number match it is best to give an error as a + // result because the phone number match logic would + // not be much of use with less than 7 digit matching. + // It would give false positives too often. + return IllegalFilter; + } + } + } else if (matchFlags == QContactFilter::MatchExactly + || matchFlags == QContactFilter::MatchEndsWith + || matchFlags == QContactFilter::MatchFixedString) { + if (detailFilter.value().canConvert(QVariant::String)) { + // It is a feature of Symbian contact model that phone + // number match requires at least 7 digits + if (detailFilter.value().toString().length() >= 7) { + return SupportedPreFilterOnly; + } + } } // Names } else if (defName == QContactName::DefinitionName @@ -276,16 +304,16 @@ QList CntSymbianFilter::filterContacts( const QContactFilter& filter, - QContactManager::Error& error) + QContactManager::Error* error) { QList matches; CContactIdArray* idArray(0); - if (filter.type() == QContactFilter::InvalidFilter ){ + if (filter.type() == QContactFilter::InvalidFilter) { TTime epoch(0); idArray = m_contactDatabase.ContactsChangedSinceL(epoch); // return all contacts } else if(filterSupportLevel(filter) == NotSupported) { - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; } else if (filter.type() == QContactFilter::ContactDetailFilter) { const QContactDetailFilter &detailFilter = static_cast(filter); @@ -327,7 +355,7 @@ && detailFilter.matchFlags() == QContactFilter::MatchStartsWith) { // Remove false positives - for(TInt i(0); i < idArray->Count(); i++) { + 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) @@ -345,7 +373,7 @@ } } - if(idArray && (error == QContactManager::NoError)) { + if(idArray && (*error == QContactManager::NoError)) { // copy the matching contact ids for(int i(0); i < idArray->Count(); i++) { matches.append(QContactLocalId((*idArray)[i])); @@ -377,7 +405,7 @@ // 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 + // Check if this is in the beginning of a word (the preceding // character is a space) else if(index > 0 && TChar(text[index-1]) == TChar(0x20)) value = false; @@ -405,11 +433,11 @@ if(detailFilter.detailDefinitionName() == QContactName::DefinitionName) { if(detailFilter.detailFieldName() == QContactName::FieldPrefix) { tempFieldDef->AppendL(KUidContactFieldPrefixName); - } else if(detailFilter.detailFieldName() == QContactName::FieldFirst) { + } else if(detailFilter.detailFieldName() == QContactName::FieldFirstName) { tempFieldDef->AppendL(KUidContactFieldGivenName); - } else if(detailFilter.detailFieldName() == QContactName::FieldMiddle) { + } else if(detailFilter.detailFieldName() == QContactName::FieldMiddleName) { tempFieldDef->AppendL(KUidContactFieldAdditionalName); - } else if(detailFilter.detailFieldName() == QContactName::FieldLast) { + } else if(detailFilter.detailFieldName() == QContactName::FieldLastName) { tempFieldDef->AppendL(KUidContactFieldFamilyName); } else if(detailFilter.detailFieldName() == QContactName::FieldSuffix) { tempFieldDef->AppendL(KUidContactFieldSuffixName); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersql.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersql.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersql.cpp Mon May 03 12:24:20 2010 +0300 @@ -110,7 +110,7 @@ const QContactFilter& filter, const QList& sortOrders, bool &filterSupported, - QContactManager::Error& error) + QContactManager::Error* error) { QList ids; if(m_filterMap.contains(filter.type())) @@ -120,7 +120,7 @@ return ids; } - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return ids; } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersqlhelper.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbianfiltersqlhelper.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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.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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansorterdbms.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansorterdbms.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansorterdbms.cpp Mon May 03 12:24:20 2010 +0300 @@ -74,7 +74,7 @@ QList CntSymbianSorterDbms::contacts( const QList& sortOrders, - QContactManager::Error& error) + QContactManager::Error* error) { // Create an empty list // See QT_TRYCATCH_LEAVING note at the begginning of this file @@ -92,7 +92,7 @@ QList CntSymbianSorterDbms::sort( QList contactIds, const QList& sortOrders, - QContactManager::Error& error) + QContactManager::Error* error) { // Create an empty list // See QT_TRYCATCH_LEAVING note at the begginning of this file @@ -109,7 +109,7 @@ bool CntSymbianSorterDbms::sortOrderSupported(const QList& sortOrders) { - foreach( QContactSortOrder s, sortOrders ) { + foreach(const QContactSortOrder& s, sortOrders ) { // Find uids for sortings QList fieldTypeUids = m_transformContact.supportedSortingFieldTypes(s.detailDefinitionName(), s.detailFieldName()); if( fieldTypeUids.count() == 0 ) @@ -145,7 +145,7 @@ // Remove templates from the list CContactIdArray *templateIds = m_contactDatabase.GetCardTemplateIdListL(); CleanupStack::PushL(templateIds); - for(TInt i(0); i < templateIds->Count(); i++) { + for(TInt i(0); i < templateIds->Count(); ++i) { TContactItemId id = (*templateIds)[i]; TInt index = ids->Find(id); if(index > KErrNotFound) @@ -161,7 +161,7 @@ // Add the contact ids to the returned QList QList qIds; - for (TInt i(0); i < ids->Count(); i++) { + for (TInt i(0); i < ids->Count(); ++i) { qIds.append((*ids)[i]); } @@ -195,12 +195,12 @@ CleanupStack::PushL(sort); // Convert sort orders to TSortPref array - foreach (QContactSortOrder s, sortOrders) + foreach (const QContactSortOrder& s, sortOrders) { QList fieldTypes = m_transformContact.supportedSortingFieldTypes(s.detailDefinitionName(), s.detailFieldName()); if (fieldTypes.count()) { - foreach(TUid fieldType, fieldTypes) { + foreach(const TUid& fieldType, fieldTypes) { CContactDatabase::TSortPref pref; // NOTE: TSortPref sets order to ascending by default if( s.direction() == Qt::DescendingOrder ) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansrvconnection.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansrvconnection.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/filtering/cntsymbiansrvconnection.cpp Mon May 03 12:24:20 2010 +0300 @@ -93,7 +93,7 @@ * \return the list of matched contact ids */ QList CntSymbianSrvConnection::searchContacts(const QString& sqlQuery, - QContactManager::Error& error) + QContactManager::Error* error) { QList list; TPtrC queryPtr(reinterpret_cast(sqlQuery.utf16())); @@ -152,12 +152,12 @@ //Enforce server to be at system default priority EPriorityForeground server.SetPriority(EPriorityForeground); - // Synchronise with the server. + // Synchronize with the server. TRequestStatus reqStatus; server.Rendezvous(reqStatus); server.Resume(); - // Server will call the reciprocal static synchronisation call. + // Server will call the reciprocal static synchronization call. User::WaitForRequest(reqStatus); server.Close(); User::LeaveIfError(reqStatus.Int()); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformaddress.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformaddress.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformaddress.cpp Mon May 03 12:24:20 2010 +0300 @@ -106,7 +106,7 @@ // Find existing address details from contact QContactDetail* detail = 0; - foreach( QContactAddress existingAddress, contact.details() ) + foreach(const QContactAddress& existingAddress, contact.details() ) { // Do not merge if contexts don't match if( existingAddress.contexts() != address.contexts() ) @@ -114,7 +114,7 @@ // Merge detail with existing detail detail = new QContactAddress( existingAddress ); - foreach( QString key, address.variantValues().keys() ) + foreach(const QString& key, address.variantValues().keys() ) detail->setValue( key, address.variantValue(key) ); break; } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformanniversarysimple.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformanniversarysimple.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformanniversarysimple.cpp Mon May 03 12:24:20 2010 +0300 @@ -38,7 +38,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include "cnttransformanniversarysimple.h" +#include "CntTransformAnniversarySimple.h" QList CntTransformAnniversarySimple::transformDetailL(const QContactDetail &detail) { diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatar.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatar.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatar.cpp Mon May 03 12:24:20 2010 +0300 @@ -48,75 +48,59 @@ QList fieldList; - //cast to avatar - const QContactAvatar &avatar(static_cast(detail)); - + //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); + //create new field + QString urlString = avatar.imageUrl().toString(); + TPtrC fieldText(reinterpret_cast(urlString.utf16())); - 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); + //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]); + } + } - newField->SetMapping(KUidContactFieldVCardMapUnknown); - newField->TextStorage()->SetTextL(fieldText); + if(filename.Length()) { + TUid uid(KUidContactFieldCodImage); + + CContactItemField* newField = CContactItemField::NewLC(KStorageTypeText, uid); - fieldList.append(newField); - CleanupStack::Pop(newField); - } + newField->SetMapping(KUidContactFieldVCardMapUnknown); + newField->TextStorage()->SetTextL(filename); - return fieldList; + 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); + Q_UNUSED(contact); + QContactAvatar *avatar = new QContactAvatar(); - 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); + if (field.ContentType().ContainsFieldType(KUidContactFieldCodImage)) { + CContactTextField* storage = field.TextStorage(); + QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + avatar->setImageUrl(QUrl(avatarString)); } - return avatar; + return avatar; } bool CntTransformAvatar::supportsField(TUint32 fieldType) const { bool ret = false; - if (fieldType == KUidContactFieldCodImage.iUid || - fieldType == KUidContactFieldRingTone.iUid || - fieldType == KUidContactFieldVideoRingTone.iUid) { + if (fieldType == KUidContactFieldCodImage.iUid) ret = true; - } return ret; } @@ -142,12 +126,10 @@ * \a subType The subtype to be checked * \return True if this subtype is supported */ -bool CntTransformAvatar::supportsSubType(const QString& subType) const +bool CntTransformAvatar::supportsSubType(const QString& /*subType*/) const { - if(QContactAvatar::FieldSubType == subType) - return true; - else - return false; + // XXX todo + return false; } /*! @@ -156,22 +138,10 @@ * \a fieldName The name of the supported field * \return fieldId for the fieldName, 0 if not supported */ -quint32 CntTransformAvatar::getIdForField(const QString& fieldName) const +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; + // XXX todo + return 0; } /*! @@ -190,15 +160,8 @@ 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); - + // We only support imageUrl + fields.remove(QContactAvatar::FieldVideoUrl); // Context not supported in symbian back-end, remove fields.remove(QContactAvatar::FieldContext); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatarsimple.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformavatarsimple.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,281 +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); - -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp Mon May 03 12:24:20 2010 +0300 @@ -51,7 +51,8 @@ #include "cnttransformonlineaccount.h" #include "cnttransformorganisation.h" #include "cnttransformavatar.h" -#include "cnttransformavatarsimple.h" +#include "cnttransformringtone.h" +#include "cnttransformthumbnail.h" #include "cnttransformsynctarget.h" #include "cnttransformgender.h" #include "cnttransformanniversary.h" @@ -108,10 +109,11 @@ m_transformContactData.insert(SyncTarget, new CntTransformSyncTarget); m_transformContactData.insert(Note, new CntTransformNote); m_transformContactData.insert(Family, new CntTransformFamily); + m_transformContactData.insert(Ringtone, new CntTransformRingtone); + m_transformContactData.insert(Avatar, new CntTransformAvatar); #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 @@ -128,9 +130,10 @@ // Empty transform class for removing unsupported detail definitions m_transformContactData.insert(Empty, new CntTransformEmpty); + m_transformContactData.insert(Thumbnail, new CntTransformThumbnail); + // variated transform classes m_transformContactData.insert(Anniversary, new CntTransformAnniversarySimple); - m_transformContactData.insert(Avatar, new CntTransformAvatarSimple); #endif } @@ -272,6 +275,8 @@ } } + resetTransformObjects(); + contactItem.UpdateFieldSet(fieldSet); CleanupStack::Pop(fieldSet); } @@ -329,7 +334,7 @@ void CntTransformContact::detailDefinitions( QMap& defaultSchema, const QString& contactType, - QContactManager::Error& error) const + QContactManager::Error* error) const { Q_UNUSED(error); @@ -339,6 +344,11 @@ i.value()->detailDefinitions(defaultSchema, contactType); i++; } + +#ifndef SYMBIAN_CNTMODEL_V2 + // Cannot support timestamp + defaultSchema.remove(QContactTimestamp::DefinitionName); +#endif } QList CntTransformContact::transformDetailL(const QContactDetail &detail) const @@ -392,12 +402,8 @@ QContactDetail* CntTransformContact::transformTimestampItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const { +#ifdef SYMBIAN_CNTMODEL_V2 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())) @@ -429,8 +435,15 @@ } } CleanupStack::PopAndDestroy(guidBuf); + return timestampDetail; +#else + // 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. + Q_UNUSED(contactItem); + Q_UNUSED(contactDatabase) + return 0; #endif - return timestampDetail; } void CntTransformContact::transformPreferredDetailL(const QContact& contact, @@ -470,3 +483,12 @@ contact.setPreferredDetail("message", detail); } } + +void CntTransformContact::resetTransformObjects() const +{ + QMap::const_iterator i = m_transformContactData.constBegin(); + while (i != m_transformContactData.constEnd()) { + i.value()->reset(); + ++i; + } +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformempty.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformempty.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformempty.cpp Mon May 03 12:24:20 2010 +0300 @@ -117,4 +117,13 @@ if(definitions.contains(QContactOnlineAccount::DefinitionName)) { definitions.remove(QContactOnlineAccount::DefinitionName); } + if(definitions.contains(QContactTag::DefinitionName)) { + definitions.remove(QContactTag::DefinitionName); + } + if(definitions.contains(QContactGlobalPresence::DefinitionName)) { + definitions.remove(QContactGlobalPresence::DefinitionName); + } + if(definitions.contains(QContactPresence::DefinitionName)) { + definitions.remove(QContactPresence::DefinitionName); + } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformfamily.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformfamily.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformfamily.cpp Mon May 03 12:24:20 2010 +0300 @@ -52,7 +52,7 @@ //create new fields without contexts transformToTextFieldL(family, fieldList, family.spouse(), KUidContactFieldSpouse, KUidContactFieldVCardMapSpouse, false); - foreach(QString childName, family.children()) { + foreach(const QString& childName, family.children()) { transformToTextFieldL(family, fieldList, childName, KUidContactFieldChildren, KUidContactFieldVCardMapChildren, false); } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformname.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformname.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformname.cpp Mon May 03 12:24:20 2010 +0300 @@ -131,13 +131,13 @@ if (detailFieldName == QContactName::FieldPrefix) return uids << KUidContactFieldPrefixName; - if (detailFieldName == QContactName::FieldFirst) + if (detailFieldName == QContactName::FieldFirstName) return uids << KUidContactFieldGivenName; - if (detailFieldName == QContactName::FieldMiddle) + if (detailFieldName == QContactName::FieldMiddleName) return uids << KUidContactFieldAdditionalName; - if (detailFieldName == QContactName::FieldLast) + if (detailFieldName == QContactName::FieldLastName) return uids << KUidContactFieldFamilyName; if (detailFieldName == QContactName::FieldSuffix) @@ -171,11 +171,11 @@ { if (QContactName::FieldPrefix == fieldName) return KUidContactFieldPrefixName.iUid; - else if (QContactName::FieldFirst == fieldName) + else if (QContactName::FieldFirstName == fieldName) return KUidContactFieldGivenName.iUid; - else if (QContactName::FieldMiddle == fieldName) + else if (QContactName::FieldMiddleName == fieldName) return KUidContactFieldAdditionalName.iUid; - else if (QContactName::FieldLast == fieldName) + else if (QContactName::FieldLastName == fieldName) return KUidContactFieldFamilyName.iUid; else if (QContactName::FieldSuffix == fieldName) return KUidContactFieldSuffixName.iUid; @@ -202,9 +202,9 @@ // 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::FieldFirstName); + fields.remove(QContactName::FieldMiddleName); + fields.remove(QContactName::FieldLastName); fields.remove(QContactName::FieldSuffix); } else { // Note: Custom labels cannot be enabled for a contact in pre-10.1 diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformonlineaccount.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformonlineaccount.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformonlineaccount.cpp Mon May 03 12:24:20 2010 +0300 @@ -42,6 +42,12 @@ #include "cnttransformonlineaccount.h" #include "cntmodelextuids.h" +#include "qcontactpresence.h" + +CntTransformOnlineAccount::CntTransformOnlineAccount() : +m_detailCounter(0) +{ +} QList CntTransformOnlineAccount::transformDetailL(const QContactDetail &detail) { @@ -107,6 +113,7 @@ //contexts setContextsL(onlineAccount, *newField); + newField->SetUserFlags(m_detailCounter); fieldList.append(newField); CleanupStack::Pop(newField); @@ -116,41 +123,57 @@ CContactItemField* serviceProviderField = CContactItemField::NewLC(KStorageTypeText); serviceProviderField->TextStorage()->SetTextL(ServiceProviderText); serviceProviderField->AddFieldTypeL(KUidContactFieldServiceProvider); + serviceProviderField->SetUserFlags(m_detailCounter); 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); - } + //FIXME:no presence in onlineaccount anymore.. +// // 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); - } +// // 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); +// } } + if(fieldList.count() > 0) { + m_detailCounter++; + } + return fieldList; } QContactDetail *CntTransformOnlineAccount::transformItemField(const CContactItemField& field, const QContact &contact) { - Q_UNUSED(contact); + QList onlineAccounts = contact.details(QContactOnlineAccount::DefinitionName); + //check what online account detail the provided field belongs to. if there is no such detail yet, + //let's create it. + if (onlineAccounts.count() <= field.UserFlags()) { + for (int i = onlineAccounts.count(); i <= field.UserFlags(); i++) { + QContactOnlineAccount *account = new QContactOnlineAccount(); + QContact& currentContact = const_cast(contact); + currentContact.saveDetail(account); + } + onlineAccounts = contact.details(QContactOnlineAccount::DefinitionName); + } + QContactOnlineAccount *onlineAccount = new QContactOnlineAccount(onlineAccounts.at(field.UserFlags())); - QContactOnlineAccount *onlineAccount = new QContactOnlineAccount(); CContactTextField* storage = field.TextStorage(); QString onlineAccountString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); @@ -181,11 +204,11 @@ //Presence else if (field.ContentType().FieldType(i) == KUidContactFieldPresence) { QString presenceInfo = decodePresence(onlineAccountString.toInt()); - onlineAccount->setPresence(presenceInfo); +// onlineAccount->setPresence(presenceInfo); } //Status Message else if (field.ContentType().FieldType(i) == KUidContactFieldStatusMsg) { - onlineAccount->setStatusMessage(onlineAccountString); +// onlineAccount->setStatusMessage(onlineAccountString); } } @@ -297,6 +320,13 @@ } } +/*! + * Reset internal variables. + */ +void CntTransformOnlineAccount::reset() +{ + m_detailCounter = 0; +} /*! * Encode the presence information. @@ -304,19 +334,20 @@ */ 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 + //FIXME:presence +// if (QContactPresence::PresenceAvailable == aPresence) +// return CntTransformOnlineAccount::EPresenceAvailable; +// else if (QContactPresence::PresenceHidden == aPresence) +// return CntTransformOnlineAccount::EPresenceHidden; +// else if (QContactPresence::PresenceBusy == aPresence) +// return CntTransformOnlineAccount::EPresenceBusy; +// else if (QContactPresence::PresenceAway == aPresence) +// return CntTransformOnlineAccount::EPresenceAway; +// else if (QContactPresence::PresenceExtendedAway == aPresence) +// return CntTransformOnlineAccount::EPresenceExtendedAway; +// else if (QContactPresence::PresenceUnknown == aPresence) +// return CntTransformOnlineAccount::EPresenceUnknown; +// else return CntTransformOnlineAccount::EPresenceOffline; } @@ -328,20 +359,22 @@ */ 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; + //FIXME:presence +// if (CntTransformOnlineAccount::EPresenceAvailable == aPresence) +// return QContactPresence::PresenceAvailable; +// else if (CntTransformOnlineAccount::EPresenceHidden == aPresence) +// return QContactPresence::PresenceHidden; +// else if (CntTransformOnlineAccount::EPresenceBusy == aPresence) +// return QContactPresence::PresenceBusy; +// else if ( CntTransformOnlineAccount::EPresenceAway == aPresence) +// return QContactPresence::PresenceAway; +// else if ( CntTransformOnlineAccount::EPresenceExtendedAway == aPresence) +// return QContactPresence::PresenceExtendedAway; +// else if ( CntTransformOnlineAccount::EPresenceUnknown == aPresence) +// return QContactPresence::PresenceUnknown; +// else +// return QContactPresence::PresenceOffline; + return QString(); } #endif // SYMBIAN_BACKEND_USE_SQLITE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformorganisation.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformorganisation.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformorganisation.cpp Mon May 03 12:24:20 2010 +0300 @@ -157,7 +157,7 @@ if (QContactOrganization::FieldName == fieldName) return KUidContactFieldCompanyName.iUid; - else if (QContactOrganization::FieldLogo == fieldName) + else if (QContactOrganization::FieldLogoUrl == fieldName) return 0; else if (QContactOrganization::FieldDepartment == fieldName) return KUidContactFieldDepartmentName.iUid; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformphonenumber.cpp --- a/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformphonenumber.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformphonenumber.cpp Mon May 03 12:24:20 2010 +0300 @@ -83,7 +83,7 @@ } //fax - else if (subTypes.contains(QContactPhoneNumber::SubTypeFacsimile)) + else if (subTypes.contains(QContactPhoneNumber::SubTypeFax)) { newField->AddFieldTypeL(KUidContactFieldFax); newField->SetMapping(KUidContactFieldVCardMapTEL); @@ -185,7 +185,7 @@ } } else if (field.ContentType().ContainsFieldType(KUidContactFieldFax)) { - phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeFacsimile); + phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeFax); } else if (field.ContentType().ContainsFieldType(KUidContactFieldDTMF)) { phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeDtmfMenu); @@ -255,27 +255,27 @@ if (QContactPhoneNumber::FieldNumber == fieldName) return 0; else if (QContactPhoneNumber::SubTypeLandline == fieldName) - return 0; + return KUidContactFieldPhoneNumber.iUid; else if (QContactPhoneNumber::SubTypeMobile == fieldName) - return 0; - else if (QContactPhoneNumber::SubTypeFacsimile == fieldName) + return KUidContactFieldPhoneNumber.iUid; + else if (QContactPhoneNumber::SubTypeFax == fieldName) return KUidContactFieldFax.iUid; else if (QContactPhoneNumber::SubTypePager == fieldName) - return 0; + return KUidContactFieldPhoneNumber.iUid; else if (QContactPhoneNumber::SubTypeVoice == fieldName) return 0; else if (QContactPhoneNumber::SubTypeModem == fieldName) - return 0; + return KUidContactFieldPhoneNumber.iUid; else if (QContactPhoneNumber::SubTypeVideo == fieldName) - return 0; + return KUidContactFieldPhoneNumber.iUid; else if (QContactPhoneNumber::SubTypeCar == fieldName) - return 0; + return KUidContactFieldPhoneNumber.iUid; else if (QContactPhoneNumber::SubTypeBulletinBoardSystem == fieldName) - return 0; + return KUidContactFieldPhoneNumber.iUid; else if (QContactPhoneNumber::SubTypeMessagingCapable == fieldName) return 0; else if (QContactPhoneNumber::SubTypeAssistant == fieldName) - return 0; + return KUidContactFieldPhoneNumber.iUid; else if (QContactPhoneNumber::SubTypeDtmfMenu == fieldName) return KUidContactFieldDTMF.iUid; else diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformringtone.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformringtone.cpp Mon May 03 12:24:20 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 "cnttransformringtone.h" +#include "cntmodelextuids.h" + +#include "qcontactringtone.h" + +QList CntTransformRingtone::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactRingtone::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + const QContactRingtone &ringtone(static_cast(detail)); + + if (ringtone.audioRingtoneUrl().isValid()) { + transformToTextFieldL(detail, fieldList, + ringtone.audioRingtoneUrl().toString(), KUidContactFieldRingTone, + KUidContactFieldVCardMapUnknown, false); + } + + if (ringtone.videoRingtoneUrl().isValid()) { + transformToTextFieldL(detail, fieldList, + ringtone.videoRingtoneUrl().toString(), KUidContactFieldVideoRingTone, + KUidContactFieldVCardMapUnknown, false); + } + + return fieldList; +} + +QContactDetail *CntTransformRingtone::transformItemField(const CContactItemField& field, const QContact &contact) +{ + QContactRingtone *ringtone = new QContactRingtone(contact.detail()); + + // XXX ringtone can have multiple values from different fields glommed together + CContactTextField* storage = field.TextStorage(); + QString ringtoneString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length()); + + if (field.ContentType().ContainsFieldType(KUidContactFieldRingTone)) { + ringtone->setAudioRingtoneUrl(ringtoneString); + } + else if (field.ContentType().ContainsFieldType(KUidContactFieldVideoRingTone)) { + ringtone->setVideoRingtoneUrl(ringtoneString); + } + + // XXX need to remove old one somehow + + return ringtone; +} + +bool CntTransformRingtone::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldRingTone.iUid || + fieldType == KUidContactFieldVideoRingTone.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformRingtone::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactRingtone::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformRingtone::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 CntTransformRingtone::supportsSubType(const QString& /*subType*/) const +{ + // XXX todo + 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 CntTransformRingtone::getIdForField(const QString& /*fieldName*/) const +{ + // XXX todo + 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 CntTransformRingtone::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + + if(definitions.contains(QContactRingtone::DefinitionName)) { + QContactDetailDefinition d = definitions.value(QContactRingtone::DefinitionName); + QMap fields = d.fields(); + + // Context not supported in symbian back-end, remove + fields.remove(QContactRingtone::FieldContext); + // nor vibe thingy + fields.remove(QContactRingtone::FieldVibrationRingtoneUrl); + + d.setFields(fields); + d.setUnique(true); + + // Replace original definitions + definitions.insert(d.name(), d); + } +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformthumbnail.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbian/src/transform/cnttransformthumbnail.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,182 @@ +/**************************************************************************** +** +** 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 "cnttransformthumbnail.h" +#include "cntmodelextuids.h" + +#include "qcontactthumbnail.h" +#include "cntsymbiantransformerror.h" + +#include +#include + +const TSize KMaxThumbnailSize(80, 96); + +CntTransformThumbnail::CntTransformThumbnail() : + m_thumbnailCreator(0) +{ +} + +CntTransformThumbnail::~CntTransformThumbnail() +{ + delete m_thumbnailCreator; +} + +QList CntTransformThumbnail::transformDetailL(const QContactDetail &detail) +{ + if(detail.definitionName() != QContactThumbnail::DefinitionName) + User::Leave(KErrArgument); + + QList fieldList; + + //cast to thumbnail + const QContactThumbnail &thumbnail(static_cast(detail)); + + if(!thumbnail.thumbnail().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 = QPixmap::fromImage(thumbnail.thumbnail().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 *CntTransformThumbnail::transformItemField(const CContactItemField& field, const QContact &contact) +{ + Q_UNUSED(contact); + + QContactThumbnail *thumbnail = new QContactThumbnail(); + + if (field.ContentType().ContainsFieldType(KUidContactFieldPicture) + || field.ContentType().ContainsFieldType(KUidContactFieldVCardMapJPEG)) { + // use the existing QContactAvatar (if available) in case of a pixmap + // field. + CContactStoreField* storage = field.StoreStorage(); + QImage image; + HBufC8 *theThing = storage->Thing(); + QByteArray bytes((char*)theThing->Ptr(), theThing->Length()); + bool loaded = image.loadFromData(bytes, "JPG"); + if (loaded) { + thumbnail->setThumbnail(image); + } else { + User::Leave(KErrInvalidContactDetail); + } + } + + return thumbnail; +} + +bool CntTransformThumbnail::supportsField(TUint32 fieldType) const +{ + bool ret = false; + if (fieldType == KUidContactFieldPicture.iUid + // Used as "extra mapping/extra field type" by thumbnail data fields + || fieldType == KUidContactFieldVCardMapJPEG.iUid) { + ret = true; + } + return ret; +} + +bool CntTransformThumbnail::supportsDetail(QString detailName) const +{ + bool ret = false; + if (detailName == QContactThumbnail::DefinitionName) { + ret = true; + } + return ret; +} + +QList CntTransformThumbnail::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 CntTransformThumbnail::supportsSubType(const QString& /*subType*/) const +{ + // XXX todo + 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 CntTransformThumbnail::getIdForField(const QString& /*fieldName*/) const +{ + // XXX todo + 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 CntTransformThumbnail::detailDefinitions(QMap &definitions, const QString& contactType) const +{ + Q_UNUSED(contactType); + Q_UNUSED(definitions); + // Don't need to munge the definition +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbian/symbian.pro --- a/qtcontactsmobility/plugins/contacts/symbian/symbian.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbian/symbian.pro Mon May 03 12:24:20 2010 +0300 @@ -41,8 +41,9 @@ inc/transform/cnttransformbirthday.h \ inc/transform/cnttransformonlineaccount.h \ inc/transform/cnttransformorganisation.h \ + inc/transform/cnttransformringtone.h \ + inc/transform/cnttransformthumbnail.h \ inc/transform/cnttransformavatar.h \ - inc/transform/cnttransformavatarsimple.h \ inc/transform/cntthumbnailcreator.h \ inc/transform/cnttransformsynctarget.h \ inc/transform/cnttransformgender.h \ @@ -85,8 +86,9 @@ src/transform/cnttransformbirthday.cpp \ src/transform/cnttransformonlineaccount.cpp \ src/transform/cnttransformorganisation.cpp \ + src/transform/cnttransformringtone.cpp \ + src/transform/cnttransformthumbnail.cpp \ src/transform/cnttransformavatar.cpp \ - src/transform/cnttransformavatarsimple.cpp \ src/transform/cntthumbnailcreator.cpp\ src/transform/cnttransformsynctarget.cpp \ src/transform/cnttransformgender.cpp \ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/bwins/mobapicontactspluginsymbiansimu.def --- a/qtcontactsmobility/plugins/contacts/symbiansim/bwins/mobapicontactspluginsymbiansimu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -EXPORTS - qt_plugin_instance @ 1 NONAME - qt_plugin_query_verification_data @ 2 NONAME - ?managerName@CntSymbianSimFactory@@UBE?AVQString@@XZ @ 3 NONAME ; class QString CntSymbianSimFactory::managerName(void) const - ?qt_metacast@CntSymbianSimFactory@@UAEPAXPBD@Z @ 4 NONAME ; void * CntSymbianSimFactory::qt_metacast(char const *) - ?metaObject@CntSymbianSimFactory@@UBEPBUQMetaObject@@XZ @ 5 NONAME ; struct QMetaObject const * CntSymbianSimFactory::metaObject(void) const - ?trUtf8@CntSymbianSimFactory@@SA?AVQString@@PBD0@Z @ 6 NONAME ; class QString CntSymbianSimFactory::trUtf8(char const *, char const *) - ?tr@CntSymbianSimFactory@@SA?AVQString@@PBD0H@Z @ 7 NONAME ; class QString CntSymbianSimFactory::tr(char const *, char const *, int) - ?tr@CntSymbianSimFactory@@SA?AVQString@@PBD0@Z @ 8 NONAME ; class QString CntSymbianSimFactory::tr(char const *, char const *) - ??_ECntSymbianSimFactory@@UAE@I@Z @ 9 NONAME ; CntSymbianSimFactory::~CntSymbianSimFactory(unsigned int) - ?getStaticMetaObject@CntSymbianSimFactory@@SAABUQMetaObject@@XZ @ 10 NONAME ; struct QMetaObject const & CntSymbianSimFactory::getStaticMetaObject(void) - ??0CntSymbianSimFactory@@QAE@XZ @ 11 NONAME ; CntSymbianSimFactory::CntSymbianSimFactory(void) - ?engine@CntSymbianSimFactory@@UAEPAVQContactManagerEngine@QtMobility@@ABV?$QMap@VQString@@V1@@@AAW4Error@QContactManager@3@@Z @ 12 NONAME ; class QtMobility::QContactManagerEngine * CntSymbianSimFactory::engine(class QMap const &, enum QtMobility::QContactManager::Error &) - ?staticMetaObject@CntSymbianSimFactory@@2UQMetaObject@@B @ 13 NONAME ; struct QMetaObject const CntSymbianSimFactory::staticMetaObject - ??1CntSymbianSimFactory@@UAE@XZ @ 14 NONAME ; CntSymbianSimFactory::~CntSymbianSimFactory(void) - ?trUtf8@CntSymbianSimFactory@@SA?AVQString@@PBD0H@Z @ 15 NONAME ; class QString CntSymbianSimFactory::trUtf8(char const *, char const *, int) - ?qt_metacall@CntSymbianSimFactory@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 16 NONAME ; int CntSymbianSimFactory::qt_metacall(enum QMetaObject::Call, int, void * *) - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/eabi/mobapicontactspluginsymbiansimu.def --- a/qtcontactsmobility/plugins/contacts/symbiansim/eabi/mobapicontactspluginsymbiansimu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -EXPORTS - _ZN20CntSymbianSimFactory11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME - _ZN20CntSymbianSimFactory11qt_metacastEPKc @ 2 NONAME - _ZN20CntSymbianSimFactory16staticMetaObjectE @ 3 NONAME DATA 16 - _ZN20CntSymbianSimFactory19getStaticMetaObjectEv @ 4 NONAME - _ZN20CntSymbianSimFactory6engineERK4QMapI7QStringS1_ERN10QtMobility15QContactManager5ErrorE @ 5 NONAME - _ZNK20CntSymbianSimFactory10metaObjectEv @ 6 NONAME - _ZNK20CntSymbianSimFactory11managerNameEv @ 7 NONAME - _ZTI20CntSymbianSimFactory @ 8 NONAME - _ZTV20CntSymbianSimFactory @ 9 NONAME - _ZThn8_N20CntSymbianSimFactory6engineERK4QMapI7QStringS1_ERN10QtMobility15QContactManager5ErrorE @ 10 NONAME - _ZThn8_NK20CntSymbianSimFactory11managerNameEv @ 11 NONAME - qt_plugin_instance @ 12 NONAME - qt_plugin_query_verification_data @ 13 NONAME - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntabstractsimrequest.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntabstractsimrequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntabstractsimrequest.h Mon May 03 12:24:20 2010 +0300 @@ -43,27 +43,51 @@ #define CNTABSTRACTSIMREQUEST_H_ #include +#include + +QTM_BEGIN_NAMESPACE +class QContactAbstractRequest; +QTM_END_NAMESPACE +QTM_USE_NAMESPACE class CntSymbianSimEngine; class CntSimStore; class QTimer; +#ifdef SYMBIANSIM_BACKEND_USE_DELAY +const int KRequestDelay = 10; // in ms +#else +const int KRequestDelay = 0; +#endif +const int KMaxRetryCount = 10; + class CntAbstractSimRequest : public QObject { Q_OBJECT public: - CntAbstractSimRequest(CntSymbianSimEngine *engine); - virtual bool start() = 0; - virtual bool cancel() = 0; + CntAbstractSimRequest(CntSymbianSimEngine *engine, QContactAbstractRequest *req); + bool start(); + +public Q_SLOTS: + virtual void run() = 0; + virtual bool cancel(); + protected: + bool waitAndRetry(); void singleShotTimer(int msec, QObject *receiver, const char *member); void cancelTimer(); CntSymbianSimEngine *engine(); CntSimStore *simStore(); + QContactAbstractRequest *req() { return m_request; } + + template + T *req() { return static_cast(m_request); } private: + QContactAbstractRequest *m_request; QTimer *m_timer; + int m_retryCount; }; #endif // CNTABSTRACTSIMREQUEST_H_ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactfetchrequest.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactfetchrequest.h Mon May 03 12:24:20 2010 +0300 @@ -44,18 +44,6 @@ #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 @@ -63,16 +51,14 @@ Q_OBJECT public: CntSimContactFetchRequest(CntSymbianSimEngine *engine, QContactFetchRequest *req); - virtual ~CntSimContactFetchRequest(); - bool start(); - bool cancel(); + ~CntSimContactFetchRequest(); -public Q_SLOTS: - void getInfoComplete(RMobilePhoneBookStore::TMobilePhoneBookInfoV5 info, QContactManager::Error error); +public Q_SLOTS: + // from CntAbstractSimRequest + void run(); + +private Q_SLOTS: void readComplete(QList contacts, QContactManager::Error error); - -private: - QContactFetchRequest *m_req; }; #endif // CNTSIMCONTACTFETCHREQUEST_H_ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactlocalidfetchrequest.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactlocalidfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactlocalidfetchrequest.h Mon May 03 12:24:20 2010 +0300 @@ -44,18 +44,6 @@ #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 @@ -64,15 +52,13 @@ 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; +public Q_SLOTS: + // from CntAbstractSimRequest + void run(); + +private Q_SLOTS: + void readComplete(QList contacts, QContactManager::Error error); }; #endif // CNTSIMCONTACTLOCALIDFETCHREQUEST_H_ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactremoverequest.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactremoverequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactremoverequest.h Mon May 03 12:24:20 2010 +0300 @@ -44,18 +44,6 @@ #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 @@ -64,18 +52,22 @@ public: CntSimContactRemoveRequest(CntSymbianSimEngine *engine, QContactRemoveRequest *req); virtual ~CntSimContactRemoveRequest(); - bool start(); - bool cancel(); - -public Q_SLOTS: + +public Q_SLOTS: + // from CntAbstractSimRequest + void run(); + +private Q_SLOTS: void removeComplete(QContactManager::Error error); void removeNext(); - + void getReservedSlotsComplete(QList reservedSlots, QContactManager::Error error); + void getReservedSlots(); + private: - QContactRemoveRequest *m_req; QList m_contactIds; int m_index; - QMap m_errorMap; + QMap m_errorMap; + QList m_reservedSlots; }; #endif // CNTSIMCONTACTREMOVEREQUEST_H_ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactsaverequest.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactsaverequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimcontactsaverequest.h Mon May 03 12:24:20 2010 +0300 @@ -44,18 +44,6 @@ #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 @@ -64,15 +52,16 @@ public: CntSimContactSaveRequest(CntSymbianSimEngine *engine, QContactSaveRequest *req); virtual ~CntSimContactSaveRequest(); - bool start(); - bool cancel(); -public Q_SLOTS: +public Q_SLOTS: + // from CntAbstractSimRequest + void run(); + +private Q_SLOTS: void writeComplete(QContact contact, QContactManager::Error error); - void writeNext(); + void writeNext(); private: - QContactSaveRequest *m_req; QList m_contacts; int m_index; QMap m_errorMap; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimdetaildefinitionfetchrequest.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimdetaildefinitionfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimdetaildefinitionfetchrequest.h Mon May 03 12:24:20 2010 +0300 @@ -44,18 +44,6 @@ #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 @@ -64,15 +52,10 @@ public: CntSimDetailDefinitionFetchRequest(CntSymbianSimEngine *engine, QContactDetailDefinitionFetchRequest *req); virtual ~CntSimDetailDefinitionFetchRequest(); - bool start(); - bool cancel(); - -public Q_SLOTS: - void readDetailDefinitions(); - -private: - QContactDetailDefinitionFetchRequest *m_req; +public Q_SLOTS: + // from CntAbstractSimRequest + void run(); }; #endif // CNTSIMDETAILDEFINITIONFETCHREQUEST_H_ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstore.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstore.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstore.h Mon May 03 12:24:20 2010 +0300 @@ -53,6 +53,14 @@ QTM_USE_NAMESPACE +#ifdef SYMBIANSIM_BACKEND_PHONEBOOKINFOV1 +typedef RMobilePhoneBookStore::TMobilePhoneBookInfoV1 TSimStoreInfo; +typedef RMobilePhoneBookStore::TMobilePhoneBookInfoV1Pckg TSimStoreInfoPckg; +#else +typedef RMobilePhoneBookStore::TMobilePhoneBookInfoV5 TSimStoreInfo; +typedef RMobilePhoneBookStore::TMobilePhoneBookInfoV5Pckg TSimStoreInfoPckg; +#endif + class CntSimStorePrivate; class CntSymbianSimEngine; @@ -60,29 +68,34 @@ { Q_OBJECT public: - CntSimStore(CntSymbianSimEngine* engine); + CntSimStore(CntSymbianSimEngine* engine, QString storeName, QContactManager::Error* error); ~CntSimStore(); - - QContactManager::Error getInfo(); - QContactManager::Error read(int index, int numSlots); - QContactManager::Error write(const QContact &contact); - QContactManager::Error remove(int index); + + QString storeName(); + TSimStoreInfo storeInfo(); + + bool read(int index, int numSlots, QContactManager::Error* error); + bool write(const QContact &contact, QContactManager::Error* error); + bool remove(int index, QContactManager::Error* error); + bool getReservedSlots(QContactManager::Error* error); + void cancel(); bool isBusy(); + + TInt lastAsyncError(); 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); + void getReservedSlotsComplete(QList reservedSlots, QContactManager::Error error); private: CntSimStorePrivate *d_ptr; friend class CntSimStorePrivate; }; - #endif // CNTSIMSTORE_H_ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstoreeventlistener.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstoreeventlistener.h Mon May 03 12:24:20 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 CNTSIMSTOREEVENTLISTENER_H_ +#define CNTSIMSTOREEVENTLISTENER_H_ + +#include + +class CntSymbianSimEngine; +class RMobilePhoneBookStore; + +class CntSimStoreEventListener : public CActive +{ +public: + CntSimStoreEventListener(CntSymbianSimEngine &engine, RMobilePhoneBookStore& store); + ~CntSimStoreEventListener(); + + void start(); + + // from CActive + void DoCancel(); + void RunL(); + +private: + CntSymbianSimEngine &m_engine; + RMobilePhoneBookStore &m_store; + TUint32 m_event; + TInt m_index; +}; + +#endif // CNTSIMSTOREEVENTLISTENER_H_ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstoreprivate.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstoreprivate.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsimstoreprivate.h Mon May 03 12:24:20 2010 +0300 @@ -1,3 +1,4 @@ + /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). @@ -51,29 +52,36 @@ #include #include "cntsymbiansimengine.h" +#include "cntsimstore.h" QTM_USE_NAMESPACE class CntSimStore; class CntSymbianSimEngine; +class CntSimStoreEventListener; class CntSimStorePrivate : public CActive { public: enum State { InactiveState, - GetInfoState, ReadState, WriteState, - DeleteState + DeleteState, + ReadReservedSlotsState }; - CntSimStorePrivate(CntSymbianSimEngine &engine, CntSimStore &simStore); + static CntSimStorePrivate* NewL(CntSymbianSimEngine &engine, CntSimStore &simStore, const QString &storeName); ~CntSimStorePrivate(); + + QString storeName() { return m_storeName; } + TSimStoreInfo storeInfo() { return m_storeInfo; } - QContactManager::Error getInfo(); - QContactManager::Error read(int index, int numSlots); - QContactManager::Error write(const QContact &contact); - QContactManager::Error remove(int index); + bool read(int index, int numSlots, QContactManager::Error *error); + bool write(const QContact &contact, QContactManager::Error *error); + bool remove(int index, QContactManager::Error *error); + bool getReservedSlots(QContactManager::Error *error); + + TInt lastAsyncError() { return m_asyncError; } private: // from CActive @@ -82,18 +90,31 @@ TInt RunError(TInt aError); private: - RMobilePhoneBookStore &mobilePhoneBookStore() - { return m_engine.store(); } + CntSimStorePrivate(CntSymbianSimEngine &engine, CntSimStore &simStore, const QString &storeName); + void ConstructL(); + void convertStoreNameL(TDes &storeName); + QList decodeSimContactsL(TDes8& rawData) const; + void encodeSimContactL(QContact* contact, TDes8& rawData) const; + void putTagAndValueL(CPhoneBookBuffer* pbBuffer, TUint8 tag, QString data) const; + QList decodeReservedSlotsL(TDes8& rawData) const; private: State m_state; CntSymbianSimEngine &m_engine; + QString m_managerUri; CntSimStore &m_simStore; - RMobilePhoneBookStore::TMobilePhoneBookInfoV5 m_etelStoreInfo; - RMobilePhoneBookStore::TMobilePhoneBookInfoV5Pckg m_etelInfoPckg; + RTelServer m_etelServer; + RMobilePhone m_etelPhone; + RMobilePhoneBookStore m_etelStore; + QString m_storeName; + bool m_readOnlyAccess; + TSimStoreInfo m_storeInfo; + TSimStoreInfoPckg m_storeInfoPckg; RBuf8 m_buffer; QContact m_convertedContact; int m_writeIndex; + CntSimStoreEventListener* m_listener; + TInt m_asyncError; }; #endif // CNTSIMSTOREPRIVATE_H_ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsymbiansimengine.h --- a/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsymbiansimengine.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsymbiansimengine.h Mon May 03 12:24:20 2010 +0300 @@ -52,45 +52,106 @@ // // We mean it. // +#include "qtcontactsglobal.h" #include "qcontactmanagerengine.h" #include "qcontactmanagerenginefactory.h" +#include +#include -#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER -#include +//#define SYMBIANSIM_BACKEND_DEBUG + +namespace { +#ifdef SYMBIANSIM_BACKEND_DEBUG + void PbkPrintToLog( TRefByValue aFormat, ... ) + { + _LIT( KLogDir, "Sim" ); + _LIT( KLogName, "sim.log" ); + + VA_LIST args; + VA_START( args, aFormat ); + RFileLogger::WriteFormat(KLogDir, KLogName, EFileLoggingModeAppend, aFormat, args); + VA_END( args ); + } #else -#include -#endif + void PbkPrintToLog( TRefByValue aFormat, ... ) { Q_UNUSED(aFormat); } +#endif +} // namespace QTM_USE_NAMESPACE #define CNT_SYMBIANSIM_MANAGER_NAME "symbiansim" +Q_DEFINE_LATIN1_CONSTANT(KSimSyncTarget, "SIM"); +Q_DEFINE_LATIN1_CONSTANT(KParameterKeySimStoreName, "store"); +Q_DEFINE_LATIN1_CONSTANT(KParameterValueSimStoreNameAdn, "ADN"); +Q_DEFINE_LATIN1_CONSTANT(KParameterValueSimStoreNameSdn, "SDN"); +Q_DEFINE_LATIN1_CONSTANT(KParameterValueSimStoreNameFdn, "FDN"); + class CntSimStore; class CntAbstractSimRequest; +class CntSymbianSimEngineData : public QSharedData +{ +public: + CntSymbianSimEngineData(); + ~CntSymbianSimEngineData(); + + CntSimStore *m_simStore; + QMap m_asyncRequests; +}; + class CntSymbianSimEngine : public QContactManagerEngine { Q_OBJECT public: - CntSymbianSimEngine(const QMap& parameters, QContactManager::Error& error); + CntSymbianSimEngine(const QMap& parameters, QContactManager::Error* error); + CntSymbianSimEngine(const CntSymbianSimEngine &other); ~CntSymbianSimEngine(); - void deref(); + QString managerName() const; + QMap managerParameters() const {return QMap();} + int managerVersion() const { return 1;} + + /* Defaulted functions - XXX check*/ + QContact compatibleContact(const QContact&, QContactManager::Error* error) const {*error = QContactManager::NotSupportedError;return QContact();} + bool validateContact(const QContact& contact, QContactManager::Error* error) const {return QContactManagerEngine::validateContact(contact, error);} + bool validateDefinition(const QContactDetailDefinition& def, QContactManager::Error* error) const {return QContactManagerEngine::validateDefinition(def, error);} + QContactDetailDefinition detailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error) const {return QContactManagerEngine::detailDefinition(definitionId, contactType, error);} + bool saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error* error) {return QContactManagerEngine::saveDetailDefinition(def, contactType, error);} + bool removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error) {return QContactManagerEngine::removeDetailDefinition(definitionId, contactType, error);} + QList relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const + { + return QContactManagerEngine::relationships(relationshipType, participantId, role, error); + } + bool saveRelationships(QList* relationships, QMap* errorMap, QContactManager::Error* error) + { + return QContactManagerEngine::saveRelationships(relationships, errorMap, error); + } + bool removeRelationships(const QList& relationships, QMap* errorMap, QContactManager::Error* error) + { + return QContactManagerEngine::removeRelationships(relationships, errorMap, error); + } + bool isRelationshipTypeSupported(const QString&, const QString&) const {return false;} + bool isFilterSupported(const QContactFilter&) const {return false;} + QList supportedDataTypes() const {return QContactManagerEngine::supportedDataTypes();} + bool setSelfContactId(const QContactLocalId& contactId, QContactManager::Error* error) {return QContactManagerEngine::setSelfContactId(contactId, error);} + QContactLocalId selfContactId(QContactManager::Error* error) const {return QContactManagerEngine::selfContactId(error);} + /* Contacts - Accessors and Mutators */ - 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; + QList contactIds(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error* error) const; + QList contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fetchHint, QContactManager::Error* error) const; + QContact contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const; - bool saveContact(QContact* contact, QContactManager::Error& error); - bool removeContact(const QContactLocalId& contactId, QContactManager::Error& error); + bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error* error); + bool removeContacts(const QList& contactIds, QMap* errorMap, QContactManager::Error* error); + /* Synthesize the display label of a contact */ + QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const; + /* Definitions - Accessors and Mutators */ - QMap detailDefinitions(const QString& contactType, QContactManager::Error& error) const; + QMap detailDefinitions(const QString& contactType, QContactManager::Error* error) const; /* Asynchronous Request Support */ void requestDestroyed(QContactAbstractRequest* req); @@ -98,49 +159,28 @@ bool cancelRequest(QContactAbstractRequest* req); bool waitForRequestFinished(QContactAbstractRequest* req, int msecs); - /* Functionality reporting */ + /* Capabilities reporting */ 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; QStringList supportedContactTypes() const; - /* Synthesize the display label of a contact */ - 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; } + CntSimStore* simStore() { return d->m_simStore; } + void setReadOnlyAccessConstraint(QContactDetail* detail) const; private: - void getEtelStoreInfoL() const; - QContact fetchContactL(const QContactLocalId &localId) const; - QList fetchContactsL() const; - void saveContactL(QContact* contact) const; - void doSaveContactL(QContact* contact) const; + bool executeRequest(QContactAbstractRequest *req, QContactManager::Error* qtError) const; private: - RTelServer m_etelServer; - RMobilePhone m_etelPhone; - RMobilePhoneBookStore m_etelStore; - RMobilePhoneBookStore::TMobilePhoneBookInfoV5 m_etelStoreInfo; - RMobilePhoneBookStore::TMobilePhoneBookInfoV5Pckg m_etelStoreInfoPckg; - - QString m_managerUri; - CntSimStore *m_simStore; - QMap m_asyncRequests; + QExplicitlySharedDataPointer d; }; -class Q_DECL_EXPORT CntSymbianSimFactory : public QObject, public QContactManagerEngineFactory +class CntSymbianSimFactory : public QObject, public QContactManagerEngineFactory { Q_OBJECT Q_INTERFACES(QtMobility::QContactManagerEngineFactory) public: - QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error& error); + QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error* error); QString managerName() const; }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsymbiansimtransformerror.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/inc/cntsymbiansimtransformerror.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** 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 CNTSYMBIANSIMTRANSFORMERROR_H +#define CNTSYMBIANSIMTRANSFORMERROR_H + +#include +#include + +QTM_USE_NAMESPACE +class CntSymbianSimTransformError +{ +public: + static void transformError(TInt symbianError, QContactManager::Error* qtError); +}; + +#endif // CNTSYMBIANSIMTRANSFORMERROR_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntabstractsimrequest.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntabstractsimrequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntabstractsimrequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -44,13 +44,49 @@ #include "cntsimstore.h" #include -CntAbstractSimRequest::CntAbstractSimRequest(CntSymbianSimEngine *engine) +CntAbstractSimRequest::CntAbstractSimRequest(CntSymbianSimEngine *engine, QContactAbstractRequest *req) :QObject(engine), - m_timer(0) + m_request(req), + m_timer(0), + m_retryCount(0) { } +bool CntAbstractSimRequest::start() +{ + if (m_request->isActive()) + return false; + + m_retryCount = 0; + + singleShotTimer(KRequestDelay, this, SLOT(run())); + QContactManagerEngine::updateRequestState(m_request, QContactAbstractRequest::ActiveState); + return true; +} + +bool CntAbstractSimRequest::cancel() +{ + if (m_request->isActive()) { + cancelTimer(); + simStore()->cancel(); + QContactManagerEngine::updateRequestState(m_request, QContactAbstractRequest::CanceledState); + return true; + } + return false; +} + +bool CntAbstractSimRequest::waitAndRetry() +{ + if (m_retryCount < KMaxRetryCount) + { + singleShotTimer(KRequestDelay, this, SLOT(run())); + m_retryCount++; + return true; + } + return false; +} + void CntAbstractSimRequest::singleShotTimer(int msec, QObject *receiver, const char *member) { // We could use QTimer::singleShot but there is no way to cancel it... @@ -71,6 +107,7 @@ { return static_cast(parent()); } + CntSimStore *CntAbstractSimRequest::simStore() { return engine()->simStore(); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactfetchrequest.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactfetchrequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -43,14 +43,11 @@ #include "cntsymbiansimengine.h" #include "cntsimstore.h" #include +#include CntSimContactFetchRequest::CntSimContactFetchRequest(CntSymbianSimEngine *engine, QContactFetchRequest *req) - :CntAbstractSimRequest(engine), - m_req(req) + :CntAbstractSimRequest(engine, 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 ); } @@ -60,52 +57,61 @@ 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() +void CntSimContactFetchRequest::run() { - if (m_req->isActive()) { - simStore()->cancel(); - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::CanceledState); - return true; - } - return false; -} + QContactFetchRequest *r = req(); + + if (!r->isActive()) + return; + + // Get filter + QContactLocalIdFilter lidFilter; + if (r->filter().type() == QContactFilter::LocalIdFilter) { + lidFilter = static_cast(r->filter()); + } -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); - } + // Fetch all contacts and filter the results. + // Contacts are fetched starting from index 1, all slots are read + // since slots may be not filled in a sequence. + int index = 1; + int numSlots = simStore()->storeInfo().iTotalEntries; + + if (lidFilter.ids().count() == 1) { + // Optimization for performance. Fetch a single contact from store. + // This is mainly for CntSymbianSimEngine::contact(). + index = lidFilter.ids().at(0); + numSlots = 1; + } - if (error) { - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); - QContactManagerEngine::updateContactFetchRequest(m_req, QList(), error); + QContactManager::Error error = QContactManager::NoError; + if (!simStore()->read(index, numSlots, &error)) { + QContactManagerEngine::updateContactFetchRequest(r, QList(), error, QContactAbstractRequest::FinishedState); } } void CntSimContactFetchRequest::readComplete(QList contacts, QContactManager::Error error) { + QContactFetchRequest *r = req(); + + if (!r->isActive()) + return; + + // Sometimes the sim store will return server busy error. All we can do is + // wait and try again. The error seems to occur if we try to read from the + // store right after writing some contacts to it. + // This was observed with S60 5.0 HW (Tube). + if (simStore()->lastAsyncError() == KErrServerBusy) { + if (waitAndRetry()) + return; + } + // Filter & sort results QList filteredAndSorted; for (int i=0; ifilter(), contacts.at(i))) - QContactManagerEngine::addSorted(&filteredAndSorted, contacts.at(i), m_req->sorting()); + if (QContactManagerEngine::testFilter(r->filter(), contacts.at(i))) + QContactManagerEngine::addSorted(&filteredAndSorted, contacts.at(i), r->sorting()); } // Complete the request - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); - QContactManagerEngine::updateContactFetchRequest(m_req, filteredAndSorted, error); + QContactManagerEngine::updateContactFetchRequest(r, filteredAndSorted, error, QContactAbstractRequest::FinishedState); } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactlocalidfetchrequest.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactlocalidfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactlocalidfetchrequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -45,12 +45,8 @@ #include CntSimContactLocalIdFetchRequest::CntSimContactLocalIdFetchRequest(CntSymbianSimEngine *engine, QContactLocalIdFetchRequest *req) - :CntAbstractSimRequest(engine), - m_req(req) + :CntAbstractSimRequest(engine, 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 ); } @@ -60,49 +56,47 @@ 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() +void CntSimContactLocalIdFetchRequest::run() { - 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); + QContactLocalIdFetchRequest *r = req(); + + if (!r->isActive()) + return; + + // Contacts are fetched starting from index 1, all slots are read + // since slots may be not filled in a sequence. + int index = 1; + int numSlots = simStore()->storeInfo().iTotalEntries; + + QContactManager::Error error = QContactManager::NoError; + if (!simStore()->read(index, numSlots, &error)) { + QContactManagerEngine::updateContactLocalIdFetchRequest(r, QList(), error, QContactAbstractRequest::FinishedState); } } void CntSimContactLocalIdFetchRequest::readComplete(QList contacts, QContactManager::Error error) { + QContactLocalIdFetchRequest *r = req(); + + if (!r->isActive()) + return; + + // Sometimes the sim store will return server busy error. All we can do is + // wait and try again. The error seems to occur if we try to read from the + // store right after writing some contacts to it. + // This was observed with S60 5.0 HW (Tube). + if (error == QContactManager::UnspecifiedError && + simStore()->lastAsyncError() == KErrServerBusy) + { + if (waitAndRetry()) + return; + } + // Filter & sort results QList filteredAndSorted; for (int i=0; ifilter(), contacts.at(i))) - QContactManagerEngine::addSorted(&filteredAndSorted, contacts.at(i), m_req->sorting()); + if (QContactManagerEngine::testFilter(r->filter(), contacts.at(i))) + QContactManagerEngine::addSorted(&filteredAndSorted, contacts.at(i), r->sorting()); } // Convert to QContactLocalId-list @@ -110,8 +104,7 @@ for (int i=0; i -#include +#include CntSimContactRemoveRequest::CntSimContactRemoveRequest(CntSymbianSimEngine *engine, QContactRemoveRequest *req) - :CntAbstractSimRequest(engine), - m_req(req) + :CntAbstractSimRequest(engine, req) { connect( simStore(), SIGNAL(removeComplete(QContactManager::Error)), this, SLOT(removeComplete(QContactManager::Error)), Qt::QueuedConnection ); + + connect( simStore(), SIGNAL(getReservedSlotsComplete(QList, QContactManager::Error)), + this, SLOT(getReservedSlotsComplete(QList, QContactManager::Error)), Qt::QueuedConnection ); } CntSimContactRemoveRequest::~CntSimContactRemoveRequest() @@ -58,44 +60,49 @@ cancel(); } -bool CntSimContactRemoveRequest::start() -{ - if (simStore()->isBusy()) - return false; +void CntSimContactRemoveRequest::run() +{ + QContactRemoveRequest *r = req(); - m_contactIds = m_req->contactIds(); + if (!r->isActive()) + return; + + m_contactIds = r->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; +#ifdef SYMBIANSIM_BACKEND_CHECK_BEFORE_REMOVE + m_reservedSlots.clear(); + getReservedSlots(); +#else + removeNext(); +#endif } void CntSimContactRemoveRequest::removeComplete(QContactManager::Error error) { + if (!req()->isActive()) + return; + if (error) m_errorMap.insert(m_index, error); + m_index++; - removeNext(); + singleShotTimer(KRequestDelay, this, SLOT(removeNext())); } void CntSimContactRemoveRequest::removeNext() { - if (m_req->isCanceled()) + QContactRemoveRequest *r = req(); + + if (!r->isActive()) return; - // All contacts written? + if (r->contactIds().count() == 0) { + QContactManagerEngine::updateContactRemoveRequest(r, QContactManager::BadArgumentError, m_errorMap, QContactAbstractRequest::FinishedState); + return; + } + + // All contacts removed? if (m_index >= m_contactIds.count()) { // Take first error from errormap (if any) @@ -103,17 +110,55 @@ if (m_errorMap.count()) error = m_errorMap.begin().value(); - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); - QContactManagerEngine::updateContactRemoveRequest(m_req, error, m_errorMap); + QContactManagerEngine::updateContactRemoveRequest(r, error, m_errorMap, QContactAbstractRequest::FinishedState); return; } // Remove next contact QContactLocalId contactId = m_contactIds.at(m_index); - QContactManager::Error error = simStore()->remove(contactId); + QContactManager::Error error = QContactManager::NoError; + +#ifdef SYMBIANSIM_BACKEND_CHECK_BEFORE_REMOVE + if (m_reservedSlots.contains(contactId)) + simStore()->remove(contactId, &error); + else + error = QContactManager::DoesNotExistError; +#else + simStore()->remove(contactId, &error); +#endif + if (error) { m_errorMap.insert(m_index, error); m_index++; - singleShotTimer(0, this, SLOT(removeNext())); + singleShotTimer(KRequestDelay, this, SLOT(removeNext())); } } + +void CntSimContactRemoveRequest::getReservedSlotsComplete(QList reservedSlots, QContactManager::Error error) +{ + QContactRemoveRequest *r = req(); + + if (!r->isActive()) + return; + + if (error != QContactManager::NoError && error != QContactManager::DoesNotExistError) { + QContactManagerEngine::updateContactRemoveRequest(r, error, m_errorMap, QContactAbstractRequest::FinishedState); + return; + } + + m_reservedSlots = reservedSlots; + singleShotTimer(KRequestDelay, this, SLOT(removeNext())); +} + +void CntSimContactRemoveRequest::getReservedSlots() +{ + QContactRemoveRequest *r = req(); + + if (!r->isActive()) + return; + + QContactManager::Error error = QContactManager::NoError; + if (!simStore()->getReservedSlots(&error)) { + QContactManagerEngine::updateContactRemoveRequest(r, error, m_errorMap, QContactAbstractRequest::FinishedState); + } +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactsaverequest.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactsaverequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimcontactsaverequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -43,11 +43,9 @@ #include "cntsymbiansimengine.h" #include "cntsimstore.h" #include -#include CntSimContactSaveRequest::CntSimContactSaveRequest(CntSymbianSimEngine *engine, QContactSaveRequest *req) - :CntAbstractSimRequest(engine), - m_req(req) + :CntAbstractSimRequest(engine, req) { connect( simStore(), SIGNAL(writeComplete(QContact, QContactManager::Error)), this, SLOT(writeComplete(QContact, QContactManager::Error)), Qt::QueuedConnection ); @@ -58,45 +56,45 @@ cancel(); } -bool CntSimContactSaveRequest::start() +void CntSimContactSaveRequest::run() { - if (simStore()->isBusy()) - return false; + QContactSaveRequest *r = req(); - m_contacts = m_req->contacts(); + if (!r->isActive()) + return; + + m_contacts = r->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; + + writeNext(); } void CntSimContactSaveRequest::writeComplete(QContact contact, QContactManager::Error error) { + if (!req()->isActive()) + return; + if (error) m_errorMap.insert(m_index, error); engine()->updateDisplayLabel(contact); m_contacts[m_index] = contact; m_index++; - writeNext(); + singleShotTimer(KRequestDelay, this, SLOT(writeNext())); } void CntSimContactSaveRequest::writeNext() { - if (m_req->isCanceled()) + QContactSaveRequest *r = req(); + + if (!r->isActive()) return; + if (r->contacts().count() == 0) { + QContactManagerEngine::updateContactSaveRequest(r, QList(), QContactManager::BadArgumentError, m_errorMap, QContactAbstractRequest::FinishedState); + return; + } + // All contacts written? if (m_index >= m_contacts.count()) { @@ -104,9 +102,8 @@ 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); + + QContactManagerEngine::updateContactSaveRequest(r, m_contacts, error, m_errorMap, QContactAbstractRequest::FinishedState); return; } @@ -114,13 +111,13 @@ QContact contact = m_contacts.at(m_index); // Validate & write contact - QContactManager::Error error; - if (engine()->validateContact(contact, error)) - error = simStore()->write(contact); + QContactManager::Error error = QContactManager::NoError; + if (engine()->validateContact(contact, &error)) + simStore()->write(contact, &error); if (error) { m_errorMap.insert(m_index, error); m_index++; - singleShotTimer(0, this, SLOT(writeNext())); + singleShotTimer(KRequestDelay, this, SLOT(writeNext())); } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimdetaildefinitionfetchrequest.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimdetaildefinitionfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimdetaildefinitionfetchrequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -41,13 +41,10 @@ #include "cntsimdetaildefinitionfetchrequest.h" #include "cntsymbiansimengine.h" -#include "cntsimstore.h" #include -#include CntSimDetailDefinitionFetchRequest::CntSimDetailDefinitionFetchRequest(CntSymbianSimEngine *engine, QContactDetailDefinitionFetchRequest *req) - :CntAbstractSimRequest(engine), - m_req(req) + :CntAbstractSimRequest(engine, req) { } @@ -57,26 +54,11 @@ cancel(); } -bool CntSimDetailDefinitionFetchRequest::start() -{ - singleShotTimer(0, this, SLOT(readDetailDefinitions())); - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::ActiveState); - return true; -} - -bool CntSimDetailDefinitionFetchRequest::cancel() +void CntSimDetailDefinitionFetchRequest::run() { - if (m_req->isActive()) { - cancelTimer(); - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::CanceledState); - return true; - } - return false; -} - -void CntSimDetailDefinitionFetchRequest::readDetailDefinitions() -{ - if (m_req->isCanceled()) + QContactDetailDefinitionFetchRequest *r = req(); + + if (!r->isActive()) return; QContactManager::Error error = QContactManager::NoError; @@ -84,30 +66,31 @@ QMap errorMap; // Get all detail definitions - QMap allDefs = engine()->detailDefinitions(m_req->contactType(), error); + QMap allDefs = engine()->detailDefinitions(r->contactType(), &error); + + QStringList defNames = r->definitionNames(); // Check for error if (error != QContactManager::NoError) { - for (int i=0; idefinitionNames().count(); i++) + for (int i=0; idefinitionNames().count() == 0) + if (r->definitionNames().count() == 0) { result = allDefs; } else { - for (int i=0; idefinitionNames().count(); i++) + for (int i=0; idefinitionNames().at(i); + QString defName = defNames.at(i); if (allDefs.contains(defName)) result.insert(defName, allDefs.value(defName)); else @@ -120,8 +103,5 @@ } // Complete the request - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); - QContactManagerEngine::updateDefinitionFetchRequest(m_req, result, error, errorMap); + QContactManagerEngine::updateDefinitionFetchRequest(r, result, error, errorMap, QContactAbstractRequest::FinishedState); } - - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstore.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstore.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstore.cpp Mon May 03 12:24:20 2010 +0300 @@ -41,18 +41,23 @@ #include "cntsimstore.h" #include "cntsimstoreprivate.h" +#include "cntsymbiansimtransformerror.h" -CntSimStore::CntSimStore(CntSymbianSimEngine* engine) - :QObject((QObject *)engine) +CntSimStore::CntSimStore(CntSymbianSimEngine* engine, QString storeName, QContactManager::Error* error) + :QObject((QObject *)engine), + d_ptr(0) { + *error = QContactManager::NoError; + // 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"); + qRegisterMetaType >("QList"); - d_ptr = new CntSimStorePrivate(*engine, *this); + TRAPD(err, d_ptr = CntSimStorePrivate::NewL(*engine, *this, storeName)); + CntSymbianSimTransformError::transformError(err, error); } CntSimStore::~CntSimStore() @@ -60,24 +65,34 @@ delete d_ptr; } -QContactManager::Error CntSimStore::getInfo() +QString CntSimStore::storeName() { - return d_ptr->getInfo(); + return d_ptr->storeName(); +} + +TSimStoreInfo CntSimStore::storeInfo() +{ + return d_ptr->storeInfo(); } -QContactManager::Error CntSimStore::read(int index, int numSlots) +bool CntSimStore::read(int index, int numSlots, QContactManager::Error* error) { - return d_ptr->read(index, numSlots); + return d_ptr->read(index, numSlots, error); } -QContactManager::Error CntSimStore::write(const QContact &contact) +bool CntSimStore::write(const QContact &contact, QContactManager::Error* error) { - return d_ptr->write(contact); + return d_ptr->write(contact, error); } -QContactManager::Error CntSimStore::remove(int index) +bool CntSimStore::remove(int index, QContactManager::Error* error) { - return d_ptr->remove(index); + return d_ptr->remove(index, error); +} + +bool CntSimStore::getReservedSlots(QContactManager::Error* error) +{ + return d_ptr->getReservedSlots(error); } void CntSimStore::cancel() @@ -90,5 +105,7 @@ return d_ptr->IsActive(); } - - +TInt CntSimStore::lastAsyncError() +{ + return d_ptr->lastAsyncError(); +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreeventlistener.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreeventlistener.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** 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 "cntsimstoreeventlistener.h" +#include "cntsymbiansimengine.h" +#include +#ifdef SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER +#include +#else +#include +#endif +#include + +QTM_USE_NAMESPACE + +CntSimStoreEventListener::CntSimStoreEventListener(CntSymbianSimEngine &engine, RMobilePhoneBookStore& store) + :CActive(CActive::EPriorityUserInput), + m_engine(engine), + m_store(store) +{ + // NOTE: + // The AO priority must be higher than CntSimStorePrivate's priority. + // Otherwise we might not receive all store events. This is because a new + // store request might be issued before the listener has had the chance to + // issue a new notify request. + CActiveScheduler::Add(this); +} + +CntSimStoreEventListener::~CntSimStoreEventListener() +{ + Cancel(); +} + +void CntSimStoreEventListener::start() +{ + if (IsActive()) + return; + + m_store.NotifyStoreEvent(iStatus, m_event, m_index); + SetActive(); +} + +void CntSimStoreEventListener::DoCancel() +{ + if (IsActive()) + m_store.CancelAsyncRequest(EMobilePhoneStoreNotifyStoreEvent); +} + +void CntSimStoreEventListener::RunL() +{ + if (iStatus.Int()) { + qWarning() << "Failed to listen store events!" << iStatus.Int(); + return; + } + + // The store may report several events at the same time. + + QContactChangeSet changeSet; + + if (m_event & RMobilePhoneStore::KStoreFull) { + //qDebug() << "SIM store event: full"; + } + if (m_event & RMobilePhoneStore::KStoreHasSpace) { + //qDebug() << "SIM store event: has space"; + } + if (m_event & RMobilePhoneStore::KStoreEmpty ) { + //qDebug() << "SIM store event: empty" << m_index; + changeSet.insertRemovedContact(m_index); + } + if (m_event & RMobilePhoneStore::KStoreEntryAdded) { + //qDebug() << "SIM store event: added" << m_index; + changeSet.insertAddedContact(m_index); + } + if (m_event & RMobilePhoneStore::KStoreEntryDeleted) { + //qDebug() << "SIM store event: deleted" << m_index; + changeSet.insertRemovedContact(m_index); + } + if (m_event & RMobilePhoneStore::KStoreEntryChanged) { + //qDebug() << "SIM store event: changed" << m_index; + changeSet.insertChangedContact(m_index); + } + if (m_event & RMobilePhoneStore::KStoreDoRefresh) { + //qDebug() << "SIM store event: do refresh"; + changeSet.setDataChanged(true); + } + + changeSet.emitSignals(&m_engine); + + start(); +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreprivate.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreprivate.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsimstoreprivate.cpp Mon May 03 12:24:20 2010 +0300 @@ -40,147 +40,264 @@ ****************************************************************************/ #include "cntsimstoreprivate.h" -#include +#include "cntsymbiansimtransformerror.h" #include "cntsimstore.h" +#include "cntsimstoreeventlistener.h" + +#include +#include +#include +#include -const int KOneSimContactBufferSize = 512; -Q_DEFINE_LATIN1_LITERAL(KSimSyncTarget, "SIM"); +const TInt KOneSimContactBufferSize = 512; +const TInt KDataClientBuf = 128; +const TInt KEtsiTonPosition = 0x70; -CntSimStorePrivate::CntSimStorePrivate(CntSymbianSimEngine &engine, CntSimStore &simStore) +CntSimStorePrivate* CntSimStorePrivate::NewL(CntSymbianSimEngine &engine, CntSimStore &simStore, const QString &storeName) +{ + CntSimStorePrivate* self = new (ELeave) CntSimStorePrivate(engine, simStore, storeName); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; +} + +CntSimStorePrivate::CntSimStorePrivate(CntSymbianSimEngine &engine, CntSimStore &simStore, const QString &storeName) :CActive(CActive::EPriorityStandard), m_state(InactiveState), m_engine(engine), m_simStore(simStore), - m_etelInfoPckg(m_etelStoreInfo) + m_storeName(storeName), + m_readOnlyAccess(false), + m_storeInfoPckg(m_storeInfo), + m_listener(0) { CActiveScheduler::Add(this); + m_managerUri = engine.managerUri(); +} + +void CntSimStorePrivate::ConstructL() +{ + TBuf storeName; + convertStoreNameL(storeName); + + // SDN store is always read only + if (m_storeName == KParameterValueSimStoreNameSdn) + m_readOnlyAccess = true; + + // Open etel server + User::LeaveIfError(m_etelServer.Connect()); + User::LeaveIfError(m_etelServer.LoadPhoneModule(KMmTsyModuleName)); + + // Open etel phone + RTelServer::TPhoneInfo info; + User::LeaveIfError(m_etelServer.GetPhoneInfo(0, info)); + User::LeaveIfError(m_etelPhone.Open(m_etelServer, info.iName)); + + // open Etel store + User::LeaveIfError(m_etelStore.Open(m_etelPhone, storeName)); + + //check what information can be saved to the Etel store + TRequestStatus requestStatus; + m_etelStore.GetInfo(requestStatus, (TDes8&)m_storeInfoPckg); + User::WaitForRequest(requestStatus); + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - GetInfo err = %d"), + requestStatus.Int()); + User::LeaveIfError(requestStatus.Int()); + + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - TotalEntries = %d"), + m_storeInfo.iTotalEntries); + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - UsedEntries = %d"), + m_storeInfo.iUsedEntries); + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - MaxNumLength = %d"), + m_storeInfo.iMaxNumLength); + PbkPrintToLog(_L("CntSymbianSimEngine::getEtelStoreInfoL() - MaxTextLength = %d"), + m_storeInfo.iMaxTextLength); + + m_listener = new (ELeave) CntSimStoreEventListener(m_engine, m_etelStore); + m_listener->start(); } CntSimStorePrivate::~CntSimStorePrivate() { - m_buffer.Close(); Cancel(); + delete m_listener; + m_etelStore.Close(); + m_etelPhone.Close(); + m_etelServer.Close(); } -QContactManager::Error CntSimStorePrivate::getInfo() +void CntSimStorePrivate::convertStoreNameL(TDes &storeName) { - if (IsActive()) - return QContactManager::LockedError; - - // start get info request - mobilePhoneBookStore().GetInfo(iStatus, (TDes8&)m_etelInfoPckg); - SetActive(); - m_state = GetInfoState; - - return QContactManager::NoError; + if(storeName.MaxLength() < RMobilePhoneBookStore::KMaxPBIDSize) { + User::Leave(KErrArgument); + } + + if (m_storeName.isEmpty()) { + // Default to ADN store + m_storeName = (QLatin1String) KParameterValueSimStoreNameAdn; + storeName.Copy(KETelIccAdnPhoneBook); + } else if (m_storeName == KParameterValueSimStoreNameFdn) { + storeName.Copy(KETelIccFdnPhoneBook); + } else if (m_storeName == KParameterValueSimStoreNameAdn) { + storeName.Copy(KETelIccAdnPhoneBook); + } else if (m_storeName == KParameterValueSimStoreNameSdn) { + storeName.Copy(KETelIccSdnPhoneBook); + } + + // Check that we got a valid store name + if(storeName.Length() == 0) { + User::Leave(KErrArgument); + } } -QContactManager::Error CntSimStorePrivate::read(int index, int numSlots) +bool CntSimStorePrivate::read(int index, int numSlots, QContactManager::Error *error) { - if (IsActive()) - return QContactManager::LockedError; + if (IsActive()) { + *error = QContactManager::LockedError; + return false; + } // start reading m_buffer.Zero(); m_buffer.ReAlloc(KOneSimContactBufferSize*numSlots); - mobilePhoneBookStore().Read(iStatus, index, numSlots, m_buffer); + m_etelStore.Read(iStatus, index, numSlots, m_buffer); SetActive(); m_state = ReadState; - return QContactManager::NoError; + *error = QContactManager::NoError; + return true; } -QContactManager::Error CntSimStorePrivate::write(const QContact &contact) +bool CntSimStorePrivate::write(const QContact &contact, QContactManager::Error *error) { - if (IsActive()) - return QContactManager::LockedError; + if (IsActive()) { + *error = QContactManager::LockedError; + return false; + } // get index m_writeIndex = KErrNotFound; - if (contact.id().managerUri() == m_engine.managerUri() && + if (contact.id().managerUri() == m_managerUri && contact.localId() > 0) { - m_writeIndex = contact.localId(); + m_writeIndex = contact.localId(); + + // TODO: check that the contact exist in the sim } // encode m_buffer.Zero(); m_buffer.ReAlloc(KOneSimContactBufferSize); - TRAPD(err, m_convertedContact = m_engine.encodeSimContactL(&contact, m_buffer)); + m_convertedContact = QContact(contact); + + TRAPD(err, encodeSimContactL(&m_convertedContact, m_buffer)); if (err != KErrNone) { - QContactManager::Error qtError; - m_engine.transformError(err, qtError); - return qtError; + CntSymbianSimTransformError::transformError(err, error); + return false; } // start writing - mobilePhoneBookStore().Write(iStatus, m_buffer, m_writeIndex); + m_etelStore.Write(iStatus, m_buffer, m_writeIndex); SetActive(); m_state = WriteState; - return QContactManager::NoError; + *error = QContactManager::NoError; + return true; } -QContactManager::Error CntSimStorePrivate::remove(int index) +bool CntSimStorePrivate::remove(int index, QContactManager::Error *error) { - if (IsActive()) - return QContactManager::LockedError; + if (IsActive()) { + *error = QContactManager::LockedError; + return false; + } - mobilePhoneBookStore().Delete(iStatus, index); + // NOTE: + // If index points to an empty slot and running in hardware the + // delete operation will not return any error. + + m_etelStore.Delete(iStatus, index); SetActive(); m_state = DeleteState; - return QContactManager::NoError; + *error = QContactManager::NoError; + return true; +} + +bool CntSimStorePrivate::getReservedSlots(QContactManager::Error *error) +{ + if (IsActive()) { + *error = QContactManager::LockedError; + return false; + } + + // start reading + m_buffer.Zero(); + m_buffer.ReAlloc(KOneSimContactBufferSize*m_storeInfo.iTotalEntries); + m_etelStore.Read(iStatus, 1, m_storeInfo.iTotalEntries, m_buffer); + SetActive(); + m_state = ReadReservedSlotsState; + + *error = QContactManager::NoError; + return true; } void CntSimStorePrivate::DoCancel() { - if (m_state == GetInfoState) - mobilePhoneBookStore().CancelAsyncRequest(EMobilePhoneStoreGetInfo); if (m_state == ReadState) - mobilePhoneBookStore().CancelAsyncRequest(EMobilePhoneStoreRead); + m_etelStore.CancelAsyncRequest(EMobilePhoneStoreRead); if (m_state == WriteState) - mobilePhoneBookStore().CancelAsyncRequest(EMobilePhoneStoreWrite); + m_etelStore.CancelAsyncRequest(EMobilePhoneStoreWrite); if (m_state == DeleteState) - mobilePhoneBookStore().CancelAsyncRequest(EMobilePhoneStoreDelete); + m_etelStore.CancelAsyncRequest(EMobilePhoneStoreDelete); + if (m_state == ReadReservedSlotsState) + m_etelStore.CancelAsyncRequest(EMobilePhoneStoreRead); m_state = InactiveState; } void CntSimStorePrivate::RunL() { + //qDebug() << "CntSimStorePrivate::RunL()" << m_state << iStatus.Int(); + + m_asyncError = iStatus.Int(); User::LeaveIfError(iStatus.Int()); - // NOTE: emit might be synchronous so do not touch member variables after it + // NOTE: It is assumed that emitting signals is queued 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(); + QList contacts = decodeSimContactsL(m_buffer); + + // set sync target + QList::iterator i; + for (i = contacts.begin(); i != contacts.end(); ++i) { + QContactSyncTarget syncTarget; + syncTarget.setSyncTarget(KSimSyncTarget); + i->saveDetail(&syncTarget); + } + emit m_simStore.readComplete(contacts, QContactManager::NoError); } break; case WriteState: { - //save id, if new contact + // save id QContactId contactId; contactId.setLocalId(m_writeIndex); - contactId.setManagerUri(m_engine.managerUri()); + contactId.setManagerUri(m_managerUri); m_convertedContact.setId(contactId); // set sync target - QContactSyncTarget syncTarget; - syncTarget.setSyncTarget(KSimSyncTarget); - m_convertedContact.saveDetail(&syncTarget); - + if(m_convertedContact.detail(QContactSyncTarget::DefinitionName).isEmpty()) { + QContactSyncTarget syncTarget = m_convertedContact.detail(QContactSyncTarget::DefinitionName); + syncTarget.setSyncTarget(KSimSyncTarget); + m_convertedContact.saveDetail(&syncTarget); + } + emit m_simStore.writeComplete(m_convertedContact, QContactManager::NoError); } break; @@ -191,6 +308,13 @@ } break; + case ReadReservedSlotsState: + { + QList reservedSlots = decodeReservedSlotsL(m_buffer); + emit m_simStore.getReservedSlotsComplete(reservedSlots, QContactManager::NoError); + } + break; + default: { User::Leave(KErrUnknown); @@ -203,21 +327,344 @@ TInt CntSimStorePrivate::RunError(TInt aError) { QContactManager::Error qtError = QContactManager::NoError; - m_engine.transformError(aError, qtError); + CntSymbianSimTransformError::transformError(aError, &qtError); + + // NOTE: It is assumed that emitting signals is queued - 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) { + if (m_state == ReadState) + emit m_simStore.readComplete(QList(), qtError); + else if (m_state == WriteState) emit m_simStore.writeComplete(m_convertedContact, qtError); - } else if (m_state == DeleteState) { + else if (m_state == DeleteState) emit m_simStore.removeComplete(qtError); - } - + else if (m_state == ReadReservedSlotsState) + emit m_simStore.getReservedSlotsComplete(QList(), qtError); + m_state = InactiveState; return KErrNone; } + +/*! Parses SIM contacts in TLV format. + * + * \param rawData SIM contacts in TLV format. + * \return List of contacts. +*/ +QList CntSimStorePrivate::decodeSimContactsL(TDes8& rawData) const +{ + PbkPrintToLog(_L("CntSymbianSimEngine::decodeSimContactsL() - IN")); + QList fetchedContacts; + QContact currentContact; + + TBuf16 buffer; + TPtrC16 bufPtr(buffer); + + TUint8 tagValue(0); + CPhoneBookBuffer::TPhBkTagType dataType; + + bool isAdditionalNumber = false; + + CPhoneBookBuffer* pbBuffer = new(ELeave) CPhoneBookBuffer(); + CleanupStack::PushL(pbBuffer); + pbBuffer->Set(&rawData); + pbBuffer->StartRead(); + + while (pbBuffer->GetTagAndType(tagValue, dataType) == KErrNone) { + switch (tagValue) + { + case RMobilePhoneBookStore::ETagPBAdnIndex: + { + //save contact's id (SIM card index) and manager's name + TUint16 index; + if (pbBuffer->GetValue(index) == KErrNone) { + QScopedPointer contactId(new QContactId()); + contactId->setLocalId(index); + contactId->setManagerUri(m_managerUri); + currentContact.setId(*contactId); + } + isAdditionalNumber = false; + break; + } + case RMobilePhoneBookStore::ETagPBTonNpi: + { + // Note, that TON info can be incorporated into the phone number by Etel + // implementation (TSY). E.g. this is the case with Nokia TSY. + // Here general case is implemented. + + // Check number type, we are only interested if it's international or not. + // We assume here that ETagPBTonNpi always comes after ETagPBNumber, not before. + TUint8 tonNpi; + if (pbBuffer->GetValue(tonNpi) == KErrNone) { + TUint8 intFlag = (tonNpi & KEtsiTonPosition) >> 4; + if (intFlag == 1) { + //international number format, append "+" to the last + //saved number + QList phoneNumbers = currentContact.details( + QContactPhoneNumber::DefinitionName); + if (phoneNumbers.count() > 0) { + QContactPhoneNumber lastNumber = static_cast( + phoneNumbers.at(phoneNumbers.count() - 1)); + QString number = lastNumber.number(); + number.insert(0, "+"); + lastNumber.setNumber(number); + if (m_readOnlyAccess) + m_engine.setReadOnlyAccessConstraint(&lastNumber); + currentContact.saveDetail(&lastNumber); + } + } + } + + // We have rearched to the end of the number, + // invalidate additional number flag. + isAdditionalNumber = false; + break; + } + case RMobilePhoneBookStore::ETagPBText: + { + if (pbBuffer->GetValue(bufPtr) == KErrNone) { + if (isAdditionalNumber) { + // For additional number bufPtr contains number alpha string, + // this is ignored currently + } + else { + // Contact name otherwise + QContactName name; + QString nameString = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); + name.setCustomLabel(nameString); + if (m_readOnlyAccess) + m_engine.setReadOnlyAccessConstraint(&name); + currentContact.saveDetail(&name); + QContactManager::Error error(QContactManager::NoError); + m_engine.setContactDisplayLabel(¤tContact, m_engine.synthesizedDisplayLabel(currentContact, &error)); + } + } + break; + } + case RMobilePhoneBookStore::ETagPBSecondName: + { + if (pbBuffer->GetValue(bufPtr) == KErrNone) { + QContactNickname nickName; + QString name = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); + nickName.setNickname(name); + if (m_readOnlyAccess) + m_engine.setReadOnlyAccessConstraint(&nickName); + currentContact.saveDetail(&nickName); + } + break; + } + case RMobilePhoneBookStore::ETagPBNumber: + { + if (pbBuffer->GetValue(bufPtr) == KErrNone) { + QContactPhoneNumber phoneNumber; + QString number = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); + phoneNumber.setNumber(number); + if (m_readOnlyAccess) + m_engine.setReadOnlyAccessConstraint(&phoneNumber); + currentContact.saveDetail(&phoneNumber); + } + break; + } + case RMobilePhoneBookStore::ETagPBAnrStart: + { + // This tag should precede every additional number entry + isAdditionalNumber = true; + break; + } + case RMobilePhoneBookStore::ETagPBEmailAddress: + { + if (pbBuffer->GetValue(bufPtr) == KErrNone) { + QContactEmailAddress email; + QString emailAddress = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); + email.setEmailAddress(emailAddress); + if (m_readOnlyAccess) + m_engine.setReadOnlyAccessConstraint(&email); + currentContact.saveDetail(&email); + } + break; + } + case RMobilePhoneBookStore::ETagPBNewEntry: + { + // This signals the end of the entry and is a special case + // which will be handled below. + break; + } + default: + { + // An unsupported field type - just skip this value + pbBuffer->SkipValue(dataType); + break; + } + } //switch + + // save contact to the array of contact to be returned if the whole entry was extracted + if ((tagValue == RMobilePhoneBookStore::ETagPBNewEntry && currentContact.localId() > 0) || + (pbBuffer->RemainingReadLength() == 0 && currentContact.localId() > 0)) { + //QContactSyncTarget syncTarget; + //syncTarget.setSyncTarget(KSimSyncTarget); + //currentContact.saveDetail(&syncTarget); + fetchedContacts.append(currentContact); + //clear current contact + currentContact.clearDetails(); + QScopedPointer contactId(new QContactId()); + contactId->setLocalId(0); + contactId->setManagerUri(QString()); + currentContact.setId(*contactId); + } + } //while + + CleanupStack::PopAndDestroy(pbBuffer); + PbkPrintToLog(_L("CntSymbianSimEngine::decodeSimContactsL() - OUT")); + return fetchedContacts; +} + +/*! Converts QContact to the TLV format which is used to save it to the Etel store. + * + * \param contact QContact to be converted + * \param rawData Contact in TLV format on return. +*/ +void CntSimStorePrivate::encodeSimContactL(QContact* contact, TDes8& rawData) const +{ + // TODO: get detail definition schema and verify (unique) + + // Keep track of the count of phone numbers added + int phoneNumberCount(0); + int emailCount(0); + + CPhoneBookBuffer* pbBuffer = new(ELeave) CPhoneBookBuffer(); + CleanupStack::PushL(pbBuffer); + pbBuffer->Set(&rawData); + User::LeaveIfError(pbBuffer->AddNewEntryTag()); + + foreach(QContactDetail detail, contact->details()) { + QString definitionName = detail.definitionName(); + + if (definitionName == QContactName::DefinitionName) { + // Name + QContactName nameDetail = static_cast(detail); + // Trim to the max possible length + QString name = nameDetail.customLabel().left(m_storeInfo.iMaxTextLength); + if (name.isEmpty()) { + name = "Unnamed"; + } + putTagAndValueL( + pbBuffer, + RMobilePhoneBookStore::ETagPBText, + name); + // Replace detail value with the trimmed one + nameDetail.setCustomLabel(name); + contact->saveDetail(&nameDetail); + } else if (definitionName == QContactPhoneNumber::DefinitionName +#ifndef SYMBIANSIM_BACKEND_PHONEBOOKINFOV1 + && (phoneNumberCount == 0 + || phoneNumberCount <= m_storeInfo.iMaxAdditionalNumbers)) { +#else + && phoneNumberCount == 0) { +#endif + // Phone number + phoneNumberCount++; + QContactPhoneNumber numberDetail = static_cast(detail); + QString number = numberDetail.number(); + + // Verify the number only contains legal digits + foreach (const QChar character, number) { + if(!character.isDigit()) { + if(character != QChar('+') + && character != QChar('*') + && character != QChar('#') + && character != QChar('p') + && character != QChar('w')) { + User::Leave(KErrArgument); + } + } + } + + // TODO: check if the number is empty (do we have a test case for that?) + + // Verify the number length + PbkPrintToLog(_L("CntSymbianSimEngine::encodeSimContactL() - phone number length = %d"), + numberDetail.number().length()); + if (numberDetail.number().length() > m_storeInfo.iMaxNumLength) { + User::Leave(KErrTooBig); + } + + if (phoneNumberCount > 1) { + // Mark the beginning of an additional number + User::LeaveIfError(pbBuffer->AddNewNumberTag()); + } + + // The number itself + putTagAndValueL( + pbBuffer, + RMobilePhoneBookStore::ETagPBNumber, + number); +#ifndef SYMBIANSIM_BACKEND_PHONEBOOKINFOV1 + // Phonebook info version 1 does not support nick name or e-mail + } else if (definitionName == QContactNickname::DefinitionName + && m_storeInfo.iMaxSecondNames > 0) { + // nickname + QContactNickname nicknameDetail = static_cast(detail); + // Trim to the max possible length; + QString nickname = nicknameDetail.nickname().left(m_storeInfo.iMaxTextLengthSecondName); + putTagAndValueL( + pbBuffer, + RMobilePhoneBookStore::ETagPBSecondName, + nickname); + // Replace detail value with the trimmed one + nicknameDetail.setNickname(nickname); + contact->saveDetail(&nicknameDetail); + } else if (definitionName == QContactEmailAddress::DefinitionName + && emailCount < m_storeInfo.iMaxEmailAddr) { + emailCount++; + QContactEmailAddress emailDetail = static_cast(detail); + if (emailDetail.emailAddress().length() > m_storeInfo.iMaxTextLengthEmailAddr) { + User::Leave(KErrTooBig); + } + putTagAndValueL( + pbBuffer, + RMobilePhoneBookStore::ETagPBEmailAddress, + emailDetail.emailAddress()); +#endif + // These are ignored in the conversion + } else if (definitionName == QContactSyncTarget::DefinitionName + || definitionName == QContactDisplayLabel::DefinitionName + || definitionName == QContactType::DefinitionName) { + // Do nothing + } else { + User::Leave(KErrArgument); + } + } + CleanupStack::PopAndDestroy(pbBuffer); +} + +void CntSimStorePrivate::putTagAndValueL(CPhoneBookBuffer* pbBuffer, TUint8 tag, QString data) const +{ + TPtrC value(reinterpret_cast(data.utf16())); + User::LeaveIfError(pbBuffer->PutTagAndValue(tag, value)); +} + +QList CntSimStorePrivate::decodeReservedSlotsL(TDes8& rawData) const +{ + QList reservedSlots; + + TUint8 tagValue(0); + CPhoneBookBuffer::TPhBkTagType dataType; + + CPhoneBookBuffer* pbBuffer = new (ELeave) CPhoneBookBuffer(); + CleanupStack::PushL(pbBuffer); + pbBuffer->Set(&rawData); + pbBuffer->StartRead(); + + while (pbBuffer->GetTagAndType(tagValue, dataType) == KErrNone) + { + if (tagValue == RMobilePhoneBookStore::ETagPBAdnIndex) + { + TUint16 index; + if (pbBuffer->GetValue(index) == KErrNone) + reservedSlots.append(index); + } else + pbBuffer->SkipValue(dataType); + } //while + + CleanupStack::PopAndDestroy(pbBuffer); + return reservedSlots; +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntsymbiansimengine.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsymbiansimengine.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsymbiansimengine.cpp Mon May 03 12:24:20 2010 +0300 @@ -40,95 +40,69 @@ ****************************************************************************/ #include "cntsymbiansimengine.h" -#include -#include - +#include "cntsymbiansimtransformerror.h" #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 #include +#include -const int KOneSimContactBufferSize = 512; -const TInt KDataClientBuf = 128; -const TInt KEtsiTonPosition = 0x70; -Q_DEFINE_LATIN1_LITERAL(KSimSyncTarget, "SIM"); +const int KRequestTimeout = 30000; // in ms -#include -#include -namespace { - void PbkPrintToLog( TRefByValue aFormat, ... ) - { - _LIT( KLogDir, "Sim" ); - _LIT( KLogName, "sim.log" ); - - VA_LIST args; - VA_START( args, aFormat ); - RFileLogger::WriteFormat(KLogDir, KLogName, EFileLoggingModeAppend, aFormat, args); - VA_END( args ); - } -} // namespace +CntSymbianSimEngineData::CntSymbianSimEngineData() + :m_simStore(0) +{ + +} -CntSymbianSimEngine::CntSymbianSimEngine(const QMap& parameters, QContactManager::Error& error) : - m_etelStoreInfoPckg( m_etelStoreInfo ), - m_simStore(0) +CntSymbianSimEngineData::~CntSymbianSimEngineData() { - error = QContactManager::NoError; - - int err = m_etelServer.Connect(); - if (err == KErrNone) { - err = m_etelServer.LoadPhoneModule(KMmTsyModuleName); + if (ref == 0) { + // Remove all unfinished requests. + // If the client has behaved itself then there should be none left. + while (m_asyncRequests.size()) { + QMap::iterator itr = m_asyncRequests.begin(); + delete itr.value(); + m_asyncRequests.remove(itr.key()); + qWarning("Dangling async request!"); + } } - if (err == KErrNone) { - RTelServer::TPhoneInfo info; - err = m_etelServer.GetPhoneInfo(0, info); - if (err == KErrNone) { - err = m_etelPhone.Open(m_etelServer, info.iName); - } - } - if (err == KErrNone) { - // open Etel store - TODO: check from parameters what Etel store to use - err = m_etelStore.Open(m_etelPhone, KETelIccAdnPhoneBook); - } - if (err != KErrNone) { - error = QContactManager::UnspecifiedError; +} + +CntSymbianSimEngine::CntSymbianSimEngine(const QMap& parameters, QContactManager::Error* error) +{ + *error = QContactManager::NoError; + + d = new CntSymbianSimEngineData(); + d->m_simStore = new CntSimStore(this, parameters.value(KParameterKeySimStoreName), error); + if (*error != QContactManager::NoError) { + //qDebug() << "Failed to open SIM store" << error; + return; } - m_managerUri = QContactManager::buildUri(CNT_SYMBIANSIM_MANAGER_NAME, parameters); - - m_simStore = new CntSimStore(this); + if(d->m_simStore->storeName() == KParameterValueSimStoreNameSdn) { + // In case of SDN store we need to check if any SDN contacts exist to + // determine if the store is supported or not + if(d->m_simStore->storeInfo().iUsedEntries == 0) + *error = QContactManager::NotSupportedError; + } +} - RFs fs; - fs.Connect(); - fs.MkDir(_L("C:\\Logs\\")); - fs.MkDir(_L("C:\\Logs\\Sim\\")); - fs.Close(); - PbkPrintToLog(_L("CntSymbianSimEngine::CntSymbianSimEngine, err = %d"), err); +CntSymbianSimEngine::CntSymbianSimEngine(const CntSymbianSimEngine &other) + :d(other.d) +{ + } CntSymbianSimEngine::~CntSymbianSimEngine() { - m_etelStore.Close(); - m_etelPhone.Close(); - m_etelServer.Close(); - foreach (QContactAbstractRequest *req, m_asyncRequests.keys()) { - delete m_asyncRequests.take(req); - } -} -void CntSymbianSimEngine::deref() -{ - delete this; } QString CntSymbianSimEngine::managerName() const @@ -140,52 +114,23 @@ * 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::contactIds(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")); - - QList contactIds; - - // Get unsorted and not filtered contacts - QList contacts; - TRAPD(err, QT_TRYCATCH_LEAVING(contacts = fetchContactsL())); - transformError(err, error); - - // Filter and sort contacts - if (err == KErrNone) { - for (int i(0); i < contacts.count(); i++) { - if (!QContactManagerEngine::testFilter(filter, contacts.at(i))) { - contacts.removeAt(i); - i--; - } - } - contactIds = QContactManagerEngine::sortContacts(contacts, sortOrders); - } - - return contactIds; + QContactLocalIdFetchRequest req; + req.setFilter(filter); + req.setSorting(sortOrders); + executeRequest(&req, error); + return req.ids(); } -/*! - * 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::contactIds(const QList& sortOrders, QContactManager::Error& error) const +QList CntSymbianSimEngine::contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fetchHint, QContactManager::Error* error) const { - PbkPrintToLog(_L("CntSymbianSimEngine::contacts")); - - QList contactIds; - - // Get unsorted contacts - QList contacts; - TRAPD(err, QT_TRYCATCH_LEAVING(contacts = fetchContactsL())); - transformError(err, error); - - // Sort contacts - if (err == KErrNone) { - contactIds = QContactManagerEngine::sortContacts(contacts, sortOrders); - } - PbkPrintToLog(_L("CntSymbianSimEngine::contacts() - err = %d"), err); - return contactIds; + QContactFetchRequest req; + req.setFilter(filter); + req.setSorting(sortOrders); + req.setFetchHint(fetchHint); + executeRequest(&req, error); + return req.contacts(); } /*! @@ -197,17 +142,20 @@ * \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, const QStringList& definitionRestrictions, QContactManager::Error& error) const +QContact CntSymbianSimEngine::contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const { - Q_UNUSED(definitionRestrictions); // TODO - QContact* contact = new QContact(); - TRAPD(err, QT_TRYCATCH_LEAVING(*contact = fetchContactL(contactId))); - transformError(err, error); - PbkPrintToLog(_L("CntSymbianSimEngine::contact() - err = %d"), err); - return *QScopedPointer(contact); + QContactFetchRequest req; + QContactLocalIdFilter filter; + filter.setIds(QList() << contactId); + req.setFilter(filter); + req.setFetchHint(fetchHint); + executeRequest(&req, error); + if (req.contacts().count() == 0) + return QContact(); + return req.contacts().at(0); } -QString CntSymbianSimEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const +QString CntSymbianSimEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const { Q_UNUSED(error); @@ -221,31 +169,27 @@ } /*! - * Saves the contact to the Etel store. Only part of the contact's details + * Saves the contacts to the Etel store. Only part of the contact's details * can be saved, and some fields may be trimmed to fit to the SIM card. * - * \param contact Contact to be saved. + * \param contacts Contact to be saved. * \param qtError Qt error code. * \return Error status. */ -bool CntSymbianSimEngine::saveContact(QContact* contact, QContactManager::Error& error) +bool CntSymbianSimEngine::saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error* error) { - if (!contact) { - error = QContactManager::BadArgumentError; + if (!contacts) { + *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); + + QContactSaveRequest req; + req.setContacts(*contacts); + executeRequest(&req, error); + if (errorMap) + *errorMap = req.errorMap(); + *contacts = req.contacts(); + return (*error == QContactManager::NoError ); } /*! @@ -255,32 +199,30 @@ * \param qtError Qt error code. * \return Error status. */ -bool CntSymbianSimEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error& error) +bool CntSymbianSimEngine::removeContacts(const QList& contactIds, QMap* errorMap, QContactManager::Error* error) { - TRequestStatus requestStatus; - m_etelStore.Delete(requestStatus, contactId); - User::WaitForRequest(requestStatus); - transformError(requestStatus.Int(), error); - return (requestStatus.Int() == KErrNone); + QContactRemoveRequest req; + req.setContactIds(contactIds); + executeRequest(&req, error); + if (errorMap) + *errorMap = req.errorMap(); + return (*error == QContactManager::NoError); } /*! * Returns a map of identifier to detail definition which are valid for contacts whose type is the given \a contactType * which are valid for the contacts in this store */ -QMap CntSymbianSimEngine::detailDefinitions(const QString& contactType, QContactManager::Error& error) const +QMap CntSymbianSimEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const { if (!supportedContactTypes().contains(contactType)) { // Should never happen - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QMap(); } - TRAPD(err, getEtelStoreInfoL()); - if(err != KErrNone) { - transformError(err, error); - return QMap(); - } + // Get store information + TSimStoreInfo storeInfo = d->m_simStore->storeInfo(); // the map we will eventually return QMap retn; @@ -288,23 +230,23 @@ // local variables for reuse QMap fields; QContactDetailFieldDefinition f; - QContactDetailDefinition d; + QContactDetailDefinition def; QVariantList subTypes; // sync target - d.setName(QContactSyncTarget::DefinitionName); + def.setName(QContactSyncTarget::DefinitionName); fields.clear(); f.setDataType(QVariant::String); subTypes.clear(); subTypes << QString(QLatin1String(KSimSyncTarget)); f.setAllowableValues(subTypes); fields.insert(QContactSyncTarget::FieldSyncTarget, f); - d.setFields(fields); - d.setUnique(true); - retn.insert(d.name(), d); + def.setFields(fields); + def.setUnique(true); + retn.insert(def.name(), def); // type - d.setName(QContactType::DefinitionName); + def.setName(QContactType::DefinitionName); fields.clear(); f.setDataType(QVariant::String); subTypes.clear(); @@ -312,13 +254,13 @@ subTypes << QString(QLatin1String(QContactType::TypeContact)); f.setAllowableValues(subTypes); fields.insert(QContactType::FieldType, f); // note: NO CONTEXT!! - d.setFields(fields); - d.setUnique(true); - retn.insert(d.name(), d); + def.setFields(fields); + def.setUnique(true); + retn.insert(def.name(), def); /* TODO // guid - d.setName(QContactGuid::DefinitionName); + def.setName(QContactGuid::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); @@ -326,106 +268,106 @@ f.setDataType(QVariant::StringList); f.setAllowableValues(contexts); fields.insert(QContactDetail::FieldContext, f); - d.setFields(fields); - d.setUnique(false); - d.setAccessConstraint(QContactDetailDefinition::CreateOnly); - retn.insert(d.name(), d); + def.setFields(fields); + def.setUnique(false); + def.setAccessConstraint(QContactDetailDefinition::CreateOnly); + retn.insert(def.name(), def); */ // display label - d.setName(QContactDisplayLabel::DefinitionName); + def.setName(QContactDisplayLabel::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactDisplayLabel::FieldLabel, f); - d.setFields(fields); - d.setUnique(true); - retn.insert(d.name(), d); + def.setFields(fields); + def.setUnique(true); + retn.insert(def.name(), def); // email support needs to be checked run-time, because it is SIM specific - if (m_etelStoreInfo.iMaxEmailAddr > 0) { - d.setName(QContactEmailAddress::DefinitionName); +#ifndef SYMBIANSIM_BACKEND_PHONEBOOKINFOV1 + if (storeInfo.iMaxEmailAddr > 0) { + def.setName(QContactEmailAddress::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactEmailAddress::FieldEmailAddress, f); - d.setFields(fields); - d.setUnique(true); - retn.insert(d.name(), d); + def.setFields(fields); + def.setUnique(true); + retn.insert(def.name(), def); } +#endif // phone number - d.setName(QContactPhoneNumber::DefinitionName); + def.setName(QContactPhoneNumber::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactPhoneNumber::FieldNumber, f); // TODO: subtypes supported in case a sim contact can have multiple phone numbers? -/* - f.setDataType(QVariant::StringList); // can implement multiple subtypes - subTypes.clear(); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeAssistant)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeBulletinBoardSystem)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeCar)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeDtmfMenu)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeFacsimile)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeLandline)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeMessagingCapable)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeMobile)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeModem)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypePager)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeVideo)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeVoice)); - f.setAllowableValues(subTypes); - fields.insert(QContactPhoneNumber::FieldSubTypes, f); -*/ - d.setFields(fields); - if (m_etelStoreInfo.iMaxAdditionalNumbers > 0) { + def.setFields(fields); +#ifndef SYMBIANSIM_BACKEND_PHONEBOOKINFOV1 + if (storeInfo.iMaxAdditionalNumbers > 0) { // multiple numbers supported - d.setUnique(false); + def.setUnique(false); } else { // only one phone number allowed - d.setUnique(true); + def.setUnique(true); } - retn.insert(d.name(), d); +#else + // only one phone number allowed + def.setUnique(true); +#endif + retn.insert(def.name(), def); // nickname support needs to be checked run-time, because it is SIM specific - if (m_etelStoreInfo.iMaxSecondNames > 0) { - d.setName(QContactNickname::DefinitionName); +#ifndef SYMBIANSIM_BACKEND_PHONEBOOKINFOV1 + if (storeInfo.iMaxSecondNames > 0) { + def.setName(QContactNickname::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactNickname::FieldNickname, f); - d.setFields(fields); - d.setUnique(true); - retn.insert(d.name(), d); + def.setFields(fields); + def.setUnique(true); + retn.insert(def.name(), def); } +#endif // name - d.setName(QContactName::DefinitionName); + def.setName(QContactName::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactName::FieldCustomLabel, f); - d.setFields(fields); - d.setUnique(true); - retn.insert(d.name(), d); + def.setFields(fields); + def.setUnique(true); + retn.insert(def.name(), def); return retn; } void CntSymbianSimEngine::requestDestroyed(QContactAbstractRequest* req) { - if (m_asyncRequests.contains(req)) { - delete m_asyncRequests.take(req); + if (d->m_asyncRequests.contains(req)) { + delete d->m_asyncRequests.take(req); } } bool CntSymbianSimEngine::startRequest(QContactAbstractRequest* req) { + // Don't allow two async requests to be active at the same time. + // The RMobilePhoneBookStore cannot handle it. + foreach (QContactAbstractRequest* r, d->m_asyncRequests.keys()) { + if (r->isActive()) { + // TODO: Should we set the error for the request also? + return false; + } + } + // Check for existing request and start again - if (m_asyncRequests.contains(req)) { - return m_asyncRequests.value(req)->start(); + if (d->m_asyncRequests.contains(req)) { + return d->m_asyncRequests.value(req)->start(); } // Existing request not found. Create a new one. @@ -478,7 +420,7 @@ } if (simReq) { - m_asyncRequests.insert(req, simReq); + d->m_asyncRequests.insert(req, simReq); return simReq->start(); } @@ -487,14 +429,14 @@ bool CntSymbianSimEngine::cancelRequest(QContactAbstractRequest* req) { - if (m_asyncRequests.contains(req)) - return m_asyncRequests.value(req)->cancel(); + if (d->m_asyncRequests.contains(req)) + return d->m_asyncRequests.value(req)->cancel(); return false; } bool CntSymbianSimEngine::waitForRequestFinished(QContactAbstractRequest* req, int msecs) { - if (!m_asyncRequests.contains(req)) + if (!d->m_asyncRequests.contains(req)) return false; if (req->state() != QContactAbstractRequest::ActiveState) @@ -535,514 +477,65 @@ 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() - */ -QContact CntSymbianSimEngine::fetchContactL(const QContactLocalId &localId) const -{ - if(localId == 0) { - User::Leave(KErrNotFound); - } - - //read the contact from the Etel store - TRequestStatus requestStatus; - RBuf8 buffer; - buffer.CreateL(KOneSimContactBufferSize); - CleanupClosePushL(buffer); - m_etelStore.Read(requestStatus, localId, 1, buffer); - User::WaitForRequest(requestStatus); - if (requestStatus.Int() != KErrNone) { - User::Leave(requestStatus.Int()); - } - - //process contact data - QList contacts = decodeSimContactsL(buffer); - if (contacts.count() == 0) { - User::Leave(KErrNotFound); - } - - CleanupStack::PopAndDestroy(); //buffer - //there should only 1 contact in the list - return contacts.at(0); -} - -/*! - * Private leaving implementation for contacts() - */ -QList CntSymbianSimEngine::fetchContactsL() const -{ - PbkPrintToLog(_L("CntSymbianSimEngine::fetchContactsL() - IN")); - - getEtelStoreInfoL(); - - QList contacts; - 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; - m_etelStore.Read(requestStatus, 1, m_etelStoreInfo.iTotalEntries, buffer); - User::WaitForRequest(requestStatus); - if (requestStatus.Int() != KErrNone) { - User::Leave(requestStatus.Int()); - } - - //process contact data - contacts = decodeSimContactsL(buffer); - - CleanupStack::PopAndDestroy(); //buffer - } - - PbkPrintToLog(_L("CntSymbianSimEngine::fetchContactsL() - OUT, count = %d"), contacts.count()); - return contacts; -} - -/*! - * Private leaving implementation for saveContact() - */ -void CntSymbianSimEngine::saveContactL(QContact* contact) const -{ - QT_TRYCATCH_LEAVING(doSaveContactL(contact)); -} - -/*! - * Private leaving implementation for saveContact() - */ -void CntSymbianSimEngine::doSaveContactL(QContact* contact) const +void CntSymbianSimEngine::updateDisplayLabel(QContact& contact) const { - PbkPrintToLog(_L("CntSymbianSimEngine::saveContactL() - IN")); - - User::LeaveIfNull(contact); - - getEtelStoreInfoL(); - - //encode contact - RBuf8 buffer; - buffer.CreateL(KOneSimContactBufferSize); - CleanupClosePushL(buffer); - - QContact convertedContact = encodeSimContactL(contact, buffer); - - //write contact - int index(KErrNotFound); - if (contact->localId() > 0) { - index = contact->localId(); - } - TRequestStatus requestStatus; - m_etelStore.Write(requestStatus, buffer, index); - User::WaitForRequest(requestStatus); - if (requestStatus.Int() != KErrNone) { - PbkPrintToLog(_L("CntSymbianSimEngine::saveContactL() - write error = %d"), - requestStatus.Int()); - User::Leave(requestStatus.Int()); - } - CleanupStack::PopAndDestroy(); //buffer - - PbkPrintToLog(_L("CntSymbianSimEngine::saveContactL() - index = %d"), index); - - //update provided contact with the details what were really saved - contact->clearDetails(); - QList details = convertedContact.details(); - foreach(QContactDetail detail, details) { - contact->saveDetail(&detail); - } - QContactSyncTarget syncTarget; - syncTarget.setSyncTarget(KSimSyncTarget); - contact->saveDetail(&syncTarget); - - //save id, if new contact - if (contact->localId() == 0) { - QScopedPointer contactId(new QContactId()); - //index contains the location of saved contact - contactId->setLocalId(index); - 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. - * \param QtError Qt error. -*/ -void CntSymbianSimEngine::transformError(TInt symbianError, QContactManager::Error& qtError) const -{ - switch(symbianError) - { - case KErrNone: - { - qtError = QContactManager::NoError; - break; - } - case KErrNotFound: - { - qtError = QContactManager::DoesNotExistError; - break; - } - case KErrAlreadyExists: - { - qtError = QContactManager::AlreadyExistsError; - break; - } - case KErrLocked: - { - qtError = QContactManager::LockedError; - break; - } - case KErrAccessDenied: - case KErrPermissionDenied: - { - qtError = QContactManager::PermissionsError; - break; - } - case KErrNoMemory: - { - qtError = QContactManager::OutOfMemoryError; - break; - } - case KErrNotSupported: - { - qtError = QContactManager::NotSupportedError; - break; - } - case KErrArgument: - { - qtError = QContactManager::BadArgumentError; - break; - } - default: - { - qtError = QContactManager::UnspecifiedError; - break; - } + QContactManager::Error error(QContactManager::NoError); + QString label = synthesizedDisplayLabel(contact, &error); + if(error == QContactManager::NoError) { + setContactDisplayLabel(&contact, label); } } -/*! Parses SIM contacts in TLV format. - * - * \param rawData SIM contacts in TLV format. - * \return List of contacts. -*/ -QList CntSymbianSimEngine::decodeSimContactsL(TDes8& rawData) const +void CntSymbianSimEngine::setReadOnlyAccessConstraint(QContactDetail* detail) const { - PbkPrintToLog(_L("CntSymbianSimEngine::decodeSimContactsL() - IN")); - QList fetchedContacts; - QContact currentContact; - - TBuf16 buffer; - TPtrC16 bufPtr(buffer); - - TUint8 tagValue(0); - CPhoneBookBuffer::TPhBkTagType dataType; - - bool isAdditionalNumber = false; - - CPhoneBookBuffer* pbBuffer = new(ELeave) CPhoneBookBuffer(); - CleanupStack::PushL(pbBuffer); - pbBuffer->Set(&rawData); - pbBuffer->StartRead(); - - while (pbBuffer->GetTagAndType(tagValue, dataType) == KErrNone) { - switch (tagValue) - { - case RMobilePhoneBookStore::ETagPBAdnIndex: - { - //save contact's id (SIM card index) and manager's name - TUint16 index; - if (pbBuffer->GetValue(index) == KErrNone) { - QScopedPointer contactId(new QContactId()); - contactId->setLocalId(index); - contactId->setManagerUri(m_managerUri); - currentContact.setId(*contactId); - } - isAdditionalNumber = false; - break; - } - case RMobilePhoneBookStore::ETagPBTonNpi: - { - // Note, that TON info can be incorporated into the phone number by Etel - // implementation (TSY). E.g. this is the case with Nokia TSY. - // Here general case is implemented. - - // Check number type, we are only interested if it's international or not. - // We assume here that ETagPBTonNpi always comes after ETagPBNumber, not before. - TUint8 tonNpi; - if (pbBuffer->GetValue(tonNpi) == KErrNone) { - TUint8 intFlag = (tonNpi & KEtsiTonPosition) >> 4; - if (intFlag == 1) { - //international number format, append "+" to the last - //saved number - QList phoneNumbers = currentContact.details( - QContactPhoneNumber::DefinitionName); - if (phoneNumbers.count() > 0) { - QContactPhoneNumber lastNumber = static_cast( - phoneNumbers.at(phoneNumbers.count() - 1)); - QString number = lastNumber.number(); - number.insert(0, "+"); - lastNumber.setNumber(number); - currentContact.saveDetail(&lastNumber); - } - } - } - - // We have rearched to the end of the number, - // invalidate additional number flag. - isAdditionalNumber = false; - break; - } - case RMobilePhoneBookStore::ETagPBText: - { - if (pbBuffer->GetValue(bufPtr) == KErrNone) { - if (isAdditionalNumber) { - // For additional number bufPtr contains number alpha string, - // this is ignored currently - } - else { - // Contact name otherwise - QContactName name; - QString nameString = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); - name.setCustomLabel(nameString); - currentContact.saveDetail(&name); - QContactManager::Error error(QContactManager::NoError); - currentContact = setContactDisplayLabel(synthesizedDisplayLabel(currentContact, error), currentContact); - } - } - break; - } - case RMobilePhoneBookStore::ETagPBSecondName: - { - if (pbBuffer->GetValue(bufPtr) == KErrNone) { - QContactNickname nickName; - QString name = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); - nickName.setNickname(name); - currentContact.saveDetail(&nickName); - } - break; - } - case RMobilePhoneBookStore::ETagPBNumber: - { - if (pbBuffer->GetValue(bufPtr) == KErrNone) { - QContactPhoneNumber phoneNumber; - phoneNumber.setSubTypes( QContactPhoneNumber::SubTypeMobile ); - QString number = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); - phoneNumber.setNumber(number); - currentContact.saveDetail(&phoneNumber); - } - break; - } - case RMobilePhoneBookStore::ETagPBAnrStart: - { - // This tag should precede every additional number entry - isAdditionalNumber = true; - break; - } - case RMobilePhoneBookStore::ETagPBEmailAddress: - { - if (pbBuffer->GetValue(bufPtr) == KErrNone) { - QContactEmailAddress email; - QString emailAddress = QString::fromUtf16(bufPtr.Ptr(), bufPtr.Length()); - email.setEmailAddress(emailAddress); - currentContact.saveDetail(&email); - } - break; - } - case RMobilePhoneBookStore::ETagPBNewEntry: - { - // This signals the end of the entry and is a special case - // which will be handled below. - break; - } - default: - { - // An unsupported field type - just skip this value - pbBuffer->SkipValue(dataType); - break; - } - } //switch - - // save contact to the array of contact to be returned if the whole entry was extracted - if ((tagValue == RMobilePhoneBookStore::ETagPBNewEntry && currentContact.localId() > 0) || - (pbBuffer->RemainingReadLength() == 0 && currentContact.localId() > 0)) { - //QContactSyncTarget syncTarget; - //syncTarget.setSyncTarget(KSimSyncTarget); - //currentContact.saveDetail(&syncTarget); - fetchedContacts.append(currentContact); - //clear current contact - currentContact.clearDetails(); - QScopedPointer contactId(new QContactId()); - contactId->setLocalId(0); - contactId->setManagerUri(QString()); - currentContact.setId(*contactId); - } - } //while - - CleanupStack::PopAndDestroy(pbBuffer); - PbkPrintToLog(_L("CntSymbianSimEngine::decodeSimContactsL() - OUT")); - return fetchedContacts; + setDetailAccessConstraints(detail, QContactDetail::ReadOnly); } -/*! Converts QContact to the TLV format which is used to save it to the Etel store. - * - * \param contact QContact to be converted - * \param rawData Contact in TLV format on return. - * \return QContact containing actually saved information. -*/ -QContact CntSymbianSimEngine::encodeSimContactL(const QContact* contact, TDes8& rawData) const +/*! + * Executes an asynchronous request so that it will appear synchronous. This is + * used internally in all synchronous functions. This way we only need to + * implement the matching asynchronous request. + * + * \param req Request to be run. + * \param qtError Qt error code. + * \return true if succesfull, false if unsuccesfull. + */ +bool CntSymbianSimEngine::executeRequest(QContactAbstractRequest *req, QContactManager::Error* qtError) const { - PbkPrintToLog(_L("CntSymbianSimEngine::encodeSimContactL() - IN")); - QContact convertedContact; - CPhoneBookBuffer* pbBuffer = new(ELeave) CPhoneBookBuffer(); - CleanupStack::PushL(pbBuffer); - pbBuffer->Set(&rawData); - - //add new enty tag - User::LeaveIfError(pbBuffer->AddNewEntryTag()); - - //add name - QString name; - QList nameDetails = contact->details(QContactName::DefinitionName); - if (nameDetails.count() == 0) { - // TODO: should we leave name empty? - name.append("Unnamed"); - } - else { - QContactName nameDetail = static_cast(nameDetails.at(0)); - 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 - TPtrC nameValue(reinterpret_cast(name.utf16())); - User::LeaveIfError(pbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBText, nameValue)); - - QContactName convertedNameDetail; - convertedNameDetail.setCustomLabel(name); - convertedContact.saveDetail(&convertedNameDetail); - - //add nickname - if (m_etelStoreInfo.iMaxSecondNames > 0) { - QString nickname; - QList nicknameDetails = contact->details(QContactNickname::DefinitionName); - if (nicknameDetails.count() > 0) { - QContactNickname nicknameDetail = static_cast(nicknameDetails.at(0)); - nickname = nicknameDetail.nickname(); - nickname = nickname.left(m_etelStoreInfo.iMaxTextLengthSecondName); //trim to the max possible length - TPtrC nicknameValue(reinterpret_cast(nickname.utf16())); - User::LeaveIfError(pbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBSecondName, nicknameValue)); - - QContactNickname convertedNicknameDetail; - convertedNicknameDetail.setNickname(nickname); - convertedContact.saveDetail(&convertedNicknameDetail); - } + *qtError = QContactManager::NoError; + + // TODO: + // Remove this code when threads-branch is merged to master. Then this code + // should not be needed because the default implementation at QContactManager + // is using the asynchronous requests in a similar manner to implement + // the synchronous functions. + + // Create a copy engine to workaround this functions const qualifier + CntSymbianSimEngine engine(*this); + + // Mimic the way how async requests are normally run + if (!engine.startRequest(req)) { + *qtError = QContactManager::LockedError; + } else { + if (!engine.waitForRequestFinished(req, KRequestTimeout)) + *qtError = QContactManager::UnspecifiedError; // timeout occurred } - - //add phone number - QList phoneNumberDetails = contact->details(QContactPhoneNumber::DefinitionName); - if (phoneNumberDetails.count() > 0) { - PbkPrintToLog(_L("CntSymbianSimEngine::encodeSimContactL() - add phone number")); - QContactPhoneNumber phoneNumberDetail = static_cast(phoneNumberDetails.at(0)); - QString number = phoneNumberDetail.number(); - PbkPrintToLog(_L("CntSymbianSimEngine::encodeSimContactL() - phone number length = %d"), - phoneNumberDetail.number().length()); - if (phoneNumberDetail.number().length() > m_etelStoreInfo.iMaxNumLength) { - User::LeaveIfError(KErrTooBig); - } - TPtrC phoneNumberValue(reinterpret_cast(phoneNumberDetail.number().utf16())); - PbkPrintToLog(_L("CntSymbianSimEngine::encodeSimContactL() - number = %S"), &phoneNumberValue); - User::LeaveIfError(pbBuffer->PutTagAndValue(RMobilePhoneBookStore::ETagPBNumber, phoneNumberValue)); - - QContactPhoneNumber convertedPhoneNumberDetail; - convertedPhoneNumberDetail.setNumber(phoneNumberDetail.number()); - convertedContact.saveDetail(&convertedPhoneNumberDetail); - } - - //add additional numbers - if (m_etelStoreInfo.iMaxAdditionalNumbers > 0) { - //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) { - 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); - } - } - - //add e-mails - if (m_etelStoreInfo.iMaxEmailAddr > 0) { - 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)); - 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); - } - } - - CleanupStack::PopAndDestroy(pbBuffer); - PbkPrintToLog(_L("CntSymbianSimEngine::encodeSimContactL() - OUT")); - return convertedContact; - + engine.requestDestroyed(req); + + if (req->error()) + *qtError = req->error(); + + return (*qtError == QContactManager::NoError); } -void CntSymbianSimEngine::updateDisplayLabel(QContact& contact) const +QContactManagerEngine* CntSymbianSimFactory::engine(const QMap& parameters, QContactManager::Error* error) { - QContactManager::Error error(QContactManager::NoError); - QString label = synthesizedDisplayLabel(contact, error); - if(error == QContactManager::NoError) { - contact = setContactDisplayLabel(label, contact); + CntSymbianSimEngine *engine = new CntSymbianSimEngine(parameters, error); + if(*error != QContactManager::NoError) { + delete engine; + return 0; } -} - -QContactManagerEngine* CntSymbianSimFactory::engine(const QMap& parameters, QContactManager::Error& error) -{ - return new CntSymbianSimEngine(parameters, error); + return engine; } QString CntSymbianSimFactory::managerName() const diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/src/cntsymbiansimtransformerror.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/src/cntsymbiansimtransformerror.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** 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 "cntsymbiansimtransformerror.h" + +/*! Transform a Symbian contact error id to QContactManager::Error. + * + * \param symbianError Symbian error. + * \param QtError Qt error. +*/ +void CntSymbianSimTransformError::transformError(TInt symbianError, QContactManager::Error* qtError) +{ + switch(symbianError) + { + case KErrNone: + { + *qtError = QContactManager::NoError; + break; + } + case KErrNotFound: + { + *qtError = QContactManager::DoesNotExistError; + break; + } + case KErrAlreadyExists: + { + *qtError = QContactManager::AlreadyExistsError; + break; + } + case KErrLocked: + { + *qtError = QContactManager::LockedError; + break; + } + case KErrAccessDenied: + case KErrPermissionDenied: + { + *qtError = QContactManager::PermissionsError; + break; + } + case KErrNoMemory: + { + *qtError = QContactManager::OutOfMemoryError; + break; + } + case KErrNotSupported: + { + *qtError = QContactManager::NotSupportedError; + break; + } + case KErrArgument: + { + *qtError = QContactManager::BadArgumentError; + break; + } + default: + { + *qtError = QContactManager::UnspecifiedError; + break; + } + } +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/symbiansim.pro --- a/qtcontactsmobility/plugins/contacts/symbiansim/symbiansim.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/symbiansim.pro Mon May 03 12:24:20 2010 +0300 @@ -28,8 +28,10 @@ INCLUDEPATH += $$SOURCE_DIR/contacts/requests HEADERS += $$PUBLIC_HEADERS \ inc/cntsymbiansimengine.h \ + inc/cntsymbiansimtransformerror.h \ inc/cntsimstore.h \ inc/cntsimstoreprivate.h \ + inc/cntsimstoreeventlistener.h \ inc/cntabstractsimrequest.h \ inc/cntsimcontactfetchrequest.h \ inc/cntsimcontactlocalidfetchrequest.h \ @@ -38,8 +40,10 @@ inc/cntsimdetaildefinitionfetchrequest.h SOURCES += src/cntsymbiansimengine.cpp \ + src/cntsymbiansimtransformerror.cpp \ src/cntsimstore.cpp \ src/cntsimstoreprivate.cpp \ + src/cntsimstoreeventlistener.cpp \ src/cntabstractsimrequest.cpp \ src/cntsimcontactfetchrequest.cpp \ src/cntsimcontactlocalidfetchrequest.cpp \ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/symbiansim_defines.pri --- a/qtcontactsmobility/plugins/contacts/symbiansim/symbiansim_defines.pri Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/symbiansim_defines.pri Mon May 03 12:24:20 2010 +0300 @@ -13,4 +13,28 @@ LIBS += -letel \ -letelmm } + + contains(S60_VERSION, 3.1) { + + # In S60 3.1 we need to use TMobilePhoneBookInfoV1 instead of TMobilePhoneBookInfoV5. + # Note: Etel testsserver uses V5 always. + !contains(DEFINES, SYMBIANSIM_BACKEND_USE_ETEL_TESTSERVER) { + DEFINES += SYMBIANSIM_BACKEND_PHONEBOOKINFOV1 + } + + # S60 3.1 device will reboot when removing several nonexisting contacts in + # sequence. The first remove operation will succeed but right after the second + # remove operation has completed the device reboots. To prevent rebooting + # we read the reserved slots before and really remove those contacts that + # really exist. + DEFINES += SYMBIANSIM_BACKEND_CHECK_BEFORE_REMOVE + } + + # In pre 10.1 platforms we need a small delay between requests to prevent + # S60 3.2 devices from rebooting and S60 5.0 devices from reporting a + # server busy error. Not sure if this is really needed for S60 3.1 but + # it does not hurt. + contains(S60_VERSION, 3.1) | contains(S60_VERSION, 3.2) | contains(S60_VERSION, 5.0) { + DEFINES += SYMBIANSIM_BACKEND_USE_DELAY + } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/qcontactmanagersymbiansim.pro --- a/qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/qcontactmanagersymbiansim.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -TEMPLATE=app -TARGET=tst_qcontactmanagersymbiansim - -QT += testlib -CONFIG += qtestlib - -include(../../symbiansim_defines.pri) - -symbian: { - INCLUDEPATH += .\inc - INCLUDEPATH += \ - ../../../../../src/global \ - ../../../../../src/contacts \ - ../../../../../src/contacts/details \ - ../../../../../src/contacts/filters \ - ../../../../../src/contacts/requests - INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - SOURCES += tst_qcontactmanagersymbiansim.cpp - TARGET.CAPABILITY = ALL -TCB - LIBS += -lqtcontacts -} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/tst_qcontactmanagersymbiansim.cpp --- a/qtcontactsmobility/plugins/contacts/symbiansim/tsrc/qcontactmanagersymbiansim/tst_qcontactmanagersymbiansim.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1125 +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 -#include - -#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= - -/*! -*/ -class tst_QContactManagerSymbianSim : public QObject -{ -Q_OBJECT - -public: - tst_QContactManagerSymbianSim(); - virtual ~tst_QContactManagerSymbianSim(); - -public slots: - void init(); - void cleanup(); - void initTestCase(); - void cleanupTestCase(); - -private slots: - /* Test cases that take no data */ - void hasFeature(); - void supportedContactTypes(); - void detailDefinitions(); - - /* Test cases that need data */ - void addContact_data(); - void addContact(); - 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: - QContactManager* m_cm; - RMobilePhoneBookStore::TMobilePhoneBookInfoV5 m_etelStoreInfo; - RMobilePhoneBookStore::TMobilePhoneBookInfoV5Pckg m_etelStoreInfoPckg; -}; - -tst_QContactManagerSymbianSim::tst_QContactManagerSymbianSim() : - m_etelStoreInfoPckg( m_etelStoreInfo ) -{ - qRegisterMetaType("QContactAbstractRequest::State"); -} - -tst_QContactManagerSymbianSim::~tst_QContactManagerSymbianSim() -{ -} - -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() -{ - // TODO: Groups may be supported by some SIM cards? - QVERIFY(!m_cm->hasFeature(QContactManager::Groups)); - QVERIFY(!m_cm->hasFeature(QContactManager::Groups, QContactType::TypeContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::Groups, QContactType::TypeGroup)); - - QVERIFY(!m_cm->hasFeature(QContactManager::ActionPreferences)); - QVERIFY(!m_cm->hasFeature(QContactManager::ActionPreferences, QContactType::TypeContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::ActionPreferences, QContactType::TypeGroup)); - - QVERIFY(!m_cm->hasFeature(QContactManager::MutableDefinitions)); - QVERIFY(!m_cm->hasFeature(QContactManager::MutableDefinitions, QContactType::TypeContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::MutableDefinitions, QContactType::TypeGroup)); - - QVERIFY(!m_cm->hasFeature(QContactManager::Relationships)); - QVERIFY(!m_cm->hasFeature(QContactManager::Relationships, QContactType::TypeContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::Relationships, QContactType::TypeGroup)); - - QVERIFY(!m_cm->hasFeature(QContactManager::ArbitraryRelationshipTypes)); - QVERIFY(!m_cm->hasFeature(QContactManager::ArbitraryRelationshipTypes, QContactType::TypeContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::ArbitraryRelationshipTypes, QContactType::TypeGroup)); - - QVERIFY(!m_cm->hasFeature(QContactManager::RelationshipOrdering)); - QVERIFY(!m_cm->hasFeature(QContactManager::RelationshipOrdering, QContactType::TypeContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::RelationshipOrdering, QContactType::TypeGroup)); - - // TODO: self contact may be supported? (so called "own number store") - QVERIFY(!m_cm->hasFeature(QContactManager::SelfContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::SelfContact, QContactType::TypeContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::SelfContact, QContactType::TypeGroup)); - - QVERIFY(!m_cm->hasFeature(QContactManager::Anonymous)); - QVERIFY(!m_cm->hasFeature(QContactManager::Anonymous, QContactType::TypeContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::Anonymous, QContactType::TypeGroup)); - - QVERIFY(!m_cm->hasFeature(QContactManager::ChangeLogs)); - QVERIFY(!m_cm->hasFeature(QContactManager::ChangeLogs, QContactType::TypeContact)); - QVERIFY(!m_cm->hasFeature(QContactManager::ChangeLogs, QContactType::TypeGroup)); -} - -void tst_QContactManagerSymbianSim::supportedContactTypes() -{ - QStringList types = m_cm->supportedContactTypes(); - QVERIFY(types.count() > 0); - // Assuming that contact type of TypeContact is always supported - QVERIFY(types.contains(QContactType::TypeContact)); -} - -void tst_QContactManagerSymbianSim::detailDefinitions() -{ - QMap detailDefinitions = m_cm->detailDefinitions(); - QCOMPARE(m_cm->error(), QContactManager::NoError); - - QVERIFY(detailDefinitions.count() >= 2); - QVERIFY(detailDefinitions.count() <= 7); - - // 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)); - - // Dynamic definitions (that depend on SIM card type) - if(detailDefinitions.count() == 7) { - QVERIFY(detailDefinitions.contains(QContactNickname::DefinitionName)); - 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("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))); - - 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("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("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("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() -{ - // 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"); - - 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); - - // 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]); - } - - // 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(); - - if(!m_cm->supportedContactTypes().contains(contact.type())) - return false; - - QList uniqueDetails = QList(); - - foreach(QContactDetail detail, contact.details()) { - 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; - } - } - - return true; -} - -/* - * 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() -{ - 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::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() -{ - 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/contacts/symbiansim/tsrc/tsrc.pro --- a/qtcontactsmobility/plugins/contacts/symbiansim/tsrc/tsrc.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/contacts/symbiansim/tsrc/tsrc.pro Mon May 03 12:24:20 2010 +0300 @@ -1,3 +1,4 @@ TEMPLATE = subdirs CONFIG += ordered -SUBDIRS += qcontactmanagersymbiansim +SUBDIRS += tst_simcm \ + tst_simcmasync diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/plugins/plugins.pro --- a/qtcontactsmobility/plugins/plugins.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/plugins/plugins.pro Mon May 03 12:24:20 2010 +0300 @@ -1,11 +1,4 @@ -###################################################################### -# -# Mobility API project - plugins -# -###################################################################### - -include(../pathconfig.pri) -include($$QT_MOBILITY_BUILD_TREE/config.pri) +include(../staticconfig.pri) TEMPLATE = subdirs diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/bwins/QtContactsu.def --- a/qtcontactsmobility/src/contacts/bwins/QtContactsu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1168 +0,0 @@ -EXPORTS - ?setEventType@QContactChangeLogFilter@QtMobility@@QAEXW4EventType@12@@Z @ 1 NONAME ; void QtMobility::QContactChangeLogFilter::setEventType(enum QtMobility::QContactChangeLogFilter::EventType) - ?setVendor@QContactActionFilter@QtMobility@@QAEXABVQString@@H@Z @ 2 NONAME ; void QtMobility::QContactActionFilter::setVendor(class QString const &, int) - ?metaObject@QContactRelationshipRemoveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 3 NONAME ; struct QMetaObject const * QtMobility::QContactRelationshipRemoveRequest::metaObject(void) const - ?DefinitionName@QContactTimestamp@QtMobility@@2U?$Latin1Literal@$09@2@B @ 4 NONAME ; struct QtMobility::Latin1Literal<10> const QtMobility::QContactTimestamp::DefinitionName - ?qt_metacall@QContactLocalIdFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 5 NONAME ; int QtMobility::QContactLocalIdFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ?direction@QContactSortOrder@QtMobility@@QBE?AW4SortOrder@Qt@@XZ @ 6 NONAME ; enum Qt::SortOrder QtMobility::QContactSortOrder::direction(void) const - ?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 - ?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 - ?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 * *) - ?action@QContactAction@QtMobility@@SAPAV12@ABVQContactActionDescriptor@2@@Z @ 30 NONAME ; class QtMobility::QContactAction * QtMobility::QContactAction::action(class QtMobility::QContactActionDescriptor const &) - ?SubTypeSipVoip@QContactOnlineAccount@QtMobility@@2U?$Latin1Literal@$07@2@B @ 31 NONAME ; struct QtMobility::Latin1Literal<8> const QtMobility::QContactOnlineAccount::SubTypeSipVoip - ??1QContactDetail@QtMobility@@UAE@XZ @ 32 NONAME ; QtMobility::QContactDetail::~QContactDetail(void) - ?saveContact@QContactManager@QtMobility@@QAE_NPAVQContact@2@@Z @ 33 NONAME ; bool QtMobility::QContactManager::saveContact(class QtMobility::QContact *) - ?ids@QContactLocalIdFilter@QtMobility@@QBE?AV?$QList@I@@XZ @ 34 NONAME ; class QList QtMobility::QContactLocalIdFilter::ids(void) const - ?getStaticMetaObject@QContactDetailDefinitionRemoveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 35 NONAME ; struct QMetaObject const & QtMobility::QContactDetailDefinitionRemoveRequest::getStaticMetaObject(void) - ?statusMessage@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 36 NONAME ; class QString QtMobility::QContactOnlineAccount::statusMessage(void) const - ?getStaticMetaObject@QContactManager@QtMobility@@SAABUQMetaObject@@XZ @ 37 NONAME ; struct QMetaObject const & QtMobility::QContactManager::getStaticMetaObject(void) - ?tr@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 38 NONAME ; class QString QtMobility::QContactRemoveRequest::tr(char const *, char const *, int) - ?setValue@QContactDetailFilter@QtMobility@@QAEXABVQVariant@@@Z @ 39 NONAME ; void QtMobility::QContactDetailFilter::setValue(class QVariant const &) - ?first@QContactRelationshipFetchRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 40 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFetchRequest::first(void) const - ?DefinitionName@QContactGuid@QtMobility@@2U?$Latin1Literal@$04@2@B @ 41 NONAME ; struct QtMobility::Latin1Literal<5> const QtMobility::QContactGuid::DefinitionName - ?qt_metacall@QContactAbstractRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 42 NONAME ; int QtMobility::QContactAbstractRequest::qt_metacall(enum QMetaObject::Call, int, void * *) - ?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 &) - ?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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/contacts.pro --- a/qtcontactsmobility/src/contacts/contacts.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/contacts.pro Mon May 03 12:24:20 2010 +0300 @@ -25,8 +25,8 @@ qcontactchangeset.h \ qcontactdetail.h \ qcontactdetaildefinition.h \ - qcontactdetaildefinitionfield.h \ qcontactdetailfielddefinition.h \ + qcontactfetchhint.h \ qcontactfilter.h \ qcontactid.h \ qcontactmanager.h \ @@ -46,6 +46,7 @@ qcontactdetail_p.h \ qcontactdetaildefinition_p.h \ qcontactdetailfielddefinition_p.h \ + qcontactfetchhint_p.h \ qcontactfilter_p.h \ qcontactid_p.h \ qcontactmanager_p.h \ @@ -62,6 +63,7 @@ qcontactdetail.cpp \ qcontactdetaildefinition.cpp \ qcontactdetailfielddefinition.cpp \ + qcontactfetchhint.cpp \ qcontactfilter.cpp \ qcontactid.cpp \ qcontactmanager_p.cpp \ @@ -75,10 +77,23 @@ $$PUBLIC_HEADERS \ $$PRIVATE_HEADERS -maemo { +maemo5 { + isEmpty(CONTACTS_DEFAULT_ENGINE): CONTACTS_DEFAULT_ENGINE=maemo5 +} + +maemo6 { isEmpty(CONTACTS_DEFAULT_ENGINE): CONTACTS_DEFAULT_ENGINE=tracker } +maemo5|maemo6 { + CONFIG += create_pc create_prl + QMAKE_PKGCONFIG_DESCRIPTION = Qt Mobility - Contacts API + pkgconfig.path = $$QT_MOBILITY_LIB/pkgconfig + pkgconfig.files = QtContacts.pc + + INSTALLS += pkgconfig +} + wince* { isEmpty(CONTACTS_DEFAULT_ENGINE): CONTACTS_DEFAULT_ENGINE=wince } @@ -86,31 +101,28 @@ symbian { isEmpty(CONTACTS_DEFAULT_ENGINE): CONTACTS_DEFAULT_ENGINE=symbian - load(data_caging_paths) - INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - TARGET.EPOCALLOWDLLDATA = 1 - TARGET.CAPABILITY = ALL -TCB + TARGET.CAPABILITY = CAP_GENERAL_DLL TARGET.UID3 = 0x2002AC7A LIBS += -lefsrv + + defFiles = \ + "$${LITERAL_HASH}ifdef WINSCW" \ + "DEFFILE ../s60installs/bwins/$${TARGET}.def" \ + "$${LITERAL_HASH}elif defined EABI" \ + "DEFFILE ../s60installs/eabi/$${TARGET}.def" \ + "$${LITERAL_HASH}endif " + MMP_RULES += defFiles ### Contacts # Main library - defFiles = \ - "$${LITERAL_HASH}ifdef WINSCW" \ - "DEFFILE bwins/$${TARGET}.def" \ - "$${LITERAL_HASH}elif defined EABI" \ - "DEFFILE eabi/$${TARGET}.def" \ - "$${LITERAL_HASH}endif " - MMP_RULES += defFiles - CONTACTS_DEPLOYMENT.sources = QtContacts.dll CONTACTS_DEPLOYMENT.path = \sys\bin DEPLOYMENT += CONTACTS_DEPLOYMENT } -!isEmpty(CONTACTS_DEFAULT_ENGINE): DEFINES += Q_CONTACTS_DEFAULT_ENGINE=CONTACTS_DEFAULT_ENGINE +!isEmpty(CONTACTS_DEFAULT_ENGINE): DEFINES += Q_CONTACTS_DEFAULT_ENGINE=$$CONTACTS_DEFAULT_ENGINE CONFIG += app include(../../features/deploy.pri) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/details.pri --- a/qtcontactsmobility/src/contacts/details/details.pri Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/details.pri Mon May 03 12:24:20 2010 +0300 @@ -12,6 +12,7 @@ details/qcontactfamily.h \ details/qcontactgender.h \ details/qcontactgeolocation.h \ + details/qcontactglobalpresence.h \ details/qcontactguid.h \ details/qcontactname.h \ details/qcontactnickname.h \ @@ -19,7 +20,11 @@ details/qcontactonlineaccount.h \ details/qcontactorganization.h \ details/qcontactphonenumber.h \ + details/qcontactpresence.h \ + details/qcontactringtone.h \ details/qcontactsynctarget.h \ + details/qcontacttag.h \ + details/qcontactthumbnail.h \ details/qcontacttimestamp.h \ details/qcontacttype.h \ details/qcontacturl.h diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactaddress.h --- a/qtcontactsmobility/src/contacts/details/qcontactaddress.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactaddress.h Mon May 03 12:24:20 2010 +0300 @@ -56,31 +56,31 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldStreet; - const char* FieldLocality; - const char* FieldRegion; - const char* FieldPostcode; - const char* FieldCountry; - const char* FieldSubTypes; - const char* FieldPostOfficeBox; - const char* SubTypeParcel; - const char* SubTypePostal; - const char* SubTypeDomestic; - const char* SubTypeInternational; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldStreet; + static const QLatin1Constant FieldLocality; + static const QLatin1Constant FieldRegion; + static const QLatin1Constant FieldPostcode; + static const QLatin1Constant FieldCountry; + static const QLatin1Constant FieldSubTypes; + static const QLatin1Constant FieldPostOfficeBox; + static const QLatin1Constant SubTypeParcel; + static const QLatin1Constant SubTypePostal; + static const QLatin1Constant SubTypeDomestic; + static const QLatin1Constant SubTypeInternational; #else - Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactAddress, "StreetAddress") - Q_DECLARE_LATIN1_LITERAL(FieldStreet, "Street"); - Q_DECLARE_LATIN1_LITERAL(FieldLocality, "Locality"); - Q_DECLARE_LATIN1_LITERAL(FieldRegion, "Region"); - Q_DECLARE_LATIN1_LITERAL(FieldPostcode, "Postcode"); - Q_DECLARE_LATIN1_LITERAL(FieldCountry, "Country"); - Q_DECLARE_LATIN1_LITERAL(FieldSubTypes, "SubTypes"); - Q_DECLARE_LATIN1_LITERAL(FieldPostOfficeBox, "PostOfficeBox"); - Q_DECLARE_LATIN1_LITERAL(SubTypeParcel, "Parcel"); - Q_DECLARE_LATIN1_LITERAL(SubTypePostal, "Postal"); - Q_DECLARE_LATIN1_LITERAL(SubTypeDomestic, "Domestic"); - Q_DECLARE_LATIN1_LITERAL(SubTypeInternational, "International"); + Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactAddress, "Address") + Q_DECLARE_LATIN1_CONSTANT(FieldStreet, "Street"); + Q_DECLARE_LATIN1_CONSTANT(FieldLocality, "Locality"); + Q_DECLARE_LATIN1_CONSTANT(FieldRegion, "Region"); + Q_DECLARE_LATIN1_CONSTANT(FieldPostcode, "Postcode"); + Q_DECLARE_LATIN1_CONSTANT(FieldCountry, "Country"); + Q_DECLARE_LATIN1_CONSTANT(FieldSubTypes, "SubTypes"); + Q_DECLARE_LATIN1_CONSTANT(FieldPostOfficeBox, "PostOfficeBox"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeParcel, "Parcel"); + Q_DECLARE_LATIN1_CONSTANT(SubTypePostal, "Postal"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeDomestic, "Domestic"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeInternational, "International"); #endif void setStreet(const QString& street) {setValue(FieldStreet, street);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactanniversary.h --- a/qtcontactsmobility/src/contacts/details/qcontactanniversary.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactanniversary.h Mon May 03 12:24:20 2010 +0300 @@ -55,27 +55,27 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldCalendarId; - const char* FieldOriginalDate; - const char* FieldEvent; - const char* FieldSubType; - const char* SubTypeWedding; - const char* SubTypeEngagement; - const char* SubTypeHouse; - const char* SubTypeEmployment; - const char* SubTypeMemorial; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldCalendarId; + static const QLatin1Constant FieldOriginalDate; + static const QLatin1Constant FieldEvent; + static const QLatin1Constant FieldSubType; + static const QLatin1Constant SubTypeWedding; + static const QLatin1Constant SubTypeEngagement; + static const QLatin1Constant SubTypeHouse; + static const QLatin1Constant SubTypeEmployment; + static const QLatin1Constant SubTypeMemorial; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactAnniversary, "Anniversary") - Q_DECLARE_LATIN1_LITERAL(FieldCalendarId, "CalendarId"); - Q_DECLARE_LATIN1_LITERAL(FieldOriginalDate, "OriginalDate"); - Q_DECLARE_LATIN1_LITERAL(FieldEvent, "Event"); - Q_DECLARE_LATIN1_LITERAL(FieldSubType, "SubType"); - Q_DECLARE_LATIN1_LITERAL(SubTypeWedding, "Wedding"); - Q_DECLARE_LATIN1_LITERAL(SubTypeEngagement, "Engagement"); - Q_DECLARE_LATIN1_LITERAL(SubTypeHouse, "House"); - Q_DECLARE_LATIN1_LITERAL(SubTypeEmployment, "Employment"); - Q_DECLARE_LATIN1_LITERAL(SubTypeMemorial, "Memorial"); + Q_DECLARE_LATIN1_CONSTANT(FieldCalendarId, "CalendarId"); + Q_DECLARE_LATIN1_CONSTANT(FieldOriginalDate, "OriginalDate"); + Q_DECLARE_LATIN1_CONSTANT(FieldEvent, "Event"); + Q_DECLARE_LATIN1_CONSTANT(FieldSubType, "SubType"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeWedding, "Wedding"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeEngagement, "Engagement"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeHouse, "House"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeEmployment, "Employment"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeMemorial, "Memorial"); #endif void setOriginalDate(const QDate& date) {setValue(FieldOriginalDate, date);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactavatar.h --- a/qtcontactsmobility/src/contacts/details/qcontactavatar.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactavatar.h Mon May 03 12:24:20 2010 +0300 @@ -43,14 +43,12 @@ #define QCONTACTAVATAR_H #include -#include +#include + #include "qtcontactsglobal.h" #include "qcontactdetail.h" #include "qcontact.h" -class QPixmap; -class QSize; - QTM_BEGIN_NAMESPACE /* Leaf class */ @@ -58,41 +56,52 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldAvatar; - const char* FieldAvatarPixmap; - const char* FieldSubType; - const char* SubTypeImage; - const char* SubTypeVideo; - const char* SubTypeTexturedMesh; - const char* SubTypeAudioRingtone; - const char* SubTypeVideoRingtone; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldImageUrl; + static const QLatin1Constant FieldVideoUrl; + + // deprecated keys: + static const QLatin1Constant FieldAvatar; + static const QLatin1Constant FieldAvatarPixmap; + static const QLatin1Constant FieldSubType; + static const QLatin1Constant SubTypeImage; + static const QLatin1Constant SubTypeVideo; + static const QLatin1Constant SubTypeAudioRingtone; + static const QLatin1Constant SubTypeVideoRingtone; + static const QLatin1Constant SubTypeTexturedMesh; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactAvatar, "Avatar") - Q_DECLARE_LATIN1_LITERAL(FieldAvatar, "Avatar"); - Q_DECLARE_LATIN1_LITERAL(FieldAvatarPixmap, "AvatarPixmap"); - Q_DECLARE_LATIN1_LITERAL(FieldSubType, "SubType"); - Q_DECLARE_LATIN1_LITERAL(SubTypeImage, "Image"); - Q_DECLARE_LATIN1_LITERAL(SubTypeVideo, "Video"); - Q_DECLARE_LATIN1_LITERAL(SubTypeTexturedMesh, "TexturedMesh"); - Q_DECLARE_LATIN1_LITERAL(SubTypeAudioRingtone, "AudioRingtone"); - Q_DECLARE_LATIN1_LITERAL(SubTypeVideoRingtone, "VideoRingtone"); + Q_DECLARE_LATIN1_CONSTANT(FieldImageUrl, "ImageUrl"); + Q_DECLARE_LATIN1_CONSTANT(FieldVideoUrl, "VideoUrl"); + // MeshUri, VibetoneUri, Audio(theme)Uri, ...? + + // deprecated keys: + Q_DECLARE_LATIN1_CONSTANT(FieldAvatar, "Avatar"); + Q_DECLARE_LATIN1_CONSTANT(FieldAvatarPixmap, "AvatarPixmap"); + Q_DECLARE_LATIN1_CONSTANT(FieldSubType, "SubType"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeImage, "Image"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeVideo, "Video"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeAudioRingtone, "AudioRingtone"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeVideoRingtone, "VideoRingtone"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeTexturedMesh, "TexturedMesh"); #endif - void setAvatar(const QString& avatarPath) {setValue(FieldAvatar, avatarPath);} - QString avatar() const {return value(FieldAvatar);} - QPixmap pixmap() const {return value(QContactAvatar::FieldAvatarPixmap);} - bool setPixmap(const QPixmap& pixmap) - { - setSubType(SubTypeImage); - return setValue(FieldAvatarPixmap, QVariant::fromValue(pixmap)); - } - - void setSubType(const QString& subType) {setValue(FieldSubType, subType);} - QString subType() const {return value(FieldSubType);} + void setImageUrl(const QUrl& imageUrl) {setValue(FieldImageUrl, imageUrl);} + QUrl imageUrl() const {return value(FieldImageUrl);} + + void setVideoUrl(const QUrl& videoUrl) {setValue(FieldVideoUrl, videoUrl);} + QUrl videoUrl() const {return value(FieldVideoUrl);} + + + // old, deprecated API: to be removed after the transition period has elapsed. + QString Q_DECL_DEPRECATED avatar() const; + bool Q_DECL_DEPRECATED setAvatar(const QString& avatar); + QPixmap Q_DECL_DEPRECATED pixmap() const; + bool Q_DECL_DEPRECATED setPixmap(const QPixmap& pixmap); + QString Q_DECL_DEPRECATED subType() const; + void Q_DECL_DEPRECATED setSubType(const QString& subtype); }; QTM_END_NAMESPACE #endif - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactbirthday.h --- a/qtcontactsmobility/src/contacts/details/qcontactbirthday.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactbirthday.h Mon May 03 12:24:20 2010 +0300 @@ -55,11 +55,11 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldBirthday; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldBirthday; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactBirthday, "Birthday") - Q_DECLARE_LATIN1_LITERAL(FieldBirthday, "Birthday"); + Q_DECLARE_LATIN1_CONSTANT(FieldBirthday, "Birthday"); #endif void setDate(const QDate& date) {setValue(FieldBirthday, date);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactdetails.cpp --- a/qtcontactsmobility/src/contacts/details/qcontactdetails.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactdetails.cpp Mon May 03 12:24:20 2010 +0300 @@ -103,15 +103,6 @@ */ /*! - \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. @@ -119,6 +110,13 @@ */ /*! + \class QContactGlobalPresence + \brief The QContactGlobalPresence class provides aggregated presence information + for a contact, synthesized or supplied by the backend. + \ingroup contacts-details + */ + +/*! \class QContactGuid \brief The QContactGuid class contains the globally unique Id of a contact. @@ -166,6 +164,20 @@ */ /*! + \class QContactPresence + \brief The QContactPresence class provides presence information + for an online account of a contact. + \ingroup contacts-details + */ + +/*! + \class QContactRingtone + \brief The QContactRingtone class provides a ringtone associated + with a contact + \ingroup contacts-details + */ + +/*! \class QContactSyncTarget \brief The QContactSyncTarget class provides a sync target for a contact. @@ -173,6 +185,20 @@ */ /*! + \class QContactTag + \brief The QContactTag class contains a tag associated with a + contact. + \ingroup contacts-details + */ + +/*! + \class QContactThumbnail + \brief The QContactThumbnail class contains a thumbnail used + in display lists to represent the contact. + \ingroup contacts-details + */ + +/*! \class QContactTimestamp \brief The QContactTimestamp class contains the creation and last-modified timestamp associated with the contact. @@ -196,91 +222,151 @@ \variable QContactName::DefinitionName The constant string which identifies the definition of details which are names. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::DefinitionName, "Name"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::DefinitionName, "Name"); /*! \variable QContactNickname::DefinitionName The constant string which identifies the definition of details which are nicknames. */ -Q_DEFINE_LATIN1_LITERAL(QContactNickname::DefinitionName, "Nickname"); +Q_DEFINE_LATIN1_CONSTANT(QContactNickname::DefinitionName, "Nickname"); /*! \variable QContactNote::DefinitionName The constant string which identifies the definition of details which are notes. */ -Q_DEFINE_LATIN1_LITERAL(QContactNote::DefinitionName, "Note"); +Q_DEFINE_LATIN1_CONSTANT(QContactNote::DefinitionName, "Note"); /*! \variable QContactAvatar::DefinitionName The constant string which identifies the definition of details which are avatars. */ -Q_DEFINE_LATIN1_LITERAL(QContactAvatar::DefinitionName, "Avatar"); +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::DefinitionName, "Avatar"); /*! \variable QContactAddress::DefinitionName The constant string which identifies the definition of details which are street addresses. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::DefinitionName, "StreetAddress"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::DefinitionName, "Address"); /*! \variable QContactPhoneNumber::DefinitionName The constant string which identifies the definition of details which are phone numbers. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::DefinitionName, "PhoneNumber"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::DefinitionName, "PhoneNumber"); + +/*! + \variable QContactPresence::DefinitionName + The constant string which identifies the definition of details which contain presence information. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactPresence::DefinitionName, "Presence"); + +/*! + \variable QContactPresence::FieldTimestamp + + The constant key for which the last update timestamp value is stored in details + of the QContactPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactPresence::FieldTimestamp, "Timestamp"); + +/*! + \variable QContactPresence::FieldNickname + + The constant key for which the nickname value is stored in details + of the QContactPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactPresence::FieldNickname, "Nickname"); + +/*! + \variable QContactPresence::FieldPresenceState + + The constant key for which the presence state value is stored in details + of the QContactPresence typel. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactPresence::FieldPresenceState, "PresenceState"); + +/*! + \variable QContactPresence::FieldPresenceStateText + + The constant key for which the presence provider provided text representation + of the presence state is stored in details of the QContactPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactPresence::FieldPresenceStateText, "PresenceStateText"); + +/*! + \variable QContactPresence::FieldPresenceStateImageUrl + + The constant key for which the image url value for the current presence state + is stored in details of the QContactPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactPresence::FieldPresenceStateImageUrl, "PresenceStateImageUrl"); + +/*! + \variable QContactPresence::FieldCustomMessage + + The constant key for which the user-entered custom message for their state + is stored in details of the QContactPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactPresence::FieldCustomMessage, "CustomMessage"); + +/*! + \variable QContactRingtone::DefinitionName + The constant string which identifies the definition of details which are ringtones. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactRingtone::DefinitionName, "Ringtone"); /*! \variable QContactSyncTarget::DefinitionName - The constant string which identifies the definition of details which are synchronisation target stores. + The constant string which identifies the definition of details which are synchronization target stores. */ -Q_DEFINE_LATIN1_LITERAL(QContactSyncTarget::DefinitionName, "SyncTarget"); +Q_DEFINE_LATIN1_CONSTANT(QContactSyncTarget::DefinitionName, "SyncTarget"); /*! \variable QContactTimestamp::DefinitionName - The constant string which identifies the definition of details which are contact synchronisation timestamps. + The constant string which identifies the definition of details which are contact synchronization timestamps. */ -Q_DEFINE_LATIN1_LITERAL(QContactTimestamp::DefinitionName, "Timestamp"); +Q_DEFINE_LATIN1_CONSTANT(QContactTimestamp::DefinitionName, "Timestamp"); /*! \variable QContactType::DefinitionName The constant string which identifies the definition of details which identify the type of the contact. */ -Q_DEFINE_LATIN1_LITERAL(QContactType::DefinitionName, "Type"); +Q_DEFINE_LATIN1_CONSTANT(QContactType::DefinitionName, "Type"); /*! \variable QContactGuid::DefinitionName The constant string which identifies the definition of details which are globally unique identifiers. */ -Q_DEFINE_LATIN1_LITERAL(QContactGuid::DefinitionName, "Guid"); +Q_DEFINE_LATIN1_CONSTANT(QContactGuid::DefinitionName, "Guid"); /*! \variable QContactEmailAddress::DefinitionName The constant string which identifies the definition of details which are email addresses. */ -Q_DEFINE_LATIN1_LITERAL(QContactEmailAddress::DefinitionName, "EmailAddress"); +Q_DEFINE_LATIN1_CONSTANT(QContactEmailAddress::DefinitionName, "EmailAddress"); /*! \variable QContactFamily::DefinitionName The constant string which identifies the definition of details which contain the names of the contact's family. */ -Q_DEFINE_LATIN1_LITERAL(QContactFamily::DefinitionName, "Family"); +Q_DEFINE_LATIN1_CONSTANT(QContactFamily::DefinitionName, "Family"); /*! \variable QContactUrl::DefinitionName The constant string which identifies the definition of details which are universal resource location paths. */ -Q_DEFINE_LATIN1_LITERAL(QContactUrl::DefinitionName, "Url"); +Q_DEFINE_LATIN1_CONSTANT(QContactUrl::DefinitionName, "Url"); /*! \variable QContactBirthday::DefinitionName The constant string which identifies the definition of details which are the dates of birthdays. */ -Q_DEFINE_LATIN1_LITERAL(QContactBirthday::DefinitionName, "Birthday"); +Q_DEFINE_LATIN1_CONSTANT(QContactBirthday::DefinitionName, "Birthday"); /*! \variable QContactAnniversary::DefinitionName The constant string which identifies the definition of details which are anniversary dates. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::DefinitionName, "Anniversary"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::DefinitionName, "Anniversary"); /*! \variable QContactGender::DefinitionName @@ -288,19 +374,7 @@ The constant string which identifies the definition of details which identify the gender of a contact in a given context. */ -Q_DEFINE_LATIN1_LITERAL(QContactGender::DefinitionName, "Gender"); - -/*! - \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"); +Q_DEFINE_LATIN1_CONSTANT(QContactGender::DefinitionName, "Gender"); /*! \variable QContactGeoLocation::DefinitionName @@ -308,7 +382,61 @@ 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_CONSTANT(QContactGeoLocation::DefinitionName, "GeoLocation"); + +/*! + \variable QContactGlobalPresence::DefinitionName + The constant string which identifies the definition of details which contain presence information. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactGlobalPresence::DefinitionName, "GlobalPresence"); + +/*! + \variable QContactGlobalPresence::FieldTimestamp + + The constant key for which the last update timestamp value is stored in details + of the QContactGlobalPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactGlobalPresence::FieldTimestamp, "Timestamp"); + +/*! + \variable QContactGlobalPresence::FieldNickname + + The constant key for which the nickname value is stored in details + of the QContactGlobalPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactGlobalPresence::FieldNickname, "Nickname"); + +/*! + \variable QContactGlobalPresence::FieldPresenceState + + The constant key for which the presence state value is stored in details + of the QContactGlobalPresence typel. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactGlobalPresence::FieldPresenceState, "PresenceState"); + +/*! + \variable QContactGlobalPresence::FieldPresenceStateText + + The constant key for which the presence provider provided text representation + of the presence state is stored in details of the QContactGlobalPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactGlobalPresence::FieldPresenceStateText, "PresenceStateText"); + +/*! + \variable QContactGlobalPresence::FieldPresenceStateImageUrl + + The constant key for which the image url value for the current presence state + is stored in details of the QContactGlobalPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactGlobalPresence::FieldPresenceStateImageUrl, "PresenceStateImageUrl"); + +/*! + \variable QContactGlobalPresence::FieldCustomMessage + + The constant key for which the user-entered custom message for their state + is stored in details of the QContactGlobalPresence type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactGlobalPresence::FieldCustomMessage, "CustomMessage"); /*! \variable QContactOnlineAccount::DefinitionName @@ -317,77 +445,129 @@ which identify the organization to which a contact belongs in a given context. */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::DefinitionName, "OnlineAccount"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::DefinitionName, "OnlineAccount"); /*! + \variable QContactTag::DefinitionName + The constant string which identifies the definition of details which are tags. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactTag::DefinitionName, "Tag"); + +/*! + \variable QContactThumbnail::DefinitionName + The constant string which identifies the definition of details which are thumbnails. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactThumbnail::DefinitionName, "Thumbnail"); + +/*! + \deprecated \variable QContactOnlineAccount::FieldNickname The constant key for which the nickname value is stored in details of the QContactOnlineAccount type. + + This field is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::FieldNickname instead! */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::FieldNickname, "Nickname"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::FieldNickname, "Nickname"); /*! + \deprecated \variable QContactOnlineAccount::FieldPresence The constant key for which the presence value is stored in details - of the QContactOnlineAccount typel. + of the QContactOnlineAccount type. + + This field is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::FieldPresence instead! */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::FieldPresence, "Presence"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::FieldPresence, "Presence"); /*! + \deprecated \variable QContactOnlineAccount::PresenceAvailable The value for presence which specifies that the contact's current + + This key is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::PresenceAvailable instead! status is available. */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::PresenceAvailable, "Available"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::PresenceAvailable, "Available"); /*! + \deprecated \variable QContactOnlineAccount::PresenceHidden The value for presence which specifies that the contact's current. + + This key is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::PresenceHidden instead! status is hidden */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::PresenceHidden, "Hidden"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::PresenceHidden, "Hidden"); /*! + \deprecated \variable QContactOnlineAccount::PresenceBusy The value for presence which specifies that the contact's current status is busy. + + This key is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::PresenceBusy instead! */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::PresenceBusy, "Busy"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::PresenceBusy, "Busy"); /*! + \deprecated \variable QContactOnlineAccount::PresenceAway The value for presence which specifies that the contact's current status is away. + + This key is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::PresenceAway instead! */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::PresenceAway, "Away"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::PresenceAway, "Away"); /*! + \deprecated \variable QContactOnlineAccount::PresenceExtendedAway The value for presence which specifies that the contact's current status is extended away. + + This key is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::PresenceExtendedAway instead! */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::PresenceExtendedAway, "ExtendedAway"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::PresenceExtendedAway, "ExtendedAway"); /*! + \deprecated \variable QContactOnlineAccount::PresenceUnknown The value for presence which specifies that the contact's current status is unknown. + + This key is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::PresenceUnknown instead! */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::PresenceUnknown, "Unknown"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::PresenceUnknown, "Unknown"); /*! + \deprecated \variable QContactOnlineAccount::PresenceOffline The value for presence which specifies that the contact's current status is offline. + + This key is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::PresenceOffline instead! */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::PresenceOffline, "Offline"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::PresenceOffline, "Offline"); /*! + \deprecated \variable QContactOnlineAccount::FieldStatusMessage The constant key for which the status message value is stored in details of the QContactOnlineAccount type. + + This field is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::FieldStatusMessage instead! */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::FieldStatusMessage, "StatusMessage"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::FieldStatusMessage, "StatusMessage"); /*! \variable QContactOnlineAccount::FieldCapabilities @@ -395,7 +575,63 @@ The constant key for which the account capabilities value is stored in details of the QContactOnlineAccount type. */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::FieldCapabilities, "Capabilities"); +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::FieldCapabilities, "Capabilities"); + +/*! + \variable QContactOnlineAccount::FieldAccountUri + + The constant key for which the remote account uri value is stored + in details of the QContactOnlineAccount type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::FieldAccountUri, "AccountUri"); + +/*! + \variable QContactOnlineAccount::FieldServiceProvider + + The constant key for which the service provider value is stored in + details of the QContactOnlineAccount type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::FieldServiceProvider, "ServiceProvider"); + +/*! + \variable QContactOnlineAccount::FieldSubTypes + + The constant key for which the subtypes value is stored in details + of the QContactOnlineAccount type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::FieldSubTypes, "SubTypes"); + +/*! + \variable QContactOnlineAccount::SubTypeSip + + The constant attribute value which describes the online account as + supporting SIP. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::SubTypeSip, "Sip"); + +/*! + \variable QContactOnlineAccount::SubTypeSipVoip + + The constant attribute value which describes the online account as + supporting SIP-based VoIP. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::SubTypeSipVoip, "SipVoip"); + +/*! + \variable QContactOnlineAccount::SubTypeImpp + + The constant attribute value which describes the online account as + supporting IMPP. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::SubTypeImpp, "Impp"); + +/*! + \variable QContactOnlineAccount::SubTypeVideoShare + + The constant attribute value which describes the online account as + supporting VideoShare. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactOnlineAccount::SubTypeVideoShare, "VideoShare"); /*! \variable QContactOrganization::DefinitionName @@ -404,7 +640,7 @@ which identify the organization to which a contact belongs in a given context. */ -Q_DEFINE_LATIN1_LITERAL(QContactOrganization::DefinitionName, "Organization"); +Q_DEFINE_LATIN1_CONSTANT(QContactOrganization::DefinitionName, "Organization"); /*! \variable QContactDisplayLabel::DefinitionName @@ -412,7 +648,7 @@ The constant string which identifies the definition of details which contain a display label of a contact. */ -Q_DEFINE_LATIN1_LITERAL(QContactDisplayLabel::DefinitionName, "DisplayLabel"); +Q_DEFINE_LATIN1_CONSTANT(QContactDisplayLabel::DefinitionName, "DisplayLabel"); /*! @@ -421,7 +657,7 @@ The constant key for which the phone number value is stored in details of the QContactPhoneNumber type. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::FieldNumber, "PhoneNumber"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::FieldNumber, "PhoneNumber"); /*! \variable QContactPhoneNumber::FieldSubTypes @@ -429,7 +665,7 @@ The constant key for which the subtype values are stored in details of the QContactPhoneNumber type. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::FieldSubTypes, "SubTypes"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::FieldSubTypes, "SubTypes"); /*! \variable QContactEmailAddress::FieldEmailAddress @@ -437,7 +673,7 @@ The constant key for which the email address value is stored in details of the QContactEmailAddress type. */ -Q_DEFINE_LATIN1_LITERAL(QContactEmailAddress::FieldEmailAddress, "EmailAddress"); +Q_DEFINE_LATIN1_CONSTANT(QContactEmailAddress::FieldEmailAddress, "EmailAddress"); /*! \variable QContactFamily::FieldSpouse @@ -445,7 +681,7 @@ The constant key for which the spouse name value is stored in details of the QContactFamily type. */ -Q_DEFINE_LATIN1_LITERAL(QContactFamily::FieldSpouse, "Spouse"); +Q_DEFINE_LATIN1_CONSTANT(QContactFamily::FieldSpouse, "Spouse"); /*! \variable QContactFamily::FieldChildren @@ -453,7 +689,7 @@ The constant key for which the children names value is stored in details of the QContactFamily type. */ -Q_DEFINE_LATIN1_LITERAL(QContactFamily::FieldChildren, "Children"); +Q_DEFINE_LATIN1_CONSTANT(QContactFamily::FieldChildren, "Children"); /*! \variable QContactGuid::FieldGuid @@ -461,39 +697,64 @@ The constant key for which the globally unique identifier value is stored in details of the QContactGuid type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGuid::FieldGuid, "Guid"); +Q_DEFINE_LATIN1_CONSTANT(QContactGuid::FieldGuid, "Guid"); /*! \variable QContactSyncTarget::FieldSyncTarget The constant key for which the value of the target store for - synchronisation is stored in details of the QContactSyncTarget type. + synchronization is stored in details of the QContactSyncTarget type. */ -Q_DEFINE_LATIN1_LITERAL(QContactSyncTarget::FieldSyncTarget, "SyncTarget"); +Q_DEFINE_LATIN1_CONSTANT(QContactSyncTarget::FieldSyncTarget, "SyncTarget"); /*! - \variable QContactAvatar::FieldAvatar - - The constant key for which the path the avatar value is stored in + \variable QContactAvatar::FieldImageUrl + + The constant key for which the url of the avatar image value is stored in details of the QContactAvatar type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAvatar::FieldAvatar, "Avatar"); +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::FieldImageUrl, "ImageUrl"); + +/*! + \variable QContactAvatar::FieldVideoUrl + + The constant key for which the url of the avatar video value is stored in + details of the QContactAvatar type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::FieldVideoUrl, "VideoUrl"); /*! - \variable QContactAvatar::FieldAvatarPixmap - - The constant key for which the path the avatar value is stored in + \deprecated + \variable QContactAvatar::FieldAvatar + + The constant key for which the uri of the avatar value is stored in details of the QContactAvatar type. + + This field is deprecated and will be removed after the transition period has elapsed. */ -Q_DEFINE_LATIN1_LITERAL(QContactAvatar::FieldAvatarPixmap, "AvatarPixmap"); +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::FieldAvatar, "Avatar"); /*! + \deprecated + \variable QContactAvatar::FieldAvatarPixmap + + The constant key for which the pixmap of the avatar value is stored in + details of the QContactAvatar type. + + This field is deprecated and will be removed after the transition period has elapsed. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::FieldAvatarPixmap, "AvatarPixmap"); + +/*! + \deprecated \variable QContactAvatar::FieldSubType - The constant key for which the subtypes value is stored in details - of the QContactAvatar type. + The constant key for which the subtype value is stored in + details of the QContactAvatar type. + + This field is deprecated and will be removed after the transition period has elapsed. */ -Q_DEFINE_LATIN1_LITERAL(QContactAvatar::FieldSubType, "SubType"); +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::FieldSubType, "SubType"); /*! \variable QContactName::FieldPrefix @@ -501,7 +762,7 @@ The constant key for which the name prefix value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldPrefix, "Prefix"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::FieldPrefix, "Prefix"); /*! \variable QContactName::FieldFirstName @@ -509,7 +770,7 @@ The constant key for which the first name value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldFirstName, "FirstName"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::FieldFirstName, "FirstName"); /*! \variable QContactName::FieldMiddleName @@ -517,7 +778,7 @@ The constant key for which the middle name value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldMiddleName, "MiddleName"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::FieldMiddleName, "MiddleName"); /*! \variable QContactName::FieldLastName @@ -525,7 +786,7 @@ The constant key for which the last name value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldLastName, "LastName"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::FieldLastName, "LastName"); /*! \variable QContactName::FieldFirst @@ -533,7 +794,7 @@ The constant key for which the first name value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldFirst, "FirstName"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::FieldFirst, "FirstName"); /*! \variable QContactName::FieldMiddle @@ -541,7 +802,7 @@ The constant key for which the middle name value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldMiddle, "MiddleName"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::FieldMiddle, "MiddleName"); /*! \variable QContactName::FieldLast @@ -549,7 +810,7 @@ The constant key for which the last name value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldLast, "LastName"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::FieldLast, "LastName"); /*! \variable QContactName::FieldSuffix @@ -557,7 +818,7 @@ The constant key for which the name suffix value is stored in details of the QContactName type. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldSuffix, "Suffix"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::FieldSuffix, "Suffix"); /*! \variable QContactName::FieldCustomLabel @@ -565,7 +826,7 @@ The constant key for which the custom name label value is stored in details of the QContactName type, if supported. */ -Q_DEFINE_LATIN1_LITERAL(QContactName::FieldCustomLabel, "CustomLabel"); +Q_DEFINE_LATIN1_CONSTANT(QContactName::FieldCustomLabel, "CustomLabel"); /*! \variable QContactNickname::FieldNickname @@ -573,7 +834,7 @@ The constant key for which the nickname value is stored in details of the QContactNickname type. */ -Q_DEFINE_LATIN1_LITERAL(QContactNickname::FieldNickname, "Nickname"); +Q_DEFINE_LATIN1_CONSTANT(QContactNickname::FieldNickname, "Nickname"); /*! \variable QContactNote::FieldNote @@ -581,7 +842,7 @@ The constant key for which the note value is stored in details of the QContactNote type. */ -Q_DEFINE_LATIN1_LITERAL(QContactNote::FieldNote, "Note"); +Q_DEFINE_LATIN1_CONSTANT(QContactNote::FieldNote, "Note"); /*! \variable QContactAddress::FieldStreet @@ -589,7 +850,7 @@ The constant key for which the street value is stored in details of the QContactAddress type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::FieldStreet, "Street"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::FieldStreet, "Street"); /*! \variable QContactAddress::FieldLocality @@ -597,7 +858,7 @@ The constant key for which the locality value is stored in details of the QContactAddress type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::FieldLocality, "Locality"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::FieldLocality, "Locality"); /*! \variable QContactAddress::FieldRegion @@ -605,7 +866,7 @@ The constant key for which the region value is stored in details of the QContactAddress type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::FieldRegion, "Region"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::FieldRegion, "Region"); /*! \variable QContactAddress::FieldPostcode @@ -613,7 +874,7 @@ The constant key for which the postcode value is stored in details of the QContactAddress type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::FieldPostcode, "Postcode"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::FieldPostcode, "Postcode"); /*! \variable QContactAddress::FieldCountry @@ -621,7 +882,7 @@ The constant key for which the country value is stored in details of the QContactAddress type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::FieldCountry, "Country"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::FieldCountry, "Country"); /*! \variable QContactAddress::FieldPostOfficeBox @@ -629,7 +890,7 @@ The constant key for which the post office box value is stored in details of the QContactAddress type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::FieldPostOfficeBox, "PostOfficeBox"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::FieldPostOfficeBox, "PostOfficeBox"); /*! \variable QContactAddress::FieldSubTypes @@ -637,7 +898,7 @@ The constant key for which the subtypes value is stored in details of the QContactAddress type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::FieldSubTypes, "SubTypes"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::FieldSubTypes, "SubTypes"); /*! \variable QContactUrl::FieldUrl @@ -645,7 +906,7 @@ The constant key for which the url value is stored in details of the QContactUrl type. */ -Q_DEFINE_LATIN1_LITERAL(QContactUrl::FieldUrl, "Url"); +Q_DEFINE_LATIN1_CONSTANT(QContactUrl::FieldUrl, "Url"); /*! \variable QContactUrl::FieldSubType @@ -653,7 +914,7 @@ The constant key for which the subtypes value is stored in details of the QContactUrl type. */ -Q_DEFINE_LATIN1_LITERAL(QContactUrl::FieldSubType, "SubType"); +Q_DEFINE_LATIN1_CONSTANT(QContactUrl::FieldSubType, "SubType"); /*! \variable QContactBirthday::FieldBirthday @@ -661,7 +922,7 @@ The constant key for which the birthday date value is stored in details of the QContactBirthday type. */ -Q_DEFINE_LATIN1_LITERAL(QContactBirthday::FieldBirthday, "Birthday"); +Q_DEFINE_LATIN1_CONSTANT(QContactBirthday::FieldBirthday, "Birthday"); /*! \variable QContactAnniversary::FieldOriginalDate @@ -669,7 +930,7 @@ The constant key for which the anniversary original event date value is stored in details of the QContactAnniversary type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::FieldOriginalDate, "OriginalDate"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::FieldOriginalDate, "OriginalDate"); /*! \variable QContactAnniversary::FieldEvent @@ -677,7 +938,7 @@ The constant key for which the name of the event is stored in details of the QContactAnniversary type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::FieldEvent, "Event"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::FieldEvent, "Event"); /*! \variable QContactAnniversary::FieldCalendarId @@ -686,7 +947,7 @@ associated calendar entry is stored in details of the QContactAnniversary type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::FieldCalendarId, "CalendarId"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::FieldCalendarId, "CalendarId"); /*! \variable QContactAnniversary::FieldSubType @@ -694,7 +955,15 @@ The constant key for which the subtypes value is stored in details of the QContactAnniversary type. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::FieldSubType, "SubType"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::FieldSubType, "SubType"); + +/*! + \variable QContactDisplayLabel::FieldLabel + + The constant key for which the display label value is stored in + details of the QContactDisplayLabel type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactDisplayLabel::FieldLabel, "Label"); /*! \variable QContactGender::FieldGender @@ -702,108 +971,25 @@ The constant key for which the gender value is stored in details of the QContactGender type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGender::FieldGender, "Gender"); +Q_DEFINE_LATIN1_CONSTANT(QContactGender::FieldGender, "Gender"); /*! \variable QContactGender::GenderMale The value that identifies this contact as being male. */ -Q_DEFINE_LATIN1_LITERAL(QContactGender::GenderMale, "Male"); +Q_DEFINE_LATIN1_CONSTANT(QContactGender::GenderMale, "Male"); /*! \variable QContactGender::GenderFemale The value that identifies this contact as being female. */ -Q_DEFINE_LATIN1_LITERAL(QContactGender::GenderFemale, "Female"); +Q_DEFINE_LATIN1_CONSTANT(QContactGender::GenderFemale, "Female"); /*! \variable QContactGender::GenderUnspecified The value that identifies this contact as being of unspecified gender. */ -Q_DEFINE_LATIN1_LITERAL(QContactGender::GenderUnspecified, "Unspecified"); - -/*! - \variable QContactGeolocation::FieldLabel - \internal - 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 - \internal - 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 - \internal - 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 - \internal - 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 - \internal - 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 - \internal - 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 - \internal - 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 - \internal - 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 - \internal - The constant key for which the timestamp value is stored in details - of the QContactGeolocation type. - */ -Q_DEFINE_LATIN1_LITERAL(QContactGeolocation::FieldTimestamp, "Timestamp"); - - - - - - - - - - +Q_DEFINE_LATIN1_CONSTANT(QContactGender::GenderUnspecified, "Unspecified"); /*! \variable QContactGeoLocation::FieldLabel @@ -811,7 +997,7 @@ The constant key for which the location label value is stored in details of the QContactGeoLocation type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldLabel, "Label"); +Q_DEFINE_LATIN1_CONSTANT(QContactGeoLocation::FieldLabel, "Label"); /*! \variable QContactGeoLocation::FieldLatitude @@ -819,7 +1005,7 @@ The constant key for which the latitude value is stored in details of the QContactGeoLocation type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldLatitude, "Latitude"); +Q_DEFINE_LATIN1_CONSTANT(QContactGeoLocation::FieldLatitude, "Latitude"); /*! \variable QContactGeoLocation::FieldLongitude @@ -827,7 +1013,7 @@ The constant key for which the longitude value is stored in details of the QContactGeoLocation type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldLongitude, "Longitude"); +Q_DEFINE_LATIN1_CONSTANT(QContactGeoLocation::FieldLongitude, "Longitude"); /*! \variable QContactGeoLocation::FieldAccuracy @@ -835,7 +1021,7 @@ The constant key for which the location accuracy value is stored in details of the QContactGeoLocation type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldAccuracy, "Accuracy"); +Q_DEFINE_LATIN1_CONSTANT(QContactGeoLocation::FieldAccuracy, "Accuracy"); /*! \variable QContactGeoLocation::FieldAltitude @@ -843,7 +1029,7 @@ The constant key for which the altitude value is stored in details of the QContactGeoLocation type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldAltitude, "Altitude"); +Q_DEFINE_LATIN1_CONSTANT(QContactGeoLocation::FieldAltitude, "Altitude"); /*! @@ -852,7 +1038,7 @@ The constant key for which the altitude accuracy value is stored in details of the QContactGeoLocation type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldAltitudeAccuracy, "AltitudeAccuracy"); +Q_DEFINE_LATIN1_CONSTANT(QContactGeoLocation::FieldAltitudeAccuracy, "AltitudeAccuracy"); /*! \variable QContactGeoLocation::FieldHeading @@ -860,7 +1046,7 @@ The constant key for which the heading value is stored in details of the QContactGeoLocation type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldHeading, "Heading"); +Q_DEFINE_LATIN1_CONSTANT(QContactGeoLocation::FieldHeading, "Heading"); /*! \variable QContactGeoLocation::FieldSpeed @@ -868,7 +1054,15 @@ The constant key for which the speed value is stored in details of the QContactGeoLocation type. */ -Q_DEFINE_LATIN1_LITERAL(QContactGeoLocation::FieldSpeed, "Speed"); +Q_DEFINE_LATIN1_CONSTANT(QContactGeoLocation::FieldSpeed, "Speed"); + +/*! + \variable QContactTag::FieldTag + + The constant key for which the tag value is stored in details + of the QContactTag type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactTag::FieldTag, "Tag"); /*! \variable QContactGeoLocation::FieldTimestamp @@ -876,63 +1070,7 @@ 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 - - The constant key for which the remote account uri value is stored - in details of the QContactOnlineAccount type. - */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::FieldAccountUri, "AccountUri"); - -/*! - \variable QContactOnlineAccount::FieldServiceProvider - - The constant key for which the service provider value is stored in - details of the QContactOnlineAccount type. - */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::FieldServiceProvider, "ServiceProvider"); - -/*! - \variable QContactOnlineAccount::FieldSubTypes - - The constant key for which the subtypes value is stored in details - of the QContactOnlineAccount type. - */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::FieldSubTypes, "SubTypes"); - -/*! - \variable QContactOnlineAccount::SubTypeSip - - The constant attribute value which describes the online account as - supporting SIP. - */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::SubTypeSip, "Sip"); - -/*! - \variable QContactOnlineAccount::SubTypeSipVoip - - The constant attribute value which describes the online account as - supporting SIP-based VoIP. - */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::SubTypeSipVoip, "SipVoip"); - -/*! - \variable QContactOnlineAccount::SubTypeImpp - - The constant attribute value which describes the online account as - supporting IMPP. - */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::SubTypeImpp, "Impp"); - -/*! - \variable QContactOnlineAccount::SubTypeVideoShare - - The constant attribute value which describes the online account as - supporting VideoShare. - */ -Q_DEFINE_LATIN1_LITERAL(QContactOnlineAccount::SubTypeVideoShare, "VideoShare"); +Q_DEFINE_LATIN1_CONSTANT(QContactGeoLocation::FieldTimestamp, "Timestamp"); /*! \variable QContactOrganization::FieldName @@ -940,15 +1078,26 @@ The constant key for which the name value is stored in details of the QContactOrganization type. */ -Q_DEFINE_LATIN1_LITERAL(QContactOrganization::FieldName, "Name"); +Q_DEFINE_LATIN1_CONSTANT(QContactOrganization::FieldName, "Name"); /*! + \variable QContactOrganization::FieldLogoUrl + + The constant key for which the logo url is stored in details + of the QContactOrganization type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactOrganization::FieldLogoUrl, "LogoUrl"); + +/*! + \deprecated \variable QContactOrganization::FieldLogo The constant key for which the logo path value is stored in details of the QContactOrganization type. + + This field is deprecated and will be removed after the transition period has elapsed. */ -Q_DEFINE_LATIN1_LITERAL(QContactOrganization::FieldLogo, "Logo"); +Q_DEFINE_LATIN1_CONSTANT(QContactOrganization::FieldLogo, "Logo"); /*! \variable QContactOrganization::FieldDepartment @@ -956,7 +1105,7 @@ The constant key for which the organization's department value is stored in details of the QContactOrganization type. */ -Q_DEFINE_LATIN1_LITERAL(QContactOrganization::FieldDepartment, "Department"); +Q_DEFINE_LATIN1_CONSTANT(QContactOrganization::FieldDepartment, "Department"); /*! \variable QContactOrganization::FieldLocation @@ -965,7 +1114,7 @@ location of the contact's part of the organization) value is stored in details of the QContactOrganization type. */ -Q_DEFINE_LATIN1_LITERAL(QContactOrganization::FieldLocation, "Location"); +Q_DEFINE_LATIN1_CONSTANT(QContactOrganization::FieldLocation, "Location"); /*! \variable QContactOrganization::FieldRole @@ -973,7 +1122,7 @@ The constant key for which the contact's role within the organization is stored in details of the QContactOrganization type. */ -Q_DEFINE_LATIN1_LITERAL(QContactOrganization::FieldRole, "Role"); +Q_DEFINE_LATIN1_CONSTANT(QContactOrganization::FieldRole, "Role"); /*! \variable QContactOrganization::FieldTitle @@ -981,7 +1130,7 @@ The constant key for which the contact's title within the organization is stored in details of the QContactOrganization type. */ -Q_DEFINE_LATIN1_LITERAL(QContactOrganization::FieldTitle, "Title"); +Q_DEFINE_LATIN1_CONSTANT(QContactOrganization::FieldTitle, "Title"); /*! \variable QContactOrganization::FieldAssistantName @@ -989,16 +1138,39 @@ The constant key for which the contact's assistant name within the organization is stored in details of the QContactOrganization type. */ -Q_DEFINE_LATIN1_LITERAL(QContactOrganization::FieldAssistantName, "AssistantName"); - +Q_DEFINE_LATIN1_CONSTANT(QContactOrganization::FieldAssistantName, "AssistantName"); + +/*! + \variable QContactRingtone::FieldAudioRingtoneUrl + + The constant key for which the uri of the audio ringtone value is + stored in details of the QContactRingtone type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactRingtone::FieldAudioRingtoneUrl, "AudioRingtoneUrl"); /*! - \variable QContactDisplayLabel::FieldLabel - - The constant key for which the display label value is stored in - details of the QContactDisplayLabel type. + \variable QContactRingtone::FieldVideoRingtoneUrl + + The constant key for which the uri of the video ringtone value is + stored in details of the QContactRingtone type. */ -Q_DEFINE_LATIN1_LITERAL(QContactDisplayLabel::FieldLabel, "Label"); +Q_DEFINE_LATIN1_CONSTANT(QContactRingtone::FieldVideoRingtoneUrl, "VideoRingtoneUrl"); + +/*! + \variable QContactRingtone::FieldVibrationRingtoneUrl + + The constant key for which the uri of the vibration ringtone value is + stored in details of the QContactRingtone type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactRingtone::FieldVibrationRingtoneUrl, "VibrationRingtoneUrl"); + +/*! + \variable QContactThumbnail::FieldThumbnail + + The constant key for which the thumbnail image is stored in details + of the QContactThumbnail type. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactThumbnail::FieldThumbnail, "Thumbnail"); /*! \variable QContactTimestamp::FieldModificationTimestamp @@ -1007,7 +1179,7 @@ QContactTimestamp type which describes the last modification date and time of a contact. */ -Q_DEFINE_LATIN1_LITERAL(QContactTimestamp::FieldModificationTimestamp, "ModificationTimestamp"); +Q_DEFINE_LATIN1_CONSTANT(QContactTimestamp::FieldModificationTimestamp, "ModificationTimestamp"); /*! \variable QContactTimestamp::FieldCreationTimestamp @@ -1016,7 +1188,7 @@ QContactTimestamp type which describes the creation date and time of a contact. */ -Q_DEFINE_LATIN1_LITERAL(QContactTimestamp::FieldCreationTimestamp, "CreationTimestamp"); +Q_DEFINE_LATIN1_CONSTANT(QContactTimestamp::FieldCreationTimestamp, "CreationTimestamp"); /*! \variable QContactType::FieldType @@ -1024,7 +1196,7 @@ The constant key for the type value which is stored in details of the QContactType definition. */ -Q_DEFINE_LATIN1_LITERAL(QContactType::FieldType, "Type"); +Q_DEFINE_LATIN1_CONSTANT(QContactType::FieldType, "Type"); /*! @@ -1033,7 +1205,7 @@ The constant attribute value which describes the contact as being an ordinary contact. */ -Q_DEFINE_LATIN1_LITERAL(QContactType::TypeContact, "Contact"); +Q_DEFINE_LATIN1_CONSTANT(QContactType::TypeContact, "Contact"); /*! \variable QContactType::TypeGroup @@ -1041,7 +1213,7 @@ The constant attribute value which describes the contact as being a group. */ -Q_DEFINE_LATIN1_LITERAL(QContactType::TypeGroup, "Group"); +Q_DEFINE_LATIN1_CONSTANT(QContactType::TypeGroup, "Group"); /*! \variable QContactPhoneNumber::SubTypeLandline @@ -1049,7 +1221,7 @@ The constant attribute value which describes the phone number as identifying a landline phone. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeLandline, "Landline"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeLandline, "Landline"); /*! \variable QContactPhoneNumber::SubTypeMobile @@ -1057,15 +1229,26 @@ The constant attribute value which describes the phone number as identifying a mobile phone. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeMobile, "Mobile"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeMobile, "Mobile"); /*! \variable QContactPhoneNumber::SubTypeFacsimile + \deprecated The constant attribute value which describes the phone number as - identifying a facsimile machine. + identifying a fax machine. + + This has been deprecated - use QContactPhoneNumebr::SubTypeFax instead. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeFacsimile, "Facsimile"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeFacsimile, "Fax"); + +/*! + \variable QContactPhoneNumber::SubTypeFax + + The constant attribute value which describes the phone number as + identifying a fax machine. + */ +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeFax, "Fax"); /*! \variable QContactPhoneNumber::SubTypePager @@ -1073,7 +1256,7 @@ The constant attribute value which describes the phone number as identifying a pager device. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypePager, "Pager"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypePager, "Pager"); /*! \variable QContactPhoneNumber::SubTypeCar @@ -1081,7 +1264,7 @@ The constant attribute value which describes the phone number as identifying a car phone. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeCar, "Car"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeCar, "Car"); /*! \variable QContactPhoneNumber::SubTypeBulletinBoardSystem @@ -1089,7 +1272,7 @@ The constant attribute value which describes the phone number as identifying a bulletin board system. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeBulletinBoardSystem, "BulletinBoardSystem"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeBulletinBoardSystem, "BulletinBoardSystem"); /*! \variable QContactPhoneNumber::SubTypeVoice @@ -1097,7 +1280,7 @@ The constant attribute value which describes the phone number as supporting voice transmission. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeVoice, "Voice"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeVoice, "Voice"); /*! \variable QContactPhoneNumber::SubTypeModem @@ -1105,7 +1288,7 @@ The constant attribute value which describes the phone number as supporting digital data transfer. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeModem, "Modem"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeModem, "Modem"); /*! \variable QContactPhoneNumber::SubTypeVideo @@ -1113,7 +1296,7 @@ The constant attribute value which describes the phone number as supporting video transmission. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeVideo, "Video"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeVideo, "Video"); /*! \variable QContactPhoneNumber::SubTypeMessagingCapable @@ -1121,7 +1304,7 @@ The constant attribute value which describes the phone number as supporting messaging services. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeMessagingCapable, "MessagingCapable"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeMessagingCapable, "MessagingCapable"); /*! \variable QContactPhoneNumber::SubTypeAssistant @@ -1129,7 +1312,7 @@ The constant attribute value which describes the phone number as an assistant phone number. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeAssistant, "Assistant"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeAssistant, "Assistant"); /*! \variable QContactPhoneNumber::SubTypeDtmfMenu @@ -1137,7 +1320,7 @@ The constant attribute value which describes the phone number as supporting DTMF-controlled electronic menu navigation. */ -Q_DEFINE_LATIN1_LITERAL(QContactPhoneNumber::SubTypeDtmfMenu, "DtmfMenu"); +Q_DEFINE_LATIN1_CONSTANT(QContactPhoneNumber::SubTypeDtmfMenu, "DtmfMenu"); /*! \variable QContactAddress::SubTypeParcel @@ -1145,7 +1328,7 @@ The constant attribute value which describes the address as being an address for parcel delivery. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::SubTypeParcel, "Parcel"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::SubTypeParcel, "Parcel"); /*! \variable QContactAddress::SubTypePostal @@ -1153,7 +1336,7 @@ The constant attribute value which describes the address as being an address for postal delivery. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::SubTypePostal, "Postal"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::SubTypePostal, "Postal"); /*! \variable QContactAddress::SubTypeDomestic @@ -1161,7 +1344,7 @@ The constant attribute value which describes the address as being a domestic address. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::SubTypeDomestic, "Domestic"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::SubTypeDomestic, "Domestic"); /*! \variable QContactAddress::SubTypeInternational @@ -1169,48 +1352,63 @@ The constant attribute value which describes the address as being an international address. */ -Q_DEFINE_LATIN1_LITERAL(QContactAddress::SubTypeInternational, "International"); +Q_DEFINE_LATIN1_CONSTANT(QContactAddress::SubTypeInternational, "International"); /*! + \deprecated \variable QContactAvatar::SubTypeImage The constant attribute value which describes the avatar as being an image. + + This value is deprecated and should not be used, and will be removed after the transition period has elapsed. */ -Q_DEFINE_LATIN1_LITERAL(QContactAvatar::SubTypeImage, "Image"); +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::SubTypeImage, "Image"); /*! + \deprecated \variable QContactAvatar::SubTypeVideo The constant attribute value which describes the avatar as being a video. + + This value is deprecated and should not be used, and will be removed after the transition period has elapsed. */ -Q_DEFINE_LATIN1_LITERAL(QContactAvatar::SubTypeVideo, "Video"); +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::SubTypeVideo, "Video"); /*! + \deprecated \variable QContactAvatar::SubTypeAudioRingtone The constant attribute value which describes the avatar as being an audio ringtone. + + This value is deprecated and should not be used, and will be removed after the transition period has elapsed. */ -Q_DEFINE_LATIN1_LITERAL(QContactAvatar::SubTypeAudioRingtone, "AudioRingtone"); +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::SubTypeAudioRingtone, "AudioRingtone"); /*! + \deprecated \variable QContactAvatar::SubTypeVideoRingtone The constant attribute value which describes the avatar as being a video ringtone. + + This value is deprecated and should not be used, and will be removed after the transition period has elapsed. */ -Q_DEFINE_LATIN1_LITERAL(QContactAvatar::SubTypeVideoRingtone, "VideoRingtone"); +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::SubTypeVideoRingtone, "VideoRingtone"); /*! + \deprecated \variable QContactAvatar::SubTypeTexturedMesh The constant attribute value which describes the avatar as being a textured, 3D mesh. + + This value is deprecated and should not be used, and will be removed after the transition period has elapsed. */ -Q_DEFINE_LATIN1_LITERAL(QContactAvatar::SubTypeTexturedMesh, "TexturedMesh"); +Q_DEFINE_LATIN1_CONSTANT(QContactAvatar::SubTypeTexturedMesh, "TexturedMesh"); /*! \variable QContactUrl::SubTypeHomePage @@ -1218,7 +1416,7 @@ The constant attribute value which describes the url as being the homepage of the contact. */ -Q_DEFINE_LATIN1_LITERAL(QContactUrl::SubTypeHomePage, "HomePage"); +Q_DEFINE_LATIN1_CONSTANT(QContactUrl::SubTypeHomePage, "HomePage"); /*! \variable QContactUrl::SubTypeFavourite @@ -1226,7 +1424,7 @@ The constant attribute value which describes the url as being a favourite page of the contact. */ -Q_DEFINE_LATIN1_LITERAL(QContactUrl::SubTypeFavourite, "Favourite"); +Q_DEFINE_LATIN1_CONSTANT(QContactUrl::SubTypeFavourite, "Favourite"); /*! \variable QContactAnniversary::SubTypeWedding @@ -1234,7 +1432,7 @@ The constant attribute value which describes the anniversary as being a wedding anniversary. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::SubTypeWedding, "Wedding"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::SubTypeWedding, "Wedding"); /*! \variable QContactAnniversary::SubTypeEngagement @@ -1242,7 +1440,7 @@ The constant attribute value which describes the anniversary as being an engagement anniversary. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::SubTypeEngagement, "Engagement"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::SubTypeEngagement, "Engagement"); /*! \variable QContactAnniversary::SubTypeHouse @@ -1250,7 +1448,7 @@ The constant attribute value which describes the anniversary as being an anniversary of ownership of a particular residence. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::SubTypeHouse, "House"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::SubTypeHouse, "House"); /*! \variable QContactAnniversary::SubTypeEmployment @@ -1258,7 +1456,7 @@ The constant attribute value which describes the anniversary as being an anniversary of employment at a particular company. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::SubTypeEmployment, "Employment"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::SubTypeEmployment, "Employment"); /*! \variable QContactAnniversary::SubTypeMemorial @@ -1266,21 +1464,21 @@ The constant attribute value which describes the anniversary as being an anniversary of an event of sentimental significance. */ -Q_DEFINE_LATIN1_LITERAL(QContactAnniversary::SubTypeMemorial, "Memorial"); +Q_DEFINE_LATIN1_CONSTANT(QContactAnniversary::SubTypeMemorial, "Memorial"); /*! \fn QContactSyncTarget::syncTarget() const Returns the identifier of the backend store to which the contact - containing this detail should be synchronised. + containing this detail should be synchronized. */ /*! \fn QContactSyncTarget::setSyncTarget(const QString& syncTarget) Sets the identifier of the backend store to which the contact - containing this detail should be synchronised to \a syncTarget. + containing this detail should be synchronized to \a syncTarget. */ /*! @@ -1315,12 +1513,12 @@ /*! \fn QContactAnniversary::originalDate() const - Returns the original date of occurrance of the event stored in this detail. + Returns the original date of occurrence of the event stored in this detail. */ /*! \fn QContactAnniversary::setOriginalDate(const QDate& date) - Sets the original date of occurrance of the event stored in this detail to \a date. + Sets the original date of occurrence of the event stored in this detail to \a date. */ /*! @@ -1354,37 +1552,101 @@ */ /*! - \fn QContactAvatar::avatar() const - Returns the location of an avatar file associated with the contact. + \fn QContactAvatar::imageUrl() const + Returns the url of an avatar image associated with the contact + */ + +/*! + \fn QContactAvatar::setImageUrl(const QUrl& imageUrl) + Sets the url of an avatar image associated with the contact to \a imageUrl + */ + +/*! + \fn QContactAvatar::videoUrl() const + Returns the url of an avatar video associated with the contact + */ + +/*! + \fn QContactAvatar::setVideoUrl(const QUrl& videoUrl) + Sets the url of an avatar video associated with the contact to \a videoUrl */ /*! - \fn QContactAvatar::setAvatar(const QString& avatar) - Sets the location of an avatar file associated with the contact to \a avatar. + \deprecated + \fn QContactAvatar::avatar() const + Returns the location of an avatar file associated with the contact. + This function is deprecated and will be removed after the transition period has elapsed. */ +QString QContactAvatar::avatar() const +{ + qWarning("QContactAvatar::avatar() This function is deprecated and will be removed after the transition period has elapsed! Use imageUri() or QContactThumbnail instead!"); + return QString(); +} /*! + \deprecated + \fn QContactAvatar::setAvatar(const QString& avatar) + Sets the location of an avatar file associated with the contact to \a avatar. + This function is deprecated and will be removed after the transition period has elapsed. + */ +bool QContactAvatar::setAvatar(const QString& avatar) +{ + Q_UNUSED(avatar); + qWarning("QContactAvatar::setAvatar() This function is deprecated and will be removed after the transition period has elapsed! Use setImageUri() or QContactThumbnail instead!"); + return false; +} + +/*! + \deprecated \fn QContactAvatar::pixmap() const Returns a thumbnail for a picture associated with this contact. + This function is deprecated and will be removed after the transition period has elapsed. */ +QPixmap QContactAvatar::pixmap() const +{ + qWarning("QContactAvatar::pixmap() This function is deprecated and will be removed after the transition period has elapsed! Use imageUri() or QContactThumbnail instead!"); + return QPixmap(); +} /*! + \deprecated \fn QContactAvatar::setPixmap(const QPixmap& pixmap) Sets the thumbnail of a picture avatar associated with the contact to \a pixmap. If \a pixmap is empty, the thumbnail pixmap will be removed. Returns true if the pixmap could be set, and false otherwise. + This function is deprecated and will be removed after the transition period has elapsed. */ +bool QContactAvatar::setPixmap(const QPixmap& pixmap) +{ + Q_UNUSED(pixmap); + qWarning("QContactAvatar::setPixmap() This function is deprecated and will be removed after the transition period has elapsed! Use setImageUri() or QContactThumbnail instead!"); + return false; +} /*! + \deprecated + \fn QContactAvatar::subType() const + Returns the subtype that this detail implements, if defined. + This function is deprecated and will be removed after the transition period has elapsed. + */ +QString QContactAvatar::subType() const +{ + qWarning("QContactAvatar::subType() This function is deprecated and will be removed after the transition period has elapsed!"); + return QString(); +} + +/*! + \deprecated \fn QContactAvatar::setSubType(const QString& subType) Sets the subtype which this detail implements to be the given \a subType. + This function is deprecated and will be removed after the transition period has elapsed. */ - -/*! - \fn QContactAvatar::subType() const - Returns the subtype that this detail implements, if defined. - */ +void QContactAvatar::setSubType(const QString& subtype) +{ + Q_UNUSED(subtype); + qWarning("QContactAvatar::avatar() This function is deprecated and will be removed after the transition period has elapsed!"); +} /*! \fn QContactAddress::postOfficeBox() const @@ -1532,237 +1794,6 @@ it to "Unspecified". */ - - - - - - -/*! - \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. @@ -1943,70 +1974,6 @@ */ /*! - \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 Returns the suffix segment of the name stored in this detail. */ @@ -2047,6 +2014,26 @@ */ /*! + \fn QContactTag::setTag(const QString& tag) + Sets the tag associated with a contact which is stored in this detail to \a tag. + */ + +/*! + \fn QContactTag::tag() const + Returns the tag associated with a contact which is stored in this detail. + */ + +/*! + \fn QContactThumbnail::thumbnail() const + Returns the thumbnail image of the contact + */ + +/*! + \fn QContactThumbnail::setThumbnail(const QImage& thumbnail) + Sets the thumbnail image of the contact to be \a thumbnail + */ + +/*! \fn QContactTimestamp::created() const Returns the creation timestamp saved in this detail. */ @@ -2125,50 +2112,99 @@ Returns the list of subtypes that this detail implements. */ + /*! + \deprecated \fn QContactOnlineAccount::setNickname(const QString& nickname) Sets the last-known nickname used by the contact during communications via the online account about which this detail stores presence information to \a nickname. + + This function is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::setNickname() instead! */ +void QContactOnlineAccount::setNickname(const QString& nickname) +{ + setValue(FieldNickname, nickname); +} /*! + \deprecated \fn QContactOnlineAccount::nickname() const Returns the last-known nickname used by the contact during communications via the online account. + + This function is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::nickname() instead! */ +QString QContactOnlineAccount::nickname() const +{ + return value(FieldNickname); +} /*! + \deprecated \fn QContactOnlineAccount::setPresence(const QString& presence) Sets the presence of the online account according to the presence information provider to \a presence. + + This function is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::setPresence() instead! */ +void QContactOnlineAccount::setPresence(const QString& presence) +{ + setValue(FieldPresence, presence); +} /*! + \deprecated \fn QContactOnlineAccount::presence() const Returns the presence of the online account according to the presence provider. + + This function is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::presence() instead! */ +QString QContactOnlineAccount::presence() const +{ + return value(FieldPresence); +} /*! + \deprecated \fn QContactOnlineAccount::setStatusMessage(const QString& statusMessage) Sets the last-known status message of the contact which was communicated via the online account about which this detail stores presence information to \a statusMessage. + + This function is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::setStatusMessage() instead! */ +void QContactOnlineAccount::setStatusMessage(const QString& statusMessage) +{ + setValue(FieldStatusMessage, statusMessage); +} /*! + \deprecated \fn QContactOnlineAccount::statusMessage() const Returns the last-known status message of the contact which was communicated via the online account about which this detail stores presence information. + + This function is deprecated and will be removed after the transition period has elapsed. + Use QContactPresence::statusMessage() instead! */ +QString QContactOnlineAccount::statusMessage() const +{ + return value(FieldStatusMessage); +} /*! \fn QContactOnlineAccount::setCapabilities(const QStringList& capabilities) @@ -2197,11 +2233,23 @@ */ /*! + \fn QContactOrganization::setLogoUrl(const QUrl& logo) + Sets the url of the logo of the organization stored in this detail to \a logo. + */ + +/*! + \fn QContactOrganization::logoUrl() const + Returns the url of the logo of the organization stored in this detail. + */ + +/*! + \deprecated \fn QContactOrganization::setLogo(const QString& logo) Sets the logo of the organization stored in this detail to \a logo. */ /*! + \deprecated \fn QContactOrganization::logo() const Returns the logo of the organization stored in this detail. */ @@ -2269,6 +2317,230 @@ this organization. */ +/*! + \fn QContactRingtone::audioRingtoneUrl() const + + Returns the uri of the audio ringtone stored in the ringtone detail. + */ + +/*! + \fn QContactRingtone::setAudioRingtoneUrl(const QUrl& audioRingtoneUrl) + + Sets the uri of the audio ringtone stored in the ringtone detail + to \a audioRingtoneUrl. + */ + +/*! + \fn QContactRingtone::videoRingtoneUrl() const + + Returns the uri of the video ringtone stored in the ringtone detail. + */ + +/*! + \fn QContactRingtone::setVideoRingtoneUrl(const QUrl& videoRingtoneUrl) + + Sets the uri of the video ringtone stored in the ringtone detail + to \a videoRingtoneUrl. + */ + +/*! + \fn QContactRingtone::vibrationRingtoneUrl() const + + Returns the uri of the vibration ringtone stored in the ringtone detail. + */ + +/*! + \fn QContactRingtone::setVibrationRingtoneUrl(const QUrl& vibrationRingtoneUrl) + + Sets the uri of the vibration ringtone stored in the ringtone detail + to \a vibrationRingtoneUrl. + */ + +/*! + \fn QContactPresence::setTimestamp(const QDateTime& updateTimestamp) + + Sets the update timestamp of the presence detail to be + \a updateTimestamp. + */ + +/*! + \fn QContactPresence::timestamp() const + + Returns the timestamp at which the data in the presence detail was valid. + */ + +/*! + \fn QContactPresence::setNickname(const QString& nickname) + + Sets the last-known nickname used by the contact during + communications via the online account about which this detail + stores presence information to \a nickname. + */ + +/*! + \fn QContactPresence::nickname() const + + Returns the last-known nickname used by the contact during + communications via the online account. + */ + +/*! + \enum QContactPresence::PresenceState + + This enum defines the possible presence states supported by the default schema. + + \value PresenceUnknown Signifies that the presence state of the contact is not currently known + \value PresenceAvailable Signifies that the contact is available + \value PresenceHidden Signifies that the contact is hidden + \value PresenceBusy Signifies that the contact is busy + \value PresenceAway Signifies that the contact is away + \value PresenceExtendedAway Signifies that the contact is away for an extended period of time + \value PresenceOffline Signifies that the contact is offline + */ + +/*! + \fn QContactPresence::setPresenceState(QContactPresence::PresenceState presenceState) + + Sets the presence state of the online account according to the presence + information provider to the given \a presenceState. + */ + +/*! + \fn QContactPresence::presenceState() const + + Returns the presence state of the online account according to the + presence provider. + */ + +/*! + \fn QContactPresence::setPresenceStateText(const QString& presenceStateText) + + Sets the text corresponding to the presence state to \a presenceStateText. + This function is generally called by presence providers to allow custom + naming of states, or to allow finer grained state reporting than is + provided by the presence state API. + */ + +/*! + \fn QContactPresence::presenceStateText() const + + Returns the text corresponding to the current presence state. + */ + +/*! + \fn QContactPresence::setCustomMessage(const QString& customMessage) + + Sets the custom status message from the contact for the online account + about which this detail stores presence information, to \a customMessage. + */ + +/*! + \fn QContactPresence::customMessage() const + + Returns the custom status message from the contact for the online account + about which this detail stores presence information. + */ + +/*! + \fn QContactPresence::setPresenceStateImageUrl(const QUrl& presenceStateImageUrl) + + Sets the last-known status image url of the contact for the online account + about which this detail stores presence information, to \a presenceStateImageUrl. + */ + +/*! + \fn QContactPresence::presenceStateImageUrl() const + + Returns the last-known status image url of the contact for the online account + about which this detail stores presence information. + */ + +/*! + \fn QContactGlobalPresence::setTimestamp(const QDateTime& updateTimestamp) + + Sets the update timestamp of the global presence detail to be + \a updateTimestamp. + */ + +/*! + \fn QContactGlobalPresence::timestamp() const + + Returns the timestamp at which the data in the global presence detail was valid. + */ + +/*! + \fn QContactGlobalPresence::setNickname(const QString& nickname) + + Sets the last-known nickname used by the contact during + communications via any online account about which this detail + aggregates presence information to \a nickname. + */ + +/*! + \fn QContactGlobalPresence::nickname() const + + Returns the last-known nickname used by the contact during + communications via any online account about which this detail + aggregates presence information. + */ + +/*! + \fn QContactGlobalPresence::setPresenceState(QContactPresence::PresenceState presenceState) + + Sets the presence state of this aggregate detail according to the presence + information available from the presence providers which this detail aggregates + to the given \a presenceState. + */ + +/*! + \fn QContactGlobalPresence::presenceState() const + + Returns the aggregate presence state of any online accounts about which this detail + aggregates presence information. + */ + +/*! + \fn QContactGlobalPresence::setPresenceStateText(const QString& presenceStateText) + + Sets the text corresponding to the presence state to \a presenceStateText. + This function is generally called by presence providers to allow custom + naming of states, or to allow finer grained state reporting than is + provided by the presence state API. + */ + +/*! + \fn QContactGlobalPresence::presenceStateText() const + + Returns the text corresponding to the current presence state. + */ + +/*! + \fn QContactGlobalPresence::setCustomMessage(const QString& customMessage) + + Sets the custom status message from the contact for the aggregate presence + detail, to \a customMessage. + */ + +/*! + \fn QContactGlobalPresence::customMessage() const + + Returns the custom status message from the contact for the aggregate presence + detail. + */ + +/*! + \fn QContactGlobalPresence::setPresenceStateImageUrl(const QUrl& presenceStateImageUrl) + + Sets the last-known status image url of the contact to \a presenceStateImageUrl. + */ + +/*! + \fn QContactGlobalPresence::presenceStateImageUrl() const + + Returns the last-known status image url of the contact. + */ + + /* Convenience filters */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactdetails.h --- a/qtcontactsmobility/src/contacts/details/qcontactdetails.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactdetails.h Mon May 03 12:24:20 2010 +0300 @@ -54,6 +54,7 @@ #include "qcontactfamily.h" #include "qcontactgender.h" #include "qcontactgeolocation.h" +#include "qcontactglobalpresence.h" #include "qcontactguid.h" #include "qcontactname.h" #include "qcontactnickname.h" @@ -61,7 +62,11 @@ #include "qcontactonlineaccount.h" #include "qcontactorganization.h" #include "qcontactphonenumber.h" +#include "qcontactpresence.h" +#include "qcontactringtone.h" #include "qcontactsynctarget.h" +#include "qcontacttag.h" +#include "qcontactthumbnail.h" #include "qcontacttimestamp.h" #include "qcontacttype.h" #include "qcontacturl.h" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactdisplaylabel.h --- a/qtcontactsmobility/src/contacts/details/qcontactdisplaylabel.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactdisplaylabel.h Mon May 03 12:24:20 2010 +0300 @@ -56,11 +56,11 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldLabel; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldLabel; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactDisplayLabel, "DisplayLabel") - Q_DECLARE_LATIN1_LITERAL(FieldLabel, "Label"); + Q_DECLARE_LATIN1_CONSTANT(FieldLabel, "Label"); #endif QString label() const {return value(FieldLabel);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactemailaddress.h --- a/qtcontactsmobility/src/contacts/details/qcontactemailaddress.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactemailaddress.h Mon May 03 12:24:20 2010 +0300 @@ -56,11 +56,11 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldEmailAddress; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldEmailAddress; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactEmailAddress, "EmailAddress") - Q_DECLARE_LATIN1_LITERAL(FieldEmailAddress, "EmailAddress"); + Q_DECLARE_LATIN1_CONSTANT(FieldEmailAddress, "EmailAddress"); #endif void setEmailAddress(const QString& emailAddress) {setValue(FieldEmailAddress, emailAddress);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactfamily.h --- a/qtcontactsmobility/src/contacts/details/qcontactfamily.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactfamily.h Mon May 03 12:24:20 2010 +0300 @@ -56,13 +56,13 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldSpouse; - const char* FieldChildren; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldSpouse; + static const QLatin1Constant FieldChildren; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactFamily, "Family") - Q_DECLARE_LATIN1_LITERAL(FieldSpouse, "Spouse"); - Q_DECLARE_LATIN1_LITERAL(FieldChildren, "Children"); + Q_DECLARE_LATIN1_CONSTANT(FieldSpouse, "Spouse"); + Q_DECLARE_LATIN1_CONSTANT(FieldChildren, "Children"); #endif void setSpouse(const QString& spouseName) {setValue(FieldSpouse, spouseName);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactgender.h --- a/qtcontactsmobility/src/contacts/details/qcontactgender.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactgender.h Mon May 03 12:24:20 2010 +0300 @@ -55,17 +55,17 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldGender; - const char* GenderMale; - const char* GenderFemale; - const char* GenderUnspecified; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldGender; + static const QLatin1Constant GenderMale; + static const QLatin1Constant GenderFemale; + static const QLatin1Constant GenderUnspecified; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactGender, "Gender") - Q_DECLARE_LATIN1_LITERAL(FieldGender, "Gender"); - Q_DECLARE_LATIN1_LITERAL(GenderMale, "Male"); - Q_DECLARE_LATIN1_LITERAL(GenderFemale, "Female"); - Q_DECLARE_LATIN1_LITERAL(GenderUnspecified, "Unspecified"); + Q_DECLARE_LATIN1_CONSTANT(FieldGender, "Gender"); + Q_DECLARE_LATIN1_CONSTANT(GenderMale, "Male"); + Q_DECLARE_LATIN1_CONSTANT(GenderFemale, "Female"); + Q_DECLARE_LATIN1_CONSTANT(GenderUnspecified, "Unspecified"); #endif void setGender(const QString& gender) {setValue(FieldGender, gender);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactgeolocation.h --- a/qtcontactsmobility/src/contacts/details/qcontactgeolocation.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactgeolocation.h Mon May 03 12:24:20 2010 +0300 @@ -57,27 +57,27 @@ { 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; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldLabel; + static const QLatin1Constant FieldLatitude; + static const QLatin1Constant FieldLongitude; + static const QLatin1Constant FieldAccuracy; + static const QLatin1Constant FieldAltitude; + static const QLatin1Constant FieldAltitudeAccuracy; + static const QLatin1Constant FieldHeading; + static const QLatin1Constant FieldSpeed; + static const QLatin1Constant FieldTimestamp; #else 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"); - 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"); + Q_DECLARE_LATIN1_CONSTANT(FieldLabel, "Label"); + Q_DECLARE_LATIN1_CONSTANT(FieldLatitude, "Latitude"); + Q_DECLARE_LATIN1_CONSTANT(FieldLongitude, "Longitude"); + Q_DECLARE_LATIN1_CONSTANT(FieldAccuracy, "Accuracy"); + Q_DECLARE_LATIN1_CONSTANT(FieldAltitude, "Altitude"); + Q_DECLARE_LATIN1_CONSTANT(FieldAltitudeAccuracy, "AltitudeAccuracy"); + Q_DECLARE_LATIN1_CONSTANT(FieldHeading, "Heading"); + Q_DECLARE_LATIN1_CONSTANT(FieldSpeed, "Speed"); + Q_DECLARE_LATIN1_CONSTANT(FieldTimestamp, "Timestamp"); #endif void setLabel(const QString& label) {setValue(FieldLabel, label);} @@ -100,54 +100,6 @@ 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactglobalpresence.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/details/qcontactglobalpresence.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** 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 QCONTACTGLOBALPRESENCE_H +#define QCONTACTGLOBALPRESENCE_H + +#include +#include + +#include "qtcontactsglobal.h" +#include "qcontactdetail.h" +#include "qcontact.h" +#include "qcontactpresence.h" + +QTM_BEGIN_NAMESPACE + +/* Leaf class */ +class Q_CONTACTS_EXPORT QContactGlobalPresence : public QContactDetail +{ +public: +#ifdef Q_QDOC + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldTimestamp; + static const QLatin1Constant FieldNickname; + static const QLatin1Constant FieldPresenceState; + static const QLatin1Constant FieldPresenceStateText; + static const QLatin1Constant FieldPresenceStateImageUrl; + static const QLatin1Constant FieldCustomMessage; +#else + Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactGlobalPresence, "GlobalPresence") + Q_DECLARE_LATIN1_CONSTANT(FieldTimestamp, "Timestamp"); + Q_DECLARE_LATIN1_CONSTANT(FieldNickname, "Nickname"); + Q_DECLARE_LATIN1_CONSTANT(FieldPresenceState, "PresenceState"); + Q_DECLARE_LATIN1_CONSTANT(FieldPresenceStateText, "PresenceStateText"); + Q_DECLARE_LATIN1_CONSTANT(FieldPresenceStateImageUrl, "PresenceStateImageUrl"); + Q_DECLARE_LATIN1_CONSTANT(FieldCustomMessage, "CustomMessage"); +#endif + + void setTimestamp(const QDateTime& timestamp) {setValue(FieldTimestamp, timestamp);} + QDateTime timestamp() const {return value(FieldTimestamp);} + void setNickname(const QString& nickname) {setValue(FieldNickname, nickname);} + QString nickname() const {return value(FieldNickname);} + void setPresenceState(QContactPresence::PresenceState presenceState) {setValue(FieldPresenceState, static_cast(presenceState));} + QContactPresence::PresenceState presenceState() const {return static_cast(value(FieldPresenceState));} + void setPresenceStateText(const QString& presenceStateText) {setValue(FieldPresenceStateText, presenceStateText);} + QString presenceStateText() const {return value(FieldPresenceStateText);} + void setPresenceStateImageUrl(const QUrl& presenceStateImageUrl) {setValue(FieldPresenceStateImageUrl, presenceStateImageUrl);} + QUrl presenceStateImageUrl() const {return value(FieldPresenceStateImageUrl);} + void setCustomMessage(const QString& customMessage) {setValue(FieldCustomMessage, customMessage);} + QString customMessage() const {return value(FieldCustomMessage);} +}; + +QTM_END_NAMESPACE + +#endif + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactguid.h --- a/qtcontactsmobility/src/contacts/details/qcontactguid.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactguid.h Mon May 03 12:24:20 2010 +0300 @@ -56,11 +56,11 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldGuid; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldGuid; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactGuid, "Guid") - Q_DECLARE_LATIN1_LITERAL(FieldGuid, "Guid"); + Q_DECLARE_LATIN1_CONSTANT(FieldGuid, "Guid"); #endif void setGuid(const QString& guid) {setValue(FieldGuid, guid);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactname.h --- a/qtcontactsmobility/src/contacts/details/qcontactname.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactname.h Mon May 03 12:24:20 2010 +0300 @@ -55,27 +55,27 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldPrefix; - 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; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldPrefix; + static const QLatin1Constant FieldFirst; // deprecated + static const QLatin1Constant FieldMiddle;// deprecated + static const QLatin1Constant FieldLast; // deprecated + static const QLatin1Constant FieldFirstName; + static const QLatin1Constant FieldMiddleName; + static const QLatin1Constant FieldLastName; + static const QLatin1Constant FieldSuffix; + static const QLatin1Constant FieldCustomLabel; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactName, "Name") - Q_DECLARE_LATIN1_LITERAL(FieldPrefix, "Prefix"); - 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"); + Q_DECLARE_LATIN1_CONSTANT(FieldPrefix, "Prefix"); + Q_DECLARE_LATIN1_CONSTANT(FieldFirst, "FirstName"); // deprecated + Q_DECLARE_LATIN1_CONSTANT(FieldMiddle, "MiddleName");// deprecated + Q_DECLARE_LATIN1_CONSTANT(FieldLast, "LastName"); // deprecated + Q_DECLARE_LATIN1_CONSTANT(FieldFirstName, "FirstName"); + Q_DECLARE_LATIN1_CONSTANT(FieldMiddleName, "MiddleName"); + Q_DECLARE_LATIN1_CONSTANT(FieldLastName, "LastName"); + Q_DECLARE_LATIN1_CONSTANT(FieldSuffix, "Suffix"); + Q_DECLARE_LATIN1_CONSTANT(FieldCustomLabel, "CustomLabel"); #endif QString prefix() const {return value(FieldPrefix);} @@ -92,14 +92,6 @@ 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); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactnickname.h --- a/qtcontactsmobility/src/contacts/details/qcontactnickname.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactnickname.h Mon May 03 12:24:20 2010 +0300 @@ -55,11 +55,11 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldNickname; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldNickname; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactNickname, "Nickname") - Q_DECLARE_LATIN1_LITERAL(FieldNickname, "Nickname"); + Q_DECLARE_LATIN1_CONSTANT(FieldNickname, "Nickname"); #endif void setNickname(const QString& nickname) {setValue(FieldNickname, nickname);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactnote.h --- a/qtcontactsmobility/src/contacts/details/qcontactnote.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactnote.h Mon May 03 12:24:20 2010 +0300 @@ -55,11 +55,11 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldNote; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldNote; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactNote, "Note") - Q_DECLARE_LATIN1_LITERAL(FieldNote, "Note"); + Q_DECLARE_LATIN1_CONSTANT(FieldNote, "Note"); #endif void setNote(const QString& note) {setValue(FieldNote, note);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactonlineaccount.h --- a/qtcontactsmobility/src/contacts/details/qcontactonlineaccount.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactonlineaccount.h Mon May 03 12:24:20 2010 +0300 @@ -56,63 +56,71 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldAccountUri; - const char* FieldServiceProvider; - const char* FieldSubTypes; - const char* FieldNickname; - const char* FieldPresence; - const char* FieldStatusMessage; - const char* FieldCapabilities; - const char* PresenceAvailable; - const char* PresenceHidden; - const char* PresenceBusy; - const char* PresenceAway; - const char* PresenceExtendedAway; - const char* PresenceUnknown; - const char* PresenceOffline; - const char* SubTypeSip; - const char* SubTypeSipVoip; - const char* SubTypeImpp; - const char* SubTypeVideoShare; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldAccountUri; + static const QLatin1Constant FieldServiceProvider; + static const QLatin1Constant FieldCapabilities; + static const QLatin1Constant FieldSubTypes; + static const QLatin1Constant SubTypeSip; + static const QLatin1Constant SubTypeSipVoip; + static const QLatin1Constant SubTypeImpp; + static const QLatin1Constant SubTypeVideoShare; + + // deprecated keys: + static const QLatin1Constant FieldNickname; + static const QLatin1Constant FieldStatusMessage; + static const QLatin1Constant FieldPresence; + static const QLatin1Constant PresenceAvailable; + static const QLatin1Constant PresenceHidden; + static const QLatin1Constant PresenceBusy; + static const QLatin1Constant PresenceAway; + static const QLatin1Constant PresenceExtendedAway; + static const QLatin1Constant PresenceUnknown; + static const QLatin1Constant PresenceOffline; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactOnlineAccount, "OnlineAccount") - Q_DECLARE_LATIN1_LITERAL(FieldAccountUri, "AccountUri"); - Q_DECLARE_LATIN1_LITERAL(FieldServiceProvider, "ServiceProvider"); - 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"); - Q_DECLARE_LATIN1_LITERAL(PresenceBusy, "Busy"); - Q_DECLARE_LATIN1_LITERAL(PresenceAway, "Away"); - Q_DECLARE_LATIN1_LITERAL(PresenceExtendedAway, "ExtendedAway"); - Q_DECLARE_LATIN1_LITERAL(PresenceUnknown, "Unknown"); - Q_DECLARE_LATIN1_LITERAL(PresenceOffline, "Offline"); - Q_DECLARE_LATIN1_LITERAL(SubTypeSip, "Sip"); - Q_DECLARE_LATIN1_LITERAL(SubTypeSipVoip, "SipVoip"); - Q_DECLARE_LATIN1_LITERAL(SubTypeImpp, "Impp"); - Q_DECLARE_LATIN1_LITERAL(SubTypeVideoShare, "VideoShare"); + Q_DECLARE_LATIN1_CONSTANT(FieldAccountUri, "AccountUri"); + Q_DECLARE_LATIN1_CONSTANT(FieldServiceProvider, "ServiceProvider"); + Q_DECLARE_LATIN1_CONSTANT(FieldCapabilities, "Capabilities"); + Q_DECLARE_LATIN1_CONSTANT(FieldSubTypes, "SubTypes"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeSip, "Sip"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeSipVoip, "SipVoip"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeImpp, "Impp"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeVideoShare, "VideoShare"); + + // deprecated keys: + Q_DECLARE_LATIN1_CONSTANT(FieldNickname, "Nickname"); + Q_DECLARE_LATIN1_CONSTANT(FieldPresence, "Presence"); + Q_DECLARE_LATIN1_CONSTANT(FieldStatusMessage, "StatusMessage"); + Q_DECLARE_LATIN1_CONSTANT(PresenceAvailable, "Available"); + Q_DECLARE_LATIN1_CONSTANT(PresenceHidden, "Hidden"); + Q_DECLARE_LATIN1_CONSTANT(PresenceBusy, "Busy"); + Q_DECLARE_LATIN1_CONSTANT(PresenceAway, "Away"); + Q_DECLARE_LATIN1_CONSTANT(PresenceExtendedAway, "ExtendedAway"); + Q_DECLARE_LATIN1_CONSTANT(PresenceUnknown, "Unknown"); + Q_DECLARE_LATIN1_CONSTANT(PresenceOffline, "Offline"); #endif void setAccountUri(const QString& accountUri) {setValue(FieldAccountUri, accountUri);} QString accountUri() const {return value(FieldAccountUri);} + void setServiceProvider(const QString& serviceProvider) {setValue(FieldServiceProvider, serviceProvider);} QString serviceProvider() const {return value(FieldServiceProvider);} - void setNickname(const QString& nickname) {setValue(FieldNickname, nickname);} - QString nickname() const {return value(FieldNickname);} - void setPresence(const QString& presence) {setValue(FieldPresence, presence);} - 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));} QStringList subTypes() const {return value(FieldSubTypes);} + + // deprecated functions: + void Q_DECL_DEPRECATED setNickname(const QString& nickname); + QString Q_DECL_DEPRECATED nickname() const; + void Q_DECL_DEPRECATED setPresence(const QString& presence); + QString Q_DECL_DEPRECATED presence() const; + void Q_DECL_DEPRECATED setStatusMessage(const QString& statusMessage); + QString Q_DECL_DEPRECATED statusMessage() const; }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactorganization.h --- a/qtcontactsmobility/src/contacts/details/qcontactorganization.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactorganization.h Mon May 03 12:24:20 2010 +0300 @@ -43,6 +43,7 @@ #define QCONTACTORGANIZATION_H #include +#include #include "qtcontactsglobal.h" #include "qcontactdetail.h" @@ -55,29 +56,35 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldName; - const char* FieldLogo; - const char* FieldDepartment; - const char* FieldLocation; - const char* FieldRole; - const char* FieldTitle; - const char* FieldAssistantName; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldName; + static const QLatin1Constant FieldLogoUrl; + static const QLatin1Constant FieldDepartment; + static const QLatin1Constant FieldLocation; + static const QLatin1Constant FieldRole; + static const QLatin1Constant FieldTitle; + static const QLatin1Constant FieldAssistantName; + + static const QLatin1Constant FieldLogo; // deprecated #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactOrganization, "Organization") - Q_DECLARE_LATIN1_LITERAL(FieldName, "Name"); - Q_DECLARE_LATIN1_LITERAL(FieldLogo, "Logo"); - Q_DECLARE_LATIN1_LITERAL(FieldDepartment, "Department"); - Q_DECLARE_LATIN1_LITERAL(FieldLocation, "Location"); - Q_DECLARE_LATIN1_LITERAL(FieldRole, "Role"); - Q_DECLARE_LATIN1_LITERAL(FieldTitle, "Title"); - Q_DECLARE_LATIN1_LITERAL(FieldAssistantName, "AssistantName"); + Q_DECLARE_LATIN1_CONSTANT(FieldName, "Name"); + Q_DECLARE_LATIN1_CONSTANT(FieldLogoUrl, "LogoUrl"); + Q_DECLARE_LATIN1_CONSTANT(FieldDepartment, "Department"); + Q_DECLARE_LATIN1_CONSTANT(FieldLocation, "Location"); + Q_DECLARE_LATIN1_CONSTANT(FieldRole, "Role"); + Q_DECLARE_LATIN1_CONSTANT(FieldTitle, "Title"); + Q_DECLARE_LATIN1_CONSTANT(FieldAssistantName, "AssistantName"); + + // deprecated keys: + Q_DECLARE_LATIN1_CONSTANT(FieldLogo, "Logo"); + #endif void setName(const QString& name) {setValue(FieldName, name);} QString name() const {return value(FieldName);} - void setLogo(const QString& logo) {setValue(FieldLogo, logo);} - QString logo() const {return value(FieldLogo);} + void setLogoUrl(const QUrl& logo) {setValue(FieldLogoUrl, logo);} + QUrl logoUrl() const {return value(FieldLogoUrl);} void setDepartment(const QStringList& department) {setValue(FieldDepartment, department);} QStringList department() const {return value(FieldDepartment);} void setLocation(const QString& location) {setValue(FieldLocation, location);} @@ -88,6 +95,10 @@ QString title() const {return value(FieldTitle);} void setAssistantName(const QString& assistantName) {setValue(FieldAssistantName, assistantName);} QString assistantName() const {return value(FieldAssistantName);} + + // old, deprecated API: to be removed after the transition period has elapsed. + void setLogo(const QString& logo) {setValue(FieldLogo, logo);} + QString logo() const {return value(FieldLogo);} }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactphonenumber.h --- a/qtcontactsmobility/src/contacts/details/qcontactphonenumber.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactphonenumber.h Mon May 03 12:24:20 2010 +0300 @@ -57,37 +57,42 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldNumber; - const char* FieldSubTypes; - const char* SubTypeLandline; - const char* SubTypeMobile; - const char* SubTypeFacsimile; - const char* SubTypePager; - const char* SubTypeVoice; - const char* SubTypeModem; - const char* SubTypeVideo; - const char* SubTypeCar; - const char* SubTypeBulletinBoardSystem; - const char* SubTypeMessagingCapable; - const char* SubTypeAssistant; - const char* SubTypeDtmfMenu; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldNumber; + static const QLatin1Constant FieldSubTypes; + static const QLatin1Constant SubTypeLandline; + static const QLatin1Constant SubTypeMobile; + static const QLatin1Constant SubTypeFax; + static const QLatin1Constant SubTypePager; + static const QLatin1Constant SubTypeVoice; + static const QLatin1Constant SubTypeModem; + static const QLatin1Constant SubTypeVideo; + static const QLatin1Constant SubTypeCar; + static const QLatin1Constant SubTypeBulletinBoardSystem; + static const QLatin1Constant SubTypeMessagingCapable; + static const QLatin1Constant SubTypeAssistant; + static const QLatin1Constant SubTypeDtmfMenu; + + static const QLatin1Constant SubTypeFacsimile; // deprecated key #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactPhoneNumber, "PhoneNumber") - Q_DECLARE_LATIN1_LITERAL(FieldNumber, "PhoneNumber"); - Q_DECLARE_LATIN1_LITERAL(FieldSubTypes, "SubTypes"); - Q_DECLARE_LATIN1_LITERAL(SubTypeLandline, "Landline"); - Q_DECLARE_LATIN1_LITERAL(SubTypeMobile, "Mobile"); - Q_DECLARE_LATIN1_LITERAL(SubTypeFacsimile, "Facsimile"); - Q_DECLARE_LATIN1_LITERAL(SubTypePager, "Pager"); - Q_DECLARE_LATIN1_LITERAL(SubTypeVoice, "Voice"); - Q_DECLARE_LATIN1_LITERAL(SubTypeModem, "Modem"); - Q_DECLARE_LATIN1_LITERAL(SubTypeVideo, "Video"); - Q_DECLARE_LATIN1_LITERAL(SubTypeCar, "Car"); - Q_DECLARE_LATIN1_LITERAL(SubTypeBulletinBoardSystem, "BulletinBoardSystem"); - Q_DECLARE_LATIN1_LITERAL(SubTypeMessagingCapable, "MessagingCapable"); - Q_DECLARE_LATIN1_LITERAL(SubTypeAssistant, "Assistant"); - Q_DECLARE_LATIN1_LITERAL(SubTypeDtmfMenu, "DtmfMenu"); + Q_DECLARE_LATIN1_CONSTANT(FieldNumber, "PhoneNumber"); + Q_DECLARE_LATIN1_CONSTANT(FieldSubTypes, "SubTypes"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeLandline, "Landline"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeMobile, "Mobile"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeFax, "Fax"); + Q_DECLARE_LATIN1_CONSTANT(SubTypePager, "Pager"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeVoice, "Voice"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeModem, "Modem"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeVideo, "Video"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeCar, "Car"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeBulletinBoardSystem, "BulletinBoardSystem"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeMessagingCapable, "MessagingCapable"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeAssistant, "Assistant"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeDtmfMenu, "DtmfMenu"); + + // deprecated keys + Q_DECLARE_LATIN1_CONSTANT(SubTypeFacsimile, "Fax"); #endif void setNumber(const QString& number) {setValue(FieldNumber, number);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactpresence.h --- a/qtcontactsmobility/src/contacts/details/qcontactpresence.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactpresence.h Mon May 03 12:24:20 2010 +0300 @@ -43,8 +43,8 @@ #ifndef QCONTACTPRESENCE_H #define QCONTACTPRESENCE_H -#include #include +#include #include "qtcontactsglobal.h" #include "qcontactdetail.h" @@ -57,41 +57,45 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldAccountUri; - const char* FieldNickname; - const char* FieldPresence; - const char* FieldStatusMessage; - const char* PresenceAvailable; - const char* PresenceHidden; - const char* PresenceBusy; - const char* PresenceAway; - const char* PresenceExtendedAway; - const char* PresenceUnknown; - const char* PresenceOffline; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldTimestamp; + static const QLatin1Constant FieldNickname; + static const QLatin1Constant FieldPresenceState; + static const QLatin1Constant FieldPresenceStateText; + static const QLatin1Constant FieldPresenceStateImageUrl; + static const QLatin1Constant FieldCustomMessage; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactPresence, "Presence") - Q_DECLARE_LATIN1_LITERAL(FieldAccountUri, "AccountUri"); - Q_DECLARE_LATIN1_LITERAL(FieldNickname, "Nickname"); - Q_DECLARE_LATIN1_LITERAL(FieldPresence, "Presence"); - Q_DECLARE_LATIN1_LITERAL(FieldStatusMessage, "StatusMessage"); - Q_DECLARE_LATIN1_LITERAL(PresenceAvailable, "Available"); - Q_DECLARE_LATIN1_LITERAL(PresenceHidden, "Hidden"); - Q_DECLARE_LATIN1_LITERAL(PresenceBusy, "Busy"); - Q_DECLARE_LATIN1_LITERAL(PresenceAway, "Away"); - Q_DECLARE_LATIN1_LITERAL(PresenceExtendedAway, "ExtendedAway"); - Q_DECLARE_LATIN1_LITERAL(PresenceUnknown, "Unknown"); - Q_DECLARE_LATIN1_LITERAL(PresenceOffline, "Offline"); + Q_DECLARE_LATIN1_CONSTANT(FieldTimestamp, "Timestamp"); + Q_DECLARE_LATIN1_CONSTANT(FieldNickname, "Nickname"); + Q_DECLARE_LATIN1_CONSTANT(FieldPresenceState, "PresenceState"); + Q_DECLARE_LATIN1_CONSTANT(FieldPresenceStateText, "PresenceStateText"); + Q_DECLARE_LATIN1_CONSTANT(FieldPresenceStateImageUrl, "PresenceStateImageUrl"); + Q_DECLARE_LATIN1_CONSTANT(FieldCustomMessage, "CustomMessage"); #endif - void Q_DECL_DEPRECATED setAccountUri(const QString& accountUri) {qWarning("This class has been deprecated! Please use QContactOnlineAccount and Read-Only Field Constraints!"); setValue(FieldAccountUri, accountUri);} - QString Q_DECL_DEPRECATED accountUri() const {qWarning("This class has been deprecated! Please use QContactOnlineAccount and Read-Only Field Constraints!"); return value(FieldAccountUri);} - void Q_DECL_DEPRECATED setNickname(const QString& nickname) {qWarning("This class has been deprecated! Please use QContactOnlineAccount and Read-Only Field Constraints!"); setValue(FieldNickname, nickname);} - QString Q_DECL_DEPRECATED nickname() const {qWarning("This class has been deprecated! Please use QContactOnlineAccount and Read-Only Field Constraints!"); return value(FieldNickname);} - void Q_DECL_DEPRECATED setPresence(const QString& presence) {qWarning("This class has been deprecated! Please use QContactOnlineAccount and Read-Only Field Constraints!"); setValue(FieldPresence, presence);} - QString Q_DECL_DEPRECATED presence() const {qWarning("This class has been deprecated! Please use QContactOnlineAccount and Read-Only Field Constraints!"); return value(FieldPresence);} - void Q_DECL_DEPRECATED setStatusMessage(const QString& statusMessage) {qWarning("This class has been deprecated! Please use QContactOnlineAccount and Read-Only Field Constraints!"); setValue(FieldStatusMessage, statusMessage);} - QString Q_DECL_DEPRECATED statusMessage() const {qWarning("This class has been deprecated! Please use QContactOnlineAccount and Read-Only Field Constraints!"); return value(FieldStatusMessage);} + enum PresenceState { + PresenceUnknown = 0, + PresenceAvailable, + PresenceHidden, + PresenceBusy, + PresenceAway, + PresenceExtendedAway, + PresenceOffline, + }; + + void setTimestamp(const QDateTime& timestamp) {setValue(FieldTimestamp, timestamp);} + QDateTime timestamp() const {return value(FieldTimestamp);} + void setNickname(const QString& nickname) {setValue(FieldNickname, nickname);} + QString nickname() const {return value(FieldNickname);} + void setPresenceState(PresenceState presence) {setValue(FieldPresenceState, static_cast(presence));} + PresenceState presenceState() const {return static_cast(value(FieldPresenceState));} + void setPresenceStateText(const QString& presenceStateText) {setValue(FieldPresenceStateText, presenceStateText);} + QString presenceStateText() const {return value(FieldPresenceStateText);} + void setPresenceStateImageUrl(const QUrl& presenceStateImageUrl) {setValue(FieldPresenceStateImageUrl, presenceStateImageUrl);} + QUrl presenceStateImageUrl() const {return value(FieldPresenceStateImageUrl);} + void setCustomMessage(const QString& customMessage) {setValue(FieldCustomMessage, customMessage);} + QString customMessage() const {return value(FieldCustomMessage);} }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactringtone.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/details/qcontactringtone.h Mon May 03 12:24:20 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$ +** +****************************************************************************/ + +#ifndef QCONTACTRINGTONE_H +#define QCONTACTRINGTONE_H + +#include + +#include "qtcontactsglobal.h" +#include "qcontactdetail.h" +#include "qcontact.h" + +QTM_BEGIN_NAMESPACE + +/* Leaf class */ +class Q_CONTACTS_EXPORT QContactRingtone : public QContactDetail +{ +public: +#ifdef Q_QDOC + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldAudioRingtoneUrl; + static const QLatin1Constant FieldVideoRingtoneUrl; + static const QLatin1Constant FieldVibrationRingtoneUrl; +#else + Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactRingtone, "Ringtone") + Q_DECLARE_LATIN1_CONSTANT(FieldAudioRingtoneUrl, "AudioRingtoneUrl"); + Q_DECLARE_LATIN1_CONSTANT(FieldVideoRingtoneUrl, "VideoRingtoneUrl"); + Q_DECLARE_LATIN1_CONSTANT(FieldVibrationRingtoneUrl, "VibrationRingtoneUrl"); +#endif + + void setAudioRingtoneUrl(const QUrl& audioRingtoneUrl) {setValue(FieldAudioRingtoneUrl, audioRingtoneUrl);} + QUrl audioRingtoneUrl() const {return value(FieldAudioRingtoneUrl);} + + void setVideoRingtoneUrl(const QUrl& videoRingtoneUrl) {setValue(FieldVideoRingtoneUrl, videoRingtoneUrl);} + QUrl videoRingtoneUrl() const {return value(FieldVideoRingtoneUrl);} + + void setVibrationRingtoneUrl(const QUrl& vibrationRingtoneUrl) {setValue(FieldVibrationRingtoneUrl, vibrationRingtoneUrl);} + QUrl vibrationRingtoneUrl() const {return value(FieldVibrationRingtoneUrl);} +}; + +QTM_END_NAMESPACE + +#endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactsynctarget.h --- a/qtcontactsmobility/src/contacts/details/qcontactsynctarget.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontactsynctarget.h Mon May 03 12:24:20 2010 +0300 @@ -56,11 +56,11 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldSyncTarget; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldSyncTarget; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactSyncTarget, "SyncTarget") - Q_DECLARE_LATIN1_LITERAL(FieldSyncTarget, "SyncTarget"); + Q_DECLARE_LATIN1_CONSTANT(FieldSyncTarget, "SyncTarget"); #endif void setSyncTarget(const QString& syncTarget) {setValue(FieldSyncTarget, syncTarget);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontacttag.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/details/qcontacttag.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,72 @@ + +/**************************************************************************** +** +** 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 QCONTACTTAG_H +#define QCONTACTTAG_H + +#include + +#include "qtcontactsglobal.h" +#include "qcontactdetail.h" +#include "qcontact.h" + +QTM_BEGIN_NAMESPACE + +/* Leaf class */ +class Q_CONTACTS_EXPORT QContactTag : public QContactDetail +{ +public: +#ifdef Q_QDOC + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldTag; +#else + Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactTag, "Tag") + Q_DECLARE_LATIN1_CONSTANT(FieldTag, "Tag"); +#endif + + void setTag(const QString& tag) {setValue(FieldTag, tag);} + QString tag() const {return value(FieldTag);} +}; + +QTM_END_NAMESPACE + +#endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontactthumbnail.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/details/qcontactthumbnail.h Mon May 03 12:24:20 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 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 QCONTACTTHUMBNAIL_H +#define QCONTACTTHUMBNAIL_H + +#include +#include + +#include "qtcontactsglobal.h" +#include "qcontactdetail.h" +#include "qcontact.h" + +QTM_BEGIN_NAMESPACE + +/* Leaf class */ +class Q_CONTACTS_EXPORT QContactThumbnail : public QContactDetail +{ +public: +#ifdef Q_QDOC + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldThumbnail; +#else + Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactThumbnail, "Thumbnail") + Q_DECLARE_LATIN1_CONSTANT(FieldThumbnail, "Thumbnail"); +#endif + + void setThumbnail(const QImage& thumbnail) {setValue(FieldThumbnail, thumbnail);} + QImage thumbnail() const {return value(FieldThumbnail);} +}; + +QTM_END_NAMESPACE + +#endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontacttimestamp.h --- a/qtcontactsmobility/src/contacts/details/qcontacttimestamp.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontacttimestamp.h Mon May 03 12:24:20 2010 +0300 @@ -55,13 +55,13 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldModificationTimestamp; - const char* FieldCreationTimestamp; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldModificationTimestamp; + static const QLatin1Constant FieldCreationTimestamp; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactTimestamp, "Timestamp") - Q_DECLARE_LATIN1_LITERAL(FieldModificationTimestamp, "ModificationTimestamp"); - Q_DECLARE_LATIN1_LITERAL(FieldCreationTimestamp, "CreationTimestamp"); + Q_DECLARE_LATIN1_CONSTANT(FieldModificationTimestamp, "ModificationTimestamp"); + Q_DECLARE_LATIN1_CONSTANT(FieldCreationTimestamp, "CreationTimestamp"); #endif void setLastModified(const QDateTime& timestamp) {setValue(FieldModificationTimestamp, timestamp);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontacttype.h --- a/qtcontactsmobility/src/contacts/details/qcontacttype.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontacttype.h Mon May 03 12:24:20 2010 +0300 @@ -55,15 +55,15 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldType; - const char* TypeContact; - const char* TypeGroup; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldType; + static const QLatin1Constant TypeContact; + static const QLatin1Constant TypeGroup; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactType, "Type") - Q_DECLARE_LATIN1_LITERAL(FieldType, "Type"); - Q_DECLARE_LATIN1_LITERAL(TypeContact, "Contact"); - Q_DECLARE_LATIN1_LITERAL(TypeGroup, "Group"); + Q_DECLARE_LATIN1_CONSTANT(FieldType, "Type"); + Q_DECLARE_LATIN1_CONSTANT(TypeContact, "Contact"); + Q_DECLARE_LATIN1_CONSTANT(TypeGroup, "Group"); #endif void setType(const QString& type) {setValue(FieldType, type);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/details/qcontacturl.h --- a/qtcontactsmobility/src/contacts/details/qcontacturl.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/details/qcontacturl.h Mon May 03 12:24:20 2010 +0300 @@ -55,18 +55,18 @@ { public: #ifdef Q_QDOC - const char* DefinitionName; - const char* FieldUrl; - const char* FieldSubType; - const char* SubTypeHomePage; - const char* SubTypeFavourite; - const char* SubTypeSocialNetworking; + static const QLatin1Constant DefinitionName; + static const QLatin1Constant FieldUrl; + static const QLatin1Constant FieldSubType; + static const QLatin1Constant SubTypeHomePage; + static const QLatin1Constant SubTypeFavourite; + static const QLatin1Constant SubTypeSocialNetworking; #else Q_DECLARE_CUSTOM_CONTACT_DETAIL(QContactUrl, "Url") - Q_DECLARE_LATIN1_LITERAL(FieldUrl, "Url"); - Q_DECLARE_LATIN1_LITERAL(FieldSubType, "SubType"); - Q_DECLARE_LATIN1_LITERAL(SubTypeHomePage, "HomePage"); - Q_DECLARE_LATIN1_LITERAL(SubTypeFavourite, "Favourite"); + Q_DECLARE_LATIN1_CONSTANT(FieldUrl, "Url"); + Q_DECLARE_LATIN1_CONSTANT(FieldSubType, "SubType"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeHomePage, "HomePage"); + Q_DECLARE_LATIN1_CONSTANT(SubTypeFavourite, "Favourite"); #endif void setUrl(const QString& url) {setValue(FieldUrl, url);} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/eabi/QtContactsu.def --- a/qtcontactsmobility/src/contacts/eabi/QtContactsu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,949 +0,0 @@ -EXPORTS - _ZN10QtMobility10QContactId10setLocalIdERKj @ 1 NONAME - _ZN10QtMobility10QContactId13setManagerUriERK7QString @ 2 NONAME - _ZN10QtMobility10QContactIdC1ERKS0_ @ 3 NONAME - _ZN10QtMobility10QContactIdC1Ev @ 4 NONAME - _ZN10QtMobility10QContactIdC2ERKS0_ @ 5 NONAME - _ZN10QtMobility10QContactIdC2Ev @ 6 NONAME - _ZN10QtMobility10QContactIdD1Ev @ 7 NONAME - _ZN10QtMobility10QContactIdD2Ev @ 8 NONAME - _ZN10QtMobility10QContactIdaSERKS0_ @ 9 NONAME - _ZN10QtMobility11QContactUrl12FieldSubTypeE @ 10 NONAME DATA 8 - _ZN10QtMobility11QContactUrl14DefinitionNameE @ 11 NONAME DATA 4 - _ZN10QtMobility11QContactUrl15SubTypeHomePageE @ 12 NONAME DATA 9 - _ZN10QtMobility11QContactUrl16SubTypeFavouriteE @ 13 NONAME DATA 10 - _ZN10QtMobility11QContactUrl8FieldUrlE @ 14 NONAME DATA 4 - _ZN10QtMobility12QContactGuid14DefinitionNameE @ 15 NONAME DATA 5 - _ZN10QtMobility12QContactGuid9FieldGuidE @ 16 NONAME DATA 5 - _ZN10QtMobility12QContactName10FieldFirstE @ 17 NONAME DATA 10 - _ZN10QtMobility12QContactName11FieldMiddleE @ 18 NONAME DATA 11 - _ZN10QtMobility12QContactName11FieldPrefixE @ 19 NONAME DATA 7 - _ZN10QtMobility12QContactName11FieldSuffixE @ 20 NONAME DATA 7 - _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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend.cpp --- a/qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend.cpp Mon May 03 12:24:20 2010 +0300 @@ -59,23 +59,9 @@ } /*! \reimp */ -void QContactInvalidEngine::deref() -{ - delete this; -} - -/*! \reimp */ QString QContactInvalidEngine::managerName() const { return QString(QLatin1String("invalid")); } -/*! \reimp */ -QString QContactInvalidEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const -{ - Q_UNUSED(contact); - error = QContactManager::NotSupportedError; - return QString(); -} - QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend_p.h --- a/qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/engines/qcontactinvalidbackend_p.h Mon May 03 12:24:20 2010 +0300 @@ -66,9 +66,183 @@ { public: QContactInvalidEngine(); - void deref(); QString managerName() const; - QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const; + + /*! \reimp */ + QMap managerParameters() const {return QMap();} + /*! \reimp */ + int managerVersion() const {return 0;} + + /*! \reimp */ + QList contactIds(const QContactFilter&, const QList&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QList(); + } + + /*! \reimp */ + QList contacts(const QContactFilter&, const QList&, const QContactFetchHint&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QList(); + } + + /*! \reimp */ + QContact contact(const QContactLocalId&, const QContactFetchHint&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QContact(); + } + + /*! \reimp */ + bool saveContacts(QList*, QMap*, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + /*! \reimp */ + bool removeContacts(const QList&, QMap*, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + /*! \reimp */ + QContact conformingContact(const QContact&, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return QContact(); + } + + /*! \reimp */ + virtual QString synthesizedDisplayLabel(const QContact&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QString(); + } + + /*! \reimp */ + virtual bool setSelfContactId(const QContactLocalId&, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + /*! \reimp */ + virtual QContactLocalId selfContactId(QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return 0; + } + + /*! \reimp */ + virtual QList relationships(const QString&, const QContactId&, QContactRelationship::Role, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QList(); + } + + /*! \reimp */ + virtual bool saveRelationships(QList*, QMap*, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + /*! \reimp */ + virtual bool removeRelationships(const QList&, QMap*, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + /*! \reimp */ + virtual QContact compatibleContact(const QContact&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QContact(); + } + + /*! \reimp */ + virtual bool validateContact(const QContact&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return false; + } + + /*! \reimp */ + virtual bool validateDefinition(const QContactDetailDefinition&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return false; + } + + /*! \reimp */ + virtual QMap detailDefinitions(const QString&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QMap(); + } + + /*! \reimp */ + virtual QContactDetailDefinition detailDefinition(const QString&, const QString&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QContactDetailDefinition(); + } + + /*! \reimp */ + virtual bool saveDetailDefinition(const QContactDetailDefinition&, const QString&, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + /*! \reimp */ + virtual bool removeDetailDefinition(const QString&, const QString&, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + /*! \reimp */ + virtual void requestDestroyed(QContactAbstractRequest*) {} + /*! \reimp */ + virtual bool startRequest(QContactAbstractRequest*) {return false;} + /*! \reimp */ + virtual bool cancelRequest(QContactAbstractRequest*) {return false;} + /*! \reimp */ + virtual bool waitForRequestFinished(QContactAbstractRequest*, int) {return false;} + + /*! \reimp */ + virtual bool hasFeature(QContactManager::ManagerFeature, const QString&) const + { + return false; + } + + /*! \reimp */ + virtual bool isRelationshipTypeSupported(const QString&, const QString&) const + { + return false; + } + + /*! \reimp */ + virtual bool isFilterSupported(const QContactFilter&) const + { + return false; + } + + /*! \reimp */ + virtual QList supportedDataTypes() const + { + return QList(); + } + /*! \reimp */ + virtual QStringList supportedContactTypes() const + { + return QStringList(); + } }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/engines/qcontactmemorybackend.cpp --- a/qtcontactsmobility/src/contacts/engines/qcontactmemorybackend.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/engines/qcontactmemorybackend.cpp Mon May 03 12:24:20 2010 +0300 @@ -53,6 +53,8 @@ #include #include #include +#include + QTM_BEGIN_NAMESPACE /*! @@ -74,7 +76,7 @@ */ /* static data for manager class */ -QMap QContactMemoryEngine::engines; +QMap QContactMemoryEngine::engineDatas; /*! * Factory function for creating a new in-memory backend, based @@ -93,54 +95,42 @@ anonymous = true; } - if (engines.contains(idValue)) { - QContactMemoryEngine *engine = engines.value(idValue); - engine->d->m_refCount.ref(); - engine->d->m_anonymous = anonymous; - return engine; + QContactMemoryEngineData* data = engineDatas.value(idValue); + if (data) { + data->m_refCount.ref(); } else { - QContactMemoryEngine *engine = new QContactMemoryEngine(parameters); - engine->d->m_engineName = QString(QLatin1String("memory")); - engine->d->m_engineVersion = 1; - engine->d->m_id = idValue; - engine->d->m_anonymous = anonymous; - engines.insert(idValue, engine); - return engine; + data = new QContactMemoryEngineData(); + data->m_id = idValue; + data->m_anonymous = anonymous; + engineDatas.insert(idValue, data); } + return new QContactMemoryEngine(data); } /*! - * Constructs a new in-memory backend. - * - * Loads the in-memory data associated with the memory store identified by the "id" parameter - * from the given \a parameters if it exists, or a new, anonymous store if it does not. + * Constructs a new in-memory backend which shares the given \a data with + * other shared memory engines. */ -QContactMemoryEngine::QContactMemoryEngine(const QMap& parameters) - : d(new QContactMemoryEngineData) +QContactMemoryEngine::QContactMemoryEngine(QContactMemoryEngineData* data) + : d(data) { - Q_UNUSED(parameters); + d->m_sharedEngines.append(this); } -/*! \reimp */ -void QContactMemoryEngine::deref() +/*! Frees any memory used by this engine */ +QContactMemoryEngine::~QContactMemoryEngine() { + d->m_sharedEngines.removeAll(this); if (!d->m_refCount.deref()) { - engines.remove(d->m_id); + engineDatas.remove(d->m_id); delete d; - delete this; } } /*! \reimp */ QString QContactMemoryEngine::managerName() const { - return d->m_engineName; -} - -/*! This function is deprecated and should not be used. Use QContactMemoryEngine::managerVersion() instead! */ -int QContactMemoryEngine::implementationVersion() const -{ - return d->m_engineVersion; + return QLatin1String("memory"); } /*! \reimp */ @@ -152,124 +142,91 @@ } /*! \reimp */ -bool QContactMemoryEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error) +bool QContactMemoryEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error* error) { if (contactId == QContactLocalId(0) || d->m_contactIds.contains(contactId)) { - error = QContactManager::NoError; + *error = QContactManager::NoError; QContactLocalId oldId = d->m_selfContactId; d->m_selfContactId = contactId; - QContactChangeSet cs; - cs.oldAndNewSelfContactId() = QPair(oldId, contactId); - cs.emitSignals(this); + QContactChangeSet changeSet; + changeSet.setOldAndNewSelfContactId(QPair(oldId, contactId)); + d->emitSharedSignals(&changeSet); return true; } - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return false; } /*! \reimp */ -QContactLocalId QContactMemoryEngine::selfContactId(QContactManager::Error& error) const +QContactLocalId QContactMemoryEngine::selfContactId(QContactManager::Error* error) const { - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; if (d->m_selfContactId != QContactLocalId(0)) - error = QContactManager::NoError; + *error = QContactManager::NoError; return d->m_selfContactId; } /*! \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 +QContact QContactMemoryEngine::contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const { - // TODO: this needs to be done properly... - error = QContactManager::NoError; - QList sortedIds; - QList sortedContacts; - for (int i = 0; i < d->m_contacts.size(); i++) - QContactManagerEngine::addSorted(&sortedContacts, d->m_contacts.at(i), sortOrders); - for (int i = 0; i < sortedContacts.size(); i++) - sortedIds.append(sortedContacts.at(i).id().localId()); - return sortedIds; -} - -/*! \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 -{ + Q_UNUSED(fetchHint); // no optimisations are possible in the memory backend; ignore the fetch hint. 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. - QList relationshipCache = d->m_orderedRelationships.value(contactId); - QContactManagerEngine::setContactRelationships(&retn, relationshipCache); - - // and return the contact - return retn; + *error = QContactManager::NoError; + return d->m_contacts.at(index); } - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return QContact(); } /*! \reimp */ -QContact QContactMemoryEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const +QList QContactMemoryEngine::contactIds(const QContactFilter& filter, const QList& sortOrders, 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); + /* Special case the fast case */ + if (filter.type() == QContactFilter::DefaultFilter && sortOrders.count() == 0) { + return d->m_contactIds; + } else { + QList clist = contacts(filter, sortOrders, QContactFetchHint(), error); + + /* Extract the ids */ + QList ids; + foreach(const QContact& c, clist) + ids.append(c.localId()); + + return ids; + } +} - // 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); - } +/*! \reimp */ +QList QContactMemoryEngine::contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fetchHint, QContactManager::Error* error) const +{ + Q_UNUSED(fetchHint); // no optimisations are possible in the memory backend; ignore the fetch hint. + Q_UNUSED(error); + + QList sorted; - // 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; + /* First filter out contacts - check for default filter first */ + if (filter.type() == QContactFilter::DefaultFilter) { + foreach(const QContact&c, d->m_contacts) { + QContactManagerEngine::addSorted(&sorted,c, sortOrders); + } + } else { + foreach(const QContact&c, d->m_contacts) { + if (QContactManagerEngine::testFilter(filter, c)) + QContactManagerEngine::addSorted(&sorted,c, sortOrders); + } } - error = QContactManager::DoesNotExistError; - return QContact(); + return sorted; } -bool QContactMemoryEngine::saveContact(QContact* theContact, QContactChangeSet& changeSet, QContactManager::Error& error) +/*! Saves the given contact \a theContact, storing any error to \a error and + filling the \a changeSet with ids of changed contacts as required */ +bool QContactMemoryEngine::saveContact(QContact* theContact, QContactChangeSet& changeSet, QContactManager::Error* error) { // ensure that the contact's details conform to their definitions if (!validateContact(*theContact, error)) { @@ -283,7 +240,7 @@ QContact oldContact = d->m_contacts.at(index); if (oldContact.type() != theContact->type()) { - error = QContactManager::AlreadyExistsError; + *error = QContactManager::AlreadyExistsError; return false; } @@ -292,45 +249,19 @@ 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 */ - QList orderedList = theContact->relationshipOrder(); - QList upToDateList = d->m_orderedRelationships.value(theContact->localId()); - if (theContact->relationships() != orderedList) { - // the user has modified the order of relationships; we may need to update the lists etc. - if (upToDateList.size() != orderedList.size()) { - // the cache was stale; relationships have been added or removed in the meantime. - error = QContactManager::InvalidRelationshipError; - return false; - } - - // size is the same, need to ensure that no invalid relationships are in the list. - for (int i = 0; i < orderedList.size(); i++) { - QContactRelationship currOrderedRel = orderedList.at(i); - if (!upToDateList.contains(currOrderedRel)) { - // the cache was stale; relationships have been added and removed in the meantime. - error = QContactManager::InvalidRelationshipError; - return false; - } - } - - // everything is fine. update the up-to-date list - d->m_orderedRelationships.insert(theContact->localId(), orderedList); - } - // synthesize the display label for the contact. - QContact saveContact = setContactDisplayLabel(synthesizedDisplayLabel(*theContact, error), *theContact); - *theContact = saveContact; + setContactDisplayLabel(theContact, synthesizedDisplayLabel(*theContact, error)); // Looks ok, so continue d->m_contacts.replace(index, *theContact); - changeSet.changedContacts().insert(theContact->localId()); + changeSet.insertChangedContact(theContact->localId()); } else { // id does not exist; if not zero, fail. QContactId newId; newId.setManagerUri(managerUri()); if (theContact->id() != QContactId() && theContact->id() != newId) { // the ID is not empty, and it doesn't identify an existing contact in our database either. - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return false; } @@ -346,66 +277,28 @@ theContact->setId(newId); // synthesize the display label for the contact. - QContact saveContact = setContactDisplayLabel(synthesizedDisplayLabel(*theContact, error), *theContact); - *theContact = saveContact; + setContactDisplayLabel(theContact, synthesizedDisplayLabel(*theContact, error)); // finally, add the contact to our internal lists and return d->m_contacts.append(*theContact); // add contact to list d->m_contactIds.append(theContact->localId()); // track the contact id. - changeSet.addedContacts().insert(theContact->localId()); + changeSet.insertAddedContact(theContact->localId()); } - error = QContactManager::NoError; // successful. + *error = QContactManager::NoError; // successful. return true; } /*! \reimp */ -bool QContactMemoryEngine::saveContact(QContact* contact, QContactManager::Error& error) -{ - QContactChangeSet changeSet; - bool retn = saveContact(contact, changeSet, error); - changeSet.emitSignals(this); - return retn; -} - -/*! \reimp */ -QList QContactMemoryEngine::saveContacts(QList* contacts, QContactManager::Error& error) -{ - QList ret; - if (!contacts) { - error = QContactManager::BadArgumentError; - return ret; - } else { - // for batch processing, we store up the changes and emit at the end. - QContactChangeSet changeSet; - QContactManager::Error functionError = QContactManager::NoError; - for (int i = 0; i < contacts->count(); i++) { - QContact current = contacts->at(i); - if (!saveContact(¤t, changeSet, error)) { - functionError = error; - ret.append(functionError); - } else { - (*contacts)[i] = current; - ret.append(QContactManager::NoError); - } - } - - error = functionError; - changeSet.emitSignals(this); - return ret; - } -} - -/*! \reimp */ -bool QContactMemoryEngine::saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error& error) +bool QContactMemoryEngine::saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error* error) { if(errorMap) { errorMap->clear(); } if (!contacts) { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; return false; } @@ -415,25 +308,27 @@ for (int i = 0; i < contacts->count(); i++) { current = contacts->at(i); if (!saveContact(¤t, changeSet, error)) { - operationError = error; + operationError = *error; errorMap->insert(i, operationError); } else { (*contacts)[i] = current; } } - error = operationError; - changeSet.emitSignals(this); + *error = operationError; + d->emitSharedSignals(&changeSet); // return false if some error occurred - return error == QContactManager::NoError; + return (*error == QContactManager::NoError); } -bool QContactMemoryEngine::removeContact(const QContactLocalId& contactId, QContactChangeSet& changeSet, QContactManager::Error& error) +/*! Removes the contact identified by the given \a contactId, storing any error to \a error and + filling the \a changeSet with ids of changed contacts and relationships as required */ +bool QContactMemoryEngine::removeContact(const QContactLocalId& contactId, QContactChangeSet& changeSet, QContactManager::Error* error) { int index = d->m_contactIds.indexOf(contactId); if (index == -1) { - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return false; } @@ -441,100 +336,58 @@ QContactId thisContact; thisContact.setManagerUri(managerUri()); thisContact.setLocalId(contactId); - QList allRelationships = relationships(QString(), thisContact, QContactRelationshipFilter::Either, error); - if (error != QContactManager::NoError && error != QContactManager::DoesNotExistError) { - error = QContactManager::UnspecifiedError; // failed to clean up relationships + QList allRelationships = relationships(QString(), thisContact, QContactRelationship::Either, error); + if (*error != QContactManager::NoError && *error != QContactManager::DoesNotExistError) { + *error = QContactManager::UnspecifiedError; // failed to clean up relationships return false; } // this is meant to be a transaction, so if any of these fail, we're in BIG TROUBLE. // a real backend will use DBMS transactions to ensure database integrity. - for (int i = 0; i < allRelationships.size(); i++) { - QContactRelationship currRel = allRelationships.at(i); - removeRelationship(currRel, error); - } + removeRelationships(allRelationships, 0, error); // having cleaned up the relationships, remove the contact from the lists. d->m_contacts.removeAt(index); d->m_contactIds.removeAt(index); - error = QContactManager::NoError; + *error = QContactManager::NoError; // and if it was the self contact, reset the self contact id if (contactId == d->m_selfContactId) { d->m_selfContactId = QContactLocalId(0); - changeSet.oldAndNewSelfContactId() = QPair(contactId, QContactLocalId(0)); + changeSet.setOldAndNewSelfContactId(QPair(contactId, QContactLocalId(0))); } - changeSet.removedContacts().insert(contactId); + changeSet.insertRemovedContact(contactId); return true; } /*! \reimp */ -bool QContactMemoryEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error& error) -{ - QContactChangeSet changeSet; - bool retn = removeContact(contactId, changeSet, error); - changeSet.emitSignals(this); - return retn; -} - -/*! \reimp */ -QList QContactMemoryEngine::removeContacts(QList* contactIds, QContactManager::Error& error) +bool QContactMemoryEngine::removeContacts(const QList& contactIds, QMap* errorMap, QContactManager::Error* error) { - QList ret; - if (!contactIds) { - error = QContactManager::BadArgumentError; - return ret; + if (contactIds.count() == 0) { + *error = QContactManager::BadArgumentError; + return false; } - - // for batch processing, we store up the changes and emit at the end. + QContactChangeSet changeSet; - QContactManager::Error functionError = QContactManager::NoError; - for (int i = 0; i < contactIds->count(); i++) { - QContactLocalId current = contactIds->at(i); + QContactLocalId current; + QContactManager::Error operationError = QContactManager::NoError; + for (int i = 0; i < contactIds.count(); i++) { + current = contactIds.at(i); if (!removeContact(current, changeSet, error)) { - functionError = error; - ret.append(functionError); - } else { - (*contactIds)[i] = 0; - ret.append(QContactManager::NoError); + operationError = *error; + errorMap->insert(i, operationError); } } - error = functionError; - changeSet.emitSignals(this); - return ret; + *error = operationError; + d->emitSharedSignals(&changeSet); + // return false if some errors occurred + return (*error == QContactManager::NoError); } /*! \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 +QList QContactMemoryEngine::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const { QContactId defaultId; QList retn; @@ -552,40 +405,44 @@ } // otherwise, check that the participant exists and plays the required role in the relationship. - if (role == QContactRelationshipFilter::First && curr.first() == participantId) { + if (role == QContactRelationship::First && curr.first() == participantId) { retn.append(curr); - } else if (role == QContactRelationshipFilter::Second && curr.second() == participantId) { + } else if (role == QContactRelationship::Second && curr.second() == participantId) { retn.append(curr); - } else if (role == QContactRelationshipFilter::Either && (curr.first() == participantId || curr.second() == participantId)) { + } else if (role == QContactRelationship::Either && (curr.first() == participantId || curr.second() == participantId)) { retn.append(curr); } } - error = QContactManager::NoError; + *error = QContactManager::NoError; if (retn.isEmpty()) - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return retn; } -bool QContactMemoryEngine::saveRelationship(QContactRelationship* relationship, QContactChangeSet& changeSet, QContactManager::Error& error) +/*! Saves the given relationship \a relationship, storing any error to \a error and + filling the \a changeSet with ids of changed contacts and relationships as required */ +bool QContactMemoryEngine::saveRelationship(QContactRelationship* relationship, QContactChangeSet& changeSet, QContactManager::Error* error) { // Attempt to validate the relationship. // first, check that the source contact exists and is in this manager. QString myUri = managerUri(); + int firstContactIndex = d->m_contactIds.indexOf(relationship->first().localId()); if ((!relationship->first().managerUri().isEmpty() && relationship->first().managerUri() != myUri) - ||!d->m_contactIds.contains(relationship->first().localId())) { - error = QContactManager::InvalidRelationshipError; + ||firstContactIndex == -1) { + *error = QContactManager::InvalidRelationshipError; return false; } // second, check that the second contact exists (if it's local); we cannot check other managers' contacts. QContactId dest = relationship->second(); + int secondContactIndex = d->m_contactIds.indexOf(dest.localId()); if (dest.managerUri().isEmpty() || dest.managerUri() == myUri) { // this entry in the destination list is supposedly stored in this manager. // check that it exists, and that it isn't the source contact (circular) - if (!d->m_contactIds.contains(dest.localId()) || dest.localId() == relationship->first().localId()) { - error = QContactManager::InvalidRelationshipError; + if (secondContactIndex == -1 || dest.localId() == relationship->first().localId()) { + *error = QContactManager::InvalidRelationshipError; return false; } } @@ -599,13 +456,11 @@ // check to see if the relationship already exists in the database. If so, replace. // We do this because we don't want duplicates in our lists / maps of relationships. - error = QContactManager::NoError; + *error = QContactManager::NoError; QList allRelationships = d->m_relationships; for (int i = 0; i < allRelationships.size(); i++) { QContactRelationship curr = allRelationships.at(i); if (curr == *relationship) { - d->m_relationships.removeAt(i); - d->m_relationships.insert(i, *relationship); return true; // TODO: set error to AlreadyExistsError and return false? } @@ -618,8 +473,12 @@ secondRelationships.append(*relationship); d->m_orderedRelationships.insert(relationship->first().localId(), firstRelationships); d->m_orderedRelationships.insert(relationship->second().localId(), secondRelationships); - changeSet.addedRelationshipsContacts().insert(relationship->first().localId()); - changeSet.addedRelationshipsContacts().insert(relationship->second().localId()); + changeSet.insertAddedRelationshipsContact(relationship->first().localId()); + changeSet.insertAddedRelationshipsContact(relationship->second().localId()); + + // update the contacts involved + QContactManagerEngine::setContactRelationships(&d->m_contacts[firstContactIndex], firstRelationships); + QContactManagerEngine::setContactRelationships(&d->m_contacts[secondContactIndex], secondRelationships); // finally, insert into our list of all relationships, and return. d->m_relationships.append(*relationship); @@ -627,43 +486,37 @@ } /*! \reimp */ -bool QContactMemoryEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error& error) +bool QContactMemoryEngine::saveRelationships(QList* relationships, QMap* errorMap, QContactManager::Error* error) { - QContactChangeSet changeSet; - bool retn = saveRelationship(relationship, changeSet, error); - changeSet.emitSignals(this); - return retn; -} - -/*! \reimp */ -QList QContactMemoryEngine::saveRelationships(QList* relationships, QContactManager::Error& error) -{ - error = QContactManager::NoError; + *error = QContactManager::NoError; QContactManager::Error functionError; QContactChangeSet changeSet; - QList retn; + for (int i = 0; i < relationships->size(); i++) { QContactRelationship curr = relationships->at(i); - saveRelationship(&curr, changeSet, functionError); - retn.append(functionError); + saveRelationship(&curr, changeSet, &functionError); + if (functionError != QContactManager::NoError && errorMap) + errorMap->insert(i, functionError); // and replace the current relationship with the updated version. relationships->replace(i, curr); // also, update the total error if it did not succeed. if (functionError != QContactManager::NoError) - error = functionError; + *error = functionError; } - changeSet.emitSignals(this); - return retn; + d->emitSharedSignals(&changeSet); + return (*error == QContactManager::NoError); } -bool QContactMemoryEngine::removeRelationship(const QContactRelationship& relationship, QContactChangeSet& changeSet, QContactManager::Error& error) +/*! Removes the given relationship \a relationship, storing any error to \a error and + filling the \a changeSet with ids of changed contacts and relationships as required */ +bool QContactMemoryEngine::removeRelationship(const QContactRelationship& relationship, QContactChangeSet& changeSet, QContactManager::Error* error) { // attempt to remove it from our list of relationships. if (!d->m_relationships.removeOne(relationship)) { - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return false; } @@ -675,53 +528,56 @@ d->m_orderedRelationships.insert(relationship.first().localId(), firstRelationships); d->m_orderedRelationships.insert(relationship.second().localId(), secondRelationships); + // Update the contacts as well + int firstContactIndex = d->m_contactIds.indexOf(relationship.first().localId()); + int secondContactIndex = relationship.second().managerUri() == managerUri() ? d->m_contactIds.indexOf(relationship.second().localId()) : -1; + if (firstContactIndex != -1) + QContactMemoryEngine::setContactRelationships(&d->m_contacts[firstContactIndex], firstRelationships); + if (secondContactIndex != -1) + QContactMemoryEngine::setContactRelationships(&d->m_contacts[secondContactIndex], secondRelationships); + // set our changes, and return. - changeSet.removedRelationshipsContacts().insert(relationship.first().localId()); - changeSet.removedRelationshipsContacts().insert(relationship.second().localId()); - error = QContactManager::NoError; + changeSet.insertRemovedRelationshipsContact(relationship.first().localId()); + changeSet.insertRemovedRelationshipsContact(relationship.second().localId()); + *error = QContactManager::NoError; return true; } /*! \reimp */ -bool QContactMemoryEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error& error) +bool QContactMemoryEngine::removeRelationships(const QList& relationships, QMap* errorMap, QContactManager::Error* error) { - QContactChangeSet changeSet; - bool retn = removeRelationship(relationship, changeSet, error); - changeSet.emitSignals(this); - return retn; + QContactManager::Error functionError; + QContactChangeSet cs; + for (int i = 0; i < relationships.size(); i++) { + removeRelationship(relationships.at(i), cs, &functionError); + + // update the total error if it did not succeed. + if (functionError != QContactManager::NoError) { + if (errorMap) + errorMap->insert(i, functionError); + *error = functionError; + } + } + + d->emitSharedSignals(&cs); + return (*error == QContactManager::NoError); } /*! \reimp */ -QList QContactMemoryEngine::removeRelationships(const QList& relationships, QContactManager::Error& error) -{ - QList retn; - QContactManager::Error functionError; - for (int i = 0; i < relationships.size(); i++) { - removeRelationship(relationships.at(i), functionError); - retn.append(functionError); - - // update the total error if it did not succeed. - if (functionError != QContactManager::NoError) { - error = functionError; - } - } - - return retn; -} - -/*! \reimp */ -QMap QContactMemoryEngine::detailDefinitions(const QString& contactType, QContactManager::Error& error) const +QMap QContactMemoryEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const { // lazy initialisation of schema definitions. if (d->m_definitions.isEmpty()) { d->m_definitions = QContactManagerEngine::schemaDefinitions(); } - error = QContactManager::NoError; + *error = QContactManager::NoError; return d->m_definitions.value(contactType); } -bool QContactMemoryEngine::saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactChangeSet& changeSet, QContactManager::Error& error) +/*! Saves the given detail definition \a def, storing any error to \a error and + filling the \a changeSet with ids of changed contacts as required */ +bool QContactMemoryEngine::saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactChangeSet& changeSet, QContactManager::Error* error) { // we should check for changes to the database in this function, and add ids of changed data to changeSet. TODO. Q_UNUSED(changeSet); @@ -735,20 +591,22 @@ defsForThisType.insert(def.name(), def); d->m_definitions.insert(contactType, defsForThisType); - error = QContactManager::NoError; + *error = QContactManager::NoError; return true; } /*! \reimp */ -bool QContactMemoryEngine::saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error& error) +bool QContactMemoryEngine::saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error* error) { QContactChangeSet changeSet; bool retn = saveDetailDefinition(def, contactType, changeSet, error); - changeSet.emitSignals(this); + d->emitSharedSignals(&changeSet); return retn; } -bool QContactMemoryEngine::removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactChangeSet& changeSet, QContactManager::Error& error) +/*! Removes the detail definition identified by \a definitionId, storing any error to \a error and + filling the \a changeSet with ids of changed contacts as required */ +bool QContactMemoryEngine::removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactChangeSet& changeSet, QContactManager::Error* error) { // we should check for changes to the database in this function, and add ids of changed data to changeSet... // we should also check to see if the changes have invalidated any contact data, and add the ids of those contacts @@ -756,7 +614,7 @@ Q_UNUSED(changeSet); if (definitionId.isEmpty()) { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; return false; } @@ -765,90 +623,60 @@ bool success = defsForThisType.remove(definitionId); d->m_definitions.insert(contactType, defsForThisType); if (success) - error = QContactManager::NoError; + *error = QContactManager::NoError; else - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return success; } /*! \reimp */ -bool QContactMemoryEngine::removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error& error) +bool QContactMemoryEngine::removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error) { QContactChangeSet changeSet; bool retn = removeDetailDefinition(definitionId, contactType, changeSet, error); - changeSet.emitSignals(this); + d->emitSharedSignals(&changeSet); return retn; } /*! \reimp */ void QContactMemoryEngine::requestDestroyed(QContactAbstractRequest* req) { - d->m_asynchronousOperations.removeOne(req); + Q_UNUSED(req); } /*! \reimp */ bool QContactMemoryEngine::startRequest(QContactAbstractRequest* req) { - if (!d->m_asynchronousOperations.contains(req)) - d->m_asynchronousOperations.enqueue(req); + if (!req) + return false; updateRequestState(req, QContactAbstractRequest::ActiveState); - QTimer::singleShot(0, this, SLOT(performAsynchronousOperation())); + performAsynchronousOperation(req); return true; } /*! \reimp */ bool QContactMemoryEngine::cancelRequest(QContactAbstractRequest* req) { - updateRequestState(req, QContactAbstractRequest::CanceledState); - return true; -} - -/*! 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); - - if (!d->m_asynchronousOperations.removeOne(req)) - return false; // didn't exist. - - // replace at head of queue - d->m_asynchronousOperations.insert(0, req); - - // and perform the operation. - performAsynchronousOperation(); - - return true; + Q_UNUSED(req); // we can't cancel since we complete immediately + return false; } /*! \reimp */ bool QContactMemoryEngine::waitForRequestFinished(QContactAbstractRequest* req, int msecs) { // in our implementation, we always complete any operation we start. - // so, waitForRequestFinished is equivalent to waitForRequestProgress. - return waitForRequestProgress(req, msecs); + Q_UNUSED(msecs); + Q_UNUSED(req); + + return true; } /*! * This slot is called some time after an asynchronous request is started. * It performs the required operation, sets the result and returns. */ -void QContactMemoryEngine::performAsynchronousOperation() +void QContactMemoryEngine::performAsynchronousOperation(QContactAbstractRequest *currentRequest) { - QContactAbstractRequest *currentRequest; - - // take the first pending request and finish it - if (d->m_asynchronousOperations.isEmpty()) - return; - currentRequest = d->m_asynchronousOperations.dequeue(); - - // check to see if it is cancelling; if so, remove it from the queue and return. - if (currentRequest->state() == QContactAbstractRequest::CanceledState) { - return; - } - // store up changes, and emit signals once at the end of the (possibly batch) operation. QContactChangeSet changeSet; @@ -860,15 +688,16 @@ QContactFetchRequest* r = static_cast(currentRequest); QContactFilter filter = r->filter(); QList sorting = r->sorting(); - QStringList defs = r->definitionRestrictions(); + QContactFetchHint fetchHint = r->fetchHint(); QContactManager::Error operationError; - QList requestedContacts = QContactManagerEngine::contacts(filter, sorting, defs, operationError); + QList requestedContacts = contacts(filter, sorting, fetchHint, &operationError); // update the request with the results. if (!requestedContacts.isEmpty() || operationError != QContactManager::NoError) - updateContactFetchRequest(r, requestedContacts, operationError); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateContactFetchRequest(r, requestedContacts, operationError, QContactAbstractRequest::FinishedState); + else + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -879,11 +708,12 @@ QList sorting = r->sorting(); QContactManager::Error operationError = QContactManager::NoError; - QList requestedContactIds = QContactManagerEngine::contactIds(filter, sorting, operationError); + QList requestedContactIds = contactIds(filter, sorting, &operationError); if (!requestedContactIds.isEmpty() || operationError != QContactManager::NoError) - updateContactLocalIdFetchRequest(r, requestedContactIds, operationError); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateContactLocalIdFetchRequest(r, requestedContactIds, operationError, QContactAbstractRequest::FinishedState); + else + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -894,10 +724,9 @@ QContactManager::Error operationError = QContactManager::NoError; QMap errorMap; - saveContacts(&contacts, &errorMap, operationError); + saveContacts(&contacts, &errorMap, &operationError); - updateContactSaveRequest(r, contacts, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateContactSaveRequest(r, contacts, operationError, errorMap, QContactAbstractRequest::FinishedState); } break; @@ -915,7 +744,7 @@ for (int i = 0; i < contactsToRemove.size(); i++) { QContactManager::Error tempError; - removeContact(contactsToRemove.at(i), changeSet, tempError); + removeContact(contactsToRemove.at(i), changeSet, &tempError); if (tempError != QContactManager::NoError) { errorMap.insert(i, tempError); @@ -924,8 +753,9 @@ } if (!errorMap.isEmpty() || operationError != QContactManager::NoError) - updateContactRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateContactRemoveRequest(r, operationError, errorMap, QContactAbstractRequest::FinishedState); + else + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -937,11 +767,11 @@ QMap requestedDefinitions; QStringList names = r->definitionNames(); if (names.isEmpty()) - names = detailDefinitions(r->contactType(), operationError).keys(); // all definitions. + 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); + QContactDetailDefinition current = detailDefinition(names.at(i), r->contactType(), &tempError); requestedDefinitions.insert(names.at(i), current); if (tempError != QContactManager::NoError) { @@ -951,8 +781,9 @@ } if (!errorMap.isEmpty() || !requestedDefinitions.isEmpty() || operationError != QContactManager::NoError) - updateDefinitionFetchRequest(r, requestedDefinitions, operationError, errorMap); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateDefinitionFetchRequest(r, requestedDefinitions, operationError, errorMap, QContactAbstractRequest::FinishedState); + else + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -967,7 +798,7 @@ QContactManager::Error tempError; for (int i = 0; i < definitions.size(); i++) { QContactDetailDefinition current = definitions.at(i); - saveDetailDefinition(current, r->contactType(), changeSet, tempError); + saveDetailDefinition(current, r->contactType(), changeSet, &tempError); savedDefinitions.append(current); if (tempError != QContactManager::NoError) { @@ -977,8 +808,7 @@ } // 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); + updateDefinitionSaveRequest(r, savedDefinitions, operationError, errorMap, QContactAbstractRequest::FinishedState); } break; @@ -992,7 +822,7 @@ for (int i = 0; i < names.size(); i++) { QContactManager::Error tempError; - removeDetailDefinition(names.at(i), r->contactType(), changeSet, tempError); + removeDetailDefinition(names.at(i), r->contactType(), changeSet, &tempError); if (tempError != QContactManager::NoError) { errorMap.insert(i, tempError); @@ -1001,8 +831,7 @@ } // there are no results, so just update the status with the error. - updateDefinitionRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateDefinitionRemoveRequest(r, operationError, errorMap, QContactAbstractRequest::FinishedState); } break; @@ -1011,7 +840,7 @@ QContactRelationshipFetchRequest* r = static_cast(currentRequest); QContactManager::Error operationError = QContactManager::NoError; QList operationErrors; - QList allRelationships = relationships(QString(), QContactId(), QContactRelationshipFilter::Either, operationError); + QList allRelationships = relationships(QString(), QContactId(), QContactRelationship::Either, &operationError); QList requestedRelationships; // select the requested relationships. @@ -1028,8 +857,9 @@ // update the request with the results. if (!requestedRelationships.isEmpty() || operationError != QContactManager::NoError) - updateRelationshipFetchRequest(r, requestedRelationships, operationError); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateRelationshipFetchRequest(r, requestedRelationships, operationError, QContactAbstractRequest::FinishedState); + else + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -1040,23 +870,12 @@ QList relationshipsToRemove = r->relationships(); QMap errorMap; - bool foundMatch = false; - for (int i = 0; i < relationshipsToRemove.size(); i++) { - QContactManager::Error tempError; - removeRelationship(relationshipsToRemove.at(i), tempError); - - if (tempError != QContactManager::NoError) { - errorMap.insert(i, tempError); - operationError = tempError; - } - } - - if (foundMatch == false && operationError == QContactManager::NoError) - operationError = QContactManager::DoesNotExistError; + removeRelationships(r->relationships(), &errorMap, &operationError); if (!errorMap.isEmpty() || operationError != QContactManager::NoError) - updateRelationshipRemoveRequest(r, operationError, errorMap); // emit resultsAvailable() - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateRelationshipRemoveRequest(r, operationError, errorMap, QContactAbstractRequest::FinishedState); + else + updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); } break; @@ -1066,23 +885,11 @@ QContactManager::Error operationError = QContactManager::NoError; QMap errorMap; QList requestRelationships = r->relationships(); - QList savedRelationships; - QContactManager::Error tempError; - for (int i = 0; i < requestRelationships.size(); i++) { - QContactRelationship current = requestRelationships.at(i); - saveRelationship(¤t, tempError); - savedRelationships.append(current); - - if (tempError != QContactManager::NoError) { - errorMap.insert(i, tempError); - operationError = tempError; - } - } + saveRelationships(&requestRelationships, &errorMap, &operationError); // update the request with the results. - updateRelationshipSaveRequest(r, savedRelationships, operationError, errorMap); // there will always be results of some form. emit resultsAvailable(). - updateRequestState(currentRequest, QContactAbstractRequest::FinishedState); + updateRelationshipSaveRequest(r, requestRelationships, operationError, errorMap, QContactAbstractRequest::FinishedState); } break; @@ -1091,7 +898,7 @@ } // now emit any signals we have to emit - changeSet.emitSignals(this); + d->emitSharedSignals(&changeSet); } /*! @@ -1123,16 +930,18 @@ /*! * \reimp */ -QStringList QContactMemoryEngine::supportedRelationshipTypes(const QString& contactType) const +bool QContactMemoryEngine::isRelationshipTypeSupported(const QString& relationshipType, const QString& contactType) const { - Q_UNUSED(contactType); - return QStringList() - << QContactRelationship::HasMember - << QContactRelationship::Aggregates - << QContactRelationship::IsSameAs - << QContactRelationship::HasAssistant - << QContactRelationship::HasManager - << QContactRelationship::HasSpouse; + // the memory backend supports arbitrary relationship types + // but some relationship types don't make sense for groups. + if (contactType == QContactType::TypeGroup) { + if (relationshipType == QContactRelationship::HasSpouse || relationshipType == QContactRelationship::HasAssistant) { + return false; + } + } + + // all other relationship types for all contact types are supported. + return true; } /*! @@ -1160,7 +969,7 @@ * 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 +bool QContactMemoryEngine::isFilterSupported(const QContactFilter& filter) const { Q_UNUSED(filter); // Until we add hashes for common stuff, fall back to slow code diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/engines/qcontactmemorybackend_p.h --- a/qtcontactsmobility/src/contacts/engines/qcontactmemorybackend_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/engines/qcontactmemorybackend_p.h Mon May 03 12:24:20 2010 +0300 @@ -75,6 +75,7 @@ QTM_BEGIN_NAMESPACE class QContactAbstractRequest; +class QContactManagerEngine; class QContactMemoryEngineData : public QSharedData { public: @@ -83,8 +84,7 @@ m_refCount(QAtomicInt(1)), m_selfContactId(0), m_nextContactId(1), - m_anonymous(false), - m_engineVersion(0) + m_anonymous(false) { } @@ -93,8 +93,7 @@ m_refCount(QAtomicInt(1)), m_selfContactId(other.m_selfContactId), m_nextContactId(other.m_nextContactId), - m_anonymous(other.m_anonymous), - m_engineVersion(0) + m_anonymous(other.m_anonymous) { } @@ -114,89 +113,113 @@ mutable QMap > m_definitions; // map of contact type to map of definition name to definitions. QContactLocalId m_nextContactId; bool m_anonymous; // Is this backend ever shared? - QString m_engineName; // name of this engine as supplied by factory (memory) - int m_engineVersion; // version of this engine as supplied by factory - QQueue m_asynchronousOperations; // async requests to be performed. + void emitSharedSignals(QContactChangeSet* cs) + { + foreach(QContactManagerEngine* engine, m_sharedEngines) + cs->emitSignals(engine); + } + + QList m_sharedEngines; // The list of engines that share this data }; -class Q_CONTACTS_EXPORT QContactMemoryEngine : public QContactManagerEngine +class QContactMemoryEngine : public QContactManagerEngine { Q_OBJECT public: - using QContactManagerEngine::contacts; + static QContactMemoryEngine *createMemoryEngine(const QMap& parameters); - static QContactMemoryEngine *createMemoryEngine(const QMap& parameters); - void deref(); + ~QContactMemoryEngine(); /* URI reporting */ QString managerName() const; QMap managerParameters() const; + /*! \reimp */ + int managerVersion() const {return 1;} + + virtual QList contactIds(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error* error) const; + virtual QList contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fetchHint, QContactManager::Error* error) const; + virtual QContact contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const; + + virtual bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error* error); + virtual bool removeContacts(const QList& contactIds, QMap* errorMap, QContactManager::Error* error); + + /*! \reimp */ + virtual QContact compatibleContact(const QContact& original, QContactManager::Error* error) const + { + return QContactManagerEngine::compatibleContact(original, error); + } + + /*! \reimp */ + virtual QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const + { + return QContactManagerEngine::synthesizedDisplayLabel(contact, error); + } /* "Self" contact id (MyCard) */ - bool setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error); - QContactLocalId selfContactId(QContactManager::Error& error) const; + virtual bool setSelfContactId(const QContactLocalId& contactId, QContactManager::Error* error); + virtual QContactLocalId selfContactId(QContactManager::Error* error) const; - /* Contacts - Accessors and Mutators */ - 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; + /* Relationships between contacts */ + virtual QList relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const; + virtual bool saveRelationships(QList* relationships, QMap* errorMap, QContactManager::Error* error); + virtual bool removeRelationships(const QList& relationships, QMap* errorMap, QContactManager::Error* error); - 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); - bool removeContacts(QList* contactIds, QMap* errorMap, QContactManager::Error& error); - bool removeContact(const QContactLocalId& contactId, QContactManager::Error& error); - - /* Relationships - Accessors and Mutators */ - 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); + /*! \reimp */ + virtual bool validateContact(const QContact& contact, QContactManager::Error* error) const + { + return QContactManagerEngine::validateContact(contact, error); + } + /*! \reimp */ + virtual bool validateDefinition(const QContactDetailDefinition& def, QContactManager::Error* error) const + { + return QContactManagerEngine::validateDefinition(def, error); + } /* Definitions - Accessors and Mutators */ - QMap detailDefinitions(const QString& contactType, QContactManager::Error& error) const; - bool saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error& error); - bool removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error& error); + virtual QMap detailDefinitions(const QString& contactType, QContactManager::Error* error) const; + /*! \reimp */ + virtual QContactDetailDefinition detailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error) const + { + return QContactManagerEngine::detailDefinition(definitionId, contactType, error); + } + virtual bool saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error* error); + virtual bool removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error); /* Asynchronous Request Support */ - void requestDestroyed(QContactAbstractRequest* req); - bool startRequest(QContactAbstractRequest* req); - bool cancelRequest(QContactAbstractRequest* req); - bool waitForRequestProgress(QContactAbstractRequest* req, int msecs); - bool waitForRequestFinished(QContactAbstractRequest* req, int msecs); + virtual void requestDestroyed(QContactAbstractRequest* req); + virtual bool startRequest(QContactAbstractRequest* req); + virtual bool cancelRequest(QContactAbstractRequest* req); + virtual bool waitForRequestFinished(QContactAbstractRequest* req, int msecs); /* 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; - - /* Version Reporting */ - int implementationVersion() const; + virtual bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const; + virtual bool isRelationshipTypeSupported(const QString& relationshipType, const QString& contactType) const; + virtual bool isFilterSupported(const QContactFilter& filter) const; + virtual QList supportedDataTypes() const; + /*! \reimp */ + virtual QStringList supportedContactTypes() const + { + return QContactManagerEngine::supportedContactTypes(); + } protected: - QContactMemoryEngine(const QMap& parameters); - -private slots: - void performAsynchronousOperation(); + QContactMemoryEngine(QContactMemoryEngineData* data); private: /* Implement "signal coalescing" for batch functions via change set */ - bool saveContact(QContact* theContact, QContactChangeSet& changeSet, QContactManager::Error& error); - bool removeContact(const QContactLocalId& contactId, QContactChangeSet& changeSet, QContactManager::Error& error); - bool saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactChangeSet& changeSet, QContactManager::Error& error); - bool removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactChangeSet& changeSet, QContactManager::Error& error); - bool saveRelationship(QContactRelationship* relationship, QContactChangeSet& changeSet, QContactManager::Error& error); - bool removeRelationship(const QContactRelationship& relationship, QContactChangeSet& changeSet, QContactManager::Error& error); + bool saveContact(QContact* theContact, QContactChangeSet& changeSet, QContactManager::Error* error); + bool removeContact(const QContactLocalId& contactId, QContactChangeSet& changeSet, QContactManager::Error* error); + bool saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactChangeSet& changeSet, QContactManager::Error* error); + bool removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactChangeSet& changeSet, QContactManager::Error* error); + bool saveRelationship(QContactRelationship* relationship, QContactChangeSet& changeSet, QContactManager::Error* error); + bool removeRelationship(const QContactRelationship& relationship, QContactChangeSet& changeSet, QContactManager::Error* error); + + void performAsynchronousOperation(QContactAbstractRequest* request); QContactMemoryEngineData* d; - static QMap engines; + static QMap engineDatas; }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/filters/qcontactlocalidfilter.h --- a/qtcontactsmobility/src/contacts/filters/qcontactlocalidfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/filters/qcontactlocalidfilter.h Mon May 03 12:24:20 2010 +0300 @@ -43,6 +43,7 @@ #define QCONTACTLOCALIDFILTER_H #include "qcontactfilter.h" +#include "qcontactid.h" QTM_BEGIN_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.cpp --- a/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.cpp Mon May 03 12:24:20 2010 +0300 @@ -80,8 +80,9 @@ Q_IMPLEMENT_CONTACTFILTER_PRIVATE(QContactRelationshipFilter) /*! + \deprecated \enum QContactRelationshipFilter::Role - Describes the roles that a contact may take in a relationship + Describes the roles that a contact may take in a relationship. DEPRECATED: use QContactRelationship::Role instead! \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 @@ -137,9 +138,32 @@ } /*! + \deprecated + 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. + This function is deprecated and will be removed after the transition period has elapsed. Use setRelatedContactRole(QContactRelationship::Role role) instead! + */ +void QContactRelationshipFilter::setRelatedContactRole(QContactRelationshipFilter::Role relatedContactRole) +{ + Q_D(QContactRelationshipFilter); + d->m_relatedContactRole = static_cast(relatedContactRole); +} + +///*! +// \deprecated +// 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. +// This function is deprecated and will be removed after the transition period has elapsed. Use relatedContactRole() which returns a QContactRelationship::Role instead! +// Note: since signature is the same, this function cannot be deprecated properly. This causes a source break! +// */ +//QContactRelationshipFilter::Role QContactRelationshipFilter::relatedContactRole() const +//{ +// Q_D(const QContactRelationshipFilter); +// return d->m_relatedContactRole; +//} + +/*! 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) +void QContactRelationshipFilter::setRelatedContactRole(QContactRelationship::Role relatedContactRole) { Q_D(QContactRelationshipFilter); d->m_relatedContactRole = relatedContactRole; @@ -148,14 +172,14 @@ /*! 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 +QContactRelationship::Role QContactRelationshipFilter::relatedContactRole() const { Q_D(const QContactRelationshipFilter); return d->m_relatedContactRole; } /*! - \internal + \deprecated 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 @@ -167,19 +191,19 @@ Q_D(QContactRelationshipFilter); switch(roleInRelationship) { case QContactRelationshipFilter::Either: - d->m_relatedContactRole = QContactRelationshipFilter::Either; + d->m_relatedContactRole = QContactRelationship::Either; break; case QContactRelationshipFilter::First: - d->m_relatedContactRole = QContactRelationshipFilter::Second; + d->m_relatedContactRole = QContactRelationship::Second; break; case QContactRelationshipFilter::Second: - d->m_relatedContactRole = QContactRelationshipFilter::First; + d->m_relatedContactRole = QContactRelationship::First; break; } } /*! - \internal + \deprecated 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 */ @@ -190,7 +214,7 @@ } /*! - \internal + \deprecated Returns the role that a contact must have in a relationship in order to match the filter */ QContactRelationshipFilter::Role QContactRelationshipFilter::role() const @@ -208,7 +232,7 @@ } /*! - \internal + \deprecated Returns the id of another contact with whom a contact must have a relationship in order to match the filter */ QContactId QContactRelationshipFilter::otherParticipantId() const diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.h --- a/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter.h Mon May 03 12:24:20 2010 +0300 @@ -45,6 +45,7 @@ #include "qtcontactsglobal.h" #include "qcontactfilter.h" #include "qcontactid.h" +#include "qcontactrelationship.h" #include #include @@ -60,6 +61,8 @@ QContactRelationshipFilter(); QContactRelationshipFilter(const QContactFilter& other); + // this enum is DEPRECATED - use QContactRelationship::Role instead! + // enum Q_DECL_VARIABLE_DEPRECATED Role { enum Role { First = 0, Second, @@ -68,11 +71,13 @@ void setRelationshipType(const QString& relationshipType); void setRelatedContactId(const QContactId& relatedContactId); - void setRelatedContactRole(QContactRelationshipFilter::Role relatedContactRole); + void setRelatedContactRole(QContactRelationship::Role relatedContactRole); + void Q_DECL_DEPRECATED setRelatedContactRole(QContactRelationshipFilter::Role relatedContactRole); QString relationshipType() const; QContactId relatedContactId() const; - QContactRelationshipFilter::Role relatedContactRole() const; + QContactRelationship::Role relatedContactRole() const; + //QContactRelationshipFilter::Role Q_DECL_DEPRECATED relatedContactRole() const; // cannot deprecated as signature is the same. // deprecated and will be removed after transition period has elapsed. replaced by setRelatedContactRole / setRelatedContactId. void Q_DECL_DEPRECATED setRole(QContactRelationshipFilter::Role roleInRelationship); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter_p.h --- a/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/filters/qcontactrelationshipfilter_p.h Mon May 03 12:24:20 2010 +0300 @@ -56,6 +56,7 @@ #include "qcontactfilter_p.h" #include "qcontactfilter.h" #include "qcontactid.h" +#include "qcontactrelationship.h" #include "qcontactrelationshipfilter.h" @@ -70,7 +71,7 @@ public: QContactRelationshipFilterPrivate() : QContactFilterPrivate(), - m_relatedContactRole(QContactRelationshipFilter::Either) + m_relatedContactRole(QContactRelationship::Either) { } @@ -98,7 +99,7 @@ QString m_relationshipType; QContactId m_relatedContactId; - QContactRelationshipFilter::Role m_relatedContactRole; + QContactRelationship::Role m_relatedContactRole; }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontact.cpp --- a/qtcontactsmobility/src/contacts/qcontact.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontact.cpp Mon May 03 12:24:20 2010 +0300 @@ -40,6 +40,7 @@ ****************************************************************************/ #include +#include #include "qcontact.h" #include "qcontact_p.h" @@ -52,7 +53,7 @@ /*! \class QContact - \brief The QContact class provides an addressbook contact. + \brief The QContact class represents an addressbook contact. \ingroup contacts-main @@ -60,7 +61,7 @@ An instance of the QContact class represents an in-memory contact, and may not reflect the state of that contact found in persistent - storage until the appropriate synchronisation method is called + storage until the appropriate synchronization method is called on the QContactManager (i.e., saveContact, removeContact). \sa QContactManager, QContactDetail @@ -230,7 +231,8 @@ d->m_id = id; } -/*! Returns the first detail stored in the contact which is of the given \a definitionName */ +/*! Returns the first detail stored in the contact which is of the given \a definitionName +*/ QContactDetail QContact::detail(const QString& definitionName) const { // build the sub-list of matching details. @@ -244,7 +246,14 @@ return QContactDetail(); } -/*! Returns a list of details of the given \a definitionName */ +/*! Returns a list of details of the given \a definitionName + The definitionName string can be determined by the DefinitionName attribute + of defined objects (e.g. QContactPhoneNumber::DefinitionName) or by + requesting a list of all the definition names using + \l {QContactManager::detailDefinitions()}{detailDefinitions()} or the + asynchronous \l + {QContactDetailDefinitionFetchRequest::definitionNames()}{definitionNames()}. +*/ QList QContact::details(const QString& definitionName) const { // build the sub-list of matching details. @@ -265,7 +274,14 @@ return sublist; } -/*! Returns a list of details of the given \a definitionName, \a fieldName and field \a value*/ +/*! Returns a list of details of the given \a definitionName, \a fieldName and field \a value + The definitionName string can be determined by the DefinitionName attribute + of defined objects (e.g. QContactPhoneNumber::DefinitionName) or by + requesting a list of all the definition names using + \l {QContactManager::detailDefinitions()}{detailDefinitions()} or the + asynchronous \l + {QContactDetailDefinitionFetchRequest::definitionNames()}{definitionNames()}. +*/ QList QContact::details(const QString& definitionName, const QString& fieldName, const QString& value) const { // build the sub-list of matching details. @@ -406,6 +422,24 @@ other.d->m_details == d->m_details; } +/*! Returns the hash value for \a key. */ +uint qHash(const QContact &key) +{ + uint hash = qHash(key.id()); + foreach (const QContactDetail& detail, key.details()) { + hash += qHash(detail); + } + return hash; +} + +QDebug operator<<(QDebug dbg, const QContact& contact) +{ + dbg.nospace() << "QContact(" << contact.id() << ")"; + foreach (const QContactDetail& detail, contact.details()) { + dbg.space() << '\n' << detail; + } + return dbg.maybeSpace(); +} /*! Retrieve the first detail for which the given \a actionName is available */ QContactDetail QContact::detailWithAction(const QString& actionName) const @@ -434,7 +468,7 @@ QContactAction *currImpl = QContactManagerData::action(descriptors.at(i)); for (int i = 0; i < d->m_details.size(); i++) { QContactDetail detail = d->m_details.at(i); - if (currImpl->supportsDetail(detail)) { + if (currImpl->isDetailSupported(detail, *this)) { retn.append(detail); break; } @@ -470,10 +504,13 @@ } /*! - * \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 + \deprecated + 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. + + This function is deprecated and will be removed after the transition period has elapsed. + Use the relatedContacts() function which takes a QContactRelationship::Role argument instead! */ QList QContact::relatedContacts(const QString& relationshipType, QContactRelationshipFilter::Role role) const { @@ -512,7 +549,48 @@ } /*! - * \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, QContactRelationship::Role role) const +{ + QList retn; + for (int i = 0; i < d->m_relationshipsCache.size(); i++) { + QContactRelationship curr = d->m_relationshipsCache.at(i); + if (relationshipType.isEmpty() || curr.relationshipType() == relationshipType) { + // check that the other contacts fill the given role + if (role == QContactRelationship::First) { + if (curr.first() != d->m_id) { + if (!retn.contains(curr.first())) { + retn.append(curr.first()); + } + } + } else if (role == QContactRelationship::Second) { + if (curr.first() == d->m_id) { + if (!retn.contains(curr.second())) { + retn.append(curr.second()); + } + } + } else { // role == Either. + if (curr.first() == d->m_id) { + if (!retn.contains(curr.second())) { + retn.append(curr.second()); + } + } else { + if (!retn.contains(curr.first())) { + retn.append(curr.first()); + } + } + } + } + } + + return retn; +} + +/*! + * \deprecated * 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. @@ -522,6 +600,8 @@ * its relationships will result in an error occurring. The updated relationships list must be retrieved from the manager, reordered and set * in the contact before the contact can be saved successfully. * + * This function is deprecated and will be removed after the transition period has elapsed. + * * \sa relationships(), relationshipOrder() */ void QContact::setRelationshipOrder(const QList& reordered) @@ -530,10 +610,12 @@ } /*! - * \preliminary + * \deprecated * 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(). * + * This function is deprecated and will be removed after the transition period has elapsed. + * * \sa setRelationshipOrder() */ QList QContact::relationshipOrder() const @@ -573,8 +655,10 @@ /*! * \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 + * true if the detail exists in the contact and was successfully set as the preferred detail for the action + * identified by \a actionName, otherwise returns false. + * Note that since QContact is a value class, no error checking is done on the action name + * (to ensure that an action of that name is available) in this function. */ bool QContact::setPreferredDetail(const QString& actionName, const QContactDetail& preferredDetail) { @@ -638,4 +722,22 @@ return retn; } + + +/*! + * \preliminary + * Returns a map of action name to the preferred detail for the action of that name. + */ +QMap QContact::preferredDetails() const +{ + QMap ret; + QMap::const_iterator it = d->m_preferences.constBegin(); + while (it != d->m_preferences.constEnd()) { + ret.insert(it.key(), d->m_details.at(it.value())); + ++it; + } + + return ret; +} + QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontact.h --- a/qtcontactsmobility/src/contacts/qcontact.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontact.h Mon May 03 12:24:20 2010 +0300 @@ -135,9 +135,10 @@ /* Relationships that this contact was involved in when it was retrieved from the manager */ QList relationships(const QString& relationshipType = QString()) const; - QList relatedContacts(const QString& relationshipType = QString(), QContactRelationshipFilter::Role role = QContactRelationshipFilter::Either) const; - void setRelationshipOrder(const QList& reordered); - QList relationshipOrder() const; + QList relatedContacts(const QString& relationshipType = QString(), QContactRelationship::Role role = QContactRelationship::Either) const; + QList Q_DECL_DEPRECATED relatedContacts(const QString& relationshipType, QContactRelationshipFilter::Role role) const; + void Q_DECL_DEPRECATED setRelationshipOrder(const QList& reordered); + QList Q_DECL_DEPRECATED relationshipOrder() const; /* Actions available to be performed on this contact */ QList availableActions(const QString& vendorName = QString(), int implementationVersion = -1) const; @@ -146,6 +147,7 @@ bool setPreferredDetail(const QString& actionName, const QContactDetail& preferredDetail); bool isPreferredDetail(const QString& actionName, const QContactDetail& detail) const; QContactDetail preferredDetail(const QString& actionName) const; + QMap preferredDetails() const; private: friend class QContactManager; @@ -155,6 +157,11 @@ QSharedDataPointer d; }; +Q_CONTACTS_EXPORT uint qHash(const QContact& key); +#ifndef QT_NO_DEBUG_STREAM +Q_CONTACTS_EXPORT QDebug operator<<(QDebug dbg, const QContact& contact); +#endif + QTM_END_NAMESPACE Q_DECLARE_TYPEINFO(QTM_PREPEND_NAMESPACE(QContact), Q_MOVABLE_TYPE); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactabstractrequest.cpp --- a/qtcontactsmobility/src/contacts/qcontactabstractrequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactabstractrequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -92,17 +92,6 @@ */ /*! - \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 @@ -116,7 +105,10 @@ Constructs a new, invalid asynchronous request */ -/*! Constructs a new request from the given request data \a otherd */ +/*! + \deprecated + Constructs a new request from the given request data \a otherd +*/ QContactAbstractRequest::QContactAbstractRequest(QContactAbstractRequestPrivate* otherd) : d_ptr(otherd) { @@ -182,8 +174,9 @@ } /*! - \internal + \deprecated 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. + This function is deprecated and will be removed after the transition period has elapsed. Use errorMap() instead. */ QList QContactAbstractRequest::errors() const { @@ -199,15 +192,6 @@ } /*! - \internal - Returns the current status of the request. - */ -QContactAbstractRequest::Status QContactAbstractRequest::status() const -{ - return static_cast(d_ptr->m_state); -} - -/*! Returns the current state of the request. */ QContactAbstractRequest::State QContactAbstractRequest::state() const @@ -276,28 +260,6 @@ return false; // unable to wait for operation; not in progress or no engine. } -/*! \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) { - 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. -} - #include "moc_qcontactabstractrequest.cpp" QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactabstractrequest.h --- a/qtcontactsmobility/src/contacts/qcontactabstractrequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactabstractrequest.h Mon May 03 12:24:20 2010 +0300 @@ -57,18 +57,8 @@ QContactAbstractRequest() {} virtual ~QContactAbstractRequest(); - enum Status { // replaced by the state enum. - Inactive = 0, // operation not yet started - Active, // operation started, not yet finished - Cancelled, // operation is finished due to cancellation - Finished, // operation successfully completed - Cancelling // operation started then cancelled, not yet finished // moved to end so that (deprecated) status() impl is simple. - }; - 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. + enum State { InactiveState = 0, // operation not yet started ActiveState, // operation started, not yet finished CanceledState, // operation is finished due to cancellation @@ -102,20 +92,15 @@ QContactManager* manager() const; void setManager(QContactManager* manager); -public slots: +public Q_SLOTS: /* Verbs */ bool start(); bool cancel(); /* waiting for stuff */ bool waitForFinished(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: +Q_SIGNALS: void stateChanged(QContactAbstractRequest::State newState); void resultsAvailable(); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactaction.cpp --- a/qtcontactsmobility/src/contacts/qcontactaction.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactaction.cpp Mon May 03 12:24:20 2010 +0300 @@ -57,6 +57,7 @@ \brief The QContactAction class provides an interface for performing an action on a QContact or QContactDetail. \ingroup contacts-main + \ingroup contacts-actions An action is anything that can be performed on a contact, or a detail of a contact. An example of an action might be "Send Email" or "Dial" or "Plot Navigation Route". One action may be @@ -93,12 +94,6 @@ */ /*! - \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 meta-data associated with this action, such as icons, labels or sound cues */ @@ -128,7 +123,7 @@ QList ret; QList details = contact.details(); for (int j=0; j < details.count(); j++) { - if (supportsDetail(details.at(j))) + if (isDetailSupported(details.at(j), contact)) ret.append(details.at(j)); } return ret; @@ -151,17 +146,6 @@ */ /*! - \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::State Describes the current status of the asynchronous action operation \value InactiveState The operation has not yet been initiated @@ -172,19 +156,6 @@ */ /*! - \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. diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactaction.h --- a/qtcontactsmobility/src/contacts/qcontactaction.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactaction.h Mon May 03 12:24:20 2010 +0300 @@ -73,40 +73,32 @@ virtual ~QContactAction() = 0; virtual QContactActionDescriptor actionDescriptor() const = 0; // the descriptor which uniquely identifies this action - 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 - virtual QList supportedDetails(const QContact& contact) const; + virtual bool isDetailSupported(const QContactDetail &detail, const QContact &contact = QContact()) const = 0; + virtual QList supportedDetails(const QContact& contact) const = 0; /* Initiate the asynchronous action on the given contact (and optionally detail) */ - virtual void invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()) = 0; + virtual bool invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail(), const QVariantMap& parameters = QVariantMap()) = 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 + FinishedDetachedState, // operation started, no further information available - name under discussion. FinishedWithErrorState // operation finished, but error occurred }; - /* The possible statuses of an action - DEPRECATED to be replaced by State */ - enum Status { - 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 - }; + virtual State state() const = 0; - /* Returns the most recently received result, or an invalid QVariantMap if no results received */ - virtual QVariantMap result() const = 0; + /* Returns the most recently received result, or an empty QVariantMap if no results received */ + virtual QVariantMap results() const = 0; -signals: - void progress(QContactAction::Status status, const QVariantMap& result); // deprecated by the following signal - void progress(QContactAction::State state, const QVariantMap& result); // replaces the above +Q_SIGNALS: + void stateChanged(QContactAction::State); + void resultsAvailable(); }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactactiondescriptor.cpp --- a/qtcontactsmobility/src/contacts/qcontactactiondescriptor.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactactiondescriptor.cpp Mon May 03 12:24:20 2010 +0300 @@ -41,6 +41,7 @@ #include "qcontactactiondescriptor.h" #include "qcontactactiondescriptor_p.h" +#include QTM_BEGIN_NAMESPACE @@ -48,6 +49,7 @@ \class QContactActionDescriptor \brief The QContactActionDescriptor class provides information that uniquely identifies a specific implementation of an action + \ingroup contacts-actions */ /*! @@ -166,4 +168,28 @@ return !(*this == other); } +/*! + * Returns true if the action descriptor is less than the \a other action descriptor. The + * comparison is performed first on the vendor name, then the action name, then the implementation + * version. + */ +bool QContactActionDescriptor::operator<(const QContactActionDescriptor& other) const +{ + int comp = d->m_vendorName.compare(other.d->m_vendorName); + if (comp != 0) + return comp < 0; + comp = d->m_actionName.compare(other.d->m_actionName); + if (comp != 0) + return comp < 0; + return d->m_implementationVersion < other.d->m_implementationVersion; +} + +/*! Returns the hash value for \a key. */ +uint qHash(const QContactActionDescriptor& key) +{ + return QT_PREPEND_NAMESPACE(qHash)(key.vendorName()) + + QT_PREPEND_NAMESPACE(qHash)(key.actionName()) + + QT_PREPEND_NAMESPACE(qHash)(key.implementationVersion()); +} + QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactactiondescriptor.h --- a/qtcontactsmobility/src/contacts/qcontactactiondescriptor.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactactiondescriptor.h Mon May 03 12:24:20 2010 +0300 @@ -53,7 +53,7 @@ class Q_CONTACTS_EXPORT QContactActionDescriptor { public: - QContactActionDescriptor(const QString& actionName = QString(), const QString& vendorName = QString(), int vendorVersion = -1); + explicit QContactActionDescriptor(const QString& actionName = QString(), const QString& vendorName = QString(), int vendorVersion = -1); QContactActionDescriptor(const QContactActionDescriptor& other); QContactActionDescriptor& operator=(const QContactActionDescriptor& other); ~QContactActionDescriptor(); @@ -61,6 +61,7 @@ bool isEmpty() const; bool operator==(const QContactActionDescriptor& other) const; bool operator!=(const QContactActionDescriptor& other) const; + bool operator<(const QContactActionDescriptor& other) const; void setActionName(const QString& actionName); void setVendorName(const QString& vendorName); @@ -74,6 +75,8 @@ QSharedDataPointer d; }; +Q_CONTACTS_EXPORT uint qHash(const QContactActionDescriptor& key); + QTM_END_NAMESPACE Q_DECLARE_TYPEINFO(QTM_PREPEND_NAMESPACE(QContactActionDescriptor), Q_MOVABLE_TYPE); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactactionfactory.cpp --- a/qtcontactsmobility/src/contacts/qcontactactionfactory.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactactionfactory.cpp Mon May 03 12:24:20 2010 +0300 @@ -47,17 +47,13 @@ \class QContactActionFactory \brief The QContactActionFactory class provides an interface for clients to retrieve instances of action implementations + \ingroup contacts-actions */ QContactActionFactory::~QContactActionFactory() { } -uint qHash(const QContactActionDescriptor& ad) -{ - return qHash(ad.actionName()) + qHash(ad.vendorName()) + ad.implementationVersion(); -} - /*! * \fn QContactActionFactory::~QContactActionFactory() * Clears any memory in use by this factory diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactactionfactory.h --- a/qtcontactsmobility/src/contacts/qcontactactionfactory.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactactionfactory.h Mon May 03 12:24:20 2010 +0300 @@ -69,12 +69,12 @@ virtual QVariantMap actionMetadata(const QContactActionDescriptor& descriptor) const = 0; }; -uint qHash(const QContactActionDescriptor& ad); - QTM_END_NAMESPACE +QT_BEGIN_NAMESPACE #define QT_CONTACTS_ACTION_FACTORY_INTERFACE "com.nokia.qt.mobility.contacts.actionfactory/1.0" Q_DECLARE_INTERFACE(QtMobility::QContactActionFactory, QT_CONTACTS_ACTION_FACTORY_INTERFACE); +QT_END_NAMESPACE #endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactchangeset.cpp --- a/qtcontactsmobility/src/contacts/qcontactchangeset.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactchangeset.cpp Mon May 03 12:24:20 2010 +0300 @@ -113,59 +113,207 @@ } /*! - Returns a reference to the set of ids of contacts which have been added to + Returns the set of ids of contacts which have been added to the database. */ -QSet& QContactChangeSet::addedContacts() +QSet QContactChangeSet::addedContacts() const { return d->m_addedContacts; } /*! - Returns a reference to the set of ids of contacts which have been changed in + Inserts the given contact id \a addedContactId into the set of ids of contacts + which have been added to the database. + */ +void QContactChangeSet::insertAddedContact(QContactLocalId addedContactId) +{ + d->m_addedContacts.insert(addedContactId); +} + +/*! + Inserts each of the given contact ids \a addedContactIds into the set of ids of contacts + which have been added to the database. + */ +void QContactChangeSet::insertAddedContacts(const QList& addedContactIds) +{ + foreach (const QContactLocalId& id, addedContactIds) + d->m_addedContacts.insert(id); +} + +/*! + Clears the set of ids of contacts which have been added to the database + */ +void QContactChangeSet::clearAddedContacts() +{ + d->m_addedContacts.clear(); +} + +/*! + Returns the set of ids of contacts which have been changed in the database. */ -QSet& QContactChangeSet::changedContacts() +QSet QContactChangeSet::changedContacts() const { return d->m_changedContacts; } /*! - Returns a reference to the set of ids of contacts which have been removed from + Inserts the given contact id \a changedContactId into the set of ids of contacts + which have been changed to the database. + */ +void QContactChangeSet::insertChangedContact(QContactLocalId changedContactId) +{ + d->m_changedContacts.insert(changedContactId); +} + +/*! + Inserts each of the given contact ids \a changedContactIds into the set of ids of contacts + which have been changed to the database. + */ +void QContactChangeSet::insertChangedContacts(const QList& changedContactIds) +{ + foreach (const QContactLocalId& id, changedContactIds) + d->m_changedContacts.insert(id); +} + +/*! + Clears the set of ids of contacts which have been changed to the database + */ +void QContactChangeSet::clearChangedContacts() +{ + d->m_changedContacts.clear(); +} + +/*! + Returns the set of ids of contacts which have been removed from the database. */ -QSet& QContactChangeSet::removedContacts() +QSet QContactChangeSet::removedContacts() const { return d->m_removedContacts; } /*! - Returns a reference to the set of ids of contacts which have been affected + Inserts the given contact id \a removedContactId into the set of ids of contacts + which have been removed to the database. + */ +void QContactChangeSet::insertRemovedContact(QContactLocalId removedContactId) +{ + d->m_removedContacts.insert(removedContactId); +} + +/*! + Inserts each of the given contact ids \a removedContactIds into the set of ids of contacts + which have been removed to the database. + */ +void QContactChangeSet::insertRemovedContacts(const QList& removedContactIds) +{ + foreach (const QContactLocalId& id, removedContactIds) + d->m_removedContacts.insert(id); +} + +/*! + Clears the set of ids of contacts which have been removed to the database + */ +void QContactChangeSet::clearRemovedContacts() +{ + d->m_removedContacts.clear(); +} + +/*! + Returns the set of ids of contacts which have been affected by the addition of relationships to the database. */ -QSet& QContactChangeSet::addedRelationshipsContacts() +QSet QContactChangeSet::addedRelationshipsContacts() const { return d->m_addedRelationships; } /*! - Returns a reference to the set of ids of contacts which have been affected + Inserts the given contact id \a affectedContactId into the set of ids of contacts + which have been affected by the addition of a relationship to the database. + */ +void QContactChangeSet::insertAddedRelationshipsContact(QContactLocalId affectedContactId) +{ + d->m_addedRelationships.insert(affectedContactId); +} + +/*! + Inserts each of the given contact ids \a affectedContactIds into the set of ids of contacts + which have been affected by the addition of a relationship to the database. + */ +void QContactChangeSet::insertAddedRelationshipsContacts(const QList& affectedContactIds) +{ + foreach (const QContactLocalId& id, affectedContactIds) + d->m_addedRelationships.insert(id); +} + +/*! + Clears the set of ids of contacts which have been affected by the addition of a relationship to the database. + */ +void QContactChangeSet::clearAddedRelationshipsContacts() +{ + d->m_addedRelationships.clear(); +} + +/*! + Returns the set of ids of contacts which have been affected by the removal of relationships from the database. */ -QSet& QContactChangeSet::removedRelationshipsContacts() +QSet QContactChangeSet::removedRelationshipsContacts() const { return d->m_removedRelationships; } /*! - Returns a reference to the pair of ids which represents the + Inserts the given contact id \a affectedContactId into the set of ids of contacts + which have been affected by the removal of a relationship to the database. + */ +void QContactChangeSet::insertRemovedRelationshipsContact(QContactLocalId affectedContactId) +{ + d->m_removedRelationships.insert(affectedContactId); +} + +/*! + Inserts each of the given contact ids \a affectedContactIds into the set of ids of contacts + which have been affected by the removal of a relationship to the database. + */ +void QContactChangeSet::insertRemovedRelationshipsContacts(const QList& affectedContactIds) +{ + foreach (const QContactLocalId& id, affectedContactIds) + d->m_removedRelationships.insert(id); +} + +/*! + Clears the set of ids of contacts which have been affected by the removal of a relationship to the database. + */ +void QContactChangeSet::clearRemovedRelationshipsContacts() +{ + d->m_removedRelationships.clear(); +} + +/*! + Sets the pair of ids which represent the old and new self contact ids + to the given pair of ids \a oldAndNewContactId. + The first id in the pair is the old self contact id, while the second + id in the pair is the new self contact id. If the new id is different + to the old id at the point in time when emitSignals() is called, + the QContactManagerEngine::selfContactIdChanged signal will be emitted. + */ +void QContactChangeSet::setOldAndNewSelfContactId(const QPair &oldAndNewContactId) +{ + d->m_oldAndNewSelfContactId = oldAndNewContactId; +} + +/*! + Returns the pair of ids which represents the old and new self contact ids. The first id in the pair is the old self contact id, while the second id in the pair is the new self contact id. If the new id is different to the old id at the point in time when emitSignals() is called, the QContactManagerEngine::selfContactIdChanged() signal will be emitted. */ -QPair& QContactChangeSet::oldAndNewSelfContactId() +QPair QContactChangeSet::oldAndNewSelfContactId() const { return d->m_oldAndNewSelfContactId; } @@ -173,7 +321,7 @@ /*! Clears all flags and sets of ids in this change set */ -void QContactChangeSet::clear() +void QContactChangeSet::clearAll() { d->m_dataChanged = false; d->m_addedContacts.clear(); @@ -210,4 +358,99 @@ } } + +/*! + \deprecated + Returns a reference to the set of ids of contacts which have been added to + the database. + + Don't use this.. use the const version instead. + */ +QSet& QContactChangeSet::addedContacts() +{ + return d->m_addedContacts; +} + +/*! + \deprecated + Returns a reference to the set of ids of contacts which have been changed in + the database. + + Don't use this.. use the const version instead. + */ +QSet& QContactChangeSet::changedContacts() +{ + return d->m_changedContacts; +} + +/*! + \deprecated + Returns a reference to the set of ids of contacts which have been removed from + the database. + + Don't use this.. use the const version instead. + */ +QSet& QContactChangeSet::removedContacts() +{ + return d->m_removedContacts; +} + +/*! + \deprecated + Returns a reference to the set of ids of contacts which have been affected + by the addition of relationships to the database. + + Don't use this.. use the const version instead. + */ +QSet& QContactChangeSet::addedRelationshipsContacts() +{ + return d->m_addedRelationships; +} + +/*! + \deprecated + Returns a reference to the set of ids of contacts which have been affected + by the removal of relationships from the database. + + Don't use this.. use the const version instead. + */ +QSet& QContactChangeSet::removedRelationshipsContacts() +{ + return d->m_removedRelationships; +} + +/*! + \deprecated + Returns a reference to the pair of ids which represents the + old and new self contact ids. The first id in the pair is the + old self contact id, while the second id in the pair is the + new self contact id. If the new id is different to the old id + at the point in time when emitSignals() is called, + the QContactManagerEngine::selfContactIdChanged() signal will be emitted. + + Don't use this.. use the const version instead. + */ +QPair& QContactChangeSet::oldAndNewSelfContactId() +{ + return d->m_oldAndNewSelfContactId; +} + +/*! + \deprecated + Clears all flags and sets of ids in this change set + + Use clearAll() instead. + */ +void QContactChangeSet::clear() +{ + d->m_dataChanged = false; + d->m_addedContacts.clear(); + d->m_changedContacts.clear(); + d->m_removedContacts.clear(); + d->m_addedRelationships.clear(); + d->m_removedRelationships.clear(); + d->m_oldAndNewSelfContactId = QPair(); +} + + QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactchangeset.h --- a/qtcontactsmobility/src/contacts/qcontactchangeset.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactchangeset.h Mon May 03 12:24:20 2010 +0300 @@ -44,6 +44,7 @@ #define QCONTACTCHANGESET_H #include "qtcontactsglobal.h" +#include "qcontactid.h" #include #include @@ -65,14 +66,44 @@ void setDataChanged(bool dataChanged); bool dataChanged(); - QSet& addedContacts(); - QSet& changedContacts(); - QSet& removedContacts(); - QSet& addedRelationshipsContacts(); - QSet& removedRelationshipsContacts(); - QPair& oldAndNewSelfContactId(); + QSet Q_DECL_DEPRECATED & addedContacts(); + QSet Q_DECL_DEPRECATED & changedContacts(); + QSet Q_DECL_DEPRECATED & removedContacts(); + QSet Q_DECL_DEPRECATED & addedRelationshipsContacts(); + QSet Q_DECL_DEPRECATED & removedRelationshipsContacts(); + QPair Q_DECL_DEPRECATED & oldAndNewSelfContactId(); + + void Q_DECL_DEPRECATED clear(); + + QSet addedContacts() const; + void insertAddedContact(QContactLocalId addedContactId); + void insertAddedContacts(const QList& addedContactIds); + void clearAddedContacts(); + + QSet changedContacts() const; + void insertChangedContact(QContactLocalId addedContactId); + void insertChangedContacts(const QList& addedContactIds); + void clearChangedContacts(); - void clear(); + QSet removedContacts() const; + void insertRemovedContact(QContactLocalId addedContactId); + void insertRemovedContacts(const QList& addedContactIds); + void clearRemovedContacts(); + + QSet addedRelationshipsContacts() const; + void insertAddedRelationshipsContact(QContactLocalId affectedContactId); + void insertAddedRelationshipsContacts(const QList& affectedContactIds); + void clearAddedRelationshipsContacts(); + + QSet removedRelationshipsContacts() const; + void insertRemovedRelationshipsContact(QContactLocalId affectedContactId); + void insertRemovedRelationshipsContacts(const QList& affectedContactIds); + void clearRemovedRelationshipsContacts(); + + void setOldAndNewSelfContactId(const QPair& oldAndNewContactId); + QPair oldAndNewSelfContactId() const; + + void clearAll(); void emitSignals(QContactManagerEngine *engine); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactdetail.cpp --- a/qtcontactsmobility/src/contacts/qcontactdetail.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactdetail.cpp Mon May 03 12:24:20 2010 +0300 @@ -42,6 +42,7 @@ #include "qcontactdetail.h" #include "qcontactdetail_p.h" #include "qcontactmanager.h" +#include QTM_BEGIN_NAMESPACE @@ -49,17 +50,17 @@ 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"); -Q_DEFINE_LATIN1_LITERAL(QContactDetail::ContextWork, "Work"); +Q_DEFINE_LATIN1_CONSTANT(QContactDetail::FieldDetailUri, "DetailUri"); +Q_DEFINE_LATIN1_CONSTANT(QContactDetail::FieldLinkedDetailUris, "LinkedDetailUris"); +Q_DEFINE_LATIN1_CONSTANT(QContactDetail::FieldContext, "Context"); +Q_DEFINE_LATIN1_CONSTANT(QContactDetail::ContextOther, "Other"); +Q_DEFINE_LATIN1_CONSTANT(QContactDetail::ContextHome, "Home"); +Q_DEFINE_LATIN1_CONSTANT(QContactDetail::ContextWork, "Work"); /*! \class QContactDetail - \brief The QContactDetail class provides access to a single, complete detail about a contact. + \brief The QContactDetail class represents a single, complete detail about a contact. \ingroup contacts-main All of the information for a contact is stored in one or more QContactDetail objects. @@ -232,13 +233,52 @@ return true; } -/*! Sets the preferred actions for this detail to be the given list of \a preferredActions */ +/*! Returns the hash value for \a key. */ +uint qHash(const QContactDetail &key) +{ + uint hash = QT_PREPEND_NAMESPACE(qHash)(key.definitionName()) + + QT_PREPEND_NAMESPACE(qHash)(key.accessConstraints()); + QVariantMap::const_iterator it = key.variantValues().constBegin(); + QVariantMap::const_iterator end = key.variantValues().constEnd(); + while (it != end) { + hash += QT_PREPEND_NAMESPACE(qHash)(it.key()) + + QT_PREPEND_NAMESPACE(qHash)(it.value().toString()); + ++it; + } + return hash; +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug dbg, const QContactDetail& detail) +{ + dbg.nospace() << "QContactDetail(name=" << detail.definitionName() << ", key=" << detail.key(); + QVariantMap fields = detail.variantValues(); + QVariantMap::const_iterator it; + for (it = fields.constBegin(); it != fields.constEnd(); ++it) { + dbg.nospace() << ", " << it.key() << '=' << it.value(); + } + dbg.nospace() << ')'; + return dbg.maybeSpace(); +} +#endif + +/*! + * \deprecated + * Sets the preferred actions for this detail to be the given list of \a preferredActions. + * This functionality may not be supported on all backends. + * This function is deprecated and will be removed after the transition period has elapsed. + */ void QContactDetail::setPreferredActions(const QList& preferredActions) { d->m_preferredActions = preferredActions; } -/*! Returns the list of preferred actions for this detail */ +/*! + * \deprecated + * Returns the list of preferred actions for this detail. + * This functionality may not be supported on all backends. + * This function is deprecated and will be removed after the transition period has elapsed. + */ QList QContactDetail::preferredActions() const { return d->m_preferredActions; @@ -322,15 +362,6 @@ } /*! - \internal - Returns the values stored in this detail - */ -QVariantMap QContactDetail::values() const -{ - return d.constData()->m_values; -} - -/*! Returns the values stored in this detail as a map from value key to value */ QVariantMap QContactDetail::variantValues() const diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactdetail.h --- a/qtcontactsmobility/src/contacts/qcontactdetail.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactdetail.h Mon May 03 12:24:20 2010 +0300 @@ -74,19 +74,19 @@ // Predefined attribute names and values #ifdef Q_QDOC - const char* FieldContext; - const char* ContextHome; - const char* ContextWork; - const char* ContextOther; - const char* FieldDetailUri; - const char* FieldLinkedDetailUris; + static const QLatin1Constant FieldContext; + static const QLatin1Constant ContextHome; + static const QLatin1Constant ContextWork; + static const QLatin1Constant ContextOther; + static const QLatin1Constant FieldDetailUri; + static const QLatin1Constant 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"); + Q_DECLARE_LATIN1_CONSTANT(FieldContext, "Context"); + Q_DECLARE_LATIN1_CONSTANT(ContextHome, "Home"); + Q_DECLARE_LATIN1_CONSTANT(ContextWork, "Work"); + Q_DECLARE_LATIN1_CONSTANT(ContextOther, "Other"); + Q_DECLARE_LATIN1_CONSTANT(FieldDetailUri, "DetailUri"); + Q_DECLARE_LATIN1_CONSTANT(FieldLinkedDetailUris, "LinkedDetailUris"); #endif bool operator==(const QContactDetail& other) const; @@ -98,16 +98,15 @@ int key() const; void resetKey(); - void setPreferredActions(const QList& preferredActions); - QList preferredActions() const; + void Q_DECL_DEPRECATED setPreferredActions(const QList& preferredActions); + QList Q_DECL_DEPRECATED preferredActions() 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. + QVariantMap variantValues() const; QVariant variantValue(const QString& key) const; template T value(const QString& key) const { @@ -166,6 +165,11 @@ QSharedDataPointer d; }; +Q_CONTACTS_EXPORT uint qHash(const QContactDetail& key); +#ifndef QT_NO_DEBUG_STREAM +Q_CONTACTS_EXPORT QDebug operator<<(QDebug dbg, const QContactDetail& detail); +#endif + Q_DECLARE_OPERATORS_FOR_FLAGS(QContactDetail::AccessConstraints); #define Q_DECLARE_CUSTOM_CONTACT_DETAIL(className, definitionNameString) \ @@ -173,10 +177,10 @@ className(const QContactDetail& field) : QContactDetail(field, DefinitionName) {} \ className& operator=(const QContactDetail& other) {assign(other, DefinitionName); return *this;} \ \ - Q_DECLARE_LATIN1_LITERAL(DefinitionName, definitionNameString); + Q_DECLARE_LATIN1_CONSTANT(DefinitionName, definitionNameString); #define Q_IMPLEMENT_CUSTOM_CONTACT_DETAIL(className, definitionNameString) \ - Q_DEFINE_LATIN1_LITERAL(className::DefinitionName, definitionNameString) + Q_DEFINE_LATIN1_CONSTANT(className::DefinitionName, definitionNameString) QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactdetaildefinition.cpp --- a/qtcontactsmobility/src/contacts/qcontactdetaildefinition.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactdetaildefinition.cpp Mon May 03 12:24:20 2010 +0300 @@ -59,18 +59,6 @@ Returns true if this detail definition has different allowable field types or uniqueness to the \a other definition */ -/*! - \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 */ QContactDetailDefinition::QContactDetailDefinition() : d(new QContactDetailDefinitionData) @@ -170,39 +158,5 @@ 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 the access constraint that is applied to details of this definition - - \obsolete - - This function is obsolete - use \l QContactDetail::accessConstraints() - */ -QContactDetailDefinition::AccessConstraint QContactDetailDefinition::accessConstraint() const -{ - return QContactDetailDefinition::NoConstraint; -} - -/*! - 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) -{ - Q_UNUSED(constraint); -} QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactdetaildefinition.h --- a/qtcontactsmobility/src/contacts/qcontactdetaildefinition.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactdetaildefinition.h Mon May 03 12:24:20 2010 +0300 @@ -85,21 +85,9 @@ /* Mapping of field key to fields allowed in details of this definition */ 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 - to be removed week 3 */ - enum AccessConstraint { - NoConstraint = 0, - ReadOnly, - CreateOnly - }; - - /* Accessor and mutator for access constraints on details of this definition */ - QContactDetailDefinition::AccessConstraint Q_DECL_DEPRECATED accessConstraint() const; - void Q_DECL_DEPRECATED setAccessConstraint(const QContactDetailDefinition::AccessConstraint& constraint); - private: QSharedDataPointer d; }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactdetaildefinitionfield.h --- a/qtcontactsmobility/src/contacts/qcontactdetaildefinitionfield.h Fri Apr 16 14:53:18 2010 +0300 +++ /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$ -** -****************************************************************************/ - -#ifndef QCONTACTDETAILDEFINITIONFIELD_H -#define QCONTACTDETAILDEFINITIONFIELD_H - -#include "qcontactdetailfielddefinition.h" - -// Typedef the old type to the new type -QTM_BEGIN_NAMESPACE -typedef QContactDetailFieldDefinition QContactDetailDefinitionField; -QTM_END_NAMESPACE - -#endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.cpp --- a/qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.cpp Mon May 03 12:24:20 2010 +0300 @@ -49,22 +49,9 @@ \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. + QContactDetail, including the type and allowable values. */ -/*! - * \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. @@ -130,28 +117,6 @@ 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 diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.h --- a/qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactdetailfielddefinition.h Mon May 03 12:24:20 2010 +0300 @@ -66,15 +66,6 @@ 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; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactfetchhint.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/qcontactfetchhint.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,198 @@ +/**************************************************************************** +** +** 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 "qcontactfetchhint.h" +#include "qcontactfetchhint_p.h" + +#include + +QTM_BEGIN_NAMESPACE + +/*! + \class QContactFetchHint + \brief The QContactFetchHint class provides hints to the manager about which contact + information needs to be retrieved in an asynchronous fetch request or a synchronous + function call. + + All of the hints may be ignored at the discretion of the manager, however if a manager + is able to optimize retrieval of contacts due to hints, it may do so. If a manager + ignores a hint, it must retrieve the full set of data that the hint refers to. + + The fetch hint contains: + \list + \o a list of detail definition names which the client is interested + in (empty if interested in all detail definitions) + \o a list of relationship types which the client is interested in + (empty if interested in all relationships) + \o some optimization flags which allow the client to tell the backend if they are + not interested in any relationships, any action preferences, or any binary blobs (images etc). + \endlist + + Important note: a client should not make changes to a contact which has been retrieved + using a fetch hint other than the default fetch hint. Doing so will result in information + loss when saving the contact back to the manager (as the "new" restricted contact will + replace the previously saved contact in the backend). + */ + +/*! + \enum QContactFetchHint::OptimizationHint + + This enum defines flags which may be set to inform the backend that the client does + not require certain information. The backend may safely ignore the hint, but then + must return the full set of information relating to the optimization hint. + + \value AllRequired Tells the backend that all information is required + \value NoRelationships Tells the backend that the client does not require retrieved contacts to include a cache of relationships + \value NoActionPreferences Tells the backend that the client does not require retrieved contacts to include a cache of action preferences + \value NoBinaryBlobs Tells the backend that the client does not require retrieved contacts to include binary blobs such as thumbnail images + */ + +/*! + Constructs a new contact fetch hint which requests that the backend fetch all information + */ +QContactFetchHint::QContactFetchHint() + : d(new QContactFetchHintPrivate) +{ +} + +/*! + Constructs a new contact fetch hint as a copy of \a other + */ +QContactFetchHint::QContactFetchHint(const QContactFetchHint &other) + : d(other.d) +{ +} + +/*! + Frees any memory in use by the fetch hint + */ +QContactFetchHint::~QContactFetchHint() +{ +} + +/*! + Assigns this fetch hint to be equal to the \a other fetch hint + */ +QContactFetchHint& QContactFetchHint::operator=(const QContactFetchHint& other) +{ + d = other.d; + return *this; +} + +/*! + Returns the list of definition names that identify detail definitions of which details + the manager should (at a minimum) retrieve when fetching contacts. + This hint may be ignored by the backend, in which case it will return the full set of details for + each contact retrieved. + + \sa setDetailDefinitionsHint() + */ +QStringList QContactFetchHint::detailDefinitionsHint() const +{ + return d->m_definitionsHint; +} + +/*! + Sets the list of definition names that identify detail definitions of which details + the manager should (at a minimum) retrieve when fetching contacts to \a definitionNames. + This hint may be ignored by the backend, in which case it will return the full set of details for + each contact retrieved. + + \sa detailDefinitionsHint() + */ +void QContactFetchHint::setDetailDefinitionsHint(const QStringList& definitionNames) +{ + d->m_definitionsHint = definitionNames; +} + +/*! + Returns the list of relationship types that the manager should (at a minimum) retrieve + when fetching contacts. + This hint may be ignored by the backend, in which case it will return the full set of + relationships for each contact retrieved. + + \sa setRelationshipTypesHint(), QContact::relationships() + */ +QStringList QContactFetchHint::relationshipTypesHint() const +{ + return d->m_relationshipsHint; +} + +/*! + Sets the list of relationship types that the manager should (at a minimum) retrieve + when fetching contacts to \a relationshipTypes. + This hint may be ignored by the backend, in which case it will return the full set of + relationships for each contact retrieved. + + \sa relationshipTypesHint(), QContact::relationships() + */ +void QContactFetchHint::setRelationshipTypesHint(const QStringList& relationshipTypes) +{ + d->m_relationshipsHint = relationshipTypes; +} + +/*! + Returns the optimization hint flags specified by the client. + These hints may be ignored by the backend, in which case it will return + the full set of information accessible in a contact, including + relationships, action preferences, and binary blobs. + + \sa setOptimizationHints() + */ +QContactFetchHint::OptimizationHints QContactFetchHint::optimizationHints() const +{ + return d->m_optimizationHints; +} + +/*! + Sets the optimization hint flags specified by the client to \a hints. + These hints may be ignored by the backend, in which case it will return + the full set of information accessible in a contact, including + relationships, action preferences, and binary blobs. + + \sa optimizationHints() + */ +void QContactFetchHint::setOptimizationHints(OptimizationHints hints) +{ + d->m_optimizationHints = hints; +} + +QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactfetchhint.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/qcontactfetchhint.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** 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 QCONTACTFETCHHINT_H +#define QCONTACTFETCHHINT_H + +#include +#include +#include + +#include "qtcontactsglobal.h" +#include "qcontactdetaildefinition.h" + +QTM_BEGIN_NAMESPACE + +class QContactFetchHintPrivate; +class Q_CONTACTS_EXPORT QContactFetchHint { +public: + QContactFetchHint(); + QContactFetchHint(const QContactFetchHint& other); + ~QContactFetchHint(); + QContactFetchHint& operator=(const QContactFetchHint& other); + + QStringList detailDefinitionsHint() const; + void setDetailDefinitionsHint(const QStringList& definitionNames); + + QStringList relationshipTypesHint() const; + void setRelationshipTypesHint(const QStringList& relationshipTypes); + + enum OptimizationHint { + AllRequired = 0x0, + NoRelationships = 0x1, + NoActionPreferences = 0x2, + NoBinaryBlobs = 0x4 + // any other optimization hints? + }; + Q_DECLARE_FLAGS(OptimizationHints, OptimizationHint) + + OptimizationHints optimizationHints() const; + void setOptimizationHints(OptimizationHints hints); + +private: + QSharedDataPointer d; +}; + +QTM_END_NAMESPACE + +#endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactfetchhint_p.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/contacts/qcontactfetchhint_p.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** 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 QCONTACTFETCHHINT_P_H +#define QCONTACTFETCHHINT_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 "qcontactfetchhint.h" + +#include +#include + +QTM_BEGIN_NAMESPACE + +class QContactFetchHintPrivate : public QSharedData +{ +public: + QContactFetchHintPrivate() + : QSharedData(), + m_optimizationHints(QContactFetchHint::AllRequired) + { + } + + QContactFetchHintPrivate(const QContactFetchHintPrivate& other) + : QSharedData(other), + m_definitionsHint(other.m_definitionsHint), + m_relationshipsHint(other.m_relationshipsHint), + m_optimizationHints(other.m_optimizationHints) + { + } + + ~QContactFetchHintPrivate() + { + } + + QStringList m_definitionsHint; + QStringList m_relationshipsHint; + QContactFetchHint::OptimizationHints m_optimizationHints; +}; + +QTM_END_NAMESPACE + +#endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactfilter.cpp --- a/qtcontactsmobility/src/contacts/qcontactfilter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactfilter.cpp Mon May 03 12:24:20 2010 +0300 @@ -61,40 +61,40 @@ */ /*! - * \enum QContactFilter::FilterType - * Describes the type of the filter - * \value InvalidFilter An invalid filter which matches nothing - * \value ContactDetailFilter A filter which matches contacts containing one or more details of a particular definition with a particular value - * \value ContactDetailRangeFilter A filter which matches contacts containing one or more details of a particular definition whose values are within a particular range - * \value ChangeLogFilter A filter which matches contacts whose timestamps have been updated since some particular date and time - * \value ActionFilter A filter which matches contacts for which a particular action is available, or which contain a detail with a particular value for which a particular action is available - * \value RelationshipFilter A filter which matches contacts which participate in a particular type of relationship, or relationship with a specified contact - * \value IntersectionFilter A filter which matches all contacts that are matched by all filters it includes - * \value UnionFilter A filter which matches any contact that is matched by any of the filters it includes - * \value LocalIdFilter A filter which matches any contact whose local id is contained in a particular list of contact local ids - * \value DefaultFilter A filter which matches everything + \enum QContactFilter::FilterType + Describes the type of the filter + \value InvalidFilter An invalid filter which matches nothing + \value ContactDetailFilter A filter which matches contacts containing one or more details of a particular definition with a particular value + \value ContactDetailRangeFilter A filter which matches contacts containing one or more details of a particular definition whose values are within a particular range + \value ChangeLogFilter A filter which matches contacts whose timestamps have been updated since some particular date and time + \value ActionFilter A filter which matches contacts for which a particular action is available, or which contain a detail with a particular value for which a particular action is available + \value RelationshipFilter A filter which matches contacts which participate in a particular type of relationship, or relationship with a specified contact + \value IntersectionFilter A filter which matches all contacts that are matched by all filters it includes + \value UnionFilter A filter which matches any contact that is matched by any of the filters it includes + \value LocalIdFilter A filter which matches any contact whose local id is contained in a particular list of contact local ids + \value DefaultFilter A filter which matches everything */ /*! - * \enum QContactFilter::MatchFlag - * Describes the semantics of matching followed by the filter - * \value MatchExactly Performs QVariant-based matching - * \value MatchContains The search term is contained in the item - * \value MatchStartsWith The search term matches the start of the item - * \value MatchEndsWith The search term matches the end of the item - * \value MatchFixedString Performs string-based matching. String-based comparisons are case-insensitive unless the \c MatchCaseSensitive flag is also specified - * \value MatchCaseSensitive The search is case sensitive - * \value MatchPhoneNumber The search term is considered to be in the form of a phone number, and special processing (removing dialing prefixes, non significant - * characters like '-'. ')' etc). may be performed when matching the item. - * \value MatchKeypadCollation The search term is in the form of text entered by a numeric phone keypad (such as ITU-T E.161 compliant keypads). Each digit in the - * search term can represent a number of alphanumeric symbols. For example, the search string "43556" would match items "HELLO", "GEKKO", "HELL6" and "43556" among others. - * Accented characters and other punctuation characters may additionally be matched by the QContactManager in a way consistent with the platform. + \enum QContactFilter::MatchFlag + Describes the semantics of matching followed by the filter + \value MatchExactly Performs QVariant-based matching + \value MatchContains The search term is contained in the item + \value MatchStartsWith The search term matches the start of the item + \value MatchEndsWith The search term matches the end of the item + \value MatchFixedString Performs string-based matching. String-based comparisons are case-insensitive unless the \c MatchCaseSensitive flag is also specified + \value MatchCaseSensitive The search is case sensitive + \value MatchPhoneNumber The search term is considered to be in the form of a phone number, and special processing (removing dialing prefixes, non significant + characters like '-'. ')' etc). may be performed when matching the item. + \value MatchKeypadCollation The search term is in the form of text entered by a numeric phone keypad (such as ITU-T E.161 compliant keypads). Each digit in the + search term can represent a number of alphanumeric symbols. For example, the search string "43556" would match items "HELLO", "GEKKO", "HELL6" and "43556" among others. + Accented characters and other punctuation characters may additionally be matched by the QContactManager in a way consistent with the platform. */ /*! - * \fn QContactFilter::operator!=(const QContactFilter& other) const - * Returns true if this filter is not identical to the \a other filter. - * \sa operator==() + \fn QContactFilter::operator!=(const QContactFilter& other) const + Returns true if this filter is not identical to the \a other filter. + \sa operator==() */ #if !defined(Q_CC_MWERKS) @@ -155,14 +155,21 @@ return d_ptr->compare(other.d_ptr); } -/*! Constructs a new filter from the given data pointer \a d */ +/*! + \internal + Constructs a new filter from the given data pointer \a d + */ QContactFilter::QContactFilter(QContactFilterPrivate *d) : d_ptr(d) { } -/*! Intersects the \a left and \a right filters */ +/*! + \relates QContactFilter + Returns a filter which is the intersection of the \a left and \a right filters + \sa QContactIntersectionFilter + */ const QContactFilter operator&(const QContactFilter& left, const QContactFilter& right) { // XXX TODO: empty intersection/union operations are not well defined yet. @@ -186,7 +193,11 @@ return nif; } -/*! Unions the \a left and \a right filters */ +/*! + \relates QContactFilter + Returns a filter which is the union of the \a left and \a right filters + \sa QContactUnionFilter + */ const QContactFilter operator|(const QContactFilter& left, const QContactFilter& right) { if (left.type() == QContactFilter::UnionFilter) { diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactfilter.h --- a/qtcontactsmobility/src/contacts/qcontactfilter.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactfilter.h Mon May 03 12:24:20 2010 +0300 @@ -91,7 +91,7 @@ MatchFixedString = Qt::MatchFixedString, // 8 MatchCaseSensitive = Qt::MatchCaseSensitive, // 16 MatchPhoneNumber = 1024, - MatchKeypadCollation = 1025 + MatchKeypadCollation = 2048 }; Q_DECLARE_FLAGS(MatchFlags, MatchFlag) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactid.cpp --- a/qtcontactsmobility/src/contacts/qcontactid.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactid.cpp Mon May 03 12:24:20 2010 +0300 @@ -41,6 +41,8 @@ #include "qcontactid.h" #include "qcontactid_p.h" +#include +#include QTM_BEGIN_NAMESPACE @@ -51,9 +53,27 @@ It consists of a manager URI which identifies the manager which contains the contact, and the local id of the contact in that manager. + + A "null" QContactId has an empty manager URI, and an invalid QContactLocalId (0). + + \sa QContactLocalId */ /*! + \typedef QContactLocalId + \relates QContactId + \brief The QContactLocalId type represents the unique id of a contact within its manager. + + Most operations within a \l QContactManager accept a QContactLocalId. Some operations + (involving links to contacts outside a particular manager) also accept a manager URI - this + combination is stored in a \l QContactId. + + An invalid QContactLocalId is represented by a zero (0) value. + + \sa QContactId +*/ + +/*! * Constructs a new contact id */ QContactId::QContactId() @@ -97,6 +117,46 @@ return !(*this == other); } +/*! Returns true if this id is less than the \a other id. + This id will be considered less than the \a other id if the + manager URI of this id is alphabetically less than the manager + URI of the \a other id. If both ids have the same manager URI, + this id will be considered less than the \a other id if the + local id of this id is less than the local id of the \a other id. + + The invalid, empty id consists of an empty manager URI and the + invalid, zero local id, and hence will be less than any non-invalid + id. + + This operator is provided primarily to allow use of a QContactId + as a key in a QMap. + */ +bool QContactId::operator<(const QContactId& other) const +{ + const int comp = this->managerUri().compare(other.managerUri()); + if (comp != 0) + return comp < 0; + + return this->localId() < other.localId(); +} + +/*! + * Returns the hash value for \a key. + */ +uint qHash(const QContactId &key) +{ + return QT_PREPEND_NAMESPACE(qHash)(key.managerUri()) + + QT_PREPEND_NAMESPACE(qHash)(key.localId()); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug dbg, const QContactId& id) +{ + dbg.nospace() << "QContactId(" << id.managerUri() << ", " << id.localId() << ")"; + return dbg.maybeSpace(); +} +#endif + /*! * Returns the URI of the manager which contains the contact identified by this id */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactid.h --- a/qtcontactsmobility/src/contacts/qcontactid.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactid.h Mon May 03 12:24:20 2010 +0300 @@ -49,6 +49,8 @@ QTM_BEGIN_NAMESPACE +typedef quint32 QContactLocalId; + class QContactIdPrivate; class Q_CONTACTS_EXPORT QContactId { @@ -61,6 +63,7 @@ bool operator==(const QContactId& other) const; bool operator!=(const QContactId& other) const; + bool operator<(const QContactId& other) const; QString managerUri() const; QContactLocalId localId() const; @@ -72,6 +75,11 @@ QSharedDataPointer d; }; +Q_CONTACTS_EXPORT uint qHash(const QContactId& key); +#ifndef QT_NO_DEBUG_STREAM +Q_CONTACTS_EXPORT QDebug operator<<(QDebug dbg, const QContactId& id); +#endif + QTM_END_NAMESPACE Q_DECLARE_TYPEINFO(QTM_PREPEND_NAMESPACE(QContactId), Q_MOVABLE_TYPE); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactmanager.cpp --- a/qtcontactsmobility/src/contacts/qcontactmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactmanager.cpp Mon May 03 12:24:20 2010 +0300 @@ -45,6 +45,7 @@ #include "qcontactfilter.h" #include "qcontactdetaildefinition.h" #include "qcontactmanager_p.h" +#include "qcontactfetchhint.h" #include #include @@ -53,7 +54,7 @@ QTM_BEGIN_NAMESPACE /*! \class QContactManager - \brief The QContactManager class provides clients with access to contact information stored in a particular backend. + \brief The QContactManager class provides an interface which allows clients with access to contact information stored in a particular backend. \ingroup contacts-main This class provides adding, updating and removal of contacts. @@ -132,16 +133,6 @@ } /*! - \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) @@ -337,32 +328,11 @@ } /*! - \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); -} - -/*! - \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); -} - -/*! - Return the list of added contact ids, sorted according to the given list of \a sortOrders + Return the list of 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); + return d->m_engine->contactIds(QContactFilter(), sortOrders, &d->m_error); } /*! @@ -371,44 +341,127 @@ */ QList QContactManager::contactIds(const QContactFilter& filter, const QList& sortOrders) const { - return d->m_engine->contactIds(filter, sortOrders, d->m_error); + return d->m_engine->contactIds(filter, sortOrders, &d->m_error); +} + +/*! + \deprecated + Returns the list of contacts stored in the manager sorted according to the given list of \a sortOrders. + + The \a definitionRestrictions parameter describes the details that are of + interest, as a performance hint. If the list is empty, all existing details for the matching + contacts will be returned. Otherwise, the returned contacts may only contain details of the + supplied definition names, although the manager is free to return extra details. + + This function is deprecated and will be removed once the transition period has elapsed. Use the contacts() function which takes a fetchHint instead. + */ +QList QContactManager::contacts(const QList& sortOrders, const QStringList& definitionRestrictions) const +{ + qWarning("QContactManager::contacts() This function is deprecated and will be removed after the transition period has elapsed! Use contacts taking a QContactFetchHint instead!"); + QContactFetchHint fetchHint; + fetchHint.setDetailDefinitionsHint(definitionRestrictions); + return d->m_engine->contacts(QContactFilter(), sortOrders, fetchHint, &d->m_error); +} + +/*! + \deprecated + Returns a list of contacts that match the given \a filter, sorted according to the given list of \a sortOrders. + + Depending on the manager implementation, this filtering operation might be slow and involve retrieving all the + contacts and testing them against the supplied filter - see the \l isFilterSupported() function. + + The \a definitionRestrictions parameter describes the details that are of + interest, as a performance hint. If the list is empty, all existing details for the matching + contacts will be returned. Otherwise, the returned contacts may only contain details of the + supplied definition names, although the manager is free to return extra details. + + This function is deprecated and will be removed once the transition period has elapsed. Use the contacts() function which takes a fetchHint instead. + */ +QList QContactManager::contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions) const +{ + qWarning("QContactManager::contacts() This function is deprecated and will be removed after the transition period has elapsed! Use contacts taking a QContactFetchHint instead!"); + QContactFetchHint fetchHint; + fetchHint.setDetailDefinitionsHint(definitionRestrictions); + return d->m_engine->contacts(filter, sortOrders, fetchHint, &d->m_error); +} + +/*! + \deprecated + Returns the contact in the database identified by \a contactId. + + If the contact does not exist, an empty, default constructed QContact will be returned, + and the error returned by \l error() will be \c QContactManager::DoesNotExistError. + + The \a definitionRestrictions parameter describes the details that are of + interest, as a performance hint. If the list is empty, all existing details for the requested + contact will be returned. Otherwise, the returned contact may only contain details of the + supplied definition names, although the manager is free to return extra details. + + This function is deprecated and will be removed once the transition period has elapsed. Use the contact() function which takes a fetchHint instead. + */ +QContact QContactManager::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions) const +{ + qWarning("QContactManager::contact() This function is deprecated and will be removed after the transition period has elapsed! Use contacts taking a QContactFetchHint instead!"); + QContactFetchHint fetchHint; + fetchHint.setDetailDefinitionsHint(definitionRestrictions); + return d->m_engine->contact(contactId, fetchHint, &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. + + The \a fetchHint parameter describes the optimization hints that a manager may take. + If the \a fetchHint is the default constructed hint, all existing details, relationships and action preferences + in the matching contacts will be returned. A client should not make changes to a contact which has + been retrieved using a fetch hint other than the default fetch hint. Doing so will result in information + loss when saving the contact back to the manager (as the "new" restricted contact will + replace the previously saved contact in the backend). + + \sa QContactFetchHint */ -QList QContactManager::contacts(const QList& sortOrders, const QStringList& definitionRestrictions) const +QList QContactManager::contacts(const QList& sortOrders, const QContactFetchHint& fetchHint) const { - return d->m_engine->contacts(sortOrders, definitionRestrictions, d->m_error); + return d->m_engine->contacts(QContactFilter(), sortOrders, fetchHint, &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. + Returns a list of contacts that match the given \a filter, sorted according to the given list of \a sortOrders. + + Depending on the manager implementation, this filtering operation might be slow and involve retrieving all the + contacts and testing them against the supplied filter - see the \l isFilterSupported() function. + + The \a fetchHint parameter describes the optimization hints that a manager may take. + If the \a fetchHint is the default constructed hint, all existing details, relationships and action preferences + in the matching contacts will be returned. A client should not make changes to a contact which has + been retrieved using a fetch hint other than the default fetch hint. Doing so will result in information + loss when saving the contact back to the manager (as the "new" restricted contact will + replace the previously saved contact in the backend). + + \sa QContactFetchHint */ -QList QContactManager::contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions) const +QList QContactManager::contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fetchHint) const { - return d->m_engine->contacts(filter, sortOrders, definitionRestrictions, d->m_error); + return d->m_engine->contacts(filter, sortOrders, fetchHint, &d->m_error); } /*! 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. + + If the contact does not exist, an empty, default constructed QContact will be returned, + and the error returned by \l error() will be \c QContactManager::DoesNotExistError. + + The \a fetchHint parameter describes the optimization hints that a manager may take. + If the \a fetchHint is the default constructed hint, all existing details, relationships and action preferences + in the matching contact will be returned. A client should not make changes to a contact which has + been retrieved using a fetch hint other than the default fetch hint. Doing so will result in information + loss when saving the contact back to the manager (as the "new" restricted contact will + replace the previously saved contact in the backend). + + \sa QContactFetchHint */ -QContact QContactManager::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions) const +QContact QContactManager::contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint) const { - return d->m_engine->contact(contactId, definitionRestrictions, d->m_error); + return d->m_engine->contact(contactId, fetchHint, &d->m_error); } /*! @@ -449,7 +502,12 @@ */ bool QContactManager::saveContact(QContact* contact) { - return d->m_engine->saveContact(contact, d->m_error); + if (contact) { + return d->m_engine->saveContact(contact, &d->m_error); + } else { + d->m_error = QContactManager::BadArgumentError; + return false; + } } /*! @@ -460,11 +518,11 @@ */ bool QContactManager::removeContact(const QContactLocalId& contactId) { - return d->m_engine->removeContact(contactId, d->m_error); + return d->m_engine->removeContact(contactId, &d->m_error); } /*! - \internal + \deprecated 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 @@ -482,7 +540,24 @@ */ QList QContactManager::saveContacts(QList* contactList) { - return d->m_engine->saveContacts(contactList, d->m_error); + qWarning("QContactManager::saveContacts() This function is deprecated and will be removed after the transition period has elapsed! Use saveContacts taking an error map instead!"); + if (contactList) { + QMap errorMap; + QList errorList; + int size = contactList->size(); + d->m_engine->saveContacts(contactList, &errorMap, &d->m_error); + + for (int j=0; j < size; j++) { + if (errorMap.contains(j)) + errorList << errorMap.value(j); + else + errorList << QContactManager::NoError; + } + return errorList; + } else { + d->m_error =QContactManager::BadArgumentError; + return QList(); + } } /*! @@ -503,10 +578,18 @@ */ bool QContactManager::saveContacts(QList* contacts, QMap* errorMap) { - return d->m_engine->saveContacts(contacts, errorMap, d->m_error); + if (errorMap) + errorMap->clear(); + if (!contacts) { + d->m_error =QContactManager::BadArgumentError; + return false; + } + return d->m_engine->saveContacts(contacts, errorMap, &d->m_error); } /*! + \deprecated + 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. @@ -518,7 +601,7 @@ only return \c QContactManager::NoError if all contacts were removed successfully. - For each contact that was removed succesfully, the corresponding + For each contact that was removed successfully, 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. @@ -529,18 +612,78 @@ */ bool QContactManager::removeContacts(QList* contactIds, QMap* errorMap) { - return d->m_engine->removeContacts(contactIds, errorMap, d->m_error); + qWarning("QContactManager::removeContacts() This function is deprecated and will be removed after the transition period has elapsed! Use removeContacts taking an error map and a const list instead!"); + // DEPRECATED to be removed once transition period has elapsed. + if (errorMap) + errorMap->clear(); + if (!contactIds) { + d->m_error =QContactManager::BadArgumentError; + return false; + } + + return d->m_engine->removeContacts(*contactIds, errorMap, &d->m_error); } /*! - \internal + 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. + + Any contact that was removed successfully will have the relationships + in which it was involved removed also. + + 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. + + If the given list of contact ids \a contactIds is empty, the function will return false + and calling error() will return \c QContactManager::BadArgumentError. If the list is non-empty + and contains ids which do not identify a valid contact in the manager, the function will + remove any contacts which are identified by ids in the \a contactIds list, insert + \c QContactManager::DoesNotExist entries into the \a errorMap for the indices of invalid ids + in the \a contactIds list, return false, and set the overall operation error to + \c QContactManager::DoesNotExistError. + + \sa QContactManager::removeContact() + */ +bool QContactManager::removeContacts(const QList& contactIds, QMap* errorMap) +{ + if (contactIds.isEmpty()) { + d->m_error = QContactManager::BadArgumentError; + return false; + } + + if (errorMap) + errorMap->clear(); + return d->m_engine->removeContacts(contactIds, errorMap, &d->m_error); +} + +/*! + \preliminary + Returns a pruned or modified version of the \a original contact which is valid and can be saved in the manager. + The returned contact might have entire details removed or arbitrarily changed. The cache of relationships + in the contact are ignored entirely when considering compatibility with the backend, as they are + saved and validated separately. + + This function is preliminary and the behaviour is subject to change! + */ +QContact QContactManager::compatibleContact(const QContact& original) +{ + return d->m_engine->compatibleContact(original, &d->m_error); +} + +/*! + \deprecated 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 + For each contact that was removed successfully, 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. @@ -553,16 +696,24 @@ */ QList QContactManager::removeContacts(QList* idList) { - return d->m_engine->removeContacts(idList, d->m_error); -} + qWarning("QContactManager::removeContacts() This function is deprecated and will be removed after the transition period has elapsed! Use removeContacts taking an error map and a const list instead!"); + if (idList) { + QMap errorMap; + QList errorList; + int size = idList->size(); + d->m_engine->removeContacts(*idList, &errorMap, &d->m_error); -/*! - \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->synthesizedDisplayLabel(contact, d->m_error); + for (int j=0; j < size; j++) { + if (errorMap.contains(j)) + errorList << errorMap.value(j); + else + errorList << QContactManager::NoError; + } + return errorList; + } else { + d->m_error =QContactManager::BadArgumentError; + return QList(); + } } /*! @@ -570,7 +721,7 @@ */ QString QContactManager::synthesizedDisplayLabel(const QContact& contact) const { - return d->m_engine->synthesizedDisplayLabel(contact, d->m_error); + return d->m_engine->synthesizedDisplayLabel(contact, &d->m_error); } /*! @@ -586,7 +737,7 @@ */ bool QContactManager::setSelfContactId(const QContactLocalId& contactId) { - return d->m_engine->setSelfContactId(contactId, d->m_error); + return d->m_engine->setSelfContactId(contactId, &d->m_error); } /*! @@ -598,16 +749,45 @@ */ QContactLocalId QContactManager::selfContactId() const { - return d->m_engine->selfContactId(d->m_error); + return d->m_engine->selfContactId(&d->m_error); +} + +/*! + \deprecated + 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. + + This function is deprecated and will be removed after the transition period has elapsed. + Use the relationships() function which takes a QContactRelationship::Role argument instead! + */ +QList QContactManager::relationships(const QContactId& participantId, QContactRelationshipFilter::Role role) const +{ + qWarning("QContactManager::relationships() This function is deprecated and will be removed after the transition period has elapsed! Use relationships taking QContactRelationship::Role instead!"); + return d->m_engine->relationships(QString(), participantId, static_cast(role), &d->m_error); +} + +/*! + \deprecated + 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. + + This function is deprecated and will be removed after the transition period has elapsed. + Use the relationships() function which takes a QContactRelationship::Role argument instead! + */ +QList QContactManager::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role) const +{ + qWarning("QContactManager::relationships() This function is deprecated and will be removed after the transition period has elapsed! Use relationships taking QContactRelationship::Role instead!"); + return d->m_engine->relationships(relationshipType, participantId, static_cast(role), &d->m_error); } /*! 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 +QList QContactManager::relationships(const QContactId& participantId, QContactRelationship::Role role) const { - return d->m_engine->relationships(QString(), participantId, role, d->m_error); + return d->m_engine->relationships(QString(), participantId, role, &d->m_error); } /*! @@ -615,9 +795,9 @@ 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 +QList QContactManager::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role) const { - return d->m_engine->relationships(relationshipType, participantId, role, d->m_error); + return d->m_engine->relationships(relationshipType, participantId, role, &d->m_error); } /*! @@ -627,26 +807,67 @@ 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 given relationship is invalid if it is circular (the first contact is the second contact), or + if it references a non-existent local contact (either the first or second contact). 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) { - return d->m_engine->saveRelationship(relationship, d->m_error); + if (relationship) { + return d->m_engine->saveRelationship(relationship, &d->m_error); + } else { + d->m_error =QContactManager::BadArgumentError; + return false; + } } /*! + \deprecated Saves the given \a relationships in the database and returns a list of error codes. + + This function is deprecated and will be removed after the transition period has elapsed. + Use the saveRelationships() function which takes an errorMap argument instead. */ QList QContactManager::saveRelationships(QList* relationships) { - return d->m_engine->saveRelationships(relationships, d->m_error); + qWarning("QContactManager::saveRelationships() This function is deprecated and will be removed after the transition period has elapsed! Use saveRelationships taking an error map pointer instead!"); + if (relationships) { + QMap errorMap; + QList errorList; + int size = relationships->size(); + d->m_engine->saveRelationships(relationships, &errorMap, &d->m_error); + + for (int j=0; j < size; j++) { + if (errorMap.contains(j)) + errorList << errorMap.value(j); + else + errorList << QContactManager::NoError; + } + return errorList; + } else { + d->m_error =QContactManager::BadArgumentError; + return QList(); + } +} + +/*! + Saves the given \a relationships in the database and returns true if the operation was successful. + For any relationship which was unable to be saved, an entry into the \a errorMap will be created, + with the key being the index into the input relationships list, and the value being the error which + occurred for that index. + */ +bool QContactManager::saveRelationships(QList* relationships, QMap* errorMap) +{ + // check arguments + if (errorMap) + errorMap->clear(); + if (!relationships) { + d->m_error =QContactManager::BadArgumentError; + return false; + } + return d->m_engine->saveRelationships(relationships, errorMap, &d->m_error); } /*! @@ -654,20 +875,47 @@ 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) { - return d->m_engine->removeRelationship(relationship, d->m_error); + return d->m_engine->removeRelationship(relationship, &d->m_error); } /*! + \deprecated Removes the given \a relationships from the database and returns a list of error codes. + + This function is deprecated and will be removed after the transition period has elapsed. + Use the removeRelationships() function which takes an errorMap argument instead. */ QList QContactManager::removeRelationships(const QList& relationships) { - return d->m_engine->removeRelationships(relationships, d->m_error); + qWarning("QContactManager::removeRelationships() This function is deprecated and will be removed after the transition period has elapsed! Use removeRelationships taking an error map pointer instead!"); + QMap errorMap; + QList errorList; + int size = relationships.size(); + d->m_engine->removeRelationships(relationships, &errorMap, &d->m_error); + + for (int j=0; j < size; j++) { + if (errorMap.contains(j)) + errorList << errorMap.value(j); + else + errorList << QContactManager::NoError; + } + return errorList; +} + +/*! + Removes the given \a relationships from the database and returns true if the operation was successful. + For any relationship which was unable to be removed, an entry into the \a errorMap will be created, + with the key being the index into the input relationships list, and the value being the error which + occurred for that index. + */ +bool QContactManager::removeRelationships(const QList& relationships, QMap* errorMap) +{ + if (errorMap) + errorMap->clear(); + return d->m_engine->removeRelationships(relationships, errorMap, &d->m_error); } /*! @@ -677,44 +925,44 @@ QMap QContactManager::detailDefinitions(const QString& contactType) const { if (!supportedContactTypes().contains(contactType)) { - d->m_error = QContactManager::InvalidContactTypeError; + d->m_error =QContactManager::InvalidContactTypeError; return QMap(); } - return d->m_engine->detailDefinitions(contactType, d->m_error); + return d->m_engine->detailDefinitions(contactType, &d->m_error); } /*! Returns the definition identified by the given \a definitionName that is valid for the contacts whose type is the given \a contactType in this store, or a default-constructed QContactDetailDefinition if no such definition exists */ QContactDetailDefinition QContactManager::detailDefinition(const QString& definitionName, const QString& contactType) const { if (!supportedContactTypes().contains(contactType)) { - d->m_error = QContactManager::InvalidContactTypeError; + d->m_error =QContactManager::InvalidContactTypeError; return QContactDetailDefinition(); } - return d->m_engine->detailDefinition(definitionName, contactType, d->m_error); + return d->m_engine->detailDefinition(definitionName, contactType, &d->m_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, otherwise returns false */ bool QContactManager::saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType) { if (!supportedContactTypes().contains(contactType)) { - d->m_error = QContactManager::InvalidContactTypeError; + d->m_error =QContactManager::InvalidContactTypeError; return false; } - return d->m_engine->saveDetailDefinition(def, contactType, d->m_error); + return d->m_engine->saveDetailDefinition(def, contactType, &d->m_error); } /*! Removes the detail definition identified by \a definitionName from the database, which is valid for contacts whose type is the given \a contactType. Returns true if the definition was removed successfully, otherwise returns false */ bool QContactManager::removeDetailDefinition(const QString& definitionName, const QString& contactType) { if (!supportedContactTypes().contains(contactType)) { - d->m_error = QContactManager::InvalidContactTypeError; + d->m_error =QContactManager::InvalidContactTypeError; return false; } - return d->m_engine->removeDetailDefinition(definitionName, contactType, d->m_error); + return d->m_engine->removeDetailDefinition(definitionName, contactType, &d->m_error); } /*! @@ -725,7 +973,6 @@ \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 @@ -749,21 +996,6 @@ } /*! - \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->isFilterSupported(filter); -} - -/*! Returns true if the given \a filter is supported natively by the manager, and false if the filter behaviour would be emulated. @@ -778,17 +1010,48 @@ } /*! - Returns the list of relationship types which are supported by this manager for contacts of - the given \a contactType. + Returns the list of relationship types which are supported by this manager where contacts of the + given type \a contactType may be the first (dominant) contact in the relationship. 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. + + \sa QContactRelationship::first() */ QStringList QContactManager::supportedRelationshipTypes(const QString& contactType) const { - return d->m_engine->supportedRelationshipTypes(contactType); + QStringList standardRels; + standardRels << QContactRelationship::HasMember; + standardRels << QContactRelationship::Aggregates; + standardRels << QContactRelationship::IsSameAs; + standardRels << QContactRelationship::HasAssistant; + standardRels << QContactRelationship::HasSpouse; + standardRels << QContactRelationship::HasManager; + + QStringList retnList; + foreach (const QString& relType, standardRels) { + if (d->m_engine->isRelationshipTypeSupported(relType, contactType)) { + retnList.append(relType); + } + } + + return retnList; +} + +/*! + Returns true if the manager supports the relationship type specified in \a relationshipType for + contacts whose type is the given \a contactType. + + Note that some managers may support the relationship type for a contact in a limited manner + (for example, only as the first contact in the relationship, or only as the second contact + in the relationship). In this case, it will still return true. It will only return false + if the relationship is entirely unsupported for the given type of contact. + */ +bool QContactManager::isRelationshipTypeSupported(const QString& relationshipType, const QString& contactType) const +{ + return d->m_engine->isRelationshipTypeSupported(relationshipType, contactType); } /*! @@ -803,25 +1066,6 @@ } /*! - \internal - Returns the version number of the Qt Mobility Contacts API - */ -int QContactManager::version() -{ - return QTCONTACTS_VERSION; -} - -/*! - \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 diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactmanager.h --- a/qtcontactsmobility/src/contacts/qcontactmanager.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactmanager.h Mon May 03 12:24:20 2010 +0300 @@ -56,6 +56,7 @@ #include "qcontactid.h" #include "qcontactrelationship.h" #include "qcontactsortorder.h" +#include "qcontactfetchhint.h" QTM_BEGIN_NAMESPACE @@ -83,10 +84,8 @@ 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 + int managerVersion() const; - 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); @@ -113,15 +112,18 @@ QContactManager::Error error() const; /* Contacts - Accessors and Mutators */ - 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 - 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 + // deprecated, to be removed once the transition period has elapsed. + QList Q_DECL_DEPRECATED contacts(const QList& sortOrders, const QStringList& definitionRestrictions) const; + QList Q_DECL_DEPRECATED contacts(const QContactFilter& filter, const QList& sortOrders, const QStringList& definitionRestrictions) const; + QContact Q_DECL_DEPRECATED contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions) const; // retrieve a contact + + // these three functions replace the three deprecated functions above. + QList contacts(const QList& sortOrders = QList(), const QContactFetchHint& fetchHint = QContactFetchHint()) const; + QList contacts(const QContactFilter& filter, const QList& sortOrders = QList(), const QContactFetchHint& fetchHint = QContactFetchHint()) const; + QContact contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint = QContactFetchHint()) 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 @@ -129,10 +131,13 @@ 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. + bool Q_DECL_DEPRECATED removeContacts(QList* contactIds, QMap* errorMap); // batch API - remove. deprecated also. + bool removeContacts(const QList& contactIds, QMap* errorMap); // batch API - remove. + + /* Return a pruned or modified contact which is valid and can be saved in the manager */ + QContact compatibleContact(const QContact& original); // Preliminary function! /* Synthesize the display label of a contact */ - QString Q_DECL_DEPRECATED synthesizeDisplayLabel(const QContact& contact) const; // deprecated QString synthesizedDisplayLabel(const QContact& contact) const; // replaces the above /* "Self" contact id (MyCard) */ @@ -140,12 +145,16 @@ QContactLocalId selfContactId() const; /* Relationships */ - QList relationships(const QContactId& participantId, QContactRelationshipFilter::Role role = QContactRelationshipFilter::Either) const; - QList relationships(const QString& relationshipType = QString(), const QContactId& participantId = QContactId(), QContactRelationshipFilter::Role role = QContactRelationshipFilter::Either) const; + QList Q_DECL_DEPRECATED relationships(const QContactId& participantId, QContactRelationshipFilter::Role role) const; + QList Q_DECL_DEPRECATED relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role) const; + QList relationships(const QContactId& participantId, QContactRelationship::Role role = QContactRelationship::Either) const; + QList relationships(const QString& relationshipType = QString(), const QContactId& participantId = QContactId(), QContactRelationship::Role role = QContactRelationship::Either ) const; bool saveRelationship(QContactRelationship* relationship); - QList saveRelationships(QList* relationships); + QList Q_DECL_DEPRECATED saveRelationships(QList* relationships); // deprecated + bool saveRelationships(QList* relationships, QMap* errorMap); // replaces the above bool removeRelationship(const QContactRelationship& relationship); - QList removeRelationships(const QList& relationships); + QList Q_DECL_DEPRECATED removeRelationships(const QList& relationships); // deprecated + bool removeRelationships(const QList& relationships, QMap* errorMap); // replaces the above /* Definitions - Accessors and Mutators */ QMap detailDefinitions(const QString& contactType = QContactType::TypeContact) const; @@ -155,31 +164,28 @@ /* Functionality reporting */ enum ManagerFeature { - Groups = 0, - ActionPreferences, + Groups = 0, // backend supports QContactType::TypeGroup type contacts (convenience for clients... should be deprecated) + ActionPreferences, // per-contact action preferences MutableDefinitions, Relationships, ArbitraryRelationshipTypes, - RelationshipOrdering, + RelationshipOrdering, // deprecated along with setRelationshipOrder() etc in QContact. DetailOrdering, SelfContact, Anonymous, ChangeLogs }; bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType = QContactType::TypeContact) const; - QStringList supportedRelationshipTypes(const QString& contactType = QContactType::TypeContact) const; + QStringList Q_DECL_DEPRECATED supportedRelationshipTypes(const QString& contactType = QContactType::TypeContact) const; // deprecated. + bool isRelationshipTypeSupported(const QString& relationshipType, const QString& contactType = QContactType::TypeContact) const; // replaces the above QList supportedDataTypes() const; - bool Q_DECL_DEPRECATED filterSupported(const QContactFilter& filter) const; // DEPRECATED - bool isFilterSupported(const QContactFilter& filter) const;// replaces the above. + bool isFilterSupported(const QContactFilter& filter) const; QStringList supportedContactTypes() const; - /* Versions */ - 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(); -signals: +Q_SIGNALS: void dataChanged(); void contactsAdded(const QList& contactIds); void contactsChanged(const QList& contactIds); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactmanager_p.cpp --- a/qtcontactsmobility/src/contacts/qcontactmanager_p.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactmanager_p.cpp Mon May 03 12:24:20 2010 +0300 @@ -141,7 +141,7 @@ 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); + m_engine = f->engine(parameters, &m_error); found = true; break; } @@ -167,7 +167,7 @@ if (!m_engine) { if (m_error == QContactManager::NoError) m_error = QContactManager::DoesNotExistError; - m_engine = new QContactInvalidEngine(); // XXX share + m_engine = new QContactInvalidEngine(); } } } @@ -176,6 +176,10 @@ void QContactManagerData::loadStaticFactories() { if (!m_discoveredStatic) { +#if !defined QT_NO_DEBUG + const bool showDebug = qgetenv("QT_DEBUG_PLUGINS").toInt() > 0; +#endif + m_discoveredStatic = true; /* Clean stuff up at the end */ @@ -188,7 +192,10 @@ QContactActionFactory *g = qobject_cast(staticPlugins.at(i)); if (f) { QString name = f->managerName(); - qDebug() << "Static: found an engine plugin" << f << "with name" << name; +#if !defined QT_NO_DEBUG + if (showDebug) + qDebug() << "Static: found an engine plugin" << f << "with name" << name; +#endif if (name != QLatin1String("memory") && name != QLatin1String("invalid") && !name.isEmpty()) { // we also need to ensure that we haven't already loaded this factory. if (m_engines.keys().contains(name)) { @@ -203,8 +210,10 @@ if (g) { QString name = g->name(); - qDebug() << "Static: found an action factory" << g << "with name" << name; - +#if !defined QT_NO_DEBUG + if (showDebug) + qDebug() << "Static: found an action factory" << g << "with name" << name; +#endif if (m_actionfactories.contains(g)) { qWarning() << "Static contacts plugin" << name << "has the same name as currently loaded plugin; ignored"; } else { @@ -225,9 +234,71 @@ } } +class DirChecker +{ +public: + DirChecker(); + ~DirChecker(); + bool checkDir(const QDir& dir); + +private: +#if defined(Q_OS_SYMBIAN) + RFs rfs; +#endif +}; + +#if defined(Q_OS_SYMBIAN) +DirChecker::DirChecker() +{ + qt_symbian_throwIfError(rfs.Connect()); +} + +bool DirChecker::checkDir(const QDir& dir) +{ + bool pathFound = false; + // 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). + // 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(dir.absolutePath()); + TPtrC ptr = TPtrC16(static_cast(nativePath.utf16()), nativePath.length()); + TUint attributes; + TInt err = rfs.Att(ptr, attributes); + if (err == KErrNone) { + // yes, the directory exists. + pathFound = true; + } + return pathFound; +} + +DirChecker::~DirChecker() +{ + rfs.Close(); +} +#else +DirChecker::DirChecker() +{ +} + +DirChecker::~DirChecker() +{ +} + +bool DirChecker::checkDir(const QDir &dir) +{ + return dir.exists(); +} +#endif + /* Plugin loader */ void QContactManagerData::loadFactories() { +#if !defined QT_NO_DEBUG + const bool showDebug = qgetenv("QT_DEBUG_PLUGINS").toInt() > 0; +#endif + // Always do this.. loadStaticFactories(); @@ -242,7 +313,12 @@ QSet processed; paths << QApplication::applicationDirPath() << QApplication::libraryPaths(); - qDebug() << "Plugin paths:" << paths; +#if !defined QT_NO_DEBUG + if (showDebug) + qDebug() << "Plugin paths:" << paths; +#endif + + DirChecker dirChecker; /* Enumerate our plugin paths */ for (int i=0; i < paths.count(); i++) { @@ -250,7 +326,7 @@ continue; processed.insert(paths.at(i)); QDir pluginsDir(paths.at(i)); - if (!pluginsDir.exists()) + if (!dirChecker.checkDir(pluginsDir)) continue; #if defined(Q_OS_WIN) @@ -264,41 +340,20 @@ } #endif -#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")))) { + QString subdir(QLatin1String("plugins/contacts")); + if (pluginsDir.path().endsWith(QLatin1String("/plugins")) + || pluginsDir.path().endsWith(QLatin1String("/plugins/"))) + subdir = QLatin1String("contacts"); + + if (dirChecker.checkDir(QDir(pluginsDir.path() + QLatin1Char('/') + subdir))) { + pluginsDir.cd(subdir); + const QStringList& files = pluginsDir.entryList(QDir::Files); +#if !defined QT_NO_DEBUG + if (showDebug) + qDebug() << "Looking for contacts plugins in" << pluginsDir.path() << files; #endif - const QStringList& files = pluginsDir.entryList(QDir::Files); - qDebug() << "Looking for plugins in" << pluginsDir.path() << files; for (int j=0; j < files.count(); j++) { - plugins << pluginsDir.absoluteFilePath(files.at(j)); + plugins << pluginsDir.absoluteFilePath(files.at(j)); } } } @@ -311,8 +366,10 @@ if (f) { QString name = f->managerName(); - qDebug() << "Dynamic: found an engine plugin" << f << "with name" << name; - +#if !defined QT_NO_DEBUG + if (showDebug) + qDebug() << "Dynamic: found a contact engine plugin" << f << "with name" << name; +#endif if (name != QLatin1String("memory") && name != QLatin1String("invalid") && !name.isEmpty()) { // we also need to ensure that we haven't already loaded this factory. if (m_engines.keys().contains(name)) { @@ -327,8 +384,10 @@ if (g) { QString name = g->name(); - qDebug() << "Dynamic: found an action factory" << g << "with name" << name; - +#if !defined QT_NO_DEBUG + if (showDebug) + qDebug() << "Dynamic: found a contact action factory" << g << "with name" << name; +#endif // we also need to ensure that we haven't already loaded this factory. if (m_actionfactories.contains(g)) { qWarning() << "Contacts plugin" << plugins.at(i) << "has the same name as currently loaded plugin" << name << "; ignored"; @@ -348,12 +407,14 @@ } /* Debugging */ - if (!f && !g) { +#if !defined QT_NO_DEBUG + if (showDebug && !f && !g) { qDebug() << "Unknown plugin:" << qpl.errorString(); if (qpl.instance()) { qDebug() << "[qobject:" << qpl.instance() << "]"; } } +#endif } QStringList engineNames; @@ -364,8 +425,12 @@ } engineNames << QString::fromAscii("%1[%2]").arg(f->managerName()).arg(versions.join(QString::fromAscii(","))); } - qDebug() << "Found engines:" << engineNames; - qDebug() << "Found actions:" << m_actionmap.keys(); +#if !defined QT_NO_DEBUG + if (showDebug) { + qDebug() << "Found engines:" << engineNames; + qDebug() << "Found actions:" << m_actionmap.keys(); + } +#endif } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactmanager_p.h --- a/qtcontactsmobility/src/contacts/qcontactmanager_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactmanager_p.h Mon May 03 12:24:20 2010 +0300 @@ -81,9 +81,7 @@ ~QContactManagerData() { - if (m_engine) - m_engine->deref(); - // We rely on the owning manager to delete m_info + delete m_engine; } void createEngine(const QString& managerName, const QMap& parameters); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactmanagerengine.cpp --- a/qtcontactsmobility/src/contacts/qcontactmanagerengine.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactmanagerengine.cpp Mon May 03 12:24:20 2010 +0300 @@ -52,9 +52,12 @@ #include "qcontactabstractrequest_p.h" #include "qcontactrequests.h" #include "qcontactrequests_p.h" +#include "qcontact.h" +#include "qcontactfetchhint.h" #include "qcontact_p.h" #include "qcontactdetail_p.h" + QTM_BEGIN_NAMESPACE /*! @@ -62,17 +65,18 @@ \preliminary \brief The QContactManagerEngine class provides the interface for all implementations of the contact manager backend functionality. - + \ingroup contacts-backends + Instances of this class are usually provided by a \l QContactManagerEngineFactory, which is loaded from a plugin. - + The default implementation of this interface provides a basic level of functionality for some functions so that specific engines can simply implement the functionality that is supported by the specific contacts engine that is being adapted. - + More information on writing a contacts engine plugin is TODO. - + \sa QContactManager, QContactManagerEngineFactory */ @@ -83,19 +87,6 @@ */ /*! - \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 @@ -218,174 +209,64 @@ } /*! - \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 -{ - Q_UNUSED(sortOrders); - error = QContactManager::NotSupportedError; - return QList(); -} - -/*! - \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 -{ - /* Slow way */ - QList ret; - - /* Retrieve each contact.. . . */ - const QList& all = contactIds(sortOrders, 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, contact(all.at(j), QStringList(), error))) - ret << all.at(j); - } - - return ret; -} - -/*! - \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 -{ - Q_UNUSED(contactId); - error = QContactManager::NotSupportedError; - return QContact(); -} - -/*! - 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 +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; - } + Q_UNUSED(filter); + Q_UNUSED(sortOrders); - /* 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; + *error = QContactManager::NotSupportedError; + return QList(); } /*! - 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. + Returns the list of contacts which match the given \a filter stored in the manager sorted according to the given list of \a sortOrders. + + Any operation error which occurs will be saved in \a error. + + The \a fetchHint parameter describes the optimization hints that a manager may take. + If the \a fetchHint is the default constructed hint, all existing details, relationships and action preferences + in the matching contacts will be returned. A client should not make changes to a contact which has + been retrieved using a fetch hint other than the default fetch hint. Doing so will result in information + loss when saving the contact back to the manager (as the "new" restricted contact will + replace the previously saved contact in the backend). + + \sa QContactFetchHint */ -QList QContactManagerEngine::contacts(const QList& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const +QList QContactManagerEngine::contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fetchHint, QContactManager::Error* error) const { + Q_UNUSED(filter); Q_UNUSED(sortOrders); - Q_UNUSED(definitionRestrictions); - error = QContactManager::NotSupportedError; + Q_UNUSED(fetchHint); + *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; + Returns the contact in the database identified by \a contactId. - /* Retrieve each contact.. . . */ - const QList& all = contacts(sortOrders, definitionRestrictions, error); - if (error != QContactManager::NoError) - return ret; + If the contact does not exist, an empty, default constructed QContact will be returned, + and the \a error will be set to \c QContactManager::DoesNotExistError. - if (filter.type() == QContactFilter::DefaultFilter) - return all; + Any operation error which occurs will be saved in \a error. - for (int j = 0; j < all.count(); j++) { - if (testFilter(filter, all.at(j))) { - ret << all.at(j); - } - } - - return ret; -} + The \a fetchHint parameter describes the optimization hints that a manager may take. + If the \a fetchHint is the default constructed hint, all existing details, relationships and action preferences + in the matching contact will be returned. A client should not make changes to a contact which has + been retrieved using a fetch hint other than the default fetch hint. Doing so will result in information + loss when saving the contact back to the manager (as the "new" restricted contact will + replace the previously saved contact in the backend). -/*! - 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. + \sa QContactFetchHint */ -QContact QContactManagerEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const +QContact QContactManagerEngine::contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const { Q_UNUSED(contactId); - Q_UNUSED(definitionRestrictions); - error = QContactManager::NotSupportedError; + Q_UNUSED(fetchHint); + *error = QContactManager::NotSupportedError; return QContact(); } @@ -400,10 +281,11 @@ \c QContactManager::NotSupportedError and the function will return false. */ -bool QContactManagerEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error) +bool QContactManagerEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error* error) { Q_UNUSED(contactId); - error = QContactManager::NotSupportedError; + + *error = QContactManager::NotSupportedError; return false; } @@ -414,9 +296,9 @@ 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 +QContactLocalId QContactManagerEngine::selfContactId(QContactManager::Error* error) const { - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return QContactLocalId(); } @@ -427,46 +309,65 @@ 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 +QList QContactManagerEngine::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const { Q_UNUSED(relationshipType); Q_UNUSED(participantId); Q_UNUSED(role); - error = QContactManager::NotSupportedError; + + *error = QContactManager::NotSupportedError; return QList(); } /*! + Saves the given \a relationships in the database and returns true if the operation was successful. + For any relationship which was unable to be saved, an entry into the \a errorMap will be created, + with the key being the index into the input relationships list, and the value being the error which + occurred for that index. + + The overall operation error will be saved in \a error. + */ +bool QContactManagerEngine::saveRelationships(QList* relationships, QMap* errorMap, QContactManager::Error* error) +{ + Q_UNUSED(relationships); + Q_UNUSED(errorMap); + + *error = QContactManager::NotSupportedError; + return false; +} + +/*! 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 given relationship is invalid if it is circular (the first contact is the second contact), or + if it references a non-existent local contact (either the first or second contact). 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. + The default implementation of this function converts the argument into a call to saveRelationships. */ -bool QContactManagerEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error& error) +bool QContactManagerEngine::saveRelationship(QContactRelationship *relationship, QContactManager::Error *error) { - Q_UNUSED(relationship); - error = QContactManager::NotSupportedError; - return false; -} + // Convert to a list op + if (relationship) { + QList list; + list.append(*relationship); + + QMap errors; + bool ret = saveRelationships(&list, &errors, 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) -{ - Q_UNUSED(relationships); - error = QContactManager::NotSupportedError; - return QList(); + if (errors.count() > 0) + *error = errors.begin().value(); + + *relationship = list.value(0); + return ret; + } else { + *error = QContactManager::BadArgumentError; + return false; + } } /*! @@ -475,34 +376,39 @@ 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. + The default implementation of this function converts the argument into a call to removeRelationships */ -bool QContactManagerEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error& error) +bool QContactManagerEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error* error) { - Q_UNUSED(relationship); - error = QContactManager::DoesNotExistError; - return false; + // Convert to a list op + QList list; + list.append(relationship); + + QMap errors; + bool ret = removeRelationships(list, &errors, error); + + if (errors.count() > 0) + *error = errors.begin().value(); + + return ret; } + /*! - 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 true if the operation was successful. + For any relationship which was unable to be removed, an entry into the \a errorMap will be created, + with the key being the index into the input relationships list, and the value being the error which + occurred for that index. + + The overall operation error will be saved in \a error. */ -QList QContactManagerEngine::removeRelationships(const QList& relationships, QContactManager::Error& error) +bool QContactManagerEngine::removeRelationships(const QList& relationships, QMap* errorMap, QContactManager::Error* error) { Q_UNUSED(relationships); - error = QContactManager::DoesNotExistError; - return QList(); -} + Q_UNUSED(errorMap); -/*! - \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); + *error = QContactManager::NotSupportedError; + return false; } /*! @@ -510,10 +416,10 @@ 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 +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; + *error = QContactManager::NoError; QList allNames = contact.details(QContactName::DefinitionName); const QLatin1String space(" "); @@ -570,22 +476,21 @@ } } - error = QContactManager::UnspecifiedError; + *error = QContactManager::UnspecifiedError; return QString(); } /*! - Returns a copy of the given contact \a contact with its display label set to \a displayLabel. + Sets the contact display label of \a contact to the supplied \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 +void QContactManagerEngine::setContactDisplayLabel(QContact* contact, const QString& displayLabel) { - QContact retn = contact; QContactDisplayLabel dl; dl.setValue(QContactDisplayLabel::FieldLabel, displayLabel); setDetailAccessConstraints(&dl, QContactDetail::Irremovable); - retn.d->m_details.replace(0, dl); - return retn; + contact->d->m_details.replace(0, dl); } /*! @@ -595,21 +500,167 @@ { Q_UNUSED(feature); Q_UNUSED(contactType); + return false; } /*! - \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 + Given an input \a filter, returns the canonical version of the filter. + + Some of the following transformations may be applied: + \list + \o Any QContactActionFilters are transformed into the corresponding + QContactFilters returned by matching actions + \o Any QContactInvalidFilters contained in a union filter will be removed + \o Any default QContactFilters contained in an intersection filter will be removed + \o Any QContactIntersectionFilters with a QContactInvalidFilter contained will be + replaced with a QContactInvalidFilter + \o Any QContactUnionFilters with a default QContactFilter contained will be replaced + with a default QContactFilter + \o An empty QContactIntersectionFilter will be replaced with a QContactDefaultFilter + \o An empty QContactUnionFilter will be replaced with a QContactInvalidFilter + \o An empty QContactLocalIdFilter will be replaced with a QContactInvalidFilter + \o An intersection or union filter with a single entry will be replaced by that entry + \o A QContactDetailFilter or QContactDetailRangeFilter with no definition name will be replaced with a QContactInvalidFilter + \o A QContactDetailRangeFilter with no range specified will be converted to a QContactDetailFilter + \endlist +*/ +QContactFilter QContactManagerEngine::canonicalizedFilter(const QContactFilter &filter) { - Q_UNUSED(filter); - return false; + switch(filter.type()) { + case QContactFilter::ActionFilter: + { + // Find any matching actions, and do a union filter on their filter objects + QContactActionFilter af(filter); + QList descriptors = QContactAction::actionDescriptors(af.actionName(), af.vendorName(), af.implementationVersion()); + + QList filters; + // There's a small wrinkle if there's a value specified in the action filter + // we have to adjust any contained QContactDetailFilters to have that value + // or test if a QContactDetailRangeFilter contains this value already + for (int j = 0; j < descriptors.count(); j++) { + QContactAction* action = QContactAction::action(descriptors.at(j)); + + // Action filters are not allowed to return action filters, at all + // it's too annoying to check for recursion + QContactFilter d = action->contactFilter(af.value()); + delete action; // clean up. + if (!validateActionFilter(d)) + continue; + + filters.append(d); + } + + if (filters.count() == 0) + return QContactInvalidFilter(); + if (filters.count() == 1) + return filters.first(); + + QContactUnionFilter f; + f.setFilters(filters); + return canonicalizedFilter(f); + } + break; + + case QContactFilter::IntersectionFilter: + { + QContactIntersectionFilter f(filter); + QList filters = f.filters(); + QList::iterator it = filters.begin(); + + // XXX in theory we can remove duplicates in a set filter + while (it != filters.end()) { + QContactFilter canon = canonicalizedFilter(*it); + if (canon.type() == QContactFilter::DefaultFilter) { + it = filters.erase(it); + } else if (canon.type() == QContactFilter::InvalidFilter) { + return QContactInvalidFilter(); + } else { + *it = canon; + ++it; + } + } + + if (filters.count() == 0) + return QContactFilter(); + if (filters.count() == 1) + return filters.first(); + + f.setFilters(filters); + return f; + } + break; + + case QContactFilter::UnionFilter: + { + QContactUnionFilter f(filter); + QList filters = f.filters(); + QList::iterator it = filters.begin(); + + // XXX in theory we can remove duplicates in a set filter + while (it != filters.end()) { + QContactFilter canon = canonicalizedFilter(*it); + if (canon.type() == QContactFilter::InvalidFilter) { + it = filters.erase(it); + } else if (canon.type() == QContactFilter::DefaultFilter) { + return QContactFilter(); + } else { + *it = canon; + ++it; + } + } + + if (filters.count() == 0) + return QContactInvalidFilter(); + if (filters.count() == 1) + return filters.first(); + + f.setFilters(filters); + return f; + } + break; + + case QContactFilter::LocalIdFilter: + { + QContactLocalIdFilter f(filter); + if (f.ids().count() == 0) + return QContactInvalidFilter(); + } + break; // fall through to return at end + + case QContactFilter::ContactDetailRangeFilter: + { + QContactDetailRangeFilter f(filter); + if (f.detailDefinitionName().isEmpty()) + return QContactInvalidFilter(); + if (f.minValue() == f.maxValue() + && f.rangeFlags() == (QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::ExcludeUpper)) + return QContactInvalidFilter(); + if ((f.minValue().isNull() && f.maxValue().isNull()) || (f.minValue() == f.maxValue())) { + QContactDetailFilter df; + df.setDetailDefinitionName(f.detailDefinitionName(), f.detailFieldName()); + df.setMatchFlags(f.matchFlags()); + df.setValue(f.minValue()); + return df; + } + } + break; // fall through to return at end + + case QContactFilter::ContactDetailFilter: + { + QContactDetailFilter f(filter); + if (f.detailDefinitionName().isEmpty()) + return QContactInvalidFilter(); + } + break; // fall through to return at end + + default: + break; // fall through to return at end + } + return filter; } + /*! Returns a whether the supplied \a filter can be implemented natively by this engine. If not, the base class implementation @@ -618,6 +669,7 @@ bool QContactManagerEngine::isFilterSupported(const QContactFilter& filter) const { Q_UNUSED(filter); + return false; } @@ -630,12 +682,20 @@ } /*! - Returns the list of relationship types supported by this engine for contacts whose type is the given \a contactType. + Returns true if the manager supports the relationship type specified in \a relationshipType for + contacts whose type is the given \a contactType. + + Note that some managers may support the relationship type for a contact in a limited manner + (for example, only as the first contact in the relationship, or only as the second contact + in the relationship). In this case, it will still return true. It will only return false + if the relationship is entirely unsupported for the given type of contact. */ -QStringList QContactManagerEngine::supportedRelationshipTypes(const QString& contactType) const +bool QContactManagerEngine::isRelationshipTypeSupported(const QString& relationshipType, const QString& contactType) const { + Q_UNUSED(relationshipType); Q_UNUSED(contactType); - return QStringList(); + + return false; } /*! @@ -647,7 +707,7 @@ QStringList QContactManagerEngine::supportedContactTypes() const { QContactManager::Error error; - QList allowableVals = detailDefinition(QContactType::DefinitionName, QContactType::TypeContact, error).fields().value(QContactType::FieldType).allowableValues(); + QList allowableVals = detailDefinition(QContactType::DefinitionName, QContactType::TypeContact, &error).fields().value(QContactType::FieldType).allowableValues(); QStringList retn; for (int i = 0; i < allowableVals.size(); i++) retn += allowableVals.at(i).toString(); @@ -655,31 +715,10 @@ } /*! - \internal - Returns the version number of the QtContacts API - */ -int QContactManagerEngine::version() -{ - return QTCONTACTS_VERSION; -} - -/*! - \internal - Returns the engine backend implementation version number - */ -int QContactManagerEngine::implementationVersion() const -{ - return 0; -} + \fn int QContactManagerEngine::managerVersion() const -/*! Returns the engine backend implementation version number */ -int QContactManagerEngine::managerVersion() const -{ - return 0; -} - /*! Returns the base schema definitions */ QMap > QContactManagerEngine::schemaDefinitions() @@ -780,9 +819,10 @@ f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); fields.insert(QContactOrganization::FieldName, f); - fields.insert(QContactOrganization::FieldLogo, f); fields.insert(QContactOrganization::FieldLocation, f); fields.insert(QContactOrganization::FieldTitle, f); + f.setDataType(QVariant::Url); + fields.insert(QContactOrganization::FieldLogoUrl, f); f.setDataType(QVariant::StringList); fields.insert(QContactOrganization::FieldDepartment, f); f.setAllowableValues(contexts); @@ -803,7 +843,7 @@ subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeBulletinBoardSystem)); subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeCar)); subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeDtmfMenu)); - subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeFacsimile)); + subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeFax)); subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeLandline)); subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeMessagingCapable)); subTypes << QString(QLatin1String(QContactPhoneNumber::SubTypeMobile)); @@ -930,18 +970,6 @@ f.setDataType(QVariant::String); fields.insert(QContactOnlineAccount::FieldAccountUri, f); fields.insert(QContactOnlineAccount::FieldServiceProvider, f); - fields.insert(QContactOnlineAccount::FieldNickname, f); - fields.insert(QContactOnlineAccount::FieldStatusMessage, f); - QVariantList presenceValues; - presenceValues << QString(QLatin1String(QContactOnlineAccount::PresenceAvailable)); - presenceValues << QString(QLatin1String(QContactOnlineAccount::PresenceHidden)); - presenceValues << QString(QLatin1String(QContactOnlineAccount::PresenceBusy)); - presenceValues << QString(QLatin1String(QContactOnlineAccount::PresenceAway)); - presenceValues << QString(QLatin1String(QContactOnlineAccount::PresenceExtendedAway)); - presenceValues << QString(QLatin1String(QContactOnlineAccount::PresenceUnknown)); - presenceValues << QString(QLatin1String(QContactOnlineAccount::PresenceOffline)); - f.setAllowableValues(presenceValues); - fields.insert(QContactOnlineAccount::FieldPresence, f); f.setDataType(QVariant::StringList); f.setAllowableValues(contexts); fields.insert(QContactDetail::FieldContext, f); @@ -951,24 +979,30 @@ d.setUnique(false); retn.insert(d.name(), d); - // avatar - d.setName(QContactAvatar::DefinitionName); + // presence + d.setName(QContactPresence::DefinitionName); fields.clear(); - f.setDataType(QVariant::String); - f.setAllowableValues(QVariantList()); - fields.insert(QContactAvatar::FieldAvatar, f); - - f.setDataType(QVariant::Pixmap); f.setAllowableValues(QVariantList()); - fields.insert(QContactAvatar::FieldAvatarPixmap, f); - - f.setDataType(QVariant::String); // only allowed to be a single subtype - subTypes.clear(); - subTypes << QString(QLatin1String(QContactAvatar::SubTypeImage)); - subTypes << QString(QLatin1String(QContactAvatar::SubTypeTexturedMesh)); - subTypes << QString(QLatin1String(QContactAvatar::SubTypeVideo)); - f.setAllowableValues(subTypes); - fields.insert(QContactAvatar::FieldSubType, f); + f.setDataType(QVariant::DateTime); + fields.insert(QContactPresence::FieldTimestamp, f); + f.setDataType(QVariant::String); + fields.insert(QContactPresence::FieldNickname, f); + fields.insert(QContactPresence::FieldCustomMessage, f); + fields.insert(QContactPresence::FieldPresenceStateText, f); + QVariantList presenceValues; + presenceValues << QContactPresence::PresenceAvailable; + presenceValues << QContactPresence::PresenceAway; + presenceValues << QContactPresence::PresenceBusy; + presenceValues << QContactPresence::PresenceExtendedAway; + presenceValues << QContactPresence::PresenceHidden; + presenceValues << QContactPresence::PresenceOffline; + presenceValues << QContactPresence::PresenceUnknown; + f.setAllowableValues(presenceValues); + f.setDataType(QVariant::Int); + fields.insert(QContactPresence::FieldPresenceState, f); + f.setAllowableValues(QVariantList()); + f.setDataType(QVariant::Url); + fields.insert(QContactPresence::FieldPresenceStateImageUrl, f); f.setDataType(QVariant::StringList); f.setAllowableValues(contexts); fields.insert(QContactDetail::FieldContext, f); @@ -976,22 +1010,84 @@ d.setUnique(false); retn.insert(d.name(), d); - // geolocation - d.setName(QContactGeolocation::DefinitionName); + // global presence + d.setName(QContactGlobalPresence::DefinitionName); + fields.clear(); + f.setAllowableValues(QVariantList()); + f.setDataType(QVariant::DateTime); + fields.insert(QContactGlobalPresence::FieldTimestamp, f); + f.setDataType(QVariant::String); + fields.insert(QContactGlobalPresence::FieldNickname, f); + fields.insert(QContactGlobalPresence::FieldCustomMessage, f); + fields.insert(QContactGlobalPresence::FieldPresenceStateText, f); + f.setAllowableValues(presenceValues); + f.setDataType(QVariant::Int); + fields.insert(QContactGlobalPresence::FieldPresenceState, f); + f.setAllowableValues(QVariantList()); + f.setDataType(QVariant::Url); + fields.insert(QContactGlobalPresence::FieldPresenceStateImageUrl, f); + f.setDataType(QVariant::StringList); + f.setAllowableValues(contexts); + fields.insert(QContactDetail::FieldContext, f); + d.setFields(fields); + d.setUnique(true); // unique and read only! + retn.insert(d.name(), d); + + // avatar + d.setName(QContactAvatar::DefinitionName); + fields.clear(); + f.setDataType(QVariant::Url); + f.setAllowableValues(QVariantList()); + fields.insert(QContactAvatar::FieldImageUrl, f); + fields.insert(QContactAvatar::FieldVideoUrl, f); + f.setDataType(QVariant::StringList); + f.setAllowableValues(contexts); + fields.insert(QContactDetail::FieldContext, f); + d.setFields(fields); + d.setUnique(false); + retn.insert(d.name(), d); + + // ringtone + d.setName(QContactRingtone::DefinitionName); + fields.clear(); + f.setDataType(QVariant::Url); + f.setAllowableValues(QVariantList()); + fields.insert(QContactRingtone::FieldAudioRingtoneUrl, f); + fields.insert(QContactRingtone::FieldVideoRingtoneUrl, f); + fields.insert(QContactRingtone::FieldVibrationRingtoneUrl, f); + f.setDataType(QVariant::StringList); + f.setAllowableValues(contexts); + fields.insert(QContactDetail::FieldContext, f); + d.setFields(fields); + d.setUnique(false); + retn.insert(d.name(), d); + + // thumbnail + d.setName(QContactThumbnail::DefinitionName); + fields.clear(); + f.setDataType(QVariant::Image); + f.setAllowableValues(QVariantList()); + fields.insert(QContactThumbnail::FieldThumbnail, f); + d.setFields(fields); + d.setUnique(true); // only one thumbnail, no context. + retn.insert(d.name(), d); + + // GeoLocation + d.setName(QContactGeoLocation::DefinitionName); fields.clear(); f.setDataType(QVariant::String); f.setAllowableValues(QVariantList()); - fields.insert(QContactGeolocation::FieldLabel, f); + fields.insert(QContactGeoLocation::FieldLabel, f); f.setDataType(QVariant::Double); - fields.insert(QContactGeolocation::FieldLatitude, f); - fields.insert(QContactGeolocation::FieldLongitude, f); - fields.insert(QContactGeolocation::FieldAccuracy, f); - fields.insert(QContactGeolocation::FieldAltitude, f); - fields.insert(QContactGeolocation::FieldAltitudeAccuracy, f); - fields.insert(QContactGeolocation::FieldSpeed, f); - fields.insert(QContactGeolocation::FieldHeading, f); + fields.insert(QContactGeoLocation::FieldLatitude, f); + fields.insert(QContactGeoLocation::FieldLongitude, f); + fields.insert(QContactGeoLocation::FieldAccuracy, f); + fields.insert(QContactGeoLocation::FieldAltitude, f); + fields.insert(QContactGeoLocation::FieldAltitudeAccuracy, f); + fields.insert(QContactGeoLocation::FieldSpeed, f); + fields.insert(QContactGeoLocation::FieldHeading, f); f.setDataType(QVariant::DateTime); - fields.insert(QContactGeolocation::FieldTimestamp, f); + fields.insert(QContactGeoLocation::FieldTimestamp, f); f.setDataType(QVariant::StringList); f.setAllowableValues(contexts); fields.insert(QContactDetail::FieldContext, f); @@ -1043,6 +1139,19 @@ d.setUnique(false); retn.insert(d.name(), d); + // tag + d.setName(QContactTag::DefinitionName); + fields.clear(); + f.setDataType(QVariant::String); + f.setAllowableValues(QVariantList()); + fields.insert(QContactTag::FieldTag, f); + f.setDataType(QVariant::StringList); + f.setAllowableValues(contexts); + fields.insert(QContactDetail::FieldContext, f); + d.setFields(fields); + d.setUnique(false); + retn.insert(d.name(), d); + // in the default schema, we have two contact types: TypeContact, TypeGroup. // the entire default schema is valid for both types. QMap > retnSchema; @@ -1052,57 +1161,6 @@ return retnSchema; } - -/*! - 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) -{ - Q_UNUSED(contact); - error = QContactManager::NotSupportedError; - return false; -} - /*! Checks that the given contact \a contact does not have details which don't conform to a valid definition, violate uniqueness constraints, @@ -1119,7 +1177,7 @@ Any errors encountered during this operation should be stored to \a error. */ -bool QContactManagerEngine::validateContact(const QContact& contact, QContactManager::Error& error) const +bool QContactManagerEngine::validateContact(const QContact& contact, QContactManager::Error* error) const { QList uniqueDefinitionIds; @@ -1129,15 +1187,15 @@ QVariantMap values = d.variantValues(); QContactDetailDefinition def = detailDefinition(d.definitionName(), contact.type(), error); // check that the definition is supported - if (error != QContactManager::NoError) { - error = QContactManager::InvalidDetailError; + if (*error != QContactManager::NoError) { + *error = QContactManager::InvalidDetailError; return false; // this definition is not supported. } // check uniqueness if (def.isUnique()) { if (uniqueDefinitionIds.contains(def.name())) { - error = QContactManager::AlreadyExistsError; + *error = QContactManager::AlreadyExistsError; return false; // can't have two of a unique detail. } uniqueDefinitionIds.append(def.name()); @@ -1148,14 +1206,14 @@ const QString& key = keys.at(i); // check that no values exist for nonexistent fields. if (!def.fields().contains(key)) { - error = QContactManager::InvalidDetailError; + *error = QContactManager::InvalidDetailError; return false; // value for nonexistent field. } QContactDetailFieldDefinition field = def.fields().value(key); // check that the type of each value corresponds to the allowable field type if (static_cast(field.dataType()) != values.value(key).userType()) { - error = QContactManager::InvalidDetailError; + *error = QContactManager::InvalidDetailError; return false; // type doesn't match. } @@ -1167,13 +1225,13 @@ QList innerValues = values.value(key).toList(); for (int i = 0; i < innerValues.size(); i++) { if (!field.allowableValues().contains(innerValues.at(i))) { - error = QContactManager::InvalidDetailError; + *error = QContactManager::InvalidDetailError; return false; // value not allowed. } } } else if (!field.allowableValues().contains(values.value(key))) { // the datatype is not a list; the value wasn't allowed. - error = QContactManager::InvalidDetailError; + *error = QContactManager::InvalidDetailError; return false; // value not allowed. } } @@ -1183,7 +1241,6 @@ return true; } - /*! Checks that the given detail definition \a definition seems valid, with a correct id, defined fields, and any specified value types @@ -1196,15 +1253,15 @@ Any errors encountered during this operation should be stored to \a error. */ -bool QContactManagerEngine::validateDefinition(const QContactDetailDefinition& definition, QContactManager::Error& error) const +bool QContactManagerEngine::validateDefinition(const QContactDetailDefinition& definition, QContactManager::Error* error) const { if (definition.name().isEmpty()) { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; return false; } if (definition.fields().count() == 0) { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; return false; } @@ -1214,56 +1271,37 @@ while(it.hasNext()) { it.next(); if (it.key().isEmpty()) { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; return false; } if (!types.contains(it.value().dataType())) { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; return false; } // Check that each allowed value is the same type for (int i=0; i < it.value().allowableValues().count(); i++) { if (it.value().allowableValues().at(i).type() != it.value().dataType()) { - error = QContactManager::BadArgumentError; + *error = QContactManager::BadArgumentError; return false; } } } - error = QContactManager::NoError; + *error = QContactManager::NoError; return true; } /*! - 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) -{ - Q_UNUSED(contactId); - error = QContactManager::NotSupportedError; - return false; -} - -/*! 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 +QMap QContactManagerEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const { Q_UNUSED(contactType); - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QMap(); } @@ -1275,16 +1313,14 @@ 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 +QContactDetailDefinition QContactManagerEngine::detailDefinition(const QString& definitionName, const QString& contactType, QContactManager::Error* error) const { - Q_UNUSED(definitionName); - QMap definitions = detailDefinitions(contactType, error); if (definitions.contains(definitionName)) { - error = QContactManager::NoError; + *error = QContactManager::NoError; return definitions.value(definitionName); } else { - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return QContactDetailDefinition(); } } @@ -1300,11 +1336,12 @@ Any errors encountered during this operation should be stored to \a error. */ -bool QContactManagerEngine::saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error& error) +bool QContactManagerEngine::saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error* error) { Q_UNUSED(def); Q_UNUSED(contactType); - error = QContactManager::NotSupportedError; + + *error = QContactManager::NotSupportedError; return false; } @@ -1319,11 +1356,12 @@ Any errors encountered during this operation should be stored to \a error. */ -bool QContactManagerEngine::removeDetailDefinition(const QString& definitionName, const QString& contactType, QContactManager::Error& error) +bool QContactManagerEngine::removeDetailDefinition(const QString& definitionName, const QString& contactType, QContactManager::Error* error) { Q_UNUSED(definitionName); Q_UNUSED(contactType); - error = QContactManager::NotSupportedError; + + *error = QContactManager::NotSupportedError; return false; } @@ -1337,59 +1375,74 @@ 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 +void QContactManagerEngine::setDetailAccessConstraints(QContactDetail *detail, QContactDetail::AccessConstraints constraints) { 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. +/*! + 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, otherwise updates the contact in + the database which has the same id to be the given \a contact. + If the id is non-zero but does not identify any contact stored in the + manager, the function will return false and \a error will be set to + \c QContactManager::DoesNotExistError. - 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. + Returns true if the save operation completed successfully, otherwise + returns false. Any error which occurs will be saved in \a error. + + The default implementation will convert this into a call to saveContacts. - 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 managerUri() + */ +bool QContactManagerEngine::saveContact(QContact* contact, QContactManager::Error* error) +{ + // Convert to a list op + if (contact) { + QList list; + list.append(*contact); - \sa QContactManager::saveContact() - */ -QList QContactManagerEngine::saveContacts(QList* contacts, QContactManager::Error& error) -{ - QList ret; - if (!contacts) { - error = QContactManager::BadArgumentError; + QMap errors; + bool ret = saveContacts(&list, &errors, error); + + if (errors.count() > 0) + *error = errors.begin().value(); + + *contact = list.value(0); return ret; } else { - QContactManager::Error functionError = QContactManager::NoError; - for (int i = 0; i < contacts->count(); i++) { - QContact current = contacts->at(i); - if (!saveContact(¤t, error)) { - functionError = error; - ret.append(functionError); - } else { - (*contacts)[i] = current; - ret.append(QContactManager::NoError); - } - } + *error = QContactManager::BadArgumentError; + return 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. + + Any error which occurs will be saved in \a error. - error = functionError; - return ret; - } + The default implementation will convert this into a call to removeContacts. + */ +bool QContactManagerEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error* error) +{ + // Convert to a list op + QList list; + list.append(contactId); + + QMap errors; + bool ret = removeContacts(list, &errors, error); + + if (errors.count() > 0) + *error = errors.begin().value(); + + return ret; } /*! @@ -1411,82 +1464,12 @@ \sa QContactManager::saveContact() */ -bool QContactManagerEngine::saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error& error) +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) -{ - QList ret; - if (!contactIds) { - error = QContactManager::BadArgumentError; - return ret; - } else { - QList removedList; - QContactManager::Error functionError = QContactManager::NoError; - for (int i = 0; i < contactIds->count(); i++) { - QContactLocalId current = contactIds->at(i); - if (!removeContact(current, error)) { - functionError = error; - ret.append(functionError); - } else { - (*contactIds)[i] = 0; - ret.append(QContactManager::NoError); - } - } - - error = functionError; - return ret; - } + Q_UNUSED(contacts); + Q_UNUSED(errorMap); + *error = QContactManager::NotSupportedError; + return false; } /*! @@ -1494,6 +1477,9 @@ \a contactIds. Returns true if all contacts were removed successfully, otherwise false. + Any contact that was removed successfully will have the relationships + in which it was involved removed also. + 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. @@ -1501,44 +1487,108 @@ 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. + If the list contains ids which do not identify a valid contact in the manager, the function will + remove any contacts which are identified by ids in the \a contactIds list, insert + \c QContactManager::DoesNotExist entries into the \a errorMap for the indices of invalid ids + in the \a contactIds list, return false, and set the overall operation error to + \c QContactManager::DoesNotExistError. 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) +bool QContactManagerEngine::removeContacts(const QList& contactIds, QMap* errorMap, QContactManager::Error* error) +{ + Q_UNUSED(contactIds); + Q_UNUSED(errorMap); + *error = QContactManager::NotSupportedError; + return false; +} + +/*! + Returns a pruned or modified version of the \a original contact which is valid and can be saved in the manager. + The returned contact might have entire details removed or arbitrarily changed. The cache of relationships + in the contact are ignored entirely when considering compatibility with the backend, as they are + saved and validated separately. Any error which occurs will be saved to \a error. + */ +QContact QContactManagerEngine::compatibleContact(const QContact& original, QContactManager::Error* error) const { - if(errorMap) { - errorMap->clear(); - } + QContact conforming; + QContactManager::Error tempError; + QList uniqueDefinitionIds; + QList allDetails = original.details(); + QMap defs = detailDefinitions(original.type(), &tempError); + for (int j = 0; j < allDetails.size(); j++) { + // check that the detail conforms to the definition in this manager. + // if so, then add it to the conforming contact to be returned. if not, prune it. + const QContactDetail& d = allDetails.at(j); - if (!contactIds) { - error = QContactManager::BadArgumentError; - return false; - } + QVariantMap values = d.variantValues(); + QContactDetailDefinition def = detailDefinition(d.definitionName(), original.type(), &tempError); + // check that the definition is supported + if (*error != QContactManager::NoError) { + continue; // this definition is not supported. + } + + // check uniqueness + if (def.isUnique()) { + if (uniqueDefinitionIds.contains(def.name())) { + continue; // can't have two of a unique detail. + } + uniqueDefinitionIds.append(def.name()); + } - 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); + bool addToConforming = true; + QList keys = values.keys(); + for (int i=0; i < keys.count(); i++) { + const QString& key = keys.at(i); + // check that no values exist for nonexistent fields. + if (!def.fields().contains(key)) { + addToConforming = false; + break; // value for nonexistent field. + } + + QContactDetailFieldDefinition field = def.fields().value(key); + // check that the type of each value corresponds to the allowable field type + if (static_cast(field.dataType()) != values.value(key).userType()) { + addToConforming = false; + break; // type doesn't match. } - } else { - (*contactIds)[i] = 0; + + // check that the value is allowable + // if the allowable values is an empty list, any are allowed. + if (!field.allowableValues().isEmpty()) { + // if the field datatype is a list, check that it contains only allowable values + if (field.dataType() == QVariant::List || field.dataType() == QVariant::StringList) { + QList innerValues = values.value(key).toList(); + for (int i = 0; i < innerValues.size(); i++) { + if (!field.allowableValues().contains(innerValues.at(i))) { + addToConforming = false; + break; // value not allowed. + } + } + } else if (!field.allowableValues().contains(values.value(key))) { + // the datatype is not a list; the value wasn't allowed. + addToConforming = false; + break; // value not allowed. + } + } + } + + // if it conforms to this manager's schema, save it in the conforming contact + // else, ignore it (prune it out of the conforming contact). + if (addToConforming) { + QContactDetail saveCopy = d; + conforming.saveDetail(&saveCopy); } } - error = functionError; - return (functionError == QContactManager::NoError); + if (!conforming.isEmpty()) + *error = QContactManager::NoError; + else + *error = QContactManager::DoesNotExistError; + return conforming; } /*! @@ -1662,7 +1712,92 @@ Qt::CaseSensitivity cs = (cdf.matchFlags() & QContactFilter::MatchCaseSensitive) ? Qt::CaseSensitive : Qt::CaseInsensitive; /* See what flags are requested, since we're looking at a value */ - if (cdf.matchFlags() & (QContactFilter::MatchEndsWith | QContactFilter::MatchStartsWith | QContactFilter::MatchContains | QContactFilter::MatchFixedString)) { + if (cdf.matchFlags() & QContactFilter::MatchPhoneNumber) { + /* Doing phone number filtering. We hand roll an implementation here, backends will obviously want to override this. */ + QString input = cdf.value().toString(); + + /* preprocess the input - ignore any non-digits (doesn't perform ITU-T collation */ + QString preprocessedInput; + for (int i = 0; i < input.size(); i++) { + QChar current = input.at(i).toLower(); + if (current.isDigit()) preprocessedInput.append(current); + // note: we ignore characters like '+', 'p', 'w', '*' and '#' which may be important. + } + + /* Look at every detail in the set of details and compare */ + for (int j = 0; j < details.count(); j++) { + const QContactDetail& detail = details.at(j); + const QString& valueString = detail.value(cdf.detailFieldName()); + QString preprocessedValueString; + for (int i = 0; i < valueString.size(); i++) { + QChar current = valueString.at(i).toLower(); + if (current.isDigit()) preprocessedValueString.append(current); + // note: we ignore characters like '+', 'p', 'w', '*' and '#' which may be important. + } + + // if the matchflags input don't require a particular criteria to pass, we assume that it has passed. + // the "default" match strategy is an "endsWith" strategy. + bool me = (cdf.matchFlags() & 7) == QContactFilter::MatchExactly; + bool mc = (cdf.matchFlags() & 7) == QContactFilter::MatchContains; + bool msw = (cdf.matchFlags() & 7) == QContactFilter::MatchStartsWith; + bool mew = (cdf.matchFlags() & 7) == QContactFilter::MatchEndsWith; + + bool mer = (me ? preprocessedValueString == preprocessedInput : true); + bool mcr = (mc ? preprocessedValueString.contains(preprocessedInput) : true); + bool mswr = (msw ? preprocessedValueString.startsWith(preprocessedInput) : true); + bool mewr = (mew ? preprocessedValueString.endsWith(preprocessedInput) : true); + if (mewr && mswr && mcr && mer) { + return true; // this detail meets all of the criteria which were required, and hence must match. + } + } + } else if (cdf.matchFlags() & QContactFilter::MatchKeypadCollation) { + // XXX TODO: not sure about the filtering semantics for MatchKeypadCollation. + QString input = cdf.value().toString(); + + /* Look at every detail in the set of details and compare */ + for (int j = 0; j < details.count(); j++) { + const QContactDetail& detail = details.at(j); + const QString& valueString = detail.value(cdf.detailFieldName()).toLower(); + + // preprocess the valueString + QString preprocessedValue; + for (int i = 0; i < valueString.size(); i++) { + // we use ITU-T keypad collation by default. + QChar currentValueChar = valueString.at(i); + if (currentValueChar == QLatin1Char('a') || currentValueChar == QLatin1Char('b') || currentValueChar == QLatin1Char('c')) + preprocessedValue.append(QLatin1Char('2')); + else if (currentValueChar == QLatin1Char('d') || currentValueChar == QLatin1Char('e') || currentValueChar == QLatin1Char('f')) + preprocessedValue.append(QLatin1Char('3')); + else if (currentValueChar == QLatin1Char('g') || currentValueChar == QLatin1Char('h') || currentValueChar == QLatin1Char('i')) + preprocessedValue.append(QLatin1Char('4')); + else if (currentValueChar == QLatin1Char('j') || currentValueChar == QLatin1Char('k') || currentValueChar == QLatin1Char('l')) + preprocessedValue.append(QLatin1Char('5')); + else if (currentValueChar == QLatin1Char('m') || currentValueChar == QLatin1Char('n') || currentValueChar == QLatin1Char('o')) + preprocessedValue.append(QLatin1Char('6')); + else if (currentValueChar == QLatin1Char('p') || currentValueChar == QLatin1Char('q') || currentValueChar == QLatin1Char('r') || currentValueChar == QLatin1Char('s')) + preprocessedValue.append(QLatin1Char('7')); + else if (currentValueChar == QLatin1Char('t') || currentValueChar == QLatin1Char('u') || currentValueChar == QLatin1Char('v')) + preprocessedValue.append(QLatin1Char('8')); + else if (currentValueChar == QLatin1Char('w') || currentValueChar == QLatin1Char('x') || currentValueChar == QLatin1Char('y') || currentValueChar == QLatin1Char('z')) + preprocessedValue.append(QLatin1Char('9')); + else + preprocessedValue.append(currentValueChar); + } + + bool me = (cdf.matchFlags() & 7) == QContactFilter::MatchExactly; + bool mc = (cdf.matchFlags() & 7) == QContactFilter::MatchContains; + bool msw = (cdf.matchFlags() & 7) == QContactFilter::MatchStartsWith; + bool mew = (cdf.matchFlags() & 7) == QContactFilter::MatchEndsWith; + + bool mer = (me ? preprocessedValue == input : true); + bool mcr = (mc ? preprocessedValue.contains(input) : true); + bool mswr = (msw ? preprocessedValue.startsWith(input) : true); + bool mewr = (mew ? preprocessedValue.endsWith(input) : true); + if (mewr && mswr && mcr && mer) { + return true; // this detail meets all of the criteria which were required, and hence must match. + } + } + } else if (cdf.matchFlags() & (QContactFilter::MatchEndsWith | QContactFilter::MatchStartsWith | QContactFilter::MatchContains | QContactFilter::MatchFixedString)) { /* We're strictly doing string comparisons here */ bool matchStarts = (cdf.matchFlags() & 7) == QContactFilter::MatchStartsWith; bool matchEnds = (cdf.matchFlags() & 7) == QContactFilter::MatchEndsWith; @@ -1811,17 +1946,17 @@ // now check to see if we have a match. foreach (const QContactRelationship& rel, allRelationships) { // perform the matching. - 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.relatedContactRole() == QContactRelationship::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(relatedContactId, rel.second())) { return true; } - } 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. + } else if (rf.relatedContactRole() == QContactRelationship::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(relatedContactId, rel.first())) { return true; } - } else { // QContactRelationshipFilter::Either + } else { // QContactRelationship::Either if ((rf.relationshipType().isEmpty() || rel.relationshipType() == rf.relationshipType()) && ((CONTACT_IDS_MATCH(relatedContactId, rel.first()) && !CONTACT_IDS_MATCH(contactUri, relatedContactId)) || (CONTACT_IDS_MATCH(relatedContactId, rel.second()) && !CONTACT_IDS_MATCH(contactUri, relatedContactId)))) { return true; @@ -2000,12 +2135,14 @@ */ void QContactManagerEngine::addSorted(QList* sorted, const QContact& toAdd, const QList& sortOrders) { - for (int i = 0; i < sorted->size(); i++) { - // check to see if the new contact should be inserted here - int comparison = compareContact(sorted->at(i), toAdd, sortOrders); - if (comparison > 0) { - sorted->insert(i, toAdd); - return; + if (sortOrders.count() > 0) { + for (int i = 0; i < sorted->size(); i++) { + // check to see if the new contact should be inserted here + int comparison = compareContact(sorted->at(i), toAdd, sortOrders); + if (comparison > 0) { + sorted->insert(i, toAdd); + return; + } } } @@ -2023,11 +2160,11 @@ QContactManagerEngine::addSorted(&sortedContacts, c, sortOrders); } - foreach(const QContact c, sortedContacts) { + foreach(const QContact& c, sortedContacts) { sortedIds.append(c.localId()); } } else { - foreach(const QContact c, cs) { + foreach(const QContact& c, cs) { sortedIds.append(c.localId()); } } @@ -2070,22 +2207,6 @@ } /*! - \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) -{ - Q_UNUSED(req); - Q_UNUSED(msecs); - return false; -} - -/*! 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 @@ -2101,225 +2222,25 @@ } /*! - \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. + Updates the given asynchronous request \a req by setting the new \a state + of the request. If the new state is different, the stateChanged() signal + will be emitted by the request. */ -void QContactManagerEngine::updateRequestStatus(QContactAbstractRequest* req, QContactManager::Error error, QList& errors, QContactAbstractRequest::Status status, bool appendOnly) -{ - 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) +void QContactManagerEngine::updateRequestState(QContactAbstractRequest* req, QContactAbstractRequest::State state) { - 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)); + if (req->d_ptr->m_state != state) { + req->d_ptr->m_state = state; + emit req->stateChanged(state); } } /*! - 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, false); - } - break; - - case QContactAbstractRequest::ContactLocalIdFetchRequest: - { - QContactLocalIdFetchRequest* r = static_cast(req); - emit r->progress(r, false); - } - break; - - case QContactAbstractRequest::ContactSaveRequest: - { - QContactSaveRequest* r = static_cast(req); - emit r->progress(r); - } - break; - - case QContactAbstractRequest::ContactRemoveRequest: - { - QContactRemoveRequest* r = static_cast(req); - emit r->progress(r); - } - break; + \deprecated - case QContactAbstractRequest::DetailDefinitionFetchRequest: - { - QContactDetailDefinitionFetchRequest* r = static_cast(req); - emit r->progress(r, false); - } - break; - - case QContactAbstractRequest::DetailDefinitionSaveRequest: - { - QContactDetailDefinitionSaveRequest* r = static_cast(req); - emit r->progress(r); - } - break; - - case QContactAbstractRequest::DetailDefinitionRemoveRequest: - { - QContactDetailDefinitionRemoveRequest* r = static_cast(req); - emit r->progress(r); - } - break; - - case QContactAbstractRequest::RelationshipFetchRequest: - { - QContactRelationshipFetchRequest* r = static_cast(req); - emit r->progress(r, false); - } - break; - - case QContactAbstractRequest::RelationshipSaveRequest: - { - QContactRelationshipSaveRequest* r = static_cast(req); - emit r->progress(r); - } - break; - - case QContactAbstractRequest::RelationshipRemoveRequest: - { - QContactRelationshipRemoveRequest* r = static_cast(req); - emit r->progress(r); - } - // fall through. - - default: // unknown request type. - break; - } -} - -/*! 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateContactLocalIdFetchRequest(QContactLocalIdFetchRequest* req, const QList& result, QContactManager::Error error) { @@ -2327,14 +2248,15 @@ 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); } /*! + \deprecated + 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateContactFetchRequest(QContactFetchRequest* req, const QList& result, QContactManager::Error error) { @@ -2342,14 +2264,15 @@ 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); } /*! + \deprecated + 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateContactRemoveRequest(QContactRemoveRequest* req, QContactManager::Error error, const QMap& errorMap) { @@ -2360,8 +2283,12 @@ } /*! + \deprecated + 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateContactSaveRequest(QContactSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap) { @@ -2370,14 +2297,15 @@ rd->m_errors = errorMap; rd->m_contacts = result; emit req->resultsAvailable(); - - // deprecated signal - to be removed after the transition period has elapsed: - emit req->progress(req); } /*! + \deprecated + 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateDefinitionSaveRequest(QContactDetailDefinitionSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap) { @@ -2386,14 +2314,15 @@ 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); } /*! + \deprecated + 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateDefinitionRemoveRequest(QContactDetailDefinitionRemoveRequest* req, QContactManager::Error error, const QMap& errorMap) { @@ -2401,14 +2330,15 @@ 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); } /*! + \deprecated + 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateDefinitionFetchRequest(QContactDetailDefinitionFetchRequest* req, const QMap& result, QContactManager::Error error, const QMap& errorMap) { @@ -2417,14 +2347,15 @@ 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); } /*! + \deprecated + 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateRelationshipSaveRequest(QContactRelationshipSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap) { @@ -2433,14 +2364,15 @@ 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); } /*! + \deprecated + 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateRelationshipRemoveRequest(QContactRelationshipRemoveRequest* req, QContactManager::Error error, const QMap& errorMap) { @@ -2448,14 +2380,15 @@ 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); } /*! + \deprecated + 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. + + This function has been deprecated - use the function with the same name that accepts the new state of the request. */ void QContactManagerEngine::updateRelationshipFetchRequest(QContactRelationshipFetchRequest* req, const QList& result, QContactManager::Error error) { @@ -2463,11 +2396,211 @@ 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); +/*! + Updates the given QContactLocalIdFetchRequest \a req with the latest results \a result, and operation error \a error. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateContactLocalIdFetchRequest(QContactLocalIdFetchRequest* req, const QList& result, QContactManager::Error error, QContactAbstractRequest::State newState) +{ + QContactLocalIdFetchRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_ids = result; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); +} + +/*! + Updates the given QContactFetchRequest \a req with the latest results \a result, and operation error \a error. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateContactFetchRequest(QContactFetchRequest* req, const QList& result, QContactManager::Error error, QContactAbstractRequest::State newState) +{ + QContactFetchRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_contacts = result; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); +} + +/*! + Updates the given QContactRemoveRequest \a req with the operation error \a error, and map of input index to individual error \a errorMap. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateContactRemoveRequest(QContactRemoveRequest* req, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State newState) +{ + QContactRemoveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); +} + +/*! + 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. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateContactSaveRequest(QContactSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State newState) +{ + QContactSaveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + rd->m_contacts = result; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); } +/*! + 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. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateDefinitionSaveRequest(QContactDetailDefinitionSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State newState) +{ + QContactDetailDefinitionSaveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + rd->m_definitions = result; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); +} + +/*! + Updates the given QContactDetailDefinitionRemoveRequest \a req with the operation error \a error, and map of input index to individual error \a errorMap. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateDefinitionRemoveRequest(QContactDetailDefinitionRemoveRequest* req, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State newState) +{ + QContactDetailDefinitionRemoveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); +} + +/*! + 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. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateDefinitionFetchRequest(QContactDetailDefinitionFetchRequest* req, const QMap& result, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State newState) +{ + QContactDetailDefinitionFetchRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + rd->m_definitions = result; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); +} + +/*! + 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. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateRelationshipSaveRequest(QContactRelationshipSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State newState) +{ + QContactRelationshipSaveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + rd->m_relationships = result; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); +} + +/*! + Updates the given QContactRelationshipRemoveRequest \a req with the operation error \a error, and map of input index to individual error \a errorMap. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateRelationshipRemoveRequest(QContactRelationshipRemoveRequest* req, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State newState) +{ + QContactRelationshipRemoveRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_errors = errorMap; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); +} + +/*! + Updates the given QContactRelationshipFetchRequest \a req with the latest results \a result, and operation error \a error. + In addition, the state of the request will be changed to \a newState. + + It then causes the request to emit its resultsAvailable() signal to notify clients of the request progress. + + If the new request state is different from the previous state, the stateChanged() signal will also be emitted from the request. + */ +void QContactManagerEngine::updateRelationshipFetchRequest(QContactRelationshipFetchRequest* req, const QList& result, QContactManager::Error error, QContactAbstractRequest::State newState) +{ + QContactRelationshipFetchRequestPrivate* rd = static_cast(req->d_ptr); + req->d_ptr->m_error = error; + rd->m_relationships = result; + bool emitState = rd->m_state != newState; + rd->m_state = newState; + emit req->resultsAvailable(); + if (emitState) + emit req->stateChanged(newState); +} #include "moc_qcontactmanagerengine.cpp" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactmanagerengine.h --- a/qtcontactsmobility/src/contacts/qcontactmanagerengine.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactmanagerengine.h Mon May 03 12:24:20 2010 +0300 @@ -56,6 +56,7 @@ #include "qcontactmanager.h" #include "qcontactabstractrequest.h" #include "qcontactrequests.h" +#include "qcontactfetchhint.h" QTM_BEGIN_NAMESPACE @@ -68,105 +69,70 @@ public: QContactManagerEngine() {} - virtual void deref() = 0; /* URI reporting */ - virtual QString managerName() const; // e.g. "Symbian" - virtual QMap managerParameters() const; // e.g. "filename=private.db" + virtual QString managerName() const = 0; // e.g. "Symbian" + virtual QMap managerParameters() const = 0; // e.g. "filename=private.db" + virtual int managerVersion() const = 0; + + /* Default and only implementation of this */ QString managerUri() const; - virtual int Q_DECL_DEPRECATED implementationVersion() const; // deprecated - virtual int managerVersion() const; // replaces the above /* Filtering */ - virtual QList Q_DECL_DEPRECATED contacts(const QContactFilter& filter, const QList& sortOrders, QContactManager::Error& error) const; - - /* Contacts - Accessors and Mutators */ - 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 QContactFilter& filter, const QList& sortOrders, QContactManager::Error* error) const = 0; + virtual QList contacts(const QContactFilter& filter, const QList& sortOrders, const QContactFetchHint& fetchHint, QContactManager::Error* error) const = 0; + virtual QContact contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const = 0; - 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 bool removeContact(const QContactLocalId& contactId, QContactManager::Error* error); + virtual bool saveRelationship(QContactRelationship* relationship, QContactManager::Error* error); + virtual bool removeRelationship(const QContactRelationship& relationship, QContactManager::Error* error); - virtual bool saveContact(QContact* contact, QContactManager::Error& error); - virtual bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error& error); - virtual bool removeContact(const QContactLocalId& contactId, QContactManager::Error& error); - virtual bool removeContacts(QList* contactIds, QMap* errorMap, QContactManager::Error& error); + virtual bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error* error) = 0; + virtual bool removeContacts(const QList& contactIds, QMap* errorMap, QContactManager::Error* error) = 0; + + /* Return a pruned or modified contact which is valid and can be saved in the backend */ + virtual QContact compatibleContact(const QContact& original, QContactManager::Error* error) const = 0; /* Synthesize the display label of a contact */ - 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; + virtual QString synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const = 0; /* "Self" contact id (MyCard) */ - virtual bool setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error); - virtual QContactLocalId selfContactId(QContactManager::Error& error) const; + virtual bool setSelfContactId(const QContactLocalId& contactId, QContactManager::Error* error) = 0; + virtual QContactLocalId selfContactId(QContactManager::Error* error) const = 0; /* Relationships between contacts */ - virtual QList relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role, QContactManager::Error& error) const; - virtual bool saveRelationship(QContactRelationship* relationship, QContactManager::Error& error); - virtual QList saveRelationships(QList* relationships, QContactManager::Error& error); - virtual bool removeRelationship(const QContactRelationship& relationship, QContactManager::Error& error); - virtual QList removeRelationships(const QList& relationships, QContactManager::Error& error); + virtual QList relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const = 0; + virtual bool saveRelationships(QList* relationships, QMap* errorMap, QContactManager::Error* error) = 0; + virtual bool removeRelationships(const QList& relationships, QMap* errorMap, QContactManager::Error* error) = 0; /* Validation for saving */ - virtual bool validateContact(const QContact& contact, QContactManager::Error& error) const; - virtual bool validateDefinition(const QContactDetailDefinition& def, QContactManager::Error& error) const; + virtual bool validateContact(const QContact& contact, QContactManager::Error* error) const = 0; + virtual bool validateDefinition(const QContactDetailDefinition& def, QContactManager::Error* error) const = 0; /* Definitions - Accessors and Mutators */ - virtual QMap detailDefinitions(const QString& contactType, QContactManager::Error& error) const; - virtual QContactDetailDefinition detailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error& error) const; - virtual bool saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error& error); - virtual bool removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error& error); + virtual QMap detailDefinitions(const QString& contactType, QContactManager::Error* error) const = 0; + virtual QContactDetailDefinition detailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error) const = 0; + virtual bool saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error* error) = 0; + virtual bool removeDetailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error) = 0; /* Asynchronous Request Support */ - virtual void requestDestroyed(QContactAbstractRequest* req); - virtual bool startRequest(QContactAbstractRequest* req); - virtual bool cancelRequest(QContactAbstractRequest* req); - virtual bool Q_DECL_DEPRECATED waitForRequestProgress(QContactAbstractRequest* req, int msecs); - virtual bool waitForRequestFinished(QContactAbstractRequest* req, int msecs); - - // 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); - + virtual void requestDestroyed(QContactAbstractRequest* req) = 0; + virtual bool startRequest(QContactAbstractRequest* req) = 0; + virtual bool cancelRequest(QContactAbstractRequest* req) = 0; + virtual bool waitForRequestFinished(QContactAbstractRequest* req, int msecs) = 0; /* Capabilities reporting */ - virtual bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const; - virtual QStringList supportedRelationshipTypes(const QString& contactType) 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 Q_DECL_DEPRECATED int version(); // deprecated, remove in wk1, no replacement. + virtual bool hasFeature(QContactManager::ManagerFeature feature, const QString& contactType) const = 0; + virtual bool isRelationshipTypeSupported(const QString& relationshipType, const QString& contactType) const = 0; + virtual bool isFilterSupported(const QContactFilter& filter) const = 0; + virtual QList supportedDataTypes() const = 0; + virtual QStringList supportedContactTypes() const = 0; /* Reports the built-in definitions from the schema */ static QMap > schemaDefinitions(); -signals: +Q_SIGNALS: void dataChanged(); void contactsAdded(const QList& contactIds); void contactsChanged(const QList& contactIds); @@ -176,6 +142,37 @@ void selfContactIdChanged(const QContactLocalId& oldId, const QContactLocalId& newId); public: + // Async update functions + static void updateRequestState(QContactAbstractRequest* req, QContactAbstractRequest::State state); + + static void Q_DECL_DEPRECATED updateContactLocalIdFetchRequest(QContactLocalIdFetchRequest* req, const QList& result, QContactManager::Error error); + static void Q_DECL_DEPRECATED updateContactFetchRequest(QContactFetchRequest* req, const QList& result, QContactManager::Error error); + static void Q_DECL_DEPRECATED updateContactRemoveRequest(QContactRemoveRequest* req, QContactManager::Error error, const QMap& errorMap); + static void Q_DECL_DEPRECATED updateContactSaveRequest(QContactSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap); + static void Q_DECL_DEPRECATED updateDefinitionSaveRequest(QContactDetailDefinitionSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap); + static void Q_DECL_DEPRECATED updateDefinitionRemoveRequest(QContactDetailDefinitionRemoveRequest* req, QContactManager::Error error, const QMap& errorMap); + static void Q_DECL_DEPRECATED updateDefinitionFetchRequest(QContactDetailDefinitionFetchRequest* req, const QMap& result, QContactManager::Error error, const QMap& errorMap); + static void Q_DECL_DEPRECATED updateRelationshipSaveRequest(QContactRelationshipSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap); + static void Q_DECL_DEPRECATED updateRelationshipRemoveRequest(QContactRelationshipRemoveRequest* req, QContactManager::Error error, const QMap& errorMap); + static void Q_DECL_DEPRECATED updateRelationshipFetchRequest(QContactRelationshipFetchRequest* req, const QList& result, QContactManager::Error error); + + static void updateContactLocalIdFetchRequest(QContactLocalIdFetchRequest* req, const QList& result, QContactManager::Error error, QContactAbstractRequest::State); + static void updateContactFetchRequest(QContactFetchRequest* req, const QList& result, QContactManager::Error error, QContactAbstractRequest::State); + static void updateContactRemoveRequest(QContactRemoveRequest* req, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State); + static void updateContactSaveRequest(QContactSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State); + static void updateDefinitionSaveRequest(QContactDetailDefinitionSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State); + static void updateDefinitionRemoveRequest(QContactDetailDefinitionRemoveRequest* req, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State); + static void updateDefinitionFetchRequest(QContactDetailDefinitionFetchRequest* req, const QMap& result, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State); + static void updateRelationshipSaveRequest(QContactRelationshipSaveRequest* req, const QList& result, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State); + static void updateRelationshipRemoveRequest(QContactRelationshipRemoveRequest* req, QContactManager::Error error, const QMap& errorMap, QContactAbstractRequest::State); + static void updateRelationshipFetchRequest(QContactRelationshipFetchRequest* req, const QList& result, QContactManager::Error error, QContactAbstractRequest::State); + + // Other protected area update functions + static void setDetailAccessConstraints(QContactDetail* detail, QContactDetail::AccessConstraints constraints); + static QContact Q_DECL_DEPRECATED setContactDisplayLabel(const QString& displayLabel, const QContact& contact); + static void setContactDisplayLabel(QContact* contact, const QString& displayLabel); + static void setContactRelationships(QContact* contact, const QList& relationships); + /* Helper functions */ static int compareContact(const QContact& a, const QContact& b, const QList& sortOrders); static void addSorted(QList* sorted, const QContact& toAdd, const QList& sortOrders); @@ -183,10 +180,8 @@ static bool testFilter(const QContactFilter& filter, const QContact& contact); static bool validateActionFilter(const QContactFilter& filter); 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; + static QContactFilter canonicalizedFilter(const QContactFilter& filter); private: /* QContactChangeSet is a utility class used to emit the appropriate signals */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.cpp --- a/qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.cpp Mon May 03 12:24:20 2010 +0300 @@ -49,6 +49,7 @@ \preliminary \brief The QContactManagerEngineFactory class provides the interface for plugins that implement QContactManagerEngine functionality. + \ingroup contacts-backends This class provides a simple interface for the creation of manager engine instances. Each factory has a specific id @@ -68,7 +69,7 @@ } /*! - \fn QContactManagerEngineFactory::engine(const QMap& parameters, QContactManager::Error &error) + \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. @@ -101,16 +102,4 @@ return QList(); } -/*! - \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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.h --- a/qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactmanagerenginefactory.h Mon May 03 12:24:20 2010 +0300 @@ -55,19 +55,17 @@ class Q_CONTACTS_EXPORT QContactManagerEngineFactory { public: - - // deprecated - removed entirely week 1. - int Q_DECL_DEPRECATED version() const; - // engine factory functions virtual QList supportedImplementationVersions() const; virtual ~QContactManagerEngineFactory(); - virtual QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error& error) = 0; + virtual QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error* error) = 0; virtual QString managerName() const = 0; }; QTM_END_NAMESPACE +QT_BEGIN_NAMESPACE #define QT_CONTACTS_BACKEND_INTERFACE "com.nokia.qt.mobility.contacts.enginefactory/1.0" Q_DECLARE_INTERFACE(QtMobility::QContactManagerEngineFactory, QT_CONTACTS_BACKEND_INTERFACE); +QT_END_NAMESPACE #endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactrelationship.cpp --- a/qtcontactsmobility/src/contacts/qcontactrelationship.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactrelationship.cpp Mon May 03 12:24:20 2010 +0300 @@ -47,6 +47,8 @@ #include #include #include +#include +#include QTM_BEGIN_NAMESPACE @@ -73,47 +75,55 @@ */ /*! + \enum QContactRelationship::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 + */ + +/*! * \variable QContactRelationship::HasMember * The relationship type which identifies the first contact as being a group which includes the second contact */ -Q_DEFINE_LATIN1_LITERAL(QContactRelationship::HasMember, "HasMember"); +Q_DEFINE_LATIN1_CONSTANT(QContactRelationship::HasMember, "HasMember"); /*! * \variable QContactRelationship::Aggregates * The relationship type which identifies the first contact as aggregating the second contact into a metacontact */ -Q_DEFINE_LATIN1_LITERAL(QContactRelationship::Aggregates, "Aggregates"); +Q_DEFINE_LATIN1_CONSTANT(QContactRelationship::Aggregates, "Aggregates"); /*! * \variable QContactRelationship::Is - * \obsolete + * \deprecated * Deprecated - use QContactRelationship::IsSameAs instead. */ -Q_DEFINE_LATIN1_LITERAL(QContactRelationship::Is, "IsSameAs"); +Q_DEFINE_LATIN1_CONSTANT(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::IsSameAs, "IsSameAs"); +Q_DEFINE_LATIN1_CONSTANT(QContactRelationship::IsSameAs, "IsSameAs"); /*! * \variable QContactRelationship::HasAssistant * The relationship type which identifies the second contact as being the assistant of the first contact */ -Q_DEFINE_LATIN1_LITERAL(QContactRelationship::HasAssistant, "HasAssistant"); +Q_DEFINE_LATIN1_CONSTANT(QContactRelationship::HasAssistant, "HasAssistant"); /*! * \variable QContactRelationship::HasManager * The relationship type which identifies the second contact as being the manager of the first contact */ -Q_DEFINE_LATIN1_LITERAL(QContactRelationship::HasManager, "HasManager"); +Q_DEFINE_LATIN1_CONSTANT(QContactRelationship::HasManager, "HasManager"); /*! * \variable QContactRelationship::HasSpouse * The relationship type which identifies the second contact as being the spouse of the first contact */ -Q_DEFINE_LATIN1_LITERAL(QContactRelationship::HasSpouse, "HasSpouse"); +Q_DEFINE_LATIN1_CONSTANT(QContactRelationship::HasSpouse, "HasSpouse"); /*! * Constructs a new relationship @@ -162,6 +172,24 @@ } /*! + * Returns the hash value for \a key. + */ +uint qHash(const QContactRelationship &key) +{ + return qHash(key.first()) + qHash(key.second()) + + QT_PREPEND_NAMESPACE(qHash)(key.relationshipType()); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug dbg, const QContactRelationship& rel) +{ + dbg.nospace() << "QContactRelationship(" << rel.first() << ' ' << rel.relationshipType() + << ' ' << rel.second() << ')'; + return dbg.maybeSpace(); +} +#endif + +/*! * \fn QContactRelationship::operator!=(const QContactRelationship& other) const * Returns true if this relationship is not equal to \a other, otherwise returns false. */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qcontactrelationship.h --- a/qtcontactsmobility/src/contacts/qcontactrelationship.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qcontactrelationship.h Mon May 03 12:24:20 2010 +0300 @@ -59,21 +59,21 @@ { public: #ifdef Q_QDOC - const char* HasMember; - const char* Aggregates; - const char* Is; - const char* IsSameAs; - const char* HasAssistant; - const char* HasManager; - const char* HasSpouse; + static const QLatin1Constant HasMember; + static const QLatin1Constant Aggregates; + static const QLatin1Constant Is; + static const QLatin1Constant IsSameAs; + static const QLatin1Constant HasAssistant; + static const QLatin1Constant HasManager; + static const QLatin1Constant HasSpouse; #else - Q_DECLARE_LATIN1_LITERAL(HasMember, "HasMember"); - Q_DECLARE_LATIN1_LITERAL(Aggregates, "Aggregates"); - 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"); + Q_DECLARE_LATIN1_CONSTANT(HasMember, "HasMember"); + Q_DECLARE_LATIN1_CONSTANT(Aggregates, "Aggregates"); + Q_DECLARE_LATIN1_CONSTANT(Is, "IsSameAs"); // deprecated + Q_DECLARE_LATIN1_CONSTANT(IsSameAs, "IsSameAs"); + Q_DECLARE_LATIN1_CONSTANT(HasAssistant, "HasAssistant"); + Q_DECLARE_LATIN1_CONSTANT(HasManager, "HasManager"); + Q_DECLARE_LATIN1_CONSTANT(HasSpouse, "HasSpouse"); #endif QContactRelationship(); @@ -92,10 +92,21 @@ void setSecond(const QContactId& secondId); void setRelationshipType(const QString& relationshipType); + enum Role { + First = 0, + Second, + Either + }; + private: QSharedDataPointer d; }; +Q_CONTACTS_EXPORT uint qHash(const QContactRelationship& key); +#ifndef QT_NO_DEBUG_STREAM +Q_CONTACTS_EXPORT QDebug operator<<(QDebug dbg, const QContactRelationship& rel); +#endif + QTM_END_NAMESPACE #endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qtcontacts.h --- a/qtcontactsmobility/src/contacts/qtcontacts.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qtcontacts.h Mon May 03 12:24:20 2010 +0300 @@ -52,10 +52,10 @@ #include "qcontact.h" // contact #include "qcontactid.h" // contact identifier #include "qcontactdetaildefinition.h" // 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 "qcontactfetchhint.h" // backend optimization hint class #include "qcontactfilter.h" // contact filter #include "qcontactfilters.h" // leaf filter classes #include "qcontactsortorder.h" // contact sorting diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/qtcontactsglobal.h --- a/qtcontactsmobility/src/contacts/qtcontactsglobal.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/qtcontactsglobal.h Mon May 03 12:24:20 2010 +0300 @@ -44,19 +44,18 @@ #include #include +#include -#define QTCONTACTS_VERSION_NAME "com.nokia.qt.mobility.contacts.api.version" -#define QTCONTACTS_IMPLEMENTATION_VERSION_NAME "com.nokia.qt.mobility.contacts.implementation.version" -#define QTCONTACTS_VERSION 1 +#define QTCONTACTS_VERSION_NAME "com.nokia.qt.mobility.contacts.api.version" +#define QTCONTACTS_IMPLEMENTATION_VERSION_NAME "com.nokia.qt.mobility.contacts.implementation.version" +#define QTCONTACTS_VERSION 1 QTM_BEGIN_NAMESPACE -typedef quint32 QContactLocalId; // XXX Put this else where - /* - * Latin1Literal + * QLatin1Constant * - * The idea of the Latin1Literal is to provide a POD-esque container + * The idea of the QLatin1Constant is to provide a POD-esque container * for constant strings which are defined in various places * (e.g., detail leaf class definition names, field keys, constant field values, etc). * We would ideally like these to be stored in the .rodata section to allow @@ -66,64 +65,115 @@ * member to a char array from a const char array, in order to squash * the compiler warning regarding uninitialised const value without * initialiser list in default ctor (POD requires default ctor). - * Does it work as hoped? */ -template struct Latin1Literal +template struct QLatin1Constant { - //const char str[N]; // causes compiler warning due to uninitialized const value - char str[N]; + char chars[N]; + + bool operator ==(const QLatin1Constant& other) const {return (chars == other.chars) || (qstrcmp(chars, other.chars) == 0);} + bool operator !=(const QLatin1Constant& other) const {return !operator==(other);} - operator QLatin1String() const {return QLatin1String(str);} - operator QString() const {return QString::fromLatin1(str, N-1);} + inline const char * latin1() const {return chars;} + + operator QLatin1String() const {return QLatin1String(chars);} + operator QString() const {return QString::fromLatin1(chars, N-1);} + operator QVariant() const {return QVariant(operator QString());} }; -template bool operator==(const Latin1Literal& a, const QLatin1String& b) +/* Hash - this comes from qhash.cpp >.> */ +template uint qHash(const QLatin1Constant& a) { - return QLatin1String(a.str) == b; + uint h = 0; + uint g; + int n = N - 1; + const register uchar*p = (const uchar*)a.chars; + + while (n--) { + h = (h << 4) + *p++; + if ((g = (h & 0xf0000000)) != 0) + h ^= g >> 23; + h &= ~g; + } + return h; } -template bool operator==(const Latin1Literal& a, const QString& b) +/* Operators for QLatin1Constant */ +template bool operator==(const QLatin1Constant&, const QLatin1Constant&) { - return b == QLatin1String(a.str); + // For N != M, this is always false + // For N == M, the member function gets called + return false; } - -template bool operator==(const QLatin1String& b, const Latin1Literal& a) +template bool operator!=(const QLatin1Constant&, const QLatin1Constant&) { - return QLatin1String(a.str) == b; + // If N != M, this is always true + // For N == M, the member function again gets called + return true; } -template bool operator==(const QString& b, const Latin1Literal& a) +template bool operator <(const QLatin1Constant& a, const QLatin1Constant& b) { - return b == QLatin1String(a.str); + return qstrcmp(a.chars, b.chars) < 0; +} + +/* Operators for QLatin1String */ +template bool operator==(const QLatin1Constant& a, const QLatin1String& b) +{ + return (a.chars == b.latin1()) || (qstrcmp(a.chars, b.latin1()) == 0); } -template bool operator!=(const Latin1Literal& a, const QLatin1String& b) +template bool operator==(const QLatin1String& b, const QLatin1Constant& a) +{ + return (a.chars == b.latin1()) || (qstrcmp(a.chars, b.latin1()) == 0); +} + +template bool operator!=(const QLatin1Constant& a, const QLatin1String& b) { - return QLatin1String(a.str) != b; + return (a.chars != b.latin1()) && (qstrcmp(a.chars, b.latin1()) != 0); +} + +template bool operator!=(const QLatin1String& b, const QLatin1Constant& a) +{ + return (a.chars != b.latin1()) && (qstrcmp(a.chars, b.latin1()) != 0); } -template bool operator!=(const Latin1Literal& a, const QString& b) +/* Operators for QString */ +template bool operator==(const QLatin1Constant& a, const QString& b) { - return b != QLatin1String(a.str); + return b == QLatin1String(a.chars); +} + +template bool operator==(const QString& b, const QLatin1Constant& a) +{ + return b == QLatin1String(a.chars); } -template bool operator!=(const QLatin1String& b, const Latin1Literal& a) +template bool operator!=(const QLatin1Constant& a, const QString& b) { - return QLatin1String(a.str) != b; + return b != QLatin1String(a.chars); } -template bool operator!=(const QString& b, const Latin1Literal& a) +template bool operator!=(const QString& b, const QLatin1Constant& a) { - return b != QLatin1String(a.str); + return b != QLatin1String(a.chars); } -#define Q_DECLARE_LATIN1_LITERAL(varname, str) static const Latin1Literal varname -#define Q_DEFINE_LATIN1_LITERAL(varname, str) const Latin1Literal varname = {str} +#define Q_DECLARE_LATIN1_CONSTANT(varname, str) static const QLatin1Constant varname +#define Q_DEFINE_LATIN1_CONSTANT(varname, str) const QLatin1Constant varname = {str} + +/* XXX - deprecation stuff */ +#define Q_DECLARE_LATIN1_LITERAL(v, s) Q_DECLARE_LATIN1_CONSTANT(v, s) +#define Q_DEFINE_LATIN1_LITERAL(v, s) Q_DEFINE_LATIN1_CONSTANT(v, s) +template struct Latin1Literal : public QLatin1Constant +{ }; QTM_END_NAMESPACE // Not needed since this is a typedef, and qglobal already does this for the base type // Q_DECLARE_TYPEINFO(QTM_PREPEND_NAMESPACE(QContactLocalId), Q_PRIMITIVE_TYPE); +// Workaround for unannounced SC break +#include "qcontactid.h" + #endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -57,17 +57,6 @@ \ingroup contacts-requests */ -/*! - \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 */ QContactDetailDefinitionFetchRequest::QContactDetailDefinitionFetchRequest() : QContactAbstractRequest(new QContactDetailDefinitionFetchRequestPrivate) @@ -79,26 +68,6 @@ { } -/*! - \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) { diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionfetchrequest.h Mon May 03 12:24:20 2010 +0300 @@ -61,10 +61,8 @@ ~QContactDetailDefinitionFetchRequest(); /* Selection */ - 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 setDefinitionNames(const QStringList& names); + QStringList definitionNames() const; void setContactType(const QString& contactType); QString contactType() const; @@ -72,9 +70,6 @@ QMap definitions() const; QMap errorMap() const; -signals: - void progress(QContactDetailDefinitionFetchRequest* self, bool appendOnly); // DEPRECATED - private: Q_DISABLE_COPY(QContactDetailDefinitionFetchRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -57,16 +57,6 @@ \ingroup contacts-requests */ -/*! - \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 */ QContactDetailDefinitionRemoveRequest::QContactDetailDefinitionRemoveRequest() : QContactAbstractRequest(new QContactDetailDefinitionRemoveRequestPrivate) @@ -79,38 +69,6 @@ } /*! - \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; -} - -/*! - \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; -} - -/*! - \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. diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionremoverequest.h Mon May 03 12:24:20 2010 +0300 @@ -59,19 +59,13 @@ ~QContactDetailDefinitionRemoveRequest(); /* Selection */ - 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 ^^ + QStringList definitionNames() const; QString contactType() const; /* Results */ QMap errorMap() const; -signals: - void progress(QContactDetailDefinitionRemoveRequest* self); // deprecated - private: Q_DISABLE_COPY(QContactDetailDefinitionRemoveRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -58,16 +58,6 @@ \ingroup contacts-requests */ -/*! - \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 */ QContactDetailDefinitionSaveRequest::QContactDetailDefinitionSaveRequest() : QContactAbstractRequest(new QContactDetailDefinitionSaveRequestPrivate) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactdetaildefinitionsaverequest.h Mon May 03 12:24:20 2010 +0300 @@ -69,9 +69,6 @@ QList definitions() const; QMap errorMap() const; -signals: - void progress(QContactDetailDefinitionSaveRequest* self); // deprecated - private: Q_DISABLE_COPY(QContactDetailDefinitionSaveRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -57,17 +57,6 @@ \ingroup contacts-requests */ -/*! - \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 */ QContactFetchRequest::QContactFetchRequest() : QContactAbstractRequest(new QContactFetchRequestPrivate) @@ -93,13 +82,32 @@ d->m_sorting = sorting; } -/*! Sets the list of allowable detail definition names to \a definitionNames. Any contacts retrieved - by the request will have any details whose definition name is not on the restricted list - removed prior to being returned. */ +/*! + Sets the fetch hint which may be used by the backend to optimize contact retrieval + to \a fetchHint. A client should not make changes to a contact which has been retrieved + using a fetch hint other than the default fetch hint. Doing so will result in information + loss when saving the contact back to the manager (as the "new" restricted contact will + replace the previously saved contact in the backend). + \sa QContactFetchHint + */ +void QContactFetchRequest::setFetchHint(const QContactFetchHint &fetchHint) +{ + Q_D(QContactFetchRequest); + d->m_fetchHint = fetchHint; +} + +/*! + \deprecated + Sets the list of allowable detail definition names to \a definitionNames. Any contacts retrieved + by the request will have any details whose definition name is not on the restricted list + removed prior to being returned. + This function is deprecated and will be removed after the transition period has been elapsed. Use setFetchHint() instead. + */ void QContactFetchRequest::setDefinitionRestrictions(const QStringList& definitionNames) { - Q_D(QContactFetchRequest); - d->m_definitionRestrictions = definitionNames; + //Q_D(QContactFetchRequest); + Q_UNUSED(definitionNames); + qWarning("QContactFetchRequest::setDefinitionRestrictions() This function is deprecated and will be removed once the transition period has elapsed. Use setFetchHint() instead!"); } /*! Returns the filter that will be used to select contacts to be returned */ @@ -116,11 +124,30 @@ return d->m_sorting; } -/*! Returns the list of definition names which define which details contacts in the result list will be limited to */ +/*! + Returns the fetch hint which may be used by the backend to optimize contact retrieval. + A client should not make changes to a contact which has been retrieved + using a fetch hint other than the default fetch hint. Doing so will result in information + loss when saving the contact back to the manager (as the "new" restricted contact will + replace the previously saved contact in the backend). + \sa QContactFetchHint + */ +QContactFetchHint QContactFetchRequest::fetchHint() const +{ + Q_D(const QContactFetchRequest); + return d->m_fetchHint; +} + +/*! + \deprecated + Returns the list of definition names which define which details contacts in the result list will be limited to. + This function is deprecated and will be removed after the transition period has been elapsed. Use fetchHint() instead. + */ QStringList QContactFetchRequest::definitionRestrictions() const { - Q_D(const QContactFetchRequest); - return d->m_definitionRestrictions; + //Q_D(const QContactFetchRequest); + qWarning("QContactFetchRequest::definitionRestrictions() This function is deprecated and will be removed once the transition period has elapsed. Use fetchHint() instead!"); + return QStringList(); } /*! Returns the list of contacts retrieved by this request */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactfetchrequest.h Mon May 03 12:24:20 2010 +0300 @@ -47,6 +47,7 @@ #include "qcontactsortorder.h" #include "qcontactfilter.h" #include "qcontact.h" +#include "qcontactfetchhint.h" #include #include @@ -65,17 +66,17 @@ /* Selection, restriction and sorting */ void setFilter(const QContactFilter& filter); void setSorting(const QList& sorting); - void setDefinitionRestrictions(const QStringList& definitionNames); + void setFetchHint(const QContactFetchHint& fetchHint); QContactFilter filter() const; QList sorting() const; - QStringList definitionRestrictions() const; + QContactFetchHint fetchHint() const; + + void Q_DECL_DEPRECATED setDefinitionRestrictions(const QStringList& definitionNames); + QStringList Q_DECL_DEPRECATED definitionRestrictions() const; /* Results */ QList contacts() const; -signals: - void progress(QContactFetchRequest* self, bool appendOnly); // deprecated - private: Q_DISABLE_COPY(QContactFetchRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -57,17 +57,6 @@ \ingroup contacts-requests */ -/*! - \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 */ QContactLocalIdFetchRequest::QContactLocalIdFetchRequest() : QContactAbstractRequest(new QContactLocalIdFetchRequestPrivate) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactlocalidfetchrequest.h Mon May 03 12:24:20 2010 +0300 @@ -70,9 +70,6 @@ /* Results */ QList ids() const; -signals: - void progress(QContactLocalIdFetchRequest* self, bool appendOnly); // deprecated - private: Q_DISABLE_COPY(QContactLocalIdFetchRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -59,21 +59,6 @@ \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, - 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 relationship fetch request */ QContactRelationshipFetchRequest::QContactRelationshipFetchRequest() @@ -141,54 +126,6 @@ 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 - \a role is \c QContactRelationshipFilter::Either, a relationship - will match the criterion if the contact appears in the relationship - as either the source or a destination contact. If the \a - participantUri references a contact in a different manager to the - one from which the relationships are being fetched and the \a role - is \c QContactRelationshipFilter::Either, a relationship will match - the criterion only if the contact appears in the relationship as a - destination contact. If the \a participantUri references a contact - in a different manager to the one from which the relationships are - being fetched and the \a role is \c - QContactRelationshipFilter::Source, no relationships will be - fetched. - - If the \a participantUri consists of an empty manager URI and the - zero contact id, or if the participant criterion is not set, the - request will fetch relationships involving any participant. - */ -void QContactRelationshipFetchRequest::setParticipant(const QContactId& participantUri, QContactRelationshipFilter::Role role) -{ - Q_D(QContactRelationshipFetchRequest); - d->m_participantUri = participantUri; - d->m_role = role; -} - -/*! - \internal - Returns the participant criterion of the fetch request - */ -QContactId QContactRelationshipFetchRequest::participant() const -{ - Q_D(const QContactRelationshipFetchRequest); - return d->m_participantUri; -} - -/*! - \internal - Returns the role of the participant criterion of the fetch request - */ -QContactRelationshipFilter::Role QContactRelationshipFetchRequest::participantRole() const -{ - Q_D(const QContactRelationshipFetchRequest); - return d->m_role; -} /*! Returns the list of relationships that was the result of the request */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipfetchrequest.h Mon May 03 12:24:20 2010 +0300 @@ -69,21 +69,12 @@ void setRelationshipType(const QString& relationshipType); QString relationshipType() 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); // deprecated - private: Q_DISABLE_COPY(QContactRelationshipFetchRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -58,16 +58,6 @@ \ingroup contacts-requests */ -/*! - \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 */ QContactRelationshipRemoveRequest::QContactRelationshipRemoveRequest() : QContactAbstractRequest(new QContactRelationshipRemoveRequestPrivate) @@ -80,7 +70,7 @@ } /*! - \internal + \deprecated 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. @@ -94,7 +84,7 @@ } /*! - \internal + \deprecated 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. */ @@ -105,7 +95,7 @@ } /*! - \internal + \deprecated 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. @@ -119,7 +109,7 @@ } /*! - \internal + \deprecated 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. */ @@ -130,7 +120,7 @@ } /*! - \internal + \deprecated 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. @@ -144,7 +134,7 @@ } /*! - \internal + \deprecated 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. */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipremoverequest.h Mon May 03 12:24:20 2010 +0300 @@ -74,10 +74,6 @@ /* Results */ QMap errorMap() const; - -signals: - void progress(QContactRelationshipRemoveRequest* self); // deprecated - private: Q_DISABLE_COPY(QContactRelationshipRemoveRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -57,16 +57,6 @@ \ingroup contacts-requests */ -/*! - \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 */ QContactRelationshipSaveRequest::QContactRelationshipSaveRequest() : QContactAbstractRequest(new QContactRelationshipSaveRequestPrivate) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrelationshipsaverequest.h Mon May 03 12:24:20 2010 +0300 @@ -67,9 +67,6 @@ QList relationships() const; QMap errorMap() const; -signals: - void progress(QContactRelationshipSaveRequest* self); // deprecated - private: Q_DISABLE_COPY(QContactRelationshipSaveRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactremoverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactremoverequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactremoverequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -56,16 +56,6 @@ \ingroup contacts-requests */ -/*! - \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 */ QContactRemoveRequest::QContactRemoveRequest() : QContactAbstractRequest(new QContactRemoveRequestPrivate) @@ -78,7 +68,7 @@ } /*! - \internal + \deprecated 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(). */ @@ -89,7 +79,7 @@ } /*! - \internal + \deprecated 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(). */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactremoverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactremoverequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactremoverequest.h Mon May 03 12:24:20 2010 +0300 @@ -69,9 +69,6 @@ /* Results */ QMap errorMap() const; -signals: - void progress(QContactRemoveRequest* self); // deprecated in week 2, removed after transition period has elapsed. - private: Q_DISABLE_COPY(QContactRemoveRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactrequests_p.h --- a/qtcontactsmobility/src/contacts/requests/qcontactrequests_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactrequests_p.h Mon May 03 12:24:20 2010 +0300 @@ -105,7 +105,7 @@ QContactFilter m_filter; QList m_sorting; - QStringList m_definitionRestrictions; + QContactFetchHint m_fetchHint; QList m_contacts; }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactsaverequest.cpp --- a/qtcontactsmobility/src/contacts/requests/qcontactsaverequest.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactsaverequest.cpp Mon May 03 12:24:20 2010 +0300 @@ -57,13 +57,6 @@ \ingroup contacts-requests */ -/*! - * \fn QContactSaveRequest::progress(QContactSaveRequest* 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. - */ - /*! Constructs a new contact save request */ QContactSaveRequest::QContactSaveRequest() : QContactAbstractRequest(new QContactSaveRequestPrivate) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/contacts/requests/qcontactsaverequest.h --- a/qtcontactsmobility/src/contacts/requests/qcontactsaverequest.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/contacts/requests/qcontactsaverequest.h Mon May 03 12:24:20 2010 +0300 @@ -66,9 +66,6 @@ QList contacts() const; QMap errorMap() const; -signals: - void progress(QContactSaveRequest* self); // deprecated - private: Q_DISABLE_COPY(QContactSaveRequest) friend class QContactManagerEngine; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/s60installs/bwins/QtContactsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/s60installs/bwins/QtContactsu.def Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,1183 @@ +EXPORTS + ?FieldStreet@QContactAddress@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 1 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactAddress::FieldStreet + ?setEventType@QContactChangeLogFilter@QtMobility@@QAEXW4EventType@12@@Z @ 2 NONAME ; void QtMobility::QContactChangeLogFilter::setEventType(enum QtMobility::QContactChangeLogFilter::EventType) + ?setVendor@QContactActionFilter@QtMobility@@QAEXABVQString@@H@Z @ 3 NONAME ; void QtMobility::QContactActionFilter::setVendor(class QString const &, int) + ?setTimestamp@QContactPresence@QtMobility@@QAEXABVQDateTime@@@Z @ 4 NONAME ; void QtMobility::QContactPresence::setTimestamp(class QDateTime const &) + ?metaObject@QContactRelationshipRemoveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 5 NONAME ; struct QMetaObject const * QtMobility::QContactRelationshipRemoveRequest::metaObject(void) const + ?qt_metacall@QContactLocalIdFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 6 NONAME ; int QtMobility::QContactLocalIdFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?imageUrl@QContactAvatar@QtMobility@@QBE?AVQUrl@@XZ @ 7 NONAME ; class QUrl QtMobility::QContactAvatar::imageUrl(void) const + ?direction@QContactSortOrder@QtMobility@@QBE?AW4SortOrder@Qt@@XZ @ 8 NONAME ; enum Qt::SortOrder QtMobility::QContactSortOrder::direction(void) const + ?FieldCreationTimestamp@QContactTimestamp@QtMobility@@2U?$QLatin1Constant@$0BC@@2@B @ 9 NONAME ; struct QtMobility::QLatin1Constant<18> const QtMobility::QContactTimestamp::FieldCreationTimestamp + ?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 &) + ?availableActions@QContactAction@QtMobility@@SA?AVQStringList@@ABVQString@@H@Z @ 11 NONAME ; class QStringList QtMobility::QContactAction::availableActions(class QString const &, int) + ??1QContactIntersectionFilter@QtMobility@@UAE@XZ @ 12 NONAME ; QtMobility::QContactIntersectionFilter::~QContactIntersectionFilter(void) + ?staticMetaObject@QContactFetchRequest@QtMobility@@2UQMetaObject@@B @ 13 NONAME ; struct QMetaObject const QtMobility::QContactFetchRequest::staticMetaObject + ?value@QContactActionFilter@QtMobility@@QBE?AVQVariant@@XZ @ 14 NONAME ; class QVariant QtMobility::QContactActionFilter::value(void) const + ??0QContactDisplayLabel@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 15 NONAME ; QtMobility::QContactDisplayLabel::QContactDisplayLabel(class QtMobility::QContactDetail const &) + ??8QContactDetailDefinition@QtMobility@@QBE_NABV01@@Z @ 16 NONAME ; bool QtMobility::QContactDetailDefinition::operator==(class QtMobility::QContactDetailDefinition const &) const + ?setLinkedDetailUris@QContactDetail@QtMobility@@QAEXABVQString@@@Z @ 17 NONAME ; void QtMobility::QContactDetail::setLinkedDetailUris(class QString const &) + ?tr@QContactAction@QtMobility@@SA?AVQString@@PBD0@Z @ 18 NONAME ; class QString QtMobility::QContactAction::tr(char const *, char const *) + ?supportedDataTypes@QContactManager@QtMobility@@QBE?AV?$QList@W4Type@QVariant@@@@XZ @ 19 NONAME ; class QList QtMobility::QContactManager::supportedDataTypes(void) const + ?vendorName@QContactActionFilter@QtMobility@@QBE?AVQString@@XZ @ 20 NONAME ; class QString QtMobility::QContactActionFilter::vendorName(void) const + ?qt_metacast@QContactRelationshipRemoveRequest@QtMobility@@UAEPAXPBD@Z @ 21 NONAME ; void * QtMobility::QContactRelationshipRemoveRequest::qt_metacast(char const *) + ??0QContactFetchHint@QtMobility@@QAE@XZ @ 22 NONAME ; QtMobility::QContactFetchHint::QContactFetchHint(void) + ?setAltitudeAccuracy@QContactGeoLocation@QtMobility@@QAEXN@Z @ 23 NONAME ; void QtMobility::QContactGeoLocation::setAltitudeAccuracy(double) + ?remove@QContactIntersectionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 24 NONAME ; void QtMobility::QContactIntersectionFilter::remove(class QtMobility::QContactFilter const &) + ?d_func@QContactDetailDefinitionSaveRequest@QtMobility@@ABEPBVQContactDetailDefinitionSaveRequestPrivate@2@XZ @ 25 NONAME ; class QtMobility::QContactDetailDefinitionSaveRequestPrivate const * QtMobility::QContactDetailDefinitionSaveRequest::d_func(void) const + ?qt_metacall@QContactRelationshipFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 26 NONAME ; int QtMobility::QContactRelationshipFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?action@QContactAction@QtMobility@@SAPAV12@ABVQContactActionDescriptor@2@@Z @ 27 NONAME ; class QtMobility::QContactAction * QtMobility::QContactAction::action(class QtMobility::QContactActionDescriptor const &) + ??1QContactDetail@QtMobility@@UAE@XZ @ 28 NONAME ; QtMobility::QContactDetail::~QContactDetail(void) + ??1QContactTag@QtMobility@@UAE@XZ @ 29 NONAME ; QtMobility::QContactTag::~QContactTag(void) + ?saveContact@QContactManager@QtMobility@@QAE_NPAVQContact@2@@Z @ 30 NONAME ; bool QtMobility::QContactManager::saveContact(class QtMobility::QContact *) + ?ids@QContactLocalIdFilter@QtMobility@@QBE?AV?$QList@I@@XZ @ 31 NONAME ; class QList QtMobility::QContactLocalIdFilter::ids(void) const + ?getStaticMetaObject@QContactDetailDefinitionRemoveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 32 NONAME ; struct QMetaObject const & QtMobility::QContactDetailDefinitionRemoveRequest::getStaticMetaObject(void) + ?SubTypeHouse@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 33 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactAnniversary::SubTypeHouse + ?statusMessage@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 34 NONAME ; class QString QtMobility::QContactOnlineAccount::statusMessage(void) const + ?getStaticMetaObject@QContactManager@QtMobility@@SAABUQMetaObject@@XZ @ 35 NONAME ; struct QMetaObject const & QtMobility::QContactManager::getStaticMetaObject(void) + ?tr@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 36 NONAME ; class QString QtMobility::QContactRemoveRequest::tr(char const *, char const *, int) + ?setValue@QContactDetailFilter@QtMobility@@QAEXABVQVariant@@@Z @ 37 NONAME ; void QtMobility::QContactDetailFilter::setValue(class QVariant const &) + ?setAvatar@QContactAvatar@QtMobility@@QAE_NABVQString@@@Z @ 38 NONAME ; bool QtMobility::QContactAvatar::setAvatar(class QString const &) + ?first@QContactRelationshipFetchRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 39 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFetchRequest::first(void) const + ?qt_metacall@QContactAbstractRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 40 NONAME ; int QtMobility::QContactAbstractRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?fetchHint@QContactFetchRequest@QtMobility@@QBE?AVQContactFetchHint@2@XZ @ 41 NONAME ; class QtMobility::QContactFetchHint QtMobility::QContactFetchRequest::fetchHint(void) const + ?PresenceExtendedAway@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 42 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactOnlineAccount::PresenceExtendedAway + ?tr@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 43 NONAME ; class QString QtMobility::QContactSaveRequest::tr(char const *, char const *) + ?FieldTimestamp@QContactGlobalPresence@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 44 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactGlobalPresence::FieldTimestamp + ??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) + ?FieldAudioRingtoneUrl@QContactRingtone@QtMobility@@2U?$QLatin1Constant@$0BB@@2@B @ 48 NONAME ; struct QtMobility::QLatin1Constant<17> const QtMobility::QContactRingtone::FieldAudioRingtoneUrl + ??1QContactInvalidFilter@QtMobility@@UAE@XZ @ 49 NONAME ; QtMobility::QContactInvalidFilter::~QContactInvalidFilter(void) + ?linkedDetailUris@QContactDetail@QtMobility@@QBE?AVQStringList@@XZ @ 50 NONAME ; class QStringList QtMobility::QContactDetail::linkedDetailUris(void) const + ??0QContactManagerEngine@QtMobility@@QAE@XZ @ 51 NONAME ; QtMobility::QContactManagerEngine::QContactManagerEngine(void) + ?contactIds@QContactManager@QtMobility@@QBE?AV?$QList@I@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 52 NONAME ; class QList QtMobility::QContactManager::contactIds(class QtMobility::QContactFilter const &, class QList const &) const + ?HasSpouse@QContactRelationship@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 53 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactRelationship::HasSpouse + ??0QContactGlobalPresence@QtMobility@@QAE@XZ @ 54 NONAME ; QtMobility::QContactGlobalPresence::QContactGlobalPresence(void) + ?trUtf8@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 55 NONAME ; class QString QtMobility::QContactManagerEngine::trUtf8(char const *, char const *, int) + ?relationshipType@QContactRelationshipFetchRequest@QtMobility@@QBE?AVQString@@XZ @ 56 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::relationshipType(void) const + ?second@QContactRelationship@QtMobility@@QBE?AVQContactId@2@XZ @ 57 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationship::second(void) const + ?d_func@QContactRelationshipSaveRequest@QtMobility@@AAEPAVQContactRelationshipSaveRequestPrivate@2@XZ @ 58 NONAME ; class QtMobility::QContactRelationshipSaveRequestPrivate * QtMobility::QContactRelationshipSaveRequest::d_func(void) + ?setStatusMessage@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 59 NONAME ; void QtMobility::QContactOnlineAccount::setStatusMessage(class QString const &) + ??0QContactFetchRequest@QtMobility@@QAE@XZ @ 60 NONAME ; QtMobility::QContactFetchRequest::QContactFetchRequest(void) + ?DefinitionName@QContactUrl@QtMobility@@2U?$QLatin1Constant@$03@2@B @ 61 NONAME ; struct QtMobility::QLatin1Constant<4> const QtMobility::QContactUrl::DefinitionName + ??4QContactName@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 62 NONAME ; class QtMobility::QContactName & QtMobility::QContactName::operator=(class QtMobility::QContactDetail const &) + ?DefinitionName@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$0M@@2@B @ 63 NONAME ; struct QtMobility::QLatin1Constant<12> const QtMobility::QContactAnniversary::DefinitionName + ?cancel@QContactAbstractRequest@QtMobility@@QAE_NXZ @ 64 NONAME ; bool QtMobility::QContactAbstractRequest::cancel(void) + ?FieldLocation@QContactOrganization@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 65 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactOrganization::FieldLocation + ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQContactFetchHint@2@@Z @ 66 NONAME ; class QList QtMobility::QContactManager::contacts(class QtMobility::QContactFilter const &, class QList const &, class QtMobility::QContactFetchHint const &) const + ?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 + ?detailDefinitionsHint@QContactFetchHint@QtMobility@@QBE?AVQStringList@@XZ @ 69 NONAME ; class QStringList QtMobility::QContactFetchHint::detailDefinitionsHint(void) const + ?SubTypeAssistant@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 70 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactPhoneNumber::SubTypeAssistant + ?clearAll@QContactChangeSet@QtMobility@@QAEXXZ @ 71 NONAME ; void QtMobility::QContactChangeSet::clearAll(void) + ?d_func@QContactDetailRangeFilter@QtMobility@@ABEPBVQContactDetailRangeFilterPrivate@2@XZ @ 72 NONAME ; class QtMobility::QContactDetailRangeFilterPrivate const * QtMobility::QContactDetailRangeFilter::d_func(void) const + ?type@QContactType@QtMobility@@QBE?AVQString@@XZ @ 73 NONAME ; class QString QtMobility::QContactType::type(void) const + ?d_func@QContactLocalIdFetchRequest@QtMobility@@ABEPBVQContactLocalIdFetchRequestPrivate@2@XZ @ 74 NONAME ; class QtMobility::QContactLocalIdFetchRequestPrivate const * QtMobility::QContactLocalIdFetchRequest::d_func(void) const + ??_EQContactRingtone@QtMobility@@UAE@I@Z @ 75 NONAME ; QtMobility::QContactRingtone::~QContactRingtone(unsigned int) + ?FieldPostcode@QContactAddress@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 76 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactAddress::FieldPostcode + ??_EQContactLocalIdFetchRequest@QtMobility@@UAE@I@Z @ 77 NONAME ; QtMobility::QContactLocalIdFetchRequest::~QContactLocalIdFetchRequest(unsigned int) + ?setImageUrl@QContactAvatar@QtMobility@@QAEXABVQUrl@@@Z @ 78 NONAME ; void QtMobility::QContactAvatar::setImageUrl(class QUrl const &) + ?DefinitionName@QContactGender@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 79 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactGender::DefinitionName + ?schemaDefinitions@QContactManagerEngine@QtMobility@@SA?AV?$QMap@VQString@@V?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@@@XZ @ 80 NONAME ; class QMap > QtMobility::QContactManagerEngine::schemaDefinitions(void) + ?setOptimizationHints@QContactFetchHint@QtMobility@@QAEXV?$QFlags@W4OptimizationHint@QContactFetchHint@QtMobility@@@@@Z @ 81 NONAME ; void QtMobility::QContactFetchHint::setOptimizationHints(class QFlags) + ?detailDefinitionName@QContactDetailFilter@QtMobility@@QBE?AVQString@@XZ @ 82 NONAME ; class QString QtMobility::QContactDetailFilter::detailDefinitionName(void) const + ?getStaticMetaObject@QContactLocalIdFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 83 NONAME ; struct QMetaObject const & QtMobility::QContactLocalIdFetchRequest::getStaticMetaObject(void) + ?relatedContacts@QContact@QtMobility@@QBE?AV?$QList@VQContactId@QtMobility@@@@ABVQString@@W4Role@QContactRelationshipFilter@2@@Z @ 84 NONAME ; class QList QtMobility::QContact::relatedContacts(class QString const &, enum QtMobility::QContactRelationshipFilter::Role) const + ?customMessage@QContactGlobalPresence@QtMobility@@QBE?AVQString@@XZ @ 85 NONAME ; class QString QtMobility::QContactGlobalPresence::customMessage(void) const + ?setName@QContactDetailDefinition@QtMobility@@QAEXABVQString@@@Z @ 86 NONAME ; void QtMobility::QContactDetailDefinition::setName(class QString const &) + ?displayLabel@QContact@QtMobility@@QBE?AVQString@@XZ @ 87 NONAME ; class QString QtMobility::QContact::displayLabel(void) const + ?assign@QContactDetail@QtMobility@@IAEAAV12@ABV12@ABVQString@@@Z @ 88 NONAME ; class QtMobility::QContactDetail & QtMobility::QContactDetail::assign(class QtMobility::QContactDetail const &, class QString const &) + ??4QContactEmailAddress@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 89 NONAME ; class QtMobility::QContactEmailAddress & QtMobility::QContactEmailAddress::operator=(class QtMobility::QContactDetail const &) + ?tr@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 90 NONAME ; class QString QtMobility::QContactSaveRequest::tr(char const *, char const *, int) + ??1QContactBirthday@QtMobility@@UAE@XZ @ 91 NONAME ; QtMobility::QContactBirthday::~QContactBirthday(void) + ?qt_metacall@QContactRelationshipSaveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 92 NONAME ; int QtMobility::QContactRelationshipSaveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?setLastName@QContactName@QtMobility@@QAEXABVQString@@@Z @ 93 NONAME ; void QtMobility::QContactName::setLastName(class QString const &) + ?trUtf8@QContactManager@QtMobility@@SA?AVQString@@PBD0H@Z @ 94 NONAME ; class QString QtMobility::QContactManager::trUtf8(char const *, char const *, int) + ?tr@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 95 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::tr(char const *, char const *, int) + ?DefinitionName@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$0M@@2@B @ 96 NONAME ; struct QtMobility::QLatin1Constant<12> const QtMobility::QContactPhoneNumber::DefinitionName + ?definitions@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@XZ @ 97 NONAME ; class QMap QtMobility::QContactDetailDefinitionFetchRequest::definitions(void) const + ?setSubType@QContactAnniversary@QtMobility@@QAEXABVQString@@@Z @ 98 NONAME ; void QtMobility::QContactAnniversary::setSubType(class QString const &) + ??1QContact@QtMobility@@QAE@XZ @ 99 NONAME ; QtMobility::QContact::~QContact(void) + ?FieldVideoRingtoneUrl@QContactRingtone@QtMobility@@2U?$QLatin1Constant@$0BB@@2@B @ 100 NONAME ; struct QtMobility::QLatin1Constant<17> const QtMobility::QContactRingtone::FieldVideoRingtoneUrl + ?updateContactFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactFetchRequest@2@ABV?$QList@VQContact@QtMobility@@@@W4Error@QContactManager@2@@Z @ 101 NONAME ; void QtMobility::QContactManagerEngine::updateContactFetchRequest(class QtMobility::QContactFetchRequest *, class QList const &, enum QtMobility::QContactManager::Error) + ??9QContactSortOrder@QtMobility@@QBE_NABV01@@Z @ 102 NONAME ; bool QtMobility::QContactSortOrder::operator!=(class QtMobility::QContactSortOrder const &) const + ?setLinkedDetailUris@QContactDetail@QtMobility@@QAEXABVQStringList@@@Z @ 103 NONAME ; void QtMobility::QContactDetail::setLinkedDetailUris(class QStringList const &) + ?trUtf8@QContactManager@QtMobility@@SA?AVQString@@PBD0@Z @ 104 NONAME ; class QString QtMobility::QContactManager::trUtf8(char const *, char const *) + ?details@QContact@QtMobility@@QBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQString@@00@Z @ 105 NONAME ; class QList QtMobility::QContact::details(class QString const &, class QString const &, class QString const &) const + ?setName@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 106 NONAME ; void QtMobility::QContactOrganization::setName(class QString const &) + ?timestamp@QContactGeoLocation@QtMobility@@QBE?AVQDateTime@@XZ @ 107 NONAME ; class QDateTime QtMobility::QContactGeoLocation::timestamp(void) const + ?append@QContactUnionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 108 NONAME ; void QtMobility::QContactUnionFilter::append(class QtMobility::QContactFilter const &) + ??0QContactGeoLocation@QtMobility@@QAE@XZ @ 109 NONAME ; QtMobility::QContactGeoLocation::QContactGeoLocation(void) + ?isFinished@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 110 NONAME ; bool QtMobility::QContactAbstractRequest::isFinished(void) const + ??0QContactChangeSet@QtMobility@@QAE@XZ @ 111 NONAME ; QtMobility::QContactChangeSet::QContactChangeSet(void) + ??0QContactInvalidFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 112 NONAME ; QtMobility::QContactInvalidFilter::QContactInvalidFilter(class QtMobility::QContactFilter const &) + ?removeDetailDefinition@QContactManagerEngine@QtMobility@@UAE_NABVQString@@0PAW4Error@QContactManager@2@@Z @ 113 NONAME ; bool QtMobility::QContactManagerEngine::removeDetailDefinition(class QString const &, class QString const &, enum QtMobility::QContactManager::Error *) + ?addedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 114 NONAME ; class QSet & QtMobility::QContactChangeSet::addedRelationshipsContacts(void) + ?createEngine@QContactManager@QtMobility@@AAEXABVQString@@ABV?$QMap@VQString@@V1@@@@Z @ 115 NONAME ; void QtMobility::QContactManager::createEngine(class QString const &, class QMap const &) + ??0QContactAddress@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 116 NONAME ; QtMobility::QContactAddress::QContactAddress(class QtMobility::QContactDetail const &) + ??1QContactRelationship@QtMobility@@QAE@XZ @ 117 NONAME ; QtMobility::QContactRelationship::~QContactRelationship(void) + ?d_func@QContactRelationshipFetchRequest@QtMobility@@ABEPBVQContactRelationshipFetchRequestPrivate@2@XZ @ 118 NONAME ; class QtMobility::QContactRelationshipFetchRequestPrivate const * QtMobility::QContactRelationshipFetchRequest::d_func(void) const + ??4QContactTag@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 119 NONAME ; class QtMobility::QContactTag & QtMobility::QContactTag::operator=(class QtMobility::QContactDetail const &) + ?tr@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 120 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::tr(char const *, char const *, int) + ??4QContactDetail@QtMobility@@QAEAAV01@ABV01@@Z @ 121 NONAME ; class QtMobility::QContactDetail & QtMobility::QContactDetail::operator=(class QtMobility::QContactDetail const &) + ?dataType@QContactDetailFieldDefinition@QtMobility@@QBE?AW4Type@QVariant@@XZ @ 122 NONAME ; enum QVariant::Type QtMobility::QContactDetailFieldDefinition::dataType(void) const + ??0QContactId@QtMobility@@QAE@XZ @ 123 NONAME ; QtMobility::QContactId::QContactId(void) + ?Is@QContactRelationship@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 124 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactRelationship::Is + ?url@QContactUrl@QtMobility@@QBE?AVQString@@XZ @ 125 NONAME ; class QString QtMobility::QContactUrl::url(void) const + ?setPostOfficeBox@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 126 NONAME ; void QtMobility::QContactAddress::setPostOfficeBox(class QString const &) + ?contact@QContactManager@QtMobility@@QBE?AVQContact@2@ABIABVQStringList@@@Z @ 127 NONAME ; class QtMobility::QContact QtMobility::QContactManager::contact(unsigned int const &, class QStringList const &) const + ??_EQContactAbstractRequest@QtMobility@@UAE@I@Z @ 128 NONAME ; QtMobility::QContactAbstractRequest::~QContactAbstractRequest(unsigned int) + ?DefinitionName@QContactPresence@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 129 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactPresence::DefinitionName + ?location@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 130 NONAME ; class QString QtMobility::QContactOrganization::location(void) const + ?minValue@QContactDetailRangeFilter@QtMobility@@QBE?AVQVariant@@XZ @ 131 NONAME ; class QVariant QtMobility::QContactDetailRangeFilter::minValue(void) const + ??_EQContactRelationshipFetchRequest@QtMobility@@UAE@I@Z @ 132 NONAME ; QtMobility::QContactRelationshipFetchRequest::~QContactRelationshipFetchRequest(unsigned int) + ??0QContactManager@QtMobility@@QAE@ABVQString@@HABV?$QMap@VQString@@V1@@@PAVQObject@@@Z @ 133 NONAME ; QtMobility::QContactManager::QContactManager(class QString const &, int, class QMap const &, class QObject *) + ?setDataType@QContactDetailFieldDefinition@QtMobility@@QAEXW4Type@QVariant@@@Z @ 134 NONAME ; void QtMobility::QContactDetailFieldDefinition::setDataType(enum QVariant::Type) + ??_EQContactNickname@QtMobility@@UAE@I@Z @ 135 NONAME ; QtMobility::QContactNickname::~QContactNickname(unsigned int) + ?detailsWithAction@QContact@QtMobility@@QBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQString@@@Z @ 136 NONAME ; class QList QtMobility::QContact::detailsWithAction(class QString const &) const + ?capabilities@QContactOnlineAccount@QtMobility@@QBE?AVQStringList@@XZ @ 137 NONAME ; class QStringList QtMobility::QContactOnlineAccount::capabilities(void) const + ?qt_metacall@QContactDetailDefinitionRemoveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 138 NONAME ; int QtMobility::QContactDetailDefinitionRemoveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ??_EQContactInvalidFilter@QtMobility@@UAE@I@Z @ 139 NONAME ; QtMobility::QContactInvalidFilter::~QContactInvalidFilter(unsigned int) + ?FieldNumber@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$0M@@2@B @ 140 NONAME ; struct QtMobility::QLatin1Constant<12> const QtMobility::QContactPhoneNumber::FieldNumber + ??0QContactOnlineAccount@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 141 NONAME ; QtMobility::QContactOnlineAccount::QContactOnlineAccount(class QtMobility::QContactDetail const &) + ?actionName@QContactActionDescriptor@QtMobility@@QBE?AVQString@@XZ @ 142 NONAME ; class QString QtMobility::QContactActionDescriptor::actionName(void) const + ?setPresenceStateImageUrl@QContactPresence@QtMobility@@QAEXABVQUrl@@@Z @ 143 NONAME ; void QtMobility::QContactPresence::setPresenceStateImageUrl(class QUrl const &) + ?setAllowableValues@QContactDetailFieldDefinition@QtMobility@@QAEXV?$QList@VQVariant@@@@@Z @ 144 NONAME ; void QtMobility::QContactDetailFieldDefinition::setAllowableValues(class QList) + ??1QContactDetailFieldDefinition@QtMobility@@QAE@XZ @ 145 NONAME ; QtMobility::QContactDetailFieldDefinition::~QContactDetailFieldDefinition(void) + ?d_func@QContactUnionFilter@QtMobility@@ABEPBVQContactUnionFilterPrivate@2@XZ @ 146 NONAME ; class QtMobility::QContactUnionFilterPrivate const * QtMobility::QContactUnionFilter::d_func(void) const + ?FieldMiddleName@QContactName@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 147 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactName::FieldMiddleName + ??0QContactFetchHint@QtMobility@@QAE@ABV01@@Z @ 148 NONAME ; QtMobility::QContactFetchHint::QContactFetchHint(class QtMobility::QContactFetchHint const &) + ?actionDescriptors@QContactAction@QtMobility@@SA?AV?$QList@VQContactActionDescriptor@QtMobility@@@@ABVQString@@0H@Z @ 149 NONAME ; class QList QtMobility::QContactAction::actionDescriptors(class QString const &, class QString const &, int) + ?detailFieldName@QContactDetailRangeFilter@QtMobility@@QBE?AVQString@@XZ @ 150 NONAME ; class QString QtMobility::QContactDetailRangeFilter::detailFieldName(void) const + ?setFirst@QContactRelationship@QtMobility@@QAEXABVQContactId@2@@Z @ 151 NONAME ; void QtMobility::QContactRelationship::setFirst(class QtMobility::QContactId const &) + ??9QContactDetail@QtMobility@@QBE_NABV01@@Z @ 152 NONAME ; bool QtMobility::QContactDetail::operator!=(class QtMobility::QContactDetail const &) const + ?saveRelationships@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 153 NONAME ; class QList QtMobility::QContactManager::saveRelationships(class QList *) + ?definitionNames@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AVQStringList@@XZ @ 154 NONAME ; class QStringList QtMobility::QContactDetailDefinitionFetchRequest::definitionNames(void) const + ?updateRelationshipRemoveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRelationshipRemoveRequest@2@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 155 NONAME ; void QtMobility::QContactManagerEngine::updateRelationshipRemoveRequest(class QtMobility::QContactRelationshipRemoveRequest *, enum QtMobility::QContactManager::Error, class QMap const &) + ?SubTypeFax@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$03@2@B @ 156 NONAME ; struct QtMobility::QLatin1Constant<4> const QtMobility::QContactPhoneNumber::SubTypeFax + ?FieldBirthday@QContactBirthday@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 157 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactBirthday::FieldBirthday + ?DefinitionName@QContactBirthday@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 158 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactBirthday::DefinitionName + ?setSpeed@QContactGeoLocation@QtMobility@@QAEXN@Z @ 159 NONAME ; void QtMobility::QContactGeoLocation::setSpeed(double) + ?setSecond@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 160 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setSecond(class QtMobility::QContactId const &) + ?removeContact@QContactManagerEngine@QtMobility@@UAE_NABIPAW4Error@QContactManager@2@@Z @ 161 NONAME ; bool QtMobility::QContactManagerEngine::removeContact(unsigned int const &, enum QtMobility::QContactManager::Error *) + ?setAltitude@QContactGeoLocation@QtMobility@@QAEXN@Z @ 162 NONAME ; void QtMobility::QContactGeoLocation::setAltitude(double) + ?oldAndNewSelfContactId@QContactChangeSet@QtMobility@@QBE?AU?$QPair@II@@XZ @ 163 NONAME ; struct QPair QtMobility::QContactChangeSet::oldAndNewSelfContactId(void) const + ?managerName@QContactManagerEngine@QtMobility@@UBE?AVQString@@XZ @ 164 NONAME ; class QString QtMobility::QContactManagerEngine::managerName(void) const + ?cancelRequest@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 165 NONAME ; bool QtMobility::QContactManagerEngine::cancelRequest(class QtMobility::QContactAbstractRequest *) + ?trUtf8@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 166 NONAME ; class QString QtMobility::QContactFetchRequest::trUtf8(char const *, char const *) + ?trUtf8@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 167 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::trUtf8(char const *, char const *) + ??1QContactGeoLocation@QtMobility@@UAE@XZ @ 168 NONAME ; QtMobility::QContactGeoLocation::~QContactGeoLocation(void) + ?setUnique@QContactDetailDefinition@QtMobility@@QAEX_N@Z @ 169 NONAME ; void QtMobility::QContactDetailDefinition::setUnique(bool) + ?PresenceAway@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 170 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactOnlineAccount::PresenceAway + ??0QContactManager@QtMobility@@QAE@PAVQObject@@@Z @ 171 NONAME ; QtMobility::QContactManager::QContactManager(class QObject *) + ?subType@QContactAnniversary@QtMobility@@QBE?AVQString@@XZ @ 172 NONAME ; class QString QtMobility::QContactAnniversary::subType(void) const + ?setRelatedContactRole@QContactRelationshipFilter@QtMobility@@QAEXW4Role@QContactRelationship@2@@Z @ 173 NONAME ; void QtMobility::QContactRelationshipFilter::setRelatedContactRole(enum QtMobility::QContactRelationship::Role) + ??9QContactRelationship@QtMobility@@QBE_NABV01@@Z @ 174 NONAME ; bool QtMobility::QContactRelationship::operator!=(class QtMobility::QContactRelationship const &) const + ?removeContacts@QContactManager@QtMobility@@QAE_NPAV?$QList@I@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 175 NONAME ; bool QtMobility::QContactManager::removeContacts(class QList *, class QMap *) + ?getStaticMetaObject@QContactRelationshipSaveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 176 NONAME ; struct QMetaObject const & QtMobility::QContactRelationshipSaveRequest::getStaticMetaObject(void) + ??4QContactId@QtMobility@@QAEAAV01@ABV01@@Z @ 177 NONAME ; class QtMobility::QContactId & QtMobility::QContactId::operator=(class QtMobility::QContactId const &) + ??4QContact@QtMobility@@QAEAAV01@ABV01@@Z @ 178 NONAME ; class QtMobility::QContact & QtMobility::QContact::operator=(class QtMobility::QContact const &) + ?FieldTitle@QContactOrganization@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 179 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactOrganization::FieldTitle + ??1QContactChangeLogFilter@QtMobility@@UAE@XZ @ 180 NONAME ; QtMobility::QContactChangeLogFilter::~QContactChangeLogFilter(void) + ?subTypes@QContactPhoneNumber@QtMobility@@QBE?AVQStringList@@XZ @ 181 NONAME ; class QStringList QtMobility::QContactPhoneNumber::subTypes(void) const + ?prepend@QContactUnionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 182 NONAME ; void QtMobility::QContactUnionFilter::prepend(class QtMobility::QContactFilter const &) + ?postcode@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 183 NONAME ; class QString QtMobility::QContactAddress::postcode(void) const + ?audioRingtoneUrl@QContactRingtone@QtMobility@@QBE?AVQUrl@@XZ @ 184 NONAME ; class QUrl QtMobility::QContactRingtone::audioRingtoneUrl(void) const + ?presenceStateImageUrl@QContactPresence@QtMobility@@QBE?AVQUrl@@XZ @ 185 NONAME ; class QUrl QtMobility::QContactPresence::presenceStateImageUrl(void) const + ?setDefinitionNames@QContactDetailDefinitionFetchRequest@QtMobility@@QAEXABVQStringList@@@Z @ 186 NONAME ; void QtMobility::QContactDetailDefinitionFetchRequest::setDefinitionNames(class QStringList const &) + ?FieldRole@QContactOrganization@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 187 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactOrganization::FieldRole + ?errors@QContactAbstractRequest@QtMobility@@QBE?AV?$QList@W4Error@QContactManager@QtMobility@@@@XZ @ 188 NONAME ; class QList QtMobility::QContactAbstractRequest::errors(void) const + ?selfContactIdChanged@QContactManagerEngine@QtMobility@@IAEXABI0@Z @ 189 NONAME ; void QtMobility::QContactManagerEngine::selfContactIdChanged(unsigned int const &, unsigned int const &) + ?PresenceOffline@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 190 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactOnlineAccount::PresenceOffline + ?d_func@QContactDetailDefinitionFetchRequest@QtMobility@@AAEPAVQContactDetailDefinitionFetchRequestPrivate@2@XZ @ 191 NONAME ; class QtMobility::QContactDetailDefinitionFetchRequestPrivate * QtMobility::QContactDetailDefinitionFetchRequest::d_func(void) + ?metaObject@QContactActionFactory@QtMobility@@UBEPBUQMetaObject@@XZ @ 192 NONAME ; struct QMetaObject const * QtMobility::QContactActionFactory::metaObject(void) const + ??1QContactName@QtMobility@@UAE@XZ @ 193 NONAME ; QtMobility::QContactName::~QContactName(void) + ??0QContact@QtMobility@@QAE@XZ @ 194 NONAME ; QtMobility::QContact::QContact(void) + ?gender@QContactGender@QtMobility@@QBE?AVQString@@XZ @ 195 NONAME ; class QString QtMobility::QContactGender::gender(void) const + ?setSelfContactId@QContactManagerEngine@QtMobility@@UAE_NABIPAW4Error@QContactManager@2@@Z @ 196 NONAME ; bool QtMobility::QContactManagerEngine::setSelfContactId(unsigned int const &, enum QtMobility::QContactManager::Error *) + ??0QContactGender@QtMobility@@QAE@XZ @ 197 NONAME ; QtMobility::QContactGender::QContactGender(void) + ?availableManagers@QContactManager@QtMobility@@SA?AVQStringList@@XZ @ 198 NONAME ; class QStringList QtMobility::QContactManager::availableManagers(void) + ?setDefinitionNames@QContactDetailDefinitionRemoveRequest@QtMobility@@QAEXABVQString@@ABVQStringList@@@Z @ 199 NONAME ; void QtMobility::QContactDetailDefinitionRemoveRequest::setDefinitionNames(class QString const &, class QStringList const &) + ?setType@QContact@QtMobility@@QAEXABVQString@@@Z @ 200 NONAME ; void QtMobility::QContact::setType(class QString const &) + ??0QContactNote@QtMobility@@QAE@XZ @ 201 NONAME ; QtMobility::QContactNote::QContactNote(void) + ??1QContactGuid@QtMobility@@UAE@XZ @ 202 NONAME ; QtMobility::QContactGuid::~QContactGuid(void) + ?saveContacts@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@VQContact@QtMobility@@@@@Z @ 203 NONAME ; class QList QtMobility::QContactManager::saveContacts(class QList *) + ?removedContacts@QContactChangeSet@QtMobility@@QBE?AV?$QSet@I@@XZ @ 204 NONAME ; class QSet QtMobility::QContactChangeSet::removedContacts(void) const + ??_EQContactGender@QtMobility@@UAE@I@Z @ 205 NONAME ; QtMobility::QContactGender::~QContactGender(unsigned int) + ?errorMap@QContactRelationshipSaveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 206 NONAME ; class QMap QtMobility::QContactRelationshipSaveRequest::errorMap(void) const + ?supportedDetails@QContactAction@QtMobility@@UBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQContact@2@@Z @ 207 NONAME ; class QList QtMobility::QContactAction::supportedDetails(class QtMobility::QContact const &) const + ?setLogoUrl@QContactOrganization@QtMobility@@QAEXABVQUrl@@@Z @ 208 NONAME ; void QtMobility::QContactOrganization::setLogoUrl(class QUrl const &) + ??_EQContactGlobalPresence@QtMobility@@UAE@I@Z @ 209 NONAME ; QtMobility::QContactGlobalPresence::~QContactGlobalPresence(unsigned int) + ?tr@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 210 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::tr(char const *, char const *) + ?tr@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 211 NONAME ; class QString QtMobility::QContactAbstractRequest::tr(char const *, char const *) + ?selfContactId@QContactManager@QtMobility@@QBEIXZ @ 212 NONAME ; unsigned int QtMobility::QContactManager::selfContactId(void) const + ?presenceState@QContactGlobalPresence@QtMobility@@QBE?AW4PresenceState@QContactPresence@2@XZ @ 213 NONAME ; enum QtMobility::QContactPresence::PresenceState QtMobility::QContactGlobalPresence::presenceState(void) const + ?d_func@QContactRelationshipSaveRequest@QtMobility@@ABEPBVQContactRelationshipSaveRequestPrivate@2@XZ @ 214 NONAME ; class QtMobility::QContactRelationshipSaveRequestPrivate const * QtMobility::QContactRelationshipSaveRequest::d_func(void) const + ?isActive@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 215 NONAME ; bool QtMobility::QContactAbstractRequest::isActive(void) const + ?contact@QContactManager@QtMobility@@QBE?AVQContact@2@ABIABVQContactFetchHint@2@@Z @ 216 NONAME ; class QtMobility::QContact QtMobility::QContactManager::contact(unsigned int const &, class QtMobility::QContactFetchHint const &) const + ?HasAssistant@QContactRelationship@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 217 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactRelationship::HasAssistant + ??_EQContactDetail@QtMobility@@UAE@I@Z @ 218 NONAME ; QtMobility::QContactDetail::~QContactDetail(unsigned int) + ?getStaticMetaObject@QContactAction@QtMobility@@SAABUQMetaObject@@XZ @ 219 NONAME ; struct QMetaObject const & QtMobility::QContactAction::getStaticMetaObject(void) + ??1QContactAddress@QtMobility@@UAE@XZ @ 220 NONAME ; QtMobility::QContactAddress::~QContactAddress(void) + ??_EQContactChangeLogFilter@QtMobility@@UAE@I@Z @ 221 NONAME ; QtMobility::QContactChangeLogFilter::~QContactChangeLogFilter(unsigned int) + ?setSubType@QContactUrl@QtMobility@@QAEXABVQString@@@Z @ 222 NONAME ; void QtMobility::QContactUrl::setSubType(class QString const &) + ?PresenceBusy@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 223 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactOnlineAccount::PresenceBusy + ?setAudioRingtoneUrl@QContactRingtone@QtMobility@@QAEXABVQUrl@@@Z @ 224 NONAME ; void QtMobility::QContactRingtone::setAudioRingtoneUrl(class QUrl const &) + ??4QContactNote@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 225 NONAME ; class QtMobility::QContactNote & QtMobility::QContactNote::operator=(class QtMobility::QContactDetail const &) + ?setTimestamp@QContactGlobalPresence@QtMobility@@QAEXABVQDateTime@@@Z @ 226 NONAME ; void QtMobility::QContactGlobalPresence::setTimestamp(class QDateTime const &) + ?setSubTypes@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 227 NONAME ; void QtMobility::QContactAddress::setSubTypes(class QString const &) + ?FieldPostOfficeBox@QContactAddress@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 228 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactAddress::FieldPostOfficeBox + ?DefinitionName@QContactDisplayLabel@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 229 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactDisplayLabel::DefinitionName + ?setCreated@QContactTimestamp@QtMobility@@QAEXABVQDateTime@@@Z @ 230 NONAME ; void QtMobility::QContactTimestamp::setCreated(class QDateTime const &) + ?relationships@QContactRelationshipFetchRequest@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 231 NONAME ; class QList QtMobility::QContactRelationshipFetchRequest::relationships(void) const + ?DefinitionName@QContactTag@QtMobility@@2U?$QLatin1Constant@$03@2@B @ 232 NONAME ; struct QtMobility::QLatin1Constant<4> const QtMobility::QContactTag::DefinitionName + ??1QContactFetchRequest@QtMobility@@UAE@XZ @ 233 NONAME ; QtMobility::QContactFetchRequest::~QContactFetchRequest(void) + ??6QtMobility@@YA?AVQDebug@@V1@ABVQContact@0@@Z @ 234 NONAME ; class QDebug QtMobility::operator<<(class QDebug, class QtMobility::QContact const &) + ?FieldServiceProvider@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$0BA@@2@B @ 235 NONAME ; struct QtMobility::QLatin1Constant<16> const QtMobility::QContactOnlineAccount::FieldServiceProvider + ?PresenceUnknown@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 236 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactOnlineAccount::PresenceUnknown + ??0QContactAvatar@QtMobility@@QAE@XZ @ 237 NONAME ; QtMobility::QContactAvatar::QContactAvatar(void) + ?insertRemovedContact@QContactChangeSet@QtMobility@@QAEXI@Z @ 238 NONAME ; void QtMobility::QContactChangeSet::insertRemovedContact(unsigned int) + ??1QContactLocalIdFetchRequest@QtMobility@@UAE@XZ @ 239 NONAME ; QtMobility::QContactLocalIdFetchRequest::~QContactLocalIdFetchRequest(void) + ?setCaseSensitivity@QContactSortOrder@QtMobility@@QAEXW4CaseSensitivity@Qt@@@Z @ 240 NONAME ; void QtMobility::QContactSortOrder::setCaseSensitivity(enum Qt::CaseSensitivity) + ??0QContactOnlineAccount@QtMobility@@QAE@XZ @ 241 NONAME ; QtMobility::QContactOnlineAccount::QContactOnlineAccount(void) + ?setSecond@QContactRelationship@QtMobility@@QAEXABVQContactId@2@@Z @ 242 NONAME ; void QtMobility::QContactRelationship::setSecond(class QtMobility::QContactId const &) + ?insertAddedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEXABV?$QList@I@@@Z @ 243 NONAME ; void QtMobility::QContactChangeSet::insertAddedRelationshipsContacts(class QList const &) + ?country@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 244 NONAME ; class QString QtMobility::QContactAddress::country(void) const + ?setTitle@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 245 NONAME ; void QtMobility::QContactOrganization::setTitle(class QString const &) + ?GenderMale@QContactGender@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 246 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactGender::GenderMale + ??0QContactFamily@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 247 NONAME ; QtMobility::QContactFamily::QContactFamily(class QtMobility::QContactDetail const &) + ?trUtf8@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 248 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::trUtf8(char const *, char const *, int) + ?FieldChildren@QContactFamily@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 249 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactFamily::FieldChildren + ?insertAddedContact@QContactChangeSet@QtMobility@@QAEXI@Z @ 250 NONAME ; void QtMobility::QContactChangeSet::insertAddedContact(unsigned int) + ??0QContactDetailDefinition@QtMobility@@QAE@ABV01@@Z @ 251 NONAME ; QtMobility::QContactDetailDefinition::QContactDetailDefinition(class QtMobility::QContactDetailDefinition const &) + ?prepend@QContactIntersectionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 252 NONAME ; void QtMobility::QContactIntersectionFilter::prepend(class QtMobility::QContactFilter const &) + ?detailUri@QContactDetail@QtMobility@@QBE?AVQString@@XZ @ 253 NONAME ; class QString QtMobility::QContactDetail::detailUri(void) const + ?setFilters@QContactUnionFilter@QtMobility@@QAEXABV?$QList@VQContactFilter@QtMobility@@@@@Z @ 254 NONAME ; void QtMobility::QContactUnionFilter::setFilters(class QList const &) + ?saveDetailDefinition@QContactManager@QtMobility@@QAE_NABVQContactDetailDefinition@2@ABVQString@@@Z @ 255 NONAME ; bool QtMobility::QContactManager::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &) + ??0QContactAnniversary@QtMobility@@QAE@XZ @ 256 NONAME ; QtMobility::QContactAnniversary::QContactAnniversary(void) + ?addedContacts@QContactChangeSet@QtMobility@@QBE?AV?$QSet@I@@XZ @ 257 NONAME ; class QSet QtMobility::QContactChangeSet::addedContacts(void) const + ??0QContactGeoLocation@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 258 NONAME ; QtMobility::QContactGeoLocation::QContactGeoLocation(class QtMobility::QContactDetail const &) + ?updateRequestState@QContactManagerEngine@QtMobility@@SAXPAVQContactAbstractRequest@2@W4State@32@@Z @ 259 NONAME ; void QtMobility::QContactManagerEngine::updateRequestState(class QtMobility::QContactAbstractRequest *, enum QtMobility::QContactAbstractRequest::State) + ?relationships@QContactRelationshipRemoveRequest@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 260 NONAME ; class QList QtMobility::QContactRelationshipRemoveRequest::relationships(void) const + ??4QContactFetchHint@QtMobility@@QAEAAV01@ABV01@@Z @ 261 NONAME ; class QtMobility::QContactFetchHint & QtMobility::QContactFetchHint::operator=(class QtMobility::QContactFetchHint const &) + ?lastName@QContactName@QtMobility@@QBE?AVQString@@XZ @ 262 NONAME ; class QString QtMobility::QContactName::lastName(void) const + ?waitForFinished@QContactAbstractRequest@QtMobility@@QAE_NH@Z @ 263 NONAME ; bool QtMobility::QContactAbstractRequest::waitForFinished(int) + ?qt_metacast@QContactManager@QtMobility@@UAEPAXPBD@Z @ 264 NONAME ; void * QtMobility::QContactManager::qt_metacast(char const *) + ?presenceStateImageUrl@QContactGlobalPresence@QtMobility@@QBE?AVQUrl@@XZ @ 265 NONAME ; class QUrl QtMobility::QContactGlobalPresence::presenceStateImageUrl(void) const + ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQStringList@@@Z @ 266 NONAME ; class QList QtMobility::QContactManager::contacts(class QtMobility::QContactFilter const &, class QList const &, class QStringList const &) const + ?oldAndNewSelfContactId@QContactChangeSet@QtMobility@@QAEAAU?$QPair@II@@XZ @ 267 NONAME ; struct QPair & QtMobility::QContactChangeSet::oldAndNewSelfContactId(void) + ?updateContactLocalIdFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactLocalIdFetchRequest@2@ABV?$QList@I@@W4Error@QContactManager@2@@Z @ 268 NONAME ; void QtMobility::QContactManagerEngine::updateContactLocalIdFetchRequest(class QtMobility::QContactLocalIdFetchRequest *, class QList const &, enum QtMobility::QContactManager::Error) + ?trUtf8@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 269 NONAME ; class QString QtMobility::QContactRemoveRequest::trUtf8(char const *, char const *, int) + ?DefinitionName@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$0M@@2@B @ 270 NONAME ; struct QtMobility::QLatin1Constant<12> const QtMobility::QContactGeoLocation::DefinitionName + ??_EQContactSyncTarget@QtMobility@@UAE@I@Z @ 271 NONAME ; QtMobility::QContactSyncTarget::~QContactSyncTarget(unsigned int) + ?title@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 272 NONAME ; class QString QtMobility::QContactOrganization::title(void) const + ?HasMember@QContactRelationship@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 273 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactRelationship::HasMember + ??1QContactRelationshipSaveRequest@QtMobility@@UAE@XZ @ 274 NONAME ; QtMobility::QContactRelationshipSaveRequest::~QContactRelationshipSaveRequest(void) + ?isEmpty@QContactDetail@QtMobility@@QBE_NXZ @ 275 NONAME ; bool QtMobility::QContactDetail::isEmpty(void) const + ?setCustomMessage@QContactPresence@QtMobility@@QAEXABVQString@@@Z @ 276 NONAME ; void QtMobility::QContactPresence::setCustomMessage(class QString const &) + ?setFilter@QContactLocalIdFetchRequest@QtMobility@@QAEXABVQContactFilter@2@@Z @ 277 NONAME ; void QtMobility::QContactLocalIdFetchRequest::setFilter(class QtMobility::QContactFilter const &) + ?detailFieldName@QContactDetailFilter@QtMobility@@QBE?AVQString@@XZ @ 278 NONAME ; class QString QtMobility::QContactDetailFilter::detailFieldName(void) const + ?contactType@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AVQString@@XZ @ 279 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::contactType(void) const + ?compareVariant@QContactManagerEngine@QtMobility@@SAHABVQVariant@@0W4CaseSensitivity@Qt@@@Z @ 280 NONAME ; int QtMobility::QContactManagerEngine::compareVariant(class QVariant const &, class QVariant const &, enum Qt::CaseSensitivity) + ?setDetailAccessConstraints@QContactManagerEngine@QtMobility@@SAXPAVQContactDetail@2@V?$QFlags@W4AccessConstraint@QContactDetail@QtMobility@@@@@Z @ 281 NONAME ; void QtMobility::QContactManagerEngine::setDetailAccessConstraints(class QtMobility::QContactDetail *, class QFlags) + ?blankPolicy@QContactSortOrder@QtMobility@@QBE?AW4BlankPolicy@12@XZ @ 282 NONAME ; enum QtMobility::QContactSortOrder::BlankPolicy QtMobility::QContactSortOrder::blankPolicy(void) const + ?removeRelationships@QContactManager@QtMobility@@QAE_NABV?$QList@VQContactRelationship@QtMobility@@@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 283 NONAME ; bool QtMobility::QContactManager::removeRelationships(class QList const &, class QMap *) + ?SubTypeImage@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 284 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactAvatar::SubTypeImage + ?setSpouse@QContactFamily@QtMobility@@QAEXABVQString@@@Z @ 285 NONAME ; void QtMobility::QContactFamily::setSpouse(class QString const &) + ?qt_metacast@QContactAbstractRequest@QtMobility@@UAEPAXPBD@Z @ 286 NONAME ; void * QtMobility::QContactAbstractRequest::qt_metacast(char const *) + ?SubTypeParcel@QContactAddress@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 287 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactAddress::SubTypeParcel + ?relationships@QContactManagerEngine@QtMobility@@UBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@ABVQContactId@2@W4Role@QContactRelationship@2@PAW4Error@QContactManager@2@@Z @ 288 NONAME ; class QList QtMobility::QContactManagerEngine::relationships(class QString const &, class QtMobility::QContactId const &, enum QtMobility::QContactRelationship::Role, enum QtMobility::QContactManager::Error *) const + ??_EQContactIntersectionFilter@QtMobility@@UAE@I@Z @ 289 NONAME ; QtMobility::QContactIntersectionFilter::~QContactIntersectionFilter(unsigned int) + ?FieldThumbnail@QContactThumbnail@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 290 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactThumbnail::FieldThumbnail + ?setVideoUrl@QContactAvatar@QtMobility@@QAEXABVQUrl@@@Z @ 291 NONAME ; void QtMobility::QContactAvatar::setVideoUrl(class QUrl const &) + ?setActionName@QContactActionDescriptor@QtMobility@@QAEXABVQString@@@Z @ 292 NONAME ; void QtMobility::QContactActionDescriptor::setActionName(class QString const &) + ?removeRelationship@QContactManagerEngine@QtMobility@@UAE_NABVQContactRelationship@2@PAW4Error@QContactManager@2@@Z @ 293 NONAME ; bool QtMobility::QContactManagerEngine::removeRelationship(class QtMobility::QContactRelationship const &, enum QtMobility::QContactManager::Error *) + ?FieldLabel@QContactDisplayLabel@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 294 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactDisplayLabel::FieldLabel + ?setPreferredDetail@QContact@QtMobility@@QAE_NABVQString@@ABVQContactDetail@2@@Z @ 295 NONAME ; bool QtMobility::QContact::setPreferredDetail(class QString const &, class QtMobility::QContactDetail const &) + ??0QContactActionDescriptor@QtMobility@@QAE@ABVQString@@0H@Z @ 296 NONAME ; QtMobility::QContactActionDescriptor::QContactActionDescriptor(class QString const &, class QString const &, int) + ??0QContactInvalidFilter@QtMobility@@QAE@XZ @ 297 NONAME ; QtMobility::QContactInvalidFilter::QContactInvalidFilter(void) + ??MQContactId@QtMobility@@QBE_NABV01@@Z @ 298 NONAME ; bool QtMobility::QContactId::operator<(class QtMobility::QContactId const &) const + ?trUtf8@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 299 NONAME ; class QString QtMobility::QContactSaveRequest::trUtf8(char const *, char const *, int) + ?SubTypeCar@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$03@2@B @ 300 NONAME ; struct QtMobility::QLatin1Constant<4> const QtMobility::QContactPhoneNumber::SubTypeCar + ?stateChanged@QContactAction@QtMobility@@IAEXW4State@12@@Z @ 301 NONAME ; void QtMobility::QContactAction::stateChanged(enum QtMobility::QContactAction::State) + ?staticMetaObject@QContactSaveRequest@QtMobility@@2UQMetaObject@@B @ 302 NONAME ; struct QMetaObject const QtMobility::QContactSaveRequest::staticMetaObject + ?setValue@QContactDetail@QtMobility@@QAE_NABVQString@@ABVQVariant@@@Z @ 303 NONAME ; bool QtMobility::QContactDetail::setValue(class QString const &, class QVariant const &) + ?detailDefinition@QContactManagerEngine@QtMobility@@UBE?AVQContactDetailDefinition@2@ABVQString@@0PAW4Error@QContactManager@2@@Z @ 304 NONAME ; class QtMobility::QContactDetailDefinition QtMobility::QContactManagerEngine::detailDefinition(class QString const &, class QString const &, enum QtMobility::QContactManager::Error *) const + ??1QContactRelationshipFetchRequest@QtMobility@@UAE@XZ @ 305 NONAME ; QtMobility::QContactRelationshipFetchRequest::~QContactRelationshipFetchRequest(void) + ??_EQContactAvatar@QtMobility@@UAE@I@Z @ 306 NONAME ; QtMobility::QContactAvatar::~QContactAvatar(unsigned int) + ??1QContactPresence@QtMobility@@UAE@XZ @ 307 NONAME ; QtMobility::QContactPresence::~QContactPresence(void) + ?updateRelationshipRemoveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRelationshipRemoveRequest@2@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@W4State@QContactAbstractRequest@2@@Z @ 308 NONAME ; void QtMobility::QContactManagerEngine::updateRelationshipRemoveRequest(class QtMobility::QContactRelationshipRemoveRequest *, enum QtMobility::QContactManager::Error, class QMap const &, enum QtMobility::QContactAbstractRequest::State) + ?setStreet@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 309 NONAME ; void QtMobility::QContactAddress::setStreet(class QString const &) + ?saveDetailDefinition@QContactManagerEngine@QtMobility@@UAE_NABVQContactDetailDefinition@2@ABVQString@@PAW4Error@QContactManager@2@@Z @ 310 NONAME ; bool QtMobility::QContactManagerEngine::saveDetailDefinition(class QtMobility::QContactDetailDefinition const &, class QString const &, enum QtMobility::QContactManager::Error *) + ?relationships@QContactManager@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@@Z @ 311 NONAME ; class QList QtMobility::QContactManager::relationships(class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role) const + ??0QContactBirthday@QtMobility@@QAE@XZ @ 312 NONAME ; QtMobility::QContactBirthday::QContactBirthday(void) + ??1QContactAnniversary@QtMobility@@UAE@XZ @ 313 NONAME ; QtMobility::QContactAnniversary::~QContactAnniversary(void) + ?availableActions@QContact@QtMobility@@QBE?AV?$QList@VQContactActionDescriptor@QtMobility@@@@ABVQString@@H@Z @ 314 NONAME ; class QList QtMobility::QContact::availableActions(class QString const &, int) const + ??4QContactPhoneNumber@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 315 NONAME ; class QtMobility::QContactPhoneNumber & QtMobility::QContactPhoneNumber::operator=(class QtMobility::QContactDetail const &) + ?syncTarget@QContactSyncTarget@QtMobility@@QBE?AVQString@@XZ @ 316 NONAME ; class QString QtMobility::QContactSyncTarget::syncTarget(void) const + ?detailDefinitionName@QContactDetailRangeFilter@QtMobility@@QBE?AVQString@@XZ @ 317 NONAME ; class QString QtMobility::QContactDetailRangeFilter::detailDefinitionName(void) const + ?setIds@QContactLocalIdFilter@QtMobility@@QAEXABV?$QList@I@@@Z @ 318 NONAME ; void QtMobility::QContactLocalIdFilter::setIds(class QList const &) + ?second@QContactRelationshipFetchRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 319 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFetchRequest::second(void) const + ??_EQContactTag@QtMobility@@UAE@I@Z @ 320 NONAME ; QtMobility::QContactTag::~QContactTag(unsigned int) + ?SubTypeImpp@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 321 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactOnlineAccount::SubTypeImpp + ?qt_metacast@QContactActionFactory@QtMobility@@UAEPAXPBD@Z @ 322 NONAME ; void * QtMobility::QContactActionFactory::qt_metacast(char const *) + ??MQContactActionDescriptor@QtMobility@@QBE_NABV01@@Z @ 323 NONAME ; bool QtMobility::QContactActionDescriptor::operator<(class QtMobility::QContactActionDescriptor const &) const + ?d_func@QContactRemoveRequest@QtMobility@@ABEPBVQContactRemoveRequestPrivate@2@XZ @ 324 NONAME ; class QtMobility::QContactRemoveRequestPrivate const * QtMobility::QContactRemoveRequest::d_func(void) const + ?tr@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 325 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::tr(char const *, char const *) + ?insertChangedContact@QContactChangeSet@QtMobility@@QAEXI@Z @ 326 NONAME ; void QtMobility::QContactChangeSet::insertChangedContact(unsigned int) + ??4QContactUrl@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 327 NONAME ; class QtMobility::QContactUrl & QtMobility::QContactUrl::operator=(class QtMobility::QContactDetail const &) + ?DefinitionName@QContactSyncTarget@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 328 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactSyncTarget::DefinitionName + ?localId@QContact@QtMobility@@QBEIXZ @ 329 NONAME ; unsigned int QtMobility::QContact::localId(void) const + ??4QContactPresence@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 330 NONAME ; class QtMobility::QContactPresence & QtMobility::QContactPresence::operator=(class QtMobility::QContactDetail const &) + ??0QContactUrl@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 331 NONAME ; QtMobility::QContactUrl::QContactUrl(class QtMobility::QContactDetail const &) + ?updateContactRemoveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRemoveRequest@2@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 332 NONAME ; void QtMobility::QContactManagerEngine::updateContactRemoveRequest(class QtMobility::QContactRemoveRequest *, enum QtMobility::QContactManager::Error, class QMap const &) + ?FieldContext@QContactDetail@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 333 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactDetail::FieldContext + ?setDirection@QContactSortOrder@QtMobility@@QAEXW4SortOrder@Qt@@@Z @ 334 NONAME ; void QtMobility::QContactSortOrder::setDirection(enum Qt::SortOrder) + ?implementationVersion@QContactActionDescriptor@QtMobility@@QBEHXZ @ 335 NONAME ; int QtMobility::QContactActionDescriptor::implementationVersion(void) const + ?d_func@QContactSaveRequest@QtMobility@@AAEPAVQContactSaveRequestPrivate@2@XZ @ 336 NONAME ; class QtMobility::QContactSaveRequestPrivate * QtMobility::QContactSaveRequest::d_func(void) + ?pixmap@QContactAvatar@QtMobility@@QBE?AVQPixmap@@XZ @ 337 NONAME ; class QPixmap QtMobility::QContactAvatar::pixmap(void) const + ?setRole@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 338 NONAME ; void QtMobility::QContactOrganization::setRole(class QString const &) + ??8QContactSortOrder@QtMobility@@QBE_NABV01@@Z @ 339 NONAME ; bool QtMobility::QContactSortOrder::operator==(class QtMobility::QContactSortOrder const &) const + ?spouse@QContactFamily@QtMobility@@QBE?AVQString@@XZ @ 340 NONAME ; class QString QtMobility::QContactFamily::spouse(void) const + ?latitude@QContactGeoLocation@QtMobility@@QBENXZ @ 341 NONAME ; double QtMobility::QContactGeoLocation::latitude(void) const + ?tr@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 342 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::tr(char const *, char const *) + ?setDetailDefinitionName@QContactSortOrder@QtMobility@@QAEXABVQString@@0@Z @ 343 NONAME ; void QtMobility::QContactSortOrder::setDetailDefinitionName(class QString const &, class QString const &) + ??4QContactGlobalPresence@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 344 NONAME ; class QtMobility::QContactGlobalPresence & QtMobility::QContactGlobalPresence::operator=(class QtMobility::QContactDetail const &) + ?trUtf8@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 345 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::trUtf8(char const *, char const *) + ?role@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 346 NONAME ; class QString QtMobility::QContactOrganization::role(void) const + ?removeValue@QContactDetail@QtMobility@@QAE_NABVQString@@@Z @ 347 NONAME ; bool QtMobility::QContactDetail::removeValue(class QString const &) + ??0QContactId@QtMobility@@QAE@ABV01@@Z @ 348 NONAME ; QtMobility::QContactId::QContactId(class QtMobility::QContactId const &) + ??0QContactDetail@QtMobility@@QAE@XZ @ 349 NONAME ; QtMobility::QContactDetail::QContactDetail(void) + ??0QContactTag@QtMobility@@QAE@XZ @ 350 NONAME ; QtMobility::QContactTag::QContactTag(void) + ??0QContactName@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 351 NONAME ; QtMobility::QContactName::QContactName(class QtMobility::QContactDetail const &) + ?synthesizedDisplayLabel@QContactManager@QtMobility@@QBE?AVQString@@ABVQContact@2@@Z @ 352 NONAME ; class QString QtMobility::QContactManager::synthesizedDisplayLabel(class QtMobility::QContact const &) const + ?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 + ?setPrefix@QContactName@QtMobility@@QAEXABVQString@@@Z @ 355 NONAME ; void QtMobility::QContactName::setPrefix(class QString const &) + ?setGender@QContactGender@QtMobility@@QAEXABVQString@@@Z @ 356 NONAME ; void QtMobility::QContactGender::setGender(class QString const &) + ?SubTypeFacsimile@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$03@2@B @ 357 NONAME ; struct QtMobility::QLatin1Constant<4> const QtMobility::QContactPhoneNumber::SubTypeFacsimile + ?vibrationRingtoneUrl@QContactRingtone@QtMobility@@QBE?AVQUrl@@XZ @ 358 NONAME ; class QUrl QtMobility::QContactRingtone::vibrationRingtoneUrl(void) const + ?qt_metacast@QContactDetailDefinitionFetchRequest@QtMobility@@UAEPAXPBD@Z @ 359 NONAME ; void * QtMobility::QContactDetailDefinitionFetchRequest::qt_metacast(char const *) + ?fromUri@QContactManager@QtMobility@@SAPAV12@ABVQString@@PAVQObject@@@Z @ 360 NONAME ; class QtMobility::QContactManager * QtMobility::QContactManager::fromUri(class QString const &, class QObject *) + ?optimizationHints@QContactFetchHint@QtMobility@@QBE?AV?$QFlags@W4OptimizationHint@QContactFetchHint@QtMobility@@@@XZ @ 361 NONAME ; class QFlags QtMobility::QContactFetchHint::optimizationHints(void) const + ?setRelationshipType@QContactRelationshipFilter@QtMobility@@QAEXABVQString@@@Z @ 362 NONAME ; void QtMobility::QContactRelationshipFilter::setRelationshipType(class QString const &) + ?setFields@QContactDetailDefinition@QtMobility@@QAEXABV?$QMap@VQString@@VQContactDetailFieldDefinition@QtMobility@@@@@Z @ 363 NONAME ; void QtMobility::QContactDetailDefinition::setFields(class QMap const &) + ?staticMetaObject@QContactRelationshipSaveRequest@QtMobility@@2UQMetaObject@@B @ 364 NONAME ; struct QMetaObject const QtMobility::QContactRelationshipSaveRequest::staticMetaObject + ?note@QContactNote@QtMobility@@QBE?AVQString@@XZ @ 365 NONAME ; class QString QtMobility::QContactNote::note(void) const + ??0QContactAbstractRequest@QtMobility@@IAE@PAVQContactAbstractRequestPrivate@1@@Z @ 366 NONAME ; QtMobility::QContactAbstractRequest::QContactAbstractRequest(class QtMobility::QContactAbstractRequestPrivate *) + ?implementationVersion@QContactActionFilter@QtMobility@@QBEHXZ @ 367 NONAME ; int QtMobility::QContactActionFilter::implementationVersion(void) const + ?suffix@QContactName@QtMobility@@QBE?AVQString@@XZ @ 368 NONAME ; class QString QtMobility::QContactName::suffix(void) const + ?contact@QContactManagerEngine@QtMobility@@UBE?AVQContact@2@ABIABVQContactFetchHint@2@PAW4Error@QContactManager@2@@Z @ 369 NONAME ; class QtMobility::QContact QtMobility::QContactManagerEngine::contact(unsigned int const &, class QtMobility::QContactFetchHint const &, enum QtMobility::QContactManager::Error *) const + ?qHash@QtMobility@@YAIABVQContact@1@@Z @ 370 NONAME ; unsigned int QtMobility::qHash(class QtMobility::QContact const &) + ?d_func@QContactChangeLogFilter@QtMobility@@ABEPBVQContactChangeLogFilterPrivate@2@XZ @ 371 NONAME ; class QtMobility::QContactChangeLogFilterPrivate const * QtMobility::QContactChangeLogFilter::d_func(void) const + ??_EQContactNote@QtMobility@@UAE@I@Z @ 372 NONAME ; QtMobility::QContactNote::~QContactNote(unsigned int) + ?FieldNickname@QContactPresence@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 373 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactPresence::FieldNickname + ??4QContactOnlineAccount@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 374 NONAME ; class QtMobility::QContactOnlineAccount & QtMobility::QContactOnlineAccount::operator=(class QtMobility::QContactDetail const &) + ?detailDefinition@QContactManager@QtMobility@@QBE?AVQContactDetailDefinition@2@ABVQString@@0@Z @ 375 NONAME ; class QtMobility::QContactDetailDefinition QtMobility::QContactManager::detailDefinition(class QString const &, class QString const &) const + ?d_func@QContactRelationshipRemoveRequest@QtMobility@@AAEPAVQContactRelationshipRemoveRequestPrivate@2@XZ @ 376 NONAME ; class QtMobility::QContactRelationshipRemoveRequestPrivate * QtMobility::QContactRelationshipRemoveRequest::d_func(void) + ?id@QContact@QtMobility@@QBE?AVQContactId@2@XZ @ 377 NONAME ; class QtMobility::QContactId QtMobility::QContact::id(void) const + ?getStaticMetaObject@QContactRelationshipFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 378 NONAME ; struct QMetaObject const & QtMobility::QContactRelationshipFetchRequest::getStaticMetaObject(void) + ?updateContactRemoveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRemoveRequest@2@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@W4State@QContactAbstractRequest@2@@Z @ 379 NONAME ; void QtMobility::QContactManagerEngine::updateContactRemoveRequest(class QtMobility::QContactRemoveRequest *, enum QtMobility::QContactManager::Error, class QMap const &, enum QtMobility::QContactAbstractRequest::State) + ?saveRelationships@QContactManager@QtMobility@@QAE_NPAV?$QList@VQContactRelationship@QtMobility@@@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 380 NONAME ; bool QtMobility::QContactManager::saveRelationships(class QList *, class QMap *) + ?maxValue@QContactDetailRangeFilter@QtMobility@@QBE?AVQVariant@@XZ @ 381 NONAME ; class QVariant QtMobility::QContactDetailRangeFilter::maxValue(void) const + ?tr@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 382 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::tr(char const *, char const *) + ?setSubTypes@QContactOnlineAccount@QtMobility@@QAEXABVQStringList@@@Z @ 383 NONAME ; void QtMobility::QContactOnlineAccount::setSubTypes(class QStringList const &) + ?setLongitude@QContactGeoLocation@QtMobility@@QAEXN@Z @ 384 NONAME ; void QtMobility::QContactGeoLocation::setLongitude(double) + ?emitSignals@QContactChangeSet@QtMobility@@QAEXPAVQContactManagerEngine@2@@Z @ 385 NONAME ; void QtMobility::QContactChangeSet::emitSignals(class QtMobility::QContactManagerEngine *) + ?altitudeAccuracy@QContactGeoLocation@QtMobility@@QBENXZ @ 386 NONAME ; double QtMobility::QContactGeoLocation::altitudeAccuracy(void) const + ??UQtMobility@@YA?BVQContactFilter@0@ABV10@0@Z @ 387 NONAME ; class QtMobility::QContactFilter const QtMobility::operator|(class QtMobility::QContactFilter const &, class QtMobility::QContactFilter const &) + ??8QContactDetailFieldDefinition@QtMobility@@QBE_NABV01@@Z @ 388 NONAME ; bool QtMobility::QContactDetailFieldDefinition::operator==(class QtMobility::QContactDetailFieldDefinition const &) const + ?calendarId@QContactAnniversary@QtMobility@@QBE?AVQString@@XZ @ 389 NONAME ; class QString QtMobility::QContactAnniversary::calendarId(void) const + ?canonicalizedFilter@QContactManagerEngine@QtMobility@@SA?AVQContactFilter@2@ABV32@@Z @ 390 NONAME ; class QtMobility::QContactFilter QtMobility::QContactManagerEngine::canonicalizedFilter(class QtMobility::QContactFilter const &) + ?staticMetaObject@QContactRemoveRequest@QtMobility@@2UQMetaObject@@B @ 391 NONAME ; struct QMetaObject const QtMobility::QContactRemoveRequest::staticMetaObject + ?contactsChanged@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 392 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 @ 393 NONAME ; void QtMobility::QContactManagerEngine::updateDefinitionFetchRequest(class QtMobility::QContactDetailDefinitionFetchRequest *, class QMap const &, enum QtMobility::QContactManager::Error, class QMap const &) + ?setCalendarId@QContactAnniversary@QtMobility@@QAEXABVQString@@@Z @ 394 NONAME ; void QtMobility::QContactAnniversary::setCalendarId(class QString const &) + ?removedContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 395 NONAME ; class QSet & QtMobility::QContactChangeSet::removedContacts(void) + ??9QContactActionDescriptor@QtMobility@@QBE_NABV01@@Z @ 396 NONAME ; bool QtMobility::QContactActionDescriptor::operator!=(class QtMobility::QContactActionDescriptor const &) const + ??1QContactDetailDefinition@QtMobility@@QAE@XZ @ 397 NONAME ; QtMobility::QContactDetailDefinition::~QContactDetailDefinition(void) + ??0QContactGlobalPresence@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 398 NONAME ; QtMobility::QContactGlobalPresence::QContactGlobalPresence(class QtMobility::QContactDetail const &) + ?errorMap@QContactDetailDefinitionSaveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 399 NONAME ; class QMap QtMobility::QContactDetailDefinitionSaveRequest::errorMap(void) const + ?trUtf8@QContactDetailDefinitionRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 400 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::trUtf8(char const *, char const *) + ?metaObject@QContactDetailDefinitionRemoveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 401 NONAME ; struct QMetaObject const * QtMobility::QContactDetailDefinitionRemoveRequest::metaObject(void) const + ??4QContactGender@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 402 NONAME ; class QtMobility::QContactGender & QtMobility::QContactGender::operator=(class QtMobility::QContactDetail const &) + ?qt_metacast@QContactRemoveRequest@QtMobility@@UAEPAXPBD@Z @ 403 NONAME ; void * QtMobility::QContactRemoveRequest::qt_metacast(char const *) + ?nickname@QContactPresence@QtMobility@@QBE?AVQString@@XZ @ 404 NONAME ; class QString QtMobility::QContactPresence::nickname(void) const + ?updateContactFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactFetchRequest@2@ABV?$QList@VQContact@QtMobility@@@@W4Error@QContactManager@2@W4State@QContactAbstractRequest@2@@Z @ 405 NONAME ; void QtMobility::QContactManagerEngine::updateContactFetchRequest(class QtMobility::QContactFetchRequest *, class QList const &, enum QtMobility::QContactManager::Error, enum QtMobility::QContactAbstractRequest::State) + ?Aggregates@QContactRelationship@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 406 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactRelationship::Aggregates + ??1QContactDetailDefinitionRemoveRequest@QtMobility@@UAE@XZ @ 407 NONAME ; QtMobility::QContactDetailDefinitionRemoveRequest::~QContactDetailDefinitionRemoveRequest(void) + ??8QContactId@QtMobility@@QBE_NABV01@@Z @ 408 NONAME ; bool QtMobility::QContactId::operator==(class QtMobility::QContactId const &) const + ?FieldUrl@QContactUrl@QtMobility@@2U?$QLatin1Constant@$03@2@B @ 409 NONAME ; struct QtMobility::QLatin1Constant<4> const QtMobility::QContactUrl::FieldUrl + ?tr@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0H@Z @ 410 NONAME ; class QString QtMobility::QContactActionFactory::tr(char const *, char const *, int) + ?contexts@QContactDetail@QtMobility@@QBE?AVQStringList@@XZ @ 411 NONAME ; class QStringList QtMobility::QContactDetail::contexts(void) const + ?FieldAltitude@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 412 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactGeoLocation::FieldAltitude + ?relationshipTypesHint@QContactFetchHint@QtMobility@@QBE?AVQStringList@@XZ @ 413 NONAME ; class QStringList QtMobility::QContactFetchHint::relationshipTypesHint(void) const + ??_EQContactDetailFilter@QtMobility@@UAE@I@Z @ 414 NONAME ; QtMobility::QContactDetailFilter::~QContactDetailFilter(unsigned int) + ?setAccountUri@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 415 NONAME ; void QtMobility::QContactOnlineAccount::setAccountUri(class QString const &) + ?trUtf8@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 416 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::trUtf8(char const *, char const *) + ?FieldType@QContactType@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 417 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactType::FieldType + ?setImplementationVersion@QContactActionDescriptor@QtMobility@@QAEXH@Z @ 418 NONAME ; void QtMobility::QContactActionDescriptor::setImplementationVersion(int) + ?FieldImageUrl@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 419 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactAvatar::FieldImageUrl + ?FieldRegion@QContactAddress@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 420 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactAddress::FieldRegion + ?first@QContactRelationship@QtMobility@@QBE?AVQContactId@2@XZ @ 421 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationship::first(void) const + ??1QContactRelationshipRemoveRequest@QtMobility@@UAE@XZ @ 422 NONAME ; QtMobility::QContactRelationshipRemoveRequest::~QContactRelationshipRemoveRequest(void) + ?FieldNote@QContactNote@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 423 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactNote::FieldNote + ??4QContactDetailFieldDefinition@QtMobility@@QAEAAV01@ABV01@@Z @ 424 NONAME ; class QtMobility::QContactDetailFieldDefinition & QtMobility::QContactDetailFieldDefinition::operator=(class QtMobility::QContactDetailFieldDefinition const &) + ?FieldVibrationRingtoneUrl@QContactRingtone@QtMobility@@2U?$QLatin1Constant@$0BF@@2@B @ 425 NONAME ; struct QtMobility::QLatin1Constant<21> const QtMobility::QContactRingtone::FieldVibrationRingtoneUrl + ??_EQContactDetailRangeFilter@QtMobility@@UAE@I@Z @ 426 NONAME ; QtMobility::QContactDetailRangeFilter::~QContactDetailRangeFilter(unsigned int) + ?FieldSubType@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 427 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactAvatar::FieldSubType + ??0QContactActionFilter@QtMobility@@QAE@XZ @ 428 NONAME ; QtMobility::QContactActionFilter::QContactActionFilter(void) + ?DefinitionName@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 429 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactOnlineAccount::DefinitionName + ??0QContactDetailRangeFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 430 NONAME ; QtMobility::QContactDetailRangeFilter::QContactDetailRangeFilter(class QtMobility::QContactFilter const &) + ?setPresenceStateText@QContactPresence@QtMobility@@QAEXABVQString@@@Z @ 431 NONAME ; void QtMobility::QContactPresence::setPresenceStateText(class QString const &) + ?hasFeature@QContactManager@QtMobility@@QBE_NW4ManagerFeature@12@ABVQString@@@Z @ 432 NONAME ; bool QtMobility::QContactManager::hasFeature(enum QtMobility::QContactManager::ManagerFeature, class QString const &) const + ?detailFieldName@QContactSortOrder@QtMobility@@QBE?AVQString@@XZ @ 433 NONAME ; class QString QtMobility::QContactSortOrder::detailFieldName(void) const + ?FieldLatitude@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 434 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactGeoLocation::FieldLatitude + ?setRange@QContactDetailRangeFilter@QtMobility@@QAEXABVQVariant@@0V?$QFlags@W4RangeFlag@QContactDetailRangeFilter@QtMobility@@@@@Z @ 435 NONAME ; void QtMobility::QContactDetailRangeFilter::setRange(class QVariant const &, class QVariant const &, class QFlags) + ?removeDetail@QContact@QtMobility@@QAE_NPAVQContactDetail@2@@Z @ 436 NONAME ; bool QtMobility::QContact::removeDetail(class QtMobility::QContactDetail *) + ?setRelationshipTypesHint@QContactFetchHint@QtMobility@@QAEXABVQStringList@@@Z @ 437 NONAME ; void QtMobility::QContactFetchHint::setRelationshipTypesHint(class QStringList const &) + ?setDetailDefinitionName@QContactDetailRangeFilter@QtMobility@@QAEXABVQString@@0@Z @ 438 NONAME ; void QtMobility::QContactDetailRangeFilter::setDetailDefinitionName(class QString const &, class QString const &) + ?saveContacts@QContactManagerEngine@QtMobility@@UAE_NPAV?$QList@VQContact@QtMobility@@@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@PAW4Error@QContactManager@2@@Z @ 439 NONAME ; bool QtMobility::QContactManagerEngine::saveContacts(class QList *, class QMap *, enum QtMobility::QContactManager::Error *) + ?SubTypePager@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 440 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactPhoneNumber::SubTypePager + ?setLocation@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 441 NONAME ; void QtMobility::QContactOrganization::setLocation(class QString const &) + ??_EQContactFetchRequest@QtMobility@@UAE@I@Z @ 442 NONAME ; QtMobility::QContactFetchRequest::~QContactFetchRequest(unsigned int) + ?heading@QContactGeoLocation@QtMobility@@QBENXZ @ 443 NONAME ; double QtMobility::QContactGeoLocation::heading(void) const + ?relationships@QContactManager@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@ABVQContactId@2@W4Role@QContactRelationshipFilter@2@@Z @ 444 NONAME ; class QList QtMobility::QContactManager::relationships(class QString const &, class QtMobility::QContactId const &, enum QtMobility::QContactRelationshipFilter::Role) const + ?presenceStateText@QContactPresence@QtMobility@@QBE?AVQString@@XZ @ 445 NONAME ; class QString QtMobility::QContactPresence::presenceStateText(void) const + ?rangeFlags@QContactDetailRangeFilter@QtMobility@@QBE?AV?$QFlags@W4RangeFlag@QContactDetailRangeFilter@QtMobility@@@@XZ @ 446 NONAME ; class QFlags QtMobility::QContactDetailRangeFilter::rangeFlags(void) const + ?compareContact@QContactManagerEngine@QtMobility@@SAHABVQContact@2@0ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 447 NONAME ; int QtMobility::QContactManagerEngine::compareContact(class QtMobility::QContact const &, class QtMobility::QContact const &, class QList const &) + ?saveRelationship@QContactManagerEngine@QtMobility@@UAE_NPAVQContactRelationship@2@PAW4Error@QContactManager@2@@Z @ 448 NONAME ; bool QtMobility::QContactManagerEngine::saveRelationship(class QtMobility::QContactRelationship *, enum QtMobility::QContactManager::Error *) + ?setCapabilities@QContactOnlineAccount@QtMobility@@QAEXABVQStringList@@@Z @ 449 NONAME ; void QtMobility::QContactOnlineAccount::setCapabilities(class QStringList const &) + ??_EQContactTimestamp@QtMobility@@UAE@I@Z @ 450 NONAME ; QtMobility::QContactTimestamp::~QContactTimestamp(unsigned int) + ?FieldOriginalDate@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 451 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactAnniversary::FieldOriginalDate + ?setManagerUri@QContactId@QtMobility@@QAEXABVQString@@@Z @ 452 NONAME ; void QtMobility::QContactId::setManagerUri(class QString const &) + ?insertAddedRelationshipsContact@QContactChangeSet@QtMobility@@QAEXI@Z @ 453 NONAME ; void QtMobility::QContactChangeSet::insertAddedRelationshipsContact(unsigned int) + ??1QContactRemoveRequest@QtMobility@@UAE@XZ @ 454 NONAME ; QtMobility::QContactRemoveRequest::~QContactRemoveRequest(void) + ?FieldAssistantName@QContactOrganization@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 455 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactOrganization::FieldAssistantName + ?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 &) + ?addedContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 457 NONAME ; class QSet & QtMobility::QContactChangeSet::addedContacts(void) + ?setSorting@QContactFetchRequest@QtMobility@@QAEXABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 458 NONAME ; void QtMobility::QContactFetchRequest::setSorting(class QList const &) + ?matchFlags@QContactDetailFilter@QtMobility@@QBE?AV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@XZ @ 459 NONAME ; class QFlags QtMobility::QContactDetailFilter::matchFlags(void) const + ??0QContactSortOrder@QtMobility@@QAE@XZ @ 460 NONAME ; QtMobility::QContactSortOrder::QContactSortOrder(void) + ??0QContactEmailAddress@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 461 NONAME ; QtMobility::QContactEmailAddress::QContactEmailAddress(class QtMobility::QContactDetail const &) + ?TypeGroup@QContactType@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 462 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactType::TypeGroup + ?staticMetaObject@QContactAction@QtMobility@@2UQMetaObject@@B @ 463 NONAME ; struct QMetaObject const QtMobility::QContactAction::staticMetaObject + ?metaObject@QContactRelationshipSaveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 464 NONAME ; struct QMetaObject const * QtMobility::QContactRelationshipSaveRequest::metaObject(void) const + ?setSecond@QContactRelationshipRemoveRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 465 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setSecond(class QtMobility::QContactId const &) + ?setDefinitionRestrictions@QContactFetchRequest@QtMobility@@QAEXABVQStringList@@@Z @ 466 NONAME ; void QtMobility::QContactFetchRequest::setDefinitionRestrictions(class QStringList const &) + ?relatedContactRole@QContactRelationshipFilter@QtMobility@@QBE?AW4Role@QContactRelationship@2@XZ @ 467 NONAME ; enum QtMobility::QContactRelationship::Role QtMobility::QContactRelationshipFilter::relatedContactRole(void) const + ?setRegion@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 468 NONAME ; void QtMobility::QContactAddress::setRegion(class QString const &) + ??0QContactDetailFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 469 NONAME ; QtMobility::QContactDetailFilter::QContactDetailFilter(class QtMobility::QContactFilter const &) + ?FieldLogoUrl@QContactOrganization@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 470 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactOrganization::FieldLogoUrl + ?qt_metacall@QContactManager@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 471 NONAME ; int QtMobility::QContactManager::qt_metacall(enum QMetaObject::Call, int, void * *) + ??1QContactAbstractRequest@QtMobility@@UAE@XZ @ 472 NONAME ; QtMobility::QContactAbstractRequest::~QContactAbstractRequest(void) + ?setLogo@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 473 NONAME ; void QtMobility::QContactOrganization::setLogo(class QString const &) + ?removedRelationshipsContacts@QContactChangeSet@QtMobility@@QBE?AV?$QSet@I@@XZ @ 474 NONAME ; class QSet QtMobility::QContactChangeSet::removedRelationshipsContacts(void) const + ??0QContactUnionFilter@QtMobility@@QAE@XZ @ 475 NONAME ; QtMobility::QContactUnionFilter::QContactUnionFilter(void) + ?DefinitionName@QContactGlobalPresence@QtMobility@@2U?$QLatin1Constant@$0P@@2@B @ 476 NONAME ; struct QtMobility::QLatin1Constant<15> const QtMobility::QContactGlobalPresence::DefinitionName + ?tr@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 477 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::tr(char const *, char const *) + ?detailDefinitions@QContactManagerEngine@QtMobility@@UBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@ABVQString@@PAW4Error@QContactManager@2@@Z @ 478 NONAME ; class QMap QtMobility::QContactManagerEngine::detailDefinitions(class QString const &, enum QtMobility::QContactManager::Error *) const + ??9QContactFilter@QtMobility@@QBE_NABV01@@Z @ 479 NONAME ; bool QtMobility::QContactFilter::operator!=(class QtMobility::QContactFilter const &) const + ?setCustomMessage@QContactGlobalPresence@QtMobility@@QAEXABVQString@@@Z @ 480 NONAME ; void QtMobility::QContactGlobalPresence::setCustomMessage(class QString const &) + ?DefinitionName@QContactFamily@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 481 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactFamily::DefinitionName + ?label@QContactGeoLocation@QtMobility@@QBE?AVQString@@XZ @ 482 NONAME ; class QString QtMobility::QContactGeoLocation::label(void) const + ?setContacts@QContactSaveRequest@QtMobility@@QAEXABV?$QList@VQContact@QtMobility@@@@@Z @ 483 NONAME ; void QtMobility::QContactSaveRequest::setContacts(class QList const &) + ?setDataChanged@QContactChangeSet@QtMobility@@QAEX_N@Z @ 484 NONAME ; void QtMobility::QContactChangeSet::setDataChanged(bool) + ?staticMetaObject@QContactActionFactory@QtMobility@@2UQMetaObject@@B @ 485 NONAME ; struct QMetaObject const QtMobility::QContactActionFactory::staticMetaObject + ??0QContactLocalIdFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 486 NONAME ; QtMobility::QContactLocalIdFilter::QContactLocalIdFilter(class QtMobility::QContactFilter const &) + ?FieldCustomLabel@QContactName@QtMobility@@2U?$QLatin1Constant@$0M@@2@B @ 487 NONAME ; struct QtMobility::QLatin1Constant<12> const QtMobility::QContactName::FieldCustomLabel + ?FieldGender@QContactGender@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 488 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactGender::FieldGender + ?subTypes@QContactOnlineAccount@QtMobility@@QBE?AVQStringList@@XZ @ 489 NONAME ; class QStringList QtMobility::QContactOnlineAccount::subTypes(void) const + ??_EQContactLocalIdFilter@QtMobility@@UAE@I@Z @ 490 NONAME ; QtMobility::QContactLocalIdFilter::~QContactLocalIdFilter(unsigned int) + ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQContactFetchHint@2@@Z @ 491 NONAME ; class QList QtMobility::QContactManager::contacts(class QList const &, class QtMobility::QContactFetchHint const &) const + ?FieldAvatarPixmap@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 492 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactAvatar::FieldAvatarPixmap + ??_EQContactUnionFilter@QtMobility@@UAE@I@Z @ 493 NONAME ; QtMobility::QContactUnionFilter::~QContactUnionFilter(unsigned int) + ?d_func@QContactFetchRequest@QtMobility@@AAEPAVQContactFetchRequestPrivate@2@XZ @ 494 NONAME ; class QtMobility::QContactFetchRequestPrivate * QtMobility::QContactFetchRequest::d_func(void) + ?d_func@QContactSaveRequest@QtMobility@@ABEPBVQContactSaveRequestPrivate@2@XZ @ 495 NONAME ; class QtMobility::QContactSaveRequestPrivate const * QtMobility::QContactSaveRequest::d_func(void) const + ??0QContactNickname@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 496 NONAME ; QtMobility::QContactNickname::QContactNickname(class QtMobility::QContactDetail const &) + ?FieldPresenceState@QContactPresence@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 497 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactPresence::FieldPresenceState + ?nickname@QContactGlobalPresence@QtMobility@@QBE?AVQString@@XZ @ 498 NONAME ; class QString QtMobility::QContactGlobalPresence::nickname(void) const + ?qHash@QtMobility@@YAIABVQContactRelationship@1@@Z @ 499 NONAME ; unsigned int QtMobility::qHash(class QtMobility::QContactRelationship const &) + ??0QContactTimestamp@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 500 NONAME ; QtMobility::QContactTimestamp::QContactTimestamp(class QtMobility::QContactDetail const &) + ?ContextHome@QContactDetail@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 501 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactDetail::ContextHome + ?setContexts@QContactDetail@QtMobility@@QAEXABVQStringList@@@Z @ 502 NONAME ; void QtMobility::QContactDetail::setContexts(class QStringList const &) + ??9QContactDetailFieldDefinition@QtMobility@@QBE_NABV01@@Z @ 503 NONAME ; bool QtMobility::QContactDetailFieldDefinition::operator!=(class QtMobility::QContactDetailFieldDefinition const &) const + ??_EQContactType@QtMobility@@UAE@I@Z @ 504 NONAME ; QtMobility::QContactType::~QContactType(unsigned int) + ?FieldTag@QContactTag@QtMobility@@2U?$QLatin1Constant@$03@2@B @ 505 NONAME ; struct QtMobility::QLatin1Constant<4> const QtMobility::QContactTag::FieldTag + ?FieldLinkedDetailUris@QContactDetail@QtMobility@@2U?$QLatin1Constant@$0BB@@2@B @ 506 NONAME ; struct QtMobility::QLatin1Constant<17> const QtMobility::QContactDetail::FieldLinkedDetailUris + ??0QContactDetailDefinitionRemoveRequest@QtMobility@@QAE@XZ @ 507 NONAME ; QtMobility::QContactDetailDefinitionRemoveRequest::QContactDetailDefinitionRemoveRequest(void) + ?d_func@QContactLocalIdFetchRequest@QtMobility@@AAEPAVQContactLocalIdFetchRequestPrivate@2@XZ @ 508 NONAME ; class QtMobility::QContactLocalIdFetchRequestPrivate * QtMobility::QContactLocalIdFetchRequest::d_func(void) + ??0QContactDetail@QtMobility@@QAE@ABVQString@@@Z @ 509 NONAME ; QtMobility::QContactDetail::QContactDetail(class QString const &) + ?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@QContactRingtone@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 512 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactRingtone::DefinitionName + ??1QContactFamily@QtMobility@@UAE@XZ @ 513 NONAME ; QtMobility::QContactFamily::~QContactFamily(void) + ?contactIds@QContactManagerEngine@QtMobility@@UBE?AV?$QList@I@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@PAW4Error@QContactManager@2@@Z @ 514 NONAME ; class QList QtMobility::QContactManagerEngine::contactIds(class QtMobility::QContactFilter const &, class QList const &, enum QtMobility::QContactManager::Error *) const + ?setNickname@QContactGlobalPresence@QtMobility@@QAEXABVQString@@@Z @ 515 NONAME ; void QtMobility::QContactGlobalPresence::setNickname(class QString const &) + ??0QContactThumbnail@QtMobility@@QAE@XZ @ 516 NONAME ; QtMobility::QContactThumbnail::QContactThumbnail(void) + ?variantValues@QContactDetail@QtMobility@@QBE?AV?$QMap@VQString@@VQVariant@@@@XZ @ 517 NONAME ; class QMap QtMobility::QContactDetail::variantValues(void) const + ?testFilter@QContactManagerEngine@QtMobility@@SA_NABVQContactFilter@2@ABVQContact@2@@Z @ 518 NONAME ; bool QtMobility::QContactManagerEngine::testFilter(class QtMobility::QContactFilter const &, class QtMobility::QContact const &) + ??0QContactIntersectionFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 519 NONAME ; QtMobility::QContactIntersectionFilter::QContactIntersectionFilter(class QtMobility::QContactFilter const &) + ?FieldSubType@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 520 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactAnniversary::FieldSubType + ?getStaticMetaObject@QContactSaveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 521 NONAME ; struct QMetaObject const & QtMobility::QContactSaveRequest::getStaticMetaObject(void) + ?setContactDisplayLabel@QContactManagerEngine@QtMobility@@SAXPAVQContact@2@ABVQString@@@Z @ 522 NONAME ; void QtMobility::QContactManagerEngine::setContactDisplayLabel(class QtMobility::QContact *, class QString const &) + ??6QtMobility@@YA?AVQDebug@@V1@ABVQContactId@0@@Z @ 523 NONAME ; class QDebug QtMobility::operator<<(class QDebug, class QtMobility::QContactId const &) + ?setContactType@QContactDetailDefinitionFetchRequest@QtMobility@@QAEXABVQString@@@Z @ 524 NONAME ; void QtMobility::QContactDetailDefinitionFetchRequest::setContactType(class QString const &) + ??1QContactUnionFilter@QtMobility@@UAE@XZ @ 525 NONAME ; QtMobility::QContactUnionFilter::~QContactUnionFilter(void) + ?managerParameters@QContactManager@QtMobility@@QBE?AV?$QMap@VQString@@V1@@@XZ @ 526 NONAME ; class QMap QtMobility::QContactManager::managerParameters(void) const + ?relationshipType@QContactRelationshipRemoveRequest@QtMobility@@QBE?AVQString@@XZ @ 527 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::relationshipType(void) const + ??4QContactType@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 528 NONAME ; class QtMobility::QContactType & QtMobility::QContactType::operator=(class QtMobility::QContactDetail const &) + ?SubTypeSip@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$03@2@B @ 529 NONAME ; struct QtMobility::QLatin1Constant<4> const QtMobility::QContactOnlineAccount::SubTypeSip + ??1QContactFetchHint@QtMobility@@QAE@XZ @ 530 NONAME ; QtMobility::QContactFetchHint::~QContactFetchHint(void) + ?FieldSpeed@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 531 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactGeoLocation::FieldSpeed + ?setLocalId@QContactId@QtMobility@@QAEXABI@Z @ 532 NONAME ; void QtMobility::QContactId::setLocalId(unsigned int const &) + ?getStaticMetaObject@QContactDetailDefinitionFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 533 NONAME ; struct QMetaObject const & QtMobility::QContactDetailDefinitionFetchRequest::getStaticMetaObject(void) + ??0QContactPresence@QtMobility@@QAE@XZ @ 534 NONAME ; QtMobility::QContactPresence::QContactPresence(void) + ??0QContactName@QtMobility@@QAE@XZ @ 535 NONAME ; QtMobility::QContactName::QContactName(void) + ?customMessage@QContactPresence@QtMobility@@QBE?AVQString@@XZ @ 536 NONAME ; class QString QtMobility::QContactPresence::customMessage(void) const + ?filter@QContactLocalIdFetchRequest@QtMobility@@QBE?AVQContactFilter@2@XZ @ 537 NONAME ; class QtMobility::QContactFilter QtMobility::QContactLocalIdFetchRequest::filter(void) const + ?DefinitionName@QContactName@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 538 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactName::DefinitionName + ?trUtf8@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 539 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::trUtf8(char const *, char const *, int) + ?setValue@QContactActionFilter@QtMobility@@QAEXABVQVariant@@@Z @ 540 NONAME ; void QtMobility::QContactActionFilter::setValue(class QVariant const &) + ??_EQContactSaveRequest@QtMobility@@UAE@I@Z @ 541 NONAME ; QtMobility::QContactSaveRequest::~QContactSaveRequest(unsigned int) + ?relationshipsAdded@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 542 NONAME ; void QtMobility::QContactManager::relationshipsAdded(class QList const &) + ?d_func@QContactRemoveRequest@QtMobility@@AAEPAVQContactRemoveRequestPrivate@2@XZ @ 543 NONAME ; class QtMobility::QContactRemoveRequestPrivate * QtMobility::QContactRemoveRequest::d_func(void) + ?setContactIds@QContactRemoveRequest@QtMobility@@QAEXABV?$QList@I@@@Z @ 544 NONAME ; void QtMobility::QContactRemoveRequest::setContactIds(class QList const &) + ?FieldLocality@QContactAddress@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 545 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactAddress::FieldLocality + ?removeRelationships@QContactManagerEngine@QtMobility@@UAE_NABV?$QList@VQContactRelationship@QtMobility@@@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@PAW4Error@QContactManager@2@@Z @ 546 NONAME ; bool QtMobility::QContactManagerEngine::removeRelationships(class QList const &, class QMap *, enum QtMobility::QContactManager::Error *) + ??0QContactGuid@QtMobility@@QAE@XZ @ 547 NONAME ; QtMobility::QContactGuid::QContactGuid(void) + ?FieldCapabilities@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 548 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactOnlineAccount::FieldCapabilities + ??1QContactManagerEngineFactory@QtMobility@@UAE@XZ @ 549 NONAME ; QtMobility::QContactManagerEngineFactory::~QContactManagerEngineFactory(void) + ?saveDetail@QContact@QtMobility@@QAE_NPAVQContactDetail@2@@Z @ 550 NONAME ; bool QtMobility::QContact::saveDetail(class QtMobility::QContactDetail *) + ?speed@QContactGeoLocation@QtMobility@@QBENXZ @ 551 NONAME ; double QtMobility::QContactGeoLocation::speed(void) const + ?trUtf8@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 552 NONAME ; class QString QtMobility::QContactRemoveRequest::trUtf8(char const *, char const *) + ??1QContactGlobalPresence@QtMobility@@UAE@XZ @ 553 NONAME ; QtMobility::QContactGlobalPresence::~QContactGlobalPresence(void) + ??9QContactDetailDefinition@QtMobility@@QBE_NABV01@@Z @ 554 NONAME ; bool QtMobility::QContactDetailDefinition::operator!=(class QtMobility::QContactDetailDefinition const &) const + ?trUtf8@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 555 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::trUtf8(char const *, char const *, int) + ?FieldLastName@QContactName@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 556 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactName::FieldLastName + ?metaObject@QContactSaveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 557 NONAME ; struct QMetaObject const * QtMobility::QContactSaveRequest::metaObject(void) const + ?postOfficeBox@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 558 NONAME ; class QString QtMobility::QContactAddress::postOfficeBox(void) const + ?originalDate@QContactAnniversary@QtMobility@@QBE?AVQDate@@XZ @ 559 NONAME ; class QDate QtMobility::QContactAnniversary::originalDate(void) const + ?TypeContact@QContactType@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 560 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactType::TypeContact + ?setPresenceState@QContactPresence@QtMobility@@QAEXW4PresenceState@12@@Z @ 561 NONAME ; void QtMobility::QContactPresence::setPresenceState(enum QtMobility::QContactPresence::PresenceState) + ??_EQContactName@QtMobility@@UAE@I@Z @ 562 NONAME ; QtMobility::QContactName::~QContactName(unsigned int) + ?isCanceled@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 563 NONAME ; bool QtMobility::QContactAbstractRequest::isCanceled(void) const + ?waitForRequestFinished@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@H@Z @ 564 NONAME ; bool QtMobility::QContactManagerEngine::waitForRequestFinished(class QtMobility::QContactAbstractRequest *, int) + ??4QContactChangeSet@QtMobility@@QAEAAV01@ABV01@@Z @ 565 NONAME ; class QtMobility::QContactChangeSet & QtMobility::QContactChangeSet::operator=(class QtMobility::QContactChangeSet const &) + ?staticMetaObject@QContactDetailDefinitionRemoveRequest@QtMobility@@2UQMetaObject@@B @ 566 NONAME ; struct QMetaObject const QtMobility::QContactDetailDefinitionRemoveRequest::staticMetaObject + ?relatedContacts@QContact@QtMobility@@QBE?AV?$QList@VQContactId@QtMobility@@@@ABVQString@@W4Role@QContactRelationship@2@@Z @ 567 NONAME ; class QList QtMobility::QContact::relatedContacts(class QString const &, enum QtMobility::QContactRelationship::Role) const + ?qt_metacast@QContactLocalIdFetchRequest@QtMobility@@UAEPAXPBD@Z @ 568 NONAME ; void * QtMobility::QContactLocalIdFetchRequest::qt_metacast(char const *) + ?second@QContactRelationshipRemoveRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 569 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipRemoveRequest::second(void) const + ??_EQContactDisplayLabel@QtMobility@@UAE@I@Z @ 570 NONAME ; QtMobility::QContactDisplayLabel::~QContactDisplayLabel(unsigned int) + ?getStaticMetaObject@QContactDetailDefinitionSaveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 571 NONAME ; struct QMetaObject const & QtMobility::QContactDetailDefinitionSaveRequest::getStaticMetaObject(void) + ?errorMap@QContactDetailDefinitionFetchRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 572 NONAME ; class QMap QtMobility::QContactDetailDefinitionFetchRequest::errorMap(void) const + ??0QContactTimestamp@QtMobility@@QAE@XZ @ 573 NONAME ; QtMobility::QContactTimestamp::QContactTimestamp(void) + ?relationships@QContactManager@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@ABVQContactId@2@W4Role@QContactRelationship@2@@Z @ 574 NONAME ; class QList QtMobility::QContactManager::relationships(class QString const &, class QtMobility::QContactId const &, enum QtMobility::QContactRelationship::Role) const + ?qt_metacall@QContactDetailDefinitionFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 575 NONAME ; int QtMobility::QContactDetailDefinitionFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ??1QContactNickname@QtMobility@@UAE@XZ @ 576 NONAME ; QtMobility::QContactNickname::~QContactNickname(void) + ?d_func@QContactDetailRangeFilter@QtMobility@@AAEPAVQContactDetailRangeFilterPrivate@2@XZ @ 577 NONAME ; class QtMobility::QContactDetailRangeFilterPrivate * QtMobility::QContactDetailRangeFilter::d_func(void) + ?created@QContactTimestamp@QtMobility@@QBE?AVQDateTime@@XZ @ 578 NONAME ; class QDateTime QtMobility::QContactTimestamp::created(void) const + ??0QContactDetailRangeFilter@QtMobility@@QAE@XZ @ 579 NONAME ; QtMobility::QContactDetailRangeFilter::QContactDetailRangeFilter(void) + ??1QContactUrl@QtMobility@@UAE@XZ @ 580 NONAME ; QtMobility::QContactUrl::~QContactUrl(void) + ??1QContactFilter@QtMobility@@UAE@XZ @ 581 NONAME ; QtMobility::QContactFilter::~QContactFilter(void) + ?FieldPresenceStateImageUrl@QContactGlobalPresence@QtMobility@@2U?$QLatin1Constant@$0BG@@2@B @ 582 NONAME ; struct QtMobility::QLatin1Constant<22> const QtMobility::QContactGlobalPresence::FieldPresenceStateImageUrl + ?setPixmap@QContactAvatar@QtMobility@@QAE_NABVQPixmap@@@Z @ 583 NONAME ; bool QtMobility::QContactAvatar::setPixmap(class QPixmap const &) + ?first@QContactRelationshipRemoveRequest@QtMobility@@QBE?AVQContactId@2@XZ @ 584 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipRemoveRequest::first(void) const + ?qHash@QtMobility@@YAIABVQContactActionDescriptor@1@@Z @ 585 NONAME ; unsigned int QtMobility::qHash(class QtMobility::QContactActionDescriptor const &) + ?updateRelationshipSaveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRelationshipSaveRequest@2@ABV?$QList@VQContactRelationship@QtMobility@@@@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@W4State@QContactAbstractRequest@2@@Z @ 586 NONAME ; void QtMobility::QContactManagerEngine::updateRelationshipSaveRequest(class QtMobility::QContactRelationshipSaveRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QMap const &, enum QtMobility::QContactAbstractRequest::State) + ?setThumbnail@QContactThumbnail@QtMobility@@QAEXABVQImage@@@Z @ 587 NONAME ; void QtMobility::QContactThumbnail::setThumbnail(class QImage const &) + ?resetKey@QContactDetail@QtMobility@@QAEXXZ @ 588 NONAME ; void QtMobility::QContactDetail::resetKey(void) + ?contactsAdded@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 589 NONAME ; void QtMobility::QContactManager::contactsAdded(class QList const &) + ?FieldFirstName@QContactName@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 590 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactName::FieldFirstName + ??_EQContactDetailDefinitionRemoveRequest@QtMobility@@UAE@I@Z @ 591 NONAME ; QtMobility::QContactDetailDefinitionRemoveRequest::~QContactDetailDefinitionRemoveRequest(unsigned int) + ?staticMetaObject@QContactDetailDefinitionSaveRequest@QtMobility@@2UQMetaObject@@B @ 592 NONAME ; struct QMetaObject const QtMobility::QContactDetailDefinitionSaveRequest::staticMetaObject + ??0QContactRingtone@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 593 NONAME ; QtMobility::QContactRingtone::QContactRingtone(class QtMobility::QContactDetail const &) + ?FieldCountry@QContactAddress@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 594 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactAddress::FieldCountry + ?setRelationshipType@QContactRelationshipRemoveRequest@QtMobility@@QAEXABVQString@@@Z @ 595 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setRelationshipType(class QString const &) + ?supportedDataTypes@QContactManagerEngine@QtMobility@@UBE?AV?$QList@W4Type@QVariant@@@@XZ @ 596 NONAME ; class QList QtMobility::QContactManagerEngine::supportedDataTypes(void) const + ?setPostcode@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 597 NONAME ; void QtMobility::QContactAddress::setPostcode(class QString const &) + ?setActionName@QContactActionFilter@QtMobility@@QAEXABVQString@@@Z @ 598 NONAME ; void QtMobility::QContactActionFilter::setActionName(class QString const &) + ??4QContactFilter@QtMobility@@QAEAAV01@ABV01@@Z @ 599 NONAME ; class QtMobility::QContactFilter & QtMobility::QContactFilter::operator=(class QtMobility::QContactFilter const &) + ?relationships@QContactRelationshipSaveRequest@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 600 NONAME ; class QList QtMobility::QContactRelationshipSaveRequest::relationships(void) const + ?removeRelationship@QContactManager@QtMobility@@QAE_NABVQContactRelationship@2@@Z @ 601 NONAME ; bool QtMobility::QContactManager::removeRelationship(class QtMobility::QContactRelationship const &) + ?setFirst@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 602 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setFirst(class QtMobility::QContactId const &) + ??4QContactGuid@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 603 NONAME ; class QtMobility::QContactGuid & QtMobility::QContactGuid::operator=(class QtMobility::QContactDetail const &) + ?FieldLogo@QContactOrganization@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 604 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactOrganization::FieldLogo + ?setRelatedContactId@QContactRelationshipFilter@QtMobility@@QAEXABVQContactId@2@@Z @ 605 NONAME ; void QtMobility::QContactRelationshipFilter::setRelatedContactId(class QtMobility::QContactId const &) + ?d_func@QContactRelationshipFetchRequest@QtMobility@@AAEPAVQContactRelationshipFetchRequestPrivate@2@XZ @ 606 NONAME ; class QtMobility::QContactRelationshipFetchRequestPrivate * QtMobility::QContactRelationshipFetchRequest::d_func(void) + ?supportedImplementationVersions@QContactManagerEngineFactory@QtMobility@@UBE?AV?$QList@H@@XZ @ 607 NONAME ; class QList QtMobility::QContactManagerEngineFactory::supportedImplementationVersions(void) const + ?changedContacts@QContactChangeSet@QtMobility@@QBE?AV?$QSet@I@@XZ @ 608 NONAME ; class QSet QtMobility::QContactChangeSet::changedContacts(void) const + ?setFirst@QContactRelationshipRemoveRequest@QtMobility@@QAEXABVQContactId@2@@Z @ 609 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setFirst(class QtMobility::QContactId const &) + ??0QContactAnniversary@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 610 NONAME ; QtMobility::QContactAnniversary::QContactAnniversary(class QtMobility::QContactDetail const &) + ?manager@QContactAbstractRequest@QtMobility@@QBEPAVQContactManager@2@XZ @ 611 NONAME ; class QtMobility::QContactManager * QtMobility::QContactAbstractRequest::manager(void) const + ??0QContact@QtMobility@@QAE@ABV01@@Z @ 612 NONAME ; QtMobility::QContact::QContact(class QtMobility::QContact const &) + ?setType@QContact@QtMobility@@QAEXABVQContactType@2@@Z @ 613 NONAME ; void QtMobility::QContact::setType(class QtMobility::QContactType const &) + ?setUrl@QContactUrl@QtMobility@@QAEXABVQString@@@Z @ 614 NONAME ; void QtMobility::QContactUrl::setUrl(class QString const &) + ?setGuid@QContactGuid@QtMobility@@QAEXABVQString@@@Z @ 615 NONAME ; void QtMobility::QContactGuid::setGuid(class QString const &) + ?nickname@QContactNickname@QtMobility@@QBE?AVQString@@XZ @ 616 NONAME ; class QString QtMobility::QContactNickname::nickname(void) const + ??1QContactActionFilter@QtMobility@@UAE@XZ @ 617 NONAME ; QtMobility::QContactActionFilter::~QContactActionFilter(void) + ?updateDefinitionSaveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactDetailDefinitionSaveRequest@2@ABV?$QList@VQContactDetailDefinition@QtMobility@@@@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@W4State@QContactAbstractRequest@2@@Z @ 618 NONAME ; void QtMobility::QContactManagerEngine::updateDefinitionSaveRequest(class QtMobility::QContactDetailDefinitionSaveRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QMap const &, enum QtMobility::QContactAbstractRequest::State) + ?insertAddedContacts@QContactChangeSet@QtMobility@@QAEXABV?$QList@I@@@Z @ 619 NONAME ; void QtMobility::QContactChangeSet::insertAddedContacts(class QList const &) + ?compatibleContact@QContactManagerEngine@QtMobility@@UBE?AVQContact@2@ABV32@PAW4Error@QContactManager@2@@Z @ 620 NONAME ; class QtMobility::QContact QtMobility::QContactManagerEngine::compatibleContact(class QtMobility::QContact const &, enum QtMobility::QContactManager::Error *) const + ??0QContactDetail@QtMobility@@IAE@ABV01@ABVQString@@@Z @ 621 NONAME ; QtMobility::QContactDetail::QContactDetail(class QtMobility::QContactDetail const &, class QString const &) + ??1QContactChangeSet@QtMobility@@QAE@XZ @ 622 NONAME ; QtMobility::QContactChangeSet::~QContactChangeSet(void) + ?SubTypeFavourite@QContactUrl@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 623 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactUrl::SubTypeFavourite + ?avatar@QContactAvatar@QtMobility@@QBE?AVQString@@XZ @ 624 NONAME ; class QString QtMobility::QContactAvatar::avatar(void) const + ?IsSameAs@QContactRelationship@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 625 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactRelationship::IsSameAs + ?validateActionFilter@QContactManagerEngine@QtMobility@@SA_NABVQContactFilter@2@@Z @ 626 NONAME ; bool QtMobility::QContactManagerEngine::validateActionFilter(class QtMobility::QContactFilter const &) + ?name@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 627 NONAME ; class QString QtMobility::QContactOrganization::name(void) const + ?setManager@QContactAbstractRequest@QtMobility@@QAEXPAVQContactManager@2@@Z @ 628 NONAME ; void QtMobility::QContactAbstractRequest::setManager(class QtMobility::QContactManager *) + ?subTypes@QContactAddress@QtMobility@@QBE?AVQStringList@@XZ @ 629 NONAME ; class QStringList QtMobility::QContactAddress::subTypes(void) const + ?relationshipsAdded@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 630 NONAME ; void QtMobility::QContactManagerEngine::relationshipsAdded(class QList const &) + ?videoRingtoneUrl@QContactRingtone@QtMobility@@QBE?AVQUrl@@XZ @ 631 NONAME ; class QUrl QtMobility::QContactRingtone::videoRingtoneUrl(void) const + ??0QContactFilter@QtMobility@@QAE@ABV01@@Z @ 632 NONAME ; QtMobility::QContactFilter::QContactFilter(class QtMobility::QContactFilter const &) + ??_EQContactAction@QtMobility@@UAE@I@Z @ 633 NONAME ; QtMobility::QContactAction::~QContactAction(unsigned int) + ??_EQContactRemoveRequest@QtMobility@@UAE@I@Z @ 634 NONAME ; QtMobility::QContactRemoveRequest::~QContactRemoveRequest(unsigned int) + ?setRelatedContactRole@QContactRelationshipFilter@QtMobility@@QAEXW4Role@12@@Z @ 635 NONAME ; void QtMobility::QContactRelationshipFilter::setRelatedContactRole(enum QtMobility::QContactRelationshipFilter::Role) + ?definitionNames@QContactDetailDefinitionRemoveRequest@QtMobility@@QBE?AVQStringList@@XZ @ 636 NONAME ; class QStringList QtMobility::QContactDetailDefinitionRemoveRequest::definitionNames(void) const + ??0QContactDetailDefinition@QtMobility@@QAE@XZ @ 637 NONAME ; QtMobility::QContactDetailDefinition::QContactDetailDefinition(void) + ?clearAddedContacts@QContactChangeSet@QtMobility@@QAEXXZ @ 638 NONAME ; void QtMobility::QContactChangeSet::clearAddedContacts(void) + ?logoUrl@QContactOrganization@QtMobility@@QBE?AVQUrl@@XZ @ 639 NONAME ; class QUrl QtMobility::QContactOrganization::logoUrl(void) const + ?SubTypeEmployment@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 640 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactAnniversary::SubTypeEmployment + ?setSyncTarget@QContactSyncTarget@QtMobility@@QAEXABVQString@@@Z @ 641 NONAME ; void QtMobility::QContactSyncTarget::setSyncTarget(class QString const &) + ??4QContactAvatar@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 642 NONAME ; class QtMobility::QContactAvatar & QtMobility::QContactAvatar::operator=(class QtMobility::QContactDetail const &) + ?qHash@QtMobility@@YAIABVQContactId@1@@Z @ 643 NONAME ; unsigned int QtMobility::qHash(class QtMobility::QContactId const &) + ?FieldHeading@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 644 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactGeoLocation::FieldHeading + ?DefinitionName@QContactNickname@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 645 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactNickname::DefinitionName + ?trUtf8@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0H@Z @ 646 NONAME ; class QString QtMobility::QContactActionFactory::trUtf8(char const *, char const *, int) + ??0QContactManager@QtMobility@@QAE@ABVQString@@ABV?$QMap@VQString@@V1@@@PAVQObject@@@Z @ 647 NONAME ; QtMobility::QContactManager::QContactManager(class QString const &, class QMap const &, class QObject *) + ?GenderFemale@QContactGender@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 648 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactGender::GenderFemale + ??0QContactPhoneNumber@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 649 NONAME ; QtMobility::QContactPhoneNumber::QContactPhoneNumber(class QtMobility::QContactDetail const &) + ?d_func@QContactLocalIdFilter@QtMobility@@ABEPBVQContactLocalIdFilterPrivate@2@XZ @ 650 NONAME ; class QtMobility::QContactLocalIdFilterPrivate const * QtMobility::QContactLocalIdFilter::d_func(void) const + ?SubTypeLandline@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 651 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactPhoneNumber::SubTypeLandline + ?saveRelationships@QContactManagerEngine@QtMobility@@UAE_NPAV?$QList@VQContactRelationship@QtMobility@@@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@PAW4Error@QContactManager@2@@Z @ 652 NONAME ; bool QtMobility::QContactManagerEngine::saveRelationships(class QList *, class QMap *, enum QtMobility::QContactManager::Error *) + ??0QContactPresence@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 653 NONAME ; QtMobility::QContactPresence::QContactPresence(class QtMobility::QContactDetail const &) + ?detailDefinitionName@QContactSortOrder@QtMobility@@QBE?AVQString@@XZ @ 654 NONAME ; class QString QtMobility::QContactSortOrder::detailDefinitionName(void) const + ?type@QContactAbstractRequest@QtMobility@@QBE?AW4RequestType@12@XZ @ 655 NONAME ; enum QtMobility::QContactAbstractRequest::RequestType QtMobility::QContactAbstractRequest::type(void) const + ??0QContactDetail@QtMobility@@QAE@ABV01@@Z @ 656 NONAME ; QtMobility::QContactDetail::QContactDetail(class QtMobility::QContactDetail const &) + ?definitions@QContactDetailDefinitionSaveRequest@QtMobility@@QBE?AV?$QList@VQContactDetailDefinition@QtMobility@@@@XZ @ 657 NONAME ; class QList QtMobility::QContactDetailDefinitionSaveRequest::definitions(void) const + ?removedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 658 NONAME ; class QSet & QtMobility::QContactChangeSet::removedRelationshipsContacts(void) + ?type@QContactFilter@QtMobility@@QBE?AW4FilterType@12@XZ @ 659 NONAME ; enum QtMobility::QContactFilter::FilterType QtMobility::QContactFilter::type(void) const + ?street@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 660 NONAME ; class QString QtMobility::QContactAddress::street(void) const + ?allowableValues@QContactDetailFieldDefinition@QtMobility@@QBE?AV?$QList@VQVariant@@@@XZ @ 661 NONAME ; class QList QtMobility::QContactDetailFieldDefinition::allowableValues(void) const + ?localId@QContactId@QtMobility@@QBEIXZ @ 662 NONAME ; unsigned int QtMobility::QContactId::localId(void) const + ??_EQContactOnlineAccount@QtMobility@@UAE@I@Z @ 663 NONAME ; QtMobility::QContactOnlineAccount::~QContactOnlineAccount(unsigned int) + ?trUtf8@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0@Z @ 664 NONAME ; class QString QtMobility::QContactActionFactory::trUtf8(char const *, char const *) + ?tr@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 665 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::tr(char const *, char const *, int) + ?supportedContactTypes@QContactManager@QtMobility@@QBE?AVQStringList@@XZ @ 666 NONAME ; class QStringList QtMobility::QContactManager::supportedContactTypes(void) const + ?FieldDetailUri@QContactDetail@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 667 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactDetail::FieldDetailUri + ?FieldPresenceState@QContactGlobalPresence@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 668 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactGlobalPresence::FieldPresenceState + ?qt_metacall@QContactActionFactory@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 669 NONAME ; int QtMobility::QContactActionFactory::qt_metacall(enum QMetaObject::Call, int, void * *) + ?relationshipOrder@QContact@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@XZ @ 670 NONAME ; class QList QtMobility::QContact::relationshipOrder(void) const + ?tr@QContactAction@QtMobility@@SA?AVQString@@PBD0H@Z @ 671 NONAME ; class QString QtMobility::QContactAction::tr(char const *, char const *, int) + ?FieldPrefix@QContactName@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 672 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactName::FieldPrefix + ?setSubTypes@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 673 NONAME ; void QtMobility::QContactOnlineAccount::setSubTypes(class QString const &) + ??8QContactFilter@QtMobility@@QBE_NABV01@@Z @ 674 NONAME ; bool QtMobility::QContactFilter::operator==(class QtMobility::QContactFilter const &) const + ?metaObject@QContactFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 675 NONAME ; struct QMetaObject const * QtMobility::QContactFetchRequest::metaObject(void) const + ??0QContactRelationshipFetchRequest@QtMobility@@QAE@XZ @ 676 NONAME ; QtMobility::QContactRelationshipFetchRequest::QContactRelationshipFetchRequest(void) + ?errorMap@QContactDetailDefinitionRemoveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 677 NONAME ; class QMap QtMobility::QContactDetailDefinitionRemoveRequest::errorMap(void) const + ?logo@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 678 NONAME ; class QString QtMobility::QContactOrganization::logo(void) const + ?isEmpty@QContactDetailDefinition@QtMobility@@QBE_NXZ @ 679 NONAME ; bool QtMobility::QContactDetailDefinition::isEmpty(void) const + ?caseSensitivity@QContactSortOrder@QtMobility@@QBE?AW4CaseSensitivity@Qt@@XZ @ 680 NONAME ; enum Qt::CaseSensitivity QtMobility::QContactSortOrder::caseSensitivity(void) const + ?d_func@QContactIntersectionFilter@QtMobility@@ABEPBVQContactIntersectionFilterPrivate@2@XZ @ 681 NONAME ; class QtMobility::QContactIntersectionFilterPrivate const * QtMobility::QContactIntersectionFilter::d_func(void) const + ??_EQContactBirthday@QtMobility@@UAE@I@Z @ 682 NONAME ; QtMobility::QContactBirthday::~QContactBirthday(unsigned int) + ?FieldCustomMessage@QContactGlobalPresence@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 683 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactGlobalPresence::FieldCustomMessage + ?tr@QContactRemoveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 684 NONAME ; class QString QtMobility::QContactRemoveRequest::tr(char const *, char const *) + ?getStaticMetaObject@QContactRemoveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 685 NONAME ; struct QMetaObject const & QtMobility::QContactRemoveRequest::getStaticMetaObject(void) + ?supportedContactTypes@QContactManagerEngine@QtMobility@@UBE?AVQStringList@@XZ @ 686 NONAME ; class QStringList QtMobility::QContactManagerEngine::supportedContactTypes(void) const + ??0QContactRelationship@QtMobility@@QAE@ABV01@@Z @ 687 NONAME ; QtMobility::QContactRelationship::QContactRelationship(class QtMobility::QContactRelationship const &) + ?serviceProvider@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 688 NONAME ; class QString QtMobility::QContactOnlineAccount::serviceProvider(void) const + ?d_func@QContactDetailDefinitionRemoveRequest@QtMobility@@ABEPBVQContactDetailDefinitionRemoveRequestPrivate@2@XZ @ 689 NONAME ; class QtMobility::QContactDetailDefinitionRemoveRequestPrivate const * QtMobility::QContactDetailDefinitionRemoveRequest::d_func(void) const + ?customLabel@QContactName@QtMobility@@QBE?AVQString@@XZ @ 690 NONAME ; class QString QtMobility::QContactName::customLabel(void) const + ?sorting@QContactLocalIdFetchRequest@QtMobility@@QBE?AV?$QList@VQContactSortOrder@QtMobility@@@@XZ @ 691 NONAME ; class QList QtMobility::QContactLocalIdFetchRequest::sorting(void) const + ?trUtf8@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 692 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::trUtf8(char const *, char const *) + ?name@QContactDetailDefinition@QtMobility@@QBE?AVQString@@XZ @ 693 NONAME ; class QString QtMobility::QContactDetailDefinition::name(void) const + ?preferredDetail@QContact@QtMobility@@QBE?AVQContactDetail@2@ABVQString@@@Z @ 694 NONAME ; class QtMobility::QContactDetail QtMobility::QContact::preferredDetail(class QString const &) const + ?definitionName@QContactDetail@QtMobility@@QBE?AVQString@@XZ @ 695 NONAME ; class QString QtMobility::QContactDetail::definitionName(void) const + ?qHash@QtMobility@@YAIABVQContactDetail@1@@Z @ 696 NONAME ; unsigned int QtMobility::qHash(class QtMobility::QContactDetail const &) + ?setDetailUri@QContactDetail@QtMobility@@QAEXABVQString@@@Z @ 697 NONAME ; void QtMobility::QContactDetail::setDetailUri(class QString const &) + ?d_func@QContactDetailFilter@QtMobility@@AAEPAVQContactDetailFilterPrivate@2@XZ @ 698 NONAME ; class QtMobility::QContactDetailFilterPrivate * QtMobility::QContactDetailFilter::d_func(void) + ?DefinitionName@QContactNote@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 699 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactNote::DefinitionName + ?isRelationshipTypeSupported@QContactManager@QtMobility@@QBE_NABVQString@@0@Z @ 700 NONAME ; bool QtMobility::QContactManager::isRelationshipTypeSupported(class QString const &, class QString const &) const + ?saveRelationship@QContactManager@QtMobility@@QAE_NPAVQContactRelationship@2@@Z @ 701 NONAME ; bool QtMobility::QContactManager::saveRelationship(class QtMobility::QContactRelationship *) + ?tr@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 702 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::tr(char const *, char const *, int) + ?setFilter@QContactFetchRequest@QtMobility@@QAEXABVQContactFilter@2@@Z @ 703 NONAME ; void QtMobility::QContactFetchRequest::setFilter(class QtMobility::QContactFilter const &) + ?eventType@QContactChangeLogFilter@QtMobility@@QBE?AW4EventType@12@XZ @ 704 NONAME ; enum QtMobility::QContactChangeLogFilter::EventType QtMobility::QContactChangeLogFilter::eventType(void) const + ?match@QContactName@QtMobility@@SA?AVQContactFilter@2@ABVQString@@0@Z @ 705 NONAME ; class QtMobility::QContactFilter QtMobility::QContactName::match(class QString const &, class QString const &) + ?setSubTypes@QContactPhoneNumber@QtMobility@@QAEXABVQStringList@@@Z @ 706 NONAME ; void QtMobility::QContactPhoneNumber::setSubTypes(class QStringList const &) + ??0QContactRemoveRequest@QtMobility@@QAE@XZ @ 707 NONAME ; QtMobility::QContactRemoveRequest::QContactRemoveRequest(void) + ?remove@QContactUnionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 708 NONAME ; void QtMobility::QContactUnionFilter::remove(class QtMobility::QContactFilter const &) + ?FieldModificationTimestamp@QContactTimestamp@QtMobility@@2U?$QLatin1Constant@$0BG@@2@B @ 709 NONAME ; struct QtMobility::QLatin1Constant<22> const QtMobility::QContactTimestamp::FieldModificationTimestamp + ?managerUri@QContactManager@QtMobility@@QBE?AVQString@@XZ @ 710 NONAME ; class QString QtMobility::QContactManager::managerUri(void) const + ?ContextOther@QContactDetail@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 711 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactDetail::ContextOther + ?FieldAccuracy@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 712 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactGeoLocation::FieldAccuracy + ?FieldLabel@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 713 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactGeoLocation::FieldLabel + ??0QContactChangeLogFilter@QtMobility@@QAE@W4EventType@01@@Z @ 714 NONAME ; QtMobility::QContactChangeLogFilter::QContactChangeLogFilter(enum QtMobility::QContactChangeLogFilter::EventType) + ?trUtf8@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 715 NONAME ; class QString QtMobility::QContactAbstractRequest::trUtf8(char const *, char const *, int) + ?trUtf8@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 716 NONAME ; class QString QtMobility::QContactManagerEngine::trUtf8(char const *, char const *) + ?SubTypeEngagement@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 717 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactAnniversary::SubTypeEngagement + ?setContexts@QContactDetail@QtMobility@@QAEXABVQString@@@Z @ 718 NONAME ; void QtMobility::QContactDetail::setContexts(class QString const &) + ?value@QContactDetailFilter@QtMobility@@QBE?AVQVariant@@XZ @ 719 NONAME ; class QVariant QtMobility::QContactDetailFilter::value(void) const + ?DefinitionName@QContactAddress@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 720 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactAddress::DefinitionName + ??4QContactGeoLocation@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 721 NONAME ; class QtMobility::QContactGeoLocation & QtMobility::QContactGeoLocation::operator=(class QtMobility::QContactDetail const &) + ?setRole@QContactRelationshipFilter@QtMobility@@QAEXW4Role@12@@Z @ 722 NONAME ; void QtMobility::QContactRelationshipFilter::setRole(enum QtMobility::QContactRelationshipFilter::Role) + ?clearAddedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEXXZ @ 723 NONAME ; void QtMobility::QContactChangeSet::clearAddedRelationshipsContacts(void) + ??1QContactDetailDefinitionSaveRequest@QtMobility@@UAE@XZ @ 724 NONAME ; QtMobility::QContactDetailDefinitionSaveRequest::~QContactDetailDefinitionSaveRequest(void) + ?number@QContactPhoneNumber@QtMobility@@QBE?AVQString@@XZ @ 725 NONAME ; class QString QtMobility::QContactPhoneNumber::number(void) const + ?trUtf8@QContactSaveRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 726 NONAME ; class QString QtMobility::QContactSaveRequest::trUtf8(char const *, char const *) + ?trUtf8@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 727 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::trUtf8(char const *, char const *, int) + ?videoUrl@QContactAvatar@QtMobility@@QBE?AVQUrl@@XZ @ 728 NONAME ; class QUrl QtMobility::QContactAvatar::videoUrl(void) const + ??0QContactTag@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 729 NONAME ; QtMobility::QContactTag::QContactTag(class QtMobility::QContactDetail const &) + ?d_func@QContactFetchRequest@QtMobility@@ABEPBVQContactFetchRequestPrivate@2@XZ @ 730 NONAME ; class QtMobility::QContactFetchRequestPrivate const * QtMobility::QContactFetchRequest::d_func(void) const + ??4QContactBirthday@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 731 NONAME ; class QtMobility::QContactBirthday & QtMobility::QContactBirthday::operator=(class QtMobility::QContactDetail const &) + ??0QContactDisplayLabel@QtMobility@@QAE@XZ @ 732 NONAME ; QtMobility::QContactDisplayLabel::QContactDisplayLabel(void) + ?accountUri@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 733 NONAME ; class QString QtMobility::QContactOnlineAccount::accountUri(void) const + ?synthesizedDisplayLabel@QContactManagerEngine@QtMobility@@UBE?AVQString@@ABVQContact@2@PAW4Error@QContactManager@2@@Z @ 734 NONAME ; class QString QtMobility::QContactManagerEngine::synthesizedDisplayLabel(class QtMobility::QContact const &, enum QtMobility::QContactManager::Error *) const + ??4QContactRelationship@QtMobility@@QAEAAV01@ABV01@@Z @ 735 NONAME ; class QtMobility::QContactRelationship & QtMobility::QContactRelationship::operator=(class QtMobility::QContactRelationship const &) + ?date@QContactBirthday@QtMobility@@QBE?AVQDate@@XZ @ 736 NONAME ; class QDate QtMobility::QContactBirthday::date(void) const + ??_EQContactOrganization@QtMobility@@UAE@I@Z @ 737 NONAME ; QtMobility::QContactOrganization::~QContactOrganization(unsigned int) + ??6QtMobility@@YA?AVQDebug@@V1@ABVQContactRelationship@0@@Z @ 738 NONAME ; class QDebug QtMobility::operator<<(class QDebug, class QtMobility::QContactRelationship const &) + ?trUtf8@QContactRelationshipRemoveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 739 NONAME ; class QString QtMobility::QContactRelationshipRemoveRequest::trUtf8(char const *, char const *, int) + ?setPresence@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 740 NONAME ; void QtMobility::QContactOnlineAccount::setPresence(class QString const &) + ??_EQContactPresence@QtMobility@@UAE@I@Z @ 741 NONAME ; QtMobility::QContactPresence::~QContactPresence(unsigned int) + ?setBlankPolicy@QContactSortOrder@QtMobility@@QAEXW4BlankPolicy@12@@Z @ 742 NONAME ; void QtMobility::QContactSortOrder::setBlankPolicy(enum QtMobility::QContactSortOrder::BlankPolicy) + ?FieldPresenceStateText@QContactPresence@QtMobility@@2U?$QLatin1Constant@$0BC@@2@B @ 743 NONAME ; struct QtMobility::QLatin1Constant<18> const QtMobility::QContactPresence::FieldPresenceStateText + ?tr@QContactManager@QtMobility@@SA?AVQString@@PBD0H@Z @ 744 NONAME ; class QString QtMobility::QContactManager::tr(char const *, char const *, int) + ??0QContactEmailAddress@QtMobility@@QAE@XZ @ 745 NONAME ; QtMobility::QContactEmailAddress::QContactEmailAddress(void) + ?tag@QContactTag@QtMobility@@QBE?AVQString@@XZ @ 746 NONAME ; class QString QtMobility::QContactTag::tag(void) const + ?staticMetaObject@QContactRelationshipFetchRequest@QtMobility@@2UQMetaObject@@B @ 747 NONAME ; struct QMetaObject const QtMobility::QContactRelationshipFetchRequest::staticMetaObject + ?setVideoRingtoneUrl@QContactRingtone@QtMobility@@QAEXABVQUrl@@@Z @ 748 NONAME ; void QtMobility::QContactRingtone::setVideoRingtoneUrl(class QUrl const &) + ??0QContactActionDescriptor@QtMobility@@QAE@ABV01@@Z @ 749 NONAME ; QtMobility::QContactActionDescriptor::QContactActionDescriptor(class QtMobility::QContactActionDescriptor const &) + ?SubTypeVideo@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 750 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactAvatar::SubTypeVideo + ??1QContactRingtone@QtMobility@@UAE@XZ @ 751 NONAME ; QtMobility::QContactRingtone::~QContactRingtone(void) + ?insertField@QContactDetailDefinition@QtMobility@@QAEXABVQString@@ABVQContactDetailFieldDefinition@2@@Z @ 752 NONAME ; void QtMobility::QContactDetailDefinition::insertField(class QString const &, class QtMobility::QContactDetailFieldDefinition const &) + ?setTimestamp@QContactGeoLocation@QtMobility@@QAEXABVQDateTime@@@Z @ 753 NONAME ; void QtMobility::QContactGeoLocation::setTimestamp(class QDateTime const &) + ?lastModified@QContactTimestamp@QtMobility@@QBE?AVQDateTime@@XZ @ 754 NONAME ; class QDateTime QtMobility::QContactTimestamp::lastModified(void) const + ?setSuffix@QContactName@QtMobility@@QAEXABVQString@@@Z @ 755 NONAME ; void QtMobility::QContactName::setSuffix(class QString const &) + ?removeField@QContactDetailDefinition@QtMobility@@QAEXABVQString@@@Z @ 756 NONAME ; void QtMobility::QContactDetailDefinition::removeField(class QString const &) + ?FieldName@QContactOrganization@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 757 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactOrganization::FieldName + ?filters@QContactIntersectionFilter@QtMobility@@QBE?AV?$QList@VQContactFilter@QtMobility@@@@XZ @ 758 NONAME ; class QList QtMobility::QContactIntersectionFilter::filters(void) const + ??6QContactIntersectionFilter@QtMobility@@QAEAAV01@ABVQContactFilter@1@@Z @ 759 NONAME ; class QtMobility::QContactIntersectionFilter & QtMobility::QContactIntersectionFilter::operator<<(class QtMobility::QContactFilter const &) + ??9QContact@QtMobility@@QBE_NABV01@@Z @ 760 NONAME ; bool QtMobility::QContact::operator!=(class QtMobility::QContact const &) const + ?setServiceProvider@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 761 NONAME ; void QtMobility::QContactOnlineAccount::setServiceProvider(class QString const &) + ?saveContact@QContactManagerEngine@QtMobility@@UAE_NPAVQContact@2@PAW4Error@QContactManager@2@@Z @ 762 NONAME ; bool QtMobility::QContactManagerEngine::saveContact(class QtMobility::QContact *, enum QtMobility::QContactManager::Error *) + ?SubTypeSipVoip@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 763 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactOnlineAccount::SubTypeSipVoip + ??4QContactNickname@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 764 NONAME ; class QtMobility::QContactNickname & QtMobility::QContactNickname::operator=(class QtMobility::QContactDetail const &) + ??0QContactAvatar@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 765 NONAME ; QtMobility::QContactAvatar::QContactAvatar(class QtMobility::QContactDetail const &) + ?DefinitionName@QContactEmailAddress@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 766 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactEmailAddress::DefinitionName + ?setNickname@QContactOnlineAccount@QtMobility@@QAEXABVQString@@@Z @ 767 NONAME ; void QtMobility::QContactOnlineAccount::setNickname(class QString const &) + ??_EQContactAddress@QtMobility@@UAE@I@Z @ 768 NONAME ; QtMobility::QContactAddress::~QContactAddress(unsigned int) + ?start@QContactAbstractRequest@QtMobility@@QAE_NXZ @ 769 NONAME ; bool QtMobility::QContactAbstractRequest::start(void) + ?setLastModified@QContactTimestamp@QtMobility@@QAEXABVQDateTime@@@Z @ 770 NONAME ; void QtMobility::QContactTimestamp::setLastModified(class QDateTime const &) + ?isUnique@QContactDetailDefinition@QtMobility@@QBE_NXZ @ 771 NONAME ; bool QtMobility::QContactDetailDefinition::isUnique(void) const + ?setDetailDefinitionsHint@QContactFetchHint@QtMobility@@QAEXABVQStringList@@@Z @ 772 NONAME ; void QtMobility::QContactFetchHint::setDetailDefinitionsHint(class QStringList const &) + ?setEmailAddress@QContactEmailAddress@QtMobility@@QAEXABVQString@@@Z @ 773 NONAME ; void QtMobility::QContactEmailAddress::setEmailAddress(class QString const &) + ?metaObject@QContactManagerEngine@QtMobility@@UBEPBUQMetaObject@@XZ @ 774 NONAME ; struct QMetaObject const * QtMobility::QContactManagerEngine::metaObject(void) const + ?trUtf8@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 775 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::trUtf8(char const *, char const *, int) + ?qt_metacall@QContactFetchRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 776 NONAME ; int QtMobility::QContactFetchRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ??_EQContactFilter@QtMobility@@UAE@I@Z @ 777 NONAME ; QtMobility::QContactFilter::~QContactFilter(unsigned int) + ??_EQContactFamily@QtMobility@@UAE@I@Z @ 778 NONAME ; QtMobility::QContactFamily::~QContactFamily(unsigned int) + ??0QContactOrganization@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 779 NONAME ; QtMobility::QContactOrganization::QContactOrganization(class QtMobility::QContactDetail const &) + ?metaObject@QContactManager@QtMobility@@UBEPBUQMetaObject@@XZ @ 780 NONAME ; struct QMetaObject const * QtMobility::QContactManager::metaObject(void) const + ?qt_metacall@QContactAction@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 781 NONAME ; int QtMobility::QContactAction::qt_metacall(enum QMetaObject::Call, int, void * *) + ?metaObject@QContactLocalIdFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 782 NONAME ; struct QMetaObject const * QtMobility::QContactLocalIdFetchRequest::metaObject(void) const + ?setCountry@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 783 NONAME ; void QtMobility::QContactAddress::setCountry(class QString const &) + ?setSubType@QContactAvatar@QtMobility@@QAEXABVQString@@@Z @ 784 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 @ 785 NONAME ; void QtMobility::QContactManagerEngine::updateContactSaveRequest(class QtMobility::QContactSaveRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QMap const &) + ?isFilterSupported@QContactManager@QtMobility@@QBE_NABVQContactFilter@2@@Z @ 786 NONAME ; bool QtMobility::QContactManager::isFilterSupported(class QtMobility::QContactFilter const &) const + ?changedContacts@QContactChangeSet@QtMobility@@QAEAAV?$QSet@I@@XZ @ 787 NONAME ; class QSet & QtMobility::QContactChangeSet::changedContacts(void) + ??4QContactDisplayLabel@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 788 NONAME ; class QtMobility::QContactDisplayLabel & QtMobility::QContactDisplayLabel::operator=(class QtMobility::QContactDetail const &) + ?FieldAvatar@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 789 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactAvatar::FieldAvatar + ?sortContacts@QContactManagerEngine@QtMobility@@SA?AV?$QList@I@@ABV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 790 NONAME ; class QList QtMobility::QContactManagerEngine::sortContacts(class QList const &, class QList const &) + ?tr@QContactActionFactory@QtMobility@@SA?AVQString@@PBD0@Z @ 791 NONAME ; class QString QtMobility::QContactActionFactory::tr(char const *, char const *) + ??0QContactNickname@QtMobility@@QAE@XZ @ 792 NONAME ; QtMobility::QContactNickname::QContactNickname(void) + ?getStaticMetaObject@QContactActionFactory@QtMobility@@SAABUQMetaObject@@XZ @ 793 NONAME ; struct QMetaObject const & QtMobility::QContactActionFactory::getStaticMetaObject(void) + ?relationships@QContactManager@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQContactId@2@W4Role@QContactRelationship@2@@Z @ 794 NONAME ; class QList QtMobility::QContactManager::relationships(class QtMobility::QContactId const &, enum QtMobility::QContactRelationship::Role) const + ?setCustomLabel@QContactName@QtMobility@@QAEXABVQString@@@Z @ 795 NONAME ; void QtMobility::QContactName::setCustomLabel(class QString const &) + ??_EQContactThumbnail@QtMobility@@UAE@I@Z @ 796 NONAME ; QtMobility::QContactThumbnail::~QContactThumbnail(unsigned int) + ?relationshipsRemoved@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 797 NONAME ; void QtMobility::QContactManager::relationshipsRemoved(class QList const &) + ?contacts@QContactFetchRequest@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@XZ @ 798 NONAME ; class QList QtMobility::QContactFetchRequest::contacts(void) const + ?setFirstName@QContactName@QtMobility@@QAEXABVQString@@@Z @ 799 NONAME ; void QtMobility::QContactName::setFirstName(class QString const &) + ??_EQContactGeoLocation@QtMobility@@UAE@I@Z @ 800 NONAME ; QtMobility::QContactGeoLocation::~QContactGeoLocation(unsigned int) + ??0QContactSortOrder@QtMobility@@QAE@ABV01@@Z @ 801 NONAME ; QtMobility::QContactSortOrder::QContactSortOrder(class QtMobility::QContactSortOrder const &) + ?metaObject@QContactDetailDefinitionSaveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 802 NONAME ; struct QMetaObject const * QtMobility::QContactDetailDefinitionSaveRequest::metaObject(void) const + ?updateDefinitionFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactDetailDefinitionFetchRequest@2@ABV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@W4State@QContactAbstractRequest@2@@Z @ 803 NONAME ; void QtMobility::QContactManagerEngine::updateDefinitionFetchRequest(class QtMobility::QContactDetailDefinitionFetchRequest *, class QMap const &, enum QtMobility::QContactManager::Error, class QMap const &, enum QtMobility::QContactAbstractRequest::State) + ??4QContactThumbnail@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 804 NONAME ; class QtMobility::QContactThumbnail & QtMobility::QContactThumbnail::operator=(class QtMobility::QContactDetail const &) + ??0QContactPhoneNumber@QtMobility@@QAE@XZ @ 805 NONAME ; QtMobility::QContactPhoneNumber::QContactPhoneNumber(void) + ?d_func@QContactChangeLogFilter@QtMobility@@AAEPAVQContactChangeLogFilterPrivate@2@XZ @ 806 NONAME ; class QtMobility::QContactChangeLogFilterPrivate * QtMobility::QContactChangeLogFilter::d_func(void) + ?trUtf8@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 807 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::trUtf8(char const *, char const *) + ?FieldNickname@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 808 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactOnlineAccount::FieldNickname + ?setHeading@QContactGeoLocation@QtMobility@@QAEXN@Z @ 809 NONAME ; void QtMobility::QContactGeoLocation::setHeading(double) + ?FieldMiddle@QContactName@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 810 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactName::FieldMiddle + ?errorMap@QContactSaveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 811 NONAME ; class QMap QtMobility::QContactSaveRequest::errorMap(void) const + ??0QContactOrganization@QtMobility@@QAE@XZ @ 812 NONAME ; QtMobility::QContactOrganization::QContactOrganization(void) + ?SubTypeMessagingCapable@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$0BB@@2@B @ 813 NONAME ; struct QtMobility::QLatin1Constant<17> const QtMobility::QContactPhoneNumber::SubTypeMessagingCapable + ?removeContacts@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@PAV?$QList@I@@@Z @ 814 NONAME ; class QList QtMobility::QContactManager::removeContacts(class QList *) + ?setPresenceStateImageUrl@QContactGlobalPresence@QtMobility@@QAEXABVQUrl@@@Z @ 815 NONAME ; void QtMobility::QContactGlobalPresence::setPresenceStateImageUrl(class QUrl const &) + ?subType@QContactAvatar@QtMobility@@QBE?AVQString@@XZ @ 816 NONAME ; class QString QtMobility::QContactAvatar::subType(void) const + ?updateRelationshipFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRelationshipFetchRequest@2@ABV?$QList@VQContactRelationship@QtMobility@@@@W4Error@QContactManager@2@W4State@QContactAbstractRequest@2@@Z @ 817 NONAME ; void QtMobility::QContactManagerEngine::updateRelationshipFetchRequest(class QtMobility::QContactRelationshipFetchRequest *, class QList const &, enum QtMobility::QContactManager::Error, enum QtMobility::QContactAbstractRequest::State) + ?relationshipsRemoved@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 818 NONAME ; void QtMobility::QContactManagerEngine::relationshipsRemoved(class QList const &) + ?setId@QContact@QtMobility@@QAEXABVQContactId@2@@Z @ 819 NONAME ; void QtMobility::QContact::setId(class QtMobility::QContactId const &) + ?metaObject@QContactAction@QtMobility@@UBEPBUQMetaObject@@XZ @ 820 NONAME ; struct QMetaObject const * QtMobility::QContactAction::metaObject(void) const + ?SubTypeMemorial@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 821 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactAnniversary::SubTypeMemorial + ?setSince@QContactChangeLogFilter@QtMobility@@QAEXABVQDateTime@@@Z @ 822 NONAME ; void QtMobility::QContactChangeLogFilter::setSince(class QDateTime const &) + ?metaObject@QContactAbstractRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 823 NONAME ; struct QMetaObject const * QtMobility::QContactAbstractRequest::metaObject(void) const + ?setOtherParticipantId@QContactRelationshipFilter@QtMobility@@QAEXABVQContactId@2@@Z @ 824 NONAME ; void QtMobility::QContactRelationshipFilter::setOtherParticipantId(class QtMobility::QContactId const &) + ??IQtMobility@@YA?BVQContactFilter@0@ABV10@0@Z @ 825 NONAME ; class QtMobility::QContactFilter const QtMobility::operator&(class QtMobility::QContactFilter const &, class QtMobility::QContactFilter const &) + ?event@QContactAnniversary@QtMobility@@QBE?AVQString@@XZ @ 826 NONAME ; class QString QtMobility::QContactAnniversary::event(void) const + ?insertRemovedContacts@QContactChangeSet@QtMobility@@QAEXABV?$QList@I@@@Z @ 827 NONAME ; void QtMobility::QContactChangeSet::insertRemovedContacts(class QList const &) + ?removeDetailDefinition@QContactManager@QtMobility@@QAE_NABVQString@@0@Z @ 828 NONAME ; bool QtMobility::QContactManager::removeDetailDefinition(class QString const &, class QString const &) + ??4QContactActionDescriptor@QtMobility@@QAEAAV01@ABV01@@Z @ 829 NONAME ; class QtMobility::QContactActionDescriptor & QtMobility::QContactActionDescriptor::operator=(class QtMobility::QContactActionDescriptor const &) + ??0QContactFamily@QtMobility@@QAE@XZ @ 830 NONAME ; QtMobility::QContactFamily::QContactFamily(void) + ?setEvent@QContactAnniversary@QtMobility@@QAEXABVQString@@@Z @ 831 NONAME ; void QtMobility::QContactAnniversary::setEvent(class QString const &) + ?metaObject@QContactDetailDefinitionFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 832 NONAME ; struct QMetaObject const * QtMobility::QContactDetailDefinitionFetchRequest::metaObject(void) const + ?removeContacts@QContactManager@QtMobility@@QAE_NABV?$QList@I@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 833 NONAME ; bool QtMobility::QContactManager::removeContacts(class QList const &, class QMap *) + ?removeContacts@QContactManagerEngine@QtMobility@@UAE_NABV?$QList@I@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@PAW4Error@QContactManager@2@@Z @ 834 NONAME ; bool QtMobility::QContactManagerEngine::removeContacts(class QList const &, class QMap *, enum QtMobility::QContactManager::Error *) + ?preferredActions@QContactDetail@QtMobility@@QBE?AV?$QList@VQContactActionDescriptor@QtMobility@@@@XZ @ 835 NONAME ; class QList QtMobility::QContactDetail::preferredActions(void) const + ?FieldAltitudeAccuracy@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$0BB@@2@B @ 836 NONAME ; struct QtMobility::QLatin1Constant<17> const QtMobility::QContactGeoLocation::FieldAltitudeAccuracy + ?FieldPresenceStateText@QContactGlobalPresence@QtMobility@@2U?$QLatin1Constant@$0BC@@2@B @ 837 NONAME ; struct QtMobility::QLatin1Constant<18> const QtMobility::QContactGlobalPresence::FieldPresenceStateText + ?SubTypePostal@QContactAddress@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 838 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactAddress::SubTypePostal + ?setFilter@QContactRemoveRequest@QtMobility@@QAEXABVQContactFilter@2@@Z @ 839 NONAME ; void QtMobility::QContactRemoveRequest::setFilter(class QtMobility::QContactFilter const &) + ??1QContactType@QtMobility@@UAE@XZ @ 840 NONAME ; QtMobility::QContactType::~QContactType(void) + ?state@QContactAbstractRequest@QtMobility@@QBE?AW4State@12@XZ @ 841 NONAME ; enum QtMobility::QContactAbstractRequest::State QtMobility::QContactAbstractRequest::state(void) const + ?trUtf8@QContactLocalIdFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 842 NONAME ; class QString QtMobility::QContactLocalIdFetchRequest::trUtf8(char const *, char const *) + ??_EQContactAnniversary@QtMobility@@UAE@I@Z @ 843 NONAME ; QtMobility::QContactAnniversary::~QContactAnniversary(unsigned int) + ??1QContactManager@QtMobility@@UAE@XZ @ 844 NONAME ; QtMobility::QContactManager::~QContactManager(void) + ?FieldSyncTarget@QContactSyncTarget@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 845 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactSyncTarget::FieldSyncTarget + ?DefinitionName@QContactGuid@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 846 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactGuid::DefinitionName + ??_EQContactManagerEngineFactory@QtMobility@@UAE@I@Z @ 847 NONAME ; QtMobility::QContactManagerEngineFactory::~QContactManagerEngineFactory(unsigned int) + ?parseUri@QContactManager@QtMobility@@SA_NABVQString@@PAV3@PAV?$QMap@VQString@@V1@@@@Z @ 848 NONAME ; bool QtMobility::QContactManager::parseUri(class QString const &, class QString *, class QMap *) + ?setFetchHint@QContactFetchRequest@QtMobility@@QAEXABVQContactFetchHint@2@@Z @ 849 NONAME ; void QtMobility::QContactFetchRequest::setFetchHint(class QtMobility::QContactFetchHint const &) + ??_EQContactGuid@QtMobility@@UAE@I@Z @ 850 NONAME ; QtMobility::QContactGuid::~QContactGuid(unsigned int) + ?tr@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 851 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::tr(char const *, char const *, int) + ??_EQContactRelationshipSaveRequest@QtMobility@@UAE@I@Z @ 852 NONAME ; QtMobility::QContactRelationshipSaveRequest::~QContactRelationshipSaveRequest(unsigned int) + ?FieldLast@QContactName@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 853 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactName::FieldLast + ?dataChanged@QContactChangeSet@QtMobility@@QAE_NXZ @ 854 NONAME ; bool QtMobility::QContactChangeSet::dataChanged(void) + ?tr@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0@Z @ 855 NONAME ; class QString QtMobility::QContactManagerEngine::tr(char const *, char const *) + ?managerParameters@QContactManagerEngine@QtMobility@@UBE?AV?$QMap@VQString@@V1@@@XZ @ 856 NONAME ; class QMap QtMobility::QContactManagerEngine::managerParameters(void) const + ?getStaticMetaObject@QContactManagerEngine@QtMobility@@SAABUQMetaObject@@XZ @ 857 NONAME ; struct QMetaObject const & QtMobility::QContactManagerEngine::getStaticMetaObject(void) + ?fields@QContactDetailDefinition@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetailFieldDefinition@QtMobility@@@@XZ @ 858 NONAME ; class QMap QtMobility::QContactDetailDefinition::fields(void) const + ?removeRelationships@QContactManager@QtMobility@@QAE?AV?$QList@W4Error@QContactManager@QtMobility@@@@ABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 859 NONAME ; class QList QtMobility::QContactManager::removeRelationships(class QList const &) + ??4QContactRingtone@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 860 NONAME ; class QtMobility::QContactRingtone & QtMobility::QContactRingtone::operator=(class QtMobility::QContactDetail const &) + ?setLatitude@QContactGeoLocation@QtMobility@@QAEXN@Z @ 861 NONAME ; void QtMobility::QContactGeoLocation::setLatitude(double) + ??0QContactDetailFieldDefinition@QtMobility@@QAE@XZ @ 862 NONAME ; QtMobility::QContactDetailFieldDefinition::QContactDetailFieldDefinition(void) + ?qt_metacast@QContactAction@QtMobility@@UAEPAXPBD@Z @ 863 NONAME ; void * QtMobility::QContactAction::qt_metacast(char const *) + ?thumbnail@QContactThumbnail@QtMobility@@QBE?AVQImage@@XZ @ 864 NONAME ; class QImage QtMobility::QContactThumbnail::thumbnail(void) const + ?qt_metacast@QContactSaveRequest@QtMobility@@UAEPAXPBD@Z @ 865 NONAME ; void * QtMobility::QContactSaveRequest::qt_metacast(char const *) + ?emailAddress@QContactEmailAddress@QtMobility@@QBE?AVQString@@XZ @ 866 NONAME ; class QString QtMobility::QContactEmailAddress::emailAddress(void) const + ??1QContactPhoneNumber@QtMobility@@UAE@XZ @ 867 NONAME ; QtMobility::QContactPhoneNumber::~QContactPhoneNumber(void) + ?SubTypeVideoRingtone@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 868 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactAvatar::SubTypeVideoRingtone + ?d_func@QContactLocalIdFilter@QtMobility@@AAEPAVQContactLocalIdFilterPrivate@2@XZ @ 869 NONAME ; class QtMobility::QContactLocalIdFilterPrivate * QtMobility::QContactLocalIdFilter::d_func(void) + ??8QContactRelationship@QtMobility@@QBE_NABV01@@Z @ 870 NONAME ; bool QtMobility::QContactRelationship::operator==(class QtMobility::QContactRelationship const &) const + ?since@QContactChangeLogFilter@QtMobility@@QBE?AVQDateTime@@XZ @ 871 NONAME ; class QDateTime QtMobility::QContactChangeLogFilter::since(void) const + ?presenceState@QContactPresence@QtMobility@@QBE?AW4PresenceState@12@XZ @ 872 NONAME ; enum QtMobility::QContactPresence::PresenceState QtMobility::QContactPresence::presenceState(void) const + ?DefinitionName@QContactThumbnail@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 873 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactThumbnail::DefinitionName + ?setNickname@QContactNickname@QtMobility@@QAEXABVQString@@@Z @ 874 NONAME ; void QtMobility::QContactNickname::setNickname(class QString const &) + ?d_func@QContactIntersectionFilter@QtMobility@@AAEPAVQContactIntersectionFilterPrivate@2@XZ @ 875 NONAME ; class QtMobility::QContactIntersectionFilterPrivate * QtMobility::QContactIntersectionFilter::d_func(void) + ?d_func@QContactRelationshipFilter@QtMobility@@ABEPBVQContactRelationshipFilterPrivate@2@XZ @ 876 NONAME ; class QtMobility::QContactRelationshipFilterPrivate const * QtMobility::QContactRelationshipFilter::d_func(void) const + ??_EQContactUrl@QtMobility@@UAE@I@Z @ 877 NONAME ; QtMobility::QContactUrl::~QContactUrl(unsigned int) + ?ContextWork@QContactDetail@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 878 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactDetail::ContextWork + ?setVibrationRingtoneUrl@QContactRingtone@QtMobility@@QAEXABVQUrl@@@Z @ 879 NONAME ; void QtMobility::QContactRingtone::setVibrationRingtoneUrl(class QUrl const &) + ?setPreferredActions@QContactDetail@QtMobility@@QAEXABV?$QList@VQContactActionDescriptor@QtMobility@@@@@Z @ 880 NONAME ; void QtMobility::QContactDetail::setPreferredActions(class QList const &) + ?qt_metacast@QContactFetchRequest@QtMobility@@UAEPAXPBD@Z @ 881 NONAME ; void * QtMobility::QContactFetchRequest::qt_metacast(char const *) + ?relationshipType@QContactRelationship@QtMobility@@QBE?AVQString@@XZ @ 882 NONAME ; class QString QtMobility::QContactRelationship::relationshipType(void) const + ?d_func@QContactActionFilter@QtMobility@@AAEPAVQContactActionFilterPrivate@2@XZ @ 883 NONAME ; class QtMobility::QContactActionFilterPrivate * QtMobility::QContactActionFilter::d_func(void) + ?variantValue@QContactDetail@QtMobility@@QBE?AVQVariant@@ABVQString@@@Z @ 884 NONAME ; class QVariant QtMobility::QContactDetail::variantValue(class QString const &) const + ?tr@QContactDetailDefinitionFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 885 NONAME ; class QString QtMobility::QContactDetailDefinitionFetchRequest::tr(char const *, char const *) + ?staticMetaObject@QContactManager@QtMobility@@2UQMetaObject@@B @ 886 NONAME ; struct QMetaObject const QtMobility::QContactManager::staticMetaObject + ?qt_metacast@QContactDetailDefinitionSaveRequest@QtMobility@@UAEPAXPBD@Z @ 887 NONAME ; void * QtMobility::QContactDetailDefinitionSaveRequest::qt_metacast(char const *) + ?qt_metacast@QContactManagerEngine@QtMobility@@UAEPAXPBD@Z @ 888 NONAME ; void * QtMobility::QContactManagerEngine::qt_metacast(char const *) + ??0QContactRelationshipFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 889 NONAME ; QtMobility::QContactRelationshipFilter::QContactRelationshipFilter(class QtMobility::QContactFilter const &) + ?clearDetails@QContact@QtMobility@@QAEXXZ @ 890 NONAME ; void QtMobility::QContact::clearDetails(void) + ?d_func@QContactDetailDefinitionRemoveRequest@QtMobility@@AAEPAVQContactDetailDefinitionRemoveRequestPrivate@2@XZ @ 891 NONAME ; class QtMobility::QContactDetailDefinitionRemoveRequestPrivate * QtMobility::QContactDetailDefinitionRemoveRequest::d_func(void) + ?FieldNickname@QContactNickname@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 892 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactNickname::FieldNickname + ?SubTypeTexturedMesh@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 893 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactAvatar::SubTypeTexturedMesh + ?match@QContactName@QtMobility@@SA?AVQContactFilter@2@ABVQString@@@Z @ 894 NONAME ; class QtMobility::QContactFilter QtMobility::QContactName::match(class QString const &) + ?requestDestroyed@QContactManagerEngine@QtMobility@@UAEXPAVQContactAbstractRequest@2@@Z @ 895 NONAME ; void QtMobility::QContactManagerEngine::requestDestroyed(class QtMobility::QContactAbstractRequest *) + ?FieldSubTypes@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 896 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactOnlineAccount::FieldSubTypes + ?trUtf8@QContactAction@QtMobility@@SA?AVQString@@PBD0@Z @ 897 NONAME ; class QString QtMobility::QContactAction::trUtf8(char const *, char const *) + ??0QContactNote@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 898 NONAME ; QtMobility::QContactNote::QContactNote(class QtMobility::QContactDetail const &) + ?filter@QContactRemoveRequest@QtMobility@@QBE?AVQContactFilter@2@XZ @ 899 NONAME ; class QtMobility::QContactFilter QtMobility::QContactRemoveRequest::filter(void) const + ??0QContactFilter@QtMobility@@IAE@PAVQContactFilterPrivate@1@@Z @ 900 NONAME ; QtMobility::QContactFilter::QContactFilter(class QtMobility::QContactFilterPrivate *) + ?match@QContactEmailAddress@QtMobility@@SA?AVQContactFilter@2@ABVQString@@@Z @ 901 NONAME ; class QtMobility::QContactFilter QtMobility::QContactEmailAddress::match(class QString const &) + ?prefix@QContactName@QtMobility@@QBE?AVQString@@XZ @ 902 NONAME ; class QString QtMobility::QContactName::prefix(void) const + ?HasManager@QContactRelationship@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 903 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactRelationship::HasManager + ?selfContactIdChanged@QContactManager@QtMobility@@IAEXABI0@Z @ 904 NONAME ; void QtMobility::QContactManager::selfContactIdChanged(unsigned int const &, unsigned int const &) + ??0QContactSaveRequest@QtMobility@@QAE@XZ @ 905 NONAME ; QtMobility::QContactSaveRequest::QContactSaveRequest(void) + ?setContactType@QContactDetailDefinitionSaveRequest@QtMobility@@QAEXABVQString@@@Z @ 906 NONAME ; void QtMobility::QContactDetailDefinitionSaveRequest::setContactType(class QString const &) + ??_EQContactRelationshipFilter@QtMobility@@UAE@I@Z @ 907 NONAME ; QtMobility::QContactRelationshipFilter::~QContactRelationshipFilter(unsigned int) + ??0QContactFilter@QtMobility@@QAE@XZ @ 908 NONAME ; QtMobility::QContactFilter::QContactFilter(void) + ??6QtMobility@@YA?AVQDebug@@V1@ABVQContactDetail@0@@Z @ 909 NONAME ; class QDebug QtMobility::operator<<(class QDebug, class QtMobility::QContactDetail const &) + ??0QContactUrl@QtMobility@@QAE@XZ @ 910 NONAME ; QtMobility::QContactUrl::QContactUrl(void) + ?FieldEmailAddress@QContactEmailAddress@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 911 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactEmailAddress::FieldEmailAddress + ?errorMap@QContactRemoveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 912 NONAME ; class QMap QtMobility::QContactRemoveRequest::errorMap(void) const + ?FieldStatusMessage@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 913 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactOnlineAccount::FieldStatusMessage + ?contacts@QContactManagerEngine@QtMobility@@UBE?AV?$QList@VQContact@QtMobility@@@@ABVQContactFilter@2@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQContactFetchHint@2@PAW4Error@QContactManager@2@@Z @ 914 NONAME ; class QList QtMobility::QContactManagerEngine::contacts(class QtMobility::QContactFilter const &, class QList const &, class QtMobility::QContactFetchHint const &, enum QtMobility::QContactManager::Error *) const + ??9QContactId@QtMobility@@QBE_NABV01@@Z @ 915 NONAME ; bool QtMobility::QContactId::operator!=(class QtMobility::QContactId const &) const + ??1QContactSyncTarget@QtMobility@@UAE@XZ @ 916 NONAME ; QtMobility::QContactSyncTarget::~QContactSyncTarget(void) + ??1QContactLocalIdFilter@QtMobility@@UAE@XZ @ 917 NONAME ; QtMobility::QContactLocalIdFilter::~QContactLocalIdFilter(void) + ?dataChanged@QContactManagerEngine@QtMobility@@IAEXXZ @ 918 NONAME ; void QtMobility::QContactManagerEngine::dataChanged(void) + ?getStaticMetaObject@QContactAbstractRequest@QtMobility@@SAABUQMetaObject@@XZ @ 919 NONAME ; struct QMetaObject const & QtMobility::QContactAbstractRequest::getStaticMetaObject(void) + ?FieldTimestamp@QContactPresence@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 920 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactPresence::FieldTimestamp + ?FieldSubTypes@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 921 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactPhoneNumber::FieldSubTypes + ?qt_metacall@QContactRelationshipRemoveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 922 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 @ 923 NONAME ; void QtMobility::QContactManagerEngine::updateRelationshipSaveRequest(class QtMobility::QContactRelationshipSaveRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QMap const &) + ??0QContactActionFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 924 NONAME ; QtMobility::QContactActionFilter::QContactActionFilter(class QtMobility::QContactFilter const &) + ??1QContactDisplayLabel@QtMobility@@UAE@XZ @ 925 NONAME ; QtMobility::QContactDisplayLabel::~QContactDisplayLabel(void) + ?value@QContactDetail@QtMobility@@QBE?AVQString@@ABV3@@Z @ 926 NONAME ; class QString QtMobility::QContactDetail::value(class QString const &) const + ?FieldVideoUrl@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 927 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactAvatar::FieldVideoUrl + ?setRelationshipOrder@QContact@QtMobility@@QAEXABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 928 NONAME ; void QtMobility::QContact::setRelationshipOrder(class QList const &) + ?relationships@QContact@QtMobility@@QBE?AV?$QList@VQContactRelationship@QtMobility@@@@ABVQString@@@Z @ 929 NONAME ; class QList QtMobility::QContact::relationships(class QString const &) const + ?assistantName@QContactOrganization@QtMobility@@QBE?AVQString@@XZ @ 930 NONAME ; class QString QtMobility::QContactOrganization::assistantName(void) const + ?trUtf8@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 931 NONAME ; class QString QtMobility::QContactFetchRequest::trUtf8(char const *, char const *, int) + ??1QContactActionFactory@QtMobility@@UAE@XZ @ 932 NONAME ; QtMobility::QContactActionFactory::~QContactActionFactory(void) + ?contactIds@QContactManager@QtMobility@@QBE?AV?$QList@I@@ABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 933 NONAME ; class QList QtMobility::QContactManager::contactIds(class QList const &) const + ?append@QContactIntersectionFilter@QtMobility@@QAEXABVQContactFilter@2@@Z @ 934 NONAME ; void QtMobility::QContactIntersectionFilter::append(class QtMobility::QContactFilter const &) + ?selfContactId@QContactManagerEngine@QtMobility@@UBEIPAW4Error@QContactManager@2@@Z @ 935 NONAME ; unsigned int QtMobility::QContactManagerEngine::selfContactId(enum QtMobility::QContactManager::Error *) const + ??1QContactEmailAddress@QtMobility@@UAE@XZ @ 936 NONAME ; QtMobility::QContactEmailAddress::~QContactEmailAddress(void) + ?contacts@QContactManager@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQContactSortOrder@QtMobility@@@@ABVQStringList@@@Z @ 937 NONAME ; class QList QtMobility::QContactManager::contacts(class QList const &, class QStringList const &) const + ?definitionRestrictions@QContactFetchRequest@QtMobility@@QBE?AVQStringList@@XZ @ 938 NONAME ; class QStringList QtMobility::QContactFetchRequest::definitionRestrictions(void) const + ?setType@QContactType@QtMobility@@QAEXABVQString@@@Z @ 939 NONAME ; void QtMobility::QContactType::setType(class QString const &) + ?updateDefinitionRemoveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactDetailDefinitionRemoveRequest@2@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 940 NONAME ; void QtMobility::QContactManagerEngine::updateDefinitionRemoveRequest(class QtMobility::QContactDetailDefinitionRemoveRequest *, enum QtMobility::QContactManager::Error, class QMap const &) + ?relationshipType@QContactRelationshipFilter@QtMobility@@QBE?AVQString@@XZ @ 941 NONAME ; class QString QtMobility::QContactRelationshipFilter::relationshipType(void) const + ?buildUri@QContactManager@QtMobility@@SA?AVQString@@ABV3@ABV?$QMap@VQString@@V1@@@H@Z @ 942 NONAME ; class QString QtMobility::QContactManager::buildUri(class QString const &, class QMap const &, int) + ??_EQContactManager@QtMobility@@UAE@I@Z @ 943 NONAME ; QtMobility::QContactManager::~QContactManager(unsigned int) + ??4QContactFamily@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 944 NONAME ; class QtMobility::QContactFamily & QtMobility::QContactFamily::operator=(class QtMobility::QContactDetail const &) + ?trUtf8@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 945 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::trUtf8(char const *, char const *, int) + ?qt_metacast@QContactRelationshipSaveRequest@QtMobility@@UAEPAXPBD@Z @ 946 NONAME ; void * QtMobility::QContactRelationshipSaveRequest::qt_metacast(char const *) + ?setOriginalDate@QContactAnniversary@QtMobility@@QAEXABVQDate@@@Z @ 947 NONAME ; void QtMobility::QContactAnniversary::setOriginalDate(class QDate const &) + ?validateDefinition@QContactManagerEngine@QtMobility@@UBE_NABVQContactDetailDefinition@2@PAW4Error@QContactManager@2@@Z @ 948 NONAME ; bool QtMobility::QContactManagerEngine::validateDefinition(class QtMobility::QContactDetailDefinition const &, enum QtMobility::QContactManager::Error *) const + ??0QContactDetailFilter@QtMobility@@QAE@XZ @ 949 NONAME ; QtMobility::QContactDetailFilter::QContactDetailFilter(void) + ?d_func@QContactDetailFilter@QtMobility@@ABEPBVQContactDetailFilterPrivate@2@XZ @ 950 NONAME ; class QtMobility::QContactDetailFilterPrivate const * QtMobility::QContactDetailFilter::d_func(void) const + ?errorMap@QContactRelationshipRemoveRequest@QtMobility@@QBE?AV?$QMap@HW4Error@QContactManager@QtMobility@@@@XZ @ 951 NONAME ; class QMap QtMobility::QContactRelationshipRemoveRequest::errorMap(void) const + ?SubTypeVideo@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 952 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactPhoneNumber::SubTypeVideo + ?setFilters@QContactIntersectionFilter@QtMobility@@QAEXABV?$QList@VQContactFilter@QtMobility@@@@@Z @ 953 NONAME ; void QtMobility::QContactIntersectionFilter::setFilters(class QList const &) + ?compatibleContact@QContactManager@QtMobility@@QAE?AVQContact@2@ABV32@@Z @ 954 NONAME ; class QtMobility::QContact QtMobility::QContactManager::compatibleContact(class QtMobility::QContact const &) + ??1QContactSaveRequest@QtMobility@@UAE@XZ @ 955 NONAME ; QtMobility::QContactSaveRequest::~QContactSaveRequest(void) + ?contactsAdded@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 956 NONAME ; void QtMobility::QContactManagerEngine::contactsAdded(class QList const &) + ?trUtf8@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 957 NONAME ; class QString QtMobility::QContactAbstractRequest::trUtf8(char const *, char const *) + ?tr@QContactManager@QtMobility@@SA?AVQString@@PBD0@Z @ 958 NONAME ; class QString QtMobility::QContactManager::tr(char const *, char const *) + ?filter@QContactFetchRequest@QtMobility@@QBE?AVQContactFilter@2@XZ @ 959 NONAME ; class QtMobility::QContactFilter QtMobility::QContactFetchRequest::filter(void) const + ?presenceStateText@QContactGlobalPresence@QtMobility@@QBE?AVQString@@XZ @ 960 NONAME ; class QString QtMobility::QContactGlobalPresence::presenceStateText(void) const + ?staticMetaObject@QContactRelationshipRemoveRequest@QtMobility@@2UQMetaObject@@B @ 961 NONAME ; struct QMetaObject const QtMobility::QContactRelationshipRemoveRequest::staticMetaObject + ??1QContactThumbnail@QtMobility@@UAE@XZ @ 962 NONAME ; QtMobility::QContactThumbnail::~QContactThumbnail(void) + ?tr@QContactRelationshipFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 963 NONAME ; class QString QtMobility::QContactRelationshipFetchRequest::tr(char const *, char const *) + ??1QContactSortOrder@QtMobility@@QAE@XZ @ 964 NONAME ; QtMobility::QContactSortOrder::~QContactSortOrder(void) + ??0QContactAbstractRequest@QtMobility@@QAE@XZ @ 965 NONAME ; QtMobility::QContactAbstractRequest::QContactAbstractRequest(void) + ?firstName@QContactName@QtMobility@@QBE?AVQString@@XZ @ 966 NONAME ; class QString QtMobility::QContactName::firstName(void) const + ?setRelationshipType@QContactRelationshipFetchRequest@QtMobility@@QAEXABVQString@@@Z @ 967 NONAME ; void QtMobility::QContactRelationshipFetchRequest::setRelationshipType(class QString const &) + ?setSubTypes@QContactAddress@QtMobility@@QAEXABVQStringList@@@Z @ 968 NONAME ; void QtMobility::QContactAddress::setSubTypes(class QStringList const &) + ?subType@QContactUrl@QtMobility@@QBE?AVQString@@XZ @ 969 NONAME ; class QString QtMobility::QContactUrl::subType(void) const + ?isRelationshipTypeSupported@QContactManagerEngine@QtMobility@@UBE_NABVQString@@0@Z @ 970 NONAME ; bool QtMobility::QContactManagerEngine::isRelationshipTypeSupported(class QString const &, class QString const &) const + ?isFilterSupported@QContactManagerEngine@QtMobility@@UBE_NABVQContactFilter@2@@Z @ 971 NONAME ; bool QtMobility::QContactManagerEngine::isFilterSupported(class QtMobility::QContactFilter const &) const + ?setOldAndNewSelfContactId@QContactChangeSet@QtMobility@@QAEXABU?$QPair@II@@@Z @ 972 NONAME ; void QtMobility::QContactChangeSet::setOldAndNewSelfContactId(struct QPair const &) + ??1QContactManagerEngine@QtMobility@@UAE@XZ @ 973 NONAME ; QtMobility::QContactManagerEngine::~QContactManagerEngine(void) + ??0QContactGuid@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 974 NONAME ; QtMobility::QContactGuid::QContactGuid(class QtMobility::QContactDetail const &) + ??0QContactSyncTarget@QtMobility@@QAE@XZ @ 975 NONAME ; QtMobility::QContactSyncTarget::QContactSyncTarget(void) + ?qt_metacall@QContactDetailDefinitionSaveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 976 NONAME ; int QtMobility::QContactDetailDefinitionSaveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?FieldPresenceStateImageUrl@QContactPresence@QtMobility@@2U?$QLatin1Constant@$0BG@@2@B @ 977 NONAME ; struct QtMobility::QLatin1Constant<22> const QtMobility::QContactPresence::FieldPresenceStateImageUrl + ?resultsAvailable@QContactAbstractRequest@QtMobility@@IAEXXZ @ 978 NONAME ; void QtMobility::QContactAbstractRequest::resultsAvailable(void) + ?DefinitionName@QContactType@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 979 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactType::DefinitionName + ?staticMetaObject@QContactLocalIdFetchRequest@QtMobility@@2UQMetaObject@@B @ 980 NONAME ; struct QMetaObject const QtMobility::QContactLocalIdFetchRequest::staticMetaObject + ??4QContactAddress@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 981 NONAME ; class QtMobility::QContactAddress & QtMobility::QContactAddress::operator=(class QtMobility::QContactDetail const &) + ?contactType@QContactDetailDefinitionSaveRequest@QtMobility@@QBE?AVQString@@XZ @ 982 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::contactType(void) const + ??0QContactRelationshipFilter@QtMobility@@QAE@XZ @ 983 NONAME ; QtMobility::QContactRelationshipFilter::QContactRelationshipFilter(void) + ??0QContactBirthday@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 984 NONAME ; QtMobility::QContactBirthday::QContactBirthday(class QtMobility::QContactDetail const &) + ??0QContactDetailDefinitionFetchRequest@QtMobility@@QAE@XZ @ 985 NONAME ; QtMobility::QContactDetailDefinitionFetchRequest::QContactDetailDefinitionFetchRequest(void) + ??0QContactRingtone@QtMobility@@QAE@XZ @ 986 NONAME ; QtMobility::QContactRingtone::QContactRingtone(void) + ?setRelationships@QContactRelationshipRemoveRequest@QtMobility@@QAEXABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 987 NONAME ; void QtMobility::QContactRelationshipRemoveRequest::setRelationships(class QList const &) + ?setTag@QContactTag@QtMobility@@QAEXABVQString@@@Z @ 988 NONAME ; void QtMobility::QContactTag::setTag(class QString const &) + ?SubTypeVoice@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 989 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactPhoneNumber::SubTypeVoice + ??8QContact@QtMobility@@QBE_NABV01@@Z @ 990 NONAME ; bool QtMobility::QContact::operator==(class QtMobility::QContact const &) const + ??0QContactChangeLogFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 991 NONAME ; QtMobility::QContactChangeLogFilter::QContactChangeLogFilter(class QtMobility::QContactFilter const &) + ??0QContactRelationshipSaveRequest@QtMobility@@QAE@XZ @ 992 NONAME ; QtMobility::QContactRelationshipSaveRequest::QContactRelationshipSaveRequest(void) + ?FieldCustomMessage@QContactPresence@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 993 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactPresence::FieldCustomMessage + ?contactsChanged@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 994 NONAME ; void QtMobility::QContactManagerEngine::contactsChanged(class QList const &) + ?clearRemovedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEXXZ @ 995 NONAME ; void QtMobility::QContactChangeSet::clearRemovedRelationshipsContacts(void) + ?setDepartment@QContactOrganization@QtMobility@@QAEXABVQStringList@@@Z @ 996 NONAME ; void QtMobility::QContactOrganization::setDepartment(class QStringList const &) + ?tr@QContactManagerEngine@QtMobility@@SA?AVQString@@PBD0H@Z @ 997 NONAME ; class QString QtMobility::QContactManagerEngine::tr(char const *, char const *, int) + ?contactsRemoved@QContactManager@QtMobility@@IAEXABV?$QList@I@@@Z @ 998 NONAME ; void QtMobility::QContactManager::contactsRemoved(class QList const &) + ?contactType@QContactDetailDefinitionRemoveRequest@QtMobility@@QBE?AVQString@@XZ @ 999 NONAME ; class QString QtMobility::QContactDetailDefinitionRemoveRequest::contactType(void) const + ??0QContactLocalIdFetchRequest@QtMobility@@QAE@XZ @ 1000 NONAME ; QtMobility::QContactLocalIdFetchRequest::QContactLocalIdFetchRequest(void) + ??1QContactOrganization@QtMobility@@UAE@XZ @ 1001 NONAME ; QtMobility::QContactOrganization::~QContactOrganization(void) + ?setPresenceState@QContactGlobalPresence@QtMobility@@QAEXW4PresenceState@QContactPresence@2@@Z @ 1002 NONAME ; void QtMobility::QContactGlobalPresence::setPresenceState(enum QtMobility::QContactPresence::PresenceState) + ?FieldGuid@QContactGuid@QtMobility@@2U?$QLatin1Constant@$04@2@B @ 1003 NONAME ; struct QtMobility::QLatin1Constant<5> const QtMobility::QContactGuid::FieldGuid + ?relatedContactId@QContactRelationshipFilter@QtMobility@@QBE?AVQContactId@2@XZ @ 1004 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFilter::relatedContactId(void) const + ?metaObject@QContactRemoveRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 1005 NONAME ; struct QMetaObject const * QtMobility::QContactRemoveRequest::metaObject(void) const + ?supportedRelationshipTypes@QContactManager@QtMobility@@QBE?AVQStringList@@ABVQString@@@Z @ 1006 NONAME ; class QStringList QtMobility::QContactManager::supportedRelationshipTypes(class QString const &) const + ?error@QContactAbstractRequest@QtMobility@@QBE?AW4Error@QContactManager@2@XZ @ 1007 NONAME ; enum QtMobility::QContactManager::Error QtMobility::QContactAbstractRequest::error(void) const + ?error@QContactManager@QtMobility@@QBE?AW4Error@12@XZ @ 1008 NONAME ; enum QtMobility::QContactManager::Error QtMobility::QContactManager::error(void) const + ??0QContactRelationshipRemoveRequest@QtMobility@@QAE@XZ @ 1009 NONAME ; QtMobility::QContactRelationshipRemoveRequest::QContactRelationshipRemoveRequest(void) + ?setSorting@QContactLocalIdFetchRequest@QtMobility@@QAEXABV?$QList@VQContactSortOrder@QtMobility@@@@@Z @ 1010 NONAME ; void QtMobility::QContactLocalIdFetchRequest::setSorting(class QList const &) + ?trUtf8@QContactAction@QtMobility@@SA?AVQString@@PBD0H@Z @ 1011 NONAME ; class QString QtMobility::QContactAction::trUtf8(char const *, char const *, int) + ??_EQContactEmailAddress@QtMobility@@UAE@I@Z @ 1012 NONAME ; QtMobility::QContactEmailAddress::~QContactEmailAddress(unsigned int) + ?startRequest@QContactManagerEngine@QtMobility@@UAE_NPAVQContactAbstractRequest@2@@Z @ 1013 NONAME ; bool QtMobility::QContactManagerEngine::startRequest(class QtMobility::QContactAbstractRequest *) + ?updateContactSaveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactSaveRequest@2@ABV?$QList@VQContact@QtMobility@@@@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@W4State@QContactAbstractRequest@2@@Z @ 1014 NONAME ; void QtMobility::QContactManagerEngine::updateContactSaveRequest(class QtMobility::QContactSaveRequest *, class QList const &, enum QtMobility::QContactManager::Error, class QMap const &, enum QtMobility::QContactAbstractRequest::State) + ?setNumber@QContactPhoneNumber@QtMobility@@QAEXABVQString@@@Z @ 1015 NONAME ; void QtMobility::QContactPhoneNumber::setNumber(class QString const &) + ?otherParticipantId@QContactRelationshipFilter@QtMobility@@QBE?AVQContactId@2@XZ @ 1016 NONAME ; class QtMobility::QContactId QtMobility::QContactRelationshipFilter::otherParticipantId(void) const + ?tr@QContactDetailDefinitionSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 1017 NONAME ; class QString QtMobility::QContactDetailDefinitionSaveRequest::tr(char const *, char const *, int) + ??_EQContactDetailDefinitionFetchRequest@QtMobility@@UAE@I@Z @ 1018 NONAME ; QtMobility::QContactDetailDefinitionFetchRequest::~QContactDetailDefinitionFetchRequest(unsigned int) + ??4QContactDetailDefinition@QtMobility@@QAEAAV01@ABV01@@Z @ 1019 NONAME ; class QtMobility::QContactDetailDefinition & QtMobility::QContactDetailDefinition::operator=(class QtMobility::QContactDetailDefinition const &) + ?detail@QContact@QtMobility@@QBE?AVQContactDetail@2@ABVQString@@@Z @ 1020 NONAME ; class QtMobility::QContactDetail QtMobility::QContact::detail(class QString const &) const + ?resultsAvailable@QContactAction@QtMobility@@IAEXXZ @ 1021 NONAME ; void QtMobility::QContactAction::resultsAvailable(void) + ??1QContactTimestamp@QtMobility@@UAE@XZ @ 1022 NONAME ; QtMobility::QContactTimestamp::~QContactTimestamp(void) + ?qt_metacall@QContactManagerEngine@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1023 NONAME ; int QtMobility::QContactManagerEngine::qt_metacall(enum QMetaObject::Call, int, void * *) + ?DefinitionName@QContactOrganization@QtMobility@@2U?$QLatin1Constant@$0N@@2@B @ 1024 NONAME ; struct QtMobility::QLatin1Constant<13> const QtMobility::QContactOrganization::DefinitionName + ?timestamp@QContactGlobalPresence@QtMobility@@QBE?AVQDateTime@@XZ @ 1025 NONAME ; class QDateTime QtMobility::QContactGlobalPresence::timestamp(void) const + ?saveContacts@QContactManager@QtMobility@@QAE_NPAV?$QList@VQContact@QtMobility@@@@PAV?$QMap@HW4Error@QContactManager@QtMobility@@@@@Z @ 1026 NONAME ; bool QtMobility::QContactManager::saveContacts(class QList *, class QMap *) + ??1QContactActionDescriptor@QtMobility@@QAE@XZ @ 1027 NONAME ; QtMobility::QContactActionDescriptor::~QContactActionDescriptor(void) + ??1QContactDetailDefinitionFetchRequest@QtMobility@@UAE@XZ @ 1028 NONAME ; QtMobility::QContactDetailDefinitionFetchRequest::~QContactDetailDefinitionFetchRequest(void) + ?PresenceAvailable@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 1029 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactOnlineAccount::PresenceAvailable + ?setAssistantName@QContactOrganization@QtMobility@@QAEXABVQString@@@Z @ 1030 NONAME ; void QtMobility::QContactOrganization::setAssistantName(class QString const &) + ?staticMetaObject@QContactManagerEngine@QtMobility@@2UQMetaObject@@B @ 1031 NONAME ; struct QMetaObject const QtMobility::QContactManagerEngine::staticMetaObject + ?timestamp@QContactPresence@QtMobility@@QBE?AVQDateTime@@XZ @ 1032 NONAME ; class QDateTime QtMobility::QContactPresence::timestamp(void) const + ??0QContactIntersectionFilter@QtMobility@@QAE@XZ @ 1033 NONAME ; QtMobility::QContactIntersectionFilter::QContactIntersectionFilter(void) + ?setMiddleName@QContactName@QtMobility@@QAEXABVQString@@@Z @ 1034 NONAME ; void QtMobility::QContactName::setMiddleName(class QString const &) + ??_EQContactActionFilter@QtMobility@@UAE@I@Z @ 1035 NONAME ; QtMobility::QContactActionFilter::~QContactActionFilter(unsigned int) + ?SubTypeDomestic@QContactAddress@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 1036 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactAddress::SubTypeDomestic + ?FieldCalendarId@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 1037 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactAnniversary::FieldCalendarId + ?setPresenceStateText@QContactGlobalPresence@QtMobility@@QAEXABVQString@@@Z @ 1038 NONAME ; void QtMobility::QContactGlobalPresence::setPresenceStateText(class QString const &) + ?qt_metacall@QContactRemoveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1039 NONAME ; int QtMobility::QContactRemoveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ??_EQContactActionFactory@QtMobility@@UAE@I@Z @ 1040 NONAME ; QtMobility::QContactActionFactory::~QContactActionFactory(unsigned int) + ?setNickname@QContactPresence@QtMobility@@QAEXABVQString@@@Z @ 1041 NONAME ; void QtMobility::QContactPresence::setNickname(class QString const &) + ?altitude@QContactGeoLocation@QtMobility@@QBENXZ @ 1042 NONAME ; double QtMobility::QContactGeoLocation::altitude(void) const + ?FieldNickname@QContactGlobalPresence@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 1043 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactGlobalPresence::FieldNickname + ?detailWithAction@QContact@QtMobility@@QBE?AVQContactDetail@2@ABVQString@@@Z @ 1044 NONAME ; class QtMobility::QContactDetail QtMobility::QContact::detailWithAction(class QString const &) const + ?details@QContact@QtMobility@@QBE?AV?$QList@VQContactDetail@QtMobility@@@@ABVQString@@@Z @ 1045 NONAME ; class QList QtMobility::QContact::details(class QString const &) const + ?d_func@QContactDetailDefinitionSaveRequest@QtMobility@@AAEPAVQContactDetailDefinitionSaveRequestPrivate@2@XZ @ 1046 NONAME ; class QtMobility::QContactDetailDefinitionSaveRequestPrivate * QtMobility::QContactDetailDefinitionSaveRequest::d_func(void) + ??BQContactSortOrder@QtMobility@@QBE?AV?$QList@VQContactSortOrder@QtMobility@@@@XZ @ 1047 NONAME ; QtMobility::QContactSortOrder::operator class QList(void) const + ?isInactive@QContactAbstractRequest@QtMobility@@QBE_NXZ @ 1048 NONAME ; bool QtMobility::QContactAbstractRequest::isInactive(void) const + ?key@QContactDetail@QtMobility@@QBEHXZ @ 1049 NONAME ; int QtMobility::QContactDetail::key(void) const + ?FieldLongitude@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 1050 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactGeoLocation::FieldLongitude + ?qt_metacast@QContactDetailDefinitionRemoveRequest@QtMobility@@UAEPAXPBD@Z @ 1051 NONAME ; void * QtMobility::QContactDetailDefinitionRemoveRequest::qt_metacast(char const *) + ?contactIds@QContactRemoveRequest@QtMobility@@QBE?AV?$QList@I@@XZ @ 1052 NONAME ; class QList QtMobility::QContactRemoveRequest::contactIds(void) const + ?SubTypeDtmfMenu@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 1053 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactPhoneNumber::SubTypeDtmfMenu + ?SubTypeWedding@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 1054 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactAnniversary::SubTypeWedding + ??0QContactUnionFilter@QtMobility@@QAE@ABVQContactFilter@1@@Z @ 1055 NONAME ; QtMobility::QContactUnionFilter::QContactUnionFilter(class QtMobility::QContactFilter const &) + ?SubTypeBulletinBoardSystem@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$0BE@@2@B @ 1056 NONAME ; struct QtMobility::QLatin1Constant<20> const QtMobility::QContactPhoneNumber::SubTypeBulletinBoardSystem + ?d_func@QContactDetailDefinitionFetchRequest@QtMobility@@ABEPBVQContactDetailDefinitionFetchRequestPrivate@2@XZ @ 1057 NONAME ; class QtMobility::QContactDetailDefinitionFetchRequestPrivate const * QtMobility::QContactDetailDefinitionFetchRequest::d_func(void) const + ?FieldSubTypes@QContactAddress@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 1058 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactAddress::FieldSubTypes + ?SubTypeMobile@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 1059 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactPhoneNumber::SubTypeMobile + ??1QContactNote@QtMobility@@UAE@XZ @ 1060 NONAME ; QtMobility::QContactNote::~QContactNote(void) + ?FieldSuffix@QContactName@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 1061 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactName::FieldSuffix + ?FieldSubType@QContactUrl@QtMobility@@2U?$QLatin1Constant@$07@2@B @ 1062 NONAME ; struct QtMobility::QLatin1Constant<8> const QtMobility::QContactUrl::FieldSubType + ?GenderUnspecified@QContactGender@QtMobility@@2U?$QLatin1Constant@$0M@@2@B @ 1063 NONAME ; struct QtMobility::QLatin1Constant<12> const QtMobility::QContactGender::GenderUnspecified + ?setMatchFlags@QContactDetailFilter@QtMobility@@QAEXV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@@Z @ 1064 NONAME ; void QtMobility::QContactDetailFilter::setMatchFlags(class QFlags) + ??8QContactActionDescriptor@QtMobility@@QBE_NABV01@@Z @ 1065 NONAME ; bool QtMobility::QContactActionDescriptor::operator==(class QtMobility::QContactActionDescriptor const &) const + ?FieldAccountUri@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 1066 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactOnlineAccount::FieldAccountUri + ??_EQContactDetailDefinitionSaveRequest@QtMobility@@UAE@I@Z @ 1067 NONAME ; QtMobility::QContactDetailDefinitionSaveRequest::~QContactDetailDefinitionSaveRequest(unsigned int) + ?region@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 1068 NONAME ; class QString QtMobility::QContactAddress::region(void) const + ?validateContact@QContactManagerEngine@QtMobility@@UBE_NABVQContact@2@PAW4Error@QContactManager@2@@Z @ 1069 NONAME ; bool QtMobility::QContactManagerEngine::validateContact(class QtMobility::QContact const &, enum QtMobility::QContactManager::Error *) const + ?setVendorName@QContactActionDescriptor@QtMobility@@QAEXABVQString@@@Z @ 1070 NONAME ; void QtMobility::QContactActionDescriptor::setVendorName(class QString const &) + ?managerVersion@QContactManager@QtMobility@@QBEHXZ @ 1071 NONAME ; int QtMobility::QContactManager::managerVersion(void) const + ?setSubTypes@QContactPhoneNumber@QtMobility@@QAEXABVQString@@@Z @ 1072 NONAME ; void QtMobility::QContactPhoneNumber::setSubTypes(class QString const &) + ??0QContactRelationship@QtMobility@@QAE@XZ @ 1073 NONAME ; QtMobility::QContactRelationship::QContactRelationship(void) + ?SubTypeHomePage@QContactUrl@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 1074 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactUrl::SubTypeHomePage + ??0QContactGender@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 1075 NONAME ; QtMobility::QContactGender::QContactGender(class QtMobility::QContactDetail const &) + ?updateRelationshipFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactRelationshipFetchRequest@2@ABV?$QList@VQContactRelationship@QtMobility@@@@W4Error@QContactManager@2@@Z @ 1076 NONAME ; void QtMobility::QContactManagerEngine::updateRelationshipFetchRequest(class QtMobility::QContactRelationshipFetchRequest *, class QList const &, enum QtMobility::QContactManager::Error) + ?tr@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 1077 NONAME ; class QString QtMobility::QContactFetchRequest::tr(char const *, char const *, int) + ?d_func@QContactRelationshipFilter@QtMobility@@AAEPAVQContactRelationshipFilterPrivate@2@XZ @ 1078 NONAME ; class QtMobility::QContactRelationshipFilterPrivate * QtMobility::QContactRelationshipFilter::d_func(void) + ?managerUri@QContactId@QtMobility@@QBE?AVQString@@XZ @ 1079 NONAME ; class QString QtMobility::QContactId::managerUri(void) const + ?setNote@QContactNote@QtMobility@@QAEXABVQString@@@Z @ 1080 NONAME ; void QtMobility::QContactNote::setNote(class QString const &) + ?d_func@QContactRelationshipRemoveRequest@QtMobility@@ABEPBVQContactRelationshipRemoveRequestPrivate@2@XZ @ 1081 NONAME ; class QtMobility::QContactRelationshipRemoveRequestPrivate const * QtMobility::QContactRelationshipRemoveRequest::d_func(void) const + ?FieldFirst@QContactName@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 1082 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactName::FieldFirst + ??1QContactGender@QtMobility@@UAE@XZ @ 1083 NONAME ; QtMobility::QContactGender::~QContactGender(void) + ?insertRemovedRelationshipsContact@QContactChangeSet@QtMobility@@QAEXI@Z @ 1084 NONAME ; void QtMobility::QContactChangeSet::insertRemovedRelationshipsContact(unsigned int) + ??0QContactThumbnail@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 1085 NONAME ; QtMobility::QContactThumbnail::QContactThumbnail(class QtMobility::QContactDetail const &) + ?setChildren@QContactFamily@QtMobility@@QAEXABVQStringList@@@Z @ 1086 NONAME ; void QtMobility::QContactFamily::setChildren(class QStringList const &) + ?DefinitionName@QContactTimestamp@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 1087 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactTimestamp::DefinitionName + ?FieldTimestamp@QContactGeoLocation@QtMobility@@2U?$QLatin1Constant@$09@2@B @ 1088 NONAME ; struct QtMobility::QLatin1Constant<10> const QtMobility::QContactGeoLocation::FieldTimestamp + ??0QContactSyncTarget@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 1089 NONAME ; QtMobility::QContactSyncTarget::QContactSyncTarget(class QtMobility::QContactDetail const &) + ?middleName@QContactName@QtMobility@@QBE?AVQString@@XZ @ 1090 NONAME ; class QString QtMobility::QContactName::middleName(void) const + ?setLocality@QContactAddress@QtMobility@@QAEXABVQString@@@Z @ 1091 NONAME ; void QtMobility::QContactAddress::setLocality(class QString const &) + ?insertRemovedRelationshipsContacts@QContactChangeSet@QtMobility@@QAEXABV?$QList@I@@@Z @ 1092 NONAME ; void QtMobility::QContactChangeSet::insertRemovedRelationshipsContacts(class QList const &) + ?clearRemovedContacts@QContactChangeSet@QtMobility@@QAEXXZ @ 1093 NONAME ; void QtMobility::QContactChangeSet::clearRemovedContacts(void) + ??6QContactUnionFilter@QtMobility@@QAEAAV01@ABVQContactFilter@1@@Z @ 1094 NONAME ; class QtMobility::QContactUnionFilter & QtMobility::QContactUnionFilter::operator<<(class QtMobility::QContactFilter const &) + ?removeContact@QContactManager@QtMobility@@QAE_NABI@Z @ 1095 NONAME ; bool QtMobility::QContactManager::removeContact(unsigned int const &) + ??0QContactDetailFieldDefinition@QtMobility@@QAE@ABV01@@Z @ 1096 NONAME ; QtMobility::QContactDetailFieldDefinition::QContactDetailFieldDefinition(class QtMobility::QContactDetailFieldDefinition const &) + ?tr@QContactRelationshipSaveRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 1097 NONAME ; class QString QtMobility::QContactRelationshipSaveRequest::tr(char const *, char const *, int) + ?PresenceHidden@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 1098 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactOnlineAccount::PresenceHidden + ??1QContactId@QtMobility@@QAE@XZ @ 1099 NONAME ; QtMobility::QContactId::~QContactId(void) + ?getStaticMetaObject@QContactFetchRequest@QtMobility@@SAABUQMetaObject@@XZ @ 1100 NONAME ; struct QMetaObject const & QtMobility::QContactFetchRequest::getStaticMetaObject(void) + ?detailDefinitions@QContactManager@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetailDefinition@QtMobility@@@@ABVQString@@@Z @ 1101 NONAME ; class QMap QtMobility::QContactManager::detailDefinitions(class QString const &) const + ?type@QContact@QtMobility@@QBE?AVQString@@XZ @ 1102 NONAME ; class QString QtMobility::QContact::type(void) const + ?sorting@QContactFetchRequest@QtMobility@@QBE?AV?$QList@VQContactSortOrder@QtMobility@@@@XZ @ 1103 NONAME ; class QList QtMobility::QContactFetchRequest::sorting(void) const + ?setDate@QContactBirthday@QtMobility@@QAEXABVQDate@@@Z @ 1104 NONAME ; void QtMobility::QContactBirthday::setDate(class QDate const &) + ?staticMetaObject@QContactAbstractRequest@QtMobility@@2UQMetaObject@@B @ 1105 NONAME ; struct QMetaObject const QtMobility::QContactAbstractRequest::staticMetaObject + ?match@QContactPhoneNumber@QtMobility@@SA?AVQContactFilter@2@ABVQString@@@Z @ 1106 NONAME ; class QtMobility::QContactFilter QtMobility::QContactPhoneNumber::match(class QString const &) + ?vendorName@QContactActionDescriptor@QtMobility@@QBE?AVQString@@XZ @ 1107 NONAME ; class QString QtMobility::QContactActionDescriptor::vendorName(void) const + ?FieldEvent@QContactAnniversary@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 1108 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactAnniversary::FieldEvent + ??1QContactDetailRangeFilter@QtMobility@@UAE@XZ @ 1109 NONAME ; QtMobility::QContactDetailRangeFilter::~QContactDetailRangeFilter(void) + ?FieldDepartment@QContactOrganization@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 1110 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactOrganization::FieldDepartment + ??0QContactDetailDefinitionSaveRequest@QtMobility@@QAE@XZ @ 1111 NONAME ; QtMobility::QContactDetailDefinitionSaveRequest::QContactDetailDefinitionSaveRequest(void) + ?isPreferredDetail@QContact@QtMobility@@QBE_NABVQString@@ABVQContactDetail@2@@Z @ 1112 NONAME ; bool QtMobility::QContact::isPreferredDetail(class QString const &, class QtMobility::QContactDetail const &) const + ??1QContactAvatar@QtMobility@@UAE@XZ @ 1113 NONAME ; QtMobility::QContactAvatar::~QContactAvatar(void) + ?clear@QContactChangeSet@QtMobility@@QAEXXZ @ 1114 NONAME ; void QtMobility::QContactChangeSet::clear(void) + ?isEmpty@QContact@QtMobility@@QBE_NXZ @ 1115 NONAME ; bool QtMobility::QContact::isEmpty(void) const + ?FieldSpouse@QContactFamily@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 1116 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactFamily::FieldSpouse + ?addedRelationshipsContacts@QContactChangeSet@QtMobility@@QBE?AV?$QSet@I@@XZ @ 1117 NONAME ; class QSet QtMobility::QContactChangeSet::addedRelationshipsContacts(void) const + ??0QContactType@QtMobility@@QAE@ABVQContactDetail@1@@Z @ 1118 NONAME ; QtMobility::QContactType::QContactType(class QtMobility::QContactDetail const &) + ??1QContactAction@QtMobility@@UAE@XZ @ 1119 NONAME ; QtMobility::QContactAction::~QContactAction(void) + ?role@QContactRelationshipFilter@QtMobility@@QBE?AW4Role@12@XZ @ 1120 NONAME ; enum QtMobility::QContactRelationshipFilter::Role QtMobility::QContactRelationshipFilter::role(void) const + ?accessConstraints@QContactDetail@QtMobility@@QBE?AV?$QFlags@W4AccessConstraint@QContactDetail@QtMobility@@@@XZ @ 1121 NONAME ; class QFlags QtMobility::QContactDetail::accessConstraints(void) const + ?tr@QContactAbstractRequest@QtMobility@@SA?AVQString@@PBD0H@Z @ 1122 NONAME ; class QString QtMobility::QContactAbstractRequest::tr(char const *, char const *, int) + ?setRelationships@QContactRelationshipSaveRequest@QtMobility@@QAEXABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 1123 NONAME ; void QtMobility::QContactRelationshipSaveRequest::setRelationships(class QList const &) + ??4QContactTimestamp@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1124 NONAME ; class QtMobility::QContactTimestamp & QtMobility::QContactTimestamp::operator=(class QtMobility::QContactDetail const &) + ?d_func@QContactActionFilter@QtMobility@@ABEPBVQContactActionFilterPrivate@2@XZ @ 1125 NONAME ; class QtMobility::QContactActionFilterPrivate const * QtMobility::QContactActionFilter::d_func(void) const + ??_EQContactManagerEngine@QtMobility@@UAE@I@Z @ 1126 NONAME ; QtMobility::QContactManagerEngine::~QContactManagerEngine(unsigned int) + ?managerUri@QContactManagerEngine@QtMobility@@QBE?AVQString@@XZ @ 1127 NONAME ; class QString QtMobility::QContactManagerEngine::managerUri(void) const + ?setLabel@QContactGeoLocation@QtMobility@@QAEXABVQString@@@Z @ 1128 NONAME ; void QtMobility::QContactGeoLocation::setLabel(class QString const &) + ?hasFeature@QContactManagerEngine@QtMobility@@UBE_NW4ManagerFeature@QContactManager@2@ABVQString@@@Z @ 1129 NONAME ; bool QtMobility::QContactManagerEngine::hasFeature(enum QtMobility::QContactManager::ManagerFeature, class QString const &) const + ?preferredDetails@QContact@QtMobility@@QBE?AV?$QMap@VQString@@VQContactDetail@QtMobility@@@@XZ @ 1130 NONAME ; class QMap QtMobility::QContact::preferredDetails(void) const + ?setDefinitions@QContactDetailDefinitionSaveRequest@QtMobility@@QAEXABV?$QList@VQContactDetailDefinition@QtMobility@@@@@Z @ 1131 NONAME ; void QtMobility::QContactDetailDefinitionSaveRequest::setDefinitions(class QList const &) + ?locality@QContactAddress@QtMobility@@QBE?AVQString@@XZ @ 1132 NONAME ; class QString QtMobility::QContactAddress::locality(void) const + ?SubTypeModem@QContactPhoneNumber@QtMobility@@2U?$QLatin1Constant@$05@2@B @ 1133 NONAME ; struct QtMobility::QLatin1Constant<6> const QtMobility::QContactPhoneNumber::SubTypeModem + ?match@QContactDisplayLabel@QtMobility@@SA?AVQContactFilter@2@ABVQString@@@Z @ 1134 NONAME ; class QtMobility::QContactFilter QtMobility::QContactDisplayLabel::match(class QString const &) + ?SubTypeAudioRingtone@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 1135 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactAvatar::SubTypeAudioRingtone + ??1QContactDetailFilter@QtMobility@@UAE@XZ @ 1136 NONAME ; QtMobility::QContactDetailFilter::~QContactDetailFilter(void) + ?isEmpty@QContactActionDescriptor@QtMobility@@QBE_NXZ @ 1137 NONAME ; bool QtMobility::QContactActionDescriptor::isEmpty(void) const + ?setSelfContactId@QContactManager@QtMobility@@QAE_NABI@Z @ 1138 NONAME ; bool QtMobility::QContactManager::setSelfContactId(unsigned int const &) + ?setContactRelationships@QContactManagerEngine@QtMobility@@SAXPAVQContact@2@ABV?$QList@VQContactRelationship@QtMobility@@@@@Z @ 1139 NONAME ; void QtMobility::QContactManagerEngine::setContactRelationships(class QtMobility::QContact *, class QList const &) + ?getStaticMetaObject@QContactRelationshipRemoveRequest@QtMobility@@SAABUQMetaObject@@XZ @ 1140 NONAME ; struct QMetaObject const & QtMobility::QContactRelationshipRemoveRequest::getStaticMetaObject(void) + ?contactsRemoved@QContactManagerEngine@QtMobility@@IAEXABV?$QList@I@@@Z @ 1141 NONAME ; void QtMobility::QContactManagerEngine::contactsRemoved(class QList const &) + ?isValid@QContactSortOrder@QtMobility@@QBE_NXZ @ 1142 NONAME ; bool QtMobility::QContactSortOrder::isValid(void) const + ?metaObject@QContactRelationshipFetchRequest@QtMobility@@UBEPBUQMetaObject@@XZ @ 1143 NONAME ; struct QMetaObject const * QtMobility::QContactRelationshipFetchRequest::metaObject(void) const + ?tr@QContactFetchRequest@QtMobility@@SA?AVQString@@PBD0@Z @ 1144 NONAME ; class QString QtMobility::QContactFetchRequest::tr(char const *, char const *) + ?setAccuracy@QContactGeoLocation@QtMobility@@QAEXN@Z @ 1145 NONAME ; void QtMobility::QContactGeoLocation::setAccuracy(double) + ??1QContactRelationshipFilter@QtMobility@@UAE@XZ @ 1146 NONAME ; QtMobility::QContactRelationshipFilter::~QContactRelationshipFilter(void) + ?updateContactLocalIdFetchRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactLocalIdFetchRequest@2@ABV?$QList@I@@W4Error@QContactManager@2@W4State@QContactAbstractRequest@2@@Z @ 1147 NONAME ; void QtMobility::QContactManagerEngine::updateContactLocalIdFetchRequest(class QtMobility::QContactLocalIdFetchRequest *, class QList const &, enum QtMobility::QContactManager::Error, enum QtMobility::QContactAbstractRequest::State) + ??0QContactChangeSet@QtMobility@@QAE@ABV01@@Z @ 1148 NONAME ; QtMobility::QContactChangeSet::QContactChangeSet(class QtMobility::QContactChangeSet const &) + ?filters@QContactUnionFilter@QtMobility@@QBE?AV?$QList@VQContactFilter@QtMobility@@@@XZ @ 1149 NONAME ; class QList QtMobility::QContactUnionFilter::filters(void) const + ?qt_metacast@QContactRelationshipFetchRequest@QtMobility@@UAEPAXPBD@Z @ 1150 NONAME ; void * QtMobility::QContactRelationshipFetchRequest::qt_metacast(char const *) + ?managerName@QContactManager@QtMobility@@QBE?AVQString@@XZ @ 1151 NONAME ; class QString QtMobility::QContactManager::managerName(void) const + ?SubTypeInternational@QContactAddress@QtMobility@@2U?$QLatin1Constant@$0O@@2@B @ 1152 NONAME ; struct QtMobility::QLatin1Constant<14> const QtMobility::QContactAddress::SubTypeInternational + ??4QContactSyncTarget@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1153 NONAME ; class QtMobility::QContactSyncTarget & QtMobility::QContactSyncTarget::operator=(class QtMobility::QContactDetail const &) + ?qt_metacall@QContactSaveRequest@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1154 NONAME ; int QtMobility::QContactSaveRequest::qt_metacall(enum QMetaObject::Call, int, void * *) + ?label@QContactDisplayLabel@QtMobility@@QBE?AVQString@@XZ @ 1155 NONAME ; class QString QtMobility::QContactDisplayLabel::label(void) const + ?ids@QContactLocalIdFetchRequest@QtMobility@@QBE?AV?$QList@I@@XZ @ 1156 NONAME ; class QList QtMobility::QContactLocalIdFetchRequest::ids(void) const + ??_EQContactPhoneNumber@QtMobility@@UAE@I@Z @ 1157 NONAME ; QtMobility::QContactPhoneNumber::~QContactPhoneNumber(unsigned int) + ?presence@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 1158 NONAME ; class QString QtMobility::QContactOnlineAccount::presence(void) const + ?nickname@QContactOnlineAccount@QtMobility@@QBE?AVQString@@XZ @ 1159 NONAME ; class QString QtMobility::QContactOnlineAccount::nickname(void) const + ?dataChanged@QContactManager@QtMobility@@IAEXXZ @ 1160 NONAME ; void QtMobility::QContactManager::dataChanged(void) + ?contacts@QContactSaveRequest@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@XZ @ 1161 NONAME ; class QList QtMobility::QContactSaveRequest::contacts(void) const + ?updateDefinitionRemoveRequest@QContactManagerEngine@QtMobility@@SAXPAVQContactDetailDefinitionRemoveRequest@2@W4Error@QContactManager@2@ABV?$QMap@HW4Error@QContactManager@QtMobility@@@@W4State@QContactAbstractRequest@2@@Z @ 1162 NONAME ; void QtMobility::QContactManagerEngine::updateDefinitionRemoveRequest(class QtMobility::QContactDetailDefinitionRemoveRequest *, enum QtMobility::QContactManager::Error, class QMap const &, enum QtMobility::QContactAbstractRequest::State) + ??1QContactOnlineAccount@QtMobility@@UAE@XZ @ 1163 NONAME ; QtMobility::QContactOnlineAccount::~QContactOnlineAccount(void) + ?staticMetaObject@QContactDetailDefinitionFetchRequest@QtMobility@@2UQMetaObject@@B @ 1164 NONAME ; struct QMetaObject const QtMobility::QContactDetailDefinitionFetchRequest::staticMetaObject + ??4QContactAnniversary@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1165 NONAME ; class QtMobility::QContactAnniversary & QtMobility::QContactAnniversary::operator=(class QtMobility::QContactDetail const &) + ?clearChangedContacts@QContactChangeSet@QtMobility@@QAEXXZ @ 1166 NONAME ; void QtMobility::QContactChangeSet::clearChangedContacts(void) + ?stateChanged@QContactAbstractRequest@QtMobility@@IAEXW4State@12@@Z @ 1167 NONAME ; void QtMobility::QContactAbstractRequest::stateChanged(enum QtMobility::QContactAbstractRequest::State) + ??0QContactLocalIdFilter@QtMobility@@QAE@XZ @ 1168 NONAME ; QtMobility::QContactLocalIdFilter::QContactLocalIdFilter(void) + ?longitude@QContactGeoLocation@QtMobility@@QBENXZ @ 1169 NONAME ; double QtMobility::QContactGeoLocation::longitude(void) const + ?SubTypeVideoShare@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$0L@@2@B @ 1170 NONAME ; struct QtMobility::QLatin1Constant<11> const QtMobility::QContactOnlineAccount::SubTypeVideoShare + ?FieldPresence@QContactOnlineAccount@QtMobility@@2U?$QLatin1Constant@$08@2@B @ 1171 NONAME ; struct QtMobility::QLatin1Constant<9> const QtMobility::QContactOnlineAccount::FieldPresence + ?accuracy@QContactGeoLocation@QtMobility@@QBENXZ @ 1172 NONAME ; double QtMobility::QContactGeoLocation::accuracy(void) const + ??4QContactOrganization@QtMobility@@QAEAAV01@ABVQContactDetail@1@@Z @ 1173 NONAME ; class QtMobility::QContactOrganization & QtMobility::QContactOrganization::operator=(class QtMobility::QContactDetail const &) + ?matchFlags@QContactDetailRangeFilter@QtMobility@@QBE?AV?$QFlags@W4MatchFlag@QContactFilter@QtMobility@@@@XZ @ 1174 NONAME ; class QFlags QtMobility::QContactDetailRangeFilter::matchFlags(void) const + ??0QContactType@QtMobility@@QAE@XZ @ 1175 NONAME ; QtMobility::QContactType::QContactType(void) + ?setRelationshipType@QContactRelationship@QtMobility@@QAEXABVQString@@@Z @ 1176 NONAME ; void QtMobility::QContactRelationship::setRelationshipType(class QString const &) + ?insertChangedContacts@QContactChangeSet@QtMobility@@QAEXABV?$QList@I@@@Z @ 1177 NONAME ; void QtMobility::QContactChangeSet::insertChangedContacts(class QList const &) + ?children@QContactFamily@QtMobility@@QBE?AVQStringList@@XZ @ 1178 NONAME ; class QStringList QtMobility::QContactFamily::children(void) const + ?department@QContactOrganization@QtMobility@@QBE?AVQStringList@@XZ @ 1179 NONAME ; class QStringList QtMobility::QContactOrganization::department(void) const + ?DefinitionName@QContactAvatar@QtMobility@@2U?$QLatin1Constant@$06@2@B @ 1180 NONAME ; struct QtMobility::QLatin1Constant<7> const QtMobility::QContactAvatar::DefinitionName + ?d_func@QContactUnionFilter@QtMobility@@AAEPAVQContactUnionFilterPrivate@2@XZ @ 1181 NONAME ; class QtMobility::QContactUnionFilterPrivate * QtMobility::QContactUnionFilter::d_func(void) + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/s60installs/bwins/QtVersitu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/s60installs/bwins/QtVersitu.def Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,125 @@ +EXPORTS + ?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) + ?waitForFinished@QVersitWriter@QtMobility@@QAE_NH@Z @ 6 NONAME ; bool QtMobility::QVersitWriter::waitForFinished(int) + ?results@QVersitReader@QtMobility@@QBE?AV?$QList@VQVersitDocument@QtMobility@@@@XZ @ 7 NONAME ; class QList QtMobility::QVersitReader::results(void) const + ?cancel@QVersitReader@QtMobility@@QAEXXZ @ 8 NONAME ; void QtMobility::QVersitReader::cancel(void) + ?trUtf8@QVersitWriter@QtMobility@@SA?AVQString@@PBD0H@Z @ 9 NONAME ; class QString QtMobility::QVersitWriter::trUtf8(char const *, char const *, int) + ??8QVersitProperty@QtMobility@@QBE_NABV01@@Z @ 10 NONAME ; bool QtMobility::QVersitProperty::operator==(class QtMobility::QVersitProperty const &) const + ??1QVersitContactExporterDetailHandler@QtMobility@@UAE@XZ @ 11 NONAME ; QtMobility::QVersitContactExporterDetailHandler::~QVersitContactExporterDetailHandler(void) + ?metaObject@QVersitReader@QtMobility@@UBEPBUQMetaObject@@XZ @ 12 NONAME ; struct QMetaObject const * QtMobility::QVersitReader::metaObject(void) const + ?trUtf8@QVersitWriter@QtMobility@@SA?AVQString@@PBD0@Z @ 13 NONAME ; class QString QtMobility::QVersitWriter::trUtf8(char const *, char const *) + ??_EQVersitReader@QtMobility@@UAE@I@Z @ 14 NONAME ; QtMobility::QVersitReader::~QVersitReader(unsigned int) + ??0QVersitDocument@QtMobility@@QAE@XZ @ 15 NONAME ; QtMobility::QVersitDocument::QVersitDocument(void) + ?setDevice@QVersitReader@QtMobility@@QAEXPAVQIODevice@@@Z @ 16 NONAME ; void QtMobility::QVersitReader::setDevice(class QIODevice *) + ??1QVersitDocument@QtMobility@@QAE@XZ @ 17 NONAME ; QtMobility::QVersitDocument::~QVersitDocument(void) + ?tr@QVersitReader@QtMobility@@SA?AVQString@@PBD0@Z @ 18 NONAME ; class QString QtMobility::QVersitReader::tr(char const *, char const *) + ?getStaticMetaObject@QVersitReader@QtMobility@@SAABUQMetaObject@@XZ @ 19 NONAME ; struct QMetaObject const & QtMobility::QVersitReader::getStaticMetaObject(void) + ??4QVersitDocument@QtMobility@@QAEAAV01@ABV01@@Z @ 20 NONAME ; class QtMobility::QVersitDocument & QtMobility::QVersitDocument::operator=(class QtMobility::QVersitDocument const &) + ??6QtMobility@@YA?AVQDebug@@V1@ABVQVersitDocument@0@@Z @ 21 NONAME ; class QDebug QtMobility::operator<<(class QDebug, class QtMobility::QVersitDocument const &) + ?setParameters@QVersitProperty@QtMobility@@QAEXABV?$QMultiHash@VQString@@V1@@@@Z @ 22 NONAME ; void QtMobility::QVersitProperty::setParameters(class QMultiHash const &) + ??1QVersitContactImporter@QtMobility@@QAE@XZ @ 23 NONAME ; QtMobility::QVersitContactImporter::~QVersitContactImporter(void) + ?errors@QVersitContactImporter@QtMobility@@QBE?AV?$QMap@HW4Error@QVersitContactImporter@QtMobility@@@@XZ @ 24 NONAME ; class QMap QtMobility::QVersitContactImporter::errors(void) const + ?qt_metacast@QVersitWriter@QtMobility@@UAEPAXPBD@Z @ 25 NONAME ; void * QtMobility::QVersitWriter::qt_metacast(char const *) + ??_EQVersitContactImporterPropertyHandler@QtMobility@@UAE@I@Z @ 26 NONAME ; QtMobility::QVersitContactImporterPropertyHandler::~QVersitContactImporterPropertyHandler(unsigned int) + ?trUtf8@QVersitReader@QtMobility@@SA?AVQString@@PBD0H@Z @ 27 NONAME ; class QString QtMobility::QVersitReader::trUtf8(char const *, char const *, int) + ??0QVersitProperty@QtMobility@@QAE@XZ @ 28 NONAME ; QtMobility::QVersitProperty::QVersitProperty(void) + ?tr@QVersitWriter@QtMobility@@SA?AVQString@@PBD0H@Z @ 29 NONAME ; class QString QtMobility::QVersitWriter::tr(char const *, char const *, int) + ?addProperty@QVersitDocument@QtMobility@@QAEXABVQVersitProperty@2@@Z @ 30 NONAME ; void QtMobility::QVersitDocument::addProperty(class QtMobility::QVersitProperty const &) + ??1QVersitReader@QtMobility@@UAE@XZ @ 31 NONAME ; QtMobility::QVersitReader::~QVersitReader(void) + ??1QVersitProperty@QtMobility@@QAE@XZ @ 32 NONAME ; QtMobility::QVersitProperty::~QVersitProperty(void) + ??_EQVersitWriter@QtMobility@@UAE@I@Z @ 33 NONAME ; QtMobility::QVersitWriter::~QVersitWriter(unsigned int) + ?stateChanged@QVersitWriter@QtMobility@@IAEXW4State@12@@Z @ 34 NONAME ; void QtMobility::QVersitWriter::stateChanged(enum QtMobility::QVersitWriter::State) + ?staticMetaObject@QVersitWriter@QtMobility@@2UQMetaObject@@B @ 35 NONAME ; struct QMetaObject const QtMobility::QVersitWriter::staticMetaObject + ?setValue@QVersitProperty@QtMobility@@QAEXABVQVariant@@@Z @ 36 NONAME ; void QtMobility::QVersitProperty::setValue(class QVariant const &) + ?removeParameters@QVersitProperty@QtMobility@@QAEXABVQString@@@Z @ 37 NONAME ; void QtMobility::QVersitProperty::removeParameters(class QString const &) + ?properties@QVersitDocument@QtMobility@@QBE?AV?$QList@VQVersitProperty@QtMobility@@@@XZ @ 38 NONAME ; class QList QtMobility::QVersitDocument::properties(void) const + ?qHash@QtMobility@@YAIABVQVersitProperty@1@@Z @ 39 NONAME ; unsigned int QtMobility::qHash(class QtMobility::QVersitProperty const &) + ?setDevice@QVersitWriter@QtMobility@@QAEXPAVQIODevice@@@Z @ 40 NONAME ; void QtMobility::QVersitWriter::setDevice(class QIODevice *) + ?device@QVersitReader@QtMobility@@QBEPAVQIODevice@@XZ @ 41 NONAME ; class QIODevice * QtMobility::QVersitReader::device(void) const + ??1QVersitResourceHandler@QtMobility@@UAE@XZ @ 42 NONAME ; QtMobility::QVersitResourceHandler::~QVersitResourceHandler(void) + ??0QVersitProperty@QtMobility@@QAE@ABV01@@Z @ 43 NONAME ; QtMobility::QVersitProperty::QVersitProperty(class QtMobility::QVersitProperty const &) + ??1QVersitContactExporter@QtMobility@@QAE@XZ @ 44 NONAME ; QtMobility::QVersitContactExporter::~QVersitContactExporter(void) + ?variantValue@QVersitProperty@QtMobility@@QBE?AVQVariant@@XZ @ 45 NONAME ; class QVariant QtMobility::QVersitProperty::variantValue(void) const + ?tr@QVersitWriter@QtMobility@@SA?AVQString@@PBD0@Z @ 46 NONAME ; class QString QtMobility::QVersitWriter::tr(char const *, char const *) + ?removeProperty@QVersitDocument@QtMobility@@QAEXABVQVersitProperty@2@@Z @ 47 NONAME ; void QtMobility::QVersitDocument::removeProperty(class QtMobility::QVersitProperty const &) + ?getStaticMetaObject@QVersitWriter@QtMobility@@SAABUQMetaObject@@XZ @ 48 NONAME ; struct QMetaObject const & QtMobility::QVersitWriter::getStaticMetaObject(void) + ?saveResource@QVersitDefaultResourceHandler@QtMobility@@UAE_NABVQByteArray@@ABVQVersitProperty@2@PAVQString@@@Z @ 49 NONAME ; bool QtMobility::QVersitDefaultResourceHandler::saveResource(class QByteArray const &, class QtMobility::QVersitProperty const &, class QString *) + ?error@QVersitReader@QtMobility@@QBE?AW4Error@12@XZ @ 50 NONAME ; enum QtMobility::QVersitReader::Error QtMobility::QVersitReader::error(void) const + ?propertyHandler@QVersitContactImporter@QtMobility@@QBEPAVQVersitContactImporterPropertyHandler@2@XZ @ 51 NONAME ; class QtMobility::QVersitContactImporterPropertyHandler * QtMobility::QVersitContactImporter::propertyHandler(void) const + ??0QVersitReader@QtMobility@@QAE@PAVQIODevice@@@Z @ 52 NONAME ; QtMobility::QVersitReader::QVersitReader(class QIODevice *) + ?staticMetaObject@QVersitReader@QtMobility@@2UQMetaObject@@B @ 53 NONAME ; struct QMetaObject const QtMobility::QVersitReader::staticMetaObject + ??0QVersitDefaultResourceHandler@QtMobility@@QAE@XZ @ 54 NONAME ; QtMobility::QVersitDefaultResourceHandler::QVersitDefaultResourceHandler(void) + ??0QVersitWriter@QtMobility@@QAE@XZ @ 55 NONAME ; QtMobility::QVersitWriter::QVersitWriter(void) + ?setData@QVersitReader@QtMobility@@QAEXABVQByteArray@@@Z @ 56 NONAME ; void QtMobility::QVersitReader::setData(class QByteArray const &) + ??0QVersitWriter@QtMobility@@QAE@PAVQByteArray@@@Z @ 57 NONAME ; QtMobility::QVersitWriter::QVersitWriter(class QByteArray *) + ??9QVersitDocument@QtMobility@@QBE_NABV01@@Z @ 58 NONAME ; bool QtMobility::QVersitDocument::operator!=(class QtMobility::QVersitDocument const &) const + ?documents@QVersitContactExporter@QtMobility@@QBE?AV?$QList@VQVersitDocument@QtMobility@@@@XZ @ 59 NONAME ; class QList QtMobility::QVersitContactExporter::documents(void) const + ?exportContacts@QVersitContactExporter@QtMobility@@QAE?AV?$QList@VQVersitDocument@QtMobility@@@@ABV?$QList@VQContact@QtMobility@@@@@Z @ 60 NONAME ; class QList QtMobility::QVersitContactExporter::exportContacts(class QList const &) + ?type@QVersitDocument@QtMobility@@QBE?AW4VersitType@12@XZ @ 61 NONAME ; enum QtMobility::QVersitDocument::VersitType QtMobility::QVersitDocument::type(void) const + ?device@QVersitWriter@QtMobility@@QBEPAVQIODevice@@XZ @ 62 NONAME ; class QIODevice * QtMobility::QVersitWriter::device(void) const + ?tr@QVersitReader@QtMobility@@SA?AVQString@@PBD0H@Z @ 63 NONAME ; class QString QtMobility::QVersitReader::tr(char const *, char const *, int) + ?state@QVersitWriter@QtMobility@@QBE?AW4State@12@XZ @ 64 NONAME ; enum QtMobility::QVersitWriter::State QtMobility::QVersitWriter::state(void) const + ?resourceHandler@QVersitContactImporter@QtMobility@@QBEPAVQVersitResourceHandler@2@XZ @ 65 NONAME ; class QtMobility::QVersitResourceHandler * QtMobility::QVersitContactImporter::resourceHandler(void) const + ?contacts@QVersitContactImporter@QtMobility@@QBE?AV?$QList@VQContact@QtMobility@@@@XZ @ 66 NONAME ; class QList QtMobility::QVersitContactImporter::contacts(void) const + ??0QVersitDocument@QtMobility@@QAE@W4VersitType@01@@Z @ 67 NONAME ; QtMobility::QVersitDocument::QVersitDocument(enum QtMobility::QVersitDocument::VersitType) + ?isEmpty@QVersitProperty@QtMobility@@QBE_NXZ @ 68 NONAME ; bool QtMobility::QVersitProperty::isEmpty(void) const + ?defaultCodec@QVersitReader@QtMobility@@QBEPAVQTextCodec@@XZ @ 69 NONAME ; class QTextCodec * QtMobility::QVersitReader::defaultCodec(void) const + ??4QVersitProperty@QtMobility@@QAEAAV01@ABV01@@Z @ 70 NONAME ; class QtMobility::QVersitProperty & QtMobility::QVersitProperty::operator=(class QtMobility::QVersitProperty const &) + ?name@QVersitProperty@QtMobility@@QBE?AVQString@@XZ @ 71 NONAME ; class QString QtMobility::QVersitProperty::name(void) const + ?qt_metacall@QVersitReader@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 72 NONAME ; int QtMobility::QVersitReader::qt_metacall(enum QMetaObject::Call, int, void * *) + ?startReading@QVersitReader@QtMobility@@QAE_NXZ @ 73 NONAME ; bool QtMobility::QVersitReader::startReading(void) + ??0QVersitWriter@QtMobility@@QAE@PAVQIODevice@@@Z @ 74 NONAME ; QtMobility::QVersitWriter::QVersitWriter(class QIODevice *) + ?clear@QVersitDocument@QtMobility@@QAEXXZ @ 75 NONAME ; void QtMobility::QVersitDocument::clear(void) + ?detailHandler@QVersitContactExporter@QtMobility@@QBEPAVQVersitContactExporterDetailHandler@2@XZ @ 76 NONAME ; class QtMobility::QVersitContactExporterDetailHandler * QtMobility::QVersitContactExporter::detailHandler(void) const + ?isEmpty@QVersitDocument@QtMobility@@QBE_NXZ @ 77 NONAME ; bool QtMobility::QVersitDocument::isEmpty(void) const + ??9QVersitProperty@QtMobility@@QBE_NABV01@@Z @ 78 NONAME ; bool QtMobility::QVersitProperty::operator!=(class QtMobility::QVersitProperty const &) const + ?cancel@QVersitWriter@QtMobility@@QAEXXZ @ 79 NONAME ; void QtMobility::QVersitWriter::cancel(void) + ?setDefaultCodec@QVersitWriter@QtMobility@@QAEXPAVQTextCodec@@@Z @ 80 NONAME ; void QtMobility::QVersitWriter::setDefaultCodec(class QTextCodec *) + ?resultsAvailable@QVersitReader@QtMobility@@IAEXXZ @ 81 NONAME ; void QtMobility::QVersitReader::resultsAvailable(void) + ??0QVersitContactImporter@QtMobility@@QAE@XZ @ 82 NONAME ; QtMobility::QVersitContactImporter::QVersitContactImporter(void) + ?importDocuments@QVersitContactImporter@QtMobility@@QAE_NABV?$QList@VQVersitDocument@QtMobility@@@@@Z @ 83 NONAME ; bool QtMobility::QVersitContactImporter::importDocuments(class QList const &) + ??_EQVersitDefaultResourceHandler@QtMobility@@UAE@I@Z @ 84 NONAME ; QtMobility::QVersitDefaultResourceHandler::~QVersitDefaultResourceHandler(unsigned int) + ?removeProperties@QVersitDocument@QtMobility@@QAEXABVQString@@@Z @ 85 NONAME ; void QtMobility::QVersitDocument::removeProperties(class QString const &) + ??6QtMobility@@YA?AVQDebug@@V1@ABVQVersitProperty@0@@Z @ 86 NONAME ; class QDebug QtMobility::operator<<(class QDebug, class QtMobility::QVersitProperty const &) + ?removeParameter@QVersitProperty@QtMobility@@QAEXABVQString@@0@Z @ 87 NONAME ; void QtMobility::QVersitProperty::removeParameter(class QString const &, class QString const &) + ?loadResource@QVersitDefaultResourceHandler@QtMobility@@UAE_NABVQString@@PAVQByteArray@@PAV3@@Z @ 88 NONAME ; bool QtMobility::QVersitDefaultResourceHandler::loadResource(class QString const &, class QByteArray *, class QString *) + ?setName@QVersitProperty@QtMobility@@QAEXABVQString@@@Z @ 89 NONAME ; void QtMobility::QVersitProperty::setName(class QString 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 *) + ?qt_metacast@QVersitReader@QtMobility@@UAEPAXPBD@Z @ 92 NONAME ; void * QtMobility::QVersitReader::qt_metacast(char const *) + ??1QVersitContactImporterPropertyHandler@QtMobility@@UAE@XZ @ 93 NONAME ; QtMobility::QVersitContactImporterPropertyHandler::~QVersitContactImporterPropertyHandler(void) + ?waitForFinished@QVersitReader@QtMobility@@QAE_NH@Z @ 94 NONAME ; bool QtMobility::QVersitReader::waitForFinished(int) + ?qt_metacall@QVersitWriter@QtMobility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 95 NONAME ; int QtMobility::QVersitWriter::qt_metacall(enum QMetaObject::Call, int, void * *) + ?clear@QVersitProperty@QtMobility@@QAEXXZ @ 96 NONAME ; void QtMobility::QVersitProperty::clear(void) + ?exportContacts@QVersitContactExporter@QtMobility@@QAE_NABV?$QList@VQContact@QtMobility@@@@W4VersitType@QVersitDocument@2@@Z @ 97 NONAME ; bool QtMobility::QVersitContactExporter::exportContacts(class QList const &, enum QtMobility::QVersitDocument::VersitType) + ?value@QVersitProperty@QtMobility@@QBE?AVQString@@XZ @ 98 NONAME ; class QString QtMobility::QVersitProperty::value(void) const + ?parameters@QVersitProperty@QtMobility@@QBE?AV?$QMultiHash@VQString@@V1@@@XZ @ 99 NONAME ; class QMultiHash QtMobility::QVersitProperty::parameters(void) const + ??0QVersitReader@QtMobility@@QAE@ABVQByteArray@@@Z @ 100 NONAME ; QtMobility::QVersitReader::QVersitReader(class QByteArray 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 + ?setPropertyHandler@QVersitContactImporter@QtMobility@@QAEXPAVQVersitContactImporterPropertyHandler@2@@Z @ 103 NONAME ; void QtMobility::QVersitContactImporter::setPropertyHandler(class QtMobility::QVersitContactImporterPropertyHandler *) + ?setResourceHandler@QVersitContactImporter@QtMobility@@QAEXPAVQVersitResourceHandler@2@@Z @ 104 NONAME ; void QtMobility::QVersitContactImporter::setResourceHandler(class QtMobility::QVersitResourceHandler *) + ??0QVersitReader@QtMobility@@QAE@XZ @ 105 NONAME ; QtMobility::QVersitReader::QVersitReader(void) + ?stateChanged@QVersitReader@QtMobility@@IAEXW4State@12@@Z @ 106 NONAME ; void QtMobility::QVersitReader::stateChanged(enum QtMobility::QVersitReader::State) + ?setValueType@QVersitProperty@QtMobility@@QAEXW4ValueType@12@@Z @ 107 NONAME ; void QtMobility::QVersitProperty::setValueType(enum QtMobility::QVersitProperty::ValueType) + ?resourceHandler@QVersitContactExporter@QtMobility@@QBEPAVQVersitResourceHandler@2@XZ @ 108 NONAME ; class QtMobility::QVersitResourceHandler * QtMobility::QVersitContactExporter::resourceHandler(void) const + ?setDefaultCodec@QVersitReader@QtMobility@@QAEXPAVQTextCodec@@@Z @ 109 NONAME ; void QtMobility::QVersitReader::setDefaultCodec(class QTextCodec *) + ??8QVersitDocument@QtMobility@@QBE_NABV01@@Z @ 110 NONAME ; bool QtMobility::QVersitDocument::operator==(class QtMobility::QVersitDocument const &) const + ?startWriting@QVersitWriter@QtMobility@@QAE_NABV?$QList@VQVersitDocument@QtMobility@@@@@Z @ 111 NONAME ; bool QtMobility::QVersitWriter::startWriting(class QList const &) + ?qHash@QtMobility@@YAIABVQVersitDocument@1@@Z @ 112 NONAME ; unsigned int QtMobility::qHash(class QtMobility::QVersitDocument const &) + ??1QVersitWriter@QtMobility@@UAE@XZ @ 113 NONAME ; QtMobility::QVersitWriter::~QVersitWriter(void) + ?setGroups@QVersitProperty@QtMobility@@QAEXABVQStringList@@@Z @ 114 NONAME ; void QtMobility::QVersitProperty::setGroups(class QStringList const &) + ?metaObject@QVersitWriter@QtMobility@@UBEPBUQMetaObject@@XZ @ 115 NONAME ; struct QMetaObject const * QtMobility::QVersitWriter::metaObject(void) const + ?trUtf8@QVersitReader@QtMobility@@SA?AVQString@@PBD0@Z @ 116 NONAME ; class QString QtMobility::QVersitReader::trUtf8(char const *, char const *) + ?valueType@QVersitProperty@QtMobility@@QBE?AW4ValueType@12@XZ @ 117 NONAME ; enum QtMobility::QVersitProperty::ValueType QtMobility::QVersitProperty::valueType(void) const + ?errors@QVersitContactExporter@QtMobility@@QBE?AV?$QMap@HW4Error@QVersitContactExporter@QtMobility@@@@XZ @ 118 NONAME ; class QMap QtMobility::QVersitContactExporter::errors(void) const + ?groups@QVersitProperty@QtMobility@@QBE?AVQStringList@@XZ @ 119 NONAME ; class QStringList QtMobility::QVersitProperty::groups(void) const + ??_EQVersitResourceHandler@QtMobility@@UAE@I@Z @ 120 NONAME ; QtMobility::QVersitResourceHandler::~QVersitResourceHandler(unsigned int) + ?state@QVersitReader@QtMobility@@QBE?AW4State@12@XZ @ 121 NONAME ; enum QtMobility::QVersitReader::State QtMobility::QVersitReader::state(void) const + ??_EQVersitContactExporterDetailHandler@QtMobility@@UAE@I@Z @ 122 NONAME ; QtMobility::QVersitContactExporterDetailHandler::~QVersitContactExporterDetailHandler(unsigned int) + ?importContacts@QVersitContactImporter@QtMobility@@QAE?AV?$QList@VQContact@QtMobility@@@@ABV?$QList@VQVersitDocument@QtMobility@@@@@Z @ 123 NONAME ; class QList QtMobility::QVersitContactImporter::importContacts(class QList const &) + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/s60installs/eabi/QtContactsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/s60installs/eabi/QtContactsu.def Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,922 @@ +EXPORTS + _ZN10QtMobility10QContactId10setLocalIdERKj @ 1 NONAME + _ZN10QtMobility10QContactId13setManagerUriERK7QString @ 2 NONAME + _ZN10QtMobility10QContactIdC1ERKS0_ @ 3 NONAME + _ZN10QtMobility10QContactIdC1Ev @ 4 NONAME + _ZN10QtMobility10QContactIdC2ERKS0_ @ 5 NONAME + _ZN10QtMobility10QContactIdC2Ev @ 6 NONAME + _ZN10QtMobility10QContactIdD1Ev @ 7 NONAME + _ZN10QtMobility10QContactIdD2Ev @ 8 NONAME + _ZN10QtMobility10QContactIdaSERKS0_ @ 9 NONAME + _ZN10QtMobility11QContactTag14DefinitionNameE @ 10 NONAME DATA 4 + _ZN10QtMobility11QContactTag8FieldTagE @ 11 NONAME DATA 4 + _ZN10QtMobility11QContactUrl12FieldSubTypeE @ 12 NONAME DATA 8 + _ZN10QtMobility11QContactUrl14DefinitionNameE @ 13 NONAME DATA 4 + _ZN10QtMobility11QContactUrl15SubTypeHomePageE @ 14 NONAME DATA 9 + _ZN10QtMobility11QContactUrl16SubTypeFavouriteE @ 15 NONAME DATA 10 + _ZN10QtMobility11QContactUrl8FieldUrlE @ 16 NONAME DATA 4 + _ZN10QtMobility12QContactGuid14DefinitionNameE @ 17 NONAME DATA 5 + _ZN10QtMobility12QContactGuid9FieldGuidE @ 18 NONAME DATA 5 + _ZN10QtMobility12QContactName10FieldFirstE @ 19 NONAME DATA 10 + _ZN10QtMobility12QContactName11FieldMiddleE @ 20 NONAME DATA 11 + _ZN10QtMobility12QContactName11FieldPrefixE @ 21 NONAME DATA 7 + _ZN10QtMobility12QContactName11FieldSuffixE @ 22 NONAME DATA 7 + _ZN10QtMobility12QContactName13FieldLastNameE @ 23 NONAME DATA 9 + _ZN10QtMobility12QContactName14DefinitionNameE @ 24 NONAME DATA 5 + _ZN10QtMobility12QContactName14FieldFirstNameE @ 25 NONAME DATA 10 + _ZN10QtMobility12QContactName15FieldMiddleNameE @ 26 NONAME DATA 11 + _ZN10QtMobility12QContactName16FieldCustomLabelE @ 27 NONAME DATA 12 + _ZN10QtMobility12QContactName5matchERK7QString @ 28 NONAME + _ZN10QtMobility12QContactName5matchERK7QStringS3_ @ 29 NONAME + _ZN10QtMobility12QContactName9FieldLastE @ 30 NONAME DATA 9 + _ZN10QtMobility12QContactNote14DefinitionNameE @ 31 NONAME DATA 5 + _ZN10QtMobility12QContactNote9FieldNoteE @ 32 NONAME DATA 5 + _ZN10QtMobility12QContactType11TypeContactE @ 33 NONAME DATA 8 + _ZN10QtMobility12QContactType14DefinitionNameE @ 34 NONAME DATA 5 + _ZN10QtMobility12QContactType9FieldTypeE @ 35 NONAME DATA 5 + _ZN10QtMobility12QContactType9TypeGroupE @ 36 NONAME DATA 6 + _ZN10QtMobility14QContactAction11qt_metacallEN11QMetaObject4CallEiPPv @ 37 NONAME + _ZN10QtMobility14QContactAction11qt_metacastEPKc @ 38 NONAME + _ZN10QtMobility14QContactAction12stateChangedENS0_5StateE @ 39 NONAME + _ZN10QtMobility14QContactAction16availableActionsERK7QStringi @ 40 NONAME + _ZN10QtMobility14QContactAction16resultsAvailableEv @ 41 NONAME + _ZN10QtMobility14QContactAction16staticMetaObjectE @ 42 NONAME DATA 16 + _ZN10QtMobility14QContactAction17actionDescriptorsERK7QStringS3_i @ 43 NONAME + _ZN10QtMobility14QContactAction19getStaticMetaObjectEv @ 44 NONAME + _ZN10QtMobility14QContactAction6actionERKNS_24QContactActionDescriptorE @ 45 NONAME + _ZN10QtMobility14QContactActionD0Ev @ 46 NONAME + _ZN10QtMobility14QContactActionD1Ev @ 47 NONAME + _ZN10QtMobility14QContactActionD2Ev @ 48 NONAME + _ZN10QtMobility14QContactAvatar10setSubTypeERK7QString @ 49 NONAME + _ZN10QtMobility14QContactAvatar11FieldAvatarE @ 50 NONAME DATA 7 + _ZN10QtMobility14QContactAvatar12FieldSubTypeE @ 51 NONAME DATA 8 + _ZN10QtMobility14QContactAvatar12SubTypeImageE @ 52 NONAME DATA 6 + _ZN10QtMobility14QContactAvatar12SubTypeVideoE @ 53 NONAME DATA 6 + _ZN10QtMobility14QContactAvatar13FieldImageUrlE @ 54 NONAME DATA 9 + _ZN10QtMobility14QContactAvatar13FieldVideoUrlE @ 55 NONAME DATA 9 + _ZN10QtMobility14QContactAvatar14DefinitionNameE @ 56 NONAME DATA 7 + _ZN10QtMobility14QContactAvatar17FieldAvatarPixmapE @ 57 NONAME DATA 13 + _ZN10QtMobility14QContactAvatar19SubTypeTexturedMeshE @ 58 NONAME DATA 13 + _ZN10QtMobility14QContactAvatar20SubTypeAudioRingtoneE @ 59 NONAME DATA 14 + _ZN10QtMobility14QContactAvatar20SubTypeVideoRingtoneE @ 60 NONAME DATA 14 + _ZN10QtMobility14QContactAvatar9setAvatarERK7QString @ 61 NONAME + _ZN10QtMobility14QContactAvatar9setPixmapERK7QPixmap @ 62 NONAME + _ZN10QtMobility14QContactDetail11ContextHomeE @ 63 NONAME DATA 5 + _ZN10QtMobility14QContactDetail11ContextWorkE @ 64 NONAME DATA 5 + _ZN10QtMobility14QContactDetail11removeValueERK7QString @ 65 NONAME + _ZN10QtMobility14QContactDetail12ContextOtherE @ 66 NONAME DATA 6 + _ZN10QtMobility14QContactDetail12FieldContextE @ 67 NONAME DATA 8 + _ZN10QtMobility14QContactDetail14FieldDetailUriE @ 68 NONAME DATA 10 + _ZN10QtMobility14QContactDetail19setPreferredActionsERK5QListINS_24QContactActionDescriptorEE @ 69 NONAME + _ZN10QtMobility14QContactDetail21FieldLinkedDetailUrisE @ 70 NONAME DATA 17 + _ZN10QtMobility14QContactDetail6assignERKS0_RK7QString @ 71 NONAME + _ZN10QtMobility14QContactDetail8resetKeyEv @ 72 NONAME + _ZN10QtMobility14QContactDetail8setValueERK7QStringRK8QVariant @ 73 NONAME + _ZN10QtMobility14QContactDetailC1ERK7QString @ 74 NONAME + _ZN10QtMobility14QContactDetailC1ERKS0_ @ 75 NONAME + _ZN10QtMobility14QContactDetailC1ERKS0_RK7QString @ 76 NONAME + _ZN10QtMobility14QContactDetailC1Ev @ 77 NONAME + _ZN10QtMobility14QContactDetailC2ERK7QString @ 78 NONAME + _ZN10QtMobility14QContactDetailC2ERKS0_ @ 79 NONAME + _ZN10QtMobility14QContactDetailC2ERKS0_RK7QString @ 80 NONAME + _ZN10QtMobility14QContactDetailC2Ev @ 81 NONAME + _ZN10QtMobility14QContactDetailD0Ev @ 82 NONAME + _ZN10QtMobility14QContactDetailD1Ev @ 83 NONAME + _ZN10QtMobility14QContactDetailD2Ev @ 84 NONAME + _ZN10QtMobility14QContactDetailaSERKS0_ @ 85 NONAME + _ZN10QtMobility14QContactFamily11FieldSpouseE @ 86 NONAME DATA 7 + _ZN10QtMobility14QContactFamily13FieldChildrenE @ 87 NONAME DATA 9 + _ZN10QtMobility14QContactFamily14DefinitionNameE @ 88 NONAME DATA 7 + _ZN10QtMobility14QContactFilterC1EPNS_21QContactFilterPrivateE @ 89 NONAME + _ZN10QtMobility14QContactFilterC1ERKS0_ @ 90 NONAME + _ZN10QtMobility14QContactFilterC1Ev @ 91 NONAME + _ZN10QtMobility14QContactFilterC2EPNS_21QContactFilterPrivateE @ 92 NONAME + _ZN10QtMobility14QContactFilterC2ERKS0_ @ 93 NONAME + _ZN10QtMobility14QContactFilterC2Ev @ 94 NONAME + _ZN10QtMobility14QContactFilterD0Ev @ 95 NONAME + _ZN10QtMobility14QContactFilterD1Ev @ 96 NONAME + _ZN10QtMobility14QContactFilterD2Ev @ 97 NONAME + _ZN10QtMobility14QContactFilteraSERKS0_ @ 98 NONAME + _ZN10QtMobility14QContactGender10GenderMaleE @ 99 NONAME DATA 5 + _ZN10QtMobility14QContactGender11FieldGenderE @ 100 NONAME DATA 7 + _ZN10QtMobility14QContactGender12GenderFemaleE @ 101 NONAME DATA 7 + _ZN10QtMobility14QContactGender14DefinitionNameE @ 102 NONAME DATA 7 + _ZN10QtMobility14QContactGender17GenderUnspecifiedE @ 103 NONAME DATA 12 + _ZN10QtMobility15QContactAddress11FieldRegionE @ 104 NONAME DATA 7 + _ZN10QtMobility15QContactAddress11FieldStreetE @ 105 NONAME DATA 7 + _ZN10QtMobility15QContactAddress12FieldCountryE @ 106 NONAME DATA 8 + _ZN10QtMobility15QContactAddress13FieldLocalityE @ 107 NONAME DATA 9 + _ZN10QtMobility15QContactAddress13FieldPostcodeE @ 108 NONAME DATA 9 + _ZN10QtMobility15QContactAddress13FieldSubTypesE @ 109 NONAME DATA 9 + _ZN10QtMobility15QContactAddress13SubTypeParcelE @ 110 NONAME DATA 7 + _ZN10QtMobility15QContactAddress13SubTypePostalE @ 111 NONAME DATA 7 + _ZN10QtMobility15QContactAddress14DefinitionNameE @ 112 NONAME DATA 8 + _ZN10QtMobility15QContactAddress15SubTypeDomesticE @ 113 NONAME DATA 9 + _ZN10QtMobility15QContactAddress18FieldPostOfficeBoxE @ 114 NONAME DATA 14 + _ZN10QtMobility15QContactAddress20SubTypeInternationalE @ 115 NONAME DATA 14 + _ZN10QtMobility15QContactManager11dataChangedEv @ 116 NONAME + _ZN10QtMobility15QContactManager11qt_metacallEN11QMetaObject4CallEiPPv @ 117 NONAME + _ZN10QtMobility15QContactManager11qt_metacastEPKc @ 118 NONAME + _ZN10QtMobility15QContactManager11saveContactEPNS_8QContactE @ 119 NONAME + _ZN10QtMobility15QContactManager12createEngineERK7QStringRK4QMapIS1_S1_E @ 120 NONAME + _ZN10QtMobility15QContactManager12saveContactsEP5QListINS_8QContactEE @ 121 NONAME + _ZN10QtMobility15QContactManager12saveContactsEP5QListINS_8QContactEEP4QMapIiNS0_5ErrorEE @ 122 NONAME + _ZN10QtMobility15QContactManager13contactsAddedERK5QListIjE @ 123 NONAME + _ZN10QtMobility15QContactManager13removeContactERKj @ 124 NONAME + _ZN10QtMobility15QContactManager14removeContactsEP5QListIjE @ 125 NONAME + _ZN10QtMobility15QContactManager14removeContactsEP5QListIjEP4QMapIiNS0_5ErrorEE @ 126 NONAME + _ZN10QtMobility15QContactManager14removeContactsERK5QListIjEP4QMapIiNS0_5ErrorEE @ 127 NONAME + _ZN10QtMobility15QContactManager15contactsChangedERK5QListIjE @ 128 NONAME + _ZN10QtMobility15QContactManager15contactsRemovedERK5QListIjE @ 129 NONAME + _ZN10QtMobility15QContactManager16saveRelationshipEPNS_20QContactRelationshipE @ 130 NONAME + _ZN10QtMobility15QContactManager16setSelfContactIdERKj @ 131 NONAME + _ZN10QtMobility15QContactManager16staticMetaObjectE @ 132 NONAME DATA 16 + _ZN10QtMobility15QContactManager17availableManagersEv @ 133 NONAME + _ZN10QtMobility15QContactManager17compatibleContactERKNS_8QContactE @ 134 NONAME + _ZN10QtMobility15QContactManager17saveRelationshipsEP5QListINS_20QContactRelationshipEE @ 135 NONAME + _ZN10QtMobility15QContactManager17saveRelationshipsEP5QListINS_20QContactRelationshipEEP4QMapIiNS0_5ErrorEE @ 136 NONAME + _ZN10QtMobility15QContactManager18relationshipsAddedERK5QListIjE @ 137 NONAME + _ZN10QtMobility15QContactManager18removeRelationshipERKNS_20QContactRelationshipE @ 138 NONAME + _ZN10QtMobility15QContactManager19getStaticMetaObjectEv @ 139 NONAME + _ZN10QtMobility15QContactManager19removeRelationshipsERK5QListINS_20QContactRelationshipEE @ 140 NONAME + _ZN10QtMobility15QContactManager19removeRelationshipsERK5QListINS_20QContactRelationshipEEP4QMapIiNS0_5ErrorEE @ 141 NONAME + _ZN10QtMobility15QContactManager20relationshipsRemovedERK5QListIjE @ 142 NONAME + _ZN10QtMobility15QContactManager20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QString @ 143 NONAME + _ZN10QtMobility15QContactManager20selfContactIdChangedERKjS2_ @ 144 NONAME + _ZN10QtMobility15QContactManager22removeDetailDefinitionERK7QStringS3_ @ 145 NONAME + _ZN10QtMobility15QContactManager7fromUriERK7QStringP7QObject @ 146 NONAME + _ZN10QtMobility15QContactManager8buildUriERK7QStringRK4QMapIS1_S1_Ei @ 147 NONAME + _ZN10QtMobility15QContactManager8parseUriERK7QStringPS1_P4QMapIS1_S1_E @ 148 NONAME + _ZN10QtMobility15QContactManagerC1EP7QObject @ 149 NONAME + _ZN10QtMobility15QContactManagerC1ERK7QStringRK4QMapIS1_S1_EP7QObject @ 150 NONAME + _ZN10QtMobility15QContactManagerC1ERK7QStringiRK4QMapIS1_S1_EP7QObject @ 151 NONAME + _ZN10QtMobility15QContactManagerC2EP7QObject @ 152 NONAME + _ZN10QtMobility15QContactManagerC2ERK7QStringRK4QMapIS1_S1_EP7QObject @ 153 NONAME + _ZN10QtMobility15QContactManagerC2ERK7QStringiRK4QMapIS1_S1_EP7QObject @ 154 NONAME + _ZN10QtMobility15QContactManagerD0Ev @ 155 NONAME + _ZN10QtMobility15QContactManagerD1Ev @ 156 NONAME + _ZN10QtMobility15QContactManagerD2Ev @ 157 NONAME + _ZN10QtMobility16QContactBirthday13FieldBirthdayE @ 158 NONAME DATA 9 + _ZN10QtMobility16QContactBirthday14DefinitionNameE @ 159 NONAME DATA 9 + _ZN10QtMobility16QContactNickname13FieldNicknameE @ 160 NONAME DATA 9 + _ZN10QtMobility16QContactNickname14DefinitionNameE @ 161 NONAME DATA 9 + _ZN10QtMobility16QContactPresence13FieldNicknameE @ 162 NONAME DATA 9 + _ZN10QtMobility16QContactPresence14DefinitionNameE @ 163 NONAME DATA 9 + _ZN10QtMobility16QContactPresence14FieldTimestampE @ 164 NONAME DATA 10 + _ZN10QtMobility16QContactPresence18FieldCustomMessageE @ 165 NONAME DATA 14 + _ZN10QtMobility16QContactPresence18FieldPresenceStateE @ 166 NONAME DATA 14 + _ZN10QtMobility16QContactPresence22FieldPresenceStateTextE @ 167 NONAME DATA 18 + _ZN10QtMobility16QContactPresence26FieldPresenceStateImageUrlE @ 168 NONAME DATA 22 + _ZN10QtMobility16QContactRingtone14DefinitionNameE @ 169 NONAME DATA 9 + _ZN10QtMobility16QContactRingtone21FieldAudioRingtoneUrlE @ 170 NONAME DATA 17 + _ZN10QtMobility16QContactRingtone21FieldVideoRingtoneUrlE @ 171 NONAME DATA 17 + _ZN10QtMobility16QContactRingtone25FieldVibrationRingtoneUrlE @ 172 NONAME DATA 21 + _ZN10QtMobility17QContactChangeSet11dataChangedEv @ 173 NONAME + _ZN10QtMobility17QContactChangeSet11emitSignalsEPNS_21QContactManagerEngineE @ 174 NONAME + _ZN10QtMobility17QContactChangeSet13addedContactsEv @ 175 NONAME + _ZN10QtMobility17QContactChangeSet14setDataChangedEb @ 176 NONAME + _ZN10QtMobility17QContactChangeSet15changedContactsEv @ 177 NONAME + _ZN10QtMobility17QContactChangeSet15removedContactsEv @ 178 NONAME + _ZN10QtMobility17QContactChangeSet18clearAddedContactsEv @ 179 NONAME + _ZN10QtMobility17QContactChangeSet18insertAddedContactEj @ 180 NONAME + _ZN10QtMobility17QContactChangeSet19insertAddedContactsERK5QListIjE @ 181 NONAME + _ZN10QtMobility17QContactChangeSet20clearChangedContactsEv @ 182 NONAME + _ZN10QtMobility17QContactChangeSet20clearRemovedContactsEv @ 183 NONAME + _ZN10QtMobility17QContactChangeSet20insertChangedContactEj @ 184 NONAME + _ZN10QtMobility17QContactChangeSet20insertRemovedContactEj @ 185 NONAME + _ZN10QtMobility17QContactChangeSet21insertChangedContactsERK5QListIjE @ 186 NONAME + _ZN10QtMobility17QContactChangeSet21insertRemovedContactsERK5QListIjE @ 187 NONAME + _ZN10QtMobility17QContactChangeSet22oldAndNewSelfContactIdEv @ 188 NONAME + _ZN10QtMobility17QContactChangeSet25setOldAndNewSelfContactIdERK5QPairIjjE @ 189 NONAME + _ZN10QtMobility17QContactChangeSet26addedRelationshipsContactsEv @ 190 NONAME + _ZN10QtMobility17QContactChangeSet28removedRelationshipsContactsEv @ 191 NONAME + _ZN10QtMobility17QContactChangeSet31clearAddedRelationshipsContactsEv @ 192 NONAME + _ZN10QtMobility17QContactChangeSet31insertAddedRelationshipsContactEj @ 193 NONAME + _ZN10QtMobility17QContactChangeSet32insertAddedRelationshipsContactsERK5QListIjE @ 194 NONAME + _ZN10QtMobility17QContactChangeSet33clearRemovedRelationshipsContactsEv @ 195 NONAME + _ZN10QtMobility17QContactChangeSet33insertRemovedRelationshipsContactEj @ 196 NONAME + _ZN10QtMobility17QContactChangeSet34insertRemovedRelationshipsContactsERK5QListIjE @ 197 NONAME + _ZN10QtMobility17QContactChangeSet5clearEv @ 198 NONAME + _ZN10QtMobility17QContactChangeSet8clearAllEv @ 199 NONAME + _ZN10QtMobility17QContactChangeSetC1ERKS0_ @ 200 NONAME + _ZN10QtMobility17QContactChangeSetC1Ev @ 201 NONAME + _ZN10QtMobility17QContactChangeSetC2ERKS0_ @ 202 NONAME + _ZN10QtMobility17QContactChangeSetC2Ev @ 203 NONAME + _ZN10QtMobility17QContactChangeSetD1Ev @ 204 NONAME + _ZN10QtMobility17QContactChangeSetD2Ev @ 205 NONAME + _ZN10QtMobility17QContactChangeSetaSERKS0_ @ 206 NONAME + _ZN10QtMobility17QContactFetchHint20setOptimizationHintsE6QFlagsINS0_16OptimizationHintEE @ 207 NONAME + _ZN10QtMobility17QContactFetchHint24setDetailDefinitionsHintERK11QStringList @ 208 NONAME + _ZN10QtMobility17QContactFetchHint24setRelationshipTypesHintERK11QStringList @ 209 NONAME + _ZN10QtMobility17QContactFetchHintC1ERKS0_ @ 210 NONAME + _ZN10QtMobility17QContactFetchHintC1Ev @ 211 NONAME + _ZN10QtMobility17QContactFetchHintC2ERKS0_ @ 212 NONAME + _ZN10QtMobility17QContactFetchHintC2Ev @ 213 NONAME + _ZN10QtMobility17QContactFetchHintD1Ev @ 214 NONAME + _ZN10QtMobility17QContactFetchHintD2Ev @ 215 NONAME + _ZN10QtMobility17QContactFetchHintaSERKS0_ @ 216 NONAME + _ZN10QtMobility17QContactSortOrder12setDirectionEN2Qt9SortOrderE @ 217 NONAME + _ZN10QtMobility17QContactSortOrder14setBlankPolicyENS0_11BlankPolicyE @ 218 NONAME + _ZN10QtMobility17QContactSortOrder18setCaseSensitivityEN2Qt15CaseSensitivityE @ 219 NONAME + _ZN10QtMobility17QContactSortOrder23setDetailDefinitionNameERK7QStringS3_ @ 220 NONAME + _ZN10QtMobility17QContactSortOrderC1ERKS0_ @ 221 NONAME + _ZN10QtMobility17QContactSortOrderC1Ev @ 222 NONAME + _ZN10QtMobility17QContactSortOrderC2ERKS0_ @ 223 NONAME + _ZN10QtMobility17QContactSortOrderC2Ev @ 224 NONAME + _ZN10QtMobility17QContactSortOrderD1Ev @ 225 NONAME + _ZN10QtMobility17QContactSortOrderD2Ev @ 226 NONAME + _ZN10QtMobility17QContactSortOrderaSERKS0_ @ 227 NONAME + _ZN10QtMobility17QContactThumbnail14DefinitionNameE @ 228 NONAME DATA 10 + _ZN10QtMobility17QContactThumbnail14FieldThumbnailE @ 229 NONAME DATA 10 + _ZN10QtMobility17QContactTimestamp14DefinitionNameE @ 230 NONAME DATA 10 + _ZN10QtMobility17QContactTimestamp22FieldCreationTimestampE @ 231 NONAME DATA 18 + _ZN10QtMobility17QContactTimestamp26FieldModificationTimestampE @ 232 NONAME DATA 22 + _ZN10QtMobility18QContactSyncTarget14DefinitionNameE @ 233 NONAME DATA 11 + _ZN10QtMobility18QContactSyncTarget15FieldSyncTargetE @ 234 NONAME DATA 11 + _ZN10QtMobility19QContactAnniversary10FieldEventE @ 235 NONAME DATA 6 + _ZN10QtMobility19QContactAnniversary12FieldSubTypeE @ 236 NONAME DATA 8 + _ZN10QtMobility19QContactAnniversary12SubTypeHouseE @ 237 NONAME DATA 6 + _ZN10QtMobility19QContactAnniversary14DefinitionNameE @ 238 NONAME DATA 12 + _ZN10QtMobility19QContactAnniversary14SubTypeWeddingE @ 239 NONAME DATA 8 + _ZN10QtMobility19QContactAnniversary15FieldCalendarIdE @ 240 NONAME DATA 11 + _ZN10QtMobility19QContactAnniversary15SubTypeMemorialE @ 241 NONAME DATA 9 + _ZN10QtMobility19QContactAnniversary17FieldOriginalDateE @ 242 NONAME DATA 13 + _ZN10QtMobility19QContactAnniversary17SubTypeEmploymentE @ 243 NONAME DATA 11 + _ZN10QtMobility19QContactAnniversary17SubTypeEngagementE @ 244 NONAME DATA 11 + _ZN10QtMobility19QContactGeoLocation10FieldLabelE @ 245 NONAME DATA 6 + _ZN10QtMobility19QContactGeoLocation10FieldSpeedE @ 246 NONAME DATA 6 + _ZN10QtMobility19QContactGeoLocation12FieldHeadingE @ 247 NONAME DATA 8 + _ZN10QtMobility19QContactGeoLocation13FieldAccuracyE @ 248 NONAME DATA 9 + _ZN10QtMobility19QContactGeoLocation13FieldAltitudeE @ 249 NONAME DATA 9 + _ZN10QtMobility19QContactGeoLocation13FieldLatitudeE @ 250 NONAME DATA 9 + _ZN10QtMobility19QContactGeoLocation14DefinitionNameE @ 251 NONAME DATA 12 + _ZN10QtMobility19QContactGeoLocation14FieldLongitudeE @ 252 NONAME DATA 10 + _ZN10QtMobility19QContactGeoLocation14FieldTimestampE @ 253 NONAME DATA 10 + _ZN10QtMobility19QContactGeoLocation21FieldAltitudeAccuracyE @ 254 NONAME DATA 17 + _ZN10QtMobility19QContactPhoneNumber10SubTypeCarE @ 255 NONAME DATA 4 + _ZN10QtMobility19QContactPhoneNumber10SubTypeFaxE @ 256 NONAME DATA 4 + _ZN10QtMobility19QContactPhoneNumber11FieldNumberE @ 257 NONAME DATA 12 + _ZN10QtMobility19QContactPhoneNumber12SubTypeModemE @ 258 NONAME DATA 6 + _ZN10QtMobility19QContactPhoneNumber12SubTypePagerE @ 259 NONAME DATA 6 + _ZN10QtMobility19QContactPhoneNumber12SubTypeVideoE @ 260 NONAME DATA 6 + _ZN10QtMobility19QContactPhoneNumber12SubTypeVoiceE @ 261 NONAME DATA 6 + _ZN10QtMobility19QContactPhoneNumber13FieldSubTypesE @ 262 NONAME DATA 9 + _ZN10QtMobility19QContactPhoneNumber13SubTypeMobileE @ 263 NONAME DATA 7 + _ZN10QtMobility19QContactPhoneNumber14DefinitionNameE @ 264 NONAME DATA 12 + _ZN10QtMobility19QContactPhoneNumber15SubTypeDtmfMenuE @ 265 NONAME DATA 9 + _ZN10QtMobility19QContactPhoneNumber15SubTypeLandlineE @ 266 NONAME DATA 9 + _ZN10QtMobility19QContactPhoneNumber16SubTypeAssistantE @ 267 NONAME DATA 10 + _ZN10QtMobility19QContactPhoneNumber16SubTypeFacsimileE @ 268 NONAME DATA 4 + _ZN10QtMobility19QContactPhoneNumber23SubTypeMessagingCapableE @ 269 NONAME DATA 17 + _ZN10QtMobility19QContactPhoneNumber26SubTypeBulletinBoardSystemE @ 270 NONAME DATA 20 + _ZN10QtMobility19QContactPhoneNumber5matchERK7QString @ 271 NONAME + _ZN10QtMobility19QContactSaveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 272 NONAME + _ZN10QtMobility19QContactSaveRequest11qt_metacastEPKc @ 273 NONAME + _ZN10QtMobility19QContactSaveRequest11setContactsERK5QListINS_8QContactEE @ 274 NONAME + _ZN10QtMobility19QContactSaveRequest16staticMetaObjectE @ 275 NONAME DATA 16 + _ZN10QtMobility19QContactSaveRequest19getStaticMetaObjectEv @ 276 NONAME + _ZN10QtMobility19QContactSaveRequestC1Ev @ 277 NONAME + _ZN10QtMobility19QContactSaveRequestC2Ev @ 278 NONAME + _ZN10QtMobility19QContactSaveRequestD0Ev @ 279 NONAME + _ZN10QtMobility19QContactSaveRequestD1Ev @ 280 NONAME + _ZN10QtMobility19QContactSaveRequestD2Ev @ 281 NONAME + _ZN10QtMobility19QContactUnionFilter10setFiltersERK5QListINS_14QContactFilterEE @ 282 NONAME + _ZN10QtMobility19QContactUnionFilter6appendERKNS_14QContactFilterE @ 283 NONAME + _ZN10QtMobility19QContactUnionFilter6removeERKNS_14QContactFilterE @ 284 NONAME + _ZN10QtMobility19QContactUnionFilter7prependERKNS_14QContactFilterE @ 285 NONAME + _ZN10QtMobility19QContactUnionFilterC1ERKNS_14QContactFilterE @ 286 NONAME + _ZN10QtMobility19QContactUnionFilterC1Ev @ 287 NONAME + _ZN10QtMobility19QContactUnionFilterC2ERKNS_14QContactFilterE @ 288 NONAME + _ZN10QtMobility19QContactUnionFilterC2Ev @ 289 NONAME + _ZN10QtMobility19QContactUnionFilterlsERKNS_14QContactFilterE @ 290 NONAME + _ZN10QtMobility20QContactActionFilter13setActionNameERK7QString @ 291 NONAME + _ZN10QtMobility20QContactActionFilter8setValueERK8QVariant @ 292 NONAME + _ZN10QtMobility20QContactActionFilter9setVendorERK7QStringi @ 293 NONAME + _ZN10QtMobility20QContactActionFilterC1ERKNS_14QContactFilterE @ 294 NONAME + _ZN10QtMobility20QContactActionFilterC1Ev @ 295 NONAME + _ZN10QtMobility20QContactActionFilterC2ERKNS_14QContactFilterE @ 296 NONAME + _ZN10QtMobility20QContactActionFilterC2Ev @ 297 NONAME + _ZN10QtMobility20QContactDetailFilter13setMatchFlagsE6QFlagsINS_14QContactFilter9MatchFlagEE @ 298 NONAME + _ZN10QtMobility20QContactDetailFilter23setDetailDefinitionNameERK7QStringS3_ @ 299 NONAME + _ZN10QtMobility20QContactDetailFilter8setValueERK8QVariant @ 300 NONAME + _ZN10QtMobility20QContactDetailFilterC1ERKNS_14QContactFilterE @ 301 NONAME + _ZN10QtMobility20QContactDetailFilterC1Ev @ 302 NONAME + _ZN10QtMobility20QContactDetailFilterC2ERKNS_14QContactFilterE @ 303 NONAME + _ZN10QtMobility20QContactDetailFilterC2Ev @ 304 NONAME + _ZN10QtMobility20QContactDisplayLabel10FieldLabelE @ 305 NONAME DATA 6 + _ZN10QtMobility20QContactDisplayLabel14DefinitionNameE @ 306 NONAME DATA 13 + _ZN10QtMobility20QContactDisplayLabel5matchERK7QString @ 307 NONAME + _ZN10QtMobility20QContactEmailAddress14DefinitionNameE @ 308 NONAME DATA 13 + _ZN10QtMobility20QContactEmailAddress17FieldEmailAddressE @ 309 NONAME DATA 13 + _ZN10QtMobility20QContactEmailAddress5matchERK7QString @ 310 NONAME + _ZN10QtMobility20QContactFetchRequest10setSortingERK5QListINS_17QContactSortOrderEE @ 311 NONAME + _ZN10QtMobility20QContactFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 312 NONAME + _ZN10QtMobility20QContactFetchRequest11qt_metacastEPKc @ 313 NONAME + _ZN10QtMobility20QContactFetchRequest12setFetchHintERKNS_17QContactFetchHintE @ 314 NONAME + _ZN10QtMobility20QContactFetchRequest16staticMetaObjectE @ 315 NONAME DATA 16 + _ZN10QtMobility20QContactFetchRequest19getStaticMetaObjectEv @ 316 NONAME + _ZN10QtMobility20QContactFetchRequest25setDefinitionRestrictionsERK11QStringList @ 317 NONAME + _ZN10QtMobility20QContactFetchRequest9setFilterERKNS_14QContactFilterE @ 318 NONAME + _ZN10QtMobility20QContactFetchRequestC1Ev @ 319 NONAME + _ZN10QtMobility20QContactFetchRequestC2Ev @ 320 NONAME + _ZN10QtMobility20QContactFetchRequestD0Ev @ 321 NONAME + _ZN10QtMobility20QContactFetchRequestD1Ev @ 322 NONAME + _ZN10QtMobility20QContactFetchRequestD2Ev @ 323 NONAME + _ZN10QtMobility20QContactOrganization10FieldTitleE @ 324 NONAME DATA 6 + _ZN10QtMobility20QContactOrganization12FieldLogoUrlE @ 325 NONAME DATA 8 + _ZN10QtMobility20QContactOrganization13FieldLocationE @ 326 NONAME DATA 9 + _ZN10QtMobility20QContactOrganization14DefinitionNameE @ 327 NONAME DATA 13 + _ZN10QtMobility20QContactOrganization15FieldDepartmentE @ 328 NONAME DATA 11 + _ZN10QtMobility20QContactOrganization18FieldAssistantNameE @ 329 NONAME DATA 14 + _ZN10QtMobility20QContactOrganization9FieldLogoE @ 330 NONAME DATA 5 + _ZN10QtMobility20QContactOrganization9FieldNameE @ 331 NONAME DATA 5 + _ZN10QtMobility20QContactOrganization9FieldRoleE @ 332 NONAME DATA 5 + _ZN10QtMobility20QContactRelationship10AggregatesE @ 333 NONAME DATA 11 + _ZN10QtMobility20QContactRelationship10HasManagerE @ 334 NONAME DATA 11 + _ZN10QtMobility20QContactRelationship12HasAssistantE @ 335 NONAME DATA 13 + _ZN10QtMobility20QContactRelationship19setRelationshipTypeERK7QString @ 336 NONAME + _ZN10QtMobility20QContactRelationship2IsE @ 337 NONAME DATA 9 + _ZN10QtMobility20QContactRelationship8IsSameAsE @ 338 NONAME DATA 9 + _ZN10QtMobility20QContactRelationship8setFirstERKNS_10QContactIdE @ 339 NONAME + _ZN10QtMobility20QContactRelationship9HasMemberE @ 340 NONAME DATA 10 + _ZN10QtMobility20QContactRelationship9HasSpouseE @ 341 NONAME DATA 10 + _ZN10QtMobility20QContactRelationship9setSecondERKNS_10QContactIdE @ 342 NONAME + _ZN10QtMobility20QContactRelationshipC1ERKS0_ @ 343 NONAME + _ZN10QtMobility20QContactRelationshipC1Ev @ 344 NONAME + _ZN10QtMobility20QContactRelationshipC2ERKS0_ @ 345 NONAME + _ZN10QtMobility20QContactRelationshipC2Ev @ 346 NONAME + _ZN10QtMobility20QContactRelationshipD1Ev @ 347 NONAME + _ZN10QtMobility20QContactRelationshipD2Ev @ 348 NONAME + _ZN10QtMobility20QContactRelationshipaSERKS0_ @ 349 NONAME + _ZN10QtMobility21QContactActionFactory11qt_metacallEN11QMetaObject4CallEiPPv @ 350 NONAME + _ZN10QtMobility21QContactActionFactory11qt_metacastEPKc @ 351 NONAME + _ZN10QtMobility21QContactActionFactory16staticMetaObjectE @ 352 NONAME DATA 16 + _ZN10QtMobility21QContactActionFactory19getStaticMetaObjectEv @ 353 NONAME + _ZN10QtMobility21QContactActionFactoryD0Ev @ 354 NONAME + _ZN10QtMobility21QContactActionFactoryD1Ev @ 355 NONAME + _ZN10QtMobility21QContactActionFactoryD2Ev @ 356 NONAME + _ZN10QtMobility21QContactInvalidFilterC1ERKNS_14QContactFilterE @ 357 NONAME + _ZN10QtMobility21QContactInvalidFilterC1Ev @ 358 NONAME + _ZN10QtMobility21QContactInvalidFilterC2ERKNS_14QContactFilterE @ 359 NONAME + _ZN10QtMobility21QContactInvalidFilterC2Ev @ 360 NONAME + _ZN10QtMobility21QContactLocalIdFilter6setIdsERK5QListIjE @ 361 NONAME + _ZN10QtMobility21QContactLocalIdFilterC1ERKNS_14QContactFilterE @ 362 NONAME + _ZN10QtMobility21QContactLocalIdFilterC1Ev @ 363 NONAME + _ZN10QtMobility21QContactLocalIdFilterC2ERKNS_14QContactFilterE @ 364 NONAME + _ZN10QtMobility21QContactLocalIdFilterC2Ev @ 365 NONAME + _ZN10QtMobility21QContactManagerEngine10testFilterERKNS_14QContactFilterERKNS_8QContactE @ 366 NONAME + _ZN10QtMobility21QContactManagerEngine11dataChangedEv @ 367 NONAME + _ZN10QtMobility21QContactManagerEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 368 NONAME + _ZN10QtMobility21QContactManagerEngine11qt_metacastEPKc @ 369 NONAME + _ZN10QtMobility21QContactManagerEngine11saveContactEPNS_8QContactEPNS_15QContactManager5ErrorE @ 370 NONAME + _ZN10QtMobility21QContactManagerEngine12saveContactsEP5QListINS_8QContactEEP4QMapIiNS_15QContactManager5ErrorEEPS7_ @ 371 NONAME + _ZN10QtMobility21QContactManagerEngine12sortContactsERK5QListINS_8QContactEERKS1_INS_17QContactSortOrderEE @ 372 NONAME + _ZN10QtMobility21QContactManagerEngine12startRequestEPNS_23QContactAbstractRequestE @ 373 NONAME + _ZN10QtMobility21QContactManagerEngine13cancelRequestEPNS_23QContactAbstractRequestE @ 374 NONAME + _ZN10QtMobility21QContactManagerEngine13contactsAddedERK5QListIjE @ 375 NONAME + _ZN10QtMobility21QContactManagerEngine13removeContactERKjPNS_15QContactManager5ErrorE @ 376 NONAME + _ZN10QtMobility21QContactManagerEngine14compareContactERKNS_8QContactES3_RK5QListINS_17QContactSortOrderEE @ 377 NONAME + _ZN10QtMobility21QContactManagerEngine14compareVariantERK8QVariantS3_N2Qt15CaseSensitivityE @ 378 NONAME + _ZN10QtMobility21QContactManagerEngine14removeContactsERK5QListIjEP4QMapIiNS_15QContactManager5ErrorEEPS7_ @ 379 NONAME + _ZN10QtMobility21QContactManagerEngine15contactsChangedERK5QListIjE @ 380 NONAME + _ZN10QtMobility21QContactManagerEngine15contactsRemovedERK5QListIjE @ 381 NONAME + _ZN10QtMobility21QContactManagerEngine16requestDestroyedEPNS_23QContactAbstractRequestE @ 382 NONAME + _ZN10QtMobility21QContactManagerEngine16saveRelationshipEPNS_20QContactRelationshipEPNS_15QContactManager5ErrorE @ 383 NONAME + _ZN10QtMobility21QContactManagerEngine16setSelfContactIdERKjPNS_15QContactManager5ErrorE @ 384 NONAME + _ZN10QtMobility21QContactManagerEngine16staticMetaObjectE @ 385 NONAME DATA 16 + _ZN10QtMobility21QContactManagerEngine17saveRelationshipsEP5QListINS_20QContactRelationshipEEP4QMapIiNS_15QContactManager5ErrorEEPS7_ @ 386 NONAME + _ZN10QtMobility21QContactManagerEngine17schemaDefinitionsEv @ 387 NONAME + _ZN10QtMobility21QContactManagerEngine18relationshipsAddedERK5QListIjE @ 388 NONAME + _ZN10QtMobility21QContactManagerEngine18removeRelationshipERKNS_20QContactRelationshipEPNS_15QContactManager5ErrorE @ 389 NONAME + _ZN10QtMobility21QContactManagerEngine18updateRequestStateEPNS_23QContactAbstractRequestENS1_5StateE @ 390 NONAME + _ZN10QtMobility21QContactManagerEngine19canonicalizedFilterERKNS_14QContactFilterE @ 391 NONAME + _ZN10QtMobility21QContactManagerEngine19getStaticMetaObjectEv @ 392 NONAME + _ZN10QtMobility21QContactManagerEngine19removeRelationshipsERK5QListINS_20QContactRelationshipEEP4QMapIiNS_15QContactManager5ErrorEEPS8_ @ 393 NONAME + _ZN10QtMobility21QContactManagerEngine20relationshipsRemovedERK5QListIjE @ 394 NONAME + _ZN10QtMobility21QContactManagerEngine20saveDetailDefinitionERKNS_24QContactDetailDefinitionERK7QStringPNS_15QContactManager5ErrorE @ 395 NONAME + _ZN10QtMobility21QContactManagerEngine20selfContactIdChangedERKjS2_ @ 396 NONAME + _ZN10QtMobility21QContactManagerEngine20validateActionFilterERKNS_14QContactFilterE @ 397 NONAME + _ZN10QtMobility21QContactManagerEngine22removeDetailDefinitionERK7QStringS3_PNS_15QContactManager5ErrorE @ 398 NONAME + _ZN10QtMobility21QContactManagerEngine22setContactDisplayLabelEPNS_8QContactERK7QString @ 399 NONAME + _ZN10QtMobility21QContactManagerEngine22waitForRequestFinishedEPNS_23QContactAbstractRequestEi @ 400 NONAME + _ZN10QtMobility21QContactManagerEngine23setContactRelationshipsEPNS_8QContactERK5QListINS_20QContactRelationshipEE @ 401 NONAME + _ZN10QtMobility21QContactManagerEngine24updateContactSaveRequestEPNS_19QContactSaveRequestERK5QListINS_8QContactEENS_15QContactManager5ErrorERK4QMapIiS9_E @ 402 NONAME + _ZN10QtMobility21QContactManagerEngine24updateContactSaveRequestEPNS_19QContactSaveRequestERK5QListINS_8QContactEENS_15QContactManager5ErrorERK4QMapIiS9_ENS_23QContactAbstractRequest5StateE @ 403 NONAME + _ZN10QtMobility21QContactManagerEngine25updateContactFetchRequestEPNS_20QContactFetchRequestERK5QListINS_8QContactEENS_15QContactManager5ErrorE @ 404 NONAME + _ZN10QtMobility21QContactManagerEngine25updateContactFetchRequestEPNS_20QContactFetchRequestERK5QListINS_8QContactEENS_15QContactManager5ErrorENS_23QContactAbstractRequest5StateE @ 405 NONAME + _ZN10QtMobility21QContactManagerEngine26setDetailAccessConstraintsEPNS_14QContactDetailE6QFlagsINS1_16AccessConstraintEE @ 406 NONAME + _ZN10QtMobility21QContactManagerEngine26updateContactRemoveRequestEPNS_21QContactRemoveRequestENS_15QContactManager5ErrorERK4QMapIiS4_E @ 407 NONAME + _ZN10QtMobility21QContactManagerEngine26updateContactRemoveRequestEPNS_21QContactRemoveRequestENS_15QContactManager5ErrorERK4QMapIiS4_ENS_23QContactAbstractRequest5StateE @ 408 NONAME + _ZN10QtMobility21QContactManagerEngine27updateDefinitionSaveRequestEPNS_35QContactDetailDefinitionSaveRequestERK5QListINS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERK4QMapIiS9_E @ 409 NONAME + _ZN10QtMobility21QContactManagerEngine27updateDefinitionSaveRequestEPNS_35QContactDetailDefinitionSaveRequestERK5QListINS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERK4QMapIiS9_ENS_23QContactAbstractRequest5StateE @ 410 NONAME + _ZN10QtMobility21QContactManagerEngine28updateDefinitionFetchRequestEPNS_36QContactDetailDefinitionFetchRequestERK4QMapI7QStringNS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERKS3_IiSA_E @ 411 NONAME + _ZN10QtMobility21QContactManagerEngine28updateDefinitionFetchRequestEPNS_36QContactDetailDefinitionFetchRequestERK4QMapI7QStringNS_24QContactDetailDefinitionEENS_15QContactManager5ErrorERKS3_IiSA_ENS_23QContactAbstractRequest5StateE @ 412 NONAME + _ZN10QtMobility21QContactManagerEngine29updateDefinitionRemoveRequestEPNS_37QContactDetailDefinitionRemoveRequestENS_15QContactManager5ErrorERK4QMapIiS4_E @ 413 NONAME + _ZN10QtMobility21QContactManagerEngine29updateDefinitionRemoveRequestEPNS_37QContactDetailDefinitionRemoveRequestENS_15QContactManager5ErrorERK4QMapIiS4_ENS_23QContactAbstractRequest5StateE @ 414 NONAME + _ZN10QtMobility21QContactManagerEngine29updateRelationshipSaveRequestEPNS_31QContactRelationshipSaveRequestERK5QListINS_20QContactRelationshipEENS_15QContactManager5ErrorERK4QMapIiS9_E @ 415 NONAME + _ZN10QtMobility21QContactManagerEngine29updateRelationshipSaveRequestEPNS_31QContactRelationshipSaveRequestERK5QListINS_20QContactRelationshipEENS_15QContactManager5ErrorERK4QMapIiS9_ENS_23QContactAbstractRequest5StateE @ 416 NONAME + _ZN10QtMobility21QContactManagerEngine30updateRelationshipFetchRequestEPNS_32QContactRelationshipFetchRequestERK5QListINS_20QContactRelationshipEENS_15QContactManager5ErrorE @ 417 NONAME + _ZN10QtMobility21QContactManagerEngine30updateRelationshipFetchRequestEPNS_32QContactRelationshipFetchRequestERK5QListINS_20QContactRelationshipEENS_15QContactManager5ErrorENS_23QContactAbstractRequest5StateE @ 418 NONAME + _ZN10QtMobility21QContactManagerEngine31updateRelationshipRemoveRequestEPNS_33QContactRelationshipRemoveRequestENS_15QContactManager5ErrorERK4QMapIiS4_E @ 419 NONAME + _ZN10QtMobility21QContactManagerEngine31updateRelationshipRemoveRequestEPNS_33QContactRelationshipRemoveRequestENS_15QContactManager5ErrorERK4QMapIiS4_ENS_23QContactAbstractRequest5StateE @ 420 NONAME + _ZN10QtMobility21QContactManagerEngine32updateContactLocalIdFetchRequestEPNS_27QContactLocalIdFetchRequestERK5QListIjENS_15QContactManager5ErrorE @ 421 NONAME + _ZN10QtMobility21QContactManagerEngine32updateContactLocalIdFetchRequestEPNS_27QContactLocalIdFetchRequestERK5QListIjENS_15QContactManager5ErrorENS_23QContactAbstractRequest5StateE @ 422 NONAME + _ZN10QtMobility21QContactManagerEngine9addSortedEP5QListINS_8QContactEERKS2_RKS1_INS_17QContactSortOrderEE @ 423 NONAME + _ZN10QtMobility21QContactOnlineAccount10SubTypeSipE @ 424 NONAME DATA 4 + _ZN10QtMobility21QContactOnlineAccount11SubTypeImppE @ 425 NONAME DATA 5 + _ZN10QtMobility21QContactOnlineAccount11setNicknameERK7QString @ 426 NONAME + _ZN10QtMobility21QContactOnlineAccount11setPresenceERK7QString @ 427 NONAME + _ZN10QtMobility21QContactOnlineAccount12PresenceAwayE @ 428 NONAME DATA 5 + _ZN10QtMobility21QContactOnlineAccount12PresenceBusyE @ 429 NONAME DATA 5 + _ZN10QtMobility21QContactOnlineAccount13FieldNicknameE @ 430 NONAME DATA 9 + _ZN10QtMobility21QContactOnlineAccount13FieldPresenceE @ 431 NONAME DATA 9 + _ZN10QtMobility21QContactOnlineAccount13FieldSubTypesE @ 432 NONAME DATA 9 + _ZN10QtMobility21QContactOnlineAccount14DefinitionNameE @ 433 NONAME DATA 14 + _ZN10QtMobility21QContactOnlineAccount14PresenceHiddenE @ 434 NONAME DATA 7 + _ZN10QtMobility21QContactOnlineAccount14SubTypeSipVoipE @ 435 NONAME DATA 8 + _ZN10QtMobility21QContactOnlineAccount15FieldAccountUriE @ 436 NONAME DATA 11 + _ZN10QtMobility21QContactOnlineAccount15PresenceOfflineE @ 437 NONAME DATA 8 + _ZN10QtMobility21QContactOnlineAccount15PresenceUnknownE @ 438 NONAME DATA 8 + _ZN10QtMobility21QContactOnlineAccount16setStatusMessageERK7QString @ 439 NONAME + _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 + _ZN10QtMobility21QContactRemoveRequest9setFilterERKNS_14QContactFilterE @ 451 NONAME + _ZN10QtMobility21QContactRemoveRequestC1Ev @ 452 NONAME + _ZN10QtMobility21QContactRemoveRequestC2Ev @ 453 NONAME + _ZN10QtMobility21QContactRemoveRequestD0Ev @ 454 NONAME + _ZN10QtMobility21QContactRemoveRequestD1Ev @ 455 NONAME + _ZN10QtMobility21QContactRemoveRequestD2Ev @ 456 NONAME + _ZN10QtMobility22QContactGlobalPresence13FieldNicknameE @ 457 NONAME DATA 9 + _ZN10QtMobility22QContactGlobalPresence14DefinitionNameE @ 458 NONAME DATA 15 + _ZN10QtMobility22QContactGlobalPresence14FieldTimestampE @ 459 NONAME DATA 10 + _ZN10QtMobility22QContactGlobalPresence18FieldCustomMessageE @ 460 NONAME DATA 14 + _ZN10QtMobility22QContactGlobalPresence18FieldPresenceStateE @ 461 NONAME DATA 14 + _ZN10QtMobility22QContactGlobalPresence22FieldPresenceStateTextE @ 462 NONAME DATA 18 + _ZN10QtMobility22QContactGlobalPresence26FieldPresenceStateImageUrlE @ 463 NONAME DATA 22 + _ZN10QtMobility23QContactAbstractRequest10setManagerEPNS_15QContactManagerE @ 464 NONAME + _ZN10QtMobility23QContactAbstractRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 465 NONAME + _ZN10QtMobility23QContactAbstractRequest11qt_metacastEPKc @ 466 NONAME + _ZN10QtMobility23QContactAbstractRequest12stateChangedENS0_5StateE @ 467 NONAME + _ZN10QtMobility23QContactAbstractRequest15waitForFinishedEi @ 468 NONAME + _ZN10QtMobility23QContactAbstractRequest16resultsAvailableEv @ 469 NONAME + _ZN10QtMobility23QContactAbstractRequest16staticMetaObjectE @ 470 NONAME DATA 16 + _ZN10QtMobility23QContactAbstractRequest19getStaticMetaObjectEv @ 471 NONAME + _ZN10QtMobility23QContactAbstractRequest5startEv @ 472 NONAME + _ZN10QtMobility23QContactAbstractRequest6cancelEv @ 473 NONAME + _ZN10QtMobility23QContactAbstractRequestC1EPNS_30QContactAbstractRequestPrivateE @ 474 NONAME + _ZN10QtMobility23QContactAbstractRequestC2EPNS_30QContactAbstractRequestPrivateE @ 475 NONAME + _ZN10QtMobility23QContactAbstractRequestD0Ev @ 476 NONAME + _ZN10QtMobility23QContactAbstractRequestD1Ev @ 477 NONAME + _ZN10QtMobility23QContactAbstractRequestD2Ev @ 478 NONAME + _ZN10QtMobility23QContactChangeLogFilter12setEventTypeENS0_9EventTypeE @ 479 NONAME + _ZN10QtMobility23QContactChangeLogFilter8setSinceERK9QDateTime @ 480 NONAME + _ZN10QtMobility23QContactChangeLogFilterC1ENS0_9EventTypeE @ 481 NONAME + _ZN10QtMobility23QContactChangeLogFilterC1ERKNS_14QContactFilterE @ 482 NONAME + _ZN10QtMobility23QContactChangeLogFilterC2ENS0_9EventTypeE @ 483 NONAME + _ZN10QtMobility23QContactChangeLogFilterC2ERKNS_14QContactFilterE @ 484 NONAME + _ZN10QtMobility24QContactActionDescriptor13setActionNameERK7QString @ 485 NONAME + _ZN10QtMobility24QContactActionDescriptor13setVendorNameERK7QString @ 486 NONAME + _ZN10QtMobility24QContactActionDescriptor24setImplementationVersionEi @ 487 NONAME + _ZN10QtMobility24QContactActionDescriptorC1ERK7QStringS3_i @ 488 NONAME + _ZN10QtMobility24QContactActionDescriptorC1ERKS0_ @ 489 NONAME + _ZN10QtMobility24QContactActionDescriptorC2ERK7QStringS3_i @ 490 NONAME + _ZN10QtMobility24QContactActionDescriptorC2ERKS0_ @ 491 NONAME + _ZN10QtMobility24QContactActionDescriptorD1Ev @ 492 NONAME + _ZN10QtMobility24QContactActionDescriptorD2Ev @ 493 NONAME + _ZN10QtMobility24QContactActionDescriptoraSERKS0_ @ 494 NONAME + _ZN10QtMobility24QContactDetailDefinition11insertFieldERK7QStringRKNS_29QContactDetailFieldDefinitionE @ 495 NONAME + _ZN10QtMobility24QContactDetailDefinition11removeFieldERK7QString @ 496 NONAME + _ZN10QtMobility24QContactDetailDefinition7setNameERK7QString @ 497 NONAME + _ZN10QtMobility24QContactDetailDefinition9setFieldsERK4QMapI7QStringNS_29QContactDetailFieldDefinitionEE @ 498 NONAME + _ZN10QtMobility24QContactDetailDefinition9setUniqueEb @ 499 NONAME + _ZN10QtMobility24QContactDetailDefinitionC1ERKS0_ @ 500 NONAME + _ZN10QtMobility24QContactDetailDefinitionC1Ev @ 501 NONAME + _ZN10QtMobility24QContactDetailDefinitionC2ERKS0_ @ 502 NONAME + _ZN10QtMobility24QContactDetailDefinitionC2Ev @ 503 NONAME + _ZN10QtMobility24QContactDetailDefinitionD1Ev @ 504 NONAME + _ZN10QtMobility24QContactDetailDefinitionD2Ev @ 505 NONAME + _ZN10QtMobility24QContactDetailDefinitionaSERKS0_ @ 506 NONAME + _ZN10QtMobility25QContactDetailRangeFilter13setMatchFlagsE6QFlagsINS_14QContactFilter9MatchFlagEE @ 507 NONAME + _ZN10QtMobility25QContactDetailRangeFilter23setDetailDefinitionNameERK7QStringS3_ @ 508 NONAME + _ZN10QtMobility25QContactDetailRangeFilter8setRangeERK8QVariantS3_6QFlagsINS0_9RangeFlagEE @ 509 NONAME + _ZN10QtMobility25QContactDetailRangeFilterC1ERKNS_14QContactFilterE @ 510 NONAME + _ZN10QtMobility25QContactDetailRangeFilterC1Ev @ 511 NONAME + _ZN10QtMobility25QContactDetailRangeFilterC2ERKNS_14QContactFilterE @ 512 NONAME + _ZN10QtMobility25QContactDetailRangeFilterC2Ev @ 513 NONAME + _ZN10QtMobility26QContactIntersectionFilter10setFiltersERK5QListINS_14QContactFilterEE @ 514 NONAME + _ZN10QtMobility26QContactIntersectionFilter6appendERKNS_14QContactFilterE @ 515 NONAME + _ZN10QtMobility26QContactIntersectionFilter6removeERKNS_14QContactFilterE @ 516 NONAME + _ZN10QtMobility26QContactIntersectionFilter7prependERKNS_14QContactFilterE @ 517 NONAME + _ZN10QtMobility26QContactIntersectionFilterC1ERKNS_14QContactFilterE @ 518 NONAME + _ZN10QtMobility26QContactIntersectionFilterC1Ev @ 519 NONAME + _ZN10QtMobility26QContactIntersectionFilterC2ERKNS_14QContactFilterE @ 520 NONAME + _ZN10QtMobility26QContactIntersectionFilterC2Ev @ 521 NONAME + _ZN10QtMobility26QContactIntersectionFilterlsERKNS_14QContactFilterE @ 522 NONAME + _ZN10QtMobility26QContactRelationshipFilter19setRelatedContactIdERKNS_10QContactIdE @ 523 NONAME + _ZN10QtMobility26QContactRelationshipFilter19setRelationshipTypeERK7QString @ 524 NONAME + _ZN10QtMobility26QContactRelationshipFilter21setOtherParticipantIdERKNS_10QContactIdE @ 525 NONAME + _ZN10QtMobility26QContactRelationshipFilter21setRelatedContactRoleENS0_4RoleE @ 526 NONAME + _ZN10QtMobility26QContactRelationshipFilter21setRelatedContactRoleENS_20QContactRelationship4RoleE @ 527 NONAME + _ZN10QtMobility26QContactRelationshipFilter7setRoleENS0_4RoleE @ 528 NONAME + _ZN10QtMobility26QContactRelationshipFilterC1ERKNS_14QContactFilterE @ 529 NONAME + _ZN10QtMobility26QContactRelationshipFilterC1Ev @ 530 NONAME + _ZN10QtMobility26QContactRelationshipFilterC2ERKNS_14QContactFilterE @ 531 NONAME + _ZN10QtMobility26QContactRelationshipFilterC2Ev @ 532 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest10setSortingERK5QListINS_17QContactSortOrderEE @ 533 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 534 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest11qt_metacastEPKc @ 535 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest16staticMetaObjectE @ 536 NONAME DATA 16 + _ZN10QtMobility27QContactLocalIdFetchRequest19getStaticMetaObjectEv @ 537 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequest9setFilterERKNS_14QContactFilterE @ 538 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestC1Ev @ 539 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestC2Ev @ 540 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestD0Ev @ 541 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestD1Ev @ 542 NONAME + _ZN10QtMobility27QContactLocalIdFetchRequestD2Ev @ 543 NONAME + _ZN10QtMobility28QContactManagerEngineFactoryD0Ev @ 544 NONAME + _ZN10QtMobility28QContactManagerEngineFactoryD1Ev @ 545 NONAME + _ZN10QtMobility28QContactManagerEngineFactoryD2Ev @ 546 NONAME + _ZN10QtMobility29QContactDetailFieldDefinition11setDataTypeEN8QVariant4TypeE @ 547 NONAME + _ZN10QtMobility29QContactDetailFieldDefinition18setAllowableValuesE5QListI8QVariantE @ 548 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionC1ERKS0_ @ 549 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionC1Ev @ 550 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionC2ERKS0_ @ 551 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionC2Ev @ 552 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionD1Ev @ 553 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionD2Ev @ 554 NONAME + _ZN10QtMobility29QContactDetailFieldDefinitionaSERKS0_ @ 555 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 556 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequest11qt_metacastEPKc @ 557 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequest16setRelationshipsERK5QListINS_20QContactRelationshipEE @ 558 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequest16staticMetaObjectE @ 559 NONAME DATA 16 + _ZN10QtMobility31QContactRelationshipSaveRequest19getStaticMetaObjectEv @ 560 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestC1Ev @ 561 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestC2Ev @ 562 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestD0Ev @ 563 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestD1Ev @ 564 NONAME + _ZN10QtMobility31QContactRelationshipSaveRequestD2Ev @ 565 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 566 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest11qt_metacastEPKc @ 567 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest16staticMetaObjectE @ 568 NONAME DATA 16 + _ZN10QtMobility32QContactRelationshipFetchRequest19getStaticMetaObjectEv @ 569 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest19setRelationshipTypeERK7QString @ 570 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest8setFirstERKNS_10QContactIdE @ 571 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequest9setSecondERKNS_10QContactIdE @ 572 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestC1Ev @ 573 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestC2Ev @ 574 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestD0Ev @ 575 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestD1Ev @ 576 NONAME + _ZN10QtMobility32QContactRelationshipFetchRequestD2Ev @ 577 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 578 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest11qt_metacastEPKc @ 579 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest16setRelationshipsERK5QListINS_20QContactRelationshipEE @ 580 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest16staticMetaObjectE @ 581 NONAME DATA 16 + _ZN10QtMobility33QContactRelationshipRemoveRequest19getStaticMetaObjectEv @ 582 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest19setRelationshipTypeERK7QString @ 583 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest8setFirstERKNS_10QContactIdE @ 584 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequest9setSecondERKNS_10QContactIdE @ 585 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestC1Ev @ 586 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestC2Ev @ 587 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestD0Ev @ 588 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestD1Ev @ 589 NONAME + _ZN10QtMobility33QContactRelationshipRemoveRequestD2Ev @ 590 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 591 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest11qt_metacastEPKc @ 592 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest14setContactTypeERK7QString @ 593 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest14setDefinitionsERK5QListINS_24QContactDetailDefinitionEE @ 594 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequest16staticMetaObjectE @ 595 NONAME DATA 16 + _ZN10QtMobility35QContactDetailDefinitionSaveRequest19getStaticMetaObjectEv @ 596 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestC1Ev @ 597 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestC2Ev @ 598 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestD0Ev @ 599 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestD1Ev @ 600 NONAME + _ZN10QtMobility35QContactDetailDefinitionSaveRequestD2Ev @ 601 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 602 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest11qt_metacastEPKc @ 603 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest14setContactTypeERK7QString @ 604 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest16staticMetaObjectE @ 605 NONAME DATA 16 + _ZN10QtMobility36QContactDetailDefinitionFetchRequest18setDefinitionNamesERK11QStringList @ 606 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequest19getStaticMetaObjectEv @ 607 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestC1Ev @ 608 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestC2Ev @ 609 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestD0Ev @ 610 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestD1Ev @ 611 NONAME + _ZN10QtMobility36QContactDetailDefinitionFetchRequestD2Ev @ 612 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest11qt_metacallEN11QMetaObject4CallEiPPv @ 613 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest11qt_metacastEPKc @ 614 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest16staticMetaObjectE @ 615 NONAME DATA 16 + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest18setDefinitionNamesERK7QStringRK11QStringList @ 616 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequest19getStaticMetaObjectEv @ 617 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestC1Ev @ 618 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestC2Ev @ 619 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestD0Ev @ 620 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestD1Ev @ 621 NONAME + _ZN10QtMobility37QContactDetailDefinitionRemoveRequestD2Ev @ 622 NONAME + _ZN10QtMobility5qHashERKNS_10QContactIdE @ 623 NONAME + _ZN10QtMobility5qHashERKNS_14QContactDetailE @ 624 NONAME + _ZN10QtMobility5qHashERKNS_20QContactRelationshipE @ 625 NONAME + _ZN10QtMobility5qHashERKNS_24QContactActionDescriptorE @ 626 NONAME + _ZN10QtMobility5qHashERKNS_8QContactE @ 627 NONAME + _ZN10QtMobility8QContact10saveDetailEPNS_14QContactDetailE @ 628 NONAME + _ZN10QtMobility8QContact12clearDetailsEv @ 629 NONAME + _ZN10QtMobility8QContact12removeDetailEPNS_14QContactDetailE @ 630 NONAME + _ZN10QtMobility8QContact18setPreferredDetailERK7QStringRKNS_14QContactDetailE @ 631 NONAME + _ZN10QtMobility8QContact20setRelationshipOrderERK5QListINS_20QContactRelationshipEE @ 632 NONAME + _ZN10QtMobility8QContact5setIdERKNS_10QContactIdE @ 633 NONAME + _ZN10QtMobility8QContact7setTypeERK7QString @ 634 NONAME + _ZN10QtMobility8QContact7setTypeERKNS_12QContactTypeE @ 635 NONAME + _ZN10QtMobility8QContactC1ERKS0_ @ 636 NONAME + _ZN10QtMobility8QContactC1Ev @ 637 NONAME + _ZN10QtMobility8QContactC2ERKS0_ @ 638 NONAME + _ZN10QtMobility8QContactC2Ev @ 639 NONAME + _ZN10QtMobility8QContactD1Ev @ 640 NONAME + _ZN10QtMobility8QContactD2Ev @ 641 NONAME + _ZN10QtMobility8QContactaSERKS0_ @ 642 NONAME + _ZN10QtMobilityanERKNS_14QContactFilterES2_ @ 643 NONAME + _ZN10QtMobilitylsE6QDebugRKNS_10QContactIdE @ 644 NONAME + _ZN10QtMobilitylsE6QDebugRKNS_14QContactDetailE @ 645 NONAME + _ZN10QtMobilitylsE6QDebugRKNS_20QContactRelationshipE @ 646 NONAME + _ZN10QtMobilitylsE6QDebugRKNS_8QContactE @ 647 NONAME + _ZN10QtMobilityorERKNS_14QContactFilterES2_ @ 648 NONAME + _ZNK10QtMobility10QContactId10managerUriEv @ 649 NONAME + _ZNK10QtMobility10QContactId7localIdEv @ 650 NONAME + _ZNK10QtMobility10QContactIdeqERKS0_ @ 651 NONAME + _ZNK10QtMobility10QContactIdltERKS0_ @ 652 NONAME + _ZNK10QtMobility10QContactIdneERKS0_ @ 653 NONAME + _ZNK10QtMobility14QContactAction10metaObjectEv @ 654 NONAME + _ZNK10QtMobility14QContactAction16supportedDetailsERKNS_8QContactE @ 655 NONAME + _ZNK10QtMobility14QContactAvatar6avatarEv @ 656 NONAME + _ZNK10QtMobility14QContactAvatar6pixmapEv @ 657 NONAME + _ZNK10QtMobility14QContactAvatar7subTypeEv @ 658 NONAME + _ZNK10QtMobility14QContactDetail12variantValueERK7QString @ 659 NONAME + _ZNK10QtMobility14QContactDetail13variantValuesEv @ 660 NONAME + _ZNK10QtMobility14QContactDetail14definitionNameEv @ 661 NONAME + _ZNK10QtMobility14QContactDetail16preferredActionsEv @ 662 NONAME + _ZNK10QtMobility14QContactDetail17accessConstraintsEv @ 663 NONAME + _ZNK10QtMobility14QContactDetail3keyEv @ 664 NONAME + _ZNK10QtMobility14QContactDetail5valueERK7QString @ 665 NONAME + _ZNK10QtMobility14QContactDetail7isEmptyEv @ 666 NONAME + _ZNK10QtMobility14QContactDetail8hasValueERK7QString @ 667 NONAME + _ZNK10QtMobility14QContactDetaileqERKS0_ @ 668 NONAME + _ZNK10QtMobility14QContactFilter4typeEv @ 669 NONAME + _ZNK10QtMobility14QContactFiltereqERKS0_ @ 670 NONAME + _ZNK10QtMobility15QContactManager10contactIdsERK5QListINS_17QContactSortOrderEE @ 671 NONAME + _ZNK10QtMobility15QContactManager10contactIdsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEE @ 672 NONAME + _ZNK10QtMobility15QContactManager10hasFeatureENS0_14ManagerFeatureERK7QString @ 673 NONAME + _ZNK10QtMobility15QContactManager10managerUriEv @ 674 NONAME + _ZNK10QtMobility15QContactManager10metaObjectEv @ 675 NONAME + _ZNK10QtMobility15QContactManager11managerNameEv @ 676 NONAME + _ZNK10QtMobility15QContactManager13relationshipsERK7QStringRKNS_10QContactIdENS_20QContactRelationship4RoleE @ 677 NONAME + _ZNK10QtMobility15QContactManager13relationshipsERK7QStringRKNS_10QContactIdENS_26QContactRelationshipFilter4RoleE @ 678 NONAME + _ZNK10QtMobility15QContactManager13relationshipsERKNS_10QContactIdENS_20QContactRelationship4RoleE @ 679 NONAME + _ZNK10QtMobility15QContactManager13relationshipsERKNS_10QContactIdENS_26QContactRelationshipFilter4RoleE @ 680 NONAME + _ZNK10QtMobility15QContactManager13selfContactIdEv @ 681 NONAME + _ZNK10QtMobility15QContactManager14managerVersionEv @ 682 NONAME + _ZNK10QtMobility15QContactManager16detailDefinitionERK7QStringS3_ @ 683 NONAME + _ZNK10QtMobility15QContactManager17detailDefinitionsERK7QString @ 684 NONAME + _ZNK10QtMobility15QContactManager17isFilterSupportedERKNS_14QContactFilterE @ 685 NONAME + _ZNK10QtMobility15QContactManager17managerParametersEv @ 686 NONAME + _ZNK10QtMobility15QContactManager18supportedDataTypesEv @ 687 NONAME + _ZNK10QtMobility15QContactManager21supportedContactTypesEv @ 688 NONAME + _ZNK10QtMobility15QContactManager23synthesizedDisplayLabelERKNS_8QContactE @ 689 NONAME + _ZNK10QtMobility15QContactManager26supportedRelationshipTypesERK7QString @ 690 NONAME + _ZNK10QtMobility15QContactManager27isRelationshipTypeSupportedERK7QStringS3_ @ 691 NONAME + _ZNK10QtMobility15QContactManager5errorEv @ 692 NONAME + _ZNK10QtMobility15QContactManager7contactERKjRK11QStringList @ 693 NONAME + _ZNK10QtMobility15QContactManager7contactERKjRKNS_17QContactFetchHintE @ 694 NONAME + _ZNK10QtMobility15QContactManager8contactsERK5QListINS_17QContactSortOrderEERK11QStringList @ 695 NONAME + _ZNK10QtMobility15QContactManager8contactsERK5QListINS_17QContactSortOrderEERKNS_17QContactFetchHintE @ 696 NONAME + _ZNK10QtMobility15QContactManager8contactsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEERK11QStringList @ 697 NONAME + _ZNK10QtMobility15QContactManager8contactsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEERKNS_17QContactFetchHintE @ 698 NONAME + _ZNK10QtMobility17QContactChangeSet13addedContactsEv @ 699 NONAME + _ZNK10QtMobility17QContactChangeSet15changedContactsEv @ 700 NONAME + _ZNK10QtMobility17QContactChangeSet15removedContactsEv @ 701 NONAME + _ZNK10QtMobility17QContactChangeSet22oldAndNewSelfContactIdEv @ 702 NONAME + _ZNK10QtMobility17QContactChangeSet26addedRelationshipsContactsEv @ 703 NONAME + _ZNK10QtMobility17QContactChangeSet28removedRelationshipsContactsEv @ 704 NONAME + _ZNK10QtMobility17QContactFetchHint17optimizationHintsEv @ 705 NONAME + _ZNK10QtMobility17QContactFetchHint21detailDefinitionsHintEv @ 706 NONAME + _ZNK10QtMobility17QContactFetchHint21relationshipTypesHintEv @ 707 NONAME + _ZNK10QtMobility17QContactSortOrder11blankPolicyEv @ 708 NONAME + _ZNK10QtMobility17QContactSortOrder15caseSensitivityEv @ 709 NONAME + _ZNK10QtMobility17QContactSortOrder15detailFieldNameEv @ 710 NONAME + _ZNK10QtMobility17QContactSortOrder20detailDefinitionNameEv @ 711 NONAME + _ZNK10QtMobility17QContactSortOrder7isValidEv @ 712 NONAME + _ZNK10QtMobility17QContactSortOrder9directionEv @ 713 NONAME + _ZNK10QtMobility17QContactSortOrdereqERKS0_ @ 714 NONAME + _ZNK10QtMobility19QContactSaveRequest10metaObjectEv @ 715 NONAME + _ZNK10QtMobility19QContactSaveRequest8contactsEv @ 716 NONAME + _ZNK10QtMobility19QContactSaveRequest8errorMapEv @ 717 NONAME + _ZNK10QtMobility19QContactUnionFilter7filtersEv @ 718 NONAME + _ZNK10QtMobility20QContactActionFilter10actionNameEv @ 719 NONAME + _ZNK10QtMobility20QContactActionFilter10vendorNameEv @ 720 NONAME + _ZNK10QtMobility20QContactActionFilter21implementationVersionEv @ 721 NONAME + _ZNK10QtMobility20QContactActionFilter5valueEv @ 722 NONAME + _ZNK10QtMobility20QContactDetailFilter10matchFlagsEv @ 723 NONAME + _ZNK10QtMobility20QContactDetailFilter15detailFieldNameEv @ 724 NONAME + _ZNK10QtMobility20QContactDetailFilter20detailDefinitionNameEv @ 725 NONAME + _ZNK10QtMobility20QContactDetailFilter5valueEv @ 726 NONAME + _ZNK10QtMobility20QContactFetchRequest10metaObjectEv @ 727 NONAME + _ZNK10QtMobility20QContactFetchRequest22definitionRestrictionsEv @ 728 NONAME + _ZNK10QtMobility20QContactFetchRequest6filterEv @ 729 NONAME + _ZNK10QtMobility20QContactFetchRequest7sortingEv @ 730 NONAME + _ZNK10QtMobility20QContactFetchRequest8contactsEv @ 731 NONAME + _ZNK10QtMobility20QContactFetchRequest9fetchHintEv @ 732 NONAME + _ZNK10QtMobility20QContactRelationship16relationshipTypeEv @ 733 NONAME + _ZNK10QtMobility20QContactRelationship5firstEv @ 734 NONAME + _ZNK10QtMobility20QContactRelationship6secondEv @ 735 NONAME + _ZNK10QtMobility20QContactRelationshipeqERKS0_ @ 736 NONAME + _ZNK10QtMobility21QContactActionFactory10metaObjectEv @ 737 NONAME + _ZNK10QtMobility21QContactLocalIdFilter3idsEv @ 738 NONAME + _ZNK10QtMobility21QContactManagerEngine10contactIdsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEEPNS_15QContactManager5ErrorE @ 739 NONAME + _ZNK10QtMobility21QContactManagerEngine10hasFeatureENS_15QContactManager14ManagerFeatureERK7QString @ 740 NONAME + _ZNK10QtMobility21QContactManagerEngine10managerUriEv @ 741 NONAME + _ZNK10QtMobility21QContactManagerEngine10metaObjectEv @ 742 NONAME + _ZNK10QtMobility21QContactManagerEngine11managerNameEv @ 743 NONAME + _ZNK10QtMobility21QContactManagerEngine13relationshipsERK7QStringRKNS_10QContactIdENS_20QContactRelationship4RoleEPNS_15QContactManager5ErrorE @ 744 NONAME + _ZNK10QtMobility21QContactManagerEngine13selfContactIdEPNS_15QContactManager5ErrorE @ 745 NONAME + _ZNK10QtMobility21QContactManagerEngine15validateContactERKNS_8QContactEPNS_15QContactManager5ErrorE @ 746 NONAME + _ZNK10QtMobility21QContactManagerEngine16detailDefinitionERK7QStringS3_PNS_15QContactManager5ErrorE @ 747 NONAME + _ZNK10QtMobility21QContactManagerEngine17compatibleContactERKNS_8QContactEPNS_15QContactManager5ErrorE @ 748 NONAME + _ZNK10QtMobility21QContactManagerEngine17detailDefinitionsERK7QStringPNS_15QContactManager5ErrorE @ 749 NONAME + _ZNK10QtMobility21QContactManagerEngine17isFilterSupportedERKNS_14QContactFilterE @ 750 NONAME + _ZNK10QtMobility21QContactManagerEngine17managerParametersEv @ 751 NONAME + _ZNK10QtMobility21QContactManagerEngine18supportedDataTypesEv @ 752 NONAME + _ZNK10QtMobility21QContactManagerEngine18validateDefinitionERKNS_24QContactDetailDefinitionEPNS_15QContactManager5ErrorE @ 753 NONAME + _ZNK10QtMobility21QContactManagerEngine21supportedContactTypesEv @ 754 NONAME + _ZNK10QtMobility21QContactManagerEngine23synthesizedDisplayLabelERKNS_8QContactEPNS_15QContactManager5ErrorE @ 755 NONAME + _ZNK10QtMobility21QContactManagerEngine27isRelationshipTypeSupportedERK7QStringS3_ @ 756 NONAME + _ZNK10QtMobility21QContactManagerEngine7contactERKjRKNS_17QContactFetchHintEPNS_15QContactManager5ErrorE @ 757 NONAME + _ZNK10QtMobility21QContactManagerEngine8contactsERKNS_14QContactFilterERK5QListINS_17QContactSortOrderEERKNS_17QContactFetchHintEPNS_15QContactManager5ErrorE @ 758 NONAME + _ZNK10QtMobility21QContactOnlineAccount13statusMessageEv @ 759 NONAME + _ZNK10QtMobility21QContactOnlineAccount8nicknameEv @ 760 NONAME + _ZNK10QtMobility21QContactOnlineAccount8presenceEv @ 761 NONAME + _ZNK10QtMobility21QContactRemoveRequest10contactIdsEv @ 762 NONAME + _ZNK10QtMobility21QContactRemoveRequest10metaObjectEv @ 763 NONAME + _ZNK10QtMobility21QContactRemoveRequest6filterEv @ 764 NONAME + _ZNK10QtMobility21QContactRemoveRequest8errorMapEv @ 765 NONAME + _ZNK10QtMobility23QContactAbstractRequest10isCanceledEv @ 766 NONAME + _ZNK10QtMobility23QContactAbstractRequest10isFinishedEv @ 767 NONAME + _ZNK10QtMobility23QContactAbstractRequest10isInactiveEv @ 768 NONAME + _ZNK10QtMobility23QContactAbstractRequest10metaObjectEv @ 769 NONAME + _ZNK10QtMobility23QContactAbstractRequest4typeEv @ 770 NONAME + _ZNK10QtMobility23QContactAbstractRequest5errorEv @ 771 NONAME + _ZNK10QtMobility23QContactAbstractRequest5stateEv @ 772 NONAME + _ZNK10QtMobility23QContactAbstractRequest6errorsEv @ 773 NONAME + _ZNK10QtMobility23QContactAbstractRequest7managerEv @ 774 NONAME + _ZNK10QtMobility23QContactAbstractRequest8isActiveEv @ 775 NONAME + _ZNK10QtMobility23QContactChangeLogFilter5sinceEv @ 776 NONAME + _ZNK10QtMobility23QContactChangeLogFilter9eventTypeEv @ 777 NONAME + _ZNK10QtMobility24QContactActionDescriptor10actionNameEv @ 778 NONAME + _ZNK10QtMobility24QContactActionDescriptor10vendorNameEv @ 779 NONAME + _ZNK10QtMobility24QContactActionDescriptor21implementationVersionEv @ 780 NONAME + _ZNK10QtMobility24QContactActionDescriptor7isEmptyEv @ 781 NONAME + _ZNK10QtMobility24QContactActionDescriptoreqERKS0_ @ 782 NONAME + _ZNK10QtMobility24QContactActionDescriptorltERKS0_ @ 783 NONAME + _ZNK10QtMobility24QContactActionDescriptorneERKS0_ @ 784 NONAME + _ZNK10QtMobility24QContactDetailDefinition4nameEv @ 785 NONAME + _ZNK10QtMobility24QContactDetailDefinition6fieldsEv @ 786 NONAME + _ZNK10QtMobility24QContactDetailDefinition7isEmptyEv @ 787 NONAME + _ZNK10QtMobility24QContactDetailDefinition8isUniqueEv @ 788 NONAME + _ZNK10QtMobility24QContactDetailDefinitioneqERKS0_ @ 789 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter10matchFlagsEv @ 790 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter10rangeFlagsEv @ 791 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter15detailFieldNameEv @ 792 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter20detailDefinitionNameEv @ 793 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter8maxValueEv @ 794 NONAME + _ZNK10QtMobility25QContactDetailRangeFilter8minValueEv @ 795 NONAME + _ZNK10QtMobility26QContactIntersectionFilter7filtersEv @ 796 NONAME + _ZNK10QtMobility26QContactRelationshipFilter16relatedContactIdEv @ 797 NONAME + _ZNK10QtMobility26QContactRelationshipFilter16relationshipTypeEv @ 798 NONAME + _ZNK10QtMobility26QContactRelationshipFilter18otherParticipantIdEv @ 799 NONAME + _ZNK10QtMobility26QContactRelationshipFilter18relatedContactRoleEv @ 800 NONAME + _ZNK10QtMobility26QContactRelationshipFilter4roleEv @ 801 NONAME + _ZNK10QtMobility27QContactLocalIdFetchRequest10metaObjectEv @ 802 NONAME + _ZNK10QtMobility27QContactLocalIdFetchRequest3idsEv @ 803 NONAME + _ZNK10QtMobility27QContactLocalIdFetchRequest6filterEv @ 804 NONAME + _ZNK10QtMobility27QContactLocalIdFetchRequest7sortingEv @ 805 NONAME + _ZNK10QtMobility28QContactManagerEngineFactory31supportedImplementationVersionsEv @ 806 NONAME + _ZNK10QtMobility29QContactDetailFieldDefinition15allowableValuesEv @ 807 NONAME + _ZNK10QtMobility29QContactDetailFieldDefinition8dataTypeEv @ 808 NONAME + _ZNK10QtMobility29QContactDetailFieldDefinitioneqERKS0_ @ 809 NONAME + _ZNK10QtMobility29QContactDetailFieldDefinitionneERKS0_ @ 810 NONAME + _ZNK10QtMobility31QContactRelationshipSaveRequest10metaObjectEv @ 811 NONAME + _ZNK10QtMobility31QContactRelationshipSaveRequest13relationshipsEv @ 812 NONAME + _ZNK10QtMobility31QContactRelationshipSaveRequest8errorMapEv @ 813 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest10metaObjectEv @ 814 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest13relationshipsEv @ 815 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest16relationshipTypeEv @ 816 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest5firstEv @ 817 NONAME + _ZNK10QtMobility32QContactRelationshipFetchRequest6secondEv @ 818 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest10metaObjectEv @ 819 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest13relationshipsEv @ 820 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest16relationshipTypeEv @ 821 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest5firstEv @ 822 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest6secondEv @ 823 NONAME + _ZNK10QtMobility33QContactRelationshipRemoveRequest8errorMapEv @ 824 NONAME + _ZNK10QtMobility35QContactDetailDefinitionSaveRequest10metaObjectEv @ 825 NONAME + _ZNK10QtMobility35QContactDetailDefinitionSaveRequest11contactTypeEv @ 826 NONAME + _ZNK10QtMobility35QContactDetailDefinitionSaveRequest11definitionsEv @ 827 NONAME + _ZNK10QtMobility35QContactDetailDefinitionSaveRequest8errorMapEv @ 828 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest10metaObjectEv @ 829 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest11contactTypeEv @ 830 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest11definitionsEv @ 831 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest15definitionNamesEv @ 832 NONAME + _ZNK10QtMobility36QContactDetailDefinitionFetchRequest8errorMapEv @ 833 NONAME + _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest10metaObjectEv @ 834 NONAME + _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest11contactTypeEv @ 835 NONAME + _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest15definitionNamesEv @ 836 NONAME + _ZNK10QtMobility37QContactDetailDefinitionRemoveRequest8errorMapEv @ 837 NONAME + _ZNK10QtMobility8QContact12displayLabelEv @ 838 NONAME + _ZNK10QtMobility8QContact13relationshipsERK7QString @ 839 NONAME + _ZNK10QtMobility8QContact15preferredDetailERK7QString @ 840 NONAME + _ZNK10QtMobility8QContact15relatedContactsERK7QStringNS_20QContactRelationship4RoleE @ 841 NONAME + _ZNK10QtMobility8QContact15relatedContactsERK7QStringNS_26QContactRelationshipFilter4RoleE @ 842 NONAME + _ZNK10QtMobility8QContact16availableActionsERK7QStringi @ 843 NONAME + _ZNK10QtMobility8QContact16detailWithActionERK7QString @ 844 NONAME + _ZNK10QtMobility8QContact16preferredDetailsEv @ 845 NONAME + _ZNK10QtMobility8QContact17detailsWithActionERK7QString @ 846 NONAME + _ZNK10QtMobility8QContact17isPreferredDetailERK7QStringRKNS_14QContactDetailE @ 847 NONAME + _ZNK10QtMobility8QContact17relationshipOrderEv @ 848 NONAME + _ZNK10QtMobility8QContact2idEv @ 849 NONAME + _ZNK10QtMobility8QContact4typeEv @ 850 NONAME + _ZNK10QtMobility8QContact6detailERK7QString @ 851 NONAME + _ZNK10QtMobility8QContact7detailsERK7QString @ 852 NONAME + _ZNK10QtMobility8QContact7detailsERK7QStringS3_S3_ @ 853 NONAME + _ZNK10QtMobility8QContact7isEmptyEv @ 854 NONAME + _ZNK10QtMobility8QContact7localIdEv @ 855 NONAME + _ZNK10QtMobility8QContacteqERKS0_ @ 856 NONAME + _ZTIN10QtMobility12QContactNameE @ 857 NONAME + _ZTIN10QtMobility12QContactTypeE @ 858 NONAME + _ZTIN10QtMobility14QContactActionE @ 859 NONAME + _ZTIN10QtMobility14QContactDetailE @ 860 NONAME + _ZTIN10QtMobility14QContactFilterE @ 861 NONAME + _ZTIN10QtMobility15QContactManagerE @ 862 NONAME + _ZTIN10QtMobility17QContactTimestampE @ 863 NONAME + _ZTIN10QtMobility19QContactSaveRequestE @ 864 NONAME + _ZTIN10QtMobility19QContactUnionFilterE @ 865 NONAME + _ZTIN10QtMobility20QContactActionFilterE @ 866 NONAME + _ZTIN10QtMobility20QContactDetailFilterE @ 867 NONAME + _ZTIN10QtMobility20QContactDisplayLabelE @ 868 NONAME + _ZTIN10QtMobility20QContactFetchRequestE @ 869 NONAME + _ZTIN10QtMobility20QContactOrganizationE @ 870 NONAME + _ZTIN10QtMobility21QContactActionFactoryE @ 871 NONAME + _ZTIN10QtMobility21QContactInvalidFilterE @ 872 NONAME + _ZTIN10QtMobility21QContactLocalIdFilterE @ 873 NONAME + _ZTIN10QtMobility21QContactManagerEngineE @ 874 NONAME + _ZTIN10QtMobility21QContactRemoveRequestE @ 875 NONAME + _ZTIN10QtMobility23QContactAbstractRequestE @ 876 NONAME + _ZTIN10QtMobility23QContactChangeLogFilterE @ 877 NONAME + _ZTIN10QtMobility25QContactDetailRangeFilterE @ 878 NONAME + _ZTIN10QtMobility26QContactIntersectionFilterE @ 879 NONAME + _ZTIN10QtMobility26QContactRelationshipFilterE @ 880 NONAME + _ZTIN10QtMobility27QContactLocalIdFetchRequestE @ 881 NONAME + _ZTIN10QtMobility28QContactManagerEngineFactoryE @ 882 NONAME + _ZTIN10QtMobility31QContactRelationshipSaveRequestE @ 883 NONAME + _ZTIN10QtMobility32QContactRelationshipFetchRequestE @ 884 NONAME + _ZTIN10QtMobility33QContactRelationshipRemoveRequestE @ 885 NONAME + _ZTIN10QtMobility35QContactDetailDefinitionSaveRequestE @ 886 NONAME + _ZTIN10QtMobility36QContactDetailDefinitionFetchRequestE @ 887 NONAME + _ZTIN10QtMobility37QContactDetailDefinitionRemoveRequestE @ 888 NONAME + _ZTVN10QtMobility12QContactNameE @ 889 NONAME + _ZTVN10QtMobility12QContactTypeE @ 890 NONAME + _ZTVN10QtMobility14QContactActionE @ 891 NONAME + _ZTVN10QtMobility14QContactDetailE @ 892 NONAME + _ZTVN10QtMobility14QContactFilterE @ 893 NONAME + _ZTVN10QtMobility15QContactManagerE @ 894 NONAME + _ZTVN10QtMobility17QContactTimestampE @ 895 NONAME + _ZTVN10QtMobility19QContactSaveRequestE @ 896 NONAME + _ZTVN10QtMobility19QContactUnionFilterE @ 897 NONAME + _ZTVN10QtMobility20QContactActionFilterE @ 898 NONAME + _ZTVN10QtMobility20QContactDetailFilterE @ 899 NONAME + _ZTVN10QtMobility20QContactDisplayLabelE @ 900 NONAME + _ZTVN10QtMobility20QContactFetchRequestE @ 901 NONAME + _ZTVN10QtMobility20QContactOrganizationE @ 902 NONAME + _ZTVN10QtMobility21QContactActionFactoryE @ 903 NONAME + _ZTVN10QtMobility21QContactInvalidFilterE @ 904 NONAME + _ZTVN10QtMobility21QContactLocalIdFilterE @ 905 NONAME + _ZTVN10QtMobility21QContactManagerEngineE @ 906 NONAME + _ZTVN10QtMobility21QContactRemoveRequestE @ 907 NONAME + _ZTVN10QtMobility23QContactAbstractRequestE @ 908 NONAME + _ZTVN10QtMobility23QContactChangeLogFilterE @ 909 NONAME + _ZTVN10QtMobility25QContactDetailRangeFilterE @ 910 NONAME + _ZTVN10QtMobility26QContactIntersectionFilterE @ 911 NONAME + _ZTVN10QtMobility26QContactRelationshipFilterE @ 912 NONAME + _ZTVN10QtMobility27QContactLocalIdFetchRequestE @ 913 NONAME + _ZTVN10QtMobility28QContactManagerEngineFactoryE @ 914 NONAME + _ZTVN10QtMobility31QContactRelationshipSaveRequestE @ 915 NONAME + _ZTVN10QtMobility32QContactRelationshipFetchRequestE @ 916 NONAME + _ZTVN10QtMobility33QContactRelationshipRemoveRequestE @ 917 NONAME + _ZTVN10QtMobility35QContactDetailDefinitionSaveRequestE @ 918 NONAME + _ZTVN10QtMobility36QContactDetailDefinitionFetchRequestE @ 919 NONAME + _ZTVN10QtMobility37QContactDetailDefinitionRemoveRequestE @ 920 NONAME + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/s60installs/eabi/QtVersitu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/src/s60installs/eabi/QtVersitu.def Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,139 @@ +EXPORTS + _ZN10QtMobility13QVersitReader11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME + _ZN10QtMobility13QVersitReader11qt_metacastEPKc @ 2 NONAME + _ZN10QtMobility13QVersitReader12startReadingEv @ 3 NONAME + _ZN10QtMobility13QVersitReader12stateChangedENS0_5StateE @ 4 NONAME + _ZN10QtMobility13QVersitReader15setDefaultCodecEP10QTextCodec @ 5 NONAME + _ZN10QtMobility13QVersitReader15waitForFinishedEi @ 6 NONAME + _ZN10QtMobility13QVersitReader16resultsAvailableEv @ 7 NONAME + _ZN10QtMobility13QVersitReader16staticMetaObjectE @ 8 NONAME DATA 16 + _ZN10QtMobility13QVersitReader19getStaticMetaObjectEv @ 9 NONAME + _ZN10QtMobility13QVersitReader6cancelEv @ 10 NONAME + _ZN10QtMobility13QVersitReader7setDataERK10QByteArray @ 11 NONAME + _ZN10QtMobility13QVersitReader9setDeviceEP9QIODevice @ 12 NONAME + _ZN10QtMobility13QVersitReaderC1EP9QIODevice @ 13 NONAME + _ZN10QtMobility13QVersitReaderC1ERK10QByteArray @ 14 NONAME + _ZN10QtMobility13QVersitReaderC1Ev @ 15 NONAME + _ZN10QtMobility13QVersitReaderC2EP9QIODevice @ 16 NONAME + _ZN10QtMobility13QVersitReaderC2ERK10QByteArray @ 17 NONAME + _ZN10QtMobility13QVersitReaderC2Ev @ 18 NONAME + _ZN10QtMobility13QVersitReaderD0Ev @ 19 NONAME + _ZN10QtMobility13QVersitReaderD1Ev @ 20 NONAME + _ZN10QtMobility13QVersitReaderD2Ev @ 21 NONAME + _ZN10QtMobility13QVersitWriter11qt_metacallEN11QMetaObject4CallEiPPv @ 22 NONAME + _ZN10QtMobility13QVersitWriter11qt_metacastEPKc @ 23 NONAME + _ZN10QtMobility13QVersitWriter12startWritingERK5QListINS_15QVersitDocumentEE @ 24 NONAME + _ZN10QtMobility13QVersitWriter12stateChangedENS0_5StateE @ 25 NONAME + _ZN10QtMobility13QVersitWriter15setDefaultCodecEP10QTextCodec @ 26 NONAME + _ZN10QtMobility13QVersitWriter15waitForFinishedEi @ 27 NONAME + _ZN10QtMobility13QVersitWriter16staticMetaObjectE @ 28 NONAME DATA 16 + _ZN10QtMobility13QVersitWriter19getStaticMetaObjectEv @ 29 NONAME + _ZN10QtMobility13QVersitWriter6cancelEv @ 30 NONAME + _ZN10QtMobility13QVersitWriter9setDeviceEP9QIODevice @ 31 NONAME + _ZN10QtMobility13QVersitWriterC1EP10QByteArray @ 32 NONAME + _ZN10QtMobility13QVersitWriterC1EP9QIODevice @ 33 NONAME + _ZN10QtMobility13QVersitWriterC1Ev @ 34 NONAME + _ZN10QtMobility13QVersitWriterC2EP10QByteArray @ 35 NONAME + _ZN10QtMobility13QVersitWriterC2EP9QIODevice @ 36 NONAME + _ZN10QtMobility13QVersitWriterC2Ev @ 37 NONAME + _ZN10QtMobility13QVersitWriterD0Ev @ 38 NONAME + _ZN10QtMobility13QVersitWriterD1Ev @ 39 NONAME + _ZN10QtMobility13QVersitWriterD2Ev @ 40 NONAME + _ZN10QtMobility15QVersitDocument11addPropertyERKNS_15QVersitPropertyE @ 41 NONAME + _ZN10QtMobility15QVersitDocument14removePropertyERKNS_15QVersitPropertyE @ 42 NONAME + _ZN10QtMobility15QVersitDocument16removePropertiesERK7QString @ 43 NONAME + _ZN10QtMobility15QVersitDocument5clearEv @ 44 NONAME + _ZN10QtMobility15QVersitDocument7setTypeENS0_10VersitTypeE @ 45 NONAME + _ZN10QtMobility15QVersitDocumentC1ENS0_10VersitTypeE @ 46 NONAME + _ZN10QtMobility15QVersitDocumentC1ERKS0_ @ 47 NONAME + _ZN10QtMobility15QVersitDocumentC1Ev @ 48 NONAME + _ZN10QtMobility15QVersitDocumentC2ENS0_10VersitTypeE @ 49 NONAME + _ZN10QtMobility15QVersitDocumentC2ERKS0_ @ 50 NONAME + _ZN10QtMobility15QVersitDocumentC2Ev @ 51 NONAME + _ZN10QtMobility15QVersitDocumentD1Ev @ 52 NONAME + _ZN10QtMobility15QVersitDocumentD2Ev @ 53 NONAME + _ZN10QtMobility15QVersitDocumentaSERKS0_ @ 54 NONAME + _ZN10QtMobility15QVersitProperty12setValueTypeENS0_9ValueTypeE @ 55 NONAME + _ZN10QtMobility15QVersitProperty13setParametersERK10QMultiHashI7QStringS2_E @ 56 NONAME + _ZN10QtMobility15QVersitProperty15insertParameterERK7QStringS3_ @ 57 NONAME + _ZN10QtMobility15QVersitProperty15removeParameterERK7QStringS3_ @ 58 NONAME + _ZN10QtMobility15QVersitProperty16removeParametersERK7QString @ 59 NONAME + _ZN10QtMobility15QVersitProperty5clearEv @ 60 NONAME + _ZN10QtMobility15QVersitProperty7setNameERK7QString @ 61 NONAME + _ZN10QtMobility15QVersitProperty8setValueERK8QVariant @ 62 NONAME + _ZN10QtMobility15QVersitProperty9setGroupsERK11QStringList @ 63 NONAME + _ZN10QtMobility15QVersitPropertyC1ERKS0_ @ 64 NONAME + _ZN10QtMobility15QVersitPropertyC1Ev @ 65 NONAME + _ZN10QtMobility15QVersitPropertyC2ERKS0_ @ 66 NONAME + _ZN10QtMobility15QVersitPropertyC2Ev @ 67 NONAME + _ZN10QtMobility15QVersitPropertyD1Ev @ 68 NONAME + _ZN10QtMobility15QVersitPropertyD2Ev @ 69 NONAME + _ZN10QtMobility15QVersitPropertyaSERKS0_ @ 70 NONAME + _ZN10QtMobility22QVersitContactExporter14exportContactsERK5QListINS_8QContactEE @ 71 NONAME + _ZN10QtMobility22QVersitContactExporter14exportContactsERK5QListINS_8QContactEENS_15QVersitDocument10VersitTypeE @ 72 NONAME + _ZN10QtMobility22QVersitContactExporter16setDetailHandlerEPNS_35QVersitContactExporterDetailHandlerE @ 73 NONAME + _ZN10QtMobility22QVersitContactExporter18setResourceHandlerEPNS_22QVersitResourceHandlerE @ 74 NONAME + _ZN10QtMobility22QVersitContactExporterC1Ev @ 75 NONAME + _ZN10QtMobility22QVersitContactExporterC2Ev @ 76 NONAME + _ZN10QtMobility22QVersitContactExporterD1Ev @ 77 NONAME + _ZN10QtMobility22QVersitContactExporterD2Ev @ 78 NONAME + _ZN10QtMobility22QVersitContactImporter14importContactsERK5QListINS_15QVersitDocumentEE @ 79 NONAME + _ZN10QtMobility22QVersitContactImporter15importDocumentsERK5QListINS_15QVersitDocumentEE @ 80 NONAME + _ZN10QtMobility22QVersitContactImporter18setPropertyHandlerEPNS_37QVersitContactImporterPropertyHandlerE @ 81 NONAME + _ZN10QtMobility22QVersitContactImporter18setResourceHandlerEPNS_22QVersitResourceHandlerE @ 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 + _ZN10QtMobility5qHashERKNS_15QVersitDocumentE @ 94 NONAME + _ZN10QtMobility5qHashERKNS_15QVersitPropertyE @ 95 NONAME + _ZN10QtMobilitylsE6QDebugRKNS_15QVersitDocumentE @ 96 NONAME + _ZN10QtMobilitylsE6QDebugRKNS_15QVersitPropertyE @ 97 NONAME + _ZNK10QtMobility13QVersitReader10metaObjectEv @ 98 NONAME + _ZNK10QtMobility13QVersitReader12defaultCodecEv @ 99 NONAME + _ZNK10QtMobility13QVersitReader5errorEv @ 100 NONAME + _ZNK10QtMobility13QVersitReader5stateEv @ 101 NONAME + _ZNK10QtMobility13QVersitReader6deviceEv @ 102 NONAME + _ZNK10QtMobility13QVersitReader7resultsEv @ 103 NONAME + _ZNK10QtMobility13QVersitWriter10metaObjectEv @ 104 NONAME + _ZNK10QtMobility13QVersitWriter12defaultCodecEv @ 105 NONAME + _ZNK10QtMobility13QVersitWriter5errorEv @ 106 NONAME + _ZNK10QtMobility13QVersitWriter5stateEv @ 107 NONAME + _ZNK10QtMobility13QVersitWriter6deviceEv @ 108 NONAME + _ZNK10QtMobility15QVersitDocument10propertiesEv @ 109 NONAME + _ZNK10QtMobility15QVersitDocument4typeEv @ 110 NONAME + _ZNK10QtMobility15QVersitDocument7isEmptyEv @ 111 NONAME + _ZNK10QtMobility15QVersitDocumenteqERKS0_ @ 112 NONAME + _ZNK10QtMobility15QVersitDocumentneERKS0_ @ 113 NONAME + _ZNK10QtMobility15QVersitProperty10parametersEv @ 114 NONAME + _ZNK10QtMobility15QVersitProperty12variantValueEv @ 115 NONAME + _ZNK10QtMobility15QVersitProperty4nameEv @ 116 NONAME + _ZNK10QtMobility15QVersitProperty5valueEv @ 117 NONAME + _ZNK10QtMobility15QVersitProperty6groupsEv @ 118 NONAME + _ZNK10QtMobility15QVersitProperty7isEmptyEv @ 119 NONAME + _ZNK10QtMobility15QVersitProperty9valueTypeEv @ 120 NONAME + _ZNK10QtMobility15QVersitPropertyeqERKS0_ @ 121 NONAME + _ZNK10QtMobility15QVersitPropertyneERKS0_ @ 122 NONAME + _ZNK10QtMobility22QVersitContactExporter13detailHandlerEv @ 123 NONAME + _ZNK10QtMobility22QVersitContactExporter15resourceHandlerEv @ 124 NONAME + _ZNK10QtMobility22QVersitContactExporter6errorsEv @ 125 NONAME + _ZNK10QtMobility22QVersitContactExporter9documentsEv @ 126 NONAME + _ZNK10QtMobility22QVersitContactImporter15propertyHandlerEv @ 127 NONAME + _ZNK10QtMobility22QVersitContactImporter15resourceHandlerEv @ 128 NONAME + _ZNK10QtMobility22QVersitContactImporter6errorsEv @ 129 NONAME + _ZNK10QtMobility22QVersitContactImporter8contactsEv @ 130 NONAME + _ZTIN10QtMobility13QVersitReaderE @ 131 NONAME + _ZTIN10QtMobility13QVersitWriterE @ 132 NONAME + _ZTIN10QtMobility22QVersitResourceHandlerE @ 133 NONAME + _ZTIN10QtMobility29QVersitDefaultResourceHandlerE @ 134 NONAME + _ZTVN10QtMobility13QVersitReaderE @ 135 NONAME + _ZTVN10QtMobility13QVersitWriterE @ 136 NONAME + _ZTVN10QtMobility29QVersitDefaultResourceHandlerE @ 137 NONAME + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/s60installs/s60installs.pro --- a/qtcontactsmobility/src/s60installs/s60installs.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/s60installs/s60installs.pro Mon May 03 12:24:20 2010 +0300 @@ -1,6 +1,7 @@ TEMPLATE = subdirs symbian: { + include(../../staticconfig.pri) load(data_caging_paths) include($$QT_MOBILITY_BUILD_TREE/config.pri) @@ -11,99 +12,143 @@ # Beta 0.2.0 # Final 1.0.0 - VERSION = 0.2.0 + VERSION = 1.0.0 vendorinfo = \ "; Localised Vendor name" \ - "%{\"Nokia, Qt\"}" \ + "%{\"Nokia\"}" \ " " \ "; Unique Vendor name" \ - ":\"Nokia, Qt\"" \ + ":\"Nokia\"" \ " " qtmobilitydeployment.pkg_prerules += vendorinfo - EPOCROOT31 = $${EPOCROOT31} - EPOCROOT32 = $${EPOCROOT32} - EPOCROOT50 = $${EPOCROOT50} + epoc31 = $$(EPOCROOT31) + epoc32 = $$(EPOCROOT32) + epoc50 = $$(EPOCROOT50) # default to EPOCROOT if EPOCROOTxy not defined - isEmpty(EPOCROOT31) { + isEmpty(epoc31) { EPOCROOT31 = $${EPOCROOT} - } - isEmpty(EPOCROOT32) { - EPOCROOT32 = $${EPOCROOT} - } - isEmpty(EPOCROOT50) { - EPOCROOT50 = $${EPOCROOT} + } else { + EPOCROOT31 = $$(EPOCROOT31) } - - qtmobilitydeployment.sources = \ - $$(EPOCROOT50)epoc32/release/armv5/urel/QtMessaging.dll \ - $$(EPOCROOT50)epoc32/release/armv5/urel/QtServiceFramework.dll \ - $$(EPOCROOT50)epoc32/release/armv5/urel/SFWDatabaseManagerServer.exe \ - $$(EPOCROOT50)epoc32/release/armv5/urel/QtLocation.dll \ - $$(EPOCROOT50)epoc32/release/armv5/urel/QtSystemInfo.dll \ - $$(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/QtMedia.dll \ - $$(EPOCROOT50)epoc32/release/armv5/urel/m3u.dll + isEmpty(epoc32) { + EPOCROOT32 = $${EPOCROOT} + }else { + EPOCROOT32 = $$(EPOCROOT32) + } + isEmpty(epoc50) { + EPOCROOT50 = $${EPOCROOT} + } else { + EPOCROOT50 = $$(EPOCROOT50) + } - bearer = \ - "IF package(0x1028315F)" \ - " \"$$(EPOCROOT50)epoc32/release/armv5/urel/QtBearer.dll\" - \"!:\\sys\\bin\\QtBearer.dll\"" \ - "ELSEIF package(0x102752AE)" \ - " \"$$(EPOCROOT50)epoc32/release/armv5/urel/QtBearer.dll\" - \"!:\\sys\\bin\\QtBearer.dll\"" \ - "ELSEIF package(0x102032BE)" \ - " \"$$(EPOCROOT31)epoc32/release/armv5/urel/QtBearer.dll\" - \"!:\\sys\\bin\\QtBearer.dll\"" \ - "ELSE" \ - " \"$$(EPOCROOT50)epoc32/release/armv5/urel/QtBearer.dll\" - \"!:\\sys\\bin\\QtBearer.dll\"" \ - "ENDIF" + contains(mobility_modules, messaging): qtmobilitydeployment.sources += \ + $$(EPOCROOT50)epoc32/release/armv5/urel/QtMessaging.dll + + contains(mobility_modules, serviceframework): qtmobilitydeployment.sources += \ + $$(EPOCROOT50)epoc32/release/armv5/urel/QtServiceFramework.dll \ + $$(EPOCROOT50)epoc32/release/armv5/urel/SFWDatabaseManagerServer.exe + + contains(mobility_modules, location): qtmobilitydeployment.sources += \ + $$(EPOCROOT50)epoc32/release/armv5/urel/QtLocation.dll - contacts = \ - "IF package(0x1028315F)" \ - " \"$$(EPOCROOT50)epoc32/release/armv5/urel/mobapicontactspluginsymbian.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbian.dll\"" \ - "ELSEIF package(0x102752AE)" \ - " \"$$(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" + contains(mobility_modules, systeminfo): qtmobilitydeployment.sources += \ + $$(EPOCROOT50)epoc32/release/armv5/urel/QtSystemInfo.dll - 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" + contains(mobility_modules, publishsubscribe): qtmobilitydeployment.sources += \ + $$(EPOCROOT50)epoc32/release/armv5/urel/QtPublishSubscribe.dll \ + $$(EPOCROOT50)epoc32/release/armv5/urel/PSPathMapperServer.exe - pluginstubs = \ - "\"$$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\"" + contains(mobility_modules, versit): qtmobilitydeployment.sources += \ + $$(EPOCROOT50)epoc32/release/armv5/urel/QtVersit.dll - qtmobilitydeployment.pkg_postrules += bearer - qtmobilitydeployment.pkg_postrules += contacts - qtmobilitydeployment.pkg_postrules += multimedia + contains(mobility_modules, bearer) { + bearer = \ + "IF package(0x1028315F)" \ + " \"$$EPOCROOT50\epoc32/release/armv5/urel/QtBearer.dll\" - \"!:\\sys\\bin\\QtBearer.dll\"" \ + "ELSEIF package(0x102752AE)" \ + " \"$$EPOCROOT50\epoc32/release/armv5/urel/QtBearer.dll\" - \"!:\\sys\\bin\\QtBearer.dll\"" \ + "ELSEIF package(0x102032BE)" \ + " \"$$EPOCROOT31\epoc32/release/armv5/urel/QtBearer.dll\" - \"!:\\sys\\bin\\QtBearer.dll\"" \ + "ELSE" \ + " \"$$EPOCROOT50\epoc32/release/armv5/urel/QtBearer.dll\" - \"!:\\sys\\bin\\QtBearer.dll\"" \ + "ENDIF" + + qtmobilitydeployment.pkg_postrules += bearer + } + + contains(mobility_modules, contacts) { + + qtmobilitydeployment.sources += \ + $$(EPOCROOT50)epoc32/release/armv5/urel/QtContacts.dll + + contacts = \ + "IF package(0x1028315F)" \ + " \"$$EPOCROOT50\epoc32/release/armv5/urel/mobapicontactspluginsymbian.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbian.dll\"" \ + "ELSEIF package(0x102752AE)" \ + " \"$$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" + + qtmobilitydeployment.pkg_postrules += contacts + + pluginstubs += \ + "\"$$QT_MOBILITY_BUILD_TREE/plugins/contacts/symbian/qmakepluginstubs/mobapicontactspluginsymbian.qtplugin\" - \"!:\\resource\\qt\\plugins\\contacts\\mobapicontactspluginsymbian.qtplugin\"" + + contains(symbiancntsim_enabled, yes) { + pluginstubs += \ + "\"$$QT_MOBILITY_BUILD_TREE/plugins/contacts/symbiansim/qmakepluginstubs/mobapicontactspluginsymbiansim.qtplugin\" - \"!:\\resource\\qt\\plugins\\contacts\\mobapicontactspluginsymbiansim.qtplugin\"" + + symbiancntsim = \ + "IF package(0x1028315F)" \ + " \"$$EPOCROOT50\epoc32/release/armv5/urel/mobapicontactspluginsymbiansim.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbiansim.dll\"" \ + "ELSEIF package(0x102752AE)" \ + " \"$$EPOCROOT32\epoc32/release/armv5/urel/mobapicontactspluginsymbiansim.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbiansim.dll\"" \ + "ELSEIF package(0x102032BE)" \ + " \"$$EPOCROOT31\epoc32/release/armv5/urel/mobapicontactspluginsymbiansim.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbiansim.dll\"" \ + "ELSE" \ + " \"$$EPOCROOT50\epoc32/release/armv5/urel/mobapicontactspluginsymbiansim.dll\" - \"!:\\sys\\bin\\mobapicontactspluginsymbiansim.dll\"" \ + "ENDIF" \ + "\"$$QT_MOBILITY_BUILD_TREE/plugins/contacts/symbiansim/qmakepluginstubs/mobapicontactspluginsymbiansim.qtplugin\" - \"!:\\resource\\qt\\plugins\\contacts\\mobapicontactspluginsymbiansim.qtplugin\"" + + qtmobilitydeployment.pkg_postrules += symbiancntsim + } + + } + + contains(mobility_modules, multimedia) { + + qtmobilitydeployment.sources += \ + $$(EPOCROOT50)epoc32/release/armv5/urel/QtMedia.dll \ + $$(EPOCROOT50)epoc32/release/armv5/urel/m3u.dll + + 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" + + qtmobilitydeployment.pkg_postrules += multimedia + + pluginstubs += \ + "\"$$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\"" + } + qtmobilitydeployment.pkg_postrules += pluginstubs - contains(symbiancntsim_enabled, yes) { - qtmobilitydeployment.pkg_postrules += symbiancntsim - } - qtmobilitydeployment.path = /sys/bin - - DEPLOYMENT += qtmobilitydeployment + + DEPLOYMENT += qtmobilitydeployment } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/src.pro --- a/qtcontactsmobility/src/src.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/src.pro Mon May 03 12:24:20 2010 +0300 @@ -1,10 +1,7 @@ -include(../pathconfig.pri) -include($$QT_MOBILITY_BUILD_TREE/config.pri) +include(../staticconfig.pri) TEMPLATE = subdirs - -# Not for MCL.. -exists(global):SUBDIRS += global +SUBDIRS += global contains(mobility_modules,serviceframework) { SUBDIRS += serviceframework @@ -37,8 +34,8 @@ versit.target=sub-versit versit.depends=contacts -contains(mobility_modules,messaging) { - contains(qmf_enabled, yes)|wince*|win32|symbian|maemo6 { +contains(qmf_enabled, yes)|wince*|win32|symbian|maemo5 { + contains(mobility_modules,messaging) { !win32-g++:SUBDIRS += messaging } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/bwins/QtVersitu.def --- a/qtcontactsmobility/src/versit/bwins/QtVersitu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -EXPORTS - ?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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/eabi/QtVersitu.def --- a/qtcontactsmobility/src/versit/eabi/QtVersitu.def Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -EXPORTS - _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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qvcard21writer.cpp --- a/qtcontactsmobility/src/versit/qvcard21writer.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qvcard21writer.cpp Mon May 03 12:24:20 2010 +0300 @@ -70,21 +70,37 @@ QString renderedValue; bool useUtf8 = false; - if (variant.type() == QVariant::String) { - QString valueString = variant.toString(); - - // 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")); + /* Structured values need to have their components backslash-escaped (in vCard 2.1, semicolons + must be escaped for compound values and commas must be escaped for list values). */ + if (variant.type() == QVariant::StringList) { + QStringList values = property.variantValue().toStringList(); + QString separator; + if (property.valueType() == QVersitProperty::CompoundType) { + separator = QLatin1String(";"); + } else { + if (property.valueType() != QVersitProperty::ListType) { + qWarning("Variant value is a QStringList but the property's value type is neither " + "CompoundType or ListType"); + } + // Assume it's a ListType + separator = QLatin1String(","); } - - // 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; + QString replacement = QLatin1Char('\\') + separator; + QRegExp separatorRegex = QRegExp(separator); + bool first = true; + foreach (QString value, values) { + if (!(value.isEmpty() && property.valueType() == QVersitProperty::ListType)) { + useUtf8 |= encodeVersitValue(parameters, value); + if (!first) { + renderedValue += separator; + } + renderedValue += value.replace(separatorRegex, replacement); + first = false; + } } - renderedValue = valueString; + } else if (variant.type() == QVariant::String) { + renderedValue = variant.toString(); + useUtf8 = encodeVersitValue(parameters, renderedValue); } else if (variant.type() == QVariant::ByteArray) { parameters.insert(QLatin1String("ENCODING"), QLatin1String("BASE64")); renderedValue = QLatin1String(variant.toByteArray().toBase64().data()); @@ -99,7 +115,7 @@ writeCrlf(); QVersitDocument embeddedDocument = variant.value(); encodeVersitDocument(embeddedDocument); - } else if (variant.type() == QVariant::String) { + } else if (variant.type() == QVariant::String || variant.type() == QVariant::StringList) { writeString(renderedValue, useUtf8); } else if (variant.type() == QVariant::ByteArray) { // One extra folding before the value and @@ -112,15 +128,31 @@ writeCrlf(); } +/*! Performs Quoted-Printable encoding and charset encoding on \a value as per vCard 2.1 spec. + Returns true if the value will need to be encoded with UTF-8, false if mCodec is sufficient. */ +bool QVCard21Writer::encodeVersitValue(QMultiHash& parameters, QString& value) +{ + // Quoted-Printable encode the value and add Quoted-Printable parameter, if necessary + if (quotedPrintableEncode(value)) + parameters.insert(QLatin1String("ENCODING"), QLatin1String("QUOTED-PRINTABLE")); + + // Add the CHARSET parameter, if necessary and encode in UTF-8 later + if (!mCodec->canEncode(value)) { + parameters.insert(QLatin1String("CHARSET"), QLatin1String("UTF-8")); + return true; + } + return false; +} + /*! * Encodes the \a parameters and writes it to the device. */ void QVCard21Writer::encodeParameters(const QMultiHash& parameters) { QList names = parameters.uniqueKeys(); - foreach (QString name, names) { + foreach (const QString& name, names) { QStringList values = parameters.values(name); - foreach (QString value, values) { + foreach (const QString& value, values) { writeString(QLatin1String(";")); QString typeParameterName(QLatin1String("TYPE")); if (name.length() > 0 && name != typeParameterName) { diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qvcard21writer_p.h --- a/qtcontactsmobility/src/versit/qvcard21writer_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qvcard21writer_p.h Mon May 03 12:24:20 2010 +0300 @@ -65,6 +65,7 @@ ~QVCard21Writer(); void encodeVersitProperty(const QVersitProperty& property); + bool encodeVersitValue(QMultiHash& parameters, QString& value); void encodeParameters(const QMultiHash& parameters); bool quotedPrintableEncode(QString& text) const; bool shouldBeQuotedPrintableEncoded(QChar chr) const; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qvcard30writer.cpp --- a/qtcontactsmobility/src/versit/qvcard30writer.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qvcard30writer.cpp Mon May 03 12:24:20 2010 +0300 @@ -79,7 +79,7 @@ encodeParameters(modifiedProperty.parameters()); writeString(QLatin1String(":")); - QString value; + QString renderedValue; if (variant.canConvert()) { QVersitDocument embeddedDocument = variant.value(); QByteArray data; @@ -90,14 +90,40 @@ subWriter.setDevice(&buffer); subWriter.encodeVersitDocument(embeddedDocument); QString documentString(mCodec->toUnicode(data)); - VersitUtils::backSlashEscape(documentString); - value = documentString; + backSlashEscape(documentString); + renderedValue = documentString; } else if (variant.type() == QVariant::String) { - value = variant.toString(); + renderedValue = variant.toString(); + backSlashEscape(renderedValue); + } else if (variant.type() == QVariant::StringList) { + // We need to backslash escape and concatenate the values in the list + QStringList values = property.variantValue().toStringList(); + QString separator; + if (property.valueType() == QVersitProperty::CompoundType) { + separator = QLatin1String(";"); + } else { + if (property.valueType() != QVersitProperty::ListType) { + qWarning("Variant value is a QStringList but the property's value type is neither " + "CompoundType or ListType"); + } + // Assume it's a ListType + separator = QLatin1String(","); + } + bool first = true; + foreach (QString value, values) { + if (!(value.isEmpty() && property.valueType() == QVersitProperty::ListType)) { + if (!first) { + renderedValue += separator; + } + backSlashEscape(value); + renderedValue += value; + first = false; + } + } } else if (variant.type() == QVariant::ByteArray) { - value = QLatin1String(variant.toByteArray().toBase64().data()); + renderedValue = QLatin1String(variant.toByteArray().toBase64().data()); } - writeString(value); + writeString(renderedValue); writeCrlf(); } @@ -110,7 +136,7 @@ foreach (QString nameString, names) { writeString(QLatin1String(";")); QStringList values = parameters.values(nameString); - VersitUtils::backSlashEscape(nameString); + backSlashEscape(nameString); writeString(nameString); writeString(QLatin1String("=")); for (int i=0; i& parameters); + static void backSlashEscape(QString& text); QHash mPropertyNameMappings; }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitcontactexporter.cpp --- a/qtcontactsmobility/src/versit/qversitcontactexporter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactexporter.cpp Mon May 03 12:24:20 2010 +0300 @@ -55,7 +55,7 @@ \brief The QVersitContactExporterDetailHandler class is an interface for clients wishing to implement custom export behaviour for certain contact details. \ingroup versit - + \sa QVersitContactExporter */ @@ -69,7 +69,7 @@ * 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. + * Returns true if the detail has been handled and requires no further 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. @@ -110,10 +110,32 @@ * An example usage of QVersitContactExporter * \snippet ../../doc/src/snippets/qtversitdocsample/qtversitdocsample.cpp Export example * + * \section1 Exporting group relationships + * The exporter does not handle QContactRelationships at all. + * + * Some managers use the \l{QContactRelationship::HasMember}{HasMember} QContactRelationship along + * with contacts of type \l{QContactType::TypeGroup}{TypeGroup} to indicate categorization of + * contacts. In vCard, categorization is represented by the CATEGORIES property, which has + * semantics most similar to the QContactTag detail. For contact manager backends that supports + * groups but not QContactTag, if the categorization information needs to be retained through + * CATEGORIES vCard properties, extra work can be done to convert from group relationships to + * QContactTag before passing the contact list to the exporter. Below is some example code that + * does this translation. + * + * \snippet ../../doc/src/snippets/qtversitdocsample/qtversitdocsample.cpp Export relationship example + * * \sa QVersitDocument, QVersitProperty, QVersitContactExporterDetailHandler, QVersitResourceHandler */ /*! + \enum QVersitContactExporter::Error + This enum specifies an error that occurred during the most recent call to exportContacts() + \value NoError The most recent operation was successful + \value EmptyContactError One of the contacts was empty + \value NoNameError One of the contacts has no QContactName field + */ + +/*! * Constructs a new contact exporter */ QVersitContactExporter::QVersitContactExporter() @@ -132,24 +154,61 @@ /*! * Converts \a contacts into a list of corresponding QVersitDocuments, using the format given by * \a versitType. + * Returns true on success. If any of the contacts could not be exported, false is returned and + * errors() will return a list describing the errors that occurred. The successfully exported + * documents will still be available via documents(). */ -QList QVersitContactExporter::exportContacts( +bool QVersitContactExporter::exportContacts( const QList& contacts, QVersitDocument::VersitType versitType) { - QList list; - foreach (QContact contact, contacts) { + int contactIndex = 0; + d->mDocuments.clear(); + d->mErrors.clear(); + bool ok = true; + foreach (const QContact& contact, contacts) { QVersitDocument versitDocument; versitDocument.setType(versitType); - d->exportContact(contact, versitDocument); - list.append(versitDocument); + QVersitContactExporter::Error error; + if (d->exportContact(contact, versitDocument, &error)) { + d->mDocuments.append(versitDocument); + } else { + d->mErrors.insert(contactIndex, error); + ok = false; + } + contactIndex++; } - return list; + return ok; +} + +/*! + * Returns the documents exported in the most recent call to exportContacts(). + * + * \sa exportContacts() + */ +QList QVersitContactExporter::documents() const +{ + return d->mDocuments; +} + +/*! + * Returns the map of errors encountered in the most recent call to exportContacts(). The key is + * the index into the input list of contacts and the value is the error that occurred on that + * contact. + * + * \sa exportContacts() + */ +QMap QVersitContactExporter::errors() const +{ + return d->mErrors; } /*! * Sets \a handler to be the handler for processing QContactDetails, or 0 to have no handler. + * + * Does not take ownership of the handler. The client should ensure the handler remains valid for + * the lifetime of the exporter. */ void QVersitContactExporter::setDetailHandler(QVersitContactExporterDetailHandler* handler) { @@ -166,6 +225,9 @@ /*! * Sets \a handler to be the handler to load files with, or 0 to have no handler. + * + * Does not take ownership of the handler. The client should ensure the handler remains valid for + * the lifetime of the exporter. */ void QVersitContactExporter::setResourceHandler(QVersitResourceHandler* handler) { @@ -180,17 +242,15 @@ return d->mResourceHandler; } -/*! \internal */ -QVersitDocument QVersitContactExporter::exportContact(const QContact& contact, - QVersitDocument::VersitType versitType) +// Deprecated: + +/*! + \deprecated + + Use the version of the function returning a bool, instead. +*/ +QList QVersitContactExporter::exportContacts(const QList& contacts) { - QList list; - list.append(contact); - return exportContacts(list, versitType).first(); + exportContacts(contacts, QVersitDocument::VCard30Type); + return documents(); } - -/*! \internal */ -QList QVersitContactExporter::unknownContactDetails() -{ - return QList(); -} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitcontactexporter.h --- a/qtcontactsmobility/src/versit/qversitcontactexporter.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactexporter.h Mon May 03 12:24:20 2010 +0300 @@ -70,11 +70,19 @@ class Q_VERSIT_EXPORT QVersitContactExporter { public: + enum Error { + NoError = 0, + EmptyContactError, + NoNameError + }; + QVersitContactExporter(); ~QVersitContactExporter(); - QList exportContacts(const QList& contacts, - QVersitDocument::VersitType versitType=QVersitDocument::VCard30Type); + bool exportContacts(const QList& contacts, + QVersitDocument::VersitType versitType); + QList documents() const; + QMap errors() const; void setDetailHandler(QVersitContactExporterDetailHandler* handler); QVersitContactExporterDetailHandler* detailHandler() const; @@ -82,14 +90,10 @@ void setResourceHandler(QVersitResourceHandler* handler); QVersitResourceHandler* resourceHandler() const; - // Deprecated: - QVersitDocument Q_DECL_DEPRECATED exportContact( - const QContact& contact, - QVersitDocument::VersitType versitType=QVersitDocument::VCard30Type); - QList Q_DECL_DEPRECATED unknownContactDetails(); + QList Q_DECL_DEPRECATED exportContacts(const QList& contacts); private: - QVersitContactExporterPrivate* d; + QVersitContactExporterPrivate* d; }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitcontactexporter_p.cpp --- a/qtcontactsmobility/src/versit/qversitcontactexporter_p.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactexporter_p.cpp Mon May 03 12:24:20 2010 +0300 @@ -65,6 +65,7 @@ #include #include #include +#include #include #include @@ -119,12 +120,17 @@ /*! * Export QT Contact into Versit Document. */ -void QVersitContactExporterPrivate::exportContact( +bool QVersitContactExporterPrivate::exportContact( const QContact& contact, - QVersitDocument& document) + QVersitDocument& document, + QVersitContactExporter::Error* error) { mVersitType = document.type(); QList allDetails = contact.details(); + if (allDetails.isEmpty()) { + *error = QVersitContactExporter::EmptyContactError; + return false; + } for (int i = 0; i < allDetails.size(); i++) { QContactDetail detail = allDetails.at(i); @@ -154,13 +160,19 @@ addProperty = encodeRev(property, detail); } else if (detail.definitionName() == QContactBirthday::DefinitionName) { encodeBirthDay(property, detail); - } else if (detail.definitionName() == QContactGeolocation::DefinitionName) { + } else if (detail.definitionName() == QContactGeoLocation::DefinitionName) { encodeGeoLocation(property, detail); } else if (detail.definitionName() == QContactNote::DefinitionName) { encodeNote(property, detail); } else if (detail.definitionName() == QContactOrganization::DefinitionName) { encodeOrganization(document, detail); addProperty = false; + } else if (detail.definitionName() == QContactRingtone::DefinitionName) { + addProperty = encodeRingtone(property, detail); + } else if (detail.definitionName() == QContactThumbnail::DefinitionName) { + addProperty = encodeThumbnail(property, detail); + if (!addProperty) + unknown = true; } else if (detail.definitionName() == QContactAvatar::DefinitionName){ addProperty = encodeAvatar(property, detail); if (!addProperty) @@ -170,6 +182,9 @@ } else if (detail.definitionName() == QContactNickname::DefinitionName) { encodeNickname(document, detail); addProperty = false; + } else if (detail.definitionName() == QContactTag::DefinitionName) { + encodeTag(document, detail); + addProperty = false; } else if (detail.definitionName() == QContactGender::DefinitionName) { encodeGender(property, detail); } else if (detail.definitionName() == QContactOnlineAccount::DefinitionName) { @@ -187,28 +202,51 @@ unknown = true; } - if (addProperty) + if (addProperty) { document.addProperty(property); + } if (mDetailHandler) mDetailHandler->postProcessDetail(contact, detail, !unknown, &document); } + + // Search through the document for FN or N properties. This will find it even if it was added + // by a detail handler. + if (!documentContainsName(document)) { + *error = QVersitContactExporter::NoNameError; + return false; + } + return true; } /*! - * Encode Contact Name Field Information into the Versit Document + * Returns true if and only if \a document has a "FN" or "N" property. + */ +bool QVersitContactExporterPrivate::documentContainsName(const QVersitDocument &document) +{ + foreach (const QVersitProperty& property, document.properties()) { + const QString& name = property.name(); + if (name == QLatin1String("FN") || name == QLatin1String("N")) + return true; + } + return false; +} + +/*! + * Encode Contact Name Field Information into the Versit Document */ void QVersitContactExporterPrivate::encodeName( - QVersitProperty& property, + QVersitProperty& property, const QContactDetail& detail) -{ +{ QContactName contactName = static_cast(detail); - 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()))); + property.setValue(QStringList() + << contactName.lastName() + << contactName.firstName() + << contactName.middleName() + << contactName.prefix() + << contactName.suffix()); + property.setValueType(QVersitProperty::CompoundType); } /*! @@ -220,11 +258,11 @@ { QContactPhoneNumber phoneNumber = static_cast(detail); encodeParameters(property, phoneNumber.contexts(), phoneNumber.subTypes()); - setEscapedValue(property,phoneNumber.number()); + property.setValue(phoneNumber.number()); } /*! - * Encode Email Field Information into the Versit Document + * Encode Email Field Information into the Versit Document */ void QVersitContactExporterPrivate::encodeEmail( QVersitProperty& property, @@ -232,11 +270,11 @@ { QContactEmailAddress emailAddress = static_cast(detail); encodeParameters(property, emailAddress.contexts()); - setEscapedValue(property,emailAddress.emailAddress()); + property.setValue(emailAddress.emailAddress()); } /*! - * Encode Address Field Information into the Versit Document + * Encode Address Field Information into the Versit Document */ void QVersitContactExporterPrivate::encodeAddress( QVersitProperty& property, @@ -244,14 +282,15 @@ { QContactAddress address = static_cast(detail); encodeParameters(property, address.contexts(), address.subTypes()); - // 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()))); + property.setValue(QStringList() + << address.postOfficeBox() + << QString() // Leave out the extended address field + << address.street() + << address.locality() + << address.region() + << address.postcode() + << address.country()); + property.setValueType(QVersitProperty::CompoundType); } /*! @@ -276,7 +315,7 @@ const QContactDetail& detail) { QContactGuid uid = static_cast(detail); - setEscapedValue(property,uid.guid()); + property.setValue(uid.guid()); } /*! @@ -334,7 +373,7 @@ const QContactDetail& detail) { QContactNote contactNote = static_cast(detail); - setEscapedValue(property,contactNote.note()); + property.setValue(contactNote.note()); } /*! @@ -345,10 +384,9 @@ const QContactDetail& detail) { QContactGeoLocation geoLocation = static_cast(detail); - QString value = - QString::number(geoLocation.longitude()) + QLatin1Char(',') + - QString::number(geoLocation.latitude()); - property.setValue(value); + property.setValue(QStringList() << QString::number(geoLocation.longitude()) + << QString::number(geoLocation.latitude())); + property.setValueType(QVersitProperty::CompoundType); } /*! @@ -362,26 +400,22 @@ if (organization.title().length() > 0) { QVersitProperty property; property.setName(QLatin1String("TITLE")); - setEscapedValue(property,organization.title()); + property.setValue(organization.title()); document.addProperty(property); } if (organization.name().length() > 0 || organization.department().size() > 0) { QVersitProperty property; property.setName(QLatin1String("ORG")); - QString value = escape(organization.name()); - QStringList departments(organization.department()); - if (departments.count() == 0) - value += QLatin1Char(';'); - foreach (QString department, departments) { - value += QLatin1Char(';'); - value += escape(department); - } - property.setValue(value); + QStringList values(organization.name()); + values.append(organization.department()); + property.setValue(values); + property.setValueType(QVersitProperty::CompoundType); document.addProperty(property); } - if (organization.logo().length() > 0) { + if (organization.logoUrl().isValid()) { QVersitProperty property; - if (encodeContentFromFile(organization.logo(), property)) { + // XXX TODO: FIXME! + if (encodeContentFromFile(organization.logoUrl().toString(), property)) { property.setName(QLatin1String("LOGO")); document.addProperty(property); } @@ -389,43 +423,68 @@ if (organization.assistantName().length() > 0) { QVersitProperty property; property.setName(QLatin1String("X-ASSISTANT")); - setEscapedValue(property,organization.assistantName()); + property.setValue(organization.assistantName()); document.addProperty(property); } if (organization.role().length() > 0) { QVersitProperty property; property.setName(QLatin1String("ROLE")); - setEscapedValue(property,organization.role()); + property.setValue(organization.role()); document.addProperty(property); } } +bool QVersitContactExporterPrivate::encodeRingtone(QVersitProperty &property, const QContactDetail &detail) +{ + QContactRingtone ringtone = static_cast(detail); + Q_ASSERT(property.name() == QLatin1String("SOUND")); + return encodeContentFromFile(ringtone.audioRingtoneUrl().toLocalFile(), property); +} + /*! - * Encode avatar content into the Versit Document + * Encode thumbnail content into the Versit Document + */ +bool QVersitContactExporterPrivate::encodeThumbnail( + QVersitProperty& property, + const QContactDetail& detail) +{ + QContactThumbnail contactThumbnail = static_cast(detail); + property.setName(QLatin1String("PHOTO")); + QImage image = contactThumbnail.thumbnail(); + if (image.isNull()) + return false; + QByteArray imageData; + QBuffer buffer(&imageData); + buffer.open(QIODevice::WriteOnly); + // Always store a pixmap as a PNG. + if (!image.save(&buffer, "PNG")) { + return false; + } + property.setValue(imageData); + property.insertParameter(QLatin1String("TYPE"), QLatin1String("PNG")); + return true; +} + +/*! + * Encode avatar URIs into the Versit Document */ bool QVersitContactExporterPrivate::encodeAvatar( QVersitProperty& property, const QContactDetail& detail) { + property.setName(QLatin1String("PHOTO")); QContactAvatar contactAvatar = static_cast(detail); - bool encoded = false; - QString propertyName; - if (contactAvatar.subType() == QContactAvatar::SubTypeImage) { - propertyName = QLatin1String("PHOTO"); - } else if (contactAvatar.subType() == QContactAvatar::SubTypeAudioRingtone) { - propertyName = QLatin1String("SOUND"); + QUrl imageUrl(contactAvatar.imageUrl()); + // XXX: fix up this mess: checking the scheme here and in encodeContentFromFile, + // organisation logo and ringtone are QStrings but avatar is a QUrl + if (!imageUrl.scheme().isEmpty() && !imageUrl.host().isEmpty()) { + property.insertParameter(QLatin1String("VALUE"), QLatin1String("URL")); + property.setValue(imageUrl.toString()); + return true; } else { - // NOP + return encodeContentFromFile(contactAvatar.imageUrl().toString(), property); } - if (propertyName.length() > 0) { - encoded = encodeContentFromFile(contactAvatar.avatar(), property); - if (!encoded) - encoded = encodeContentFromPixmap(contactAvatar.pixmap(), property); - if (encoded) - property.setName(propertyName); - } - return encoded; } /*! @@ -436,7 +495,7 @@ QContactDetail& detail) { QContactGender gender = static_cast(detail); - setEscapedValue(property,gender.gender()); + property.setValue(gender.gender()); } /*! @@ -448,27 +507,55 @@ { QContactNickname nicknameDetail = static_cast(detail); QVersitProperty property; - property.setName(QLatin1String("X-NICKNAME")); bool found = false; - foreach (QVersitProperty currentProperty, document.properties()) { + // XXX TODO: ensure it works for both X-NICKNAME and NICKNAME + foreach (const QVersitProperty& currentProperty, document.properties()) { if (currentProperty.name() == QLatin1String("X-NICKNAME")) { property = currentProperty; found = true; break; } } - QString value(property.value()); - if (found) - value += QLatin1Char(','); - QString nickname = escape(nicknameDetail.nickname()); - value.append(nickname); + QStringList value(property.variantValue().toStringList()); + if (!found) + property.setName(QLatin1String("X-NICKNAME")); + value.append(nicknameDetail.nickname()); property.setValue(value); + property.setValueType(QVersitProperty::ListType); // Replace the current property document.removeProperties(QLatin1String("X-NICKNAME")); document.addProperty(property); } /*! + * Encodes a contact tag into the Versit Document + */ +void QVersitContactExporterPrivate::encodeTag( + QVersitDocument& document, + const QContactDetail& detail) +{ + QContactTag tagDetail = static_cast(detail); + QVersitProperty property; + bool found = false; + foreach (const QVersitProperty& currentProperty, document.properties()) { + if (currentProperty.name() == QLatin1String("CATEGORIES")) { + property = currentProperty; + found = true; + break; + } + } + QStringList value(property.variantValue().toStringList()); + if (!found) + property.setName(QLatin1String("CATEGORIES")); + value.append(tagDetail.tag()); + property.setValue(value); + property.setValueType(QVersitProperty::ListType); + // Replace the current property + document.removeProperties(QLatin1String("CATEGORIES")); + document.addProperty(property); +} + +/*! * Encode anniversary information into Versit Document */ void QVersitContactExporterPrivate::encodeAnniversary( @@ -500,7 +587,7 @@ if (subTypes.contains(QContactOnlineAccount::SubTypeImpp)) name = QLatin1String("X-IMPP"); property.setName(name); - setEscapedValue(property,onlineAccount.accountUri()); + property.setValue(onlineAccount.accountUri()); } return encoded; } @@ -517,15 +604,15 @@ if (family.spouse().size()) { QVersitProperty property; property.setName(QLatin1String("X-SPOUSE")); - setEscapedValue(property,family.spouse()); + property.setValue(family.spouse()); document.addProperty(property); } if (family.children().size()) { QVersitProperty property; property.setName(QLatin1String("X-CHILDREN")); - QString children = family.children().join(QLatin1String(",")); - setEscapedValue(property,children); + property.setValue(family.children()); + property.setValueType(QVersitProperty::ListType); document.addProperty(property); } return false; @@ -544,7 +631,7 @@ QContactDisplayLabel displayLabel = static_cast(detail); if (displayLabel.label().size()) { encoded = true; - setEscapedValue(property,displayLabel.label()); + property.setValue(displayLabel.label()); } else { QContactDetail contactDetail; for (int i = 0; i < contact.details().count(); i++) { @@ -563,7 +650,7 @@ name.firstName().length() || name.lastName().length()) { encoded = true; - property.setValue(escape(value)); + property.setValue(value); } } return encoded; @@ -635,49 +722,3 @@ property.setValue(value); return encodeContent; } - -/*! - * 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; - } - property.setValue(imageData); - property.insertParameter(QLatin1String("TYPE"), QLatin1String("PNG")); - return true; -} - -/*! - * Escapes \a value if necessary and sets it to \a property - */ -void QVersitContactExporterPrivate::setEscapedValue( - QVersitProperty& property, - const QString& value) -{ - QString escapedValue(escape(value)); - property.setValue(escapedValue); -} - -/*! - * Escapes \a value if necessary. - * For vCard there is no concept of escaping the property values. - * Starting from 3.0 the property values having certain special - * characters should be escaped. - */ -QString QVersitContactExporterPrivate::escape(const QString& value) -{ - QString escaped(value); - if (mVersitType != QVersitDocument::VCard21Type) { - VersitUtils::backSlashEscape(escaped); - } - return escaped; -} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitcontactexporter_p.h --- a/qtcontactsmobility/src/versit/qversitcontactexporter_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactexporter_p.h Mon May 03 12:24:20 2010 +0300 @@ -70,9 +70,11 @@ QVersitContactExporterPrivate(); ~QVersitContactExporterPrivate(); - void exportContact(const QContact& contact, QVersitDocument& versitDocument); + bool exportContact(const QContact& contact, QVersitDocument& versitDocument, + QVersitContactExporter::Error* error); protected: + static bool documentContainsName(const QVersitDocument& document); void encodeName(QVersitProperty& property, const QContactDetail& detail); void encodePhoneNumber(QVersitProperty& property, const QContactDetail& detail); void encodeEmail(QVersitProperty& property, const QContactDetail& detail); @@ -86,11 +88,13 @@ void encodeOrganization(QVersitDocument& document, const QContactDetail& detail); void encodeGender(QVersitProperty& property, const QContactDetail& detail); void encodeNickname(QVersitDocument& document, const QContactDetail& detail); + void encodeTag(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 encodeRingtone(QVersitProperty& property, const QContactDetail& detail); + bool encodeThumbnail(QVersitProperty& property, const QContactDetail& detail); + bool encodeAvatar(QVersitProperty& property, const QContactDetail& detail); bool encodeDisplayLabel(QVersitProperty& property, const QContactDetail& detail, const QContact& contact); @@ -99,11 +103,10 @@ const QStringList& contexts, const QStringList& subTypes=QStringList()); bool encodeContentFromFile(const QString& resourcePath, QVersitProperty& property); - bool encodeContentFromPixmap(const QPixmap& pixmap, QVersitProperty& property); - void setEscapedValue(QVersitProperty& property,const QString& value); - QString escape(const QString& value); public: // Data + QList mDocuments; + QMap mErrors; QVersitContactExporterDetailHandler* mDetailHandler; QVersitDefaultResourceHandler* mDefaultResourceHandler; QVersitResourceHandler* mResourceHandler; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitcontactimporter.cpp --- a/qtcontactsmobility/src/versit/qversitcontactimporter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactimporter.cpp Mon May 03 12:24:20 2010 +0300 @@ -39,6 +39,7 @@ ** ****************************************************************************/ +#include "qcontactmanagerengine.h" #include "qversitcontactimporter.h" #include "qversitcontactimporter_p.h" #include "qversitdocument.h" @@ -52,9 +53,9 @@ \preliminary \brief The QVersitContactImporterPropertyHandler class is an interface for clients wishing to implement custom import behaviour for versit properties - + \ingroup versit - + \sa QVersitContactImporter */ @@ -68,7 +69,7 @@ * 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(). + * \l QVersitContactImporter::importDocuments(). * * Returns true if the property has been handled and requires no further processing, false * otherwise. @@ -82,7 +83,7 @@ * 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(). + * \l QVersitContactImporter::importDocuments(). * \a alreadyProcessed is true if the detail has already been processed either by * \l preProcessProperty() or by QVersitContactImporter itself. * @@ -116,11 +117,29 @@ * An example usage of QVersitContactImporter * \snippet ../../doc/src/snippets/qtversitdocsample/qtversitdocsample.cpp Import example * + * \section1 Importing categories + * The importer imports the vCard CATEGORIES property by converting each category to a QContactTag. + * Some managers may not have support for QContactTag, but instead support categorization using the + * \l{QContactRelationship::HasMember}{HasMember} QContactRelationship along with contacts of type + * \l{QContactType::TypeGroup}{TypeGroup}. For these backends, if the categorization information + * needs to be retained through group relationships, extra work needs to be done to do the + * conversion. Below is some example code that does this translation. + * + * \snippet ../../doc/src/snippets/qtversitdocsample/qtversitdocsample.cpp Import relationship example + * * \sa QVersitDocument, QVersitReader, QVersitContactImporterPropertyHandler */ +/*! + \enum QVersitContactImporter::Error + This enum specifies an error that occurred during the most recent call to importDocuments() + \value NoError The most recent operation was successful + \value InvalidDocumentError One of the documents is not a vCard + \value EmptyDocumentError One of the documents is empty + */ + /*! Constructs a new importer */ -QVersitContactImporter::QVersitContactImporter() +QVersitContactImporter::QVersitContactImporter() : d(new QVersitContactImporterPrivate) { } @@ -132,22 +151,64 @@ } /*! - * Converts \a documents into a corresponding list of QContacts. + * Converts \a documents into a corresponding list of QContacts. After calling this, the converted + * contacts can be retrieved by calling contacts(). + * Returns true on success. If any of the documents cannot be imported as contacts (eg. they aren't + * vCards), false is returned and errors() will return a list describing the errors that occurred. + * The successfully imported documents will still be available via contacts(). + * + * \sa contacts(), errors() */ -QList QVersitContactImporter::importContacts(const QList& documents) +bool QVersitContactImporter::importDocuments(const QList& documents) { - QList list; - int i = 0; - foreach (QVersitDocument document, documents) { - list.append(d->importContact(document, i)); - i++; + int documentIndex = 0; + int contactIndex = 0; + d->mContacts.clear(); + d->mErrors.clear(); + bool ok = true; + foreach (const QVersitDocument& document, documents) { + QContact contact; + QVersitContactImporter::Error error; + if (d->importContact(document, contactIndex, &contact, &error)) { + d->mContacts.append(contact); + contactIndex++; + } else { + d->mErrors.insert(documentIndex, error); + ok = false; + } + documentIndex++; } - return list; + return ok; +} + +/*! + * Returns the contacts imported in the most recent call to importDocuments(). + * + * \sa importDocuments() + */ +QList QVersitContactImporter::contacts() const +{ + return d->mContacts; +} + +/*! + * Returns the map of errors encountered in the most recent call to importDocuments(). The key is + * the index into the input list of documents and the value is the error that occurred on that + * document. + * + * \sa importDocuments() + */ +QMap QVersitContactImporter::errors() const +{ + return d->mErrors; } /*! * Sets \a handler to be the handler for processing QVersitProperties, or 0 to have no handler. + * + * Does not take ownership of the handler. The client should ensure the handler remains valid for + * the lifetime of the exporter. */ void QVersitContactImporter::setPropertyHandler(QVersitContactImporterPropertyHandler* handler) { @@ -164,6 +225,9 @@ /*! * Sets \a handler to be the handler to save files with, or 0 to have no handler. + * + * Does not take ownership of the handler. The client should ensure the handler remains valid for + * the lifetime of the exporter. */ void QVersitContactImporter::setResourceHandler(QVersitResourceHandler* handler) { @@ -178,40 +242,13 @@ return d->mResourceHandler; } -/*! \internal */ -void QVersitContactImporter::setImagePath(const QString& path) -{ - Q_UNUSED(path) -} - -/*! \internal */ -QString QVersitContactImporter::imagePath() const -{ - return QString(); -} - -/*! \internal */ -void QVersitContactImporter::setAudioClipPath(const QString& path) -{ - Q_UNUSED(path) -} +// Deprecated: -/*! \internal */ -QString QVersitContactImporter::audioClipPath() const -{ - return QString(); -} - -/*! \internal */ -QContact QVersitContactImporter::importContact(const QVersitDocument& versitDocument) +/*! \deprecated + Use the version of the function that returns a bool instead. + */ +QList QVersitContactImporter::importContacts(const QList &documents) { - QList list; - list.append(versitDocument); - return importContacts(list).first(); + importDocuments(documents); + return contacts(); } - -/*! \internal */ -QList QVersitContactImporter::unknownVersitProperties() -{ - return QList(); -} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitcontactimporter.h --- a/qtcontactsmobility/src/versit/qversitcontactimporter.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactimporter.h Mon May 03 12:24:20 2010 +0300 @@ -73,25 +73,26 @@ class Q_VERSIT_EXPORT QVersitContactImporter { public: + enum Error { + NoError = 0, + InvalidDocumentError, + EmptyDocumentError + }; + QVersitContactImporter(); ~QVersitContactImporter(); - // XXX We need some way of importing/exporting groups and "self-contact" from vCard. - QList importContacts(const QList& documents); + bool importDocuments(const QList& documents); + QList contacts() const; + QMap errors() const; void setPropertyHandler(QVersitContactImporterPropertyHandler* handler); QVersitContactImporterPropertyHandler* propertyHandler() const; - + void setResourceHandler(QVersitResourceHandler* handler); QVersitResourceHandler* resourceHandler() const; - // 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(); + QList Q_DECL_DEPRECATED importContacts(const QList& documents); private: QVersitContactImporterPrivate* d; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitcontactimporter_p.cpp --- a/qtcontactsmobility/src/versit/qversitcontactimporter_p.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactimporter_p.cpp Mon May 03 12:24:20 2010 +0300 @@ -45,6 +45,7 @@ #include "qversitproperty.h" #include "qmobilityglobal.h" +#include #include #include #include @@ -65,6 +66,8 @@ #include #include #include +#include +#include #include #include @@ -122,63 +125,88 @@ /*! * Generates a QContact from \a versitDocument. */ -QContact QVersitContactImporterPrivate::importContact( - const QVersitDocument& document, int contactIndex) +bool QVersitContactImporterPrivate::importContact( + const QVersitDocument& document, int contactIndex, QContact* contact, + QVersitContactImporter::Error* error) { - QContact contact; + if (document.type() != QVersitDocument::VCard21Type + && document.type() != QVersitDocument::VCard30Type) { + *error = QVersitContactImporter::InvalidDocumentError; + return false; + } const QList properties = document.properties(); - foreach (QVersitProperty property, properties) { - if (mPropertyHandler - && mPropertyHandler->preProcessProperty(document, property, contactIndex, &contact)) - continue; + if (properties.size() == 0) { + *error = QVersitContactImporter::EmptyDocumentError; + return false; + } - QPair detailDefinition = - mDetailMappings.value(property.name()); - QString detailDefinitionName = detailDefinition.first; - bool success = false; - bool known = true; - if (detailDefinitionName == QContactAddress::DefinitionName) { - success = createAddress(property, &contact); - } else if (detailDefinitionName == QContactName::DefinitionName) { - success = createName(property, &contact); - } else if (detailDefinitionName == QContactBirthday::DefinitionName) { - success = createBirthday(property, &contact); - } else if (detailDefinitionName == QContactGeolocation::DefinitionName){ - success = createGeoLocation(property, &contact); - } else if (detailDefinitionName == QContactOrganization::DefinitionName) { - success = createOrganization(property, &contact); - } else if (detailDefinitionName == QContactNickname::DefinitionName) { - success = createNicknames(property, &contact); - } else if (detailDefinitionName == QContactAvatar::DefinitionName) { - success = createAvatar(property,detailDefinition.second, &contact); - } else if (detailDefinitionName == QContactTimestamp::DefinitionName) { - success = createTimeStamp(property, &contact); - } else if (detailDefinitionName == QContactPhoneNumber::DefinitionName) { - success = createPhone(property, &contact); - } else if (detailDefinitionName == QContactAnniversary::DefinitionName) { - success = createAnniversary(property, &contact); - } else if (detailDefinitionName == QContactFamily::DefinitionName) { - success = createFamily(property, &contact); - } else if (detailDefinitionName == QContactOnlineAccount::DefinitionName) { - success = createOnlineAccount(property, &contact); - } else if (detailDefinitionName == QContactDisplayLabel::DefinitionName) { - // This actually sets the QContactName's customLabel field (not QContactDisplayLabel) - success = createLabel(property, &contact); - } else { - known = false; - } - - if (mPropertyHandler) - success = mPropertyHandler->postProcessProperty( - document, property, success, contactIndex, &contact) || success; - if (!known && !success) - createNameValueDetail(property, &contact); + // First, do the properties with PREF set so they appear first in the contact details + foreach (const QVersitProperty& property, properties) { + if (property.parameters().contains(QLatin1String("TYPE"), QLatin1String("PREF"))) + importProperty(document, property, contactIndex, contact); + } + // ... then, do the rest of the properties. + foreach (const QVersitProperty& property, properties) { + if (!property.parameters().contains(QLatin1String("TYPE"), QLatin1String("PREF"))) + importProperty(document, property, contactIndex, contact); } - contact.setType(QContactType::TypeContact); - return contact; + contact->setType(QContactType::TypeContact); + QContactManagerEngine::setContactDisplayLabel(contact, QVersitContactImporterPrivate::synthesizedDisplayLabel(*contact)); + return true; } +void QVersitContactImporterPrivate::importProperty( + const QVersitDocument& document, const QVersitProperty& property, int contactIndex, + QContact* contact) const +{ + if (mPropertyHandler + && mPropertyHandler->preProcessProperty(document, property, contactIndex, contact)) + return; + + QPair detailDefinition = + mDetailMappings.value(property.name()); + QString detailDefinitionName = detailDefinition.first; + bool success = false; + if (detailDefinitionName == QContactAddress::DefinitionName) { + success = createAddress(property, contact); + } else if (detailDefinitionName == QContactName::DefinitionName) { + success = createName(property, contact); + } else if (detailDefinitionName == QContactBirthday::DefinitionName) { + success = createBirthday(property, contact); + } else if (detailDefinitionName == QContactGeoLocation::DefinitionName){ + success = createGeoLocation(property, contact); + } else if (detailDefinitionName == QContactOrganization::DefinitionName) { + success = createOrganization(property, contact); + } else if (detailDefinitionName == QContactNickname::DefinitionName) { + success = createNicknames(property, contact); + } else if (detailDefinitionName == QContactRingtone::DefinitionName) { + success = createRingtone(property, contact); + } else if (detailDefinitionName == QContactThumbnail::DefinitionName) { + success = createThumbnail(property, contact); + } else if (detailDefinitionName == QContactTimestamp::DefinitionName) { + success = createTimeStamp(property, contact); + } else if (detailDefinitionName == QContactPhoneNumber::DefinitionName) { + success = createPhone(property, contact); + } else if (detailDefinitionName == QContactAnniversary::DefinitionName) { + success = createAnniversary(property, contact); + } else if (detailDefinitionName == QContactFamily::DefinitionName) { + success = createFamily(property, contact); + } else if (detailDefinitionName == QContactOnlineAccount::DefinitionName) { + success = createOnlineAccount(property, contact); + } else if (detailDefinitionName == QContactTag::DefinitionName) { + success = createTags(property, contact); + } else if (detailDefinitionName == QContactDisplayLabel::DefinitionName) { + // This actually sets the QContactName's customLabel field (not QContactDisplayLabel) + success = createCustomLabel(property, contact); + } else { + // Look up mDetailMappings for a simple mapping from property to detail. + success = createNameValueDetail(property, contact); + } + + if (mPropertyHandler) + mPropertyHandler->postProcessProperty(document, property, success, contactIndex, contact); +} /*! * Creates a QContactName from \a property */ @@ -189,14 +217,18 @@ QContactDetail detail = contact->detail(QContactName::DefinitionName); if (!detail.isEmpty()) { // If multiple name properties exist, - // discard all except the first occurence - if (!detail.value(QContactName::FieldFirst).isEmpty()) + // discard all except the first occurrence + if (!detail.value(QContactName::FieldFirstName).isEmpty()) return false; else name = QContactName(static_cast(detail)); } - QStringList values = property.value().split(QLatin1Char(';')); + QVariant variant = property.variantValue(); + if (property.valueType() != QVersitProperty::CompoundType + || variant.type() != QVariant::StringList) + return false; + QStringList values = variant.toStringList(); name.setLastName(takeFirst(values)); name.setFirstName(takeFirst(values)); name.setMiddleName(takeFirst(values)); @@ -228,19 +260,23 @@ const QVersitProperty& property, QContact* contact) const { QContactAddress address; - - QStringList addressParts = property.value().split(QLatin1Char(';')); + + QVariant variant = property.variantValue(); + if (property.valueType() != QVersitProperty::CompoundType + || variant.type() != QVariant::StringList) + return false; + QStringList addressParts = variant.toStringList(); address.setPostOfficeBox(takeFirst(addressParts)); // There is no setter for the Extended Address in QContactAddress: if (!addressParts.isEmpty()) - addressParts.removeFirst(); + addressParts.removeFirst(); address.setStreet(takeFirst(addressParts)); address.setLocality(takeFirst(addressParts)); address.setRegion(takeFirst(addressParts)); address.setPostcode(takeFirst(addressParts)); address.setCountry(takeFirst(addressParts)); address.setSubTypes(extractSubTypes(property)); - + saveDetailWithContext(contact, &address, extractContexts(property)); return true; } @@ -256,7 +292,7 @@ mDetailMappings.value(property.name()); QString fieldName = detailNameAndFieldName.second; QList organizations = contact->details(); - foreach(QContactOrganization current, organizations) { + foreach(const QContactOrganization& current, organizations) { if (current.value(fieldName).length() == 0) { organization = current; break; @@ -268,7 +304,7 @@ organization.setTitle(property.value()); } else if (fieldName == QContactOrganization::FieldRole) { organization.setRole(property.value()); - } else if (fieldName == QContactOrganization::FieldLogo) { + } else if (fieldName == QContactOrganization::FieldLogoUrl) { setOrganizationLogo(organization, property); } else if (fieldName == QContactOrganization::FieldAssistantName) { organization.setAssistantName(property.value()); @@ -286,16 +322,12 @@ void QVersitContactImporterPrivate::setOrganizationNames( QContactOrganization& organization, const QVersitProperty& property) const { - QString value = property.value(); - int firstSemicolon = value.indexOf(QLatin1Char(';')); - if (firstSemicolon >= 0) { - organization.setName(value.left(firstSemicolon)); - QString departmentsStr(value.mid(firstSemicolon+1)); - QStringList departments = - departmentsStr.split(QLatin1Char(';'), QString::SkipEmptyParts); - organization.setDepartment(departments); - } else { - organization.setName(value); + QVariant variant = property.variantValue(); + if (property.valueType() == QVersitProperty::CompoundType + && variant.type() == QVariant::StringList) { + QStringList values = variant.toStringList(); + organization.setName(takeFirst(values)); + organization.setDepartment(values); } } @@ -309,7 +341,7 @@ QByteArray data; saveDataFromProperty(property, &location, &data); if (!location.isEmpty()) - org.setLogo(location); + org.setLogoUrl(QUrl(location)); } /*! @@ -369,12 +401,36 @@ bool QVersitContactImporterPrivate::createNicknames( const QVersitProperty& property, QContact* contact) const { - QStringList values = property.value().split(QLatin1Char(','), QString::SkipEmptyParts); + QVariant variant = property.variantValue(); + if (property.valueType() != QVersitProperty::ListType + || variant.type() != QVariant::StringList) + return false; + QStringList values = variant.toStringList(); QStringList contexts = extractContexts(property); - foreach(QString value, values) { + foreach(const QString& value, values) { QContactNickname nickName; nickName.setNickname(value); - saveDetailWithContext(contact, &nickName, extractContexts(property)); + saveDetailWithContext(contact, &nickName, contexts); + } + return true; +} + +/*! + * Creates QContactTags from \a property and adds them to \a contact + */ +bool QVersitContactImporterPrivate::createTags( + const QVersitProperty& property, QContact* contact) const +{ + QVariant variant = property.variantValue(); + if (property.valueType() != QVersitProperty::ListType + || variant.type() != QVariant::StringList) + return false; + QStringList values = variant.toStringList(); + QStringList contexts = extractContexts(property); + foreach(const QString& value, values) { + QContactTag tag; + tag.setTag(value); + saveDetailWithContext(contact, &tag, contexts); } return true; } @@ -384,7 +440,7 @@ */ bool QVersitContactImporterPrivate::createOnlineAccount( const QVersitProperty& property, QContact* contact) const -{ +{ QContactOnlineAccount onlineAccount; onlineAccount.setAccountUri(property.value()); if (property.name() == QLatin1String("X-SIP")) { @@ -394,7 +450,8 @@ onlineAccount.setSubTypes(subTypes); } else if (property.name() == QLatin1String("X-IMPP") || - property.name() == QLatin1String("IMPP")) { + property.name() == QLatin1String("IMPP") || + property.name() == QLatin1String("X-JABBER")) { onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeImpp); } else { @@ -405,39 +462,64 @@ return true; } +bool QVersitContactImporterPrivate::createRingtone(const QVersitProperty &property, + QContact *contact) const +{ + QString location; + QByteArray data; + if (saveDataFromProperty(property, &location, &data) && !location.isEmpty()) { + QContactRingtone ringtone; + ringtone.setAudioRingtoneUrl(location); + saveDetailWithContext(contact, &ringtone, extractContexts(property)); + return true; + } + return false; +} + /*! * Creates a QContactAvatar from \a property */ -bool QVersitContactImporterPrivate::createAvatar( - const QVersitProperty& property, const QString& subType, QContact* contact) const +bool QVersitContactImporterPrivate::createThumbnail( + const QVersitProperty& property, QContact* contact) const { QString location; QByteArray data; - if (!(saveDataFromProperty(property, &location, &data))) - return false; + bool success = false; - QContactAvatar avatar; - if (!location.isEmpty()) - avatar.setAvatar(location); - if (subType == QContactAvatar::SubTypeImage && !data.isEmpty()) { - QPixmap pixmap; - if (pixmap.loadFromData(data)) - avatar.setPixmap(pixmap); + if (saveDataFromProperty(property, &location, &data) && !location.isEmpty()) { + QContactAvatar avatar; + avatar.setImageUrl(location); + saveDetailWithContext(contact, &avatar, extractContexts(property)); + success = true; } - avatar.setSubType(subType); + if (!data.isEmpty()) { + QImage image; + if (image.loadFromData(data)) { + QContactThumbnail thumbnail = contact->detail(); + // In the case of multiple thumbnails, pick the smallest one. + if (thumbnail.isEmpty() || image.byteCount() < thumbnail.thumbnail().byteCount()) { + thumbnail.setThumbnail(image); + } + saveDetailWithContext(contact, &thumbnail, extractContexts(property)); + success = true; + } + } - saveDetailWithContext(contact, &avatar, extractContexts(property)); - return true; + return success; } /*! - * Creates a QContactGeolocation from \a property + * Creates a QContactGeoLocation from \a property */ bool QVersitContactImporterPrivate::createGeoLocation( const QVersitProperty& property, QContact* contact) const { QContactGeoLocation geo; - QStringList values = property.value().split(QLatin1Char(',')); + QVariant variant = property.variantValue(); + if (property.valueType() != QVersitProperty::CompoundType + || variant.type() != QVariant::StringList) + return false; + QStringList values = variant.toStringList(); geo.setLongitude(takeFirst(values).toDouble()); geo.setLatitude(takeFirst(values).toDouble()); @@ -456,7 +538,12 @@ if (property.name() == QLatin1String("X-SPOUSE")) { family.setSpouse(val); } else if (property.name() == QLatin1String("X-CHILDREN")) { - family.setChildren(val.split(QLatin1String(","))); + QVariant variant = property.variantValue(); + if (property.valueType() != QVersitProperty::ListType + || variant.type() != QVariant::StringList) + return false; + QStringList values = variant.toStringList(); + family.setChildren(values); } saveDetailWithContext(contact, &family, extractContexts(property)); @@ -484,7 +571,7 @@ /*! * Creates a simple name-value contact detail. */ -bool QVersitContactImporterPrivate::createLabel( +bool QVersitContactImporterPrivate::createCustomLabel( const QVersitProperty& property, QContact* contact) const { QContactName name; @@ -504,11 +591,11 @@ */ QStringList QVersitContactImporterPrivate::extractContexts( const QVersitProperty& property) const -{ - QStringList types = +{ + QStringList types = property.parameters().values(QLatin1String("TYPE")); QStringList contexts; - foreach (QString type, types) { + foreach (const QString& type, types) { QString value = mContextMappings.value(type); if (value.length() > 0) contexts.append(value); @@ -522,10 +609,10 @@ QStringList QVersitContactImporterPrivate::extractSubTypes( const QVersitProperty& property) const { - QStringList types = + QStringList types = property.parameters().values(QLatin1String("TYPE")); QStringList subTypes; - foreach (QString type, types) { + foreach (const QString& type, types) { QString subType = mSubTypeMappings.value(type); if (subType.length() > 0) subTypes += subType; @@ -607,3 +694,66 @@ detail->setContexts(contexts); contact->saveDetail(detail); } + +/*! Synthesize the display label from the name of the contact, or, failing that, the nickname of +the contact, or failing that, the organisation of the contact. +Returns the synthesized display label. + */ +QString QVersitContactImporterPrivate::synthesizedDisplayLabel(const QContact& contact) +{ + /* XXX This is copied and modified from QContactManagerEngine. This should be made a public + static function in QCME and called here */ + QList allNames = contact.details(); + + const QLatin1String space(" "); + + // synthesize the display label from the name. + foreach (const QContactName& name, allNames) { + if (!name.customLabel().isEmpty()) { + // default behaviour is to allow the user to define a custom display label. + return name.customLabel(); + } + + QString result; + if (!name.value(QContactName::FieldPrefix).trimmed().isEmpty()) { + result += name.value(QContactName::FieldPrefix); + } + if (!name.value(QContactName::FieldFirstName).trimmed().isEmpty()) { + if (!result.isEmpty()) + result += space; + result += name.value(QContactName::FieldFirstName); + } + if (!name.value(QContactName::FieldMiddleName).trimmed().isEmpty()) { + if (!result.isEmpty()) + result += space; + result += name.value(QContactName::FieldMiddleName); + } + if (!name.value(QContactName::FieldLastName).trimmed().isEmpty()) { + if (!result.isEmpty()) + result += space; + result += name.value(QContactName::FieldLastName); + } + if (!name.value(QContactName::FieldSuffix).trimmed().isEmpty()) { + if (!result.isEmpty()) + result += space; + result += name.value(QContactName::FieldSuffix); + } + if (!result.isEmpty()) + return result; + } + + QList allNicknames = contact.details(); + foreach (const QContactNickname& nickname, allNicknames) { + if (!nickname.nickname().isEmpty()) + return nickname.nickname(); + } + + /* Well, we had no non empty names. if we have orgs, fall back to those */ + QList allOrgs = contact.details(); + foreach (const QContactOrganization& org, allOrgs) { + if (!org.name().isEmpty()) + return org.name(); + } + + return QString(); +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitcontactimporter_p.h --- a/qtcontactsmobility/src/versit/qversitcontactimporter_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitcontactimporter_p.h Mon May 03 12:24:20 2010 +0300 @@ -74,10 +74,15 @@ QVersitContactImporterPrivate(); ~QVersitContactImporterPrivate(); - QContact importContact(const QVersitDocument& versitDocument, int contactIndex); + bool importContact(const QVersitDocument& versitDocument, int contactIndex, + QContact* contact, QVersitContactImporter::Error* error); QList unconvertedVersitProperties(); + static QString synthesizedDisplayLabel(const QContact& contact); + private: + void importProperty(const QVersitDocument& document, const QVersitProperty& property, + int contactIndex, QContact* contact) const; bool createName(const QVersitProperty& property, QContact* contact) const; bool createPhone(const QVersitProperty& property, QContact* contact) const; bool createAddress(const QVersitProperty& property, QContact* contact) const; @@ -88,12 +93,14 @@ 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 createTags(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 createRingtone(const QVersitProperty& property, QContact* contact) const; + bool createThumbnail(const QVersitProperty& property, 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; + bool createCustomLabel(const QVersitProperty& property, QContact* contact) const; QStringList extractContexts(const QVersitProperty& property) const; QStringList extractSubTypes(const QVersitProperty& property) const; QString takeFirst(QList& list) const; @@ -104,11 +111,12 @@ QContact* contact, QContactDetail* detail, const QStringList& contexts) const; public: // Data + QList mContacts; + QMap mErrors; QVersitContactImporterPropertyHandler* mPropertyHandler; QVersitDefaultResourceHandler* mDefaultResourceHandler; QVersitResourceHandler* mResourceHandler; -private: // Data QHash > mDetailMappings; QHash mContextMappings; QHash mSubTypeMappings; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitdefs_p.h --- a/qtcontactsmobility/src/versit/qversitdefs_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitdefs_p.h Mon May 03 12:24:20 2010 +0300 @@ -75,6 +75,9 @@ #include #include #include +#include +#include +#include QTM_BEGIN_NAMESPACE @@ -88,62 +91,66 @@ //! [Property name mappings] // Mappings from versit property names to Qt contact details const VersitContactDetailMapping versitContactDetailMappings[] = { - {"ADR", QContactAddress::DefinitionName.str, + {"ADR", QContactAddress::DefinitionName.latin1(), ""}, - {"BDAY", QContactBirthday::DefinitionName.str, - QContactBirthday::FieldBirthday.str}, - {"FN", QContactDisplayLabel::DefinitionName.str, + {"BDAY", QContactBirthday::DefinitionName.latin1(), + QContactBirthday::FieldBirthday.latin1()}, + {"CATEGORIES", QContactTag::DefinitionName.latin1(), + QContactTag::FieldTag.latin1()}, + {"FN", QContactDisplayLabel::DefinitionName.latin1(), ""}, - {"GEO", QContactGeolocation::DefinitionName.str, + {"GEO", QContactGeoLocation::DefinitionName.latin1(), ""}, - {"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, + {"EMAIL", QContactEmailAddress::DefinitionName.latin1(), + QContactEmailAddress::FieldEmailAddress.latin1()}, + {"IMPP", QContactOnlineAccount::DefinitionName.latin1(), + QContactOnlineAccount::SubTypeImpp.latin1()}, + {"LOGO", QContactOrganization::DefinitionName.latin1(), + QContactOrganization::FieldLogoUrl.latin1()}, + {"N", QContactName::DefinitionName.latin1(), ""}, - {"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, + {"NICKNAME", QContactNickname::DefinitionName.latin1(), + QContactNickname::FieldNickname.latin1()}, + {"NOTE", QContactNote::DefinitionName.latin1(), + QContactNote::FieldNote.latin1()}, + {"ORG", QContactOrganization::DefinitionName.latin1(), + QContactOrganization::FieldName.latin1()}, + {"PHOTO", QContactThumbnail::DefinitionName.latin1(), + ""}, + {"REV", QContactTimestamp::DefinitionName.latin1(), ""}, - {"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, + {"ROLE", QContactOrganization::DefinitionName.latin1(), + QContactOrganization::FieldRole.latin1()}, + {"SOUND", QContactRingtone::DefinitionName.latin1(), + QContactRingtone::FieldAudioRingtoneUrl.latin1()}, + {"TEL", QContactPhoneNumber::DefinitionName.latin1(), + QContactPhoneNumber::FieldNumber.latin1()}, + {"TITLE", QContactOrganization::DefinitionName.latin1(), + QContactOrganization::FieldTitle.latin1()}, + {"UID", QContactGuid::DefinitionName.latin1(), + QContactGuid::FieldGuid.latin1()}, + {"URL", QContactUrl::DefinitionName.latin1(), + QContactUrl::FieldUrl.latin1()}, + {"X-ANNIVERSARY", QContactAnniversary::DefinitionName.latin1(), ""}, - {"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-ASSISTANT", QContactOrganization::DefinitionName.latin1(), + QContactOrganization::FieldAssistantName.latin1()}, + {"X-CHILDREN", QContactFamily::DefinitionName.latin1(), + QContactFamily::FieldChildren.latin1()}, + {"X-EPOCSECONDNAME",QContactNickname::DefinitionName.latin1(), + QContactNickname::FieldNickname.latin1()}, + {"X-GENDER", QContactGender::DefinitionName.latin1(), + QContactGender::FieldGender.latin1()}, + {"X-IMPP", QContactOnlineAccount::DefinitionName.latin1(), + QContactOnlineAccount::SubTypeImpp.latin1()}, + {"X-JABBER", QContactOnlineAccount::DefinitionName.latin1(), + QContactOnlineAccount::SubTypeImpp.latin1()}, + {"X-NICKNAME", QContactNickname::DefinitionName.latin1(), + QContactNickname::FieldNickname.latin1()}, + {"X-SIP", QContactOnlineAccount::DefinitionName.latin1(), ""}, - {"X-SPOUSE", QContactFamily::DefinitionName.str, - QContactFamily::FieldSpouse.str} + {"X-SPOUSE", QContactFamily::DefinitionName.latin1(), + QContactFamily::FieldSpouse.latin1()} }; //! [Property name mappings] @@ -155,27 +162,27 @@ // Mappings from versit TYPE parameters to Qt contact detail contexts const VersitMapping versitContextMappings[] = { - {"HOME", QContactDetail::ContextHome.str}, - {"WORK", QContactDetail::ContextWork.str}, + {"HOME", QContactDetail::ContextHome.latin1()}, + {"WORK", QContactDetail::ContextWork.latin1()}, }; //! [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} + {"DOM", QContactAddress::SubTypeDomestic.latin1()}, + {"INTL", QContactAddress::SubTypeInternational.latin1()}, + {"POSTAL", QContactAddress::SubTypePostal.latin1()}, + {"PARCEL", QContactAddress::SubTypeParcel.latin1()}, + {"VOICE", QContactPhoneNumber::SubTypeVoice.latin1()}, + {"CELL", QContactPhoneNumber::SubTypeMobile.latin1()}, + {"MODEM", QContactPhoneNumber::SubTypeModem.latin1()}, + {"CAR", QContactPhoneNumber::SubTypeCar.latin1()}, + {"VIDEO", QContactPhoneNumber::SubTypeVideo.latin1()}, + {"FAX", QContactPhoneNumber::SubTypeFax.latin1()}, + {"BBS", QContactPhoneNumber::SubTypeBulletinBoardSystem.latin1()}, + {"PAGER", QContactPhoneNumber::SubTypePager.latin1()}, + {"SWIS", QContactOnlineAccount::SubTypeVideoShare.latin1()}, + {"VOIP", QContactOnlineAccount::SubTypeSipVoip.latin1()} }; //! [Property type parameter mappings] diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitdocument.cpp --- a/qtcontactsmobility/src/versit/qversitdocument.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitdocument.cpp Mon May 03 12:24:20 2010 +0300 @@ -45,28 +45,43 @@ #include -QTM_USE_NAMESPACE +QTM_BEGIN_NAMESPACE /*! \class QVersitDocument \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 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. - + \sa QVersitProperty */ +/*! + \enum QVersitDocument::VersitType + This enum describes a versit document type and version. + \value InvalidType No type specified or a document with an invalid type was parsed + \value VCard21Type vCard version 2.1 + \value VCard30Type vCard version 3.0 + */ + /*! Constructs a new empty document */ QVersitDocument::QVersitDocument() : d(new QVersitDocumentPrivate()) { } +/*! Constructs a new empty document with the type set to \a type */ +QVersitDocument::QVersitDocument(VersitType type) : d(new QVersitDocumentPrivate()) +{ + d->mVersitType = type; +} + + /*! Constructs a document that is a copy of \a other */ QVersitDocument::QVersitDocument(const QVersitDocument& other) : d(other.d) { @@ -82,7 +97,7 @@ { if (this != &other) d = other.d; - return *this; + return *this; } /*! Returns true if this is equal to \a other; false otherwise. */ @@ -98,6 +113,27 @@ return !(*this == other); } +/*! Returns the hash value for \a key. */ +uint qHash(const QVersitDocument &key) +{ + int hash = QT_PREPEND_NAMESPACE(qHash)(key.type()); + foreach (const QVersitProperty& property, key.properties()) { + hash += qHash(property); + } + return hash; +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug dbg, const QVersitDocument& document) +{ + dbg.nospace() << "QVersitDocument(" << document.type() << ')'; + foreach (const QVersitProperty& property, document.properties()) { + dbg.space() << '\n' << property; + } + return dbg.maybeSpace(); +} +#endif + /*! * Sets the versit document type to \a type. */ @@ -170,14 +206,4 @@ 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(); -} +QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitdocument.h --- a/qtcontactsmobility/src/versit/qversitdocument.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitdocument.h Mon May 03 12:24:20 2010 +0300 @@ -47,8 +47,11 @@ #include #include #include +#include +QT_BEGIN_NAMESPACE class QTextCodec; +QT_END_NAMESPACE QTM_BEGIN_NAMESPACE @@ -58,24 +61,20 @@ class Q_VERSIT_EXPORT QVersitDocument { public: + enum VersitType { + InvalidType, + VCard21Type, // vCard version 2.1 + VCard30Type // vCard version 3.0 (RFC 2426) + }; + QVersitDocument(); QVersitDocument(const QVersitDocument& other); + QVersitDocument(VersitType type); ~QVersitDocument(); QVersitDocument& operator=(const QVersitDocument& other); bool operator==(const QVersitDocument& other) const; bool operator!=(const QVersitDocument& other) const; - - /*! Versit document type */ - enum VersitType { - 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 setType(VersitType type); @@ -89,15 +88,16 @@ bool isEmpty() const; void clear(); - // Deprecated: - void Q_DECL_DEPRECATED setVersitType(VersitType type); - VersitType Q_DECL_DEPRECATED versitType() const; +private: -private: - QSharedDataPointer d; }; +Q_VERSIT_EXPORT uint qHash(const QVersitDocument& key); +#ifndef QT_NO_DEBUG_STREAM +Q_VERSIT_EXPORT QDebug operator<<(QDebug dbg, const QVersitDocument& property); +#endif + QTM_END_NAMESPACE Q_DECLARE_METATYPE(QTM_PREPEND_NAMESPACE(QVersitDocument)) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitdocument_p.h --- a/qtcontactsmobility/src/versit/qversitdocument_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitdocument_p.h Mon May 03 12:24:20 2010 +0300 @@ -68,9 +68,9 @@ { public: QVersitDocumentPrivate(); - + QVersitDocumentPrivate(const QVersitDocumentPrivate& other); - + ~QVersitDocumentPrivate() { } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitdocumentwriter_p.cpp --- a/qtcontactsmobility/src/versit/qversitdocumentwriter_p.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitdocumentwriter_p.cpp Mon May 03 12:24:20 2010 +0300 @@ -117,7 +117,7 @@ writeCrlf(); writeString(QLatin1String("VERSION:" + mVersion)); writeCrlf(); - foreach (QVersitProperty property, properties) { + foreach (const QVersitProperty& property, properties) { encodeVersitProperty(property); } writeString(QLatin1String("END:" + mDocumentType)); @@ -140,7 +140,7 @@ /*! 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. */ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitproperty.cpp --- a/qtcontactsmobility/src/versit/qversitproperty.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitproperty.cpp Mon May 03 12:24:20 2010 +0300 @@ -46,18 +46,18 @@ #include #include -QTM_USE_NAMESPACE +QTM_BEGIN_NAMESPACE /*! \class QVersitProperty - \preliminary + \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 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. @@ -67,10 +67,32 @@ 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 */ +/*! + \enum QVersitProperty::ValueType + Describes the type of data held in the property's value. + + The vCard and iCalendar specifications allows a property value to hold a string, binary data, or a + nested document. String values can either be unstructured or structured. Structured strings can + be either of compound type or list type. A compound value is one that is delimited by semicolons, + allows empty components, and has a property-specific cardinality and ordering. A list value is + one that is delimited by commas, does not have empty components, and has no restrictions on + cardinality or ordering. + + \value PlainType The property value holds an unstructured string and can be retrieved with + QVersitProperty::value() + \value CompoundType The property value holds a compound string and can be retrieved with + QVersitProperty::value() + \value ListType The property value holds a list of strings and can be retrieved with + QVersitProperty::value() + \value BinaryType The property value holds a binary value and can be retrieved with + QVersitProperty::value() + \value VersitDocumentType The property value holds a nested Versit document and can be retrieved + with QVersitProperty::value() + */ /*! Constructs a new empty property */ QVersitProperty::QVersitProperty() : d(new QVersitPropertyPrivate()) @@ -92,7 +114,7 @@ { if (this != &other) d = other.d; - return *this; + return *this; } /*! Returns true if this is equal to \a other; false otherwise. */ @@ -110,13 +132,51 @@ return !(*this == other); } +/*! Returns the hash value for \a key. */ +uint qHash(const QVersitProperty &key) +{ + uint hash = QT_PREPEND_NAMESPACE(qHash)(key.name()) + QT_PREPEND_NAMESPACE(qHash)(key.value()); + foreach (const QString& group, key.groups()) { + hash += QT_PREPEND_NAMESPACE(qHash)(group); + } + QHash::const_iterator it = key.parameters().constBegin(); + QHash::const_iterator end = key.parameters().constEnd(); + while (it != end) { + hash += QT_PREPEND_NAMESPACE(qHash)(it.key()) + QT_PREPEND_NAMESPACE(qHash)(it.value()); + ++it; + } + return hash; +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug dbg, const QVersitProperty& property) +{ + QStringList groups = property.groups(); + QString name = property.name(); + QMultiHash parameters = property.parameters(); + QString value = property.value(); + dbg.nospace() << "QVersitProperty("; + foreach (const QString& group, groups) { + dbg.nospace() << group << '.'; + } + dbg.nospace() << name; + QHash::const_iterator it; + for (it = parameters.constBegin(); it != parameters.constEnd(); ++it) { + dbg.nospace() << ';' << it.key() << '=' << it.value(); + } + dbg.nospace() << ':' << value; + dbg.nospace() << ')'; + return dbg.maybeSpace(); +} +#endif + /*! * Sets the groups in the property to the given list of \a groups. */ void QVersitProperty::setGroups(const QStringList& groups) { d->mGroups.clear(); - foreach (QString group, groups) { + foreach (const QString& group, groups) { d->mGroups.append(group); } } @@ -249,6 +309,22 @@ } /*! + * Sets the type of value held in the property to \a type. + */ +void QVersitProperty::setValueType(QVersitProperty::ValueType type) +{ + d->mValueType = type; +} + +/*! + * Returns the type of value held in the property. + */ +QVersitProperty::ValueType QVersitProperty::valueType() const +{ + return d->mValueType; +} + +/*! * Returns true if the property is empty. */ bool QVersitProperty::isEmpty() const @@ -270,21 +346,4 @@ 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 value(); -} +QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitproperty.h --- a/qtcontactsmobility/src/versit/qversitproperty.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitproperty.h Mon May 03 12:24:20 2010 +0300 @@ -51,7 +51,9 @@ #include #include +QT_BEGIN_NAMESPACE class QVariant; +QT_END_NAMESPACE QTM_BEGIN_NAMESPACE class QVersitPropertyPrivate; @@ -59,10 +61,18 @@ class Q_VERSIT_EXPORT QVersitProperty { public: + enum ValueType { + PlainType, + CompoundType, + ListType, + BinaryType, + VersitDocumentType + }; + QVersitProperty(); QVersitProperty(const QVersitProperty& other); ~QVersitProperty(); - + QVersitProperty& operator=(const QVersitProperty& other); bool operator==(const QVersitProperty& other) const; bool operator!=(const QVersitProperty& other) const; @@ -88,19 +98,22 @@ } QString value() const; + void setValueType(ValueType type); + ValueType valueType() 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: -private: - QSharedDataPointer d; }; +Q_VERSIT_EXPORT uint qHash(const QVersitProperty& key); +#ifndef QT_NO_DEBUG_STREAM +Q_VERSIT_EXPORT QDebug operator<<(QDebug dbg, const QVersitProperty& property); +#endif + QTM_END_NAMESPACE #endif // QVERSITPROPERTY_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitproperty_p.h --- a/qtcontactsmobility/src/versit/qversitproperty_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitproperty_p.h Mon May 03 12:24:20 2010 +0300 @@ -55,6 +55,7 @@ #include "qversitdocument.h" #include "qmobilityglobal.h" +#include "qversitproperty.h" #include #include @@ -68,25 +69,27 @@ class QVersitPropertyPrivate : public QSharedData { public: - QVersitPropertyPrivate() : QSharedData() + QVersitPropertyPrivate() : QSharedData(), mValueType(QVersitProperty::PlainType) { - } - - QVersitPropertyPrivate(const QVersitPropertyPrivate& other) + } + + QVersitPropertyPrivate(const QVersitPropertyPrivate& other) : QSharedData(other), mGroups(other.mGroups), mName(other.mName), mParameters(other.mParameters), - mValue(other.mValue) + mValue(other.mValue), + mValueType(other.mValueType) { - } - + } + ~QVersitPropertyPrivate() {} - + QStringList mGroups; QString mName; QMultiHash mParameters; QVariant mValue; + QVersitProperty::ValueType mValueType; }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitreader.cpp --- a/qtcontactsmobility/src/versit/qversitreader.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitreader.cpp Mon May 03 12:24:20 2010 +0300 @@ -47,6 +47,7 @@ #include #include +#include QTM_USE_NAMESPACE @@ -55,7 +56,7 @@ \preliminary \brief The QVersitReader class reads Versit documents such as vCards from a device. \ingroup versit - + 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 @@ -63,7 +64,7 @@ The reading can be done asynchronously, and the waitForFinished() function can be used to make a blocking read. - + \sa QVersitDocument */ @@ -95,14 +96,6 @@ */ /*! - * \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. @@ -111,16 +104,28 @@ /*! Constructs a new reader. */ QVersitReader::QVersitReader() : d(new QVersitReaderPrivate) { - 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); + d->init(this); +} + +/*! Constructs a new reader that reads from \a inputDevice. */ +QVersitReader::QVersitReader(QIODevice *inputDevice) : d(new QVersitReaderPrivate) +{ + d->init(this); + d->mIoDevice = inputDevice; } - -/*! - * Frees the memory used by the reader. + +/*! Constructs a new reader that reads from \a inputData. */ +QVersitReader::QVersitReader(const QByteArray &inputData) : d(new QVersitReaderPrivate) +{ + d->init(this); + d->mInputBytes.reset(new QBuffer); + d->mInputBytes->setData(inputData); + d->mInputBytes->open(QIODevice::ReadOnly); + d->mIoDevice = d->mInputBytes.data(); +} + +/*! + * Frees the memory used by the reader. * Waits until a pending asynchronous reading has been completed. */ QVersitReader::~QVersitReader() @@ -131,18 +136,37 @@ /*! * Sets the device used for reading the input to be the given \a device. + * Does not take ownership of the device. This overrides any byte array input source set with + * setData(). */ void QVersitReader::setDevice(QIODevice* device) { + d->mInputBytes.reset(0); d->mIoDevice = device; } /*! - * Returns the device used for reading input. + * Returns the device used for reading input, or 0 if no device has been set (or if the input source + * was set with setData(). */ QIODevice* QVersitReader::device() const { - return d->mIoDevice; + if (d->mInputBytes.isNull()) + return d->mIoDevice; + else + return 0; +} + +/*! + * Sets the data to read from to the byte array input source, \a inputData. + * This overrides any device set with setDevice(). + */ +void QVersitReader::setData(const QByteArray &inputData) +{ + if (d->mInputBytes.isNull()) + d->mInputBytes.reset(new QBuffer); + d->mInputBytes->setData(inputData); + d->mIoDevice = d->mInputBytes.data(); } /*! @@ -167,6 +191,22 @@ } /*! + * 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(); +} + +/*! * 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. @@ -225,33 +265,4 @@ return d->mVersitDocuments; } -/*! - * 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 results(); -} - #include "moc_qversitreader.cpp" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitreader.h --- a/qtcontactsmobility/src/versit/qversitreader.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitreader.h Mon May 03 12:24:20 2010 +0300 @@ -47,8 +47,10 @@ #include +QT_BEGIN_NAMESPACE class QIODevice; class QTextCodec; +QT_END_NAMESPACE QTM_BEGIN_NAMESPACE @@ -57,8 +59,7 @@ // reads a QVersitDocument from i/o device class Q_VERSIT_EXPORT QVersitReader : public QObject { - Q_OBJECT - + Q_OBJECT public: enum Error { NoError = 0, @@ -77,37 +78,37 @@ }; QVersitReader(); + QVersitReader(QIODevice* inputDevice); + QVersitReader(const QByteArray& inputData); ~QVersitReader(); // input: - void setDevice(QIODevice* device); + void setDevice(QIODevice* inputDevice); QIODevice* device() const; + void setData(const QByteArray& inputData); void setDefaultCodec(QTextCodec* codec); QTextCodec* defaultCodec() const; - // reading: - bool startReading(); - void cancel(); - bool waitForFinished(int msec = -1); - // output: QList results() const; State state() const; Error error() const; - // Deprecated - bool Q_DECL_DEPRECATED readAll(); - QList Q_DECL_DEPRECATED result() const; + // reading: +public Q_SLOTS: + bool startReading(); + void cancel(); +public: + Q_INVOKABLE bool waitForFinished(int msec = -1); -signals: +Q_SIGNALS: void stateChanged(QVersitReader::State state); - void resultsAvailable(QList& results); void resultsAvailable(); - + private: // data - QVersitReaderPrivate* d; + QVersitReaderPrivate* d; }; QTM_END_NAMESPACE diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitreader_p.cpp --- a/qtcontactsmobility/src/versit/qversitreader_p.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitreader_p.cpp Mon May 03 12:24:20 2010 +0300 @@ -56,6 +56,7 @@ /*! \class LineReader \brief The LineReader class is a wrapper around a QIODevice that allows line-by-line reading. + \internal 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. @@ -96,11 +97,15 @@ // 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; + if (!temp.isEmpty()) { + mBuffer.data.append(temp); + if (tryReadLine(mBuffer, false)) { + mBuffer.dropOldData(); + mOdometer += mBuffer.selection - mBuffer.position; + return mBuffer; + } + } else { + mDevice->waitForReadyRead(500); } } @@ -146,7 +151,7 @@ */ bool LineReader::tryReadLine(VersitCursor &cursor, bool atEnd) { - int crlfPos; + int crlfPos = -1; QByteArray space = VersitUtils::encode(' ', mCodec); QByteArray tab = VersitUtils::encode('\t', mCodec); @@ -190,6 +195,16 @@ } } +/*! Links the signals from this to the signals of \a reader. */ +void QVersitReaderPrivate::init(QVersitReader* reader) +{ + qRegisterMetaType("QVersitReader::State"); + connect(this, SIGNAL(stateChanged(QVersitReader::State)), + reader, SIGNAL(stateChanged(QVersitReader::State)),Qt::DirectConnection); + connect(this, SIGNAL(resultsAvailable()), + reader, SIGNAL(resultsAvailable()), Qt::DirectConnection); +} + /*! Construct a reader. */ QVersitReaderPrivate::QVersitReaderPrivate() : mIoDevice(0), @@ -199,6 +214,34 @@ mError(QVersitReader::NoError), mIsCanceling(false) { + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard21Type, QString::fromAscii("AGENT")), + QVersitProperty::VersitDocumentType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("AGENT")), + QVersitProperty::VersitDocumentType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard21Type, QString::fromAscii("N")), + QVersitProperty::CompoundType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("N")), + QVersitProperty::CompoundType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard21Type, QString::fromAscii("ADR")), + QVersitProperty::CompoundType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("ADR")), + QVersitProperty::CompoundType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard21Type, QString::fromAscii("GEO")), + QVersitProperty::CompoundType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("GEO")), + QVersitProperty::CompoundType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard21Type, QString::fromAscii("ORG")), + QVersitProperty::CompoundType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("ORG")), + QVersitProperty::CompoundType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard21Type, QString::fromAscii("NICKNAMES")), + QVersitProperty::ListType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("NICKNAMES")), + QVersitProperty::ListType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard21Type, QString::fromAscii("CATEGORIES")), + QVersitProperty::ListType); + mValueTypeMap.insert(qMakePair(QVersitDocument::VCard30Type, QString::fromAscii("CATEGORIES")), + QVersitProperty::ListType); } /*! Destroy a reader. */ @@ -241,7 +284,7 @@ else { QMutexLocker locker(&mMutex); mVersitDocuments.append(document); - emit resultsAvailable(mVersitDocuments); + emit resultsAvailable(); } } else { setError(QVersitReader::ParseError); @@ -397,9 +440,9 @@ property.setParameters(extractVCard21PropertyParams(cursor, lineReader.codec())); QByteArray value = extractPropertyValue(cursor); - if (property.name() == QLatin1String("AGENT")) { + if (mValueTypeMap.value(qMakePair(QVersitDocument::VCard21Type, property.name())) + == QVersitProperty::VersitDocumentType) { // 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; @@ -408,17 +451,20 @@ property = QVersitProperty(); return; } - QVersitDocument agentDocument; - if (!parseVersitDocument(lineReader, agentDocument, foundBegin)) { + QVersitDocument subDocument; + if (!parseVersitDocument(lineReader, subDocument, foundBegin)) { property = QVersitProperty(); } else { - property.setValue(QVariant::fromValue(agentDocument)); + property.setValue(QVariant::fromValue(subDocument)); } } else { QTextCodec* codec; QVariant valueVariant(decodeCharset(value, property, lineReader.codec(), &codec)); - unencode(valueVariant, cursor, property, codec, lineReader); + bool isBinary = unencode(valueVariant, cursor, property, codec, lineReader); property.setValue(valueVariant); + if (!isBinary) { + splitStructuredValue(QVersitDocument::VCard21Type, property, false); + } } } @@ -434,32 +480,42 @@ QTextCodec* codec; QString valueString(decodeCharset(value, property, lineReader.codec(), &codec)); - VersitUtils::removeBackSlashEscaping(valueString); - if (property.name() == QLatin1String("AGENT")) { + if (mValueTypeMap.value(qMakePair(QVersitDocument::VCard30Type, property.name())) + == QVersitProperty::VersitDocumentType) { + removeBackSlashEscaping(valueString); // 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); + QByteArray subDocumentValue(codec->fromUnicode(valueString)); + QBuffer subDocumentData(&subDocumentValue); + subDocumentData.open(QIODevice::ReadOnly); + subDocumentData.seek(0); + LineReader subDocumentLineReader(&subDocumentData, codec); - QVersitDocument agentDocument; - if (!parseVersitDocument(agentLineReader, agentDocument)) { + QVersitDocument subDocument; + if (!parseVersitDocument(subDocumentLineReader, subDocument)) { property = QVersitProperty(); } else { - property.setValue(QVariant::fromValue(agentDocument)); + property.setValue(QVariant::fromValue(subDocument)); } } else { 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())); + bool isBinary = unencode(valueVariant, cursor, property, codec, lineReader); + property.setValue(valueVariant); + if (!isBinary) { + bool isList = splitStructuredValue(QVersitDocument::VCard30Type, property, true); + // Do backslash unescaping + if (isList) { + QStringList list = property.value(); + for (int i = 0; i < list.length(); i++) { + removeBackSlashEscaping(list[i]); + } + property.setValue(list); + } else { + QString value = property.value(); + removeBackSlashEscaping(value); + property.setValue(value); + } } - property.setValue(valueVariant); } } @@ -481,14 +537,15 @@ } else { valid = false; } - } + } return valid; } /*! * On entry, \a value should hold a QString. On exit, it may be either a QString or a QByteArray. + * Returns true if and only if the property value is turned into a QByteArray. */ -void QVersitReaderPrivate::unencode(QVariant& value, VersitCursor& cursor, +bool QVersitReaderPrivate::unencode(QVariant& value, VersitCursor& cursor, QVersitProperty& property, QTextCodec* codec, LineReader& lineReader) const { @@ -511,6 +568,7 @@ // Remove the encoding parameter as the value is now decoded property.removeParameters(QLatin1String("ENCODING")); value.setValue(valueString); + return false; } else if (property.parameters().contains(QLatin1String("ENCODING"), QLatin1String("BASE64")) || property.parameters().contains(QLatin1String("ENCODING"), QLatin1String("B")) || property.parameters().contains(QLatin1String("TYPE"), QLatin1String("BASE64")) @@ -522,7 +580,9 @@ // the default codec was used). This will help later on if someone calls valueString() // on the property. property.insertParameter(QLatin1String("CHARSET"), QLatin1String(codec->name())); + return true; } + return false; } /*! @@ -578,7 +638,6 @@ } } - /*! * Extracts the groups and the name of the property using \a codec to determine the delimiters * @@ -670,25 +729,14 @@ while (!paramList.isEmpty()) { QByteArray param = paramList.takeLast(); QString name(paramName(param, codec)); - VersitUtils::removeBackSlashEscaping(name); + 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. + QStringList valueList = splitValue(values, QLatin1Char(','), QString::SkipEmptyParts, true); 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(); - } + removeBackSlashEscaping(value); + result.insert(name, value); } } - return result; } @@ -813,4 +861,100 @@ return memcmp(textData+index, matchData, n) == 0; } +/*! + * If the \a type and the \a property's name is known to contain a structured value, \a property's + * value is split according to the type of structuring (compound vs. list) it is known to have. + * Returns true if and only if such a split happened (ie. the property value holds a QStringList on + * exit). + */ +bool QVersitReaderPrivate::splitStructuredValue( + QVersitDocument::VersitType type, QVersitProperty& property, + bool hasEscapedBackslashes) const +{ + QVariant variant = property.variantValue(); + QPair key = qMakePair(type, property.name()); + if (mValueTypeMap.contains(key)) { + if (mValueTypeMap.value(key) == QVersitProperty::CompoundType) { + variant.setValue(splitValue(variant.toString(), QLatin1Char(';'), + QString::KeepEmptyParts, hasEscapedBackslashes)); + property.setValue(variant); + property.setValueType(QVersitProperty::CompoundType); + } else if (mValueTypeMap.value(key) == QVersitProperty::ListType) { + variant.setValue(splitValue(variant.toString(), QLatin1Char(','), + QString::SkipEmptyParts, hasEscapedBackslashes)); + property.setValue(variant); + property.setValueType(QVersitProperty::ListType); + } + return true; + } + return false; +} + +/*! + * Splits the \a string into substrings wherever \a sep occurs. + * If \a hasEscapedBackslashes is false, then a \a sep preceded by a backslash is not considered + * a split point (but the backslash is removed). + * If \a hasEscapedBackslashes is true, then a \a sep preceded by an odd number of backslashes is + * not considered a split point (but one backslash is removed). + */ +QStringList QVersitReaderPrivate::splitValue(const QString& string, + const QChar& sep, + QString::SplitBehavior behaviour, + bool hasEscapedBackslashes) +{ + QStringList list; + bool isEscaped = false; // is the current character escaped + int segmentStartIndex = 0; + QString segment; + for (int i = 0; i < string.length(); i++) { + if (string.at(i) == QLatin1Char('\\')) { + if (hasEscapedBackslashes) + isEscaped = !isEscaped; // two consecutive backslashes make isEscaped false + else + isEscaped = true; + } else if (string.at(i) == sep) { + if (isEscaped) { + // we see an escaped separator - remove the backslash + segment += string.midRef(segmentStartIndex, i-segmentStartIndex-1); + segment += sep; + } else { + // we see a separator + segment += string.midRef(segmentStartIndex, i - segmentStartIndex); + if (behaviour == QString::KeepEmptyParts || !segment.isEmpty()) + list.append(segment); + segment.clear(); + } + segmentStartIndex = i+1; + isEscaped = false; + } else { // normal character - keep going + isEscaped = false; + } + } + // The rest of the string after the last sep. + segment += string.midRef(segmentStartIndex); + if (behaviour == QString::KeepEmptyParts || !segment.isEmpty()) + list.append(segment); + return list; +} + +/*! + * 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. + */ +void QVersitReaderPrivate::removeBackSlashEscaping(QString& text) +{ + 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); + } +} + + #include "moc_qversitreader_p.cpp" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitreader_p.h --- a/qtcontactsmobility/src/versit/qversitreader_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitreader_p.h Mon May 03 12:24:20 2010 +0300 @@ -66,9 +66,14 @@ #include #include #include +#include #include #include #include +#include +#include + +class QBuffer; QTM_BEGIN_NAMESPACE @@ -126,10 +131,11 @@ public: // Constructors and destructor QVersitReaderPrivate(); ~QVersitReaderPrivate(); + void init(QVersitReader* reader); signals: void stateChanged(QVersitReader::State state); - void resultsAvailable(QList& results); + void resultsAvailable(); protected: // From QThread void run(); @@ -167,7 +173,7 @@ QVersitDocument& document, const QVersitProperty& property) const; - void unencode( + bool unencode( QVariant& value, VersitCursor& cursor, QVersitProperty& property, @@ -182,6 +188,7 @@ void decodeQuotedPrintable(QString& text) const; + /* These functions operate on a cursor describing a single line */ QPair extractPropertyGroupsAndName(VersitCursor& line, QTextCodec* codec) const; @@ -199,9 +206,21 @@ 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); + bool splitStructuredValue(QVersitDocument::VersitType type, + QVersitProperty& property, + bool hasEscapedBackslashes) const; + static QStringList splitValue(const QString& string, + const QChar& sep, + QString::SplitBehavior behaviour, + bool hasEscapedBackslashes); + static void removeBackSlashEscaping(QString& text); public: // Data + /* key is the document type and property name, value is the type of property it is. + If there is no entry, assume it is a PlainType */ + QHash, QVersitProperty::ValueType> mValueTypeMap; QPointer mIoDevice; + QScopedPointer mInputBytes; // Holds the data set by setData() QList mVersitDocuments; int mDocumentNestingLevel; // Depth in parsing nested Versit documents QTextCodec* mDefaultCodec; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitresourcehandler.cpp --- a/qtcontactsmobility/src/versit/qversitresourcehandler.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitresourcehandler.cpp Mon May 03 12:24:20 2010 +0300 @@ -53,25 +53,25 @@ \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 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::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. */ /*! @@ -83,20 +83,20 @@ */ /*! - * \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 + \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. + Constructs a QVersitDefaultResourceHandler. */ QVersitDefaultResourceHandler::QVersitDefaultResourceHandler() : d(new QVersitDefaultResourceHandlerPrivate) @@ -111,7 +111,7 @@ } /*! - * Frees any memory used by the resource handler. + Frees any memory used by the resource handler. */ QVersitDefaultResourceHandler::~QVersitDefaultResourceHandler() { @@ -119,9 +119,9 @@ } /*! - * 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. + 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, @@ -140,9 +140,9 @@ } /*! - * 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. + 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, diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitwriter.cpp --- a/qtcontactsmobility/src/versit/qversitwriter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitwriter.cpp Mon May 03 12:24:20 2010 +0300 @@ -46,15 +46,16 @@ #include #include +#include QTM_USE_NAMESPACE /*! \class QVersitWriter - \preliminary + \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. @@ -107,12 +108,28 @@ /*! Constructs a new writer. */ QVersitWriter::QVersitWriter() : d(new QVersitWriterPrivate) { - connect(d, SIGNAL(stateChanged(QVersitWriter::State)), - this, SIGNAL(stateChanged(QVersitWriter::State)), Qt::DirectConnection); + d->init(this); +} + +/*! Constructs a new writer that writes to \a outputDevice. */ +QVersitWriter::QVersitWriter(QIODevice *outputDevice) : d(new QVersitWriterPrivate) +{ + d->init(this); + d->mIoDevice = outputDevice; } -/*! - * Frees the memory used by the writer. +/*! Constructs a new writer that appends to \a outputBytes. */ +QVersitWriter::QVersitWriter(QByteArray *outputBytes) : d(new QVersitWriterPrivate) +{ + d->init(this); + d->mOutputBytes.reset(new QBuffer); + d->mOutputBytes->setBuffer(outputBytes); + d->mOutputBytes->open(QIODevice::WriteOnly); + d->mIoDevice = d->mOutputBytes.data(); +} + +/*! + * Frees the memory used by the writer. * Waits until a pending asynchronous writing has been completed. */ QVersitWriter::~QVersitWriter() @@ -123,18 +140,23 @@ /*! * Sets the device used for writing to \a device. + * Does not take ownership of the device. */ void QVersitWriter::setDevice(QIODevice* device) { + d->mOutputBytes.reset(0); d->mIoDevice = device; } /*! - * Returns the device used for writing. + * Returns the device used for writing, or 0 if no device has been set. */ QIODevice* QVersitWriter::device() const { - return d->mIoDevice; + if (d->mOutputBytes.isNull()) + return d->mIoDevice; + else + return 0; } /*! @@ -157,6 +179,22 @@ } /*! + * 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(); +} + +/*! * 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. @@ -206,48 +244,4 @@ } } -/*! - * 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() -{ - startWriting(d->mInput); - return waitForFinished(); -} - #include "moc_qversitwriter.cpp" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitwriter.h --- a/qtcontactsmobility/src/versit/qversitwriter.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitwriter.h Mon May 03 12:24:20 2010 +0300 @@ -74,30 +74,28 @@ }; QVersitWriter(); + QVersitWriter(QIODevice* outputDevice); + QVersitWriter(QByteArray* outputBytes); ~QVersitWriter(); // output device - void setDevice(QIODevice* device); + void setDevice(QIODevice* outputDevice); QIODevice* device() const; void setDefaultCodec(QTextCodec* codec); QTextCodec* defaultCodec() const; - // writing: - 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(); + // writing: +public Q_SLOTS: + bool startWriting(const QList& input); + void cancel(); +public: + Q_INVOKABLE bool waitForFinished(int msec = -1); -signals: +Q_SIGNALS: void stateChanged(QVersitWriter::State state); private: // data diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitwriter_p.cpp --- a/qtcontactsmobility/src/versit/qversitwriter_p.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitwriter_p.cpp Mon May 03 12:24:20 2010 +0300 @@ -50,6 +50,7 @@ #include #include #include +#include QTM_USE_NAMESPACE @@ -68,13 +69,21 @@ { } +/*! Links the signals from this to the signals of \a writer. */ +void QVersitWriterPrivate::init(QVersitWriter* writer) +{ + qRegisterMetaType("QVersitWriter::State"); + connect(this, SIGNAL(stateChanged(QVersitWriter::State)), + writer, SIGNAL(stateChanged(QVersitWriter::State)), Qt::DirectConnection); +} + /*! * Do the actual writing and set the error and state appropriately. */ void QVersitWriterPrivate::write() { bool canceled = false; - foreach (QVersitDocument document, mInput) { + foreach (const QVersitDocument& document, mInput) { if (isCanceling()) { canceled = true; break; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/qversitwriter_p.h --- a/qtcontactsmobility/src/versit/qversitwriter_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/qversitwriter_p.h Mon May 03 12:24:20 2010 +0300 @@ -64,6 +64,8 @@ #include #include +class QBuffer; + QTM_BEGIN_NAMESPACE class QVersitDocumentWriter; @@ -78,6 +80,7 @@ public: QVersitWriterPrivate(); virtual ~QVersitWriterPrivate(); + void init(QVersitWriter* writer); void write(); // mutexed getters and setters. @@ -93,6 +96,7 @@ static QVersitDocumentWriter* writerForType(QVersitDocument::VersitType type); QIODevice* mIoDevice; + QScopedPointer mOutputBytes; // Holds the data set by setData() QList mInput; QVersitWriter::State mState; QVersitWriter::Error mError; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/versit.pro --- a/qtcontactsmobility/src/versit/versit.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/versit.pro Mon May 03 12:24:20 2010 +0300 @@ -64,24 +64,28 @@ $$PUBLIC_HEADERS \ $$PRIVATE_HEADERS -qtAddLibrary(QtContacts) - symbian { TARGET.UID3 = 0x2002BFBF TARGET.EPOCALLOWDLLDATA = 1 - TARGET.CAPABILITY = ALL -TCB - + TARGET.CAPABILITY = ALL \ + -TCB + defFiles = \ "$${LITERAL_HASH}ifdef WINSCW" \ - "DEFFILE bwins/$${TARGET}.def" \ + "DEFFILE ../s60installs/bwins/$${TARGET}.def" \ "$${LITERAL_HASH}elif defined EABI" \ - "DEFFILE eabi/$${TARGET}.def" \ + "DEFFILE ../s60installs/eabi/$${TARGET}.def" \ "$${LITERAL_HASH}endif " MMP_RULES += defFiles - - VERSIT_DEPLOYMENT.sources = QtVersit.dll - VERSIT_DEPLOYMENT.path = \sys\bin - DEPLOYMENT += VERSIT_DEPLOYMENT +} + +maemo5|maemo6 { + CONFIG += create_pc create_prl + QMAKE_PKGCONFIG_DESCRIPTION = Qt Mobility - Versit API + pkgconfig.path = $$QT_MOBILITY_LIB/pkgconfig + pkgconfig.files = QtVersit.pc + + INSTALLS += pkgconfig } CONFIG += app diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/versitutils.cpp --- a/qtcontactsmobility/src/versit/versitutils.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/versitutils.cpp Mon May 03 12:24:20 2010 +0300 @@ -53,42 +53,6 @@ QByteArray VersitUtils::m_encodingMap[256]; /*! - * 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. - */ -void VersitUtils::backSlashEscape(QString& text) -{ - /* 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")); -} - -/*! - * 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. - */ -void VersitUtils::removeBackSlashEscaping(QString& text) -{ - 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); - } -} - - -/*! * Encode \a ch with \a codec, without adding an byte-order mark */ QByteArray VersitUtils::encode(char ch, QTextCodec* codec) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/src/versit/versitutils_p.h --- a/qtcontactsmobility/src/versit/versitutils_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/src/versit/versitutils_p.h Mon May 03 12:24:20 2010 +0300 @@ -68,9 +68,6 @@ class Q_AUTOTEST_EXPORT VersitUtils { public: - 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); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/staticconfig.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/staticconfig.pri Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,14 @@ +# +# Fix up QT_MOBILITY_SOURCE_TREE if it isn't defined +# +# Symbian MCL builds do not run configure and hence don't have +# .qmake.cache which set QT_MOBILITY_SOURCE_TREE and +# QT_MOBILITY_BUILD_TREE. Therefore we need to define a fallback. +# This has the disadvantage that shadow builds are not supported. + + +isEmpty(QT_MOBILITY_SOURCE_TREE):QT_MOBILITY_SOURCE_TREE = $$PWD +isEmpty(QT_MOBILITY_BUILD_TREE):QT_MOBILITY_BUILD_TREE = $$PWD + +#now include the dynamic config +include($$QT_MOBILITY_BUILD_TREE/config.pri) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/auto.pro --- a/qtcontactsmobility/tests/auto/auto.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/auto.pro Mon May 03 12:24:20 2010 +0300 @@ -1,7 +1,6 @@ TEMPLATE = subdirs -include(../../pathconfig.pri) -include($$QT_MOBILITY_BUILD_TREE/config.pri) +include(../../staticconfig.pri) contains(mobility_modules,serviceframework) { SUBDIRS += databasemanager \ #service framework @@ -44,15 +43,15 @@ SUBDIRS += qvaluespace \ #Publish and Subscribe qvaluespacepublisher \ qvaluespacesubscriber \ - qcrmlparser + qcrmlparser unix|win32 { - !symbian:!maemo6: SUBDIRS+= \ + !symbian:!maemo6:!maemo5: SUBDIRS+= \ qsystemreadwritelock \ qsystemreadwritelock_oop } - unix:!symbian:!maemo6: { + unix:!symbian:!maemo6:!maemo5 { SUBDIRS+= \ qpacket \ qmallocpool \ @@ -81,20 +80,8 @@ qcontactmanager \ 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 - + qcontactrelationship \ + qlatin1constant } contains(mobility_modules,versit) { @@ -108,14 +95,13 @@ qversitdocument \ qversitproperty \ qversitreader \ - qversitutils \ qversitwriter } contains(mobility_modules,multimedia) { SUBDIRS += \ #Multimedia qaudiocapturesource \ - qcamera \ + qgraphicsvideoitem \ qmediaimageviewer \ qmediaobject \ qmediaplayer \ @@ -128,29 +114,23 @@ qmediaserviceprovider \ qmediacontent \ qradiotuner \ + qpaintervideosurface \ qvideowidget \ qmediatimerange - contains(QT_CONFIG, multimedia) { - SUBDIRS += \ - qgraphicsvideoitem \ - qpaintervideosurface - - } - symbian: { #symbian spesific autotests SUBDIRS += symbian SUBDIRS -= \ - qcamera \ - qmediaplayer \ - qradiotuner \ - qmediaobject + qmediaplayer_s60 \ + qradiotuner_s60 \ + qmediaobject_s60 \ + qmediarecorder_s60 } } #Messaging contains(mobility_modules,messaging) { - contains(qmf_enabled,yes)|wince*|win32|symbian|maemo6 { + contains(qmf_enabled,yes)|wince*|win32|symbian|maemo5 { !win32-g++:SUBDIRS += \ qmessagestore \ qmessagestorekeys \ diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontact/tst_qcontact.cpp --- a/qtcontactsmobility/tests/auto/qcontact/tst_qcontact.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontact/tst_qcontact.cpp Mon May 03 12:24:20 2010 +0300 @@ -42,12 +42,21 @@ #include #include "qtcontacts.h" +#include "qcontactid.h" #include "qcontactmanagerdataholder.h" //QContactManagerDataHolder +#include + //TESTED_CLASS= //TESTED_FILES= QTM_USE_NAMESPACE +class HackEngine : public QContactManagerEngine +{ + public: + static void setRels(QContact* contact, const QList& rels) {QContactManagerEngine::setContactRelationships(contact, rels);} +}; + class tst_QContact: public QObject { Q_OBJECT @@ -66,6 +75,9 @@ void displayName(); void type(); void emptiness(); + void idLessThan(); + void idHash(); + void hash(); void traits(); void idTraits(); void localIdTraits(); @@ -550,7 +562,7 @@ related = c.relatedContacts(QContactRelationship::HasMember); QVERIFY(related.isEmpty()); - related = c.relatedContacts(QContactRelationship::HasMember, QContactRelationshipFilter::First); + related = c.relatedContacts(QContactRelationship::HasMember, QContactRelationship::First); QVERIFY(related.isEmpty()); QList relationshipList = c.relationships(); @@ -558,27 +570,6 @@ relationshipList = c.relationships(QContactRelationship::HasMember); QVERIFY(relationshipList.isEmpty()); - - // now test that we can change the order of relationships regardless of the number of relationships - QList orderedList = c.relationshipOrder(); - QVERIFY(orderedList == relationshipList); // should be the same by default - - QContactRelationship dummyRel; - QContactId firstId; - firstId.setManagerUri("test-nokia"); - firstId.setLocalId(QContactLocalId(5)); - QContactId secondId; - secondId.setManagerUri("test-nokia-2"); - secondId.setLocalId(QContactLocalId(5)); - dummyRel.setFirst(firstId); - dummyRel.setSecond(secondId); - dummyRel.setRelationshipType(QContactRelationship::HasAssistant); - - QList reorderedList; - reorderedList.append(dummyRel); - c.setRelationshipOrder(reorderedList); - - QVERIFY(c.relationshipOrder() == reorderedList); } void tst_QContact::displayName() @@ -645,6 +636,86 @@ QVERIFY(c.isEmpty() == true); // type doesn't affect emptiness } +void tst_QContact::idLessThan() +{ + QContactId id1; + id1.setManagerUri("a"); + id1.setLocalId(1); + QContactId id2; + id2.setManagerUri("a"); + id2.setLocalId(1); + QVERIFY(!(id1 < id2)); + QVERIFY(!(id2 < id1)); + QContactId id3; + id3.setManagerUri("a"); + id3.setLocalId(2); + QContactId id4; + id4.setManagerUri("b"); + id4.setLocalId(1); + QContactId id5; // no URI + id5.setLocalId(2); + QVERIFY(id1 < id3); + QVERIFY(!(id3 < id1)); + QVERIFY(id1 < id4); + QVERIFY(!(id4 < id1)); + QVERIFY(id3 < id4); + QVERIFY(!(id4 < id3)); + QVERIFY(id5 < id1); + QVERIFY(!(id1 < id5)); +} + +void tst_QContact::idHash() +{ + QContactId id1; + id1.setManagerUri("a"); + id1.setLocalId(1); + QContactId id2; + id2.setManagerUri("a"); + id2.setLocalId(1); + QContactId id3; + id3.setManagerUri("b"); + id3.setLocalId(1); + QVERIFY(qHash(id1) == qHash(id2)); + QVERIFY(qHash(id1) != qHash(id3)); + QSet set; + set.insert(id1); + set.insert(id2); + set.insert(id3); + QCOMPARE(set.size(), 2); +} + +void tst_QContact::hash() +{ + QContactId id; + id.setManagerUri("a"); + id.setLocalId(1); + QContact contact1; + contact1.setId(id); + QContactDetail detail1("definition"); + detail1.setValue("key", "value"); + contact1.saveDetail(&detail1); + QContact contact2; + contact2.setId(id); + contact2.saveDetail(&detail1); + QContact contact3; + contact3.setId(id); + QContactDetail detail3("definition"); + detail3.setValue("key", "another value"); + contact3.saveDetail(&detail3); + QContact contact4; // no details + contact4.setId(id); + QContact contact5; // preferred details and relationships shouldn't affect the hash + contact5.setId(id); + contact5.saveDetail(&detail1); + contact5.setPreferredDetail("action", detail1); + QContactRelationship rel; + HackEngine::setRels(&contact5, QList() << rel); + QVERIFY(qHash(contact1) == qHash(contact2)); + QVERIFY(qHash(contact1) != qHash(contact3)); + QVERIFY(qHash(contact1) != qHash(contact4)); + QVERIFY(qHash(contact1) == qHash(contact5)); +} + void tst_QContact::traits() { QVERIFY(sizeof(QContact) == sizeof(void *)); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction.cpp --- a/qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction.cpp Mon May 03 12:24:20 2010 +0300 @@ -110,11 +110,6 @@ return ret; } -QVariantMap QContactSendEmailAction::metadata() const -{ - return QVariantMap(); -} - QVariantMap QContactSendEmailAction::metaData() const { return QVariantMap(); @@ -128,19 +123,25 @@ return retn; } -bool QContactSendEmailAction::supportsDetail(const QContactDetail& detail) const +bool QContactSendEmailAction::isDetailSupported(const QContactDetail &detail, const QContact &) const { return (detail.definitionName() == QContactEmailAddress::DefinitionName); } -void QContactSendEmailAction::invokeAction(const QContact& contact, const QContactDetail& detail) +QList QContactSendEmailAction::supportedDetails(const QContact& contact) const +{ + return contact.details(QContactEmailAddress::DefinitionName); +} + +bool QContactSendEmailAction::invokeAction(const QContact& contact, const QContactDetail& detail, const QVariantMap& ) { Q_UNUSED(contact); Q_UNUSED(detail); QTimer::singleShot(1, this, SLOT(performAction())); + return true; } -QVariantMap QContactSendEmailAction::result() const +QVariantMap QContactSendEmailAction::results() const { return QVariantMap(); } @@ -148,5 +149,5 @@ void QContactSendEmailAction::performAction() { QMessageBox::information(0, "SendEmail Action", "This example action exists as an example of how the action interface may be implemented; it does not offer the advertised functionality."); - emit progress(QContactAction::Finished, QVariantMap()); + emit stateChanged(QContactAction::FinishedState); } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction_p.h --- a/qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactactions/sendemailaction/sendemailaction_p.h Mon May 03 12:24:20 2010 +0300 @@ -71,13 +71,14 @@ ~QContactSendEmailAction(); QContactActionDescriptor actionDescriptor() const; - QVariantMap metadata() const; QVariantMap metaData() const; QContactFilter contactFilter(const QVariant& value) const; - bool supportsDetail(const QContactDetail& detail) const; - void invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()); - QVariantMap result() const; + bool isDetailSupported(const QContactDetail& detail, const QContact& contact = QContact()) const; + QList supportedDetails(const QContact& contact) const; + bool invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail(), const QVariantMap& params = QVariantMap()); + QVariantMap results() const; + State state() const {return QContactAction::FinishedState;} private slots: void performAction(); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactactions/unittest/tst_qcontactactions.cpp --- a/qtcontactsmobility/tests/auto/qcontactactions/unittest/tst_qcontactactions.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactactions/unittest/tst_qcontactactions.cpp Mon May 03 12:24:20 2010 +0300 @@ -67,6 +67,8 @@ private slots: void testSendEmail(); void testDescriptor(); + void testDescriptorLessThan(); + void testDescriptorHash(); void traits(); }; @@ -314,7 +316,7 @@ QVERIFY(sendEmail->actionDescriptor().implementationVersion() != -1); QVERIFY(sendEmail->actionDescriptor().implementationVersion() != 0); //QVERIFY(!sendEmail->contactFilter().isEmpty()); - QVERIFY(sendEmail->supportsDetail(e)); + QVERIFY(sendEmail->isDetailSupported(e)); QVERIFY(sendEmail->supportedDetails(c).contains(e)); //QVERIFY(sendEmail->performAction(c, e)); //QVERIFY(sendEmail->performAction(c)); @@ -406,6 +408,54 @@ delete sendEmailAction3; } +void tst_QContactActions::testDescriptorLessThan() +{ + QContactActionDescriptor qcad1; + qcad1.setVendorName("a"); + qcad1.setActionName("a"); + qcad1.setImplementationVersion(1); + + QContactActionDescriptor qcad2; + qcad2.setVendorName("a"); + qcad2.setActionName("a"); + qcad2.setImplementationVersion(2); + + QContactActionDescriptor qcad3; + qcad3.setVendorName("a"); + qcad3.setActionName("b"); + qcad3.setImplementationVersion(1); + + QContactActionDescriptor qcad4; + qcad4.setVendorName("b"); + qcad4.setActionName("a"); + qcad4.setImplementationVersion(1); + + QVERIFY(qcad1 < qcad2); + QVERIFY(qcad2 < qcad3); + QVERIFY(qcad3 < qcad4); +} + +void tst_QContactActions::testDescriptorHash() +{ + QContactActionDescriptor qcad1; + qcad1.setVendorName("a"); + qcad1.setActionName("a"); + qcad1.setImplementationVersion(1); + + QContactActionDescriptor qcad2; + qcad2.setVendorName("a"); + qcad2.setActionName("a"); + qcad2.setImplementationVersion(1); + + QContactActionDescriptor qcad3; + qcad3.setVendorName("a"); + qcad3.setActionName("a"); + qcad3.setImplementationVersion(2); + + QVERIFY(qHash(qcad1) == qHash(qcad2)); + QVERIFY(qHash(qcad1) != qHash(qcad3)); +} + void tst_QContactActions::traits() { QCOMPARE(sizeof(QContactActionDescriptor), sizeof(void *)); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin.cpp --- a/qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin.cpp Mon May 03 12:24:20 2010 +0300 @@ -58,15 +58,10 @@ { } -void MaliciousAsyncManagerEngine::deref() -{ - // does this leak? -} - -QString MaliciousAsyncManagerEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const +QString MaliciousAsyncManagerEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const { Q_UNUSED(contact); - error = QContactManager::NotSupportedError; + *error = QContactManager::NotSupportedError; return QString(); } @@ -113,9 +108,9 @@ } Q_EXPORT_PLUGIN2(MALICIOUSPLUGINTARGET, MaliciousEngineFactory); -QContactManagerEngine* MaliciousEngineFactory::engine(const QMap& parameters, QContactManager::Error& error) +QContactManagerEngine* MaliciousEngineFactory::engine(const QMap& parameters, QContactManager::Error* error) { Q_UNUSED(parameters); - error = QContactManager::NoError; - return &mame; + *error = QContactManager::NoError; + return new MaliciousAsyncManagerEngine(); } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin_p.h --- a/qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin_p.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactasync/maliciousplugin/maliciousplugin_p.h Mon May 03 12:24:20 2010 +0300 @@ -68,12 +68,133 @@ public: MaliciousAsyncManagerEngine(); - void deref(); - QString synthesizedDisplayLabel(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); + + QMap managerParameters() const {return QMap();} + int managerVersion() const {return 0;} + + QList contactIds(const QContactFilter& filter, const QList& sort, QContactManager::Error* error) const + { + return QContactManagerEngine::contactIds(filter, sort, error); + } + + QList contacts(const QContactFilter& filter, const QList& sort, const QContactFetchHint& fetch, QContactManager::Error* error) const + { + return QContactManagerEngine::contacts(filter, sort, fetch, error); + } + + QContact contact(const QContactLocalId& id, const QContactFetchHint& fetch, QContactManager::Error* error) const + { + return QContactManagerEngine::contact(id, fetch, error); + } + + bool saveContacts(QList* contacts, QMap* errorMap, QContactManager::Error* error) + { + return QContactManagerEngine::saveContacts(contacts, errorMap, error); + } + + bool removeContacts(const QList& contacts, QMap* errorMap, QContactManager::Error* error) + { + return QContactManagerEngine::removeContacts(contacts, errorMap, error); + } + + /* "Self" contact id (MyCard) */ + bool setSelfContactId(const QContactLocalId& id, QContactManager::Error* error) + { + return QContactManagerEngine::setSelfContactId(id, error); + } + + QContactLocalId selfContactId(QContactManager::Error* error) const + { + return QContactManagerEngine::selfContactId(error); + } + + /* Relationships between contacts */ + QList relationships(const QString& relType, const QContactId& id, QContactRelationship::Role role, QContactManager::Error* error) const + { + return QContactManagerEngine::relationships(relType, id, role, error); + } + + bool saveRelationships(QList* relationships, QMap* errorMap, QContactManager::Error* error) + { + return QContactManagerEngine::saveRelationships(relationships, errorMap, error); + } + + bool removeRelationships(const QList& relationships, QMap* errorMap, QContactManager::Error* error) + { + return QContactManagerEngine::removeRelationships(relationships, errorMap, error); + } + + /* Validation for saving */ + QContact compatibleContact(const QContact& contact, QContactManager::Error* error) const + { + return QContactManagerEngine::compatibleContact(contact, error); + } + + bool validateContact(const QContact& contact, QContactManager::Error* error) const + { + return QContactManagerEngine::validateContact(contact, error); + } + + bool validateDefinition(const QContactDetailDefinition& def, QContactManager::Error* error) const + { + return QContactManagerEngine::validateDefinition(def, error); + } + + /* Definitions - Accessors and Mutators */ + QMap detailDefinitions(const QString& contactType, QContactManager::Error* error) const + { + return QContactManagerEngine::detailDefinitions(contactType, error); + } + + QContactDetailDefinition detailDefinition(const QString& definitionId, const QString& contactType, QContactManager::Error* error) const + { + return QContactManagerEngine::detailDefinition(definitionId, contactType, error); + } + + bool saveDetailDefinition(const QContactDetailDefinition& def, const QString& contactType, QContactManager::Error* error) + { + return QContactManagerEngine::saveDetailDefinition(def, contactType, error); + } + + bool removeDetailDefinition(const QString& defName, const QString& contactType, QContactManager::Error* error) + { + return QContactManagerEngine::removeDetailDefinition(defName, contactType, error); + } + + /* Asynchronous Request Support */ + void requestDestroyed(QContactAbstractRequest* req) {QContactManagerEngine::requestDestroyed(req);} + bool waitForRequestFinished(QContactAbstractRequest* req, int msecs) {return QContactManagerEngine::waitForRequestFinished(req, msecs);} + + /* Capabilities reporting */ + bool hasFeature(QContactManager::ManagerFeature feat, const QString& contactType) const + { + return QContactManagerEngine::hasFeature(feat, contactType); + } + + bool isRelationshipTypeSupported(const QString& relType, const QString& ctype) const + { + return QContactManagerEngine::isRelationshipTypeSupported(relType, ctype); + } + + bool isFilterSupported(const QContactFilter& fil) const + { + return QContactManagerEngine::isFilterSupported(fil); + } + + QList supportedDataTypes() const + { + return QContactManagerEngine::supportedDataTypes(); + } + QStringList supportedContactTypes() const + { + return QContactManagerEngine::supportedContactTypes(); + } + }; class Q_DECL_EXPORT MaliciousEngineFactory : public QObject, public QContactManagerEngineFactory @@ -82,7 +203,7 @@ Q_INTERFACES(QtMobility::QContactManagerEngineFactory) public: - QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error& error); + QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error* error); QString managerName() const; private: diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactasync/unittest/tst_qcontactasync.cpp --- a/qtcontactsmobility/tests/auto/qcontactasync/unittest/tst_qcontactasync.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactasync/unittest/tst_qcontactasync.cpp Mon May 03 12:24:20 2010 +0300 @@ -216,16 +216,19 @@ void testQuickDestruction_data() { addManagers(); } void threadDelivery(); - void progressReceived(QContactFetchRequest* request, bool appendOnly); void threadDelivery_data() { addManagers(); } +protected slots: + void resultsAvailableReceived(); private: + bool compareContactLists(QList lista, QList listb); + bool compareContacts(QContact ca, QContact cb); bool containsIgnoringTimestamps(const QList& list, const QContact& c); bool compareIgnoringTimestamps(const QContact& ca, const QContact& cb); QContactManager* prepareModel(const QString& uri); Qt::HANDLE m_mainThreadId; - Qt::HANDLE m_progressSlotThreadId; + Qt::HANDLE m_resultsAvailableSlotThreadId; QContactManagerDataHolder managerDataHolder; }; @@ -253,6 +256,60 @@ { } +bool tst_QContactAsync::compareContactLists(QList lista, QList listb) +{ + // NOTE: This compare is contact order insensitive. + + // Remove matching contacts + foreach (QContact a, lista) { + foreach (QContact b, listb) { + if (compareContacts(a, b)) { + lista.removeOne(a); + listb.removeOne(b); + break; + } + } + } + return (lista.count() == 0 && listb.count() == 0); +} + +bool tst_QContactAsync::compareContacts(QContact ca, QContact cb) +{ + // NOTE: This compare is contact detail order insensitive. + + if (ca.localId() != cb.localId()) + return false; + + QList aDetails = ca.details(); + QList bDetails = cb.details(); + + // Remove matching details + foreach (QContactDetail ad, aDetails) { + foreach (QContactDetail bd, bDetails) { + if (ad == bd) { + ca.removeDetail(&ad); + cb.removeDetail(&bd); + break; + } + + // Special handling for timestamp + if (ad.definitionName() == QContactTimestamp::DefinitionName && + bd.definitionName() == QContactTimestamp::DefinitionName) { + QContactTimestamp at = static_cast(ad); + QContactTimestamp bt = static_cast(bd); + if (at.created().toString() == bt.created().toString() && + at.lastModified().toString() == bt.lastModified().toString()) { + ca.removeDetail(&ad); + cb.removeDetail(&bd); + break; + } + + } + } + } + return (ca == cb); +} + bool tst_QContactAsync::containsIgnoringTimestamps(const QList& list, const QContact& c) { QList cl = list; @@ -418,8 +475,10 @@ sorting.clear(); cfr.setFilter(fil); cfr.setSorting(sorting); - cfr.setDefinitionRestrictions(QStringList(QContactName::DefinitionName)); - QCOMPARE(cfr.definitionRestrictions(), QStringList(QContactName::DefinitionName)); + QContactFetchHint fetchHint; + fetchHint.setDetailDefinitionsHint(QStringList(QContactName::DefinitionName)); + cfr.setFetchHint(fetchHint); + QCOMPARE(cfr.fetchHint().detailDefinitionsHint(), QStringList(QContactName::DefinitionName)); QVERIFY(!cfr.cancel()); // not started QVERIFY(cfr.start()); QVERIFY((cfr.isActive() && cfr.state() == QContactAbstractRequest::ActiveState) || cfr.isFinished()); @@ -478,7 +537,7 @@ sorting.clear(); cfr.setFilter(fil); cfr.setSorting(sorting); - cfr.setDefinitionRestrictions(QStringList()); + cfr.setFetchHint(QContactFetchHint()); int bailoutCount = MAX_OPTIMISTIC_SCHEDULING_LIMIT; // attempt to cancel 40 times. If it doesn't work due to threading, bail out. while (true) { @@ -493,7 +552,8 @@ sorting.clear(); cfr.setFilter(fil); cfr.setSorting(sorting); - cfr.setDefinitionRestrictions(QStringList()); + cfr.setFetchHint(QContactFetchHint()); + cfr.setFetchHint(QContactFetchHint()); bailoutCount -= 1; if (!bailoutCount) { qWarning("Unable to test cancelling due to thread scheduling!"); @@ -524,7 +584,7 @@ sorting.clear(); cfr.setFilter(fil); cfr.setSorting(sorting); - cfr.setDefinitionRestrictions(QStringList()); + cfr.setFetchHint(QContactFetchHint()); bailoutCount -= 1; spy.clear(); if (!bailoutCount) { @@ -901,7 +961,7 @@ expected.clear(); expected << cm->contact(cm->contactIds().last()); result = csr.contacts(); - QCOMPARE(expected, result); + QVERIFY(compareContactLists(expected, result)); //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)); @@ -1128,7 +1188,7 @@ QScopedPointer cm(prepareModel(uri)); if (!cm->hasFeature(QContactManager::MutableDefinitions)) { - QSKIP("This contact manager doest not support mutable definitions, can't remove a definition!", SkipSingle); + QSKIP("This contact manager does not support mutable definitions, can't remove a definition!", SkipSingle); } QContactDetailDefinitionRemoveRequest drr; QVERIFY(drr.type() == QContactAbstractRequest::DetailDefinitionRemoveRequest); @@ -1236,7 +1296,7 @@ drr.waitForFinished(); drr.setDefinitionNames(QContactType::TypeContact, removeIds); - QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 2); // hasn't changed + QCOMPARE(cm->detailDefinitions().keys().size(), originalCount - 3); // finished bailoutCount -= 1; if (!bailoutCount) { qWarning("Unable to test cancelling due to thread scheduling!"); @@ -1244,6 +1304,7 @@ break; } spy.clear(); + // XXX should be readded continue; } @@ -1281,7 +1342,7 @@ 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 - 3); // hasn't changed break; } @@ -1295,7 +1356,7 @@ if (!cm->hasFeature(QContactManager::MutableDefinitions)) { - QSKIP("This contact manager doest not support mutable definitions, can't save a definition!", SkipSingle); + QSKIP("This contact manager does not support mutable definitions, can't save a definition!", SkipSingle); } QContactDetailDefinitionSaveRequest dsr; @@ -1314,8 +1375,8 @@ int originalCount = cm->detailDefinitions().keys().size(); QContactDetailDefinition testDef; testDef.setName("TestDefinitionId"); - QMap fields; - QContactDetailDefinitionField f; + QMap fields; + QContactDetailFieldDefinition f; f.setDataType(QVariant::String); fields.insert("TestDefinitionField", f); testDef.setFields(fields); @@ -1457,6 +1518,15 @@ { QFETCH(QString, uri); QScopedPointer cm(prepareModel(uri)); + + if (!cm->hasFeature(QContactManager::Relationships)) { + QSKIP("This contact manager does not support relationships!", SkipSingle); + } + + if (cm->managerName() == "symbian") { + QSKIP("This contact manager does not support the required relationship types for this test to pass!", SkipSingle); + } + QContactRelationshipFetchRequest rfr; QVERIFY(rfr.type() == QContactAbstractRequest::RelationshipFetchRequest); @@ -1513,7 +1583,7 @@ QContactId aId; foreach (const QContactLocalId& currId, contacts) { QContact curr = cm->contact(currId); - if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Aaron")) { + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirstName) == QString("Aaron")) { aId = curr.id(); break; } @@ -1529,7 +1599,7 @@ QVERIFY(spy.count() >= 1); // active + finished progress signals spy.clear(); - rels = cm->relationships(aId, QContactRelationshipFilter::First); + rels = cm->relationships(aId, QContactRelationship::First); result = rfr.relationships(); QCOMPARE(rels, result); @@ -1539,7 +1609,7 @@ QContactId bId; foreach (const QContactLocalId& currId, contacts) { QContact curr = cm->contact(currId); - if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Bob")) { + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirstName) == QString("Bob")) { bId = curr.id(); break; } @@ -1557,7 +1627,7 @@ spy.clear(); // retrieve rels where second = id of B, and ensure that we get the same results - rels = cm->relationships(bId, QContactRelationshipFilter::Second); + rels = cm->relationships(bId, QContactRelationship::Second); result = rfr.relationships(); QCOMPARE(rels, result); @@ -1567,7 +1637,7 @@ QContactId cId; foreach (const QContactLocalId& currId, contacts) { QContact curr = cm->contact(currId); - if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Borris")) { + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirstName) == QString("Borris")) { cId = curr.id(); break; } @@ -1590,7 +1660,7 @@ QVERIFY(rfr.start()); QVERIFY(rfr.waitForFinished()); result = rfr.relationships(); - rels = cm->relationships(cId, QContactRelationshipFilter::First); + rels = cm->relationships(cId, QContactRelationship::First); QCOMPARE(rels, result); // cancelling @@ -1655,6 +1725,15 @@ { QFETCH(QString, uri); QScopedPointer cm(prepareModel(uri)); + + if (!cm->hasFeature(QContactManager::Relationships)) { + QSKIP("This contact manager does not support relationships!", SkipSingle); + } + + if (cm->managerName() == "symbian") { + QSKIP("This contact manager does not support the required relationship types for this test to pass!", SkipSingle); + } + QContactRelationshipRemoveRequest rrr; QVERIFY(rrr.type() == QContactAbstractRequest::RelationshipRemoveRequest); @@ -1669,15 +1748,15 @@ QContactId aId, bId, cId; foreach (const QContactLocalId& currId, contacts) { QContact curr = cm->contact(currId); - if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Aaron")) { + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirstName) == QString("Aaron")) { aId = curr.id(); continue; } - if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Bob")) { + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirstName) == QString("Bob")) { bId = curr.id(); continue; } - if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Borris")) { + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirstName) == QString("Borris")) { cId = curr.id(); continue; } @@ -1710,7 +1789,7 @@ QVERIFY(rrr.isFinished()); QVERIFY(spy.count() >= 1); // active + finished progress signals spy.clear(); - QCOMPARE(cm->relationships(QContactRelationship::HasAssistant, cId, QContactRelationshipFilter::Second).size(), 1); + QCOMPARE(cm->relationships(QContactRelationship::HasAssistant, cId, QContactRelationship::Second).size(), 1); // remove (asynchronously) a nonexistent relationship - should fail. r.setFirst(cId); @@ -1730,7 +1809,7 @@ QVERIFY(spy.count() >= 1); // active + finished progress signals spy.clear(); - QCOMPARE(cm->relationships(QContactRelationship::HasManager, cId, QContactRelationshipFilter::First).size(), 0); + QCOMPARE(cm->relationships(QContactRelationship::HasManager, cId, QContactRelationship::First).size(), 0); // QCOMPARE(rrr.error(), QContactManager::DoesNotExistError); // cancelling @@ -1803,6 +1882,15 @@ { QFETCH(QString, uri); QScopedPointer cm(prepareModel(uri)); + + if (!cm->hasFeature(QContactManager::Relationships)) { + QSKIP("This contact manager does not support relationships!", SkipSingle); + } + + if (cm->managerName() == "symbian") { + QSKIP("This contact manager does not support the required relationship types for this test to pass!", SkipSingle); + } + QContactRelationshipSaveRequest rsr; QVERIFY(rsr.type() == QContactAbstractRequest::RelationshipSaveRequest); @@ -1817,11 +1905,11 @@ QContactId cId, aId, bId; foreach (const QContactLocalId& currId, contacts) { QContact curr = cm->contact(currId); - if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Borris")) { + if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirstName) == QString("Borris")) { cId = curr.id(); - } else if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Bob")) { + } else if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirstName) == QString("Bob")) { bId = curr.id(); - } else if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirst) == QString("Aaron")) { + } else if (curr.detail(QContactName::DefinitionName).value(QContactName::FieldFirstName) == QString("Aaron")) { aId = curr.id(); } } @@ -1854,7 +1942,7 @@ QVERIFY(spy.count() >= 1); // active + finished progress signals spy.clear(); - QList expected = cm->relationships(QContactRelationship::HasSpouse, aId, QContactRelationshipFilter::First); + QList expected = cm->relationships(QContactRelationship::HasSpouse, aId, QContactRelationship::First); QList result = rsr.relationships(); QCOMPARE(expected, result); QVERIFY(result.contains(testRel)); @@ -1877,7 +1965,7 @@ spy.clear(); expected.clear(); - expected = cm->relationships(QContactRelationship::HasSpouse, aId, QContactRelationshipFilter::First); + expected = cm->relationships(QContactRelationship::HasSpouse, aId, QContactRelationship::First); result = rsr.relationships(); QCOMPARE(result, QList() << testRel); QVERIFY(expected.contains(testRel)); @@ -1918,7 +2006,7 @@ spy.clear(); // verify that the changes were not saved - QList aRels = cm->relationships(aId, QContactRelationshipFilter::First); + QList aRels = cm->relationships(aId, QContactRelationship::First); QVERIFY(!aRels.contains(testRel)); QCOMPARE(cm->relationships(aId).size(), originalCount + 2); // should still only be two extra @@ -1953,7 +2041,7 @@ spy.clear(); // verify that the changes were not saved - QList aRels = cm->relationships(aId, QContactRelationshipFilter::First); + QList aRels = cm->relationships(aId, QContactRelationship::First); QVERIFY(!aRels.contains(testRel)); QCOMPARE(cm->relationships(aId).size(), originalCount + 2); // should still only be two extra @@ -2110,18 +2198,19 @@ QFETCH(QString, uri); QScopedPointer cm(prepareModel(uri)); m_mainThreadId = cm->thread()->currentThreadId(); - m_progressSlotThreadId = m_mainThreadId; + m_resultsAvailableSlotThreadId = 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.data()); - connect(req, SIGNAL(progress(QContactFetchRequest*,bool)), this, SLOT(progressReceived(QContactFetchRequest*, bool))); + connect(req, SIGNAL(resultsAvailable()), this, SLOT(resultsAvailableReceived())); req->start(); int totalWaitTime = 0; + QTest::qWait(1); // force it to process events at least once. while (req->state() != QContactAbstractRequest::FinishedState) { // ensure that the progress signal was delivered to the main thread. - QCOMPARE(m_mainThreadId, m_progressSlotThreadId); + QCOMPARE(m_mainThreadId, m_resultsAvailableSlotThreadId); QTest::qWait(5); // spin until done totalWaitTime += 5; @@ -2134,14 +2223,17 @@ } // ensure that the progress signal was delivered to the main thread. - QCOMPARE(m_mainThreadId, m_progressSlotThreadId); + QCOMPARE(m_mainThreadId, m_resultsAvailableSlotThreadId); delete req; } -void tst_QContactAsync::progressReceived(QContactFetchRequest* request, bool appendOnly) +void tst_QContactAsync::resultsAvailableReceived() { - Q_UNUSED(appendOnly); - m_progressSlotThreadId = request->thread()->currentThreadId(); + QContactFetchRequest *req = qobject_cast(QObject::sender()); + if (req) + m_resultsAvailableSlotThreadId = req->thread()->currentThreadId(); + else + qDebug() << "resultsAvailableReceived() : request deleted; unable to set thread id!"; } void tst_QContactAsync::addManagers() @@ -2155,6 +2247,7 @@ managers.removeAll("invalid"); managers.removeAll("maliciousplugin"); managers.removeAll("testdummy"); + managers.removeAll("symbiansim"); // SIM backend does not support all the required details for tests to pass. foreach(QString mgr, managers) { QMap params; @@ -2205,6 +2298,15 @@ cm->saveContact(&a); cm->saveContact(&b); cm->saveContact(&c); + + if (!cm->hasFeature(QContactManager::Relationships)) { + return cm; + } + + if (cm->managerName() == "symbian") { + // Symbian backend does not support other relationships than HasMember (which is same as groups) + return cm; + } QContactRelationship arb; arb.setFirst(a.id()); @@ -2233,7 +2335,7 @@ QContactRelationship crb; crb.setFirst(c.id()); crb.setSecond(b.id()); - crb.setRelationshipType(QContactRelationship::Is); + crb.setRelationshipType(QContactRelationship::IsSameAs); cm->saveRelationship(&crb); return cm; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactdetail/tst_qcontactdetail.cpp --- a/qtcontactsmobility/tests/auto/qcontactdetail/tst_qcontactdetail.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactdetail/tst_qcontactdetail.cpp Mon May 03 12:24:20 2010 +0300 @@ -43,6 +43,7 @@ #include "qtcontacts.h" #include "qcontactmanagerdataholder.h" //QContactManagerDataHolder +#include //TESTED_CLASS= //TESTED_FILES= @@ -68,7 +69,7 @@ void templates(); void contexts(); void values(); - void preferredActions(); + void hash(); void traits(); }; @@ -542,25 +543,21 @@ QVERIFY(!p.removeValue("does not exist")); } -void tst_QContactDetail::preferredActions() +void tst_QContactDetail::hash() { - QList prefs; - QContactActionDescriptor ad; - QContactDetail det; - - ad.setActionName("test"); - ad.setImplementationVersion(1); - ad.setVendorName("Nokia"); - - prefs.append(ad); - - ad.setActionName("test-two"); - ad.setImplementationVersion(1); - ad.setVendorName("Nokia"); - - prefs.append(ad); - det.setPreferredActions(prefs); - QVERIFY(det.preferredActions() == prefs); + QContactDetail detail1("definition"); + detail1.setValue("key", "value"); + QContactDetail detail2("definition"); + detail2.setValue("key", "value"); + QContactDetail detail3("definition"); + detail3.setValue("key", "different value"); + QVERIFY(qHash(detail1) == qHash(detail2)); + QVERIFY(qHash(detail1) != qHash(detail3)); + QSet set; + set.insert(detail1); + set.insert(detail2); + set.insert(detail3); + QCOMPARE(set.size(), 2); } void tst_QContactDetail::traits() diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactdetails/tst_qcontactdetails.cpp --- a/qtcontactsmobility/tests/auto/qcontactdetails/tst_qcontactdetails.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactdetails/tst_qcontactdetails.cpp Mon May 03 12:24:20 2010 +0300 @@ -81,7 +81,10 @@ void onlineAccount(); void organization(); void phoneNumber(); + void ringtone(); void syncTarget(); + void tag(); + void thumbnail(); void timestamp(); void type(); void url(); @@ -237,34 +240,27 @@ QContactAvatar a1, a2; // test property set - a1.setAvatar("1234"); - QCOMPARE(a1.avatar(), QString("1234")); - QCOMPARE(a1.value(QContactAvatar::FieldAvatar), QString("1234")); - a1.setSubType(QContactAvatar::SubTypeAudioRingtone); - QCOMPARE(a1.subType(), QString(QLatin1String(QContactAvatar::SubTypeAudioRingtone))); - QCOMPARE(a1.value(QContactAvatar::FieldSubType), QString(QLatin1String(QContactAvatar::SubTypeAudioRingtone))); - - a1.setSubType(QContactAvatar::SubTypeImage); - - //pixmap - uchar pixDataRGB[] = {255, 0, 0, 0, 0, 255, 0, 0, 255, 255, 0, 0}; // Red, Blue, Red, Blue - QImage img(pixDataRGB, 2, 2, 6, QImage::Format_RGB888); // 2 pixels width, 2 pixels height, 6 bytes per line, RGB888 format - QImage scaled = img.scaled(100, 100); // Scale image to show results better - QPixmap pix = QPixmap::fromImage(scaled); // Create pixmap from image - a1.setPixmap(pix); + a1.setImageUrl(QUrl("1234")); + QCOMPARE(a1.imageUrl(), QUrl("1234")); + QCOMPARE(a1.value(QContactAvatar::FieldImageUrl), QUrl("1234")); + a2.setVideoUrl(QUrl("videoUrl")); + a2.setImageUrl(QUrl("imageUrl")); + QCOMPARE(a2.videoUrl(), QUrl("videoUrl")); + QCOMPARE(a2.value(QContactAvatar::FieldVideoUrl), QUrl("videoUrl")); + QCOMPARE(a2.imageUrl(), QUrl("imageUrl")); + QCOMPARE(a2.value(QContactAvatar::FieldImageUrl), QUrl("imageUrl")); // test property add QVERIFY(c.saveDetail(&a1)); QCOMPARE(c.details(QContactAvatar::DefinitionName).count(), 1); - QCOMPARE(QContactAvatar(c.details(QContactAvatar::DefinitionName).value(0)).avatar(), a1.avatar()); - QCOMPARE(a1.pixmap(), pix); + QCOMPARE(QContactAvatar(c.details(QContactAvatar::DefinitionName).value(0)).imageUrl(), a1.imageUrl()); // test property update a1.setValue("label","label1"); - a1.setAvatar("12345"); + a1.setImageUrl(QUrl("12345")); QVERIFY(c.saveDetail(&a1)); QCOMPARE(c.details(QContactAvatar::DefinitionName).value(0).value("label"), QString("label1")); - QCOMPARE(c.details(QContactAvatar::DefinitionName).value(0).value(QContactAvatar::FieldAvatar), QString("12345")); + QCOMPARE(c.details(QContactAvatar::DefinitionName).value(0).value(QContactAvatar::FieldImageUrl), QUrl("12345")); // test property remove QVERIFY(c.removeDetail(&a1)); @@ -608,6 +604,39 @@ QCOMPARE(c.details(QContactNickname::DefinitionName).count(), 0); } +void tst_QContactDetails::note() +{ + QContact c; + QContactNote n1, n2; + + // test property set + n1.setNote("lorem ipsum"); + QCOMPARE(n1.note(), QString("lorem ipsum")); + QCOMPARE(n1.value(QContactNote::FieldNote), QString("lorem ipsum")); + + // test property add + QVERIFY(c.saveDetail(&n1)); + QCOMPARE(c.details(QContactNote::DefinitionName).count(), 1); + QCOMPARE(QContactNote(c.details(QContactNote::DefinitionName).value(0)).note(), n1.note()); + + // test property update + n1.setValue("label","label1"); + n1.setNote("orange gypsum"); + QVERIFY(c.saveDetail(&n1)); + QCOMPARE(c.details(QContactNote::DefinitionName).value(0).value("label"), QString("label1")); + QCOMPARE(c.details(QContactNote::DefinitionName).value(0).value(QContactNote::FieldNote), QString("orange gypsum")); + + // test property remove + QVERIFY(c.removeDetail(&n1)); + QCOMPARE(c.details(QContactNote::DefinitionName).count(), 0); + QVERIFY(c.saveDetail(&n2)); + QCOMPARE(c.details(QContactNote::DefinitionName).count(), 1); + QVERIFY(c.removeDetail(&n2)); + QCOMPARE(c.details(QContactNote::DefinitionName).count(), 0); + QVERIFY(c.removeDetail(&n2) == false); + QCOMPARE(c.details(QContactNote::DefinitionName).count(), 0); +} + void tst_QContactDetails::onlineAccount() { QContact c; @@ -617,15 +646,6 @@ o1.setAccountUri("test@nokia.com"); QCOMPARE(o1.accountUri(), QString("test@nokia.com")); QCOMPARE(o1.value(QContactOnlineAccount::FieldAccountUri), QString("test@nokia.com")); - o1.setNickname("test"); - QCOMPARE(o1.nickname(), QString("test")); - QCOMPARE(o1.value(QContactOnlineAccount::FieldNickname), QString("test")); - o1.setStatusMessage("Gone Fishing"); - QCOMPARE(o1.statusMessage(), QString("Gone Fishing")); - QCOMPARE(o1.value(QContactOnlineAccount::FieldStatusMessage), QString("Gone Fishing")); - o1.setPresence("Extended Away"); - QCOMPARE(o1.presence(), QString("Extended Away")); - QCOMPARE(o1.value(QContactOnlineAccount::FieldPresence), QString("Extended Away")); // Sub types o1.setSubTypes(QContactOnlineAccount::SubTypeSip); @@ -643,9 +663,6 @@ QVERIFY(c.saveDetail(&o1)); QCOMPARE(c.details(QContactOnlineAccount::DefinitionName).count(), 1); QCOMPARE(QContactOnlineAccount(c.details(QContactOnlineAccount::DefinitionName).value(0)).accountUri(), o1.accountUri()); - QCOMPARE(QContactOnlineAccount(c.details(QContactOnlineAccount::DefinitionName).value(0)).presence(), o1.presence()); - QCOMPARE(QContactOnlineAccount(c.details(QContactOnlineAccount::DefinitionName).value(0)).nickname(), o1.nickname()); - QCOMPARE(QContactOnlineAccount(c.details(QContactOnlineAccount::DefinitionName).value(0)).statusMessage(), o1.statusMessage()); QCOMPARE(QContactOnlineAccount(c.details(QContactOnlineAccount::DefinitionName).value(0)).accountUri(), o1.accountUri()); // test property update @@ -684,9 +701,9 @@ QCOMPARE(o1.location(), QString("location one")); QCOMPARE(o1.value(QContactOrganization::FieldLocation), QString("location one")); - o1.setLogo("logo one"); - QCOMPARE(o1.logo(), QString("logo one")); - QCOMPARE(o1.value(QContactOrganization::FieldLogo), QString("logo one")); + o1.setLogoUrl(QUrl("logo one")); + QCOMPARE(o1.logoUrl(), QUrl("logo one")); + QCOMPARE(o1.value(QContactOrganization::FieldLogoUrl), QUrl("logo one")); o1.setTitle("title one"); QCOMPARE(o1.title(), QString("title one")); @@ -719,13 +736,13 @@ // organization-specific API testing o1.setDepartment(QStringList(QString("Imaginary Dept"))); o1.setLocation("Utopia"); - o1.setLogo("logo.png"); + o1.setLogoUrl(QUrl("logo.png")); o1.setName("Utopian Megacorporation"); o1.setTitle("Generic Employee"); c.saveDetail(&o1); QVERIFY(c.detail(QContactOrganization::DefinitionName).value(QContactOrganization::FieldDepartment) == QStringList(QString("Imaginary Dept"))); QVERIFY(c.detail(QContactOrganization::DefinitionName).value(QContactOrganization::FieldLocation) == QString("Utopia")); - QVERIFY(c.detail(QContactOrganization::DefinitionName).value(QContactOrganization::FieldLogo) == QString("logo.png")); + QVERIFY(c.detail(QContactOrganization::DefinitionName).value(QContactOrganization::FieldLogoUrl) == QUrl("logo.png")); QVERIFY(c.detail(QContactOrganization::DefinitionName).value(QContactOrganization::FieldName) == QString("Utopian Megacorporation")); QVERIFY(c.detail(QContactOrganization::DefinitionName).value(QContactOrganization::FieldTitle) == QString("Generic Employee")); } @@ -745,7 +762,7 @@ QCOMPARE(p1.subTypes(), QStringList() << QLatin1String(QContactPhoneNumber::SubTypeCar)); QStringList sl; - sl << QLatin1String(QContactPhoneNumber::SubTypeMobile) << QLatin1String(QContactPhoneNumber::SubTypeFacsimile); + sl << QLatin1String(QContactPhoneNumber::SubTypeMobile) << QLatin1String(QContactPhoneNumber::SubTypeFax); p1.setSubTypes(sl); QCOMPARE(p1.subTypes(), sl); @@ -764,7 +781,7 @@ p1.setSubTypes(QContactPhoneNumber::SubTypeDtmfMenu); c.saveDetail(&p1); QVERIFY(c.detail(QContactPhoneNumber::DefinitionName).variantValue(QContactPhoneNumber::FieldSubTypes).toStringList() == QStringList(QString(QLatin1String(QContactPhoneNumber::SubTypeDtmfMenu)))); - p1.setSubTypes(QStringList() << QContactPhoneNumber::SubTypeModem << QContactPhoneNumber::SubTypeFacsimile); + p1.setSubTypes(QStringList() << QContactPhoneNumber::SubTypeModem << QContactPhoneNumber::SubTypeFax); c.saveDetail(&p1); QVERIFY(c.detail(QContactPhoneNumber::DefinitionName).variantValue(QContactPhoneNumber::FieldSubTypes).toStringList() == p1.subTypes()); @@ -779,6 +796,47 @@ QCOMPARE(c.details(QContactPhoneNumber::DefinitionName).count(), 0); } +void tst_QContactDetails::ringtone() +{ + QContact c; + QContactRingtone r1, r2; + + // test property set + r1.setAudioRingtoneUrl(QUrl("audioUrl")); + QCOMPARE(r1.audioRingtoneUrl(), QUrl("audioUrl")); + QCOMPARE(r1.value(QContactRingtone::FieldAudioRingtoneUrl), QUrl("audioUrl")); + + // and the other fields + r2.setVideoRingtoneUrl(QUrl("videoUrl")); + QCOMPARE(r2.videoRingtoneUrl(), QUrl("videoUrl")); + QCOMPARE(r2.value(QContactRingtone::FieldVideoRingtoneUrl), QUrl("videoUrl")); + r2.setVibrationRingtoneUrl(QUrl("vibrationUrl")); + QCOMPARE(r2.vibrationRingtoneUrl(), QUrl("vibrationUrl")); + QCOMPARE(r2.value(QContactRingtone::FieldVibrationRingtoneUrl), QUrl("vibrationUrl")); + + // test property add + QVERIFY(c.saveDetail(&r1)); + QCOMPARE(c.details(QContactRingtone::DefinitionName).count(), 1); + QCOMPARE(QContactRingtone(c.details(QContactRingtone::DefinitionName).value(0)).audioRingtoneUrl(), r1.audioRingtoneUrl()); + + // test property update + r1.setValue("label","label1"); + r1.setAudioRingtoneUrl(QUrl("audioUrl2")); + QVERIFY(c.saveDetail(&r1)); + QCOMPARE(c.details(QContactRingtone::DefinitionName).value(0).value("label"), QString("label1")); + QCOMPARE(c.details(QContactRingtone::DefinitionName).value(0).value(QContactRingtone::FieldAudioRingtoneUrl), QUrl("audioUrl2")); + + // test property remove + QVERIFY(c.removeDetail(&r1)); + QCOMPARE(c.details(QContactRingtone::DefinitionName).count(), 0); + QVERIFY(c.saveDetail(&r2)); + QCOMPARE(c.details(QContactRingtone::DefinitionName).count(), 1); + QVERIFY(c.removeDetail(&r2)); + QCOMPARE(c.details(QContactRingtone::DefinitionName).count(), 0); + QVERIFY(c.removeDetail(&r2) == false); + QCOMPARE(c.details(QContactRingtone::DefinitionName).count(), 0); +} + void tst_QContactDetails::syncTarget() { QContact c; @@ -812,6 +870,77 @@ QCOMPARE(c.details(QContactSyncTarget::DefinitionName).count(), 0); } +void tst_QContactDetails::tag() +{ + QContact c; + QContactTag t1, t2; + + // test property set + t1.setTag("red"); + QCOMPARE(t1.tag(), QString("red")); + QCOMPARE(t1.value(QContactTag::FieldTag), QString("red")); + + // test property add + QVERIFY(c.saveDetail(&t1)); + QCOMPARE(c.details(QContactTag::DefinitionName).count(), 1); + QCOMPARE(QContactTag(c.details(QContactTag::DefinitionName).value(0)).tag(), t1.tag()); + QVERIFY(c.saveDetail(&t2)); + QCOMPARE(c.details(QContactTag::DefinitionName).count(), 2); + + // test property update + t1.setValue("label","label1"); + t1.setTag("green"); + QVERIFY(c.saveDetail(&t1)); + QCOMPARE(c.details(QContactTag::DefinitionName).value(0).value("label"), QString("label1")); + QCOMPARE(c.details(QContactTag::DefinitionName).value(0).value(QContactTag::FieldTag), QString("green")); + + // test property remove + QVERIFY(c.removeDetail(&t1)); + QCOMPARE(c.details(QContactTag::DefinitionName).count(), 1); + QVERIFY(c.removeDetail(&t2)); + QCOMPARE(c.details(QContactTag::DefinitionName).count(), 0); + QVERIFY(c.removeDetail(&t2) == false); + QCOMPARE(c.details(QContactTag::DefinitionName).count(), 0); +} + +void tst_QContactDetails::thumbnail() +{ + QContact c; + QContactThumbnail t1, t2; + QImage i1, i2; // XXX TODO: FIXME load an image from bytearray + + // test property set + t1.setThumbnail(i1); + QCOMPARE(t1.thumbnail(), i1); + QCOMPARE(t1.value(QContactThumbnail::FieldThumbnail), i1); + + // Make sure we have none to start with + QCOMPARE(c.details(QContactThumbnail::DefinitionName).count(), 0); + + // test property add + QVERIFY(c.saveDetail(&t1)); + QCOMPARE(c.details(QContactThumbnail::DefinitionName).count(), 1); + QCOMPARE(QContactThumbnail(c.details(QContactThumbnail::DefinitionName).value(0)).thumbnail(), t1.thumbnail()); + + // test property update + t1.setValue("label","label1"); + t1.setThumbnail(i2); + QVERIFY(c.saveDetail(&t1)); + QCOMPARE(c.details(QContactThumbnail::DefinitionName).value(0).value("label"), QString("label1")); + QCOMPARE(c.details(QContactThumbnail::DefinitionName).value(0).value(QContactThumbnail::FieldThumbnail), i2); + + // Uniqueness is not currently enforced + QCOMPARE(c.details(QContactThumbnail::DefinitionName).count(), 1); + t2.setThumbnail(i1); + QVERIFY(c.saveDetail(&t2)); + QCOMPARE(c.details(QContactThumbnail::DefinitionName).count(), 2); // save should overwrite! + QCOMPARE(QContactThumbnail(c.details(QContactThumbnail::DefinitionName).value(0)).thumbnail(), i1); + QCOMPARE(QContactThumbnail(c.details(QContactThumbnail::DefinitionName).value(0)).thumbnail(), t2.thumbnail()); + + QVERIFY(c.removeDetail(&t1)); + QCOMPARE(c.details(QContactThumbnail::DefinitionName).count(), 1); +} + void tst_QContactDetails::timestamp() { QContact c; @@ -918,9 +1047,53 @@ QCOMPARE(c.details(QContactUrl::DefinitionName).count(), 0); } + + + + + + + + + + + +// define a custom detail to test inheritance/slicing +class CustomTestDetail : public QContactDetail +{ +public: + Q_DECLARE_CUSTOM_CONTACT_DETAIL(CustomTestDetail, "CustomTestDetail") + Q_DECLARE_LATIN1_CONSTANT(FieldTestLabel, "TestLabel"); + + ~CustomTestDetail() + { + // we define a dtor which does some random stuff + // to test that the virtual dtor works as expected. + + int *temp = 0; + int random = qrand(); + random += 1; + if (random > 0) { + temp = new int; + *temp = 5; + } + + if (temp) { + delete temp; + } + } + + void setTestLabel(const QString& testLabel) { setValue(FieldTestLabel, testLabel); } + QString testLabel() const { return value(FieldTestLabel); } +}; +Q_DEFINE_LATIN1_CONSTANT(CustomTestDetail::FieldTestLabel, "TestLabel"); +Q_DEFINE_LATIN1_CONSTANT(CustomTestDetail::DefinitionName, "CustomTestDetail"); + void tst_QContactDetails::custom() { QContact c; + + // first, test a custom definition detail QContactDetail c1("mycustom"), c2("mycustom"); // test property set @@ -946,39 +1119,63 @@ QCOMPARE(c.details("mycustom").count(), 0); QVERIFY(c.removeDetail(&c2) == false); QCOMPARE(c.details("mycustom").count(), 0); -} + -void tst_QContactDetails::note() -{ - QContact c; - QContactNote n1, n2; + // then, test a custom subclass (we don't test registration of the custom definition, however) + CustomTestDetail ctd1, ctd2; + ctd1.setTestLabel("this is a test"); + ctd2.setTestLabel("test 2"); + QCOMPARE(ctd1.testLabel(), QString("this is a test")); + + // prior to add + QCOMPARE(c.details("CustomTestDetail").count(), 0); + QCOMPARE(c.details().count(), 0); - // test property set - n1.setNote("lorem ipsum"); - QCOMPARE(n1.note(), QString("lorem ipsum")); - QCOMPARE(n1.value(QContactNote::FieldNote), QString("lorem ipsum")); + // test detail add + QVERIFY(c.saveDetail(&ctd1)); + QCOMPARE(c.details("CustomTestDetail").count(), 1); + QCOMPARE(c.details().count(), 1); + QCOMPARE(c.details().first().testLabel(), QString("this is a test")); - // test property add - QVERIFY(c.saveDetail(&n1)); - QCOMPARE(c.details(QContactNote::DefinitionName).count(), 1); - QCOMPARE(QContactNote(c.details(QContactNote::DefinitionName).value(0)).note(), n1.note()); + // test detail update + ctd1.setTestLabel("this is a modified test"); + QVERIFY(c.saveDetail(&ctd1)); // should merely update + QCOMPARE(c.details("CustomTestDetail").count(), 1); + QCOMPARE(c.details().count(), 1); + QCOMPARE(c.details().first().testLabel(), QString("this is a modified test")); - // test property update - n1.setValue("label","label1"); - n1.setNote("orange gypsum"); - QVERIFY(c.saveDetail(&n1)); - QCOMPARE(c.details(QContactNote::DefinitionName).value(0).value("label"), QString("label1")); - QCOMPARE(c.details(QContactNote::DefinitionName).value(0).value(QContactNote::FieldNote), QString("orange gypsum")); + // test detail remove + QVERIFY(c.removeDetail(&ctd1)); + QCOMPARE(c.details("CustomTestDetail").count(), 0); + QCOMPARE(c.details().count(), 0); + + // now test how custom details interact with foreach loops. + QVERIFY(c.saveDetail(&ctd1)); + QVERIFY(c.saveDetail(&ctd2)); + QVERIFY(c.saveDetail(&c1)); + + // first, definition agnostic foreach. + foreach (const QContactDetail& det, c.details()) { + QCOMPARE(det.definitionName().isEmpty(), false); + } - // test property remove - QVERIFY(c.removeDetail(&n1)); - QCOMPARE(c.details(QContactNote::DefinitionName).count(), 0); - QVERIFY(c.saveDetail(&n2)); - QCOMPARE(c.details(QContactNote::DefinitionName).count(), 1); - QVERIFY(c.removeDetail(&n2)); - QCOMPARE(c.details(QContactNote::DefinitionName).count(), 0); - QVERIFY(c.removeDetail(&n2) == false); - QCOMPARE(c.details(QContactNote::DefinitionName).count(), 0); + // second, definition parameter foreach, with assignment. + foreach (const QContactDetail& det, c.details("CustomTestDetail")) { + CustomTestDetail customDet = det; + QCOMPARE(det.definitionName(), QString("CustomTestDetail")); + QCOMPARE(customDet.testLabel().isEmpty(), false); + } + + // third, definition parameter foreach, with cast. + foreach (const QContactDetail& det, c.details("CustomTestDetail")) { + QCOMPARE(static_cast(det).definitionName(), QString("CustomTestDetail")); + QCOMPARE(static_cast(det).testLabel().isEmpty(), false); + } + + // fourth, parametrized foreach. + foreach (const CustomTestDetail& det, c.details()) { + QCOMPARE(det.definitionName(), QString("CustomTestDetail")); + } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactfilter/tst_qcontactfilter.cpp --- a/qtcontactsmobility/tests/auto/qcontactfilter/tst_qcontactfilter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactfilter/tst_qcontactfilter.cpp Mon May 03 12:24:20 2010 +0300 @@ -39,6 +39,7 @@ ** ****************************************************************************/ #include +#include #include "qtcontacts.h" #include "qcontactmanagerdataholder.h" //QContactManagerDataHolder @@ -47,6 +48,9 @@ //TESTED_FILES= QTM_USE_NAMESPACE + +Q_DECLARE_METATYPE(QContactFilter) + class tst_QContactFilter : public QObject { Q_OBJECT @@ -72,6 +76,8 @@ void relationshipFilter(); void boringFilters(); void idListFilter(); + void canonicalizedFilter(); + void canonicalizedFilter_data(); void traits(); @@ -635,7 +641,7 @@ QVERIFY(crf.relationshipType() == QString()); QVERIFY(crf.relatedContactId() == newId); - crf.setRelatedContactRole(QContactRelationshipFilter::First); + crf.setRelatedContactRole(QContactRelationship::First); QVERIFY(crf.relationshipType() == QString()); QVERIFY(crf.relatedContactId() == newId); @@ -917,6 +923,224 @@ idf.setIds(ids); // force a detach } +void tst_QContactFilter::canonicalizedFilter() +{ + QFETCH(QContactFilter, in); + QFETCH(QContactFilter, expected); + + QContactFilter out = QContactManagerEngine::canonicalizedFilter(in); + QCOMPARE(out, expected); +} + +void tst_QContactFilter::canonicalizedFilter_data() +{ + QTest::addColumn("in"); + QTest::addColumn("expected"); + + QContactFilter detailFilter1 = QContactName::match("1"); + QContactFilter detailFilter2 = QContactName::match("2"); + QContactInvalidFilter invalidFilter; + QContactFilter defaultFilter; + + { + QTest::newRow("Normal detail filter") + << static_cast(detailFilter1) + << static_cast(detailFilter1); + } + + { + QContactIntersectionFilter qcif; + qcif << detailFilter1; + qcif << detailFilter2; + QTest::newRow("Normal intersection filter") + << static_cast(qcif) + << static_cast(qcif); + } + + { + QContactUnionFilter qcuf; + qcuf << detailFilter1; + qcuf << detailFilter2; + QTest::newRow("Normal intersection filter") + << static_cast(qcuf) + << static_cast(qcuf); + } + + { + QContactIntersectionFilter qcif; + QTest::newRow("Empty intersection") + << static_cast(qcif) + << static_cast(defaultFilter); + } + + { + QContactUnionFilter qcuf; + QTest::newRow("Empty union") + << static_cast(qcuf) + << static_cast(invalidFilter); + } + + { + QContactIntersectionFilter qcif; + qcif << detailFilter1; + QTest::newRow("Single entry intersection filter") + << static_cast(qcif) + << static_cast(detailFilter1); + } + + { + QContactUnionFilter qcuf; + qcuf << detailFilter1; + QTest::newRow("Single entry union filter") + << static_cast(qcuf) + << static_cast(detailFilter1); + } + + { + QContactIntersectionFilter qcif; + qcif << invalidFilter; + qcif << detailFilter1; + qcif << detailFilter2; + QTest::newRow("Intersection with invalid") + << static_cast(qcif) + << static_cast(invalidFilter); + } + + { + QContactIntersectionFilter qcif; + qcif << defaultFilter; + qcif << detailFilter1; + qcif << detailFilter2; + QContactIntersectionFilter expected; + expected << detailFilter1; + expected << detailFilter2; + QTest::newRow("Intersection with default") + << static_cast(qcif) + << static_cast(expected); + } + + { + QContactUnionFilter qcuf; + qcuf << invalidFilter; + qcuf << detailFilter1; + qcuf << detailFilter2; + QContactUnionFilter expected; + expected << detailFilter1; + expected << detailFilter2; + QTest::newRow("Union with invalid") + << static_cast(qcuf) + << static_cast(expected); + } + + { + QContactUnionFilter qcuf; + qcuf << defaultFilter; + qcuf << detailFilter1; + qcuf << detailFilter2; + QTest::newRow("Union with default") + << static_cast(qcuf) + << static_cast(defaultFilter); + } + + { + QContactLocalIdFilter qclif; + QTest::newRow("Empty local id filter") + << static_cast(qclif) + << static_cast(invalidFilter); + } + + { + QContactLocalIdFilter qclif; + qclif.setIds(QList() << 1 << 2); + QTest::newRow("Normal local id filter") + << static_cast(qclif) + << static_cast(qclif); + } + + { + QContactDetailRangeFilter qcdrf; + qcdrf.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldCustomLabel); + QContactDetailFilter expected; + expected.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldCustomLabel); + QTest::newRow("Null valued range filter") + << static_cast(qcdrf) + << static_cast(expected); + } + + { + QContactDetailRangeFilter qcdrf; + qcdrf.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldCustomLabel); + qcdrf.setRange(QLatin1String("a"), QLatin1String("a")); + qcdrf.setMatchFlags(QContactFilter::MatchStartsWith); + QContactDetailFilter expected; + expected.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldCustomLabel); + expected.setValue(QLatin1String("a")); + expected.setMatchFlags(QContactFilter::MatchStartsWith); + QTest::newRow("Equal valued range filter") + << static_cast(qcdrf) + << static_cast(expected); + } + + { + QContactDetailRangeFilter qcdrf; + qcdrf.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldCustomLabel); + qcdrf.setRange(QLatin1String("a"), QLatin1String("a"), + QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::ExcludeUpper); + qcdrf.setMatchFlags(QContactFilter::MatchStartsWith); + QTest::newRow("Equal valued range filter with excluded bounds") + << static_cast(qcdrf) + << static_cast(invalidFilter); + } + + { + QContactDetailRangeFilter qcdrf; + qcdrf.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldCustomLabel); + qcdrf.setRange(QLatin1String("a"), QLatin1String("b")); + qcdrf.setMatchFlags(QContactFilter::MatchStartsWith); + QTest::newRow("Normal range filter") + << static_cast(qcdrf) + << static_cast(qcdrf); + } + + { + QContactDetailRangeFilter qcdrf; + qcdrf.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldCustomLabel); + qcdrf.setRange(QVariant(QVariant::String), QVariant(QVariant::String)); // null bounds + qcdrf.setMatchFlags(QContactFilter::MatchStartsWith); + QContactDetailFilter qcdf; + qcdf.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldCustomLabel); + qcdf.setMatchFlags(QContactFilter::MatchStartsWith); + qcdf.setValue(QVariant(QVariant::String)); + QTest::newRow("Null valued range filter") + << static_cast(qcdrf) + << static_cast(qcdf); + } + + { + QContactDetailRangeFilter qcdrf; + qcdrf.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldCustomLabel); + qcdrf.setRange(QVariant(QVariant::String), QLatin1String("a")); // min is null + qcdrf.setMatchFlags(QContactFilter::MatchStartsWith); + QTest::newRow("One sided range filter") + << static_cast(qcdrf) + << static_cast(qcdrf); + } + + { + QContactDetailRangeFilter qcdrf; + QTest::newRow("Empty range filter") + << static_cast(qcdrf) + << static_cast(invalidFilter); + } + + { + QContactDetailFilter qcdf; + QTest::newRow("Empty detail filter") + << static_cast(qcdf) + << static_cast(invalidFilter); + } +} + void tst_QContactFilter::traits() { // QCOMPARE(sizeof(QContactFilter), sizeof(void *)); diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactmanager/tst_qcontactmanager.cpp --- a/qtcontactsmobility/tests/auto/qcontactmanager/tst_qcontactmanager.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactmanager/tst_qcontactmanager.cpp Mon May 03 12:24:20 2010 +0300 @@ -124,7 +124,8 @@ bool isSuperset(const QContact& ca, const QContact& cb); QList removeAllDefaultDetails(const QList& details); void addManagers(); // add standard managers to the data - void setContactName(QContactDetailDefinition nameDef, QContactName& contactName, const QString &name) const; + QContact createContact(QContactDetailDefinition nameDef, QString firstName, QString lastName, QString phoneNumber); + void saveContactName(QContact *contact, QContactDetailDefinition nameDef, QContactName *contactName, const QString &name) const; QContactManagerDataHolder managerDataHolder; @@ -393,20 +394,60 @@ } } -void tst_QContactManager::setContactName(QContactDetailDefinition nameDef, QContactName& contactName, const QString &name) const +/* + * Helper method for creating a QContact instance with name and phone number + * details. Name is generated according to the detail definition assuming that + * either first and last name or custom label is supported. + */ +QContact tst_QContactManager::createContact( + QContactDetailDefinition nameDef, + QString firstName, + QString lastName, + QString phoneNumber) +{ + QContact contact; + + if(!firstName.isEmpty() || !lastName.isEmpty()) { + QContactName n; + + if(nameDef.fields().contains(QContactName::FieldFirstName) + && nameDef.fields().contains(QContactName::FieldFirstName)) { + n.setFirstName(firstName); + n.setLastName(lastName); + } else if(nameDef.fields().contains(QContactName::FieldCustomLabel)) { + n.setCustomLabel(firstName + " " + lastName); + } else { + // assume that either first and last name or custom label is supported + QTest::qWarn("Neither custom label nor first name/last name supported!"); + return QContact(); + } + contact.saveDetail(&n); + } + + if (!phoneNumber.isEmpty()) { + QContactPhoneNumber ph; + ph.setNumber(phoneNumber); + contact.saveDetail(&ph); + } + + return contact; +} + +void tst_QContactManager::saveContactName(QContact *contact, QContactDetailDefinition nameDef, QContactName *contactName, const QString &name) const { // check which name fields are supported in the following order: // 1. custom label, 2. first name, 3. last name if(nameDef.fields().contains(QContactName::FieldCustomLabel)) { - contactName.setCustomLabel(name); - } else if(nameDef.fields().contains(QContactName::FieldFirst)) { - contactName.setFirstName(name); - } else if(nameDef.fields().contains(QContactName::FieldLast)) { - contactName.setLastName(name); + contactName->setCustomLabel(name); + } else if(nameDef.fields().contains(QContactName::FieldFirstName)) { + contactName->setFirstName(name); + } else if(nameDef.fields().contains(QContactName::FieldLastName)) { + contactName->setLastName(name); } else { // Assume that at least one of the above name fields is supported by the backend QVERIFY(false); } + contact->saveDetail(contactName); } void tst_QContactManager::metadata() @@ -573,6 +614,20 @@ QCOMPARE(em4->managerParameters(), tst_QContactManager_QStringMap()); QCOMPARE(em5->managerParameters(), tst_QContactManager_QStringMap()); QCOMPARE(em3.managerParameters(), em6->managerParameters()); // memory engine discards the given params, replaces with id. + + + // Finally test the platform specific engines are actually the defaults +#if defined(Q_OS_SYMBIAN) + QCOMPARE(defaultStore, QString("symbian")); +#elif defined(Q_WS_MAEMO_6) + QCOMPARE(defaultStore, QString("tracker")); +#elif defined(Q_WS_MAEMO_5) + QCOMPARE(defaultStore, QString("maemo5")); +#elif defined(Q_OS_WINCE) + QCOMPARE(defaultStore, QString("wince")); +#else + QCOMPARE(defaultStore, QString("memory")); +#endif } void tst_QContactManager::doDump() @@ -604,10 +659,10 @@ qDebug() << QString("%2::%1 (Unique) {").arg(def.name()).arg(type).toAscii().constData(); else qDebug() << QString("%2::%1 {").arg(def.name()).arg(type).toAscii().constData(); - QMap fields = def.fields(); + QMap fields = def.fields(); foreach(QString fname, fields.keys()) { - QContactDetailDefinitionField field = fields.value(fname); + QContactDetailFieldDefinition field = fields.value(fname); if (field.allowableValues().count() > 0) { // Make some pretty output @@ -642,18 +697,8 @@ QFETCH(QString, uri); QScopedPointer cm(QContactManager::fromUri(uri)); - QContact alice; - QContactName na; - na.setFirstName("Alice"); - na.setLastName("inWonderland"); - alice.saveDetail(&na); - - QContactPhoneNumber ph; - ph.setNumber("1234567"); - ph.setContexts("Home"); - ph.setSubTypes(QStringList("Mobile")); - - alice.saveDetail(&ph); + QContactDetailDefinition nameDef = cm->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact); + QContact alice = createContact(nameDef, "Alice", "inWonderland", "1234567"); int currCount = cm->contactIds().count(); QVERIFY(cm->saveContact(&alice)); QVERIFY(cm->error() == QContactManager::NoError); @@ -664,7 +709,7 @@ QContact added = cm->contact(alice.id().localId()); QVERIFY(added.id() != QContactId()); QVERIFY(added.id() == alice.id()); - + if (!isSuperset(added, alice)) { dumpContacts(cm.data()); dumpContactDifferences(added, alice); @@ -672,17 +717,19 @@ } // now try adding a contact that does not exist in the database with non-zero id - QContact nonexistent; - QContactName name; - setContactName(cm->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact), name, "nonexistent contact"); - nonexistent.saveDetail(&name); - QVERIFY(cm->saveContact(&nonexistent)); // should work - QVERIFY(cm->removeContact(nonexistent.id().localId())); // now nonexistent has an id which does not exist - QVERIFY(!cm->saveContact(&nonexistent)); // hence, should fail - QCOMPARE(cm->error(), QContactManager::DoesNotExistError); - nonexistent.setId(QContactId()); - QVERIFY(cm->saveContact(&nonexistent)); // after setting id to zero, should save - QVERIFY(cm->removeContact(nonexistent.id().localId())); + if (cm->managerName() == "symbiansim") { + // TODO: symbiansim backend fails this test currently. Will be fixed later. + QWARN("This manager has a known issue with saving a non-zero id contact. Skipping this test step."); + } else { + QContact nonexistent = createContact(nameDef, "nonexistent", "contact", ""); + QVERIFY(cm->saveContact(&nonexistent)); // should work + QVERIFY(cm->removeContact(nonexistent.id().localId())); // now nonexistent has an id which does not exist + QVERIFY(!cm->saveContact(&nonexistent)); // hence, should fail + QCOMPARE(cm->error(), QContactManager::DoesNotExistError); + nonexistent.setId(QContactId()); + QVERIFY(cm->saveContact(&nonexistent)); // after setting id to zero, should save + QVERIFY(cm->removeContact(nonexistent.id().localId())); + } // now try adding a "megacontact" // - get list of all definitions supported by the manager @@ -696,9 +743,10 @@ foreach (const QContactDetailDefinition def, defs) { // Leave these warnings here - might need an API for this - if (def.accessConstraint() == QContactDetailDefinition::ReadOnly) { - continue; - } + // XXX FIXME: access constraint reporting as moved to the detail itself + //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()); @@ -707,6 +755,13 @@ foreach (const QString& fieldKey, fieldKeys) { // get the field, and check to see that it's not constrained. QContactDetailFieldDefinition currentField = fieldmap.value(fieldKey); + + // Special case: phone number. + if (def.name() == QContactPhoneNumber::DefinitionName && + fieldKey == QContactPhoneNumber::FieldNumber) { + det.setValue(fieldKey, "+3581234567890"); + continue; + } // Attempt to create a worthy value if (!currentField.allowableValues().isEmpty()) { @@ -767,26 +822,34 @@ } // now a contact with many details of a particular definition - // this will fail on some backends; how do we query for this capability? - QContact veryContactable; - QContactName contactableName; - setContactName(cm->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact), contactableName, "Very Contactable"); - veryContactable.saveDetail(&contactableName); - for (int i = 0; i < 50; i++) { + // if the detail is not unique it should then support minumum of two of the same kind + const int nrOfdetails = 2; + QContact veryContactable = createContact(nameDef, "Very", "Contactable", ""); + for (int i = 0; i < nrOfdetails; i++) { QString phnStr = QString::number(i); QContactPhoneNumber vcphn; vcphn.setNumber(phnStr); QVERIFY(veryContactable.saveDetail(&vcphn)); } - // check that all the numbers were added successfully, and that it can be saved. - QVERIFY(veryContactable.details(QContactPhoneNumber::DefinitionName).size() == 50); - QVERIFY(cm->saveContact(&veryContactable)); - QContact retrievedContactable = cm->contact(veryContactable.id().localId()); - if (retrievedContactable != veryContactable) { - dumpContactDifferences(veryContactable, retrievedContactable); - QEXPECT_FAIL("mgr='wince'", "Number of phones supported mismatch", Continue); - QCOMPARE(veryContactable, retrievedContactable); + // check that all the numbers were added successfully + QVERIFY(veryContactable.details(QContactPhoneNumber::DefinitionName).size() == nrOfdetails); + + // check if it can be saved + QContactDetailDefinition def = cm->detailDefinition(QContactPhoneNumber::DefinitionName); + if (def.isUnique()) { + QVERIFY(!cm->saveContact(&veryContactable)); + } + else { + QVERIFY(cm->saveContact(&veryContactable)); + + // verify save + QContact retrievedContactable = cm->contact(veryContactable.id().localId()); + if (retrievedContactable != veryContactable) { + dumpContactDifferences(veryContactable, retrievedContactable); + QEXPECT_FAIL("mgr='wince'", "Number of phones supported mismatch", Continue); + QCOMPARE(veryContactable, retrievedContactable); + } } } @@ -794,62 +857,42 @@ { QFETCH(QString, uri); QScopedPointer cm(QContactManager::fromUri(uri)); - bool didUpdate = false; /* Save a new contact first */ - QContact alice; - QContactName na; - na.setFirstName("Alice"); - na.setLastName("inWonderland"); - alice.saveDetail(&na); - - QContactPhoneNumber ph; - ph.setNumber("1234567"); - ph.setContexts(QStringList("Home")); - ph.setSubTypes(QStringList("Mobile")); - - alice.saveDetail(&ph); - + QContactDetailDefinition nameDef = cm->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact); + QContact alice = createContact(nameDef, "Alice", "inWonderland", "1234567"); + QVERIFY(cm->saveContact(&alice)); + QVERIFY(cm->error() == QContactManager::NoError); + + /* Update name */ + QContactName name = alice.detail(QContactName::DefinitionName); + saveContactName(&alice, nameDef, &name, "updated"); + QVERIFY(cm->saveContact(&alice)); + QVERIFY(cm->error() == QContactManager::NoError); + saveContactName(&alice, nameDef, &name, "updated2"); QVERIFY(cm->saveContact(&alice)); QVERIFY(cm->error() == QContactManager::NoError); - - 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.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.middleName(), nc.middleName()); - didUpdate = true; - break; - } + QContact updated = cm->contact(alice.localId()); + QContactName updatedName = updated.detail(QContactName::DefinitionName); + QCOMPARE(updatedName, name); + + if (cm->hasFeature(QContactManager::Groups)) { + // Try changing types - not allowed + // from contact -> group + alice.setType(QContactType::TypeGroup); + QContactName na = alice.detail(QContactName::DefinitionName); + alice.removeDetail(&na); + QVERIFY(!cm->saveContact(&alice)); + QVERIFY(cm->error() == QContactManager::AlreadyExistsError); + + // from group -> contact + QContact jabberwock = createContact(nameDef, "", "", "1234567890"); + jabberwock.setType(QContactType::TypeGroup); + QVERIFY(cm->saveContact(&jabberwock)); + jabberwock.setType(QContactType::TypeContact); + QVERIFY(!cm->saveContact(&jabberwock)); + QVERIFY(cm->error() == QContactManager::AlreadyExistsError); } - - QVERIFY(didUpdate); - - // Try changing types - not allowed - // from contact -> group - alice.setType(QContactType::TypeGroup); - alice.removeDetail(&na); - QVERIFY(!cm->saveContact(&alice)); - QVERIFY(cm->error() == QContactManager::AlreadyExistsError); - - // from group -> contact - QContact jabberwock; - QContactPhoneNumber n; - n.setNumber("1234567890"); - jabberwock.saveDetail(&n); - jabberwock.setType(QContactType::TypeGroup); - QVERIFY(cm->saveContact(&jabberwock)); - jabberwock.setType(QContactType::TypeContact); - QVERIFY(!cm->saveContact(&jabberwock)); - QVERIFY(cm->error() == QContactManager::AlreadyExistsError); } void tst_QContactManager::remove() @@ -858,36 +901,18 @@ QScopedPointer cm(QContactManager::fromUri(uri)); /* Save a new contact first */ - QContact alice; - QContactName na; - na.setFirstName("Alice"); - na.setLastName("inWonderland"); - alice.saveDetail(&na); - - QContactPhoneNumber ph; - ph.setNumber("1234567"); - ph.setContexts(QStringList("Home")); - ph.setSubTypes(QStringList("Mobile")); - - alice.saveDetail(&ph); - + QContactDetailDefinition nameDef = cm->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact); + QContact alice = createContact(nameDef, "Alice", "inWonderland", "1234567"); QVERIFY(cm->saveContact(&alice)); QVERIFY(cm->error() == QContactManager::NoError); - - bool atLeastOne = false; - 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.firstName() == "Alice" && nc.lastName() == "inWonderland") { - int currCount = cm->contactIds().count(); - atLeastOne = cm->removeContact(current.id().localId()); - QVERIFY(atLeastOne); - QCOMPARE(cm->contactIds().count(), currCount - 1); - } - } - - QVERIFY(atLeastOne); + QVERIFY(alice.id() != QContactId()); + + /* Remove the created contact */ + const int contactCount = cm->contactIds().count(); + QVERIFY(cm->removeContact(alice.localId())); + QCOMPARE(cm->contactIds().count(), contactCount - 1); + QVERIFY(cm->contact(alice.localId()).isEmpty()); + QCOMPARE(cm->error(), QContactManager::DoesNotExistError); } void tst_QContactManager::batch() @@ -896,26 +921,36 @@ QScopedPointer cm(QContactManager::fromUri(uri)); /* First test null pointer operations */ - QVERIFY(!cm->saveContacts(0, 0)); + QVERIFY(!cm->saveContacts(NULL, NULL)); + QVERIFY(cm->error() == QContactManager::BadArgumentError); + + QVERIFY(!cm->removeContacts(QList(), NULL)); QVERIFY(cm->error() == QContactManager::BadArgumentError); - - QVERIFY(!cm->removeContacts(0, 0)); - QVERIFY(cm->error() == QContactManager::BadArgumentError); + + // Get supported name field + QString nameField = QContactName::FieldFirstName; + QContactDetailDefinition def = cm->detailDefinition(QContactName::DefinitionName); + if (!def.fields().contains(QContactName::FieldFirstName)) { + if(def.fields().contains(QContactName::FieldCustomLabel)) + nameField = QLatin1String(QContactName::FieldCustomLabel); + else + QSKIP("This backend does not support the required name field!", SkipSingle); + } /* Now add 3 contacts, all valid */ QContact a; QContactName na; - na.setFirstName("XXXXXX Albert"); + na.setValue(nameField, "XXXXXX Albert"); a.saveDetail(&na); QContact b; QContactName nb; - nb.setFirstName("XXXXXX Bob"); + nb.setValue(nameField, "XXXXXX Bob"); b.saveDetail(&nb); QContact c; QContactName nc; - nc.setFirstName("XXXXXX Carol"); + nc.setValue(nameField, "XXXXXX Carol"); c.saveDetail(&nc); QList contacts; @@ -978,18 +1013,11 @@ /* Now delete them all */ QList ids; - QContactLocalId removedIdForLater = b.id().localId(); ids << a.id().localId() << b.id().localId() << c.id().localId(); - QVERIFY(cm->removeContacts(&ids, &errorMap)); + QVERIFY(cm->removeContacts(ids, &errorMap)); QVERIFY(errorMap.count() == 0); QVERIFY(cm->error() == QContactManager::NoError); - /* Make sure all the ids are now 0 */ - QVERIFY(ids.count() == 3); - QVERIFY(ids.at(0) == 0); - QVERIFY(ids.at(1) == 0); - QVERIFY(ids.at(2) == 0); - /* Make sure the contacts really don't exist any more */ QVERIFY(cm->contact(a.id().localId()).id() == QContactId()); QVERIFY(cm->contact(a.id().localId()).isEmpty()); @@ -1004,7 +1032,7 @@ /* 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(); - QVERIFY(!cm->removeContacts(&ids, &errorMap)); + QVERIFY(!cm->removeContacts(ids, &errorMap)); QVERIFY(cm->error() == QContactManager::DoesNotExistError); QVERIFY(errorMap.count() == 3); QVERIFY(errorMap.values().at(0) == QContactManager::DoesNotExistError); @@ -1056,14 +1084,20 @@ QVERIFY(cm->saveContacts(&contacts, &errorMap)); QVERIFY(errorMap.count() == 0); QVERIFY(cm->error() == QContactManager::NoError); + + // Save and remove a fourth contact. Store the id. + a.setId(QContactId()); + QVERIFY(cm->saveContact(&a)); + QContactLocalId removedId = a.localId(); + QVERIFY(cm->removeContact(removedId)); /* Now delete 3 items, but with one bad argument */ ids.clear(); ids << contacts.at(0).id().localId(); - ids << removedIdForLater; + ids << removedId; ids << contacts.at(2).id().localId(); - QVERIFY(!cm->removeContacts(&ids, &errorMap)); + QVERIFY(!cm->removeContacts(ids, &errorMap)); QVERIFY(cm->error() != QContactManager::NoError); /* Again, the backend has the choice of either removing the successful ones, or not */ @@ -1080,7 +1114,7 @@ /* B should definitely have failed */ QVERIFY(errorMap.value(1) == QContactManager::DoesNotExistError); - QVERIFY(ids.at(1) == removedIdForLater); + QVERIFY(ids.at(1) == removedId); // A might have gone through if (errorMap.keys().contains(2)) { @@ -1153,19 +1187,17 @@ list << foo; QVERIFY(!manager.saveContacts(&list, &errorMap)); - QVERIFY(errorMap.count() == 1); - QVERIFY(errorMap.value(0) == QContactManager::NotSupportedError); + QVERIFY(errorMap.count() == 0); QVERIFY(manager.error() == QContactManager::NotSupportedError); - QVERIFY(!manager.removeContacts(0, &errorMap)); + QVERIFY(!manager.removeContacts(QList(), &errorMap)); QVERIFY(errorMap.count() == 0); QVERIFY(manager.error() == QContactManager::BadArgumentError); QList idlist; idlist << foo.id().localId(); - QVERIFY(!manager.removeContacts(&idlist, &errorMap)); - QVERIFY(errorMap.count() == 1); - QVERIFY(errorMap.value(0) == QContactManager::NotSupportedError); + QVERIFY(!manager.removeContacts(idlist, &errorMap)); + QVERIFY(errorMap.count() == 0); QVERIFY(manager.error() == QContactManager::NotSupportedError); /* Detail definitions */ @@ -1218,9 +1250,9 @@ QVERIFY(manager.error() == QContactManager::NotSupportedError); QVERIFY(manager.relationships().isEmpty()); QVERIFY(manager.error() == QContactManager::NotSupportedError); - manager.saveRelationships(&invalidRelList); + manager.saveRelationships(&invalidRelList, NULL); QVERIFY(manager.error() == QContactManager::NotSupportedError); - manager.removeRelationships(invalidRelList); + manager.removeRelationships(invalidRelList, NULL); QVERIFY(manager.error() == QContactManager::NotSupportedError || manager.error() == QContactManager::DoesNotExistError); /* Capabilities */ @@ -1691,11 +1723,12 @@ int modSigCount = 0; int remSigCount = 0; + QContactDetailDefinition nameDef = m1->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact); + // verify add emits signal added QContactName nc; - nc.setFirstName("John"); - c.saveDetail(&nc); - m1->saveContact(&c); + saveContactName(&c, nameDef, &nc, "John"); + QVERIFY(m1->saveContact(&c)); addSigCount += 1; QTRY_COMPARE(spyCA.count(), addSigCount); args = spyCA.takeFirst(); @@ -1704,9 +1737,8 @@ temp = QContactLocalId(args.at(0).value()); // verify save modified emits signal changed - nc.setLastName("Citizen"); - c.saveDetail(&nc); - m1->saveContact(&c); + saveContactName(&c, nameDef, &nc, "Citizen"); + QVERIFY(m1->saveContact(&c)); modSigCount += 1; QTRY_COMPARE(spyCM.count(), modSigCount); args = spyCM.takeFirst(); @@ -1726,11 +1758,15 @@ // verify multiple adds works as advertised QContact c2, c3; QContactName nc2, nc3; - nc2.setFirstName("Mark"); - nc3.setFirstName("Garry"); - c2.saveDetail(&nc2); - c3.saveDetail(&nc3); - QVERIFY(!m1->saveContact(&c)); // saving contact with nonexistent id fails + saveContactName(&c2, nameDef, &nc2, "Mark"); + saveContactName(&c3, nameDef, &nc3, "Garry"); +#if defined(Q_OS_SYMBIAN) + // TODO: symbiansim backend fails this test currently. Commented out for + // now. Will be fixed later. + if(!uri.contains("symbiansim")) { + QVERIFY(!m1->saveContact(&c)); // saving contact with nonexistent id fails + } +#endif QVERIFY(m1->saveContact(&c2)); addSigCount += 1; QVERIFY(m1->saveContact(&c3)); @@ -1739,14 +1775,11 @@ QTRY_COMPARE(spyCA.count(), addSigCount); // verify multiple modifies works as advertised - nc2.setLastName("M."); - c2.saveDetail(&nc2); + saveContactName(&c2, nameDef, &nc2, "M."); QVERIFY(m1->saveContact(&c2)); modSigCount += 1; - nc2.setPrefix("Mr."); - nc3.setLastName("G."); - c2.saveDetail(&nc2); - c3.saveDetail(&nc3); + saveContactName(&c2, nameDef, &nc2, "Mark"); + saveContactName(&c3, nameDef, &nc3, "G."); QVERIFY(m1->saveContact(&c2)); modSigCount += 1; QVERIFY(m1->saveContact(&c3)); @@ -1788,16 +1821,12 @@ QTRY_COMPARE(spyCR.count(), 0); /* Batch modifies */ - QContactDetailDefinition nameDef = m1->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact); QContactName modifiedName = c.detail(QContactName::DefinitionName); - setContactName(nameDef, modifiedName, "This is modified number 1"); - c.saveDetail(&modifiedName); + saveContactName(&c, nameDef, &modifiedName, "This is modified number 1"); modifiedName = c2.detail(QContactName::DefinitionName); - setContactName(nameDef, modifiedName, "This is modified number 2"); - c2.saveDetail(&modifiedName); + saveContactName(&c2, nameDef, &modifiedName, "This is modified number 2"); modifiedName = c3.detail(QContactName::DefinitionName); - setContactName(nameDef, modifiedName, "This is modified number 3"); - c3.saveDetail(&modifiedName); + saveContactName(&c3, nameDef, &modifiedName, "This is modified number 3"); batchAdd.clear(); batchAdd << c << c2 << c3; @@ -1808,7 +1837,7 @@ /* Batch removes */ batchRemove << c.id().localId() << c2.id().localId() << c3.id().localId(); - QVERIFY(m1->removeContacts(&batchRemove, &errorMap)); + 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())); @@ -1820,13 +1849,11 @@ if (!m1->hasFeature(QContactManager::Anonymous)) { // verify that signals are emitted for modifications made to other managers (same id). QContactName ncs = c.detail(QContactName::DefinitionName); - ncs.setSuffix("Test"); - c.saveDetail(&ncs); + saveContactName(&c, nameDef, &ncs, "Test"); c.setId(QContactId()); // reset id so save can succeed. - m2->saveContact(&c); - ncs.setPrefix("Test2"); - c.saveDetail(&ncs); - m2->saveContact(&c); + QVERIFY(m2->saveContact(&c)); + saveContactName(&c, nameDef, &ncs, "Test2"); + QVERIFY(m2->saveContact(&c)); QTRY_COMPARE(spyCA.count(), 1); // check that we received the update signals. QTRY_COMPARE(spyCM.count(), 1); // check that we received the update signals. m2->removeContact(c.localId()); @@ -1891,7 +1918,7 @@ } foreach(QContactDetailDefinition def, defs.values()) { - QMap fields = def.fields(); + QMap fields = def.fields(); // Again some sanity checking if (fields.keys().count() != fields.uniqueKeys().count()) { @@ -1907,7 +1934,7 @@ QVERIFY(fields.keys().count() == fields.uniqueKeys().count()); } - foreach(QContactDetailDefinitionField field, def.fields().values()) { + foreach(QContactDetailFieldDefinition field, def.fields().values()) { // Sanity check the allowed values if (field.allowableValues().count() > 0) { if (field.dataType() == QVariant::StringList) { @@ -1991,7 +2018,7 @@ badfields.insert("Bad allowed", badfield); invalidAllowedValuesDef.setFields(badfields); - /* XXX Multiply defined fields.. depends on semantics. */ + /* XXX Multiply defined fields.. depends on semantichangeSet. */ if (cm->hasFeature(QContactManager::MutableDefinitions)) { /* First do some negative testing */ @@ -2095,10 +2122,9 @@ /* Try to make this a bit more consistent by using a single name */ QContact d; QContactName name; - setContactName(cm->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact), name, "Wesley"); + saveContactName(&d, cm->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact), &name, "Wesley"); QVERIFY(d.displayLabel().isEmpty()); - QVERIFY(d.saveDetail(&name)); QString synth = cm->synthesizedDisplayLabel(d); @@ -2141,7 +2167,7 @@ // create a sample contact QContactAvatar a; - a.setAvatar("test.png"); + a.setImageUrl(QUrl("test.png")); QContactPhoneNumber p1; p1.setNumber("12345"); QContactPhoneNumber p2; @@ -2151,15 +2177,13 @@ QContactUrl u; u.setUrl("http://test.nokia.com"); QContactName n; - setContactName(cm->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact), n, "TestContact"); - QContact c; + saveContactName(&c, cm->detailDefinition(QContactName::DefinitionName, QContactType::TypeContact), &n, "TestContact"); c.saveDetail(&a); c.saveDetail(&p1); c.saveDetail(&p2); c.saveDetail(&p3); c.saveDetail(&u); - c.saveDetail(&n); // set a preference for dialing a particular saved phonenumber. c.setPreferredDetail("Dial", p2); @@ -2178,59 +2202,59 @@ { QContactLocalId id(1); - QContactChangeSet cs; - QVERIFY(cs.addedContacts().isEmpty()); - QVERIFY(cs.changedContacts().isEmpty()); - QVERIFY(cs.removedContacts().isEmpty()); - - cs.addedContacts().insert(id); - QVERIFY(!cs.addedContacts().isEmpty()); - QVERIFY(cs.changedContacts().isEmpty()); - QVERIFY(cs.removedContacts().isEmpty()); - QVERIFY(cs.addedContacts().contains(id)); - - cs.changedContacts().insert(id); - cs.changedContacts().insert(id); - QVERIFY(cs.changedContacts().size() == 1); // set, should only be added once. - QVERIFY(!cs.addedContacts().isEmpty()); - QVERIFY(!cs.changedContacts().isEmpty()); - QVERIFY(cs.removedContacts().isEmpty()); - QVERIFY(cs.changedContacts().contains(id)); - - QVERIFY(cs.dataChanged() == false); - QContactChangeSet cs2; - cs2 = cs; - QVERIFY(cs.addedContacts() == cs2.addedContacts()); - cs.emitSignals(0); - - cs2.clear(); - QVERIFY(cs.addedContacts() != cs2.addedContacts()); - - QContactChangeSet cs3(cs2); - QVERIFY(cs.addedContacts() != cs3.addedContacts()); - QVERIFY(cs2.addedContacts() == cs3.addedContacts()); - - cs.setDataChanged(true); - QVERIFY(cs.dataChanged() == true); - QVERIFY(cs.dataChanged() != cs2.dataChanged()); - QVERIFY(cs.dataChanged() != cs3.dataChanged()); - cs.emitSignals(0); - - cs.addedRelationshipsContacts().insert(id); - cs.emitSignals(0); - cs.removedRelationshipsContacts().insert(id); - cs.emitSignals(0); - - cs.oldAndNewSelfContactId() = QPair(QContactLocalId(0), id); - cs2 = cs; - QVERIFY(cs2.addedRelationshipsContacts() == cs.addedRelationshipsContacts()); - QVERIFY(cs2.removedRelationshipsContacts() == cs.removedRelationshipsContacts()); - QVERIFY(cs2.oldAndNewSelfContactId() == cs.oldAndNewSelfContactId()); - cs.emitSignals(0); - cs.oldAndNewSelfContactId() = QPair(id, QContactLocalId(0)); - QVERIFY(cs2.oldAndNewSelfContactId() != cs.oldAndNewSelfContactId()); - cs.setDataChanged(true); - cs.emitSignals(0); + QContactChangeSet changeSet; + QVERIFY(changeSet.addedContacts().isEmpty()); + QVERIFY(changeSet.changedContacts().isEmpty()); + QVERIFY(changeSet.removedContacts().isEmpty()); + + changeSet.insertAddedContact(id); + QVERIFY(!changeSet.addedContacts().isEmpty()); + QVERIFY(changeSet.changedContacts().isEmpty()); + QVERIFY(changeSet.removedContacts().isEmpty()); + QVERIFY(changeSet.addedContacts().contains(id)); + + changeSet.insertChangedContact(id); + changeSet.insertChangedContact(id); + QVERIFY(changeSet.changedContacts().size() == 1); // set, should only be added once. + QVERIFY(!changeSet.addedContacts().isEmpty()); + QVERIFY(!changeSet.changedContacts().isEmpty()); + QVERIFY(changeSet.removedContacts().isEmpty()); + QVERIFY(changeSet.changedContacts().contains(id)); + + QVERIFY(changeSet.dataChanged() == false); + QContactChangeSet changeSet2; + changeSet2 = changeSet; + QVERIFY(changeSet.addedContacts() == changeSet2.addedContacts()); + changeSet.emitSignals(0); + + changeSet2.clearAll(); + QVERIFY(changeSet.addedContacts() != changeSet2.addedContacts()); + + QContactChangeSet changeSet3(changeSet2); + QVERIFY(changeSet.addedContacts() != changeSet3.addedContacts()); + QVERIFY(changeSet2.addedContacts() == changeSet3.addedContacts()); + + changeSet.setDataChanged(true); + QVERIFY(changeSet.dataChanged() == true); + QVERIFY(changeSet.dataChanged() != changeSet2.dataChanged()); + QVERIFY(changeSet.dataChanged() != changeSet3.dataChanged()); + changeSet.emitSignals(0); + + changeSet.addedRelationshipsContacts().insert(id); + changeSet.emitSignals(0); + changeSet.removedRelationshipsContacts().insert(id); + changeSet.emitSignals(0); + + changeSet.setOldAndNewSelfContactId(QPair(QContactLocalId(0), id)); + changeSet2 = changeSet; + QVERIFY(changeSet2.addedRelationshipsContacts() == changeSet.addedRelationshipsContacts()); + QVERIFY(changeSet2.removedRelationshipsContacts() == changeSet.removedRelationshipsContacts()); + QVERIFY(changeSet2.oldAndNewSelfContactId() == changeSet.oldAndNewSelfContactId()); + changeSet.emitSignals(0); + changeSet.setOldAndNewSelfContactId(QPair(id, QContactLocalId(0))); + QVERIFY(changeSet2.oldAndNewSelfContactId() != changeSet.oldAndNewSelfContactId()); + changeSet.setDataChanged(true); + changeSet.emitSignals(0); } void tst_QContactManager::selfContactId() @@ -2515,31 +2539,29 @@ QVERIFY(cm->error() == QContactManager::NotSupportedError); QVERIFY(!cm->removeRelationship(r1)); QVERIFY(cm->error() == QContactManager::NotSupportedError); - QVERIFY(cm->saveRelationships(&batchList).isEmpty()); - QVERIFY(cm->error() == QContactManager::NotSupportedError); - QVERIFY(cm->removeRelationships(batchList).isEmpty()); + cm->saveRelationships(&batchList, NULL); QVERIFY(cm->error() == QContactManager::NotSupportedError); // test retrieval QList retrieveList; - retrieveList = cm->relationships(source.id(), QContactRelationshipFilter::First); + retrieveList = cm->relationships(source.id(), QContactRelationship::First); QVERIFY(retrieveList.isEmpty()); QVERIFY(cm->error() == QContactManager::NotSupportedError); - retrieveList = cm->relationships(source.id(), QContactRelationshipFilter::Second); + retrieveList = cm->relationships(source.id(), QContactRelationship::Second); QVERIFY(retrieveList.isEmpty()); QVERIFY(cm->error() == QContactManager::NotSupportedError); - retrieveList = cm->relationships(source.id()); // Either + retrieveList = cm->relationships(source.id(), QContactRelationship::Either); // Either QVERIFY(retrieveList.isEmpty()); QVERIFY(cm->error() == QContactManager::NotSupportedError); - retrieveList = cm->relationships(QContactRelationship::HasManager, source.id(), QContactRelationshipFilter::First); + retrieveList = cm->relationships(QContactRelationship::HasManager, source.id(), QContactRelationship::First); QVERIFY(retrieveList.isEmpty()); QVERIFY(cm->error() == QContactManager::NotSupportedError); - retrieveList = cm->relationships(QContactRelationship::HasManager, source.id(), QContactRelationshipFilter::Second); + retrieveList = cm->relationships(QContactRelationship::HasManager, source.id(), QContactRelationship::Second); QVERIFY(retrieveList.isEmpty()); QVERIFY(cm->error() == QContactManager::NotSupportedError); - retrieveList = cm->relationships(QContactRelationship::HasManager, source.id(), QContactRelationshipFilter::Either); + retrieveList = cm->relationships(QContactRelationship::HasManager, source.id(), QContactRelationship::Either); QVERIFY(retrieveList.isEmpty()); QVERIFY(cm->error() == QContactManager::NotSupportedError); retrieveList = cm->relationships(QContactRelationship::HasManager, source.id()); @@ -2552,7 +2574,18 @@ } // Get supported relationship types - QStringList availableRelationshipTypes = cm->supportedRelationshipTypes(); + QStringList availableRelationshipTypes; + if (cm->isRelationshipTypeSupported(QContactRelationship::HasMember)) + availableRelationshipTypes << QContactRelationship::HasMember; + if (cm->isRelationshipTypeSupported(QContactRelationship::HasAssistant)) + availableRelationshipTypes << QContactRelationship::HasAssistant; + if (cm->isRelationshipTypeSupported(QContactRelationship::HasManager)) + availableRelationshipTypes << QContactRelationship::HasManager; + if (cm->isRelationshipTypeSupported(QContactRelationship::HasSpouse)) + availableRelationshipTypes << QContactRelationship::HasSpouse; + if (cm->isRelationshipTypeSupported(QContactRelationship::IsSameAs)) + availableRelationshipTypes << QContactRelationship::IsSameAs; + // Check arbitary relationship support if (cm->hasFeature(QContactManager::ArbitraryRelationshipTypes)) { @@ -2612,7 +2645,7 @@ // remove the dest1 contact, relationship should be removed. cm->removeContact(dest1.localId()); - QCOMPARE(cm->relationships(availableRelationshipTypes.at(0), dest1Uri, QContactRelationshipFilter::Second).count(), 0); + QCOMPARE(cm->relationships(availableRelationshipTypes.at(0), dest1Uri, QContactRelationship::Second).count(), 0); // modify and save the relationship customRelationshipOne.setSecond(dest2Uri); @@ -2656,13 +2689,13 @@ source = cm->contact(source.localId()); // and test again. - QVERIFY(source.relatedContacts(QString(), QContactRelationshipFilter::First).isEmpty()); // source is always the first, so this should be empty. - QVERIFY(source.relatedContacts(QString(), QContactRelationshipFilter::Second).contains(dest2.id())); - QVERIFY(source.relatedContacts(QString(), QContactRelationshipFilter::Either).contains(dest2.id())); - QVERIFY(source.relatedContacts(QString(), QContactRelationshipFilter::Second).contains(dest3.id())); - QVERIFY(source.relatedContacts(QString(), QContactRelationshipFilter::Either).contains(dest3.id())); - QVERIFY(source.relatedContacts(availableRelationshipTypes.at(0), QContactRelationshipFilter::Second).contains(dest2.id())); - QVERIFY(source.relatedContacts(availableRelationshipTypes.at(0), QContactRelationshipFilter::First).isEmpty()); + QVERIFY(source.relatedContacts(QString(), QContactRelationship::First).isEmpty()); // source is always the first, so this should be empty. + QVERIFY(source.relatedContacts(QString(), QContactRelationship::Second).contains(dest2.id())); + QVERIFY(source.relatedContacts(QString(), QContactRelationship::Either).contains(dest2.id())); + QVERIFY(source.relatedContacts(QString(), QContactRelationship::Second).contains(dest3.id())); + QVERIFY(source.relatedContacts(QString(), QContactRelationship::Either).contains(dest3.id())); + QVERIFY(source.relatedContacts(availableRelationshipTypes.at(0), QContactRelationship::Second).contains(dest2.id())); + QVERIFY(source.relatedContacts(availableRelationshipTypes.at(0), QContactRelationship::First).isEmpty()); QVERIFY(dest2.relatedContacts().contains(source.id())); QVERIFY(dest2.relationships().contains(customRelationshipOne)); @@ -2670,9 +2703,9 @@ QVERIFY(dest2.relationships(availableRelationshipTypes.at(0)).contains(customRelationshipOne)); QVERIFY(!dest2.relationships(availableRelationshipTypes.at(0)).contains(customRelationshipTwo)); QVERIFY(dest2.relatedContacts(availableRelationshipTypes.at(0)).contains(source.id())); - QVERIFY(dest2.relatedContacts(availableRelationshipTypes.at(0), QContactRelationshipFilter::First).contains(source.id())); - QVERIFY(dest2.relatedContacts(availableRelationshipTypes.at(0), QContactRelationshipFilter::Second).isEmpty()); - QVERIFY(!dest2.relatedContacts(availableRelationshipTypes.at(0), QContactRelationshipFilter::Second).contains(source.id())); + QVERIFY(dest2.relatedContacts(availableRelationshipTypes.at(0), QContactRelationship::First).contains(source.id())); + QVERIFY(dest2.relatedContacts(availableRelationshipTypes.at(0), QContactRelationship::Second).isEmpty()); + QVERIFY(!dest2.relatedContacts(availableRelationshipTypes.at(0), QContactRelationship::Second).contains(source.id())); QVERIFY(dest3.relatedContacts().contains(source.id())); QVERIFY(!dest3.relationships().contains(customRelationshipOne)); @@ -2691,8 +2724,8 @@ } if (availableRelationshipTypes.count() > 1) { - QVERIFY(source.relatedContacts(availableRelationshipTypes.at(1), QContactRelationshipFilter::Second).contains(dest3.id())); - QVERIFY(source.relatedContacts(availableRelationshipTypes.at(1), QContactRelationshipFilter::First).isEmpty()); + QVERIFY(source.relatedContacts(availableRelationshipTypes.at(1), QContactRelationship::Second).contains(dest3.id())); + QVERIFY(source.relatedContacts(availableRelationshipTypes.at(1), QContactRelationship::First).isEmpty()); QVERIFY(dest2.relationships(availableRelationshipTypes.at(1)).isEmpty()); @@ -2702,12 +2735,12 @@ QVERIFY(dest3.relatedContacts(availableRelationshipTypes.at(1)).contains(source.id())); QVERIFY(!dest3.relatedContacts(availableRelationshipTypes.at(0)).contains(source.id())); QVERIFY(dest3.relatedContacts(availableRelationshipTypes.at(1)).contains(source.id())); // role = either - QVERIFY(!dest3.relatedContacts(availableRelationshipTypes.at(1), QContactRelationshipFilter::Second).contains(source.id())); - QVERIFY(dest3.relatedContacts(availableRelationshipTypes.at(1), QContactRelationshipFilter::First).contains(source.id())); + QVERIFY(!dest3.relatedContacts(availableRelationshipTypes.at(1), QContactRelationship::Second).contains(source.id())); + QVERIFY(dest3.relatedContacts(availableRelationshipTypes.at(1), QContactRelationship::First).contains(source.id())); QVERIFY(dest2.relatedContacts(availableRelationshipTypes.at(1)).isEmpty()); } else { - QVERIFY(source.relatedContacts(availableRelationshipTypes.at(0), QContactRelationshipFilter::Second).contains(dest3.id())); + QVERIFY(source.relatedContacts(availableRelationshipTypes.at(0), QContactRelationship::Second).contains(dest3.id())); } // Cleanup a bit @@ -2715,7 +2748,7 @@ QVERIFY(cm->removeRelationship(customRelationshipTwo)); // test batch API and ordering in contacts - QList currentRelationships = cm->relationships(source.id(), QContactRelationshipFilter::First); + QList currentRelationships = cm->relationships(source.id(), QContactRelationship::First); QList batchList; QContactRelationship br1, br2, br3; br1.setFirst(source.id()); @@ -2739,64 +2772,25 @@ batchList << br1 << br2 << br3; // ensure that the batch save works properly - cm->saveRelationships(&batchList); - QVERIFY(cm->error() == QContactManager::NoError); - QList batchRetrieve = cm->relationships(source.id(), QContactRelationshipFilter::First); + cm->saveRelationships(&batchList, NULL); + QCOMPARE(cm->error(), QContactManager::NoError); + QList batchRetrieve = cm->relationships(source.id(), QContactRelationship::First); QVERIFY(batchRetrieve.contains(br1)); QVERIFY(batchRetrieve.contains(br2)); QVERIFY(batchRetrieve.contains(br3)); - // Check relationship ordering support - if (cm->hasFeature(QContactManager::RelationshipOrdering)) - { - // test relationship ordering in the contact - source = cm->contact(source.localId()); - QList cachedRelationships = source.relationships(); - QList orderedRelationships = source.relationshipOrder(); - QCOMPARE(cachedRelationships, orderedRelationships); // initially, should be the same - QVERIFY(orderedRelationships.contains(br1)); - QVERIFY(orderedRelationships.contains(br2)); - QVERIFY(orderedRelationships.contains(br3)); - - // ensure that the reordering works as required. - QContactRelationship temp1 = orderedRelationships.takeAt(0); // now fiddle with the order - QContactRelationship temp2 = orderedRelationships.at(0); // this is the new first relationship - orderedRelationships.insert(2, temp1); // and save the old first back at position 3. - source.setRelationshipOrder(orderedRelationships); // set the new relationship order - cm->saveContact(&source); // save the contact to persist the new order - source = cm->contact(source.localId()); // reload the contact - QCOMPARE(source.relationshipOrder(), orderedRelationships); // ensure that it was persisted. - - // now lets try a negative reordering test: adding relationships which don't exist in the database. - QContactRelationship invalidRel; - invalidRel.setFirst(source.id()); - invalidRel.setSecond(dest2.id()); - invalidRel.setRelationshipType("test-nokia-invalid-relationship-type"); - orderedRelationships << invalidRel; - source.setRelationshipOrder(orderedRelationships); - QVERIFY(!cm->saveContact(&source)); - QVERIFY(cm->error() == QContactManager::InvalidRelationshipError); - orderedRelationships.removeOne(br3); - source.setRelationshipOrder(orderedRelationships); - QVERIFY(!cm->saveContact(&source)); - QVERIFY(cm->error() == QContactManager::InvalidRelationshipError); - source.setRelationshipOrder(QList()); - QVERIFY(!cm->saveContact(&source)); - QVERIFY(cm->error() == QContactManager::InvalidRelationshipError); - } - // remove a single relationship QVERIFY(cm->removeRelationship(br3)); - batchRetrieve = cm->relationships(source.id(), QContactRelationshipFilter::First); + batchRetrieve = cm->relationships(source.id(), QContactRelationship::First); QVERIFY(batchRetrieve.contains(br1)); QVERIFY(batchRetrieve.contains(br2)); QVERIFY(!batchRetrieve.contains(br3)); // has already been removed. // now ensure that the batch remove works and we get returned to the original state. batchList.removeOne(br3); - cm->removeRelationships(batchList); + cm->removeRelationships(batchList, NULL); QVERIFY(cm->error() == QContactManager::NoError); - QCOMPARE(cm->relationships(source.id(), QContactRelationshipFilter::First), currentRelationships); + QCOMPARE(cm->relationships(source.id(), QContactRelationship::First), currentRelationships); // attempt to save relationships between an existing source but non-existent destination QContactId nonexistentDest; @@ -2822,7 +2816,7 @@ maliciousRel.setRelationshipType("nokia-test-invalid-relationship-type"); QVERIFY(!cm->saveRelationship(&maliciousRel)); - // attempt to save a circular relationship + // attempt to save a circular relationship - should fail! maliciousRel.setFirst(source.id()); maliciousRel.setSecond(source.id()); maliciousRel.setRelationshipType(availableRelationshipTypes.at(0)); @@ -2857,19 +2851,30 @@ QVERIFY(cm->error() == QContactManager::DoesNotExistError || cm->error() == QContactManager::InvalidRelationshipError); QCOMPARE(cm->relationships().count(), relationshipsCount); // should be unchanged. + // now we want to ensure that a relationship is removed if one of the contacts is removed. + customRelationshipOne.setFirst(source.id()); + customRelationshipOne.setSecond(dest2.id()); + customRelationshipOne.setRelationshipType(availableRelationshipTypes.at(0)); + QVERIFY(cm->saveRelationship(&customRelationshipOne)); + source = cm->contact(source.localId()); + dest2 = cm->contact(dest2.localId()); + QVERIFY(cm->removeContact(dest2.localId())); // remove dest2, the relationship should be removed + QVERIFY(cm->relationships(availableRelationshipTypes.at(0), dest2.id(), QContactRelationship::Second).isEmpty()); + source = cm->contact(source.localId()); + QVERIFY(!source.relatedContacts().contains(dest2.id())); // and it shouldn't appear in cache. + // now clean up and remove our dests. QVERIFY(cm->removeContact(source.localId())); - QVERIFY(cm->removeContact(dest2.localId())); QVERIFY(cm->removeContact(dest3.localId())); // attempt to save relationships with nonexistent contacts QVERIFY(!cm->saveRelationship(&br1)); QVERIFY(cm->error() == QContactManager::InvalidRelationshipError); - cm->saveRelationships(&batchList); + cm->saveRelationships(&batchList, NULL); QVERIFY(cm->error() == QContactManager::InvalidRelationshipError); QVERIFY(!cm->removeRelationship(br1)); QVERIFY(cm->error() == QContactManager::DoesNotExistError || cm->error() == QContactManager::InvalidRelationshipError); - cm->removeRelationships(batchList); + cm->removeRelationships(batchList, NULL); QVERIFY(cm->error() == QContactManager::DoesNotExistError || cm->error() == QContactManager::InvalidRelationshipError); } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactmanagerdataholder.h --- a/qtcontactsmobility/tests/auto/qcontactmanagerdataholder.h Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactmanagerdataholder.h Mon May 03 12:24:20 2010 +0300 @@ -82,7 +82,8 @@ savedContacts.insert(cm->managerName(),contacts); QList ids = cm->contactIds(); QMap errorMap; - cm->removeContacts(&ids, &errorMap); + cm->removeContacts(ids, &errorMap); + ids.clear(); delete cm; } } diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactmanagerfiltering/tst_qcontactmanagerfiltering.cpp --- a/qtcontactsmobility/tests/auto/qcontactmanagerfiltering/tst_qcontactmanagerfiltering.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactmanagerfiltering/tst_qcontactmanagerfiltering.cpp Mon May 03 12:24:20 2010 +0300 @@ -115,6 +115,9 @@ void detailStringFiltering(); // XXX should take all managers void detailStringFiltering_data(); + void detailPhoneNumberFiltering(); + void detailPhoneNumberFiltering_data(); + void actionPlugins(); void actionFiltering(); void actionFiltering_data(); @@ -160,6 +163,12 @@ managerNames.removeAll("testdummy"); managerNames.removeAll("teststaticdummy"); managerNames.removeAll("maliciousplugin"); +#if defined(Q_OS_SYMBIAN) + // TODO: Analyze fails on symbiansim backend. Simply disable testing of + // symbiansim backend for now to make sure the fails do not steal attention + // from possible fails in symbian backend. + managerNames.removeAll("symbiansim"); +#endif foreach(QString mgr, managerNames) { QMap params; @@ -249,9 +258,9 @@ QString es; // empty string QString name = QContactName::DefinitionName; - QString firstname = QContactName::FieldFirst; - QString lastname = QContactName::FieldLast; - QString middlename = QContactName::FieldMiddle; + QString firstname = QContactName::FieldFirstName; + QString lastname = QContactName::FieldLastName; + QString middlename = QContactName::FieldMiddleName; QString prefixname = QContactName::FieldPrefix; QString suffixname = QContactName::FieldSuffix; QString nickname = QContactNickname::DefinitionName; @@ -324,7 +333,7 @@ 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"; + newMRow("Phone number = 555, keypad collation", manager) << manager << phonenumber << number << QVariant("555") << (int) (QContactFilter::MatchKeypadCollation | QContactFilter::MatchStartsWith) << "ab"; /* Converting other types to strings */ QPair defAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("Integer"); @@ -370,6 +379,120 @@ QCOMPARE_UNSORTED(output, expected); } +void tst_QContactManagerFiltering::detailPhoneNumberFiltering_data() +{ + QTest::addColumn("cm"); + QTest::addColumn("defname"); + QTest::addColumn("fieldname"); + QTest::addColumn("value"); + QTest::addColumn("matchflags"); + QTest::addColumn("expected"); + + // ITU-T standard keypad collation: + // 2 = abc, 3 = def, 4 = ghi, 5 = jkl, 6 = mno, 7 = pqrs, 8 = tuv, 9 = wxyz, 0 = space + + QString phoneDef = QContactPhoneNumber::DefinitionName; + QString phoneField = QContactPhoneNumber::FieldNumber; + QString nameDef = QContactName::DefinitionName; + QString nameField = QContactName::FieldFirstName; // just test the first name. + + // purely to test phone number filtering. + for (int i = 0; i < managers.size(); i++) { + QContactManager *manager = managers.at(i); + + // first, keypad collation testing (ITU-T / T9 testing) + QTest::newRow("t9 aaron") << manager << nameDef << nameField << QVariant(QString("22766")) << (int)(QContactFilter::MatchKeypadCollation) << "a"; + QTest::newRow("t9 bob") << manager << nameDef << nameField << QVariant(QString("262")) << (int)(QContactFilter::MatchKeypadCollation) << "b"; + QTest::newRow("t9 john") << manager << nameDef << nameField << QVariant(QString("5646")) << (int)(QContactFilter::MatchKeypadCollation) << "efg"; + QTest::newRow("t9 bo") << manager << nameDef << nameField << QVariant(QString("26")) << (int)(QContactFilter::MatchKeypadCollation | QContactFilter::MatchStartsWith) << "bc"; // bob, boris + QTest::newRow("t9 zzzz") << manager << nameDef << nameField << QVariant(QString("9999")) << (int)(QContactFilter::MatchKeypadCollation) << ""; // nobody. + + // now do phone number matching - first, aaron's phone number + QTest::newRow("a phone hyphen") << manager << phoneDef << phoneField << QVariant(QString("555-1212")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone plus") << manager << phoneDef << phoneField << QVariant(QString("+5551212")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone brackets") << manager << phoneDef << phoneField << QVariant(QString("(555)1212")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone nospaces") << manager << phoneDef << phoneField << QVariant(QString("5551212")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone single space") << manager << phoneDef << phoneField << QVariant(QString("555 1212")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone random spaces") << manager << phoneDef << phoneField << QVariant(QString("55 512 12")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone every space") << manager << phoneDef << phoneField << QVariant(QString("5 5 5 1 2 1 2")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone plus hyphen") << manager << phoneDef << phoneField << QVariant(QString("+555-1212")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone plus brackets") << manager << phoneDef << phoneField << QVariant(QString("+5(55)1212")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone plus brackets hyphen") << manager << phoneDef << phoneField << QVariant(QString("+5(55)1-212")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + QTest::newRow("a phone plus brackets hyphen spaces") << manager << phoneDef << phoneField << QVariant(QString("+5 (55) 1-212")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; + + // XXX TODO: should we test for character to number conversions (eg, dial 1800-PESTCONTROL) etc + //QTest::newRow("a phone characters") << manager << phoneDef << phoneField << QVariant(QString("jjj1a1a")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; // 5551212 + //QTest::newRow("a phone characters") << manager << phoneDef << phoneField << QVariant(QString("jkl1b1a")) << (int)(QContactFilter::MatchPhoneNumber) << "a"; // 5551212 + + // then matches bob's phone number + QTest::newRow("b phone hyphen") << manager << phoneDef << phoneField << QVariant(QString("555-3456")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone plus") << manager << phoneDef << phoneField << QVariant(QString("+5553456")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone brackets") << manager << phoneDef << phoneField << QVariant(QString("(555)3456")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone nospaces") << manager << phoneDef << phoneField << QVariant(QString("5553456")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone single space") << manager << phoneDef << phoneField << QVariant(QString("555 3456")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone random spaces") << manager << phoneDef << phoneField << QVariant(QString("55 534 56")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone every space") << manager << phoneDef << phoneField << QVariant(QString("5 5 5 3 4 5 6")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone plus hyphen") << manager << phoneDef << phoneField << QVariant(QString("+555-3456")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone plus brackets") << manager << phoneDef << phoneField << QVariant(QString("+5(55)3456")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone plus brackets hyphen") << manager << phoneDef << phoneField << QVariant(QString("+5(55)3-456")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + QTest::newRow("b phone plus brackets hyphen spaces") << manager << phoneDef << phoneField << QVariant(QString("+5 (55) 3-456")) << (int)(QContactFilter::MatchPhoneNumber) << "b"; + + // then match no phone numbers (negative testing) -- 555-9999 matches nobody in our test set. + QTest::newRow("no phone hyphen") << manager << phoneDef << phoneField << QVariant(QString("555-9999")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone plus") << manager << phoneDef << phoneField << QVariant(QString("+5559999")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone brackets") << manager << phoneDef << phoneField << QVariant(QString("(555)9999")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone nospaces") << manager << phoneDef << phoneField << QVariant(QString("5559999")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone single space") << manager << phoneDef << phoneField << QVariant(QString("555 9999")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone random spaces") << manager << phoneDef << phoneField << QVariant(QString("55 599 99")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone every space") << manager << phoneDef << phoneField << QVariant(QString("5 5 5 9 9 9 9")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone plus hyphen") << manager << phoneDef << phoneField << QVariant(QString("+555-9999")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone plus brackets") << manager << phoneDef << phoneField << QVariant(QString("+5(55)9999")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone plus brackets hyphen") << manager << phoneDef << phoneField << QVariant(QString("+5(55)9-999")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + QTest::newRow("no phone plus brackets hyphen spaces") << manager << phoneDef << phoneField << QVariant(QString("+5 (55) 9-999")) << (int)(QContactFilter::MatchPhoneNumber) << ""; + + // then match both aaron and bob via starts with + QTest::newRow("ab phone starts nospace") << manager << phoneDef << phoneField << QVariant(QString("555")) << (int)(QContactFilter::MatchPhoneNumber | QContactFilter::MatchStartsWith) << "ab"; + QTest::newRow("ab phone starts hyphen") << manager << phoneDef << phoneField << QVariant(QString("555-")) << (int)(QContactFilter::MatchPhoneNumber | QContactFilter::MatchStartsWith) << "ab"; + QTest::newRow("ab phone starts space") << manager << phoneDef << phoneField << QVariant(QString("55 5")) << (int)(QContactFilter::MatchPhoneNumber | QContactFilter::MatchStartsWith) << "ab"; + QTest::newRow("ab phone starts brackets") << manager << phoneDef << phoneField << QVariant(QString("(555)")) << (int)(QContactFilter::MatchPhoneNumber | QContactFilter::MatchStartsWith) << "ab"; + QTest::newRow("ab phone starts plus") << manager << phoneDef << phoneField << QVariant(QString("+555")) << (int)(QContactFilter::MatchPhoneNumber | QContactFilter::MatchStartsWith) << "ab"; + QTest::newRow("ab phone starts hyphen space") << manager << phoneDef << phoneField << QVariant(QString("5 55-")) << (int)(QContactFilter::MatchPhoneNumber | QContactFilter::MatchStartsWith) << "ab"; + QTest::newRow("ab phone starts hyphen space brackets") << manager << phoneDef << phoneField << QVariant(QString("5 (55)-")) << (int)(QContactFilter::MatchPhoneNumber | QContactFilter::MatchStartsWith) << "ab"; + QTest::newRow("ab phone starts hyphen space brackets plus") << manager << phoneDef << phoneField << QVariant(QString("+5 (55)-")) << (int)(QContactFilter::MatchPhoneNumber | QContactFilter::MatchStartsWith) << "ab"; + } +} + +void tst_QContactManagerFiltering::detailPhoneNumberFiltering() +{ + QFETCH(QContactManager*, cm); + QFETCH(QString, defname); + QFETCH(QString, fieldname); + QFETCH(QVariant, value); + QFETCH(int, matchflags); + QFETCH(QString, expected); + + // note: this test is exactly the same as string filtering, but uses different fields and specific matchflags. + + QList contacts = contactsAddedToManagers.values(cm); + QList ids; + + QContactDetailFilter df; + df.setDetailDefinitionName(defname, fieldname); + df.setValue(value); + df.setMatchFlags(QContactFilter::MatchFlags(matchflags)); + + if (cm->managerName() == "memory") { + /* At this point, since we're using memory, assume the filter isn't really supported */ + QVERIFY(cm->isFilterSupported(df) == false); + } + + ids = cm->contactIds(df); + + QString output = convertIds(contacts, ids); + //QSKIP("TODO: fix default implementation of phone number matching!", SkipSingle); + QCOMPARE_UNSORTED(output, expected); +} + void tst_QContactManagerFiltering::detailVariantFiltering_data() { QTest::addColumn("cm"); @@ -390,8 +513,8 @@ newMRow("no def name", manager) << manager << es << "value" << false << ev << es; /* Strings (name) */ - newMRow("first name presence", manager) << manager << "Name" << QString(QLatin1String(QContactName::FieldFirst)) << false << ev << "abcdefg"; - newMRow("first name == Aaron", manager) << manager << "Name" << QString(QLatin1String(QContactName::FieldFirst)) << true << QVariant("Aaron") << "a"; + newMRow("first name presence", manager) << manager << "Name" << QString(QLatin1String(QContactName::FieldFirstName)) << false << ev << "abcdefg"; + newMRow("first name == Aaron", manager) << manager << "Name" << QString(QLatin1String(QContactName::FieldFirstName)) << true << QVariant("Aaron") << "a"; /* * Doubles @@ -654,8 +777,8 @@ QString es; // empty string QString namedef = QContactName::DefinitionName; - QString firstname = QContactName::FieldFirst; - QString lastname = QContactName::FieldLast; + QString firstname = QContactName::FieldFirstName; + QString lastname = QContactName::FieldLastName; QString phonedef = QContactPhoneNumber::DefinitionName; QString phonenum = QContactPhoneNumber::FieldNumber; @@ -1718,48 +1841,54 @@ QContactManager *manager = managers.at(i); // 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"; + QTest::newRow("RF-1") << manager << static_cast(QContactRelationship::Second) << QString(QLatin1String(QContactRelationship::HasMember)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-2") << manager << static_cast(QContactRelationship::First) << QString(QLatin1String(QContactRelationship::HasMember)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-3") << manager << static_cast(QContactRelationship::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"; + QTest::newRow("RF-4") << manager << static_cast(QContactRelationship::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"; + QTest::newRow("RF-5") << manager << static_cast(QContactRelationship::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"; + QTest::newRow("RF-6") << manager << static_cast(QContactRelationship::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"; + QTest::newRow("RF-7") << manager << static_cast(QContactRelationship::Second) << QString(QLatin1String(QContactRelationship::IsSameAs)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-8") << manager << static_cast(QContactRelationship::First) << QString(QLatin1String(QContactRelationship::IsSameAs)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-9") << manager << static_cast(QContactRelationship::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"; + QTest::newRow("RF-10") << manager << static_cast(QContactRelationship::Second) << QString(QLatin1String(QContactRelationship::Aggregates)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-11") << manager << static_cast(QContactRelationship::First) << QString(QLatin1String(QContactRelationship::Aggregates)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-12") << manager << static_cast(QContactRelationship::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"; + QTest::newRow("RF-13") << manager << static_cast(QContactRelationship::Second) << QString(QLatin1String(QContactRelationship::HasManager)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-14") << manager << static_cast(QContactRelationship::First) << QString(QLatin1String(QContactRelationship::HasManager)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-15") << manager << static_cast(QContactRelationship::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"; + QTest::newRow("RF-16") << manager << static_cast(QContactRelationship::Second) << QString(QLatin1String(QContactRelationship::HasSpouse)) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-17") << manager << static_cast(QContactRelationship::First) << QString(QLatin1String(QContactRelationship::HasSpouse)) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-18") << manager << static_cast(QContactRelationship::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() << ""; + if (manager->hasFeature(QContactManager::ArbitraryRelationshipTypes)) { + QTest::newRow("RF-19") << manager << static_cast(QContactRelationship::Second) << QString(QLatin1String("UnknownRelationship")) << static_cast(0) << QString() << "a"; + QTest::newRow("RF-20") << manager << static_cast(QContactRelationship::First) << QString(QLatin1String("UnknownRelationship")) << static_cast(0) << QString() << "b"; + QTest::newRow("RF-21") << manager << static_cast(QContactRelationship::Either) << QString(QLatin1String("UnknownRelationship")) << static_cast(0) << QString() << "ab"; + } else { + QTest::newRow("RF-19") << manager << static_cast(QContactRelationship::Second) << QString(QLatin1String("UnknownRelationship")) << static_cast(0) << QString() << ""; + QTest::newRow("RF-20") << manager << static_cast(QContactRelationship::First) << QString(QLatin1String("UnknownRelationship")) << static_cast(0) << QString() << ""; + QTest::newRow("RF-21") << manager << static_cast(QContactRelationship::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"; + //QTest::newRow("RF-19") << manager << static_cast(QContactRelationship::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"; + //QTest::newRow("RF-20") << manager << static_cast(QContactRelationship::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"; + //QTest::newRow("RF-21") << manager << static_cast(QContactRelationship::Either) << QString() << static_cast(contactAId.value(manager).localId()) << contactAId.value(manager).managerUri() << "hi"; } } @@ -1815,7 +1944,8 @@ // save and check error code bool succeeded = false; if((cm->hasFeature(QContactManager::Relationships) - && cm->supportedRelationshipTypes().contains(relationshipType)) + && cm->isRelationshipTypeSupported(relationshipType, contactA.type()) + && cm->isRelationshipTypeSupported(relationshipType, contactB.type())) || cm->hasFeature(QContactManager::ArbitraryRelationshipTypes)) { succeeded = true; QVERIFY(cm->saveRelationship(&h2i)); @@ -1831,7 +1961,7 @@ relatedContactId.setManagerUri(otherManagerUri); QContactRelationshipFilter crf; - crf.setRelatedContactRole(static_cast(relatedContactRole)); + crf.setRelatedContactRole(static_cast(relatedContactRole)); crf.setRelationshipType(relationshipType); crf.setRelatedContactId(relatedContactId); @@ -1861,10 +1991,13 @@ if (!cm->hasFeature(QContactManager::Relationships)) { QSKIP("Manager does not support relationships; skipping relationship filtering", SkipSingle); } else if(relationshipType.isEmpty() - || cm->supportedRelationshipTypes().contains(relationshipType)) { + || (cm->isRelationshipTypeSupported(relationshipType, contactA.type()) + && cm->isRelationshipTypeSupported(relationshipType, contactB.type()))) { + // check that the relationship type is supported for both contacts. QCOMPARE_UNSORTED(output, expected); } else { - QSKIP("Manager does not support relationship type; skipping", SkipSingle); + QString msg = "Manager does not support relationship type " + relationshipType + " between " + contactA.type() + " and " + contactB.type() + " type contacts."; + QSKIP(msg.toAscii(), SkipSingle); } } @@ -1878,8 +2011,8 @@ QTest::addColumn("blankpolicyi"); QTest::addColumn("expected"); - QString firstname = QContactName::FieldFirst; - QString lastname = QContactName::FieldLast; + QString firstname = QContactName::FieldFirstName; + QString lastname = QContactName::FieldLastName; QString namedef = QContactName::DefinitionName; QString urldef = QContactUrl::DefinitionName; QString urlfield = QContactUrl::FieldUrl; @@ -1937,7 +2070,7 @@ // so we need to handle the case where e, f & g come back in any order [with first name] // so we just make sure that e,f,g appear once in the output, and remove f,g from both strings - if (defname == QContactName::DefinitionName && fieldname == QContactName::FieldFirst) { + if (defname == QContactName::DefinitionName && fieldname == QContactName::FieldFirstName) { QVERIFY(output.count('e') == 1); QVERIFY(output.count('f') == 1); QVERIFY(output.count('g') == 1); @@ -1957,7 +2090,7 @@ output = convertIds(contacts, ids); - if (defname == QContactName::DefinitionName && fieldname == QContactName::FieldFirst) { + if (defname == QContactName::DefinitionName && fieldname == QContactName::FieldFirstName) { QVERIFY(output.count('e') == 1); QVERIFY(output.count('f') == 1); QVERIFY(output.count('g') == 1); @@ -1988,8 +2121,8 @@ QString es; - QString firstname = QContactName::FieldFirst; - QString lastname = QContactName::FieldLast; + QString firstname = QContactName::FieldFirstName; + QString lastname = QContactName::FieldLastName; QString namedef = QContactName::DefinitionName; QString phonedef = QContactPhoneNumber::DefinitionName; QString numberfield = QContactPhoneNumber::FieldNumber; @@ -2502,6 +2635,12 @@ continue; } + // if read only, we cannot use this definition. + // special case these, since read-only is reported via details, not definitions... + if (def.name() == QString(QLatin1String(QContactName::DefinitionName)) || def.name() == QString(QLatin1String(QContactPresence::DefinitionName))) { + continue; + } + // grab the fields and search for a field of the required type // 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 @@ -2705,9 +2844,12 @@ name.setFirstName("Aaron"); name.setLastName("Aaronson"); - name.setMiddleName("Arne"); - name.setPrefix("Sir"); - name.setSuffix("Dr."); + if (cm->detailDefinition(QContactName::DefinitionName).fields().contains(QContactName::FieldMiddleName)) + name.setMiddleName("Arne"); + if (cm->detailDefinition(QContactName::DefinitionName).fields().contains(QContactName::FieldPrefix)) + name.setPrefix("Sir"); + if (cm->detailDefinition(QContactName::DefinitionName).fields().contains(QContactName::FieldSuffix)) + name.setSuffix("Dr."); QContactNickname nick; nick.setNickname("Sir Aaron"); QContactEmailAddress emailAddr; @@ -3036,7 +3178,29 @@ } /* Static actions for testing matching */ -class QIntegerAction : public QContactAction + +class DummyAction : public QContactAction +{ +public: + QVariantMap metaData() const {return QVariantMap();} + + bool invokeAction(const QContact&, const QContactDetail&, const QVariantMap&) + { + // Well, do something + emit stateChanged(QContactAction::FinishedState); + return true; + } + + QVariantMap results() const + { + return QVariantMap(); + } + + State state() const {return QContactAction::FinishedState;} + +}; + +class QIntegerAction : public DummyAction { Q_OBJECT @@ -3045,8 +3209,6 @@ ~QIntegerAction() {} QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Number", "IntegerCo", 5); } - QVariantMap metadata() const {return QVariantMap();} - QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3056,28 +3218,19 @@ df.setValue(value); return df; } - bool supportsDetail(const QContactDetail& detail) const + bool isDetailSupported(const QContactDetail &detail, const QContact &) const { return detail.definitionName() == defAndFieldNamesForTypeForActions.value("Integer").first && !detail.variantValue(defAndFieldNamesForTypeForActions.value("Integer").second).isNull(); } - - void invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()) + QList supportedDetails(const QContact& contact) const { - Q_UNUSED(contact); - Q_UNUSED(detail); - // Well, do something - emit progress(QContactAction::Finished, QVariantMap()); - } - - QVariantMap result() const - { - return QVariantMap(); + return contact.details(defAndFieldNamesForTypeForActions.value("Integer").first); } }; /* Static actions for testing matching */ -class QPhoneNumberAction : public QContactAction +class QPhoneNumberAction : public DummyAction { Q_OBJECT @@ -3086,8 +3239,6 @@ ~QPhoneNumberAction() {} QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("PhoneNumber", "PhoneNumberCo", 4); } - QVariantMap metadata() const {return QVariantMap();} - QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3096,28 +3247,19 @@ df.setValue(value); return df; } - bool supportsDetail(const QContactDetail& detail) const + bool isDetailSupported(const QContactDetail& detail, const QContact&) const { return detail.definitionName() == QContactPhoneNumber::DefinitionName && !detail.variantValue(QContactPhoneNumber::FieldNumber).isNull(); } - - void invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()) + QList supportedDetails(const QContact& contact) const { - Q_UNUSED(contact); - Q_UNUSED(detail); - // Well, do something - emit progress(QContactAction::Finished, QVariantMap()); - } - - QVariantMap result() const - { - return QVariantMap(); + return contact.details(QContactPhoneNumber::DefinitionName); } }; /* Static actions for testing matching */ -class QDateAction : public QContactAction +class QDateAction : public DummyAction { Q_OBJECT @@ -3126,8 +3268,6 @@ ~QDateAction() {} QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Date", "DateCo", 9); } - QVariantMap metadata() const {return QVariantMap();} - QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3137,27 +3277,19 @@ df.setValue(value); return df; } - bool supportsDetail(const QContactDetail& detail) const + + bool isDetailSupported(const QContactDetail &detail, const QContact &) const { return detail.definitionName() == defAndFieldNamesForTypeForActions.value("Date").first && !detail.variantValue(defAndFieldNamesForTypeForActions.value("Date").second).isNull(); } - - void invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()) + QList supportedDetails(const QContact& contact) const { - Q_UNUSED(contact); - Q_UNUSED(detail); - // Well, do something - emit progress(QContactAction::Finished, QVariantMap()); - } - - QVariantMap result() const - { - return QVariantMap(); + return contact.details(defAndFieldNamesForTypeForActions.value("Date").first); } }; -class QNumberAction : public QContactAction +class QNumberAction : public DummyAction { Q_OBJECT @@ -3166,8 +3298,6 @@ ~QNumberAction() {} QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Number", "NumberCo", 42); } - QVariantMap metadata() const {return QVariantMap();} - QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3184,7 +3314,8 @@ /* We like either doubles or integers */ return df | df2; } - bool supportsDetail(const QContactDetail& detail) const + + bool isDetailSupported(const QContactDetail &detail, const QContact &) const { if (detail.definitionName() == defAndFieldNamesForTypeForActions.value("Double").first && !detail.variantValue(defAndFieldNamesForTypeForActions.value("Double").second).isNull()) { @@ -3198,22 +3329,15 @@ return false; } - - void invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()) + QList supportedDetails(const QContact& contact) const { - Q_UNUSED(contact); - Q_UNUSED(detail); - // Well, do something - emit progress(QContactAction::Finished, QVariantMap()); - } - - QVariantMap result() const - { - return QVariantMap(); + QList retn = contact.details(defAndFieldNamesForTypeForActions.value("Integer").first); + retn.append(contact.details(defAndFieldNamesForTypeForActions.value("Double").first)); + return retn; } }; -class QBooleanAction : public QContactAction +class QBooleanAction : public DummyAction { Q_OBJECT @@ -3222,8 +3346,6 @@ ~QBooleanAction() {} QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Boolean", "BooleanCo", 3); } - QVariantMap metadata() const {return QVariantMap();} - QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3238,27 +3360,18 @@ return QContactInvalidFilter(); } } - bool supportsDetail(const QContactDetail& detail) const + bool isDetailSupported(const QContactDetail &detail, const QContact &) const { return detail.definitionName() == defAndFieldNamesForTypeForActions.value("Bool").first && (detail.value(defAndFieldNamesForTypeForActions.value("Bool").second) == true); } - - void invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail()) + QList supportedDetails(const QContact& contact) const { - Q_UNUSED(contact); - Q_UNUSED(detail); - // Well, do something - emit progress(QContactAction::Finished, QVariantMap()); - } - - QVariantMap result() const - { - return QVariantMap(); + return contact.details(defAndFieldNamesForTypeForActions.value("Bool").first); } }; -class RecursiveAction : public QContactAction +class RecursiveAction : public DummyAction { Q_OBJECT @@ -3267,8 +3380,6 @@ ~RecursiveAction() {} QContactActionDescriptor actionDescriptor() const { return QContactActionDescriptor("Recursive", "RecursiveCo", 3); } - QVariantMap metadata() const {return QVariantMap();} - QVariantMap metaData() const {return QVariantMap();} QContactFilter contactFilter(const QVariant& value) const { @@ -3279,18 +3390,13 @@ af.setValue(value); return af; } - bool supportsDetail(const QContactDetail&) const + bool isDetailSupported(const QContactDetail&, const QContact&) const { return false; } - void invokeAction(const QContact&, const QContactDetail&) + QList supportedDetails(const QContact&) const { - emit progress(QContactAction::Finished, QVariantMap()); - } - - QVariantMap result() const - { - return QVariantMap(); + return QList(); } }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactmanagerplugins/dummyplugin/dummyplugin.cpp --- a/qtcontactsmobility/tests/auto/qcontactmanagerplugins/dummyplugin/dummyplugin.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactmanagerplugins/dummyplugin/dummyplugin.cpp Mon May 03 12:24:20 2010 +0300 @@ -57,7 +57,7 @@ class DummyEngine : public QContactManagerEngine { public: - DummyEngine(const QMap& parameters, QContactManager::Error& error); + DummyEngine(const QMap& parameters, QContactManager::Error* error); DummyEngine(const DummyEngine& other); ~DummyEngine(); DummyEngine& operator=(const DummyEngine& other); @@ -66,16 +66,160 @@ QString managerName() const; /* 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); + QList contacts(QContactManager::Error* error) const; + QContact contact(const QContactLocalId& contactId, QContactManager::Error* error) const; + QContact contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const; + bool saveContact(QContact* contact, bool batch, QContactManager::Error* error); + bool removeContact(const QContactLocalId& contactId, bool batch, QContactManager::Error* error); /* Capabilities reporting */ QStringList capabilities() const; QStringList fastFilterableDefinitions() const; QList supportedDataTypes() const; + + QMap managerParameters() const {return QMap();} + int managerVersion() const {return 0;} + + QList contactIds(const QContactFilter&, const QList&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QList(); + } + + QList contacts(const QContactFilter&, const QList&, const QContactFetchHint&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QList(); + } + + bool saveContacts(QList*, QMap*, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + bool removeContacts(const QList&, QMap*, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + QContact conformingContact(const QContact&, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return QContact(); + } + + /* Synthesize the display label of a contact */ + virtual QString synthesizedDisplayLabel(const QContact&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QString(); + } + + /* "Self" contact id (MyCard) */ + virtual bool setSelfContactId(const QContactLocalId&, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + virtual QContactLocalId selfContactId(QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return 0; + } + + /* Relationships between contacts */ + virtual QList relationships(const QString&, const QContactId&, QContactRelationship::Role, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QList(); + } + + virtual bool saveRelationships(QList*, QMap*, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + virtual bool removeRelationships(const QList&, QMap*, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + /* Validation for saving */ + virtual QContact compatibleContact(const QContact&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QContact(); + } + + virtual bool validateContact(const QContact&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return false; + } + + virtual bool validateDefinition(const QContactDetailDefinition&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return false; + } + + /* Definitions - Accessors and Mutators */ + virtual QMap detailDefinitions(const QString&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QMap(); + } + + virtual QContactDetailDefinition detailDefinition(const QString&, const QString&, QContactManager::Error* error) const + { + *error = QContactManager::NotSupportedError; + return QContactDetailDefinition(); + } + + virtual bool saveDetailDefinition(const QContactDetailDefinition&, const QString&, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + virtual bool removeDetailDefinition(const QString&, const QString&, QContactManager::Error* error) + { + *error = QContactManager::NotSupportedError; + return false; + } + + /* Asynchronous Request Support */ + virtual void requestDestroyed(QContactAbstractRequest*) {} + virtual bool startRequest(QContactAbstractRequest*) {return false;} + virtual bool cancelRequest(QContactAbstractRequest*) {return false;} + virtual bool waitForRequestFinished(QContactAbstractRequest*, int) {return false;} + + /* Capabilities reporting */ + virtual bool hasFeature(QContactManager::ManagerFeature, const QString&) const + { + return false; + } + + virtual bool isRelationshipTypeSupported(const QString&, const QString&) const + { + return false; + } + + virtual bool isFilterSupported(const QContactFilter&) const + { + return false; + } + + virtual QStringList supportedContactTypes() const + { + return QStringList(); + } + }; class Q_DECL_EXPORT DummyEngineFactory : public QObject, public QContactManagerEngineFactory @@ -83,11 +227,11 @@ Q_OBJECT Q_INTERFACES(QtMobility::QContactManagerEngineFactory) public: - QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error& error); + QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error* error); QString managerName() const; }; -QContactManagerEngine* DummyEngineFactory::engine(const QMap& parameters, QContactManager::Error& error) +QContactManagerEngine* DummyEngineFactory::engine(const QMap& parameters, QContactManager::Error* error) { return new DummyEngine(parameters, error); } @@ -102,10 +246,10 @@ } Q_EXPORT_PLUGIN2(DUMMYPLUGINTARGET, DummyEngineFactory); -DummyEngine::DummyEngine(const QMap& parameters, QContactManager::Error& error) +DummyEngine::DummyEngine(const QMap& parameters, QContactManager::Error* error) { Q_UNUSED(parameters); - error = QContactManager::AlreadyExistsError; // Another random choice + *error = QContactManager::AlreadyExistsError; // Another random choice } DummyEngine::DummyEngine(const DummyEngine& other) @@ -144,36 +288,36 @@ #endif } -QList DummyEngine::contacts(QContactManager::Error& error) const +QList DummyEngine::contacts(QContactManager::Error* error) const { QList allCIds; - if (allCIds.count() > 0 && error == QContactManager::NoError) - error = QContactManager::DoesNotExistError; + if (allCIds.count() > 0 && *error == QContactManager::NoError) + *error = QContactManager::DoesNotExistError; return allCIds; } -QContact DummyEngine::contact(const QContactLocalId& contactId, QContactManager::Error& error) const +QContact DummyEngine::contact(const QContactLocalId& contactId, QContactManager::Error* error) const { Q_UNUSED(contactId); - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return QContact(); } -QContact DummyEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const +QContact DummyEngine::contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const { Q_UNUSED(contactId); - Q_UNUSED(definitionRestrictions); - error = QContactManager::DoesNotExistError; + Q_UNUSED(fetchHint); + *error = QContactManager::DoesNotExistError; return QContact(); } -bool DummyEngine::saveContact(QContact* contact, bool batch, QContactManager::Error& error) +bool DummyEngine::saveContact(QContact* contact, bool batch, QContactManager::Error* error) { // ensure that the contact's details conform to their definitions if (!validateContact(*contact, error)) { - error = QContactManager::InvalidDetailError; + *error = QContactManager::InvalidDetailError; return false; } @@ -182,7 +326,7 @@ newId.setManagerUri(managerUri()); newId.setLocalId(5); contact->setId(newId); - error = QContactManager::NoError; + *error = QContactManager::NoError; // if we need to emit signals (ie, this isn't part of a batch operation) // then emit the correct one. @@ -195,14 +339,14 @@ return true; } -bool DummyEngine::removeContact(const QContactLocalId& contactId, bool batch, QContactManager::Error& error) +bool DummyEngine::removeContact(const QContactLocalId& contactId, bool batch, QContactManager::Error* error) { if (contactId != 5) { - error = QContactManager::DoesNotExistError; + *error = QContactManager::DoesNotExistError; return false; } - error = QContactManager::NoError; + *error = QContactManager::NoError; // if we need to emit signals (ie, this isn't part of a batch operation) // then emit the correct one. diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactmanagerplugins/unittest/tst_qcontactmanagerplugins.cpp --- a/qtcontactsmobility/tests/auto/qcontactmanagerplugins/unittest/tst_qcontactmanagerplugins.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactmanagerplugins/unittest/tst_qcontactmanagerplugins.cpp Mon May 03 12:24:20 2010 +0300 @@ -75,14 +75,14 @@ Q_OBJECT Q_INTERFACES(QtMobility::QContactManagerEngineFactory) public: - QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error& error); + QContactManagerEngine* engine(const QMap& parameters, QContactManager::Error* error); QString managerName() const {return "teststaticdummy";} }; -QContactManagerEngine* DummyStaticEngineFactory::engine(const QMap& parameters, QContactManager::Error& error) +QContactManagerEngine* DummyStaticEngineFactory::engine(const QMap& parameters, QContactManager::Error* error) { Q_UNUSED(parameters); - error = QContactManager::LockedError; // random unlikely error + *error = QContactManager::LockedError; // random unlikely error return 0; // always fail, haha } @@ -99,7 +99,7 @@ Q_OBJECT Q_INTERFACES(QtMobility::QContactManagerEngineFactory) public: - QContactManagerEngine* engine(const QMap& , QContactManager::Error& ) {return 0;} + QContactManagerEngine* engine(const QMap& , QContactManager::Error* ) {return 0;} QString managerName() const {return "memory";} }; @@ -112,7 +112,7 @@ Q_OBJECT Q_INTERFACES(QtMobility::QContactManagerEngineFactory) public: - QContactManagerEngine* engine(const QMap& , QContactManager::Error& ) {return 0;} + QContactManagerEngine* engine(const QMap& , QContactManager::Error* ) {return 0;} QString managerName() const {return "invalid";} }; @@ -126,7 +126,7 @@ Q_OBJECT Q_INTERFACES(QtMobility::QContactManagerEngineFactory) public: - QContactManagerEngine* engine(const QMap& , QContactManager::Error& ) {return 0;} + QContactManagerEngine* engine(const QMap& , QContactManager::Error* ) {return 0;} QString managerName() const {return QString();} }; diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qcontactrelationship/tst_qcontactrelationship.cpp --- a/qtcontactsmobility/tests/auto/qcontactrelationship/tst_qcontactrelationship.cpp Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qcontactrelationship/tst_qcontactrelationship.cpp Mon May 03 12:24:20 2010 +0300 @@ -62,6 +62,7 @@ private slots: void operations(); void emptiness(); + void hash(); }; tst_QContactRelationship::tst_QContactRelationship() @@ -139,6 +140,36 @@ QVERIFY(r3 != r1); } +void tst_QContactRelationship::hash() +{ + QContactRelationship r1; + QContactId id1; + id1.setManagerUri("a"); + id1.setLocalId(1); + r1.setFirst(id1); + QContactId id2; + id2.setManagerUri("b"); + id2.setLocalId(2); + r1.setSecond(id2); + r1.setRelationshipType(QContactRelationship::HasMember); + + QContactRelationship r2; + r2.setFirst(id1); + r2.setSecond(id2); + r2.setRelationshipType(QContactRelationship::HasMember); + + QContactRelationship r3; + r3.setFirst(id1); + QContactId id3; + id3.setManagerUri("c"); + id3.setLocalId(3); + r3.setSecond(id3); + r3.setRelationshipType(QContactRelationship::HasMember); + + QVERIFY(qHash(r1) == qHash(r2)); + QVERIFY(qHash(r1) != qHash(r3)); + +} QTEST_MAIN(tst_QContactRelationship) #include "tst_qcontactrelationship.moc" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qlatin1constant/qlatin1constant.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qlatin1constant/qlatin1constant.pro Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,16 @@ +QT += testlib +TEMPLATE=app +TARGET=tst_qlatin1constant +CONFIG+=testcase + +include(../../../common.pri) + +INCLUDEPATH += ../../../src/contacts + +INCLUDEPATH += ../ + +CONFIG += mobility +MOBILITY = contacts + +SOURCES += tst_qlatin1constant.cpp + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qlatin1constant/tst_qlatin1constant.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qlatin1constant/tst_qlatin1constant.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,299 @@ +/**************************************************************************** +** +** 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 + +#include "qtcontactsglobal.h" +#include +#include +#include + +//TESTED_CLASS= +//TESTED_FILES= + +QTM_USE_NAMESPACE + +Q_DEFINE_LATIN1_CONSTANT(a, "a"); +Q_DEFINE_LATIN1_CONSTANT(a2, "a"); +Q_DEFINE_LATIN1_CONSTANT(b, "b"); +Q_DEFINE_LATIN1_CONSTANT(b2, "b"); +Q_DEFINE_LATIN1_CONSTANT(bb, "bb"); +Q_DEFINE_LATIN1_CONSTANT(bb2, "bb"); + +Q_DEFINE_LATIN1_CONSTANT(z, ""); +Q_DEFINE_LATIN1_CONSTANT(z2, ""); + +Q_DEFINE_LATIN1_CONSTANT(z3, "\0"); +Q_DEFINE_LATIN1_CONSTANT(soup, "alphabet soup"); // but you can't have any + +QLatin1String ln(0); +QLatin1String lz(""); +QLatin1String la("a"); +QLatin1String lb("b"); +QLatin1String lbb("bb"); +QLatin1String lsoup("alphabet soup"); + +QString sn; +QString sz(""); +QString sa(la); +QString sb(lb); +QString sbb(lbb); +QString ssoup("alphabet soup"); + +class tst_QLatin1Constant: public QObject +{ +Q_OBJECT + +public: + tst_QLatin1Constant(); + virtual ~tst_QLatin1Constant(); + + // Overload testers + int overloaded(const char *) {return 1;} + //int overloaded(const QLatin1String& ) {return 2;} + int overloaded(QLatin1String ) {return 3;} + int overloaded(const QString& ) {return 4;} + //int overloaded(QString ){return 5;} + //template int overloaded(const QLatin1Constant& ) {return 6;} + template int overloaded(QLatin1Constant ) {return 7;} + int overloaded(const QVariant&) {return 8;} + + // More overload testers + int overloaded2(QLatin1String) {return 3;} + int overloaded2(const QString&) {return 4;} + + int overloaded3(const char*) {return 1;} + int overloaded3(QLatin1String) {return 3;} + + int overloaded4(const char*) {return 1;} + int overloaded4(const QString&) {return 4;} + + // Conversion testers + bool charfunc(const char* str) {return qstrcmp(str, "alphabet soup") == 0;} + bool latfunc(QLatin1String lat) {return qstrcmp(lat.latin1(), "alphabet soup") == 0;} + bool latreffunc(const QLatin1String& lat) {return qstrcmp(lat.latin1(), "alphabet soup") == 0;} + bool strfunc(QString str) {return str == QString::fromAscii("alphabet soup");} + bool strreffunc(const QString& str) {return str == QString::fromAscii("alphabet soup");} + bool varfunc(const QVariant& var) {return (var.type() == QVariant::String) && var.toString() == QString::fromAscii("alphabet soup");} + +private slots: + void hash(); + void conversion(); + void overloads(); + void equals(); + void latinEquals(); + void stringEquals(); + void ordering(); + void latinaccessor(); +}; + +tst_QLatin1Constant::tst_QLatin1Constant() +{ +} + +tst_QLatin1Constant::~tst_QLatin1Constant() +{ +} + +void tst_QLatin1Constant::hash() +{ + // Test that if a == b, hash(a) == hash(b) + // (also for ===) + QVERIFY(qHash(a) == qHash(a)); + QVERIFY(qHash(a) == qHash(a2)); + QVERIFY(qHash(b) == qHash(b)); + QVERIFY(qHash(b) == qHash(b)); + QVERIFY(qHash(bb) == qHash(bb)); + QVERIFY(qHash(bb) == qHash(bb)); + + // As a convenience, make sure that hashing + // the same string gives the same results + // no matter the storage + QVERIFY(qHash(a) == qHash(la)); + QVERIFY(qHash(a) == qHash(sa)); +} + +void tst_QLatin1Constant::equals() +{ + // Check symmetry and dupes + QVERIFY(a == a); + QVERIFY(a == a2); + QVERIFY(a2 == a); + QVERIFY(b == b); + QVERIFY(b == b2); + QVERIFY(b2 == b2); + QVERIFY(bb == bb); + QVERIFY(bb == bb2); + QVERIFY(bb2 == bb); + + QVERIFY(z == z); + QVERIFY(z == z2); + QVERIFY(z2 == z); + + // Now make sure that the length is taken into account + QVERIFY(b != bb2); + QVERIFY(bb2 != b); + QVERIFY(a != z); + QVERIFY(z != a); + + // and just in case something is really wrong + QVERIFY(a != b); + QVERIFY(b != a); +} + +void tst_QLatin1Constant::latinaccessor() +{ + QVERIFY(a.chars == a.latin1()); + QVERIFY(z.latin1() == z.chars); +} + +void tst_QLatin1Constant::latinEquals() +{ + // Test operator== with latin1 strings + QVERIFY(a == la); + QVERIFY(la == a); + QVERIFY(a2 == la); + QVERIFY(la == a2); + QVERIFY(b == lb); + QVERIFY(lb == b); + QVERIFY(bb == lbb); + QVERIFY(lbb == bb); + + QVERIFY(b != lbb); + QVERIFY(lbb != b); + + QVERIFY(a != lb); + QVERIFY(lb != a); + + QVERIFY(z == lz); + QVERIFY((z == ln) == (lz == ln)); // QLatin1String(0) != QLatin1String("") + QVERIFY(lz == z); + QVERIFY((ln == z) == (ln == lz)); +} + +void tst_QLatin1Constant::stringEquals() +{ + // Test operator== with QStrings + QVERIFY(a == sa); + QVERIFY(sa == a); + QVERIFY(a2 == sa); + QVERIFY(sa == a2); + QVERIFY(b == sb); + QVERIFY(sb == b); + QVERIFY(bb == sbb); + QVERIFY(sbb == bb); + + QVERIFY(b != sbb); + QVERIFY(sbb != b); + + QVERIFY(a != sb); + QVERIFY(sb != a); + + QVERIFY(z == sz); + QVERIFY((z == sn) == (sz == sn)); // QString(0) != QString("") + QVERIFY(sz == z); + QVERIFY((sn == z) == (sn == sz)); +} + +void tst_QLatin1Constant::conversion() +{ + QVERIFY(charfunc("alphabet soup")); + QVERIFY(charfunc(soup.chars)); + QVERIFY(charfunc(soup.latin1())); + + QVERIFY(latfunc(lsoup)); + QVERIFY(latreffunc(lsoup)); + + QVERIFY(strfunc(ssoup)); + QVERIFY(strreffunc(ssoup)); + + // See if soup gets converted appropriately + QVERIFY(latfunc(soup)); + QVERIFY(strfunc(soup)); + QVERIFY(latreffunc(soup)); + QVERIFY(strreffunc(soup)); + QVERIFY(varfunc(soup)); + + // Now we also want to make sure that converting to QLatin1String doesn't copy the string + QLatin1String lsoup2 = soup; // implicit operator QLatin1String + QLatin1String lsoup3 = (QLatin1String) soup; // explicit operator QLatin1String + QLatin1String lsoup4 = QLatin1String(soup); // implicit operator QLatin1String + + QVERIFY(lsoup2.latin1() == soup.latin1()); + QVERIFY(lsoup3.latin1() == soup.latin1()); + QVERIFY(lsoup4.latin1() == soup.latin1()); +} + +void tst_QLatin1Constant::overloads() +{ + QVERIFY(overloaded("alphabet soup") == 1); + QVERIFY(overloaded(soup) == 7); + QVERIFY(overloaded(lsoup) == 2 || overloaded(lsoup) == 3); + QVERIFY(overloaded(ssoup) == 4 || overloaded(ssoup) == 5); + + QVERIFY(overloaded2(lsoup) == 3); + QVERIFY(overloaded2(ssoup) == 4); + QCOMPARE(overloaded2(soup.latin1()), 4); // XXX grr, can't call with just soup [ambiguous], this goes to QString + + QVERIFY(overloaded3(lsoup) == 3); + QCOMPARE(overloaded3(soup), 3); // XXX this goes with QLatin1String + + QVERIFY(overloaded4(ssoup) == 4); + QCOMPARE(overloaded4(soup), 4); // XXX this goes with QString +} + +void tst_QLatin1Constant::ordering() +{ + QVERIFY(z < a); + QVERIFY(!(a < z)); + QVERIFY(a < b); + QVERIFY(!(b < a)); + QVERIFY(a < bb); + QVERIFY(!(bb < a)); + QVERIFY(b < bb); + QVERIFY(!(bb < b)); + + QVERIFY(!(a < a)); + QVERIFY(!(z < z)); +} + +QTEST_MAIN(tst_QLatin1Constant) +#include "tst_qlatin1constant.moc" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard21writer/qvcard21writer.pro --- a/qtcontactsmobility/tests/auto/qvcard21writer/qvcard21writer.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qvcard21writer/qvcard21writer.pro Mon May 03 12:24:20 2010 +0300 @@ -16,8 +16,8 @@ ../../../src/contacts/requests \ ../../../src/contacts/filters -HEADERS += ut_qvcard21writer.h -SOURCES += ut_qvcard21writer.cpp +HEADERS += tst_qvcard21writer.h +SOURCES += tst_qvcard21writer.cpp CONFIG += mobility MOBILITY = contacts versit diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard21writer/tst_qvcard21writer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qvcard21writer/tst_qvcard21writer.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,348 @@ +/**************************************************************************** +** +** 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 "tst_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 + +Q_DECLARE_METATYPE(QVersitProperty) + +void tst_QVCard21Writer::init() +{ + mWriter = new QVCard21Writer; + mWriter->setCodec(QTextCodec::codecForName("ISO_8859-1")); +} + +void tst_QVCard21Writer::cleanup() +{ + delete mWriter; +} + +void tst_QVCard21Writer::testEncodeVersitProperty() +{ + QFETCH(QVersitProperty, property); + QFETCH(QByteArray, expectedResult); + QFETCH(QByteArray, codec); + QTextCodec* textCodec = QTextCodec::codecForName(codec); + QByteArray encodedProperty; + QBuffer buffer(&encodedProperty); + mWriter->setDevice(&buffer); + mWriter->setCodec(textCodec); + buffer.open(QIODevice::WriteOnly); + + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); +} + +void tst_QVCard21Writer::testEncodeVersitProperty_data() +{ + QTest::addColumn("property"); + QTest::addColumn("expectedResult"); + QTest::addColumn("codec"); + + QVersitProperty property; + QByteArray expectedResult; + QByteArray codec("ISO-8859_1"); + + // normal case + property.setName(QString::fromAscii("FN")); + property.setValue(QString::fromAscii("John Citizen")); + property.setValueType(QVersitProperty::PlainType); + expectedResult = "FN:John Citizen\r\n"; + QTest::newRow("No parameters") << property << expectedResult << codec; + + // Structured N - escaping should happen for semicolons, not for commas + property.setName(QLatin1String("N")); + property.setValue(QStringList() + << QLatin1String("La;st") // needs to be backslash escaped + << QLatin1String("Fi,rst") + << QLatin1String("Mi:ddle") + << QLatin1String("Pr\\efix") // needs to be QP encoded + << QLatin1String("Suffix")); + property.setValueType(QVersitProperty::CompoundType); + expectedResult = "N;ENCODING=QUOTED-PRINTABLE:La\\;st;Fi,rst;Mi:ddle;Pr=5Cefix;Suffix\r\n"; + QTest::newRow("N property") << property << expectedResult << codec; + + // Structured CATEGORIES - escaping should happen for commas, not semicolons + property.setName(QLatin1String("CATEGORIES")); + property.setValue(QStringList() + << QLatin1String("re;d") + << QLatin1String("gr,een") + << QLatin1String("bl:ue")); + property.setValueType(QVersitProperty::ListType); + expectedResult = "CATEGORIES:re;d,gr\\,een,bl:ue\r\n"; + QTest::newRow("CATEGORIES property") << property << expectedResult << codec; + + // With parameter(s). No special characters in the value. + // -> No need to Quoted-Printable encode the value. + expectedResult = "TEL;HOME:123\r\n"; + property.setName(QString::fromAscii("TEL")); + property.setValue(QString::fromAscii("123")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); + QTest::newRow("With parameters, plain value") << property << expectedResult << codec; + + expectedResult = "EMAIL;HOME;ENCODING=QUOTED-PRINTABLE:john.citizen=40example.com\r\n"; + property.setName(QString::fromAscii("EMAIL")); + property.setValue(QString::fromAscii("john.citizen@example.com")); + QTest::newRow("With parameters, special value") << property << expectedResult << codec; + + // AGENT property with parameter + expectedResult = +"AGENT;X-PARAMETER=VALUE:\r\n\ +BEGIN:VCARD\r\n\ +VERSION:2.1\r\n\ +FN:Secret Agent\r\n\ +END:VCARD\r\n\ +\r\n"; + property.setParameters(QMultiHash()); + property.setName(QString::fromAscii("AGENT")); + property.setValue(QString()); + property.insertParameter(QString::fromAscii("X-PARAMETER"),QString::fromAscii("VALUE")); + QVersitDocument document; + QVersitProperty embeddedProperty; + embeddedProperty.setName(QString(QString::fromAscii("FN"))); + embeddedProperty.setValue(QString::fromAscii("Secret Agent")); + document.addProperty(embeddedProperty); + property.setValue(QVariant::fromValue(document)); + QTest::newRow("AGENT property") << property << expectedResult << codec; + + // Value is base64 encoded. + // Check that the extra folding and the line break are added + 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); + QTest::newRow("base64 encoded") << property << expectedResult << codec; + + // Characters other than ASCII: + expectedResult = "ORG;CHARSET=UTF-8:" + KATAKANA_NOKIA.toUtf8() + "\r\n"; + property = QVersitProperty(); + property.setName(QLatin1String("ORG")); + property.setValue(KATAKANA_NOKIA); + QTest::newRow("non-ASCII") << property << expectedResult << codec; + + // In Shift-JIS codec. + 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); + QTest::newRow("JIS codec") << property << expectedResult << QByteArray("Shift-JIS"); + + // CHARSET and QUOTED-PRINTABLE + 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)); + QTest::newRow("Charset and QP") << property << expectedResult << codec; +} + +void tst_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; + 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")); + 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")); + 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")); + 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")); + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray(";X-PARAM=VALUE;ENCODING=8BIT")); +} + +void tst_QVCard21Writer::testEncodeGroupsAndName() +{ + QVersitProperty property; + QByteArray result; + QBuffer buffer(&result); + mWriter->setDevice(&buffer); + buffer.open(QIODevice::WriteOnly); + + // No groups + + property.setName(QString::fromAscii("name")); + 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"))); + 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); + expected = "group1.group2.NAME"; + mWriter->encodeGroupsAndName(property); + QCOMPARE(result, expected); +} + + +void tst_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(tst_QVCard21Writer) + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard21writer/tst_qvcard21writer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qvcard21writer/tst_qvcard21writer.h Mon May 03 12:24:20 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 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 tst_QVCARD21WRITER_H +#define tst_QVCARD21WRITER_H + +#include +#include + + +QTM_BEGIN_NAMESPACE +class QVCard21Writer; +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE +class tst_QVCard21Writer : public QObject +{ + Q_OBJECT + +private slots: // Tests + + void init(); + void cleanup(); + + void testEncodeVersitProperty(); + void testEncodeVersitProperty_data(); + void testEncodeParameters(); + void testEncodeGroupsAndName(); + void testQuotedPrintableEncode(); +private: // Data + QVCard21Writer* mWriter; +}; + +#endif // tst_QVCARD21WRITER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.cpp --- a/qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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$ -** -****************************************************************************/ - -#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 - -void UT_QVCard21Writer::init() -{ - mWriter = new QVCard21Writer; - mWriter->setCodec(QTextCodec::codecForName("ISO_8859-1")); -} - -void UT_QVCard21Writer::cleanup() -{ - delete mWriter; -} - -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(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(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(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\ -VERSION:2.1\r\n\ -FN:Secret Agent\r\n\ -END:VCARD\r\n\ -\r\n"; - property.setParameters(QMultiHash()); - property.setName(QString::fromAscii("AGENT")); - property.setValue(QString()); - property.insertParameter(QString::fromAscii("X-PARAMETER"),QString::fromAscii("VALUE")); - QVersitDocument document; - QVersitProperty embeddedProperty; - embeddedProperty.setName(QString(QString::fromAscii("FN"))); - embeddedProperty.setValue(QString::fromAscii("Secret Agent")); - document.addProperty(embeddedProperty); - 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 - 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); - 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; - 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")); - 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")); - 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")); - 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")); - 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 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"))); - 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); - 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.h --- a/qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +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 UT_QVCARD21WRITER_H -#define UT_QVCARD21WRITER_H - -#include -#include - - -QTM_BEGIN_NAMESPACE -class QVCard21Writer; -QTM_END_NAMESPACE - -QTM_USE_NAMESPACE -class UT_QVCard21Writer : public QObject -{ - Q_OBJECT - -private slots: // Tests - - void init(); - void cleanup(); - - void testEncodeVersitProperty(); - void testEncodeParameters(); - void testEncodeGroupsAndName(); - void testQuotedPrintableEncode(); - -private: // Data - QVCard21Writer* mWriter; -}; - -#endif // UT_QVCARD21WRITER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard30writer/qvcard30writer.pro --- a/qtcontactsmobility/tests/auto/qvcard30writer/qvcard30writer.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qvcard30writer/qvcard30writer.pro Mon May 03 12:24:20 2010 +0300 @@ -16,8 +16,8 @@ ../../../src/contacts/requests \ ../../../src/contacts/filters -HEADERS += ut_qvcard30writer.h -SOURCES += ut_qvcard30writer.cpp +HEADERS += tst_qvcard30writer.h +SOURCES += tst_qvcard30writer.cpp CONFIG += mobility MOBILITY = contacts versit diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard30writer/tst_qvcard30writer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qvcard30writer/tst_qvcard30writer.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,307 @@ +/**************************************************************************** +** +** 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 "tst_qvcard30writer.h" +#include "qvcard30writer_p.h" +#include "qversitdocument.h" +#include "qversitproperty.h" +#include +#include +#include + +// 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 + +Q_DECLARE_METATYPE(QVersitProperty) + +void tst_QVCard30Writer::init() +{ + mWriter = new QVCard30Writer; + mWriter->setCodec(QTextCodec::codecForName("UTF-8")); +} + +void tst_QVCard30Writer::cleanup() +{ + delete mWriter; +} + +void tst_QVCard30Writer::testEncodeVersitProperty() +{ + QFETCH(QVersitProperty, property); + QFETCH(QByteArray, expectedResult); + QByteArray encodedProperty; + QBuffer buffer(&encodedProperty); + mWriter->setDevice(&buffer); + buffer.open(QIODevice::WriteOnly); + mWriter->encodeVersitProperty(property); + QCOMPARE(encodedProperty, expectedResult); +} + + +void tst_QVCard30Writer::testEncodeVersitProperty_data() +{ + QTest::addColumn("property"); + QTest::addColumn("expectedResult"); + + QVersitProperty property; + QByteArray expectedResult; + + // No parameters + expectedResult = "FN:John Citizen\r\n"; + property.setName(QString::fromAscii("FN")); + property.setValue(QString::fromAscii("John Citizen")); + QTest::newRow("No parameters") << property << expectedResult; + + // With parameter(s) + expectedResult = "TEL;TYPE=HOME:123\r\n"; + property.setName(QString::fromAscii("TEL")); + property.setValue(QString::fromAscii("123")); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); + QTest::newRow("With parameters, plain value") << property << expectedResult; + + // normal FN property is backslash escaped + property.clear(); + property.setName(QLatin1String("FN")); + property.setValue(QLatin1String(";,:\\")); + // semicolons, commas and backslashes are escaped (not colons, as per RFC2426) + expectedResult = "FN:\\;\\,:\\\\\r\n"; + QTest::newRow("FN property") << property << expectedResult; + + // Structured N + property.setName(QLatin1String("N")); + property.setValue(QStringList() + << QLatin1String("La;st") // needs to be backslash escaped + << QLatin1String("Fi,rst") + << QLatin1String("Mi:ddle") + << QLatin1String("Pr\\efix") // needs to be QP encoded + << QLatin1String("Suffix")); + property.setValueType(QVersitProperty::CompoundType); + expectedResult = "N:La\\;st;Fi\\,rst;Mi:ddle;Pr\\\\efix;Suffix\r\n"; + QTest::newRow("N property") << property << expectedResult; + + // Structured CATEGORIES + property.setName(QLatin1String("CATEGORIES")); + property.setValue(QStringList() + << QLatin1String("re;d") + << QLatin1String("gr,een") + << QLatin1String("bl:ue") + << QLatin1String("ye\\llow")); + property.setValueType(QVersitProperty::ListType); + expectedResult = "CATEGORIES:re\\;d,gr\\,een,bl:ue,ye\\\\llow\r\n"; + QTest::newRow("CATEGORIES property") << property << expectedResult; + + // Convert X-NICKNAME to NICKNAME + expectedResult = "NICKNAME:Jack\r\n"; + property.setParameters(QMultiHash()); + property.setName(QString::fromAscii("X-NICKNAME")); + property.setValue(QString::fromAscii("Jack")); + QTest::newRow("NICKNAME property") << property << expectedResult; + + // Convert X-IMPP to IMPP; + expectedResult = "IMPP:msn:msn-address\r\n"; + property.setParameters(QMultiHash()); + property.setName(QString::fromAscii("X-IMPP")); + property.setValue(QString::fromAscii("msn:msn-address")); + QTest::newRow("IMPP property") << property << expectedResult; + + // AGENT property + expectedResult = "AGENT:BEGIN:VCARD\\nVERSION:3.0\\nFN:Secret Agent\\nEND:VCARD\\n\r\n"; + property.setName(QString::fromAscii("AGENT")); + property.setValue(QString()); + QVersitDocument document; + QVersitProperty embeddedProperty; + embeddedProperty.setName(QString(QString::fromAscii("FN"))); + embeddedProperty.setValue(QString::fromAscii("Secret Agent")); + document.addProperty(embeddedProperty); + property.setValue(QVariant::fromValue(document)); + QTest::newRow("AGENT property") << property << expectedResult; + + // Value is base64 encoded. + 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); + QTest::newRow("base64 encoded") << property << expectedResult; + + // Characters other than ASCII: + expectedResult = "ORG:" + KATAKANA_NOKIA.toUtf8() + "\r\n"; + property = QVersitProperty(); + property.setName(QLatin1String("ORG")); + property.setValue(KATAKANA_NOKIA); + QTest::newRow("non-ASCII") << property << expectedResult; + + // No CHARSET and QUOTED-PRINTABLE parameters + 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)); + QTest::newRow("special chars") << property << expectedResult; +} + +void tst_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; + mWriter->encodeParameters(parameters); + QCOMPARE(encodedParameters, QByteArray("")); + + // One TYPE parameter + parameters.insert(typeParameterName,QString::fromAscii("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")); + 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")); + 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")); + 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")); + 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")); +} + +void tst_QVCard30Writer::testBackSlashEscape() +{ + // Empty string + QString input; + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString()); + + // Nothing to escape in the string + input = QString::fromAscii("Nothing to escape"); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("Nothing to escape")); + + // Line break in the beginning + input = QString::fromAscii("\r\n input"); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("\\n input")); + + // Line break in the end + input = QString::fromAscii("input\r\n"); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("input\\n")); + + // Semicolon in the beginning + input = QString::fromAscii(";input"); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("\\;input")); + + // Semicolon in the end + input = QString::fromAscii("input;"); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("input\\;")); + + // Comma in the beginning + input = QString::fromAscii(",input"); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("\\,input")); + + // Comma in the end + input = QString::fromAscii("input,"); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("input\\,")); + + // Backslash in the beginning + input = QString::fromAscii("\\input"); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("\\\\input")); + + // Backslash in the end + input = QString::fromAscii("input\\"); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input,QString::fromAscii("input\\\\")); + + // Line break, semicolon, backslash and comma in the middle of the string + input = QString::fromAscii("Escape these \r\n ; , \\ "); + QVCard30Writer::backSlashEscape(input); + QCOMPARE(input, QString::fromAscii("Escape these \\n \\; \\, \\\\ ")); +} + +QTEST_MAIN(tst_QVCard30Writer) + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard30writer/tst_qvcard30writer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qvcard30writer/tst_qvcard30writer.h Mon May 03 12:24:20 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 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 tst_QVCARD30WRITER_H +#define tst_QVCARD30WRITER_H + +#include +#include + +QTM_BEGIN_NAMESPACE + +class QVCard30Writer; + +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class tst_QVCard30Writer : public QObject +{ + Q_OBJECT + +private slots: // Tests + + void init(); + void cleanup(); + + void testEncodeVersitProperty(); + void testEncodeVersitProperty_data(); + void testEncodeParameters(); + void testBackSlashEscape(); + +private: // Data + QVCard30Writer* mWriter; +}; + +#endif // tst_QVCARD30WRITER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.cpp --- a/qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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 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 "ut_qvcard30writer.h" -#include "qvcard30writer_p.h" -#include "qversitdocument.h" -#include "qversitproperty.h" -#include -#include -#include - -// 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 QVCard30Writer; - mWriter->setCodec(QTextCodec::codecForName("UTF-8")); -} - -void UT_QVCard30Writer::cleanup() -{ - delete mWriter; -} - -void UT_QVCard30Writer::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(QString::fromAscii("John Citizen")); - mWriter->encodeVersitProperty(property); - QCOMPARE(encodedProperty, expectedResult); - - // With parameter(s) - 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(QString::fromAscii("123")); - property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); - mWriter->encodeVersitProperty(property); - QCOMPARE(encodedProperty, expectedResult); - - // Convert X-NICKNAME to NICKNAME - 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(QString::fromAscii("Jack")); - mWriter->encodeVersitProperty(property); - QCOMPARE(encodedProperty, expectedResult); - - // Convert X-IMPP to IMPP - 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(QString::fromAscii("msn:msn-address")); - mWriter->encodeVersitProperty(property); - QCOMPARE(encodedProperty, expectedResult); - - // AGENT property - 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(QString()); - QVersitDocument document; - QVersitProperty embeddedProperty; - embeddedProperty.setName(QString(QString::fromAscii("FN"))); - embeddedProperty.setValue(QString::fromAscii("Secret Agent")); - document.addProperty(embeddedProperty); - 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; - mWriter->encodeParameters(parameters); - QCOMPARE(encodedParameters, QByteArray("")); - - // One TYPE parameter - parameters.insert(typeParameterName,QString::fromAscii("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")); - 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")); - 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")); - 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")); - 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.h --- a/qtcontactsmobility/tests/auto/qvcard30writer/ut_qvcard30writer.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,71 +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 UT_QVCARD30WRITER_H -#define UT_QVCARD30WRITER_H - -#include -#include - -QTM_BEGIN_NAMESPACE - -class QVCard30Writer; - -QTM_END_NAMESPACE -QTM_USE_NAMESPACE - -class UT_QVCard30Writer : public QObject -{ - Q_OBJECT - -private slots: // Tests - - void init(); - void cleanup(); - - void testEncodeVersitProperty(); - void testEncodeParameters(); - -private: // Data - QVCard30Writer* mWriter; -}; - -#endif // UT_QVCARD30WRITER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/qversit.pro --- a/qtcontactsmobility/tests/auto/qversit/qversit.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qversit/qversit.pro Mon May 03 12:24:20 2010 +0300 @@ -2,8 +2,14 @@ TEMPLATE = app TARGET = tst_qversit +symbian*: { + VERSIT_TESTDATA.sources = testdata/* + VERSIT_TESTDATA.path = testdata + DEPLOYMENT += VERSIT_TESTDATA +} + wince* { - DEFINES+= TESTDATA_DIR=\\\".\\\" + DEFINES+= TESTDATA_DIR=\\\"./\\\" }else:!symbian { DEFINES += TESTDATA_DIR=\\\"$$PWD/\\\" } @@ -19,8 +25,8 @@ ../../../src/contacts/details \ ../../../src/contacts/requests \ ../../../src/contacts/filters -HEADERS += ut_qversit.h -SOURCES += ut_qversit.cpp +HEADERS += tst_qversit.h +SOURCES += tst_qversit.cpp CONFIG += mobility MOBILITY = contacts \ versit diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/AAB4/MultipleAll.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/AAB4/MultipleAll.vcf has changed diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/AAB4/MultipleAscii.vcf --- a/qtcontactsmobility/tests/auto/qversit/testdata/AAB4/MultipleAscii.vcf Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3599 +0,0 @@ -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleCompany.vcf --- a/qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleCompany.vcf Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleExtensive.vcf --- a/qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleExtensive.vcf Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3567 +0,0 @@ -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleNonAscii.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleNonAscii.vcf has changed diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleNonAsciiWithPhoto.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/AAB4/SingleNonAsciiWithPhoto.vcf has changed diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/AAB5/SingleNonAscii.vcf --- a/qtcontactsmobility/tests/auto/qversit/testdata/AAB5/SingleNonAscii.vcf Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/basic.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/basic.vcf has changed diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/image.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/image.vcf has changed diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/nonascii.vcf Binary file qtcontactsmobility/tests/auto/qversit/testdata/Entourage11/nonascii.vcf has changed diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/basic.vcf --- a/qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/basic.vcf Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/kevin.vcf --- a/qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/kevin.vcf Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/nonascii.vcf --- a/qtcontactsmobility/tests/auto/qversit/testdata/Entourage12/nonascii.vcf Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/tst_qversit.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/tst_qversit.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,218 @@ +/**************************************************************************** +** +** 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 "tst_qversit.h" +#include "qversitreader.h" +#include "qversitreader_p.h" +#include "qversitcontactimporter.h" +#include "qcontact.h" +#include "qcontactmanager.h" +#include "qcontactmanagerengine.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 tst_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); + QVERIFY(importer.importDocuments(documents)); + QList contacts = importer.contacts(); + + 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 tst_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); + QContactNote note; + note.setNote(QLatin1String("This is a note field. Pretty boring.")); + contact.saveDetail(¬e); + QContactManagerEngine::setContactDisplayLabel(&contact, QLatin1String("Firstname Lastname")); + list.append(contact); + 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); + QContactManagerEngine::setContactDisplayLabel(&contact, QLatin1String("first last")); + 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(tst_QVersit) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/tst_qversit.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversit/tst_qversit.h Mon May 03 12:24:20 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 tst_QVERSIT_H +#define tst_QVERSIT_H + +#include +#include +#include + +QTM_BEGIN_NAMESPACE + +class QVersitContactImporter; +class QVersitContactImporterPrivate; +class QVersitReader; + +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class tst_QVersit : public QObject +{ + Q_OBJECT + +private slots: // Tests + void testImportFiles(); + void testImportFiles_data(); + +private: +}; + +#endif // tst_QVERSIT_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/ut_qversit.cpp --- a/qtcontactsmobility/tests/auto/qversit/ut_qversit.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,214 +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 "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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversit/ut_qversit.h --- a/qtcontactsmobility/tests/auto/qversit/ut_qversit.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +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 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactexporter/qversitcontactexporter.pro --- a/qtcontactsmobility/tests/auto/qversitcontactexporter/qversitcontactexporter.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qversitcontactexporter/qversitcontactexporter.pro Mon May 03 12:24:20 2010 +0300 @@ -16,8 +16,8 @@ ../../../src/contacts/requests \ ../../../src/contacts/filters -HEADERS += ut_qversitcontactexporter.h -SOURCES += ut_qversitcontactexporter.cpp +HEADERS += tst_qversitcontactexporter.h +SOURCES += tst_qversitcontactexporter.cpp CONFIG += mobility MOBILITY = contacts versit diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactexporter/tst_qversitcontactexporter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitcontactexporter/tst_qversitcontactexporter.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,1164 @@ +/**************************************************************************** +** +** 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 "tst_qversitcontactexporter.h" +#include "qversitcontactexporter.h" +#include "qversitcontactexporter_p.h" +#include "qversitdocument.h" +#include "qversitproperty.h" +#include "qversitdefs_p.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QTM_BEGIN_NAMESPACE + +class MyQVersitContactExporterDetailHandler : public QVersitContactExporterDetailHandler +{ +public: + 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) + { + } + + 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==")); + +// The number of vCard properties generated by a contact made with createContactWithName() +const static int BASE_PROPERTY_COUNT = 2; + +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +const QString TEST_PHOTO_FILE(QLatin1String("versitTest001.jpg")); +const QString TEST_AUDIO_FILE(QLatin1String("versitTest001.wav")); + +// Checks that the property has a value of the given expectedType and the given expectedValue. +#define CHECK_VALUE(property,expectedValueType,expectedValue) {\ + QCOMPARE(property.valueType(), expectedValueType); \ + QVariant value = property.variantValue(); \ + QCOMPARE(value.type(), QVariant::StringList); \ + QCOMPARE(value.toStringList(), expectedValue); \ +} + +void tst_QVersitContactExporter::init() +{ + mExporter = new QVersitContactExporter(); + mDetailHandler = new MyQVersitContactExporterDetailHandler; + mExporter->setDetailHandler(mDetailHandler); + mResourceHandler = new MyQVersitResourceHandler; + mExporter->setResourceHandler(mResourceHandler); +} + +void tst_QVersitContactExporter::cleanup() +{ + QVERIFY(mExporter->detailHandler() == mDetailHandler); + mExporter->setDetailHandler(0); + delete mDetailHandler; + QVERIFY(mExporter->resourceHandler() == mResourceHandler); + mExporter->setResourceHandler(0); + delete mResourceHandler; + delete mExporter; +} + +void tst_QVersitContactExporter::testConvertContact() +{ + QContact contact; + + // Adding name to the contact + QContactName name; + name.setFirstName(QString::fromAscii("Moido")); + contact.saveDetail(&name); + + // Adding phone number to the Contact. + QContactPhoneNumber phoneNumber; + phoneNumber.setNumber(QString::fromAscii("12345678")); + contact.saveDetail(&phoneNumber); + + // Convert contact into versit properties + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QList documents = mExporter->documents(); + + // Each Contact has display label detail by default. Display label is enocded + // if some value exist for the Label or if value for Name exist. + QCOMPARE(documents.size(), 1); + QCOMPARE(documents.first().properties().count(), 3); +} + +void tst_QVersitContactExporter::testContactDetailHandler() +{ + // Test1: Un-supported Avatar Test + QContact contact(createContactWithName(QLatin1String("asdf"))); + QVersitDocument document; + QContactDetail unknownDetail; + unknownDetail.setValue(QLatin1String("Unknown"), QLatin1String("Detail")); + contact.saveDetail(&unknownDetail); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); + QList unknownDetails = mDetailHandler->mUnknownDetails; + QVERIFY(unknownDetails.size() > 0); + QString definitionName = unknownDetail.definitionName(); + QContactDetail detail = searchDetail(unknownDetails,definitionName); + QCOMPARE(definitionName, detail.definitionName()); + + // Test2: Un-supported Online Account + QContactOnlineAccount onlineAccount; + QString testUri = QString::fromAscii("sip:abc@temp.com"); + onlineAccount.setAccountUri(testUri); + onlineAccount.setSubTypes(QString::fromAscii("unsupported")); + contact.saveDetail(&onlineAccount); + mDetailHandler->clear(); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); + unknownDetails = mDetailHandler->mUnknownDetails; + QVERIFY(unknownDetails.size() > 0); + definitionName = onlineAccount.definitionName(); + detail = searchDetail(unknownDetails, definitionName); + QCOMPARE(definitionName, detail.definitionName()); + + // Test that preProcessDetail returns true stops the exporter from doing anything. + contact.clearDetails(); + QContactName contactName; + contactName.setFirstName(QLatin1String("John")); + contact.saveDetail(&contactName); + mDetailHandler->clear(); + mDetailHandler->mPreProcess = true; + // Fails, with NoNameError + QVERIFY(!mExporter->exportContacts(QList() << contact, + QVersitDocument::VCard30Type)); + QList documents = mExporter->documents(); + QCOMPARE(documents.size(), 0); + QVERIFY(mDetailHandler->mPreProcessedDetails.count() > BASE_PROPERTY_COUNT); + QCOMPARE(mDetailHandler->mPostProcessedDetails.count(), 0); + QCOMPARE(mDetailHandler->mUnknownDetails.count(), 0); + + QVERIFY(mExporter->detailHandler() == mDetailHandler); +} + +void tst_QVersitContactExporter::testEncodeName() +{ + QContact contact; + QContactName name; + + // Special characters are NOT backslash escaped by the exporter, only by the writer. + name.setFirstName(QString::fromAscii("He;ido")); + name.setLastName(QString::fromAscii("HH")); + name.setMiddleName(QString::fromAscii("A")); + name.setPrefix(QString::fromAscii("Mr.")); + name.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&name); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard21Type)); + QVersitDocument document = mExporter->documents().first(); + + // Each Contact has display label detail by default. Display label is enocded + // if some value exists for the Label or if value for Name exists. + QCOMPARE(document.properties().count(), 2); + + QVersitProperty displayProperty = document.properties().at(0); + // Check name + QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); + // Check value + QCOMPARE(displayProperty.value(), QString::fromAscii("He;ido HH")); + + QVersitProperty nameProperty = document.properties().at(1); + // Check parameters, contexts not allowed for N property + QCOMPARE(nameProperty.parameters().count(), 0); + // Check name + QCOMPARE(nameProperty.name(), QString::fromAscii("N")); + CHECK_VALUE(nameProperty, QVersitProperty::CompoundType, + QStringList() << QLatin1String("HH") << QLatin1String("He;ido") + << QLatin1String("A") << QLatin1String("Mr.") << QString()); +} + +void tst_QVersitContactExporter::testEncodePhoneNumber() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactPhoneNumber phoneNumber; + phoneNumber.setNumber(QString::fromAscii("12345678")); + phoneNumber.setContexts(QContactDetail::ContextHome); + phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile); + contact.saveDetail(&phoneNumber); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("TEL")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("CELL"))); + // Check value + QCOMPARE(property.value(), phoneNumber.number()); +} + +void tst_QVersitContactExporter::testEncodeEmailAddress() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactEmailAddress email; + email.setEmailAddress(QString::fromAscii("test@test")); + email.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&email); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("EMAIL")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 1); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + // Check value + QCOMPARE(property.value(), email.emailAddress()); +} + +void tst_QVersitContactExporter::testEncodeStreetAddress() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactAddress address; + + address.setPostOfficeBox(QLatin1String("1234")); + address.setCountry(QLatin1String("Finland")); + address.setPostcode(QLatin1String("00440")); + // Special characters are not escaped by the exporter, but by the writer + address.setStreet(QLatin1String("HKKI; 1X 90")); + address.setLocality(QLatin1String("Helsinki")); + address.setContexts(QContactDetail::ContextHome); + address.setSubTypes(QContactAddress::SubTypePostal); + contact.saveDetail(&address); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard21Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("ADR")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("POSTAL"))); + // Check name + QCOMPARE(property.name(), QString::fromAscii("ADR")); + CHECK_VALUE(property, QVersitProperty::CompoundType, + QStringList() << QLatin1String("1234") << QString() << QLatin1String("HKKI; 1X 90") + << QLatin1String("Helsinki") << QString() << QLatin1String("00440") + << QLatin1String("Finland")); +} + +void tst_QVersitContactExporter::testEncodeUrl() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactUrl url; + url.setUrl(QString::fromAscii("http://www.myhome.com")); + url.setContexts(QContactDetail::ContextHome); + url.setSubType(QContactUrl::SubTypeHomePage); + contact.saveDetail(&url); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("URL")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 1); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + // Check value + QCOMPARE(property.value(), url.url()); +} + +void tst_QVersitContactExporter::testEncodeUid() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactGuid guid; + + guid.setContexts(QContactDetail::ContextHome); + guid.setGuid(QString::fromAscii("0101222")); + contact.saveDetail(&guid); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard21Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("UID")); + QVERIFY(!property.isEmpty()); + // Check parameters + // Contexts are not allowed for UID + QCOMPARE(property.parameters().count(), 0); + // Check value + QCOMPARE(property.value(), guid.guid()); +} + +void tst_QVersitContactExporter::testEncodeRev() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactTimestamp timeStamp; + + // Last modified time found + QDateTime revisionTime = + QDateTime::fromString( + QString::fromAscii("M1d1y200906:01:02"), + QString::fromAscii("'M'M'd'd'y'yyyyhh:mm:ss")); + revisionTime.setTimeSpec(Qt::UTC); + timeStamp.setLastModified(revisionTime); + // Contexts not allowed in REV property, check that they are not added + timeStamp.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&timeStamp); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("REV")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QString expectedValueUTCEncoded = QString::fromAscii("2009-01-01T06:01:02Z"); + QCOMPARE(property.value(), expectedValueUTCEncoded); + + // Last modified time not found, use the creation time + QDateTime emptyTime; + timeStamp.setLastModified(emptyTime); + timeStamp.setCreated(revisionTime); + contact.saveDetail(&timeStamp); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("REV")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), expectedValueUTCEncoded); + + // Last modified time found, Local Time spec not UTC + QDateTime localTime; + revisionTime.setTimeSpec(Qt::LocalTime); + timeStamp.setLastModified(revisionTime); + localTime.setTimeSpec(Qt::LocalTime); + timeStamp.setCreated(localTime); + contact.saveDetail(&timeStamp); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("REV")); + QVERIFY(!property.isEmpty()); + QString expectedValueEncoded = QString::fromAscii("2009-01-01T06:01:02"); + QCOMPARE(property.value(), expectedValueEncoded); + + // Last modified time not found, creation time not found + timeStamp.setLastModified(emptyTime); + timeStamp.setCreated(emptyTime); + contact.saveDetail(&timeStamp); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); +} + +void tst_QVersitContactExporter::testEncodeBirthDay() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QDate date(2009,1,1); + QContactBirthday birthDay; + birthDay.setDate(date); + // Contexts not allowed in BDAY property, check that they are not added + birthDay.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&birthDay); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("BDAY")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QCOMPARE(property.value(), QString::fromAscii("2009-01-01")); +} + +void tst_QVersitContactExporter::testEncodeNote() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactNote note; + note.setNote(QString::fromAscii("My Note")); + // Contexts not allowed in NOTE property, check that they are not added + note.setContexts(QContactDetail::ContextHome); + contact.saveDetail(¬e); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("NOTE")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QCOMPARE(property.value(), note.note()); +} + +void tst_QVersitContactExporter::testEncodeGeoLocation() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactGeoLocation geoLocation; + QString longitude = QString::fromAscii("99.9"); + geoLocation.setLongitude(longitude.toDouble()); + QString latitude = QString::fromAscii("98.9"); + geoLocation.setLatitude(latitude.toDouble()); + // Contexts not allowed in GEO property, check that they are not added + geoLocation.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&geoLocation); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("GEO")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QCOMPARE(property.name(), QString::fromAscii("GEO")); + CHECK_VALUE(property, QVersitProperty::CompoundType, + QStringList() << QLatin1String("99.9") << QLatin1String("98.9")); +} + +void tst_QVersitContactExporter::testEncodeOrganization() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactOrganization organization; + QVersitDocument document; + QVersitProperty property; + QString title(QString::fromAscii("Developer")); + + // TITLE + organization.setTitle(title); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("TITLE")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), title); + + // ORG with name + organization.setTitle(QString()); + organization.setName(QString::fromAscii("Nokia")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = document.properties().at(BASE_PROPERTY_COUNT); + QCOMPARE(property.name(), QString::fromAscii("ORG")); + CHECK_VALUE(property, QVersitProperty::CompoundType, QStringList(QLatin1String("Nokia"))); + + // ORG with department/unit + organization.setName(QString()); + QStringList departments(QString::fromAscii("R&D")); + departments.append(QString::fromAscii("Qt")); + organization.setDepartment(departments); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = document.properties().at(BASE_PROPERTY_COUNT); + QCOMPARE(property.name(), QString::fromAscii("ORG")); + CHECK_VALUE(property, QVersitProperty::CompoundType, QStringList() + << QString() << QLatin1String("R&D") << QLatin1String("Qt")); + + // ORG with name and department/unit + organization.setName(QString::fromAscii("Nokia")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = document.properties().at(BASE_PROPERTY_COUNT); + QCOMPARE(property.name(), QString::fromAscii("ORG")); + CHECK_VALUE(property, QVersitProperty::CompoundType, QStringList() + << QLatin1String("Nokia") << QLatin1String("R&D") << QLatin1String("Qt")); + + // TITLE and ORG + organization.setTitle(QString::fromAscii("Developer")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + property = findPropertyByName(document, QLatin1String("TITLE")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), title); + property = findPropertyByName(document, QLatin1String("ORG")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.name(), QString::fromAscii("ORG")); + CHECK_VALUE(property, QVersitProperty::CompoundType, QStringList() + << QLatin1String("Nokia") << QLatin1String("R&D") << QLatin1String("Qt")); + + // ORG LOGO Test1: LOGO as remote Resouce + const QString url = QString::fromAscii("http://myhome.com/test.jpg"); + contact = createContactWithName(QLatin1String("asdf")); + organization = QContactOrganization(); + organization.setLogoUrl(url); + contact.saveDetail(&organization); + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + mExporter->setResourceHandler(mResourceHandler); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QVERIFY(!mResourceHandler->mLoadResourceCalled); + + // Source type is encoded, but media type is not for a URL. + property = findPropertyByName(document, QLatin1String("LOGO")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 1); + + QVERIFY(property.parameters().contains( + QString::fromAscii("VALUE"), QString::fromAscii("URL"))); + + //Check property value + QCOMPARE(property.value(), url); + + // ORG LOGO Test2: LOGO File. + mResourceHandler->mSimulatedData = "simulated data"; + contact = createContactWithName(QLatin1String("asdf")); + organization = QContactOrganization(); + organization.setLogoUrl(TEST_PHOTO_FILE); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QCOMPARE(mResourceHandler->mLocation, TEST_PHOTO_FILE); + + // It should be stored in the property as a QVariant of QByteArray + property = findPropertyByName(document, QLatin1String("LOGO")); + QVERIFY(!property.isEmpty()); + QMultiHash parameters = property.parameters(); + // Media type is encoded + QCOMPARE(parameters.count(), 1); + QVERIFY(parameters.contains( + QString::fromAscii("TYPE"), QString::fromAscii("JPEG"))); + // Verify value. + QVariant variantValue = property.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); + + // Assistant Name Test. + contact = createContactWithName(QLatin1String("asdf")); + organization = QContactOrganization(); + organization.setAssistantName(QString::fromAscii("myAssistant")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("X-ASSISTANT")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), QString::fromAscii("myAssistant")); + + // Test: Role + contact = createContactWithName(QLatin1String("asdf")); + organization = QContactOrganization(); + organization.setRole(QString::fromAscii("Executive")); + contact.saveDetail(&organization); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("ROLE")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.value(), QString::fromAscii("Executive")); + +} + +void tst_QVersitContactExporter::testEncodeAvatar() +{ + QContact contact = createContactWithName(QLatin1String("asdf")); + QContactAvatar contactAvatar; + mResourceHandler->mSimulatedData = "simulated data"; + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + + // Test1: Web URL + const QString url = QString::fromAscii("http://www.myhome.com/test.jpg"); + contactAvatar.setImageUrl(url); + contact.saveDetail(&contactAvatar); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QVERIFY(document.properties().length() > BASE_PROPERTY_COUNT); + QVersitProperty property = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 1); + QCOMPARE(property.value(), url); + QVERIFY(!mResourceHandler->mLoadResourceCalled); + + // Test 2: Local Media PHOTO + contactAvatar.setImageUrl(TEST_PHOTO_FILE); + contact.saveDetail(&contactAvatar); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QCOMPARE(mResourceHandler->mLocation, TEST_PHOTO_FILE); + // verify the value + QVERIFY(document.properties().length() > BASE_PROPERTY_COUNT); + property = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!property.isEmpty()); + QVariant variantValue = property.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); + QVERIFY(property.parameters().contains(QString::fromAscii("TYPE"), + QString::fromAscii("JPEG"))); +} + +void tst_QVersitContactExporter::testEncodeThumbnail() { + QImage image; + image.loadFromData(SAMPLE_GIF); + if (QImageWriter::supportedImageFormats().contains("png")) { + QContactThumbnail thumbnail; + thumbnail.setThumbnail(image); + QContact contact(createContactWithName(QLatin1String("asdf"))); + contact.saveDetail(&thumbnail); + QVERIFY(mExporter->exportContacts(QList() << contact, + QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + // verify the value + QVERIFY(document.properties().length() > BASE_PROPERTY_COUNT); + QVersitProperty property = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!property.isEmpty()); + QVariant variantValue = property.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QByteArray retrievedData = variantValue.value(); + QImage retrievedImage; + retrievedImage.loadFromData(retrievedData); + QCOMPARE(retrievedImage, image); + } +} + + +void tst_QVersitContactExporter::testEncodeEmbeddedContent() +{ + QContact contact = createContactWithName(QLatin1String("asdf")); + QContactAvatar contactAvatar; + QVariant variantValue; + + // Test 1: URL + const QString url = QString::fromAscii("http://www.myhome.com/test.jpg"); + contactAvatar.setImageUrl(url); + contact.saveDetail(&contactAvatar); + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QVERIFY(!mResourceHandler->mLoadResourceCalled); + QVERIFY(document.properties().size() > BASE_PROPERTY_COUNT); + QVersitProperty photoProperty = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!photoProperty.isEmpty()); + QCOMPARE(photoProperty.parameters().count(), 1); + QVERIFY(photoProperty.parameters().contains( + QString::fromAscii("VALUE"),QString::fromAscii("URL"))); + QCOMPARE(photoProperty.value(), url); + + // Test 2: Local PHOTO, image loaded by the loader + contactAvatar.setImageUrl(TEST_PHOTO_FILE); + contact.saveDetail(&contactAvatar); + mResourceHandler->clear(); + mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); + mResourceHandler->mSimulatedData = "simulated image data"; + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QVERIFY(document.properties().size() > BASE_PROPERTY_COUNT); + photoProperty = findPropertyByName(document, QLatin1String("PHOTO")); + QVERIFY(!photoProperty.isEmpty()); + 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); + + // Without a resource handler + mExporter->setResourceHandler(0); + contactAvatar.setImageUrl(TEST_PHOTO_FILE); + contact.saveDetail(&contactAvatar); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); + + mExporter->setResourceHandler(mResourceHandler); +} + +void tst_QVersitContactExporter::testEncodeRingtone() +{ + QContactRingtone ringtone; + mResourceHandler->clear(); + mResourceHandler->mSimulatedMimeType = QLatin1String("audio/wav"); + mResourceHandler->mSimulatedData = "simulated audio data"; + ringtone.setAudioRingtoneUrl(TEST_AUDIO_FILE); + QContact contact(createContactWithName(QLatin1String("asdf"))); + contact.saveDetail(&ringtone); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QVERIFY(mResourceHandler->mLoadResourceCalled); + QVersitProperty soundProperty = findPropertyByName(document, QLatin1String("SOUND")); + QVERIFY(!soundProperty.isEmpty()); + QCOMPARE(soundProperty.parameters().count(), 1); + QVERIFY(soundProperty.parameters().contains( + QString::fromAscii("TYPE"), + QString::fromAscii("WAV"))); + QVariant variantValue = soundProperty.variantValue(); + QVERIFY(variantValue.type() == QVariant::ByteArray); + QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); +} + +void tst_QVersitContactExporter::testEncodeParameters() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactPhoneNumber phoneNumber; + phoneNumber.setNumber(QString::fromAscii("12345678")); + QStringList subtypes; + subtypes.append(QContactPhoneNumber::SubTypeMobile); + subtypes.append(QContactPhoneNumber::SubTypeVideo); + // Add a not supported subtype in vCard, to make sure its not encoded. + subtypes.append(QContactPhoneNumber::SubTypeDtmfMenu); + phoneNumber.setSubTypes(subtypes); + contact.saveDetail(&phoneNumber); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("TEL")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"), QString::fromAscii("CELL"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("VIDEO"))); +} + +void tst_QVersitContactExporter::testEncodeGender() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactGender gender; + gender.setGender(QContactGender::GenderMale); + gender.setContexts(QContactGender::ContextHome); // Should not be encoded + contact.saveDetail(&gender); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("X-GENDER")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.parameters().count(), 0); + QCOMPARE(property.value(), gender.gender()); +} + +void tst_QVersitContactExporter::testEncodeNickName() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + + // Add an extra detail + QContactGender gender; + gender.setGender(QContactGender::GenderMale); + contact.saveDetail(&gender); + + // One nickname given + QContactNickname firstNickname; + firstNickname.setNickname(QLatin1String("Homie")); + contact.saveDetail(&firstNickname); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + QVersitProperty property = document.properties().at(BASE_PROPERTY_COUNT+1); + QCOMPARE(property.name(), QLatin1String("X-NICKNAME")); + CHECK_VALUE(property, QVersitProperty::ListType, QStringList(QLatin1String("Homie"))); + + // Two nicknames given, should be collated into a single property + contact = createContactWithName(QLatin1String("asdf")); + contact.saveDetail(&gender); + contact.saveDetail(&firstNickname); + QContactNickname secondNickname; + secondNickname.setNickname(QLatin1String("Jay")); + contact.saveDetail(&secondNickname); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + property = findPropertyByName(document, QLatin1String("X-NICKNAME")); + QVERIFY(!property.isEmpty()); + QCOMPARE(property.name(), QString::fromAscii("X-NICKNAME")); + CHECK_VALUE(property, QVersitProperty::ListType, + QStringList() << QLatin1String("Homie") << QLatin1String("Jay")); +} + +void tst_QVersitContactExporter::testEncodeTag() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + + // Add an extra detail + QContactGender gender; + gender.setGender(QContactGender::GenderMale); + contact.saveDetail(&gender); + + // One tag given + QContactTag firstTag; + firstTag.setTag(QLatin1String("red")); + contact.saveDetail(&firstTag); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + QVersitProperty property = document.properties().at(BASE_PROPERTY_COUNT+1); + QCOMPARE(property.name(), QLatin1String("CATEGORIES")); + CHECK_VALUE(property, QVersitProperty::ListType, QStringList(QLatin1String("red"))); + + // Two tags given, should be collated into a single property + contact = createContactWithName(QLatin1String("asdf")); + contact.saveDetail(&firstTag); + contact.saveDetail(&gender); + QContactTag secondTag; + secondTag.setTag(QLatin1String("green")); + contact.saveDetail(&secondTag); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + property = document.properties().at(BASE_PROPERTY_COUNT+1); + QCOMPARE(property.name(), QString::fromAscii("CATEGORIES")); + CHECK_VALUE(property, QVersitProperty::ListType, + QStringList() << QLatin1String("red") << QLatin1String("green")); +} + +void tst_QVersitContactExporter::testEncodeAnniversary() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactAnniversary anniversary; + QDate date(2009,1,1); + anniversary.setOriginalDate(date); + anniversary.setContexts(QContactDetail::ContextHome); + anniversary.setSubType(QContactAnniversary::SubTypeWedding); + contact.saveDetail(&anniversary); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("X-ANNIVERSARY")); + QVERIFY(!property.isEmpty()); + // The contexts and subtypes are not defined for X-ANNIVERSARY property + QCOMPARE(property.parameters().count(), 0); + // Check value + QCOMPARE(property.value(), date.toString(Qt::ISODate)); +} + + +void tst_QVersitContactExporter::testEncodeOnlineAccount() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactOnlineAccount onlineAccount; + QString accountUri(QString::fromAscii("sip:abc@temp.com")); + onlineAccount.setAccountUri(accountUri); + + // Video sharing + onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeVideoShare); + onlineAccount.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty property = findPropertyByName(document, QLatin1String("X-SIP")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("SWIS"))); + // Check value + QCOMPARE(property.value(), accountUri); + + // VoIP + onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeSipVoip); + onlineAccount.setContexts(QContactDetail::ContextWork); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("X-SIP")); + QVERIFY(!property.isEmpty()); + // Check parameters + QCOMPARE(property.parameters().count(), 2); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("WORK"))); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("VOIP"))); + // Check value + QCOMPARE(property.value(), accountUri); + + // Plain SIP + onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeSip); + onlineAccount.setContexts(QContactDetail::ContextWork); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("X-SIP")); + QVERIFY(!property.isEmpty()); + // Check parameters, SIP not added as a TYPE parameter + QCOMPARE(property.parameters().count(), 1); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("WORK"))); + // Check value + QCOMPARE(property.value(), accountUri); + + // IMPP / X-IMPP + onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeImpp); + onlineAccount.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + property = findPropertyByName(document, QLatin1String("X-IMPP")); + QVERIFY(!property.isEmpty()); + // Check parameters, SIP not added as a TYPE parameter + QCOMPARE(property.parameters().count(), 1); + QVERIFY(property.parameters().contains( + QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); + // Check value + QCOMPARE(property.value(), accountUri); + + // Other subtypes not converted + onlineAccount.setSubTypes(QString::fromAscii("INVALIDSUBTYPE")); + contact.saveDetail(&onlineAccount); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); +} + +void tst_QVersitContactExporter::testEncodeFamily() +{ + QContact contact(createContactWithName(QLatin1String("asdf"))); + QContactFamily family; + + // No spouse, no family + family.setContexts(QContactDetail::ContextHome); + contact.saveDetail(&family); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT); + + // Only spouse present + QString spouce = QString::fromAscii("ABC"); + family.setSpouse(spouce); + contact.saveDetail(&family); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+1); + QVersitProperty spouseProperty = findPropertyByName(document, QLatin1String("X-SPOUSE")); + QVERIFY(!spouseProperty.isEmpty()); + QCOMPARE(spouseProperty.parameters().count(), 0); + QCOMPARE(spouseProperty.value(), spouce); + + // Spouse and children + QStringList children; + children << QString::fromAscii("A") << QString::fromAscii("B") ; + family.setChildren(children); + family.setSpouse(spouce); + contact.saveDetail(&family); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard30Type)); + document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), BASE_PROPERTY_COUNT+2); + spouseProperty = findPropertyByName(document, QLatin1String("X-SPOUSE")); + QVERIFY(!spouseProperty.isEmpty()); + QCOMPARE(spouseProperty.parameters().count(), 0); + QCOMPARE(spouseProperty.value(), spouce); + QVersitProperty childrenProperty = findPropertyByName(document, QLatin1String("X-CHILDREN")); + QVERIFY(!spouseProperty.isEmpty()); + QCOMPARE(childrenProperty.parameters().count(), 0); + QCOMPARE(childrenProperty.name(), QString::fromAscii("X-CHILDREN")); + CHECK_VALUE(childrenProperty, QVersitProperty::ListType, children); +} + + +void tst_QVersitContactExporter::testEncodeDisplayLabel() +{ + QContact contact; + QContactName contactName; + + // No display label, but QContactName found + contactName.setFirstName(QString::fromAscii("First")); + contactName.setLastName(QString::fromAscii("Last")); + contactName.setMiddleName(QString::fromAscii("Middle")); + contact.saveDetail(&contactName); + QVERIFY(mExporter->exportContacts(QList() << contact, QVersitDocument::VCard21Type)); + QVersitDocument document = mExporter->documents().first(); + QCOMPARE(document.properties().count(), 2); + QVersitProperty displayProperty = document.properties().at(0); + QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); + QCOMPARE(displayProperty.value(), QString::fromAscii("First Last")); + QVersitProperty nameProperty = document.properties().at(1); + QCOMPARE(nameProperty.name(), QString::fromAscii("N")); + CHECK_VALUE(nameProperty, QVersitProperty::CompoundType, QStringList() + << QLatin1String("Last") << QLatin1String("First") << QLatin1String("Middle") + << QString() << QString()); +} + +void tst_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 +QContact tst_QVersitContactExporter::createContactWithName(QString name) +{ + QContact contact; + QContactName nameDetail; + nameDetail.setFirstName(name); + contact.saveDetail(&nameDetail); + return contact; +} + +QContactDetail tst_QVersitContactExporter::searchDetail( + QList details, + QString search) +{ + QContactDetail detail; + for (int i= 0; i < details.count(); i++) { + if ( details.at(i).definitionName() == search ) + detail = details.at(i); + } + return detail; +} + +QVersitProperty tst_QVersitContactExporter::findPropertyByName( + const QVersitDocument &document, const QString &propertyName) +{ + foreach (const QVersitProperty& property, document.properties()) { + if (property.name() == propertyName) + return property; + } + return QVersitProperty(); +} + +QTEST_MAIN(tst_QVersitContactExporter) + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactexporter/tst_qversitcontactexporter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitcontactexporter/tst_qversitcontactexporter.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** 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 tst_QVERSITCONTACTEXPORTER_H +#define tst_QVERSITCONTACTEXPORTER_H + +#include +#include +#include +#include +#include + +QTM_BEGIN_NAMESPACE + +class QVersitContactExporter; +class QVersitContactExporterPrivate; +class QVersitDocument; +class QVersitProperty; +class MyQVersitResourceHandler; +class MyQVersitContactExporterDetailHandler; + +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class tst_QVersitContactExporter : public QObject +{ + Q_OBJECT + +private slots: + void init(); + void cleanup(); + + void testConvertContact(); + void testContactDetailHandler(); + void testEncodeName(); + void testEncodePhoneNumber(); + void testEncodeEmailAddress(); + void testEncodeStreetAddress(); + void testEncodeUrl(); + void testEncodeParameters(); + void testEncodeUid(); + void testEncodeRev(); + void testEncodeBirthDay(); + void testEncodeNote(); + void testEncodeGeoLocation(); + void testEncodeOrganization(); + void testEncodeEmbeddedContent(); + void testEncodeRingtone(); + void testEncodeGender(); + void testEncodeNickName(); + void testEncodeTag(); + void testEncodeAnniversary(); + void testEncodeOnlineAccount(); + void testEncodeFamily(); + void testEncodeAvatar(); + void testEncodeThumbnail(); + void testEncodeDisplayLabel(); + void testDefaultResourceHandler(); + +private: + // Test Utility Functions + QContact createContactWithName(QString name); + QContactDetail searchDetail(QList details, QString search); + QVersitProperty findPropertyByName(const QVersitDocument& document,const QString& propertyName); + +private: // Data + QVersitContactExporter* mExporter; + MyQVersitResourceHandler* mResourceHandler; + MyQVersitContactExporterDetailHandler* mDetailHandler; +}; + +#endif // tst_QVERSITCONTACTEXPORTER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.cpp --- a/qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1304 +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 "ut_qversitcontactexporter.h" -#include "qversitcontactexporter.h" -#include "qversitcontactexporter_p.h" -#include "qversitproperty.h" -#include "qversitdefs_p.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -QTM_BEGIN_NAMESPACE - -class MyQVersitContactExporterDetailHandler : public QVersitContactExporterDetailHandler -{ -public: - 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) - { - } - - 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 - -const QString TEST_PHOTO_FILE(QLatin1String("versitTest001.jpg")); -const QString TEST_AUDIO_FILE(QLatin1String("versitTest001.wav")); - -void UT_QVersitContactExporter::init() -{ - mExporter = new QVersitContactExporter(); - mDetailHandler = new MyQVersitContactExporterDetailHandler; - mExporter->setDetailHandler(mDetailHandler); - mResourceHandler = new MyQVersitResourceHandler; - mExporter->setResourceHandler(mResourceHandler); -} - -void UT_QVersitContactExporter::cleanup() -{ - QVERIFY(mExporter->detailHandler() == mDetailHandler); - mExporter->setDetailHandler(0); - delete mDetailHandler; - QVERIFY(mExporter->resourceHandler() == mResourceHandler); - mExporter->setResourceHandler(0); - delete mResourceHandler; - delete mExporter; -} - -void UT_QVersitContactExporter::testConvertContact() -{ - QContact contact; - - // Adding name to the contact - QContactName name; - name.setFirstName(QString::fromAscii("Moido")); - contact.saveDetail(&name); - - // Adding phone number to the Contact. - QContactPhoneNumber phoneNumber; - phoneNumber.setNumber(QString::fromAscii("12345678")); - contact.saveDetail(&phoneNumber); - - // Convert contact into versit properties - 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(documents.size(), 1); - QCOMPARE(documents.first().properties().count(), 3); -} - -void UT_QVersitContactExporter::testContactDetailHandler() -{ - // Test1: Un-supported Avatar Test - QContact contact; - QVersitDocument document; - QContactAvatar contactAvatar; - contactAvatar.setSubType(QContactAvatar::SubTypeTexturedMesh); - contact.saveDetail(&contactAvatar); - 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; - QString testUri = QString::fromAscii("sip:abc@temp.com"); - onlineAccount.setAccountUri(testUri); - onlineAccount.setSubTypes(QString::fromAscii("unsupported")); - contact.saveDetail(&onlineAccount); - 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() -{ - QContact contact; - QContactName name; - - // vCard 2.1 - 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); - 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. - QCOMPARE(document.properties().count(), 2); - - QVersitProperty displayProperty = document.properties().at(0); - // Check name - QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); - // Check value - QCOMPARE(displayProperty.value(), QString::fromAscii("Heido HH")); - - QVersitProperty nameProperty = document.properties().at(1); - // Check parameters, contexts not allowed for N property - QCOMPARE(nameProperty.parameters().count(), 0); - // Check name - QCOMPARE(nameProperty.name(), QString::fromAscii("N")); - // Check value - 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.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); - 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 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); - // Check parameters - QCOMPARE(displayProperty.parameters().count(), 0); - QCOMPARE(nameProperty.parameters().count(), 0); - // Check name - QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); - QCOMPARE(nameProperty.name(), QString::fromAscii("N")); - // Check value - - QCOMPARE(displayProperty.value(), QString::fromAscii("Hom\\,er Simp\\;son")); - - QCOMPARE(nameProperty.value(), - QString::fromAscii("Simp\\;son;Hom\\,er;J\\;;\\;Mr.;Sir\\,")); -} - -void UT_QVersitContactExporter::testEncodePhoneNumber() -{ - QContact contact; - QContactPhoneNumber phoneNumber; - phoneNumber.setNumber(QString::fromAscii("12345678")); - phoneNumber.setContexts(QContactDetail::ContextHome); - phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile); - contact.saveDetail(&phoneNumber); - QList contacts; - contacts.append(contact); - QVersitDocument document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 1); - QVersitProperty property = document.properties().at(0); - // Check parameters - QCOMPARE(property.parameters().count(), 2); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("CELL"))); - // Check name - QCOMPARE(property.name(), QString::fromAscii("TEL")); - // Check value - QCOMPARE(property.value(), phoneNumber.number()); -} - -void UT_QVersitContactExporter::testEncodeEmailAddress() -{ - QContact contact; - QContactEmailAddress email; - email.setEmailAddress(QString::fromAscii("test@test")); - email.setContexts(QContactDetail::ContextHome); - contact.saveDetail(&email); - QList contacts; - contacts.append(contact); - QVersitDocument document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 1); - QVersitProperty property = document.properties().at(0); - // Check parameters - QCOMPARE(property.parameters().count(), 1); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); - // Check name - QCOMPARE(property.name(), QString::fromAscii("EMAIL")); - // Check value - QCOMPARE(property.value(), email.emailAddress()); -} - -void UT_QVersitContactExporter::testEncodeStreetAddress() -{ - QContact contact; - QContactAddress address; - - // vCard 2.1 - address.setCountry(QString::fromAscii("Finland")); - address.setPostcode(QString::fromAscii("00440")); - address.setStreet(QString::fromAscii("HKKI 1X 90")); - address.setLocality(QString::fromAscii("Helsinki")); - address.setContexts(QContactDetail::ContextHome); - address.setSubTypes(QContactAddress::SubTypePostal); - contact.saveDetail(&address); - QList contacts; - contacts.append(contact); - QVersitDocument document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 1); - QVersitProperty property = document.properties().at(0); - // Check parameters - QCOMPARE(property.parameters().count(), 2); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("POSTAL"))); - // Check name - QCOMPARE(property.name(), QString::fromAscii("ADR")); - // Check value - 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); - address.setPostOfficeBox(QString::fromAscii("PO;Box")); - address.setStreet(QString::fromAscii("My;Street")); - address.setLocality(QString::fromAscii("My;Town")); - address.setRegion(QString::fromAscii("My;State")); - address.setPostcode(QString::fromAscii("12345;")); - address.setCountry(QString::fromAscii("My;Country")); - contact.saveDetail(&address); - 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(property.value(), - QString::fromAscii("PO\\;Box;;My\\;Street;My\\;Town;My\\;State;12345\\;;My\\;Country")); -} - -void UT_QVersitContactExporter::testEncodeUrl() -{ - QContact contact; - QContactUrl url; - url.setUrl(QString::fromAscii("http://www.myhome.com")); - url.setContexts(QContactDetail::ContextHome); - url.setSubType(QContactUrl::SubTypeHomePage); - contact.saveDetail(&url); - QList contacts; - contacts.append(contact); - QVersitDocument document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 1); - QVersitProperty property = document.properties().at(0); - // Check parameters - QCOMPARE(property.parameters().count(), 1); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); - // Check name - QCOMPARE(property.name(), QString::fromAscii("URL")); - // Check value - QCOMPARE(property.value(), url.url()); -} - -void UT_QVersitContactExporter::testEncodeUid() -{ - QContact contact; - QContactGuid guid; - - // vCard 2.1 - guid.setContexts(QContactDetail::ContextHome); - guid.setGuid(QString::fromAscii("0101222")); - contact.saveDetail(&guid); - QList contacts; - contacts.append(contact); - QVersitDocument document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 1); - QVersitProperty property = document.properties().at(0); - // Check parameters - // Contexts are not allowed for UID - QCOMPARE(property.parameters().count(), 0); - // Check name - QCOMPARE(property.name(), QString::fromAscii("UID")); - // Check value - 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); - 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(property.value(), QString::fromAscii("1\\;2\\,3\\n4\\\\5")); -} - -void UT_QVersitContactExporter::testEncodeRev() -{ - QContact contact; - QContactTimestamp timeStamp; - - // Last modified time found - QDateTime revisionTime = - QDateTime::fromString( - QString::fromAscii("M1d1y200906:01:02"), - QString::fromAscii("'M'M'd'd'y'yyyyhh:mm:ss")); - revisionTime.setTimeSpec(Qt::UTC); - timeStamp.setLastModified(revisionTime); - // Contexts not allowed in REV property, check that they are not added - timeStamp.setContexts(QContactDetail::ContextHome); - contact.saveDetail(&timeStamp); - 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(property.value(), expectedValueUTCEncoded); - - // Last modified time not found, use the creation time - QDateTime emptyTime; - timeStamp.setLastModified(emptyTime); - timeStamp.setCreated(revisionTime); - contact.saveDetail(&timeStamp); - contacts.clear(); - contacts.append(contact); - document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 1); - property = document.properties().at(0); - QCOMPARE(property.value(), expectedValueUTCEncoded); - - // Last modified time found, Local Time spec not UTC - QDateTime localTime; - timeStamp.setLastModified(revisionTime); - timeStamp.setCreated(localTime); - revisionTime.setTimeSpec(Qt::LocalTime); - contact.saveDetail(&timeStamp); - 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(property.value(), expectedValueUTCEncoded); - - // Last modified time not found, creation time not found - timeStamp.setLastModified(emptyTime); - timeStamp.setCreated(emptyTime); - contact.saveDetail(&timeStamp); - contacts.clear(); - contacts.append(contact); - document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 0); -} - -void UT_QVersitContactExporter::testEncodeBirthDay() -{ - QContact contact; - QDate date(2009,1,1); - QContactBirthday birthDay; - birthDay.setDate(date); - // Contexts not allowed in BDAY property, check that they are not added - birthDay.setContexts(QContactDetail::ContextHome); - contact.saveDetail(&birthDay); - 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(property.value(), QString::fromAscii("2009-01-01")); -} - -void UT_QVersitContactExporter::testEncodeNote() -{ - QContact contact; - QContactNote note; - note.setNote(QString::fromAscii("My Note")); - // Contexts not allowed in NOTE property, check that they are not added - note.setContexts(QContactDetail::ContextHome); - contact.saveDetail(¬e); - 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(property.value(), note.note()); -} - -void UT_QVersitContactExporter::testEncodeGeoLocation() -{ - QContact contact; - QContactGeoLocation geoLocation; - QString longitude = QString::fromAscii("99.9"); - geoLocation.setLongitude(longitude.toDouble()); - QString latitude = QString::fromAscii("98.9"); - geoLocation.setLatitude(latitude.toDouble()); - // Contexts not allowed in GEO property, check that they are not added - geoLocation.setContexts(QContactDetail::ContextHome); - contact.saveDetail(&geoLocation); - 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(property.value(), expectedValue); -} - -void UT_QVersitContactExporter::testEncodeOrganization() -{ - QList contacts; - QContact contact; - QContactOrganization organization; - QVersitDocument document; - QVersitProperty property; - QString title(QString::fromAscii("Developer")); - QString organizationName(QString::fromAscii("Nokia")); - QString department(QString::fromAscii("R&D")); - - // TITLE - organization.setTitle(title); - contact.saveDetail(&organization); - 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(property.value(), title); - - // ORG with name - organization.setTitle(QString()); - organization.setName(QString::fromAscii("Nokia")); - contact.saveDetail(&organization); - 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(property.value(), QString::fromAscii("Nokia;")); - - // ORG with department/unit - organization.setName(QString()); - QStringList departments(QString::fromAscii("R&D")); - departments.append(QString::fromAscii("Qt")); - organization.setDepartment(departments); - contact.saveDetail(&organization); - 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(property.value(), QString::fromAscii(";R&D;Qt")); - - // ORG with name and department/unit - organization.setName(QString::fromAscii("Nokia")); - contact.saveDetail(&organization); - 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(property.value(), QString::fromAscii("Nokia;R&D;Qt")); - - // TITLE and ORG - organization.setTitle(QString::fromAscii("Developer")); - contact.saveDetail(&organization); - 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(property.value(), title); - property = document.properties().at(1); - QCOMPARE(property.name(), QString::fromAscii("ORG")); - QCOMPARE(property.value(), QString::fromAscii("Nokia;R&D;Qt")); - - // ORG LOGO Test1: LOGO as remote Resouce - const QString url = QString::fromAscii("http://myhome.com/test.jpg"); - contact = QContact(); - organization = QContactOrganization(); - organization.setLogo(url); - contact.saveDetail(&organization); - contacts.clear(); - contacts.append(contact); - mResourceHandler->mSimulatedMimeType = QLatin1String("image/jpeg"); - mExporter->setResourceHandler(mResourceHandler); - document = mExporter->exportContacts(contacts).first(); - QVERIFY(!mResourceHandler->mLoadResourceCalled); - - // Source type is encoded, but media type is not for a URL. - QCOMPARE(document.properties().at(0).parameters().count(), 1); - - QVERIFY(document.properties().at(0).parameters().contains( - QString::fromAscii("VALUE"), QString::fromAscii("URL"))); - - //Check property Name - QString propertyName = document.properties().at(0).name(); - QCOMPARE(propertyName, QString::fromAscii("LOGO")); - - //Check property value - 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(TEST_PHOTO_FILE); - contact.saveDetail(&organization); - contacts.clear(); - contacts.append(contact); - document = mExporter->exportContacts(contacts).first(); - QVERIFY(mResourceHandler->mLoadResourceCalled); - QCOMPARE(mResourceHandler->mLocation, TEST_PHOTO_FILE); - - // 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"))); - // 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); - 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(property.value(), QString::fromAscii("myAssistant")); - - // Test: Role - contact = QContact(); - organization = QContactOrganization(); - organization.setRole(QString::fromAscii("Executive")); - contact.saveDetail(&organization); - 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(property.value(), QString::fromAscii("Executive")); - -} - -void UT_QVersitContactExporter::testEncodeAvatar() -{ - QContact contact; - QContactAvatar contactAvatar; - 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); - 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(TEST_PHOTO_FILE); - contactAvatar.setPixmap(pixmap); // Should be ignored if the file can be loaded. - contactAvatar.setSubType(QContactAvatar::SubTypeImage); - contact.saveDetail(&contactAvatar); - 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 - 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); - 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); - } -} - - -void UT_QVersitContactExporter::testEncodeEmbeddedContent() -{ - 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); - 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(photoProperty.value(), url); - - // Test 2: Local PHOTO, image loaded by the loader - contactAvatar.setAvatar(TEST_PHOTO_FILE); - contactAvatar.setSubType(QContactAvatar::SubTypeImage); - contact.saveDetail(&contactAvatar); - 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 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); - 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("WAV"))); - variantValue = soundProperty.variantValue(); - QVERIFY(variantValue.type() == QVariant::ByteArray); - QCOMPARE(variantValue.value(), mResourceHandler->mSimulatedData); - - // 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); - 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() -{ - QContact contact; - QContactPhoneNumber phoneNumber; - phoneNumber.setNumber(QString::fromAscii("12345678")); - QStringList subtypes; - subtypes.append(QContactPhoneNumber::SubTypeMobile); - subtypes.append(QContactPhoneNumber::SubTypeVideo); - // Add a not supported subtype in vCard, to make sure its not encoded. - subtypes.append(QContactPhoneNumber::SubTypeDtmfMenu); - phoneNumber.setSubTypes(subtypes); - contact.saveDetail(&phoneNumber); - 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); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"), QString::fromAscii("CELL"))); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("VIDEO"))); -} - -void UT_QVersitContactExporter::testIsValidRemoteUrl() -{ - QContact contact; - QContactAvatar contactAvatar; - 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); - 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); - 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); - 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); - 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); - contacts.clear(); - contacts.append(contact); - document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 0); -} - -void UT_QVersitContactExporter::testEncodeGender() -{ - QContact contact; - QContactGender gender; - gender.setGender(QContactGender::GenderMale); - gender.setContexts(QContactGender::ContextHome); // Should not be encoded - contact.saveDetail(&gender); - 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(property.value(), gender.gender()); -} - -void UT_QVersitContactExporter::testEncodeNickName() -{ - QContact contact; - - // Add an extra detail - QContactGender gender; - gender.setGender(QContactGender::GenderMale); - contact.saveDetail(&gender); - - // 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")); - - // 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(property.value(), QString::fromAscii("Homie,Jay")); -} - -void UT_QVersitContactExporter::testEncodeAnniversary() -{ - QContact contact; - QContactAnniversary anniversary; - QDate date(2009,1,1); - anniversary.setOriginalDate(date); - anniversary.setContexts(QContactDetail::ContextHome); - anniversary.setSubType(QContactAnniversary::SubTypeWedding); - contact.saveDetail(&anniversary); - 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 - QCOMPARE(property.parameters().count(), 0); - // Check name - QCOMPARE(property.name(), QString::fromAscii("X-ANNIVERSARY")); - // Check value - QCOMPARE(property.value(), date.toString(Qt::ISODate)); -} - - -void UT_QVersitContactExporter::testEncodeOnlineAccount() -{ - QContact contact; - QContactOnlineAccount onlineAccount; - QString accountUri(QString::fromAscii("sip:abc@temp.com")); - onlineAccount.setAccountUri(accountUri); - - // Video sharing - onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeVideoShare); - onlineAccount.setContexts(QContactDetail::ContextHome); - contact.saveDetail(&onlineAccount); - QList contacts; - contacts.append(contact); - QVersitDocument document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 1); - QVersitProperty property = document.properties().at(0); - // Check parameters - QCOMPARE(property.parameters().count(), 2); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("SWIS"))); - // Check name - QCOMPARE(property.name(), QString::fromAscii("X-SIP")); - // Check value - QCOMPARE(property.value(), accountUri); - - // VoIP - onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeSipVoip); - onlineAccount.setContexts(QContactDetail::ContextWork); - contact.saveDetail(&onlineAccount); - contacts.clear(); - contacts.append(contact); - document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 1); - property = document.properties().at(0); - // Check parameters - QCOMPARE(property.parameters().count(), 2); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("WORK"))); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("VOIP"))); - // Check name - QCOMPARE(property.name(), QString::fromAscii("X-SIP")); - // Check value - QCOMPARE(property.value(), accountUri); - - // Plain SIP - onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeSip); - onlineAccount.setContexts(QContactDetail::ContextWork); - contact.saveDetail(&onlineAccount); - 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 - QCOMPARE(property.parameters().count(), 1); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("WORK"))); - // Check name - QCOMPARE(property.name(), QString::fromAscii("X-SIP")); - // Check value - QCOMPARE(property.value(), accountUri); - - // IMPP / X-IMPP - onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeImpp); - onlineAccount.setContexts(QContactDetail::ContextHome); - contact.saveDetail(&onlineAccount); - 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 - QCOMPARE(property.parameters().count(), 1); - QVERIFY(property.parameters().contains( - QString::fromAscii("TYPE"),QString::fromAscii("HOME"))); - // Check name - QCOMPARE(property.name(), QString::fromAscii("X-IMPP")); - // Check value - QCOMPARE(property.value(), accountUri); - - // Other subtypes not converted - onlineAccount.setSubTypes(QString::fromAscii("INVALIDSUBTYPE")); - contact.saveDetail(&onlineAccount); - contacts.clear(); - contacts.append(contact); - document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 0); -} - -void UT_QVersitContactExporter::testEncodeFamily() -{ - QContact contact; - QContactFamily family; - - // No spouse, no family - family.setContexts(QContactDetail::ContextHome); - contact.saveDetail(&family); - 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); - 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(spouseProperty.value(), spouce); - - // Spouse and children - QStringList children; - children << QString::fromAscii("A") << QString::fromAscii("B") ; - family.setChildren(children); - family.setSpouse(spouce); - contact.saveDetail(&family); - 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(spouseProperty.value(), spouce); - QVersitProperty childrenProperty = document.properties().at(1); - QCOMPARE(childrenProperty.parameters().count(), 0); - QCOMPARE(childrenProperty.name(), QString::fromAscii("X-CHILDREN")); - QCOMPARE(childrenProperty.value(), QString::fromAscii("A\\,B")); -} - - -void UT_QVersitContactExporter::testEncodeDisplayLabel() -{ - QContact contact; - QContactName contactName; - - // No display label and no QContactName - QList contacts; - contacts.append(contact); - QVersitDocument document = mExporter->exportContacts(contacts).first(); - QCOMPARE(document.properties().count(), 0); - - // No display label, but QContactName found - contactName.setFirstName(QString::fromAscii("First")); - contactName.setLastName(QString::fromAscii("Last")); - contactName.setMiddleName(QString::fromAscii("Middle")); - contact.saveDetail(&contactName); - 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(displayProperty.value(), QString::fromAscii("First Last")); - QVersitProperty nameProperty = document.properties().at(1); - QCOMPARE(nameProperty.name(), QString::fromAscii("N")); - 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); - contacts.clear(); - contacts.append(contact); - document = mExporter->exportContacts(contacts, QVersitDocument::VCard30Type).first(); - displayProperty = document.properties().at(0); - QCOMPARE(displayProperty.name(), QString::fromAscii("FN")); - 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, - QString search) -{ - QContactDetail detail; - for (int i= 0; i < details.count(); i++) { - if ( details.at(i).definitionName() == search ) - detail = details.at(i); - } - return detail; -} - -QTEST_MAIN(UT_QVersitContactExporter) - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.h --- a/qtcontactsmobility/tests/auto/qversitcontactexporter/ut_qversitcontactexporter.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +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 UT_QVERSITCONTACTEXPORTER_H -#define UT_QVERSITCONTACTEXPORTER_H - -#include -#include -#include - -QTM_BEGIN_NAMESPACE - -class QVersitContactExporter; -class QVersitContactExporterPrivate; -class MyQVersitResourceHandler; -class MyQVersitContactExporterDetailHandler; - -QTM_END_NAMESPACE -QTM_USE_NAMESPACE - -class UT_QVersitContactExporter : public QObject -{ - Q_OBJECT - -private slots: - void init(); - void cleanup(); - - void testConvertContact(); - void testContactDetailHandler(); - void testEncodeName(); - void testEncodePhoneNumber(); - void testEncodeEmailAddress(); - void testEncodeStreetAddress(); - void testEncodeUrl(); - void testEncodeParameters(); - void testEncodeUid(); - void testEncodeRev(); - void testEncodeBirthDay(); - void testEncodeNote(); - void testEncodeGeoLocation(); - void testEncodeOrganization(); - void testEncodeEmbeddedContent(); - void testIsValidRemoteUrl(); - void testEncodeGender(); - void testEncodeNickName(); - void testEncodeAnniversary(); - void testEncodeOnlineAccount(); - void testEncodeFamily(); - void testEncodeAvatar(); - void testEncodeDisplayLabel(); - void testDefaultResourceHandler(); - - // Test Utility Function - QContactDetail searchDetail(QList details, QString search); - -private: // Data - QVersitContactExporter* mExporter; - MyQVersitResourceHandler* mResourceHandler; - MyQVersitContactExporterDetailHandler* mDetailHandler; -}; - -#endif // UT_QVERSITCONTACTEXPORTER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactimporter/qversitcontactimporter.pro --- a/qtcontactsmobility/tests/auto/qversitcontactimporter/qversitcontactimporter.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qversitcontactimporter/qversitcontactimporter.pro Mon May 03 12:24:20 2010 +0300 @@ -16,8 +16,8 @@ ../../../src/contacts/requests \ ../../../src/contacts/filters -HEADERS += ut_qversitcontactimporter.h -SOURCES += ut_qversitcontactimporter.cpp +HEADERS += tst_qversitcontactimporter.h +SOURCES += tst_qversitcontactimporter.cpp CONFIG += mobility MOBILITY = contacts versit diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactimporter/tst_qversitcontactimporter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitcontactimporter/tst_qversitcontactimporter.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,1401 @@ +/**************************************************************************** +** +** 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 "tst_qversitcontactimporter.h" +#include "qversitcontactimporter.h" +#include "qversitcontactimporter_p.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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==")); + +const static QByteArray NOKIA_GIF(QByteArray::fromBase64( + "R0lGODdhOAAKAIQRAAAvwQAwwwAwxAAxxwAyygAzywAzzBBHwC9nz0+A0HCf35+/4LDQ78/f79/o" + "8O/v8PD3/////////////////////////////////////////////////////////////ywAAAAA" + "OAAKAAAFsCAiik9kRqPJHIfhGixjisuJpqk9Inb0vjaBC0UwFH+uhM+gNBUCw6Wh92vYDAXkCZhF" + "apMmA3Qajppav6tr8TqUp0DqEIwtqsmRR/Kl2A4RfFKCcnBMbYR+Uw5xg2lAjIlLCS88dyYNLn1S" + "TYwvk3NmkXSQLgVvXmQuBCcQXlI7Io9MpyWCbKgublgCNgxfP0eOs6dvUgsPyMgvEAUAeCafUWhe" + "bpI2LQMFenuhZy8hADs=")); + +QTM_END_NAMESPACE + +QTM_USE_NAMESPACE + +void tst_QVersitContactImporter::init() +{ + mImporter = new QVersitContactImporter(); + mResourceHandler = new MyQVersitResourceHandler(); + mImporter->setResourceHandler(mResourceHandler); + mPropertyHandler = new MyQVersitContactImporterPropertyHandler(); + mImporter->setPropertyHandler(mPropertyHandler); +} + +void tst_QVersitContactImporter::cleanup() +{ + QVERIFY(mImporter->propertyHandler() == mPropertyHandler); + mImporter->setPropertyHandler(0); + delete mPropertyHandler; + QVERIFY(mImporter->resourceHandler() == mResourceHandler); + mImporter->setResourceHandler(0); + delete mResourceHandler; + delete mImporter; +} + +void tst_QVersitContactImporter::testName() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty nameProperty; + QStringList value; + value.append(QString::fromAscii("John"));//FirstName + value.append(QString::fromAscii("Citizen"));//LastName + value.append(QString::fromAscii("Anonymous"));//GivenName + value.append(QString::fromAscii("Dr"));//PreFix + value.append(QString::fromAscii("MSc"));//Suffix + nameProperty.setName(QString::fromAscii("N")); + nameProperty.setValue(value); + nameProperty.setValueType(QVersitProperty::CompoundType); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactName name = (QContactName)contact.detail(QContactName::DefinitionName); + 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]); + + // Multiple names, first one will be picked and rest will be discarded + nameProperty = QVersitProperty(); + QStringList anotherValue; + anotherValue.append(QString::fromAscii("FakeJohn"));//FirstName + anotherValue.append(QString::fromAscii("FakeCitizen"));//LastName + anotherValue.append(QString::fromAscii("FakeAnonymous"));//GivenName + anotherValue.append(QString::fromAscii("FakeDr"));//PreFix + anotherValue.append(QString::fromAscii("FakeMSc"));//Suffix + nameProperty.setName(QString::fromAscii("N")); + nameProperty.setValue(anotherValue); + nameProperty.setValueType(QVersitProperty::CompoundType); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().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.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 tst_QVersitContactImporter::testNameWithFormatted() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + 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(QStringList() << QLatin1String("Last") << QLatin1String("First") << QLatin1String("Middle") << QLatin1String("Prefix") << QLatin1String("Suffix")); + nProperty.setValueType(QVersitProperty::CompoundType); + document.addProperty(nProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactName name = contact.detail(); + 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 tst_QVersitContactImporter::testAddress() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + property.setName(QString::fromAscii("ADR")); + property.setValue(QStringList(QString())); + property.setValueType(QVersitProperty::CompoundType); + + // Empty value for the address + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactAddress address = contact.detail(); + QCOMPARE(address.postOfficeBox(),QString()); + QCOMPARE(address.street(),QString()); + QCOMPARE(address.locality(),QString()); + QCOMPARE(address.region(),QString()); + QCOMPARE(address.postcode(),QString()); + QCOMPARE(address.country(),QString()); + + // Address with all the fields filled + property.setValue(QStringList() + << QLatin1String("PO Box") + << QLatin1String("E") + << QLatin1String("My Street") + << QLatin1String("My Town") + << QLatin1String("My State") + << QLatin1String("12345") + << QLatin1String("My Country") + ); + property.setValueType(QVersitProperty::CompoundType); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + address = contact.detail(); + QCOMPARE(address.postOfficeBox(),QString::fromAscii("PO Box")); + QCOMPARE(address.street(),QString::fromAscii("My Street")); + QCOMPARE(address.locality(),QString::fromAscii("My Town")); + QCOMPARE(address.region(),QString::fromAscii("My State")); + QCOMPARE(address.postcode(),QString::fromAscii("12345")); + QCOMPARE(address.country(),QString::fromAscii("My Country")); + + // Address with TYPE parameters converted to contexts and subtypes + 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); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + address = contact.detail(); + QStringList contexts = address.contexts(); + QVERIFY(contexts.contains(QContactDetail::ContextHome)); + QVERIFY(contexts.contains(QContactDetail::ContextWork)); + QStringList subTypes = address.subTypes(); + QVERIFY(subTypes.contains(QContactAddress::SubTypeDomestic)); + QVERIFY(subTypes.contains(QContactAddress::SubTypeInternational)); + QVERIFY(subTypes.contains(QContactAddress::SubTypePostal)); + QVERIFY(subTypes.contains(QContactAddress::SubTypeParcel)); +} + +void tst_QVersitContactImporter::testOrganizationName() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + + // Empty value for the organization + property.setName(QString::fromAscii("ORG")); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactOrganization organization = contact.detail(); + QCOMPARE(organization.name(),QString()); + QCOMPARE(organization.department().count(),0); + + // Organization with single value + property.setValueType(QVersitProperty::CompoundType); + property.setValue(QStringList(QLatin1String("Nokia"))); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + organization = contact.detail(); + QCOMPARE(organization.name(),QString::fromAscii("Nokia")); + QCOMPARE(organization.department().count(),0); + + // Organization with one Organizational Unit + property.setValue(QStringList() << QLatin1String("Nokia") << QLatin1String("R&D")); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + organization = contact.detail(); + QCOMPARE(organization.name(),QString::fromAscii("Nokia")); + QCOMPARE(organization.department().count(),1); + QCOMPARE(organization.department().at(0),QString::fromAscii("R&D")); + + // Organization with more Organizational Units + property.setValue(QStringList() + << QLatin1String("Nokia") + << QLatin1String("R&D") + << QLatin1String("Devices") + << QLatin1String("Qt")); + property.setValueType(QVersitProperty::CompoundType); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + organization = contact.detail(); + QCOMPARE(organization.name(),QString::fromAscii("Nokia")); + QCOMPARE(organization.department().count(),3); + QCOMPARE(organization.department().at(0),QString::fromAscii("R&D")); + QCOMPARE(organization.department().at(1),QString::fromAscii("Devices")); + QCOMPARE(organization.department().at(2),QString::fromAscii("Qt")); +} + +void tst_QVersitContactImporter::testOrganizationTitle() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + + // One title + property.setName(QString::fromAscii("TITLE")); + QString titleValue(QString::fromAscii("Developer")); + property.setValue(titleValue); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QList organizationDetails = + contact.details(QContactOrganization::DefinitionName); + QCOMPARE(organizationDetails.count(), 1); + QContactOrganization organization = static_cast(organizationDetails[0]); + QCOMPARE(organization.title(),titleValue); + + // Two titles -> two QContactOrganizations created + property.setName(QString::fromAscii("TITLE")); + QString secondTitleValue(QString::fromAscii("Hacker")); + property.setValue(secondTitleValue); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + organizationDetails = contact.details(QContactOrganization::DefinitionName); + QCOMPARE(organizationDetails.count(), 2); + QContactOrganization firstOrganization = + static_cast(organizationDetails[0]); + QCOMPARE(firstOrganization.title(),titleValue); + QContactOrganization secondOrganization = + static_cast(organizationDetails[1]); + QCOMPARE(secondOrganization.title(),secondTitleValue); + + // Two titles and one organization name -> two QContactOrganizations created + property.setName(QString::fromAscii("ORG")); + property.setValueType(QVersitProperty::CompoundType); + property.setValue(QStringList(QLatin1String("Nokia"))); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + organizationDetails = contact.details(QContactOrganization::DefinitionName); + QCOMPARE(organizationDetails.count(), 2); + firstOrganization = static_cast(organizationDetails[0]); + QCOMPARE(firstOrganization.title(),titleValue); + QCOMPARE(firstOrganization.name(),QLatin1String("Nokia")); + secondOrganization = static_cast(organizationDetails[1]); + QCOMPARE(secondOrganization.title(),secondTitleValue); + QCOMPARE(secondOrganization.name(),QString()); +} + +void tst_QVersitContactImporter::testOrganizationAssistant() +{ + QContact contact; + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + property.setName(QString::fromAscii("X-ASSISTANT")); + QString assistantValue(QString::fromAscii("Jenny")); + property.setValue(assistantValue); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + QContactOrganization organization = contact.detail(); + QCOMPARE(organization.assistantName(), assistantValue); +} + +void tst_QVersitContactImporter::testOrganizationLogo() +{ + QContact contact; + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + + // Embedded LOGO + property.setName(QString::fromAscii("LOGO")); + QByteArray logo(QByteArray::fromBase64( + "R0lGODlhEgASAIAAAAAAAP///yH5BAEAAAEALAAAAAASABIAAAIdjI+py+0G")); + property.setValue(logo); + property.insertParameter(QString::fromAscii("TYPE"), + QString::fromAscii("GIF")); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + QContactOrganization organization = contact.detail(); + QByteArray content = mResourceHandler->mObjects.value(organization.logoUrl().toString()); + QCOMPARE(content, logo); + + // LOGO as a URL + property.setName(QString::fromAscii("LOGO")); + QString logoUrl(QString::fromAscii("http://www.organization.org/logo.gif")); + property.setValue(logoUrl); + property.insertParameter(QString::fromAscii("VALUE"),QString::fromAscii("URL")); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + organization = contact.detail(); + QCOMPARE(organization.logoUrl().toString(),logoUrl); +} + +void tst_QVersitContactImporter::testOrganizationRole() +{ + QContact contact; + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + + // Setting the role is not yet supported by QContactOrganization + property.setName(QString::fromAscii("ROLE")); + QString roleValue(QString::fromAscii("Very important manager and proud of it")); + property.setValue(roleValue); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + QContactOrganization organization = contact.detail(); + QCOMPARE(organization.role(), roleValue); +} + +void tst_QVersitContactImporter::testTel() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + property.setName(QString::fromAscii("TEL")); + QString value(QString::fromAscii("+35850987654321")); + property.setValue(value); + + 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); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + const QContactPhoneNumber& phone = contact.detail(); + QCOMPARE(phone.number(),QString(value)); + + const QStringList subTypes = phone.subTypes(); + QCOMPARE(subTypes.count(),8); + QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeVoice)); + QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeMobile)); + QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeModem)); + QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeCar)); + QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeVideo)); + QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeFax)); + QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeBulletinBoardSystem)); + QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypePager)); + + const QStringList contexts = phone.contexts(); + QCOMPARE(contexts.count(),2); + QVERIFY(contexts.contains(QContactDetail::ContextWork)); + QVERIFY(contexts.contains(QContactDetail::ContextHome)); +} + +void tst_QVersitContactImporter::testEmail() +{ + QVersitProperty property; + property.setName(QString::fromAscii("EMAIL")); + QString value(QString::fromAscii("john.citizen@example.com")); + property.setValue(value); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); + QVersitDocument document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactEmailAddress email = contact.detail(); + QCOMPARE(email.emailAddress(),value); + const QStringList contexts = email.contexts(); + QCOMPARE(contexts.count(),1); + QVERIFY(contexts.contains(QContactDetail::ContextWork)); + + QCOMPARE(mPropertyHandler->mUnknownProperties.size(), 0); +} + +void tst_QVersitContactImporter::testUrl() +{ + QVersitProperty property; + property.setName(QString::fromAscii("URL")); + QString value(QString::fromAscii("http://example.com")); + property.setValue(value); + property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); + QVersitDocument document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactUrl url = contact.detail(); + QCOMPARE(url.url(),value); + const QStringList contexts = url.contexts(); + QCOMPARE(contexts.count(),1); + QVERIFY(contexts.contains(QContactDetail::ContextWork)); +} + +void tst_QVersitContactImporter::testUid() +{ + QVersitProperty property; + property.setName(QString::fromAscii("UID")); + QString value(QString::fromAscii("unique identifier")); + property.setValue(value); + QVersitDocument document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactGuid uid = contact.detail(); + QCOMPARE(uid.guid(),value); +} + +void tst_QVersitContactImporter::testTimeStamp() +{ + // Simple date : ISO 8601 extended format + QVersitProperty property; + property.setName(QString::fromAscii("REV")); + QString dateValue(QString::fromAscii("1981-05-20")); + property.setValue(dateValue); + QVersitDocument document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactTimestamp timeStamp = contact.detail(); + QCOMPARE(timeStamp.lastModified().date().toString(Qt::ISODate),dateValue); + + // Date and Time : ISO 8601 extended format without utc offset + QString dateAndTimeValue(QString::fromAscii("1981-05-20T23:55:55")); + property.setValue(dateAndTimeValue); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + timeStamp = contact.detail(); + QCOMPARE(timeStamp.lastModified().toString(Qt::ISODate),dateAndTimeValue); + + // Date and Time : ISO 8601 extented format with utc offset + QString utcOffset(QString::fromAscii("Z")); + QString dateAndTimeWithUtcValue = dateAndTimeValue+utcOffset; + property.setValue(dateAndTimeWithUtcValue); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + timeStamp = contact.detail(); + 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 = QString::fromAscii("19810520T235555"); + property.setValue(dateAndTimeValue); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + timeStamp = contact.detail(); + + QCOMPARE(timeStamp.lastModified().toString(QString::fromAscii("yyyyMMddThhmmss")), + dateAndTimeValue); + + // Date and Time : ISO 8601 in basic format with utc offset + dateAndTimeValue = QString::fromAscii("19810520T235555"); + dateAndTimeWithUtcValue = dateAndTimeValue+utcOffset; + property.setValue(dateAndTimeWithUtcValue); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + timeStamp = contact.detail(); + QCOMPARE(timeStamp.lastModified().toString(QString::fromAscii("yyyyMMddThhmmss")), + dateAndTimeValue); + QCOMPARE(timeStamp.lastModified().timeSpec(),Qt::UTC); +} + +void tst_QVersitContactImporter::testAnniversary() +{ + // Date : ISO 8601 extended format + QVersitProperty property; + property.setName(QString::fromAscii("X-ANNIVERSARY")); + QString dateValue(QString::fromAscii("1981-05-20")); + property.setValue(dateValue); + QVersitDocument document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactAnniversary anniversary = contact.detail(); + QCOMPARE(anniversary.originalDate().toString(Qt::ISODate),dateValue); + + // Date : ISO 8601 in basic format + dateValue = QString::fromAscii("19810520"); + property.setValue(dateValue); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + anniversary = contact.detail(); + QCOMPARE(anniversary.originalDate().toString(QString::fromAscii("yyyyMMdd")), + dateValue); + +} + +void tst_QVersitContactImporter::testBirthday() +{ + // Date : ISO 8601 extended format + QVersitProperty property; + property.setName(QString::fromAscii("BDAY")); + QString dateValue(QString::fromAscii("1981-05-20")); + property.setValue(dateValue); + QVersitDocument document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactBirthday bday = contact.detail(); + QCOMPARE(bday.date().toString(Qt::ISODate), + dateValue); + + // Date : ISO 8601 in basic format + dateValue = QString::fromAscii("19810520"); + property.setValue(dateValue); + document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + bday = contact.detail(); + QCOMPARE(bday.date().toString(QString::fromAscii("yyyyMMdd")), + dateValue); + +} + +void tst_QVersitContactImporter::testGender() +{ + // Date : ISO 8601 extended format + QVersitProperty property; + property.setName(QString::fromAscii("X-GENDER")); + QString val(QString::fromAscii("Male")); + property.setValue(val); + QVersitDocument document = createDocumentWithProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactGender gender = contact.detail(); + QCOMPARE(gender.gender(),val); +} + +void tst_QVersitContactImporter::testNickname() +{ + // one value + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty nameProperty; + nameProperty.setName(QString::fromAscii("NICKNAME")); + nameProperty.setValue(QStringList(QLatin1String("Homie"))); + nameProperty.setValueType(QVersitProperty::ListType); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactNickname nickName = (QContactNickname)contact.detail(QContactNickname::DefinitionName); + QCOMPARE(nickName.nickname(), QLatin1String("Homie")); + + // comma separated values should generate multiple nickname fields + contact.clearDetails(); + document.clear(); + document.setType(QVersitDocument::VCard30Type); + QStringList multiVal; + multiVal.append(QString::fromAscii("Homie")); + multiVal.append(QString::fromAscii("SuperHero")); + multiVal.append(QString::fromAscii("NukeSpecialist")); + nameProperty.setName(QString::fromAscii("NICKNAME")); + nameProperty.setValue(multiVal); + nameProperty.setValueType(QVersitProperty::ListType); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + QList nickNames = contact.details(QContactNickname::DefinitionName); + QCOMPARE(nickNames.count(),3); + nickName = static_cast(nickNames[0]); + QCOMPARE(nickName.nickname(),QString::fromAscii("Homie")); + nickName = static_cast(nickNames[1]); + QCOMPARE(nickName.nickname(),QString::fromAscii("SuperHero")); + nickName = static_cast(nickNames[2]); + QCOMPARE(nickName.nickname(),QString::fromAscii("NukeSpecialist")); + + // X-NICKNAME + document.clear(); + document.setType(QVersitDocument::VCard30Type); + nameProperty = QVersitProperty(); + nameProperty.setName(QString::fromAscii("X-NICKNAME")); + nameProperty.setValue(QStringList(QLatin1String("Homie"))); + nameProperty.setValueType(QVersitProperty::ListType); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + nickName = contact.detail(); + QCOMPARE(nickName.nickname(),QLatin1String("Homie")); +} + +void tst_QVersitContactImporter::testAvatarThumbnail() +{ + QByteArray gif(SAMPLE_GIF); + QString name = QLatin1String("John Citizen"); + QVersitDocument document = createDocumentWithNameAndPhoto(name, gif, QLatin1String("GIF")); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactAvatar avatar = contact.detail(); + QByteArray content = mResourceHandler->mObjects.value(avatar.imageUrl()); + QCOMPARE(content, gif); + QContactThumbnail thumbnail = contact.detail(); + QImage image(thumbnail.thumbnail()); + QImage expectedImage; + expectedImage.loadFromData(gif); + QCOMPARE(image, expectedImage); + + // Without the resource handler, the thumbnail should still be set, but no avatar should be made + mImporter->setResourceHandler(0); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + QCOMPARE(contact.details().size(), 0); + thumbnail = contact.detail(); + image = thumbnail.thumbnail(); + QCOMPARE(image, expectedImage); + + mImporter->setResourceHandler(mResourceHandler); + + // Empty photo. The avatar should not be added to the QContact and the thumbnail will be empty. + QVersitProperty property; + property.setName(QLatin1String("PHOTO")); + property.setValue(QByteArray()); + document.clear(); + document.setType(QVersitDocument::VCard30Type); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + QCOMPARE(contact.details().size(), 0); + thumbnail = contact.detail(); + QVERIFY(thumbnail.isEmpty()); + + // Test multiple PHOTOs. The chosen Thumbnail should be the smallest image supplied. + // All should be made into Avatars + QByteArray nonPhoto(QByteArray::fromBase64("UXQgaXMgZ3JlYXQh")); // the string "Qt is great!" + QByteArray bigPhoto(NOKIA_GIF); + document.clear(); + document.setType(QVersitDocument::VCard30Type); + property.setName(QLatin1String("PHOTO")); + property.setValue(nonPhoto); // shouldn't be the thumbnail because it's not an image + document.addProperty(property); + property.setValue(bigPhoto); // shouldn't be the thumbnail because it's not the smallest + document.addProperty(property); + property.setValue(gif); // should be the thumbnail + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + QList thumbnails = contact.details(); + QCOMPARE(thumbnails.size(), 1); + thumbnail = thumbnails.first(); + image = thumbnail.thumbnail(); + QCOMPARE(image, expectedImage); + QCOMPARE(contact.details().size(), 3); +} + +void tst_QVersitContactImporter::testAvatarUrl() +{ + QVersitProperty property; + property.setName(QLatin1String("PHOTO")); + QString value(QLatin1String("http://example.com/example.jpg")); + property.setValue(value); + property.insertParameter(QLatin1String("VALUE"), QLatin1String("URL")); + + QVersitDocument document(QVersitDocument::VCard30Type); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactAvatar avatar = contact.detail(); + QCOMPARE(avatar.imageUrl(), QUrl(QLatin1String("http://example.com/example.jpg"))); + + + // A URL disguised inside a QByteArray. + document.clear(); + document.setType(QVersitDocument::VCard30Type); + 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); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + avatar = contact.detail(); + QCOMPARE(avatar.imageUrl(), QUrl(QLatin1String("http://example.com/example.jpg"))); +} + +void tst_QVersitContactImporter::testAvatarInvalid() +{ + // An avatar that's a QVersitDocument? It shouldn't work. + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + property.setName(QLatin1String("PHOTO")); + QVersitDocument nestedDocument; + property.setValue(QVariant::fromValue(nestedDocument)); + property.insertParameter(QLatin1String("VALUE"), QLatin1String("URL")); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QCOMPARE(contact.details(QContactAvatar::DefinitionName).size(), 0); + + document.clear(); + document.setType(QVersitDocument::VCard30Type); + property.clear(); + property.setName(QLatin1String("PHOTO")); + property.setValue(QVariant::fromValue(nestedDocument)); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + QCOMPARE(contact.details(QContactAvatar::DefinitionName).size(), 0); +} + +void tst_QVersitContactImporter::testGeo() +{ + // some positive values + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty nameProperty; + QStringList val; + val.append(QString::fromAscii("18.53"));// Longtitude + val.append(QString::fromAscii("45.32")); // Latitude + nameProperty.setName(QString::fromAscii("GEO")); + nameProperty.setValue(val); + nameProperty.setValueType(QVersitProperty::CompoundType); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactGeoLocation geo = (QContactGeoLocation)contact.detail(QContactGeoLocation::DefinitionName); + QString str; + str.setNum(geo.longitude(),'.',2); + QCOMPARE(str,val[0]); + str.setNum(geo.latitude(),'.',2); + QCOMPARE(str,val[1]); + + // some negative values + document.clear(); + document.setType(QVersitDocument::VCard30Type); + nameProperty = QVersitProperty(); + val.append(QString::fromAscii("18.53"));// Longtitude + val.append(QString::fromAscii("-45.32")); // Latitude + nameProperty.setName(QString::fromAscii("GEO")); + nameProperty.setValue(val); + nameProperty.setValueType(QVersitProperty::CompoundType); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + geo = (QContactGeoLocation)contact.detail(QContactGeoLocation::DefinitionName); + str.setNum(geo.longitude(),'.',2); + QCOMPARE(str,val[0]); + str.setNum(geo.latitude(),'.',2); + QCOMPARE(str,val[1]); +} + +void tst_QVersitContactImporter::testNote() +{ + // single line value + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty nameProperty; + QString val(QString::fromAscii("I will not sleep at my work -John")); + nameProperty.setName(QString::fromAscii("NOTE")); + nameProperty.setValue(val); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactNote note = (QContactNote)contact.detail(QContactNote::DefinitionName); + QCOMPARE(note.note(),val); + + // Multiline value and quoted printable encoding + document.clear(); + document.setType(QVersitDocument::VCard30Type); + nameProperty = QVersitProperty(); + 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"),val); + nameProperty.setParameters(params); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + note = (QContactNote)contact.detail(QContactNote::DefinitionName); + QCOMPARE(note.note(),val); +} + +void tst_QVersitContactImporter::testCustomLabel() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty nameProperty; + QString val(QString::fromAscii("John Citizen")); + nameProperty.setName(QString::fromAscii("FN")); + nameProperty.setValue(val); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactName name = + (QContactName)contact.detail(QContactName::DefinitionName); + QCOMPARE(name.customLabel(),val); +} + +void tst_QVersitContactImporter::testDisplayLabel() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty orgProperty; + // ORG: should be used as last resort + orgProperty.setName(QLatin1String("ORG")); + orgProperty.setValue(QStringList(QLatin1String("org"))); + orgProperty.setValueType(QVersitProperty::CompoundType); + document.addProperty(orgProperty); + + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QString displayLabel = contact.displayLabel(); + QCOMPARE(displayLabel, QLatin1String("org")); + + // NICKNAME: should be used if FN and N don't exist + QVersitProperty nickProperty; + nickProperty.setName(QLatin1String("NICKNAME")); + nickProperty.setValue(QStringList(QLatin1String("nick"))); + nickProperty.setValueType(QVersitProperty::ListType); + document.addProperty(nickProperty); + + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + displayLabel = contact.displayLabel(); + QCOMPARE(displayLabel, QLatin1String("nick")); + + // N: should be used in FN doesn't exist + QVersitProperty nameProperty; + nameProperty.setName(QLatin1String("N")); + nameProperty.setValue(QStringList() + << QLatin1String("last") + << QLatin1String("first") + << QLatin1String("middle") + << QLatin1String("prefix") + << QLatin1String("suffix")); + nameProperty.setValueType(QVersitProperty::CompoundType); + document.addProperty(nameProperty); + + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + displayLabel = contact.displayLabel(); + QCOMPARE(displayLabel, QLatin1String("prefix first middle last suffix")); + + // FN: should be used if it exists + QVersitProperty fnProperty; + fnProperty.setName(QLatin1String("FN")); + fnProperty.setValue(QLatin1String("fn")); + document.addProperty(fnProperty); + + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + displayLabel = contact.displayLabel(); + QCOMPARE(displayLabel, QLatin1String("fn")); +} + +void tst_QVersitContactImporter::testOnlineAccount() +{ + QString accountUri(QString::fromAscii("sip:john.citizen@example.com")); + + // Plain X-SIP, no TYPE -> + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + property.setName(QString::fromAscii("X-SIP")); + property.setValue(accountUri); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactOnlineAccount onlineAccount = contact.detail(); + QCOMPARE(onlineAccount.accountUri(),accountUri); + QStringList subTypes = onlineAccount.subTypes(); + QCOMPARE(subTypes.count(),1); + QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeSip); + + // X-SIP;SWIS + document.clear(); + document.setType(QVersitDocument::VCard30Type); + property = QVersitProperty(); + property.setName(QString::fromAscii("X-SIP")); + property.setValue(accountUri); + QMultiHash params; + params.insert(QString::fromAscii("TYPE"),QString::fromAscii("SWIS")); + property.setParameters(params); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + onlineAccount = contact.detail(); + QCOMPARE(onlineAccount.accountUri(),accountUri); + subTypes = onlineAccount.subTypes(); + QCOMPARE(subTypes.count(),1); + QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeVideoShare); + + // X-SIP;VOIP + document.clear(); + document.setType(QVersitDocument::VCard30Type); + property = QVersitProperty(); + property.setName(QString::fromAscii("X-SIP")); + property.setValue(accountUri); + params.clear(); + params.insert(QString::fromAscii("TYPE"),QString::fromAscii("VOIP")); + property.setParameters(params); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + onlineAccount = contact.detail(); + QCOMPARE(onlineAccount.accountUri(),accountUri); + subTypes = onlineAccount.subTypes(); + QCOMPARE(subTypes.count(),1); + QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeSipVoip); + + // X-IMPP + document.clear(); + document.setType(QVersitDocument::VCard30Type); + property = QVersitProperty(); + property.setName(QString::fromAscii("X-IMPP")); + property.setValue(accountUri); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + onlineAccount = contact.detail(); + QCOMPARE(onlineAccount.accountUri(),accountUri); + subTypes = onlineAccount.subTypes(); + QCOMPARE(subTypes.count(),1); + QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeImpp); + + // IMPP + document.clear(); + document.setType(QVersitDocument::VCard30Type); + property = QVersitProperty(); + property.setName(QString::fromAscii("IMPP")); + property.setValue(accountUri); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + onlineAccount = contact.detail(); + QCOMPARE(onlineAccount.accountUri(),accountUri); + subTypes = onlineAccount.subTypes(); + QCOMPARE(subTypes.count(),1); + QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeImpp); + + // X-JABBER + document.clear(); + document.setType(QVersitDocument::VCard30Type); + property = QVersitProperty(); + property.setName(QString::fromAscii("X-JABBER")); + property.setValue(accountUri); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + onlineAccount = contact.detail(); + QCOMPARE(onlineAccount.accountUri(),accountUri); + subTypes = onlineAccount.subTypes(); + QCOMPARE(subTypes.count(),1); + QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeImpp); +} + +void tst_QVersitContactImporter::testFamily() +{ + // Interesting : kid but no wife :) + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty nameProperty; + QString val(QString::fromAscii("Jane")); // one is enough + nameProperty.setName(QString::fromAscii("X-CHILDREN")); + nameProperty.setValue(QStringList(val)); + nameProperty.setValueType(QVersitProperty::ListType); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().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],val); // ensure it is your kid + + // Critical : wife but no kids , happy hours + document.clear(); + document.setType(QVersitDocument::VCard30Type); + nameProperty = QVersitProperty(); + nameProperty.setName(QString::fromAscii("X-SPOUSE")); + val = QString::fromAscii("Jenny"); + nameProperty.setValue(val); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + family = (QContactFamily)contact.detail(QContactFamily::DefinitionName); + children = family.children(); + QCOMPARE(children.count(),0); // list should be empty as you know + QCOMPARE(family.spouse(),val); // make sure thats your wife:( + + // Hopeless : couple of kids and wife + document.clear(); + document.setType(QVersitDocument::VCard30Type); + // Add kids first + nameProperty = QVersitProperty(); + nameProperty.setName(QString::fromAscii("X-CHILDREN")); + QStringList kidsVal; + kidsVal.append(QString::fromAscii("James")); + kidsVal.append(QString::fromAscii("Jake")); + kidsVal.append(QString::fromAscii("Jane")); + nameProperty.setValue(kidsVal); + nameProperty.setValueType(QVersitProperty::ListType); + document.addProperty(nameProperty); + // Add wife next + val = QString::fromAscii("Jenny"); + nameProperty = QVersitProperty(); + nameProperty.setName(QString::fromAscii("X-SPOUSE")); + nameProperty.setValue(val); + document.addProperty(nameProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().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, kidsVal); + QCOMPARE(family.spouse(),val); // make sure thats your wife:( +} + +void tst_QVersitContactImporter::testSound() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty soundProperty; + QMultiHash param; + param.insert(QString::fromAscii("TYPE"),QString::fromAscii("WAVE")); + soundProperty.setName(QString::fromAscii("SOUND")); + QByteArray val("111110000011111"); + soundProperty.setValue(val); + soundProperty.setParameters(param); + document.addProperty(soundProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactRingtone ringtone = contact.detail(); + QByteArray content = mResourceHandler->mObjects.value(ringtone.audioRingtoneUrl()); + QCOMPARE(content, val); +} + +void tst_QVersitContactImporter::testTag() +{ + // one value + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty tagProperty; + tagProperty.setName(QLatin1String("CATEGORIES")); + tagProperty.setValue(QStringList(QLatin1String("red"))); + tagProperty.setValueType(QVersitProperty::ListType); + document.addProperty(tagProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactTag tagDetail = contact.detail(); + QCOMPARE(tagDetail.tag(), QLatin1String("red")); + + // multiple values + document.clear(); + document.setType(QVersitDocument::VCard30Type); + tagProperty.setName(QLatin1String("CATEGORIES")); + tagProperty.setValue(QStringList() + << QLatin1String("red") + << QLatin1String("green") + << QLatin1String("blue")); + tagProperty.setValueType(QVersitProperty::ListType); + document.addProperty(tagProperty); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().first(); + QList tagDetails = contact.details(); + QCOMPARE(tagDetails.count(), 3); + QCOMPARE(tagDetails.at(0).tag(), QLatin1String("red")); + QCOMPARE(tagDetails.at(1).tag(), QLatin1String("green")); + QCOMPARE(tagDetails.at(2).tag(), QLatin1String("blue")); +} + +void tst_QVersitContactImporter::testPref() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property1; + property1.setName(QLatin1String("TEL")); + property1.setValue(QLatin1String("1")); + document.addProperty(property1); + QVersitProperty property2; + property2.setName(QLatin1String("TEL")); + property2.setValue(QLatin1String("2")); + property2.insertParameter(QLatin1String("TYPE"), QLatin1String("PREF")); + document.addProperty(property2); + QVersitProperty property3; + property3.setName(QLatin1String("TEL")); + property3.setValue(QLatin1String("3")); + property3.insertParameter(QLatin1String("TYPE"), QLatin1String("PREF")); + document.addProperty(property3); + QVersitProperty property4; + property4.setName(QLatin1String("TEL")); + property4.setValue(QLatin1String("4")); + document.addProperty(property4); + + // Test that pref details comes first. + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().first(); + QContactPhoneNumber firstNumber = contact.detail(); + QCOMPARE(firstNumber.number(), QLatin1String("2")); + QList numbers = contact.details(); + QCOMPARE(numbers.at(0).number(), QLatin1String("2")); + QCOMPARE(numbers.at(1).number(), QLatin1String("3")); + QCOMPARE(numbers.at(2).number(), QLatin1String("1")); + QCOMPARE(numbers.at(3).number(), QLatin1String("4")); +} + +void tst_QVersitContactImporter::testPropertyHandler() +{ + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + + // No unconverted properties, no converted properties either. Fails with EmptyDocumentError + QVERIFY(!mImporter->importDocuments(QList() << document)); + 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("FN")); + property.setValue(QString::fromAscii("John Citizen")); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + QContact contact = mImporter->contacts().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.clear(); + document.setType(QVersitDocument::VCard30Type); + property.setName(QString::fromAscii("FN")); + property.setValue(QString::fromAscii("John Citizen")); + document.addProperty(property); + QVERIFY(mImporter->importDocuments(QList() << document)); + contact = mImporter->contacts().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(QString::fromAscii("extension value 1")); + document.addProperty(property); + mImporter->importDocuments(QList() << document); + QList unknownProperties = mPropertyHandler->mUnknownProperties; + QCOMPARE(unknownProperties.count(), 1); + QCOMPARE(unknownProperties[0].name(), QString::fromAscii("X-EXTENSION-1")); + QCOMPARE(unknownProperties[0].value(), QString::fromAscii("extension value 1")); + + // Two unknown properties + mPropertyHandler->clear(); + property.setName(QString::fromAscii("X-EXTENSION-2")); + property.setValue(QString::fromAscii("extension value 2")); + document.addProperty(property); + mImporter->importDocuments(QList() << document); + unknownProperties = mPropertyHandler->mUnknownProperties; + QCOMPARE(unknownProperties.count(), 2); + QCOMPARE(unknownProperties[0].name(), QString::fromAscii("X-EXTENSION-1")); + QCOMPARE(unknownProperties[0].value(), QString::fromAscii("extension value 1")); + QCOMPARE(unknownProperties[1].name(), QString::fromAscii("X-EXTENSION-2")); + QCOMPARE(unknownProperties[1].value(), QString::fromAscii("extension value 2")); +} + +void tst_QVersitContactImporter::testInvalidDocument() +{ + // invalid document (invalid type) + QList documents; + QVersitDocument document(QVersitDocument::InvalidType); + QVersitProperty nameProperty; + nameProperty.setName(QLatin1String("FN")); + nameProperty.setValue(QLatin1String("John Citizen")); + document.addProperty(nameProperty); + documents.append(document); + + // valid document in the same list + QVersitProperty telProperty; + telProperty.setName(QLatin1String("TEL")); + telProperty.setValue(QLatin1String("1234")); + document.addProperty(telProperty); + document.setType(QVersitDocument::VCard21Type); + documents.append(document); + QVERIFY(!mImporter->importDocuments(documents)); + QMap errors = mImporter->errors(); + QCOMPARE(errors.size(), 1); + QVERIFY(errors.contains(0)); + QVERIFY(errors.value(0) == QVersitContactImporter::InvalidDocumentError); + QList contacts = mImporter->contacts(); + QCOMPARE(contacts.size(), 1); + QContactPhoneNumber phoneDetail = contacts.first().detail(); + QCOMPARE(phoneDetail.number(), QLatin1String("1234")); + + // empty document + document.clear(); + document.setType(QVersitDocument::VCard21Type); + QVERIFY(!mImporter->importDocuments(QList() << document)); + errors = mImporter->errors(); + QCOMPARE(errors.size(), 1); + QCOMPARE(errors.value(0), QVersitContactImporter::EmptyDocumentError); +} + +QVersitDocument tst_QVersitContactImporter::createDocumentWithProperty( + const QVersitProperty& property) +{ + QVersitDocument document(QVersitDocument::VCard30Type); + document.addProperty(property); + return document; +} + +QVersitDocument tst_QVersitContactImporter::createDocumentWithNameAndPhoto( + const QString& name, + QByteArray image, + const QString& imageType) +{ + QVersitDocument document(QVersitDocument::VCard30Type); + + QVersitProperty nameProperty; + nameProperty.setName(QString::fromAscii("FN")); + nameProperty.setValue(name); + document.addProperty(nameProperty); + + QVersitProperty property; + property.setName(QString::fromAscii("PHOTO")); + property.setValue(image); + if (imageType != QString()) { + property.insertParameter(QString::fromAscii("TYPE"), imageType); + } + document.addProperty(property); + + return document; +} + +QTEST_MAIN(tst_QVersitContactImporter) + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactimporter/tst_qversitcontactimporter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitcontactimporter/tst_qversitcontactimporter.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** 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 tst_QVERSITCONTACTIMPORTER_H +#define tst_QVERSITCONTACTIMPORTER_H + +#include +#include +#include +#include + +QTM_BEGIN_NAMESPACE + +class QVersitContactImporter; +class QVersitContactImporterPrivate; +class MyQVersitContactImporterPropertyHandler; +class MyQVersitResourceHandler; + +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class tst_QVersitContactImporter : public QObject +{ + Q_OBJECT + +private slots: // Tests + void init(); + void cleanup(); + + void testName(); + void testNameWithFormatted(); + void testAddress(); + void testTel(); + void testEmail(); + void testUrl(); + void testUid(); + void testOrganizationName(); + void testOrganizationTitle(); + void testOrganizationLogo(); + void testOrganizationAssistant(); + void testOrganizationRole(); + void testTimeStamp(); + void testAnniversary(); + void testBirthday(); + void testGender(); + void testNickname(); + void testAvatarThumbnail(); + void testAvatarUrl(); + void testAvatarInvalid(); + void testGeo(); + void testNote(); + void testCustomLabel(); + void testDisplayLabel(); + void testOnlineAccount(); + void testFamily(); + void testSound(); + void testTag(); + void testPref(); + void testPropertyHandler(); + void testInvalidDocument(); + +private: // Utilities + + QVersitDocument createDocumentWithProperty(const QVersitProperty& property); + + QVersitDocument createDocumentWithNameAndPhoto( + const QString& name, + QByteArray image, + const QString& photoType); + +private: + QVersitContactImporter* mImporter; + MyQVersitContactImporterPropertyHandler* mPropertyHandler; + MyQVersitResourceHandler* mResourceHandler; +}; + +#endif // tst_QVERSITCONTACTIMPORTER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.cpp --- a/qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1367 +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 "qversitdefs_p.h" -#include "ut_qversitcontactimporter.h" -#include "qversitcontactimporter.h" -#include "qversitcontactimporter_p.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#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 - -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() -{ - QVersitDocument document; - QVersitProperty nameProperty; - QStringList value; - value.append(QString::fromAscii("John"));//FirstName - value.append(QString::fromAscii("Citizen"));//LastName - value.append(QString::fromAscii("Anonymous"));//GivenName - value.append(QString::fromAscii("Dr"));//PreFix - value.append(QString::fromAscii("MSc"));//Suffix - nameProperty.setName(QString::fromAscii("N")); - 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.lastName(),value[0]); - QCOMPARE(name.firstName(),value[1]); - QCOMPARE(name.middleName(),value[2]); - QCOMPARE(name.prefix(),value[3]); - QCOMPARE(name.suffix(),value[4]); - - // Multiple names, first one will be picked and rest will be discarded - nameProperty = QVersitProperty(); - QStringList anotherValue; - anotherValue.append(QString::fromAscii("FakeJohn"));//FirstName - anotherValue.append(QString::fromAscii("FakeCitizen"));//LastName - anotherValue.append(QString::fromAscii("FakeAnonymous"));//GivenName - anotherValue.append(QString::fromAscii("FakeDr"));//PreFix - anotherValue.append(QString::fromAscii("FakeMSc"));//Suffix - nameProperty.setName(QString::fromAscii("N")); - nameProperty.setValue(anotherValue.join(QString::fromAscii(";"))); - document.addProperty(nameProperty); - 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.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() -{ - QVersitDocument document; - QVersitProperty property; - property.setName(QString::fromAscii("ADR")); - - // Empty value for the address - document = createDocumentWithProperty(property); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - QContactAddress address = - static_cast(contact.detail(QContactAddress::DefinitionName)); - QCOMPARE(address.postOfficeBox(),QString()); - QCOMPARE(address.street(),QString()); - QCOMPARE(address.locality(),QString()); - QCOMPARE(address.region(),QString()); - QCOMPARE(address.postcode(),QString()); - QCOMPARE(address.country(),QString()); - - // Address with just seprators - property.setValue(QString::fromAscii(";;;;;;")); - document = createDocumentWithProperty(property); - 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()); - QCOMPARE(address.locality(),QString()); - QCOMPARE(address.region(),QString()); - QCOMPARE(address.postcode(),QString()); - QCOMPARE(address.country(),QString()); - - // Address with some fields missing - property.setValue(QString::fromAscii(";;My Street;My Town;;12345;")); - document = createDocumentWithProperty(property); - 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")); - QCOMPARE(address.locality(),QString::fromAscii("My Town")); - QCOMPARE(address.region(),QString()); - QCOMPARE(address.postcode(),QString::fromAscii("12345")); - QCOMPARE(address.country(),QString()); - - // Address with all the fields filled - property.setValue(QString::fromAscii("PO Box;E;My Street;My Town;My State;12345;My Country")); - document = createDocumentWithProperty(property); - 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")); - QCOMPARE(address.locality(),QString::fromAscii("My Town")); - QCOMPARE(address.region(),QString::fromAscii("My State")); - QCOMPARE(address.postcode(),QString::fromAscii("12345")); - QCOMPARE(address.country(),QString::fromAscii("My Country")); - - // Address with TYPE parameters converted to contexts and subtypes - 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); - 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)); - QVERIFY(contexts.contains(QContactDetail::ContextWork)); - QStringList subTypes = address.subTypes(); - QVERIFY(subTypes.contains(QContactAddress::SubTypeDomestic)); - QVERIFY(subTypes.contains(QContactAddress::SubTypeInternational)); - QVERIFY(subTypes.contains(QContactAddress::SubTypePostal)); - QVERIFY(subTypes.contains(QContactAddress::SubTypeParcel)); -} - -void UT_QVersitContactImporter::testOrganizationName() -{ - QVersitDocument document; - QVersitProperty property; - - // Empty value for the organization - property.setName(QString::fromAscii("ORG")); - document = createDocumentWithProperty(property); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - QContactOrganization organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.name(),QString()); - QCOMPARE(organization.department().count(),0); - - // Organization without separators - property.setValue(QString::fromAscii("Nokia")); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.name(),QString::fromAscii("Nokia")); - QCOMPARE(organization.department().count(),0); - - // Organization with one separator - property.setValue(QString::fromAscii(";")); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.name(),QString::fromAscii("")); - QCOMPARE(organization.department().count(),0); - - // Organization with just separators - property.setValue(QString::fromAscii(";;;")); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.name(),QString::fromAscii("")); - QCOMPARE(organization.department().count(),0); - - // Organization with one Organizational Unit - property.setValue(QString::fromAscii("Nokia;R&D")); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.name(),QString::fromAscii("Nokia")); - QCOMPARE(organization.department().count(),1); - QCOMPARE(organization.department().at(0),QString::fromAscii("R&D")); - - // Organization with organization name and semicolon - property.setValue(QString::fromAscii("Nokia;")); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.name(),QString::fromAscii("Nokia")); - QCOMPARE(organization.department().count(),0); - - // Organization with semicolon and department - property.setValue(QString::fromAscii(";R&D")); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.name(),QString()); - QCOMPARE(organization.department().count(),1); - QCOMPARE(organization.department().at(0),QString::fromAscii("R&D")); - - // Organization with more Organizational Units - property.setValue(QString::fromAscii("Nokia;R&D;Devices;Qt")); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.name(),QString::fromAscii("Nokia")); - QCOMPARE(organization.department().count(),3); - QCOMPARE(organization.department().at(0),QString::fromAscii("R&D")); - QCOMPARE(organization.department().at(1),QString::fromAscii("Devices")); - QCOMPARE(organization.department().at(2),QString::fromAscii("Qt")); -} - -void UT_QVersitContactImporter::testOrganizationTitle() -{ - QVersitDocument document; - QVersitProperty property; - - // One title - property.setName(QString::fromAscii("TITLE")); - QString titleValue(QString::fromAscii("Developer")); - property.setValue(titleValue); - document = createDocumentWithProperty(property); - 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(),titleValue); - - // Two titles -> two QContactOrganizations created - property.setName(QString::fromAscii("TITLE")); - QString secondTitleValue(QString::fromAscii("Hacker")); - property.setValue(secondTitleValue); - document.addProperty(property); - 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(),titleValue); - QContactOrganization secondOrganization = - static_cast(organizationDetails[1]); - QCOMPARE(secondOrganization.title(),secondTitleValue); - - // Two titles and one organization name -> two QContactOrganizations created - property.setName(QString::fromAscii("ORG")); - QString organizationName(QString::fromAscii("Nokia")); - property.setValue(organizationName); - document.addProperty(property); - 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(),titleValue); - QCOMPARE(firstOrganization.name(),organizationName); - secondOrganization = static_cast(organizationDetails[1]); - 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; - QList documentList; - - // Embedded LOGO - property.setName(QString::fromAscii("LOGO")); - QByteArray logo(QByteArray::fromBase64( - "R0lGODlhEgASAIAAAAAAAP///yH5BAEAAAEALAAAAAASABIAAAIdjI+py+0G")); - property.setValue(logo); - property.insertParameter(QString::fromAscii("TYPE"), - QString::fromAscii("GIF")); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - QContactOrganization organization = - 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")); - QString logoUrl(QString::fromAscii("http://www.organization.org/logo.gif")); - property.setValue(logoUrl); - property.insertParameter(QString::fromAscii("VALUE"),QString::fromAscii("URL")); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.logo(),logoUrl); -} - -void UT_QVersitContactImporter::testOrganizationRole() -{ - QContact contact; - QVersitDocument document; - QVersitProperty property; - - // Setting the role is not yet supported by QContactOrganization - property.setName(QString::fromAscii("ROLE")); - QString roleValue(QString::fromAscii("Very important manager and proud of it")); - property.setValue(roleValue); - document = createDocumentWithProperty(property); - QList documentList; - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - QContactOrganization organization = - static_cast( - contact.detail(QContactOrganization::DefinitionName)); - QCOMPARE(organization.role(), roleValue); -} - -void UT_QVersitContactImporter::testTel() -{ - QVersitDocument document; - QVersitProperty property; - property.setName(QString::fromAscii("TEL")); - QString value(QString::fromAscii("+35850987654321")); - property.setValue(value); - - 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); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - const QContactPhoneNumber& phone = - static_cast( - contact.detail(QContactPhoneNumber::DefinitionName)); - QCOMPARE(phone.number(),QString(value)); - - const QStringList subTypes = phone.subTypes(); - QCOMPARE(subTypes.count(),8); - QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeVoice)); - QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeMobile)); - QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeModem)); - QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeCar)); - QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeVideo)); - QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeFacsimile)); - QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypeBulletinBoardSystem)); - QVERIFY(subTypes.contains(QContactPhoneNumber::SubTypePager)); - - const QStringList contexts = phone.contexts(); - QCOMPARE(contexts.count(),2); - QVERIFY(contexts.contains(QContactDetail::ContextWork)); - QVERIFY(contexts.contains(QContactDetail::ContextHome)); -} - -void UT_QVersitContactImporter::testEmail() -{ - QVersitProperty property; - property.setName(QString::fromAscii("EMAIL")); - QString value(QString::fromAscii("john.citizen@example.com")); - property.setValue(value); - property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("WORK")); - QVersitDocument document = createDocumentWithProperty(property); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - QContactEmailAddress email = - static_cast( - contact.detail(QContactEmailAddress::DefinitionName)); - QCOMPARE(email.emailAddress(),value); - const QStringList contexts = email.contexts(); - QCOMPARE(contexts.count(),1); - QVERIFY(contexts.contains(QContactDetail::ContextWork)); -} - -void UT_QVersitContactImporter::testUrl() -{ - QVersitProperty property; - property.setName(QString::fromAscii("URL")); - QString value(QString::fromAscii("http://example.com")); - property.setValue(value); - 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(),value); - const QStringList contexts = url.contexts(); - QCOMPARE(contexts.count(),1); - QVERIFY(contexts.contains(QContactDetail::ContextWork)); -} - -void UT_QVersitContactImporter::testUid() -{ - QVersitProperty property; - property.setName(QString::fromAscii("UID")); - QString value(QString::fromAscii("unique identifier")); - property.setValue(value); - QVersitDocument document = createDocumentWithProperty(property); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - QContactGuid uid = - static_cast( - contact.detail(QContactGuid::DefinitionName)); - QCOMPARE(uid.guid(),value); -} - -void UT_QVersitContactImporter::testTimeStamp() -{ - // Simple date : ISO 8601 extended format - QVersitProperty property; - property.setName(QString::fromAscii("REV")); - QString dateValue(QString::fromAscii("1981-05-20")); - property.setValue(dateValue); - QVersitDocument document = createDocumentWithProperty(property); - 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),dateValue); - - // Date and Time : ISO 8601 extended format without utc offset - QString dateAndTimeValue(QString::fromAscii("1981-05-20T23:55:55")); - property.setValue(dateAndTimeValue); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - timeStamp = - static_cast( - contact.detail(QContactTimestamp::DefinitionName)); - QCOMPARE(timeStamp.lastModified().toString(Qt::ISODate),dateAndTimeValue); - - // Date and Time : ISO 8601 extented format with utc offset - QString utcOffset(QString::fromAscii("Z")); - QString dateAndTimeWithUtcValue = dateAndTimeValue+utcOffset; - property.setValue(dateAndTimeWithUtcValue); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - timeStamp = - static_cast( - contact.detail(QContactTimestamp::DefinitionName)); - 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 = QString::fromAscii("19810520T235555"); - property.setValue(dateAndTimeValue); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - timeStamp = - static_cast( - contact.detail(QContactTimestamp::DefinitionName)); - - QCOMPARE(timeStamp.lastModified().toString(QString::fromAscii("yyyyMMddThhmmss")), - dateAndTimeValue); - - // Date and Time : ISO 8601 in basic format with utc offset - dateAndTimeValue = QString::fromAscii("19810520T235555"); - dateAndTimeWithUtcValue = dateAndTimeValue+utcOffset; - property.setValue(dateAndTimeWithUtcValue); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - timeStamp = - static_cast( - contact.detail(QContactTimestamp::DefinitionName)); - QCOMPARE(timeStamp.lastModified().toString(QString::fromAscii("yyyyMMddThhmmss")), - dateAndTimeValue); - QCOMPARE(timeStamp.lastModified().timeSpec(),Qt::UTC); -} - -void UT_QVersitContactImporter::testAnniversary() -{ - // Date : ISO 8601 extended format - QVersitProperty property; - property.setName(QString::fromAscii("X-ANNIVERSARY")); - QString dateValue(QString::fromAscii("1981-05-20")); - property.setValue(dateValue); - QVersitDocument document = createDocumentWithProperty(property); - 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),dateValue); - - // Date : ISO 8601 in basic format - dateValue = QString::fromAscii("19810520"); - property.setValue(dateValue); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - anniversary = - static_cast( - contact.detail(QContactAnniversary::DefinitionName)); - QCOMPARE(anniversary.originalDate().toString(QString::fromAscii("yyyyMMdd")), - dateValue); - -} - -void UT_QVersitContactImporter::testBirthday() -{ - // Date : ISO 8601 extended format - QVersitProperty property; - property.setName(QString::fromAscii("BDAY")); - QString dateValue(QString::fromAscii("1981-05-20")); - property.setValue(dateValue); - QVersitDocument document = createDocumentWithProperty(property); - 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), - dateValue); - - // Date : ISO 8601 in basic format - dateValue = QString::fromAscii("19810520"); - property.setValue(dateValue); - document = createDocumentWithProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - bday = - static_cast( - contact.detail(QContactBirthday::DefinitionName)); - QCOMPARE(bday.date().toString(QString::fromAscii("yyyyMMdd")), - dateValue); - -} - -void UT_QVersitContactImporter::testGender() -{ - // Date : ISO 8601 extended format - QVersitProperty property; - property.setName(QString::fromAscii("X-GENDER")); - QString val(QString::fromAscii("Male")); - property.setValue(val); - QVersitDocument document = createDocumentWithProperty(property); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - QContactGender gender = - static_cast( - contact.detail(QContactGender ::DefinitionName)); - QCOMPARE(gender.gender(),val); -} - -void UT_QVersitContactImporter::testNickname() -{ - // one value - QVersitDocument document; - QVersitProperty nameProperty; - QString singleVal(QString::fromAscii("Homie")); - nameProperty.setName(QString::fromAscii("NICKNAME")); - nameProperty.setValue(singleVal); - document.addProperty(nameProperty); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - QContactNickname nickName = (QContactNickname)contact.detail(QContactNickname::DefinitionName); - QCOMPARE(nickName.nickname(),singleVal); - - // comma separated values should generate multiple nickname fields - contact.clearDetails(); - document = QVersitDocument(); - QStringList multiVal; - multiVal.append(QString::fromAscii("Homie")); - multiVal.append(QString::fromAscii("SuperHero")); - multiVal.append(QString::fromAscii("NukeSpecialist")); - nameProperty.setName(QString::fromAscii("NICKNAME")); - nameProperty.setValue(multiVal.join(QString::fromAscii(","))); - document.addProperty(nameProperty); - 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]); - QCOMPARE(nickName.nickname(),QString::fromAscii("Homie")); - nickName = static_cast(nickNames[1]); - QCOMPARE(nickName.nickname(),QString::fromAscii("SuperHero")); - nickName = static_cast(nickNames[2]); - QCOMPARE(nickName.nickname(),QString::fromAscii("NukeSpecialist")); - - // X-NICKNAME - document = QVersitDocument(); - nameProperty = QVersitProperty(); - nameProperty.setName(QString::fromAscii("X-NICKNAME")); - nameProperty.setValue(singleVal); - document.addProperty(nameProperty); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - nickName = - static_cast( - contact.detail(QContactNickname::DefinitionName)); - QCOMPARE(nickName.nickname(),singleVal); -} - -void UT_QVersitContactImporter::testAvatarStored() -{ - QByteArray gif(SAMPLE_GIF); - QStringList nameValues(QString::fromAscii("John")); // First name - nameValues.append(QString::fromAscii("Citizen")); // Last name - 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()); - QContactAvatar avatar = static_cast(detail); - QVERIFY(avatar.subType() == QContactAvatar::SubTypeImage); - QByteArray content = mResourceHandler->mObjects.value(avatar.avatar()); - QCOMPARE(content, gif); - QPixmap pixmap(avatar.pixmap()); - QPixmap expectedPixmap; - expectedPixmap.loadFromData(gif); - QCOMPARE(pixmap, expectedPixmap); - - // 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); - - // 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); - - mImporter->setResourceHandler(mResourceHandler); -} - -void UT_QVersitContactImporter::testAvatarUrl() -{ - QVersitProperty property; - property.setName(QLatin1String("PHOTO")); - QString value(QLatin1String("http://example.com/example.jpg")); - property.setValue(value); - property.insertParameter(QLatin1String("VALUE"), QLatin1String("URL")); - - QVersitDocument document; - document.addProperty(property); - QList documentList; - documentList.append(document); - - QContact contact = mImporter->importContacts(documentList).first(); - QContactAvatar avatar = - static_cast(contact.detail(QContactAvatar::DefinitionName)); - 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::testAvatarInvalid() -{ - // 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); - - 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() -{ - // some positive values - QVersitDocument document; - QVersitProperty nameProperty; - QStringList val; - 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(","))); - document.addProperty(nameProperty); - 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]); - str.setNum(geo.latitude(),'.',2); - QCOMPARE(str,val[1]); - - // some negative values - document = QVersitDocument(); - nameProperty = QVersitProperty(); - 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(","))); - document.addProperty(nameProperty); - 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]); - str.setNum(geo.latitude(),'.',2); - QCOMPARE(str,val[1]); -} - -void UT_QVersitContactImporter::testNote() -{ - // single line value - QVersitDocument document; - QVersitProperty nameProperty; - QString val(QString::fromAscii("I will not sleep at my work -John")); - nameProperty.setName(QString::fromAscii("NOTE")); - nameProperty.setValue(val); - document.addProperty(nameProperty); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - QContactNote note = (QContactNote)contact.detail(QContactNote::DefinitionName); - QCOMPARE(note.note(),val); - - // Multiline value and quoted printable encoding - document = QVersitDocument(); - nameProperty = QVersitProperty(); - 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"),val); - nameProperty.setParameters(params); - document.addProperty(nameProperty); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - note = (QContactNote)contact.detail(QContactNote::DefinitionName); - QCOMPARE(note.note(),val); -} - -void UT_QVersitContactImporter::testLabel() -{ - QVersitDocument document; - QVersitProperty nameProperty; - QString val(QString::fromAscii("John Citizen")); - nameProperty.setName(QString::fromAscii("FN")); - nameProperty.setValue(val); - document.addProperty(nameProperty); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - QContactName name = - (QContactName)contact.detail(QContactName::DefinitionName); - QCOMPARE(name.customLabel(),val); -} - -void UT_QVersitContactImporter::testOnlineAccount() -{ - QString accountUri(QString::fromAscii("sip:john.citizen@example.com")); - - // Plain X-SIP, no TYPE -> - QVersitDocument document; - QVersitProperty property; - property.setName(QString::fromAscii("X-SIP")); - property.setValue(accountUri); - document.addProperty(property); - QList documentList; - documentList.append(document); - QContact contact = mImporter->importContacts(documentList).first(); - QContactOnlineAccount onlineAccount = - static_cast( - contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),accountUri); - QStringList subTypes = onlineAccount.subTypes(); - QCOMPARE(subTypes.count(),1); - QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeSip); - - // X-SIP;SWIS - document = QVersitDocument(); - property = QVersitProperty(); - property.setName(QString::fromAscii("X-SIP")); - property.setValue(accountUri); - QMultiHash params; - params.insert(QString::fromAscii("TYPE"),QString::fromAscii("SWIS")); - property.setParameters(params); - document.addProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - onlineAccount = - static_cast( - contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),accountUri); - subTypes = onlineAccount.subTypes(); - QCOMPARE(subTypes.count(),1); - QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeVideoShare); - - // X-SIP;VOIP - document = QVersitDocument(); - property = QVersitProperty(); - property.setName(QString::fromAscii("X-SIP")); - property.setValue(accountUri); - params.clear(); - params.insert(QString::fromAscii("TYPE"),QString::fromAscii("VOIP")); - property.setParameters(params); - document.addProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - onlineAccount = - static_cast( - contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),accountUri); - subTypes = onlineAccount.subTypes(); - QCOMPARE(subTypes.count(),1); - QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeSipVoip); - - // X-IMPP - document = QVersitDocument(); - property = QVersitProperty(); - property.setName(QString::fromAscii("X-IMPP")); - property.setValue(accountUri); - document.addProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - onlineAccount = - static_cast( - contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),accountUri); - subTypes = onlineAccount.subTypes(); - QCOMPARE(subTypes.count(),1); - QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeImpp); - - // IMPP - document = QVersitDocument(); - property = QVersitProperty(); - property.setName(QString::fromAscii("IMPP")); - property.setValue(accountUri); - document.addProperty(property); - documentList.clear(); - documentList.append(document); - contact = mImporter->importContacts(documentList).first(); - onlineAccount = - static_cast( - contact.detail(QContactOnlineAccount::DefinitionName)); - QCOMPARE(onlineAccount.accountUri(),accountUri); - subTypes = onlineAccount.subTypes(); - QCOMPARE(subTypes.count(),1); - QVERIFY(subTypes.first() == QContactOnlineAccount::SubTypeImpp); -} - -void UT_QVersitContactImporter::testFamily() -{ - // Interesting : kid but no wife :) - QVersitDocument document; - QVersitProperty nameProperty; - QString val(QString::fromAscii("Jane")); // one is enough - nameProperty.setName(QString::fromAscii("X-CHILDREN")); - nameProperty.setValue(val); - document.addProperty(nameProperty); - 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],val); // ensure it is your kid - - // Critical : wife but no kids , happy hours - document = QVersitDocument(); - nameProperty = QVersitProperty(); - nameProperty.setName(QString::fromAscii("X-SPOUSE")); - val = QString::fromAscii("Jenny"); - nameProperty.setValue(val); - document.addProperty(nameProperty); - 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(),val); // make sure thats your wife:( - - // Hopeless : couple of kids and wife - document = QVersitDocument(); - // Add kids first - nameProperty = QVersitProperty(); - nameProperty.setName(QString::fromAscii("X-CHILDREN")); - QStringList kidsVal; - kidsVal.append(QString::fromAscii("James")); - kidsVal.append(QString::fromAscii("Jake")); - kidsVal.append(QString::fromAscii("Jane")); - nameProperty.setValue(kidsVal.join(QString::fromAscii(","))); - document.addProperty(nameProperty); - // Add wife next - val = QString::fromAscii("Jenny"); - nameProperty = QVersitProperty(); - nameProperty.setName(QString::fromAscii("X-SPOUSE")); - nameProperty.setValue(val); - document.addProperty(nameProperty); - 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(),val); // make sure thats your wife:( -} - -void UT_QVersitContactImporter::testSound() -{ - QVersitDocument document; - QVersitProperty nameProperty; - nameProperty.setName(QString::fromAscii("N")); - nameProperty.setValue(QString::fromAscii("Citizen;John;;;")); - document.addProperty(nameProperty); - nameProperty = QVersitProperty(); - QVersitProperty soundProperty; - QMultiHash param; - param.insert(QString::fromAscii("TYPE"),QString::fromAscii("WAVE")); - soundProperty.setName(QString::fromAscii("SOUND")); - QByteArray val("111110000011111"); - 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()); - QVERIFY(!avatar.hasValue(QContactAvatar::FieldAvatarPixmap)); - QByteArray content = mResourceHandler->mObjects.value(avatar.avatar()); - QCOMPARE(content, val); -} - -void UT_QVersitContactImporter::testPropertyHandler() -{ - QVersitDocument document; - QVersitProperty property; - - // No unconverted properties, no converted properties either - 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(QString::fromAscii("Citizen;John;Q;;")); - document.addProperty(property); - 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(QString::fromAscii("extension value 1")); - document.addProperty(property); - 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(unknownProperties[0].value(), QString::fromAscii("extension value 1")); - - // Two unknown properties - mPropertyHandler->clear(); - property.setName(QString::fromAscii("X-EXTENSION-2")); - property.setValue(QString::fromAscii("extension value 2")); - document.addProperty(property); - 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(unknownProperties[0].value(), QString::fromAscii("extension value 1")); - QCOMPARE(unknownProperties[1].name(), QString::fromAscii("X-EXTENSION-2")); - QCOMPARE(unknownProperties[1].value(), QString::fromAscii("extension value 2")); -} - -QVersitDocument UT_QVersitContactImporter::createDocumentWithProperty( - const QVersitProperty& property) -{ - QVersitDocument document; - document.addProperty(property); - return document; -} - -QVersitDocument UT_QVersitContactImporter::createDocumentWithNameAndPhoto( - const QString& name, - QByteArray image, - const QString& imageType) -{ - QVersitDocument document; - - QVersitProperty nameProperty; - nameProperty.setName(QString::fromAscii("N")); - nameProperty.setValue(name); - document.addProperty(nameProperty); - - QVersitProperty property; - property.setName(QString::fromAscii("PHOTO")); - property.setValue(image); - if (imageType != QString()) { - property.insertParameter(QString::fromAscii("TYPE"), imageType); - } - document.addProperty(property); - - return document; -} - -QTEST_MAIN(UT_QVersitContactImporter) - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.h --- a/qtcontactsmobility/tests/auto/qversitcontactimporter/ut_qversitcontactimporter.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +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 UT_QVERSITCONTACTIMPORTER_H -#define UT_QVERSITCONTACTIMPORTER_H - -#include -#include -#include -#include - -QTM_BEGIN_NAMESPACE - -class QVersitContactImporter; -class QVersitContactImporterPrivate; -class MyQVersitContactImporterPropertyHandler; -class MyQVersitResourceHandler; - -QTM_END_NAMESPACE -QTM_USE_NAMESPACE - -class UT_QVersitContactImporter : public QObject -{ - Q_OBJECT - -private slots: // Tests - void init(); - void cleanup(); - - void testName(); - void testNameWithFormatted(); - void testAddress(); - void testTel(); - void testEmail(); - void testUrl(); - void testUid(); - void testOrganizationName(); - void testOrganizationTitle(); - void testOrganizationLogo(); - void testOrganizationAssistant(); - void testOrganizationRole(); - void testTimeStamp(); - void testAnniversary(); - void testBirthday(); - void testGender(); - void testNickname(); - void testAvatarStored(); - void testAvatarUrl(); - void testAvatarInvalid(); - void testGeo(); - void testNote(); - void testOnlineAccount(); - void testFamily(); - void testSound(); - void testLabel(); - void testPropertyHandler(); - -private: // Utilities - - QVersitDocument createDocumentWithProperty(const QVersitProperty& property); - - QVersitDocument createDocumentWithNameAndPhoto( - const QString& name, - QByteArray image, - const QString& photoType); - -private: - QVersitContactImporter* mImporter; - QVersitContactImporterPrivate* mImporterPrivate; - MyQVersitContactImporterPropertyHandler* mPropertyHandler; - MyQVersitResourceHandler* mResourceHandler; -}; - -#endif // UT_QVERSITCONTACTIMPORTER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitdocument/qversitdocument.pro --- a/qtcontactsmobility/tests/auto/qversitdocument/qversitdocument.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qversitdocument/qversitdocument.pro Mon May 03 12:24:20 2010 +0300 @@ -16,8 +16,8 @@ ../../../src/contacts/requests \ ../../../src/contacts/filters -HEADERS += ut_qversitdocument.h -SOURCES += ut_qversitdocument.cpp +HEADERS += tst_qversitdocument.h +SOURCES += tst_qversitdocument.cpp CONFIG += mobility MOBILITY = contacts versit diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitdocument/tst_qversitdocument.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitdocument/tst_qversitdocument.cpp Mon May 03 12:24:20 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 "tst_qversitdocument.h" +#include "qversitdocument.h" +#include "qversitproperty.h" +#include +#include + +QTM_USE_NAMESPACE + +void tst_QVersitDocument::init() +{ + mVersitDocument = new QVersitDocument(); + QVERIFY(mVersitDocument); +} + +void tst_QVersitDocument::cleanup() +{ + delete mVersitDocument; +} + + +void tst_QVersitDocument::testConstructor() +{ + QCOMPARE(QVersitDocument::InvalidType, mVersitDocument->type()); +} + +void tst_QVersitDocument::testType() +{ + mVersitDocument->setType(QVersitDocument::VCard21Type); + QCOMPARE(QVersitDocument::VCard21Type, mVersitDocument->type()); + + mVersitDocument->setType(QVersitDocument::VCard30Type); + QCOMPARE(QVersitDocument::VCard30Type, mVersitDocument->type()); +} + +void tst_QVersitDocument::testAddProperty() +{ + QCOMPARE(0, mVersitDocument->properties().count()); + QVersitProperty property; + mVersitDocument->addProperty(property); + QCOMPARE(1, mVersitDocument->properties().count()); +} + +void tst_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 tst_QVersitDocument::testRemoveAllProperties() +{ + QString name(QString::fromAscii("FN")); + + // Try to remove from an empty document + QCOMPARE(0, mVersitDocument->properties().count()); + mVersitDocument->removeProperties(name); + QCOMPARE(0, mVersitDocument->properties().count()); + + // Try to remove from a non-empty document, name does not match + QVersitProperty property; + property.setName(QString::fromAscii("TEL")); + mVersitDocument->addProperty(property); + QCOMPARE(1, mVersitDocument->properties().count()); + mVersitDocument->removeProperties(name); + QCOMPARE(1, mVersitDocument->properties().count()); + + // Remove from a non-empty document, name matches + mVersitDocument->removeProperties(QString::fromAscii("TEL")); + QCOMPARE(0, mVersitDocument->properties().count()); + + // Remove from a document with two properties, first matches + property.setName(name); + mVersitDocument->addProperty(property); + property.setName(QString::fromAscii("TEL")); + mVersitDocument->addProperty(property); + QCOMPARE(2, mVersitDocument->properties().count()); + mVersitDocument->removeProperties(name); + QCOMPARE(1, mVersitDocument->properties().count()); + + // Remove from a document with two properties, second matches + property.setName(name); + mVersitDocument->addProperty(property); + QCOMPARE(2, mVersitDocument->properties().count()); + mVersitDocument->removeProperties(name); + QCOMPARE(1, mVersitDocument->properties().count()); +} + +void tst_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()); +} + +void tst_QVersitDocument::testHash() +{ + QVersitDocument document1; + document1.setType(QVersitDocument::VCard30Type); + QVersitProperty property1; + property1.setName(QLatin1String("name")); + property1.setValue(QLatin1String("value")); + document1.addProperty(property1); + QVersitDocument document2; + document2.setType(QVersitDocument::VCard30Type); + document2.addProperty(property1); + QVersitDocument document3; + document3.setType(QVersitDocument::VCard30Type); + QVersitProperty property3; + property3.setName(QLatin1String("name")); + property3.setValue(QLatin1String("another value")); + document3.addProperty(property3); + QVersitDocument document4; // no properties + document4.setType(QVersitDocument::VCard30Type); + + QVERIFY(qHash(document1) == qHash(document2)); + QVERIFY(qHash(document1) != qHash(document3)); + QVERIFY(qHash(document1) != qHash(document4)); +} + +QTEST_MAIN(tst_QVersitDocument) + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitdocument/tst_qversitdocument.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitdocument/tst_qversitdocument.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** 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 tst_QVERSITDOCUMENT_H +#define tst_QVERSITDOCUMENT_H + +#include +#include + +QTM_BEGIN_NAMESPACE + +class QVersitDocument; + +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class tst_QVersitDocument : public QObject +{ + Q_OBJECT + +private slots: + void init(); + void cleanup(); + + void testConstructor(); + void testType(); + void testAddProperty(); + void testRemoveProperty(); + void testRemoveAllProperties(); + void testEquality(); + void testHash(); + +private: // data + QVersitDocument* mVersitDocument; +}; + +#endif // tst_QVERSITDOCUMENT_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.cpp --- a/qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /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$ -** -****************************************************************************/ - -#include "ut_qversitdocument.h" -#include "qversitdocument.h" -#include "qversitproperty.h" -#include -#include - -QTM_USE_NAMESPACE - -void UT_QVersitDocument::init() -{ - mVersitDocument = new QVersitDocument(); - QVERIFY(mVersitDocument); -} - -void UT_QVersitDocument::cleanup() -{ - delete mVersitDocument; -} - - -void UT_QVersitDocument::testConstructor() -{ - QCOMPARE(QVersitDocument::InvalidType, mVersitDocument->type()); -} - -void UT_QVersitDocument::testType() -{ - mVersitDocument->setType(QVersitDocument::VCard21Type); - QCOMPARE(QVersitDocument::VCard21Type, mVersitDocument->type()); - - mVersitDocument->setType(QVersitDocument::VCard30Type); - QCOMPARE(QVersitDocument::VCard30Type, mVersitDocument->type()); -} - -void UT_QVersitDocument::testAddProperty() -{ - QCOMPARE(0, mVersitDocument->properties().count()); - QVersitProperty property; - mVersitDocument->addProperty(property); - QCOMPARE(1, mVersitDocument->properties().count()); -} - -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")); - - // Try to remove from an empty document - QCOMPARE(0, mVersitDocument->properties().count()); - mVersitDocument->removeProperties(name); - QCOMPARE(0, mVersitDocument->properties().count()); - - // Try to remove from a non-empty document, name does not match - QVersitProperty property; - property.setName(QString::fromAscii("TEL")); - mVersitDocument->addProperty(property); - QCOMPARE(1, mVersitDocument->properties().count()); - mVersitDocument->removeProperties(name); - QCOMPARE(1, mVersitDocument->properties().count()); - - // Remove from a non-empty document, name matches - mVersitDocument->removeProperties(QString::fromAscii("TEL")); - QCOMPARE(0, mVersitDocument->properties().count()); - - // Remove from a document with two properties, first matches - property.setName(name); - mVersitDocument->addProperty(property); - property.setName(QString::fromAscii("TEL")); - mVersitDocument->addProperty(property); - QCOMPARE(2, mVersitDocument->properties().count()); - mVersitDocument->removeProperties(name); - QCOMPARE(1, mVersitDocument->properties().count()); - - // Remove from a document with two properties, second matches - property.setName(name); - mVersitDocument->addProperty(property); - QCOMPARE(2, mVersitDocument->properties().count()); - mVersitDocument->removeProperties(name); - 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.h --- a/qtcontactsmobility/tests/auto/qversitdocument/ut_qversitdocument.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +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 UT_QVERSITDOCUMENT_H -#define UT_QVERSITDOCUMENT_H - -#include -#include - -QTM_BEGIN_NAMESPACE - -class QVersitDocument; - -QTM_END_NAMESPACE -QTM_USE_NAMESPACE - -class UT_QVersitDocument : public QObject -{ - Q_OBJECT - -private slots: - void init(); - void cleanup(); - - void testConstructor(); - void testType(); - void testAddProperty(); - void testRemoveProperty(); - void testRemoveAllProperties(); - void testEquality(); - -private: // data - QVersitDocument* mVersitDocument; -}; - -#endif // UT_QVERSITDOCUMENT_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitproperty/qversitproperty.pro --- a/qtcontactsmobility/tests/auto/qversitproperty/qversitproperty.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qversitproperty/qversitproperty.pro Mon May 03 12:24:20 2010 +0300 @@ -16,8 +16,8 @@ ../../../src/contacts/requests \ ../../../src/contacts/filters -HEADERS += ut_qversitproperty.h -SOURCES += ut_qversitproperty.cpp +HEADERS += tst_qversitproperty.h +SOURCES += tst_qversitproperty.cpp CONFIG += mobility MOBILITY = contacts versit diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitproperty/tst_qversitproperty.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitproperty/tst_qversitproperty.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,201 @@ +/**************************************************************************** +** +** 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 "tst_qversitproperty.h" +#include "qversitproperty.h" +#include "qversitproperty_p.h" +#include "qversitdocument.h" +#include + +QTM_USE_NAMESPACE + +void tst_QVersitProperty::init() +{ + mVersitProperty = new QVersitProperty(); + QVERIFY(mVersitProperty); +} + +void tst_QVersitProperty::cleanup() +{ + delete mVersitProperty; +} + +void tst_QVersitProperty::testGroup() +{ + // One group + QStringList group(QString::fromAscii("GROUP_NAME")); + mVersitProperty->setGroups(group); + QCOMPARE(mVersitProperty->groups(), group); + + // Several groups + QStringList groupList; + groupList.append(QString::fromAscii("GROUP1")); + groupList.append(QString::fromAscii("Group2")); + groupList.append(QString::fromAscii("group3")); + mVersitProperty->setGroups(groupList); + QCOMPARE(mVersitProperty->groups(), groupList); +} + +void tst_QVersitProperty::testName() +{ + // Name in upper case + QString name(QString::fromAscii("TEL")); + mVersitProperty->setName(name); + QCOMPARE(mVersitProperty->name(), name); + + // Name in lower case, converted automatically to upper case + mVersitProperty->setName(QString::fromAscii("tel")); + QCOMPARE(mVersitProperty->name(), name); +} + +void tst_QVersitProperty::testParameters() +{ + QString typeParameterName(QString::fromAscii("TYPE")); + + QString name(QString::fromAscii("type")); + QString value1(QString::fromAscii("home")); + 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->insertParameter(name,value2); + parameters = mVersitProperty->parameters(); + QCOMPARE(parameters.count(), 2); + QVERIFY(parameters.contains(typeParameterName,QString::fromAscii("HOME"))); + QVERIFY(parameters.contains(typeParameterName,QString::fromAscii("VOICE"))); + + mVersitProperty->removeParameter(name,value1); + QCOMPARE(mVersitProperty->parameters().count(), 1); + QVERIFY(parameters.contains(typeParameterName,QString::fromAscii("HOME"))); + + mVersitProperty->removeParameter(name,value2); + 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 tst_QVersitProperty::testValue() +{ + QString value(QString::fromAscii("050484747")); + mVersitProperty->setValue(value); + QCOMPARE(mVersitProperty->value(), value); +} + +void tst_QVersitProperty::testEmbeddedDocument() +{ + QVersitDocument document; + QVersitProperty property; + property.setName(QString::fromAscii("X-tension")); + document.addProperty(property); + mVersitProperty->setValue(QVariant::fromValue(document)); + QList embeddedDocumentProperties = + mVersitProperty->value().properties(); + QCOMPARE(embeddedDocumentProperties.count(),1); + QCOMPARE(embeddedDocumentProperties[0].name(),QString::fromAscii("X-TENSION")); +} + +void tst_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)); +} + +void tst_QVersitProperty::testHash() +{ + QVersitProperty property1; + property1.setGroups(QStringList() << QLatin1String("group1") << QLatin1String("group2")); + property1.setName(QLatin1String("name")); + property1.setValue(QLatin1String("value")); + property1.insertParameter(QLatin1String("param"), QLatin1String("value")); + QVersitProperty property2; + property2.setGroups(QStringList() << QLatin1String("group1") << QLatin1String("group2")); + property2.setName(QLatin1String("name")); + property2.setValue(QLatin1String("value")); + property2.insertParameter(QLatin1String("param"), QLatin1String("value")); + QVersitProperty property3; // no groups + property3.setName(QLatin1String("name")); + property3.setValue(QLatin1String("value")); + property3.insertParameter(QLatin1String("param"), QLatin1String("value")); + QVersitProperty property4; // no params + property4.setGroups(QStringList() << QLatin1String("group1") << QLatin1String("group2")); + property4.setName(QLatin1String("name")); + property4.setValue(QLatin1String("value")); + + QVERIFY(qHash(property1) == qHash(property2)); + QVERIFY(qHash(property1) != qHash(property3)); + QVERIFY(qHash(property1) != qHash(property4)); + QVERIFY(qHash(property3) != qHash(property4)); + QSet set; + set.insert(property1); + set.insert(property2); + set.insert(property3); + set.insert(property4); + QCOMPARE(set.size(), 3); +} + +QTEST_MAIN(tst_QVersitProperty) + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitproperty/tst_qversitproperty.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitproperty/tst_qversitproperty.h Mon May 03 12:24:20 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 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 tst_QVERSITPROPERTY_H +#define tst_QVERSITPROPERTY_H + +#include +#include + +QTM_BEGIN_NAMESPACE + +class QVersitProperty; + +QTM_END_NAMESPACE +QTM_USE_NAMESPACE + +class tst_QVersitProperty : public QObject +{ + Q_OBJECT + +private slots: + + void init(); + void cleanup(); + +private slots: //test methods + + void testGroup(); + void testName(); + void testParameters(); + void testValue(); + void testEmbeddedDocument(); + void testEquality(); + void testHash(); + +private: + QVersitProperty* mVersitProperty; + +}; + +#endif //tst_QVERSITPROPERTY_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.cpp --- a/qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +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 "ut_qversitproperty.h" -#include "qversitproperty.h" -#include "qversitproperty_p.h" -#include "qversitdocument.h" -#include - -QTM_USE_NAMESPACE - -void UT_QVersitProperty::init() -{ - mVersitProperty = new QVersitProperty(); - QVERIFY(mVersitProperty); -} - -void UT_QVersitProperty::cleanup() -{ - delete mVersitProperty; -} - -void UT_QVersitProperty::testGroup() -{ - // One group - QStringList group(QString::fromAscii("GROUP_NAME")); - mVersitProperty->setGroups(group); - QCOMPARE(mVersitProperty->groups(), group); - - // Several groups - QStringList groupList; - groupList.append(QString::fromAscii("GROUP1")); - groupList.append(QString::fromAscii("Group2")); - groupList.append(QString::fromAscii("group3")); - mVersitProperty->setGroups(groupList); - QCOMPARE(mVersitProperty->groups(), groupList); -} - -void UT_QVersitProperty::testName() -{ - // Name in upper case - QString name(QString::fromAscii("TEL")); - mVersitProperty->setName(name); - QCOMPARE(mVersitProperty->name(), name); - - // Name in lower case, converted automatically to upper case - mVersitProperty->setName(QString::fromAscii("tel")); - QCOMPARE(mVersitProperty->name(), name); -} - -void UT_QVersitProperty::testParameters() -{ - QString typeParameterName(QString::fromAscii("TYPE")); - - QString name(QString::fromAscii("type")); - QString value1(QString::fromAscii("home")); - 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->insertParameter(name,value2); - parameters = mVersitProperty->parameters(); - QCOMPARE(parameters.count(), 2); - QVERIFY(parameters.contains(typeParameterName,QString::fromAscii("HOME"))); - QVERIFY(parameters.contains(typeParameterName,QString::fromAscii("VOICE"))); - - mVersitProperty->removeParameter(name,value1); - QCOMPARE(mVersitProperty->parameters().count(), 1); - QVERIFY(parameters.contains(typeParameterName,QString::fromAscii("HOME"))); - - mVersitProperty->removeParameter(name,value2); - 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() -{ - QString value(QString::fromAscii("050484747")); - mVersitProperty->setValue(value); - QCOMPARE(mVersitProperty->value(), value); -} - -void UT_QVersitProperty::testEmbeddedDocument() -{ - QVersitDocument document; - QVersitProperty property; - property.setName(QString::fromAscii("X-tension")); - document.addProperty(property); - mVersitProperty->setValue(QVariant::fromValue(document)); - QList embeddedDocumentProperties = - 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.h --- a/qtcontactsmobility/tests/auto/qversitproperty/ut_qversitproperty.h Fri Apr 16 14:53:18 2010 +0300 +++ /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 UT_QVERSITPROPERTY_H -#define UT_QVERSITPROPERTY_H - -#include -#include - -QTM_BEGIN_NAMESPACE - -class QVersitProperty; - -QTM_END_NAMESPACE -QTM_USE_NAMESPACE - -class UT_QVersitProperty : public QObject -{ - Q_OBJECT - -private slots: - - void init(); - void cleanup(); - -private slots: //test methods - - void testGroup(); - void testName(); - void testParameters(); - void testValue(); - void testEmbeddedDocument(); - void testEquality(); - -private: - QVersitProperty* mVersitProperty; - -}; - -#endif //UT_QVERSITPROPERTY_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitreader/qversitreader.pro --- a/qtcontactsmobility/tests/auto/qversitreader/qversitreader.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qversitreader/qversitreader.pro Mon May 03 12:24:20 2010 +0300 @@ -16,8 +16,8 @@ ../../../src/contacts/requests \ ../../../src/contacts/filters -HEADERS += ut_qversitreader.h -SOURCES += ut_qversitreader.cpp +HEADERS += tst_qversitreader.h +SOURCES += tst_qversitreader.cpp CONFIG += mobility MOBILITY = contacts versit diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitreader/tst_qversitreader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitreader/tst_qversitreader.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,1420 @@ +/**************************************************************************** +** +** 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 "tst_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 tst_QVersitReader::init() +{ + mInputDevice = new QBuffer; + mInputDevice->open(QBuffer::ReadWrite); + mReader = new QVersitReader; + mReaderPrivate = new QVersitReaderPrivate; + mSignalCatcher = new SignalCatcher; + 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 tst_QVersitReader::cleanup() +{ + delete mReaderPrivate; + delete mReader; + delete mInputDevice; + delete mSignalCatcher; +} + +void tst_QVersitReader::testDevice() +{ + // No device + QVERIFY(mReader->device() == NULL); + + // 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 tst_QVersitReader::testDefaultCodec() +{ + QVERIFY(mReader->defaultCodec() == QTextCodec::codecForName("UTF-8")); + mReader->setDefaultCodec(QTextCodec::codecForName("UTF-16BE")); + QVERIFY(mReader->defaultCodec() == QTextCodec::codecForName("UTF-16BE")); +} + +void tst_QVersitReader::testReading() +{ + // No I/O device set + QVERIFY(!mReader->startReading()); + QCOMPARE(mReader->error(), QVersitReader::IOError); + + // Device set, no data + mReader->setDevice(mInputDevice); + 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->close(); + mInputDevice->setData(oneDocument); + 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::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 = + " \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->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 = +"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\r\n"; + mInputDevice->close(); + mInputDevice->setData(validDocumentsAndGroupedDocument); + 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(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 + mInputDevice->close(); + mInputDevice->setData(twoDocuments); + mInputDevice->open(QBuffer::ReadWrite); + mInputDevice->seek(0); + mSignalCatcher->mStateChanges.clear(); + mSignalCatcher->mResultsCount = 0; + QVERIFY(mReader->startReading()); + 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 tst_QVersitReader::testResult() +{ + QCOMPARE(mReader->results().count(),0); +} + +void tst_QVersitReader::testSetVersionFromProperty() +{ + QVersitDocument document; + + // Some other property than VERSION + QVersitProperty property; + property.setName(QString::fromAscii("N")); + QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); + + // VERSION property with 2.1 + property.setName(QString::fromAscii("VERSION")); + property.setValue(QString::fromAscii("2.1")); + QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); + QVERIFY(document.type() == QVersitDocument::VCard21Type); + + // VERSION property with 3.0 + property.setValue(QString::fromAscii("3.0")); + QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); + QVERIFY(document.type() == QVersitDocument::VCard30Type); + + // VERSION property with a not supported value + property.setValue(QString::fromAscii("4.0")); + QVERIFY(!mReaderPrivate->setVersionFromProperty(document,property)); + + // VERSION property with BASE64 encoded supported value + property.setValue(QString::fromAscii(QByteArray("2.1").toBase64())); + property.insertParameter(QString::fromAscii("ENCODING"),QString::fromAscii("BASE64")); + QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); + QVERIFY(document.type() == QVersitDocument::VCard21Type); + + // VERSION property with BASE64 encoded not supported value + property.setValue(QString::fromAscii(QByteArray("4.0").toBase64())); + QVERIFY(!mReaderPrivate->setVersionFromProperty(document,property)); +} + +void tst_QVersitReader::testParseNextVersitPropertyVCard21() +{ + QVersitDocument::VersitType type = QVersitDocument::VCard21Type; + + // Test a valid vCard 2.1 with properties having separate handling: + // 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"); + // "NOTE:\;\,\:\\" + vCard.append("NOTE:\\;\\,\\:\\\\\r\n"); + // "N:foo\;bar;foo\,bar;foo\:bar;foo\\bar;foo\\\;bar" + vCard.append("N:foo\\;bar;foo\\,bar;foo\\:bar;foo\\\\bar;foo\\\\\\;bar\r\n"); + // missing structured value + vCard.append("ADR:\r\n"); + // "NICKNAMES:foo\;bar,foo\,bar,foo\:bar,foo\\bar,foo\\\,bar" + vCard.append("NICKNAMES:foo\\;bar,foo\\,bar,foo\\:bar,foo\\\\bar,foo\\\\\\,bar\r\n"); + // "CATEGORIES:foo\;bar,foo\,bar,foo\:bar,foo\\bar,foo\\\,bar" + vCard.append("CATEGORIES:foo\\;bar,foo\\,bar,foo\\:bar,foo\\\\bar,foo\\\\\\,bar\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 explicit "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, lineReader); + QCOMPARE(property.name(),QString::fromAscii("BEGIN")); + QCOMPARE(property.value(),QString::fromAscii("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(),QString::fromAscii("John")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("NOTE")); + // Do not Unescape semicolons, commas, colons and backlashes + // "\;\,\:\\" + QCOMPARE(property.value(),QString::fromAscii("\\;\\,\\:\\\\")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("N")); + QCOMPARE(property.valueType(), QVersitProperty::CompoundType); + QCOMPARE(property.variantValue().type(), QVariant::StringList); + QStringList components = property.value(); + QCOMPARE(components.size(), 5); + QCOMPARE(components.at(0), QLatin1String("foo;bar")); + QCOMPARE(components.at(1), QLatin1String("foo\\,bar")); + QCOMPARE(components.at(2), QLatin1String("foo\\:bar")); + QCOMPARE(components.at(3), QLatin1String("foo\\\\bar")); + QCOMPARE(components.at(4), QLatin1String("foo\\\\;bar")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("ADR")); + QCOMPARE(property.valueType(), QVersitProperty::CompoundType); + QCOMPARE(property.variantValue().type(), QVariant::StringList); + components = property.value(); + QCOMPARE(components.size(), 1); + QVERIFY(components.at(0).isEmpty()); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("NICKNAMES")); + QCOMPARE(property.valueType(), QVersitProperty::ListType); + QCOMPARE(property.variantValue().type(), QVariant::StringList); + components = property.value(); + QCOMPARE(components.size(), 5); + QCOMPARE(components.at(0), QLatin1String("foo\\;bar")); + QCOMPARE(components.at(1), QLatin1String("foo,bar")); + QCOMPARE(components.at(2), QLatin1String("foo\\:bar")); + QCOMPARE(components.at(3), QLatin1String("foo\\\\bar")); + QCOMPARE(components.at(4), QLatin1String("foo\\\\,bar")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("CATEGORIES")); + QCOMPARE(property.valueType(), QVersitProperty::ListType); + QCOMPARE(property.variantValue().type(), QVariant::StringList); + components = property.value(); + QCOMPARE(components.size(), 5); + QCOMPARE(components.at(0), QLatin1String("foo\\;bar")); + QCOMPARE(components.at(1), QLatin1String("foo,bar")); + QCOMPARE(components.at(2), QLatin1String("foo\\:bar")); + QCOMPARE(components.at(3), QLatin1String("foo\\\\bar")); + QCOMPARE(components.at(4), QLatin1String("foo\\\\,bar")); + + 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, lineReader); + QCOMPARE(property.name(),QString::fromAscii("PHOTO")); + // 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, 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(),QString::fromAscii("john.citizen@example.com")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("EMAIL")); + // The encoding and charset parameters 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(),QString()); + QVERIFY(property.variantValue().userType() == qMetaTypeId()); + QCOMPARE(property.value().properties().count(), 1); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("END")); + QCOMPARE(property.value(),QString::fromAscii("VCARD")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString()); + 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"); + buffer.close(); + buffer.setData(agentProperty); + buffer.open(QIODevice::ReadOnly); + LineReader agentLineReader(&buffer, mAsciiCodec); + + property = mReaderPrivate->parseNextVersitProperty(type, agentLineReader); + QVERIFY(property.isEmpty()); +} + +void tst_QVersitReader::testParseNextVersitPropertyVCard30() +{ + 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"); + // "NOTE:\;\,\:\\" + vCard.append("NOTE:\\;\\,\\:\\\\\r\n"); + // "N:foo\;bar;foo\,bar;foo\:bar;foo\\bar;foo\\\;bar" + vCard.append("N:foo\\;bar;foo\\,bar;foo\\:bar;foo\\\\bar;foo\\\\\\;bar\r\n"); + // "NICKNAMES:foo\;bar,foo\,bar,foo\:bar,foo\\bar,foo\\\,bar" + vCard.append("NICKNAMES:foo\\;bar,foo\\,bar,foo\\:bar,foo\\\\bar,foo\\\\\\,bar\r\n"); + // "CATEGORIES:foo\;bar,foo\,bar,foo\:bar,foo\\bar,foo\\\,bar" + vCard.append("CATEGORIES:foo\\;bar,foo\\,bar,foo\\:bar,foo\\\\bar,foo\\\\\\,bar\r\n"); + // "CATEGORIES:foobar\\,foobar\\\\,foo\\\\\,bar" + vCard.append("CATEGORIES:foobar\\\\,foobar\\\\\\\\,foo\\\\\\\\\\,bar\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, lineReader); + QCOMPARE(property.name(),QString::fromAscii("BEGIN")); + QCOMPARE(property.value(),QString::fromAscii("vcard")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("VERSION")); + QCOMPARE(property.value(),QString::fromAscii("3.0")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("FN")); + QCOMPARE(property.value(),QString::fromAscii("John")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("NOTE")); + QCOMPARE(property.valueType(), QVersitProperty::PlainType); + QCOMPARE(property.variantValue().type(), QVariant::String); + // Unescape semicolons, commas, colons and backlashes + QCOMPARE(property.value(), QString::fromAscii(";,:\\")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("N")); + QCOMPARE(property.valueType(), QVersitProperty::CompoundType); + QCOMPARE(property.variantValue().type(), QVariant::StringList); + QStringList components = property.value(); + QCOMPARE(components.size(), 5); + QCOMPARE(components.at(0), QLatin1String("foo;bar")); + QCOMPARE(components.at(1), QLatin1String("foo,bar")); + QCOMPARE(components.at(2), QLatin1String("foo:bar")); + QCOMPARE(components.at(3), QLatin1String("foo\\bar")); + QCOMPARE(components.at(4), QLatin1String("foo\\;bar")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("NICKNAMES")); + QCOMPARE(property.valueType(), QVersitProperty::ListType); + QCOMPARE(property.variantValue().type(), QVariant::StringList); + components = property.value(); + QCOMPARE(components.size(), 5); + QCOMPARE(components.at(0), QLatin1String("foo;bar")); + QCOMPARE(components.at(1), QLatin1String("foo,bar")); + QCOMPARE(components.at(2), QLatin1String("foo:bar")); + QCOMPARE(components.at(3), QLatin1String("foo\\bar")); + QCOMPARE(components.at(4), QLatin1String("foo\\,bar")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("CATEGORIES")); + QCOMPARE(property.valueType(), QVersitProperty::ListType); + QCOMPARE(property.variantValue().type(), QVariant::StringList); + components = property.value(); + QCOMPARE(components.size(), 5); + QCOMPARE(components.at(0), QLatin1String("foo;bar")); + QCOMPARE(components.at(1), QLatin1String("foo,bar")); + QCOMPARE(components.at(2), QLatin1String("foo:bar")); + QCOMPARE(components.at(3), QLatin1String("foo\\bar")); + QCOMPARE(components.at(4), QLatin1String("foo\\,bar")); + + // "CATEGORIES:foobar\\,foobar\\\\,foo\\\\\,bar" + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("CATEGORIES")); + QCOMPARE(property.valueType(), QVersitProperty::ListType); + QCOMPARE(property.variantValue().type(), QVariant::StringList); + components = property.value(); + QCOMPARE(components.size(), 3); + QCOMPARE(components.at(0), QLatin1String("foobar\\")); + QCOMPARE(components.at(1), QLatin1String("foobar\\\\")); + QCOMPARE(components.at(2), QLatin1String("foo\\\\,bar")); + + 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, lineReader); + QCOMPARE(property.name(),QString::fromAscii("TEL")); + QCOMPARE(property.value(),QString::fromAscii("123")); + QCOMPARE(property.parameters().count(), 2); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("PHOTO")); + 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, 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(),QString::fromAscii("john.citizen@example.com")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("AGENT")); + QVERIFY(property.variantValue().userType() == qMetaTypeId()); + QCOMPARE(property.value().properties().count(), 1); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString::fromAscii("END")); + QCOMPARE(property.value(),QString::fromAscii("VCARD")); + + property = mReaderPrivate->parseNextVersitProperty(type, lineReader); + QCOMPARE(property.name(),QString()); + 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"); + buffer.close(); + buffer.setData(agentProperty); + buffer.open(QIODevice::ReadOnly); + LineReader agentLineReader(&buffer, mAsciiCodec); + + property = mReaderPrivate->parseNextVersitProperty(type, agentLineReader); + QVERIFY(property.isEmpty()); +} + +void tst_QVersitReader::testParseVersitDocument() +{ + 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; + QCOMPARE(mReaderPrivate->parseVersitDocument(lineReader, document), expectedSuccess); + QCOMPARE(document.properties().count(), expectedProperties); + QCOMPARE(mReaderPrivate->mDocumentNestingLevel, 0); +} + +void tst_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; + + 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; + + 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; + + 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 tst_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 tst_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 tst_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 tst_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 tst_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 tst_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. + +} + +void tst_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 tst_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 tst_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 tst_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 tst_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")); + } +} + +void tst_QVersitReader::testByteArrayInput() +{ + delete mReader; + const QByteArray& oneDocument = + "BEGIN:VCARD\r\nVERSION:2.1\r\nFN:John\r\nEND:VCARD\r\n"; + + mReader = new QVersitReader(oneDocument); + QVERIFY(mReader->device() == 0); + QVERIFY(mReader->startReading()); + QVERIFY(mReader->waitForFinished()); + QList results = mReader->results(); + QCOMPARE(mReader->state(), QVersitReader::FinishedState); + QCOMPARE(mReader->error(), QVersitReader::NoError); + QCOMPARE(results.count(),1); + QVersitDocument result = results.first(); + QCOMPARE(result.type(), QVersitDocument::VCard21Type); + QList properties = result.properties(); + QCOMPARE(properties.length(), 1); + QCOMPARE(properties.first().name(), QLatin1String("FN")); + QCOMPARE(properties.first().value(), QLatin1String("John")); +} + +void tst_QVersitReader::testRemoveBackSlashEscaping() +{ + // Empty string + QString input; + QVersitReaderPrivate::removeBackSlashEscaping(input); + QCOMPARE(input,QString()); + + // Nothing to escape in the string + input = QString::fromAscii("Nothing to escape"); + QVersitReaderPrivate::removeBackSlashEscaping(input); + QCOMPARE(input,QString::fromAscii("Nothing to escape")); + + // Line break, semicolon, backslash and comma in the string + input = QString::fromAscii("These should be unescaped \\n \\N \\; \\, \\\\"); + QVersitReaderPrivate::removeBackSlashEscaping(input); + QCOMPARE(input, QString::fromAscii("These should be unescaped \r\n \r\n ; , \\")); + + // Don't remove escaping within quotes + input = QString::fromAscii("\"Quoted \\n \\N \\; \\,\""); + QVersitReaderPrivate::removeBackSlashEscaping(input); + QCOMPARE(input, QString::fromAscii("\"Quoted \\n \\N \\; \\,\"")); +} + +QTEST_MAIN(tst_QVersitReader) + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitreader/tst_qversitreader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitreader/tst_qversitreader.h Mon May 03 12:24:20 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 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 tst_QVERSITREADER_H +#define tst_QVERSITREADER_H + +#include +#include +#include +#include "qversitreader.h" + +QTM_BEGIN_NAMESPACE + +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 tst_QVersitReader : public QObject +{ + Q_OBJECT + +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_data(); + void testDecodeQuotedPrintable(); + void testParamName(); + void testParamValue(); + void testExtractPart(); + void testExtractParts(); + void testExtractPropertyGroupsAndName(); + void testExtractVCard21PropertyParams(); + void testExtractVCard30PropertyParams(); + void testExtractParams(); + void testReadLine(); + void testReadLine_data(); + void testByteArrayInput(); + void testRemoveBackSlashEscaping(); + +private: // Data + QVersitReader* mReader; + QVersitReaderPrivate* mReaderPrivate; + QBuffer* mInputDevice; + QTextCodec* mAsciiCodec; + SignalCatcher* mSignalCatcher; +}; + +#endif // tst_VERSITREADER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.cpp --- a/qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1252 +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 "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() -{ - mInputDevice = new QBuffer; - mInputDevice->open(QBuffer::ReadWrite); - mReader = new QVersitReader; - 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() -{ - delete mReaderPrivate; - delete mReader; - delete mInputDevice; - delete mSignalCatcher; -} - -void UT_QVersitReader::testDevice() -{ - // No device - QVERIFY(mReader->device() == NULL); - - // 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->startReading()); - QCOMPARE(mReader->error(), QVersitReader::IOError); - - // Device set, no data - mReader->setDevice(mInputDevice); - 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->close(); - mInputDevice->setData(oneDocument); - 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::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 = - " \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->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 = -"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\r\n"; - mInputDevice->close(); - mInputDevice->setData(validDocumentsAndGroupedDocument); - 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(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 - mInputDevice->close(); - mInputDevice->setData(twoDocuments); - mInputDevice->open(QBuffer::ReadWrite); - mInputDevice->seek(0); - mSignalCatcher->mStateChanges.clear(); - mSignalCatcher->mResultsCount = 0; - QVERIFY(mReader->startReading()); - 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->results().count(),0); -} - -void UT_QVersitReader::testSetVersionFromProperty() -{ - QVersitDocument document; - - // Some other property than VERSION - QVersitProperty property; - property.setName(QString::fromAscii("N")); - QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); - - // VERSION property with 2.1 - property.setName(QString::fromAscii("VERSION")); - property.setValue(QString::fromAscii("2.1")); - QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); - QVERIFY(document.type() == QVersitDocument::VCard21Type); - - // VERSION property with 3.0 - property.setValue(QString::fromAscii("3.0")); - QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); - QVERIFY(document.type() == QVersitDocument::VCard30Type); - - // VERSION property with a not supported value - property.setValue(QString::fromAscii("4.0")); - QVERIFY(!mReaderPrivate->setVersionFromProperty(document,property)); - - // VERSION property with BASE64 encoded supported value - property.setValue(QString::fromAscii(QByteArray("2.1").toBase64())); - property.insertParameter(QString::fromAscii("ENCODING"),QString::fromAscii("BASE64")); - QVERIFY(mReaderPrivate->setVersionFromProperty(document,property)); - QVERIFY(document.type() == QVersitDocument::VCard21Type); - - // VERSION property with BASE64 encoded not supported value - property.setValue(QString::fromAscii(QByteArray("4.0").toBase64())); - QVERIFY(!mReaderPrivate->setVersionFromProperty(document,property)); -} - -void UT_QVersitReader::testParseNextVersitPropertyVCard21() -{ - QVersitDocument::VersitType type = QVersitDocument::VCard21Type; - - // Test a valid vCard 2.1 with properties having separate handling: - // 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, lineReader); - QCOMPARE(property.name(),QString::fromAscii("BEGIN")); - QCOMPARE(property.value(),QString::fromAscii("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(),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, lineReader); - QCOMPARE(property.name(),QString::fromAscii("PHOTO")); - // 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, 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(),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(),QString()); - QVERIFY(property.variantValue().userType() == qMetaTypeId()); - QCOMPARE(property.value().properties().count(), 1); - - property = mReaderPrivate->parseNextVersitProperty(type, lineReader); - QCOMPARE(property.name(),QString::fromAscii("END")); - QCOMPARE(property.value(),QString::fromAscii("VCARD")); - - property = mReaderPrivate->parseNextVersitProperty(type, lineReader); - QCOMPARE(property.name(),QString()); - 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"); - 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::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, lineReader); - QCOMPARE(property.name(),QString::fromAscii("BEGIN")); - QCOMPARE(property.value(),QString::fromAscii("vcard")); - - property = mReaderPrivate->parseNextVersitProperty(type, lineReader); - QCOMPARE(property.name(),QString::fromAscii("VERSION")); - QCOMPARE(property.value(),QString::fromAscii("3.0")); - - property = mReaderPrivate->parseNextVersitProperty(type, lineReader); - QCOMPARE(property.name(),QString::fromAscii("FN")); - 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, lineReader); - QCOMPARE(property.name(),QString::fromAscii("TEL")); - QCOMPARE(property.value(),QString::fromAscii("123")); - QCOMPARE(property.parameters().count(), 2); - - property = mReaderPrivate->parseNextVersitProperty(type, lineReader); - QCOMPARE(property.name(),QString::fromAscii("PHOTO")); - 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, 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(),QString::fromAscii("john.citizen@example.com")); - - property = mReaderPrivate->parseNextVersitProperty(type, lineReader); - QCOMPARE(property.name(),QString::fromAscii("AGENT")); - QVERIFY(property.variantValue().userType() == qMetaTypeId()); - QCOMPARE(property.value().properties().count(), 1); - - property = mReaderPrivate->parseNextVersitProperty(type, lineReader); - QCOMPARE(property.name(),QString::fromAscii("END")); - QCOMPARE(property.value(),QString::fromAscii("VCARD")); - - property = mReaderPrivate->parseNextVersitProperty(type, lineReader); - QCOMPARE(property.name(),QString()); - 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"); - 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() -{ - 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; - 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; - - 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; - - 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; - - 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. - -} - -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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.h --- a/qtcontactsmobility/tests/auto/qversitreader/ut_qversitreader.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +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 UT_QVERSITREADER_H -#define UT_QVERSITREADER_H - -#include -#include -#include -#include "qversitreader.h" - -QTM_BEGIN_NAMESPACE - -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 - -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_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; - QTextCodec* mAsciiCodec; - SignalCatcher* mSignalCatcher; -}; - -#endif // UT_VERSITREADER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitutils/qversitutils.pro --- a/qtcontactsmobility/tests/auto/qversitutils/qversitutils.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -QT += testlib -TEMPLATE=app -TARGET=tst_versitutils -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_versitutils.h -SOURCES += ut_versitutils.cpp - -CONFIG += mobility -MOBILITY = contacts versit - -symbian: { - TARGET.CAPABILITY = ALL \ - -TCB - LIBS += -lws32 \ - -lbafl -} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.cpp --- a/qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +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 "ut_versitutils.h" -#include -#include -#include - -#include "versitutils_p.h" - -QTM_USE_NAMESPACE - -void UT_VersitUtils::testBackSlashEscape() -{ - // Empty string - QString input; - VersitUtils::backSlashEscape(input); - QCOMPARE(input,QString()); - - // Nothing to escape in the string - input = QString::fromAscii("Nothing to escape"); - VersitUtils::backSlashEscape(input); - QCOMPARE(input,QString::fromAscii("Nothing to escape")); - - // Line break in the beginning - input = QString::fromAscii("\r\n input"); - VersitUtils::backSlashEscape(input); - QCOMPARE(input,QString::fromAscii("\\n input")); - - // Line break in the end - input = QString::fromAscii("input\r\n"); - VersitUtils::backSlashEscape(input); - QCOMPARE(input,QString::fromAscii("input\\n")); - - // Semicolon in the beginning - input = QString::fromAscii(";input"); - VersitUtils::backSlashEscape(input); - QCOMPARE(input,QString::fromAscii("\\;input")); - - // Semicolon in the end - input = QString::fromAscii("input;"); - VersitUtils::backSlashEscape(input); - QCOMPARE(input,QString::fromAscii("input\\;")); - - // Comma in the beginning - input = QString::fromAscii(",input"); - VersitUtils::backSlashEscape(input); - QCOMPARE(input,QString::fromAscii("\\,input")); - - // Comma in the end - input = QString::fromAscii("input,"); - VersitUtils::backSlashEscape(input); - QCOMPARE(input,QString::fromAscii("input\\,")); - - // Backslash in the beginning - input = QString::fromAscii("\\input"); - VersitUtils::backSlashEscape(input); - QCOMPARE(input,QString::fromAscii("\\\\input")); - - // Backslash in the end - 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 = QString::fromAscii("Escape these \r\n ; , \\ "); - VersitUtils::backSlashEscape(input); - QCOMPARE(input, QString::fromAscii("Escape these \\n \\; \\, \\\\ ")); - -} - -void UT_VersitUtils::testRemoveBackSlashEscaping() -{ - // Empty string - QString input; - VersitUtils::removeBackSlashEscaping(input); - QCOMPARE(input,QString()); - - // Nothing to escape in the string - input = QString::fromAscii("Nothing to escape"); - VersitUtils::removeBackSlashEscaping(input); - QCOMPARE(input,QString::fromAscii("Nothing to escape")); - - // Line break, semicolon, backslash and comma in the string - input = QString::fromAscii("These should be unescaped \\n \\N \\; \\, \\\\"); - VersitUtils::removeBackSlashEscaping(input); - QCOMPARE(input, QString::fromAscii("These should be unescaped \r\n \r\n ; , \\")); - - // Don't remove escaping within quotes - input = QString::fromAscii("\"Quoted \\n \\N \\; \\,\""); - VersitUtils::removeBackSlashEscaping(input); - QCOMPARE(input, QString::fromAscii("\"Quoted \\n \\N \\; \\,\"")); -} - -QTEST_MAIN(UT_VersitUtils) - diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.h --- a/qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.h Fri Apr 16 14:53:18 2010 +0300 +++ /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 UT_VERSITUTILS_H -#define UT_VERSITUTILS_H - -#include -#include - -class QTextCodec; - -class UT_VersitUtils : public QObject -{ - Q_OBJECT - -private slots: - void testBackSlashEscape(); - void testRemoveBackSlashEscaping(); -}; - -#endif // UT_VERSITUTILS_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitwriter/qversitwriter.pro --- a/qtcontactsmobility/tests/auto/qversitwriter/qversitwriter.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/auto/qversitwriter/qversitwriter.pro Mon May 03 12:24:20 2010 +0300 @@ -16,8 +16,8 @@ ../../../src/contacts/requests \ ../../../src/contacts/filters -HEADERS += ut_qversitwriter.h -SOURCES += ut_qversitwriter.cpp +HEADERS += tst_qversitwriter.h +SOURCES += tst_qversitwriter.cpp CONFIG += mobility MOBILITY = contacts versit diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitwriter/tst_qversitwriter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitwriter/tst_qversitwriter.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,277 @@ +/**************************************************************************** +** +** 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 "tst_qversitwriter.h" +#include "qversitwriter.h" +#include "qversitdocument.h" +#include "qversitproperty.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 + +QTM_USE_NAMESPACE + +void tst_QVersitWriter::init() +{ + mOutputDevice = new QBuffer; + mWriter = new QVersitWriter; + mSignalCatcher = new SignalCatcher; + connect(mWriter, SIGNAL(stateChanged(QVersitWriter::State)), + mSignalCatcher, SLOT(stateChanged(QVersitWriter::State))); +} + +void tst_QVersitWriter::cleanup() +{ + delete mWriter; + delete mOutputDevice; + delete mSignalCatcher; +} + +void tst_QVersitWriter::testDevice() +{ + // No device + QVERIFY(mWriter->device() == NULL); + + // Device has been set + mWriter->setDevice(mOutputDevice); + QVERIFY(mWriter->device() == mOutputDevice); +} + +void tst_QVersitWriter::testDefaultCodec() +{ + QVERIFY(mWriter->defaultCodec() == 0); + mWriter->setDefaultCodec(QTextCodec::codecForName("UTF-16BE")); + QVERIFY(mWriter->defaultCodec() == QTextCodec::codecForName("UTF-16BE")); +} + +void tst_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); + 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 tst_QVersitWriter::testWriting21() +{ + // vCard 2.1 + QByteArray vCard21( +"BEGIN:VCARD\r\n\ +VERSION:2.1\r\n\ +FN:John\r\n\ +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::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(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 tst_QVersitWriter::testWriting30() +{ + // vCard 3.0 + QByteArray vCard30( +"BEGIN:VCARD\r\n\ +VERSION:3.0\r\n\ +FN:John\r\n\ +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); + QByteArray result(mOutputDevice->readAll()); + QCOMPARE(result, vCard30); + + // Asynchronous writing + mOutputDevice->reset(); + 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); +} + +void tst_QVersitWriter::testByteArrayOutput() +{ + const QByteArray vCard30( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "FN:John\r\n" + "END:VCARD\r\n"); + + delete mWriter; // we don't want the init()ed writer. + + QByteArray output; + mWriter = new QVersitWriter(&output); + + QVERIFY(mWriter->device() == 0); + + QVersitDocument document(QVersitDocument::VCard30Type); + QVersitProperty property; + property.setName(QString(QString::fromAscii("FN"))); + property.setValue(QString::fromAscii("John")); + document.addProperty(property); + QVERIFY(mWriter->startWriting(QList() << document)); + QVERIFY(mWriter->waitForFinished()); + QCOMPARE(output, vCard30); + +} + +QTEST_MAIN(tst_QVersitWriter) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitwriter/tst_qversitwriter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitwriter/tst_qversitwriter.h Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** 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 tst_QVERSITWRITER_H +#define tst_QVERSITWRITER_H + +#include +#include +#include +#include "qversitwriter.h" + +QTM_BEGIN_NAMESPACE + +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 tst_QVersitWriter : public QObject +{ + Q_OBJECT + +private slots: // Tests + + void init(); + void cleanup(); + + void testDevice(); + void testDefaultCodec(); + void testFold(); + void testWriting21(); + void testWriting30(); + void testByteArrayOutput(); + +private: // Data + QVersitWriter* mWriter; + QBuffer* mOutputDevice; + SignalCatcher* mSignalCatcher; +}; + +#endif // tst_QVERSITWRITER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.cpp --- a/qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,253 +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 "ut_qversitwriter.h" -#include "qversitwriter.h" -#include "qversitdocument.h" -#include "qversitproperty.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 - -QTM_USE_NAMESPACE - -void UT_QVersitWriter::init() -{ - mOutputDevice = new QBuffer; - mWriter = new QVersitWriter; - 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; - delete mSignalCatcher; -} - -void UT_QVersitWriter::testDevice() -{ - // No device - QVERIFY(mWriter->device() == NULL); - - // Device has been set - mWriter->setDevice(mOutputDevice); - QVERIFY(mWriter->device() == mOutputDevice); -} - -void UT_QVersitWriter::testDefaultCodec() -{ - QVERIFY(mWriter->defaultCodec() == 0); - mWriter->setDefaultCodec(QTextCodec::codecForName("UTF-16BE")); - QVERIFY(mWriter->defaultCodec() == QTextCodec::codecForName("UTF-16BE")); -} - -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); - 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 - QByteArray vCard21( -"BEGIN:VCARD\r\n\ -VERSION:2.1\r\n\ -FN:John\r\n\ -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::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(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 - QByteArray vCard30( -"BEGIN:VCARD\r\n\ -VERSION:3.0\r\n\ -FN:John\r\n\ -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); - QByteArray result(mOutputDevice->readAll()); - QCOMPARE(result, vCard30); - - // Asynchronous writing - mOutputDevice->reset(); - 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 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.h --- a/qtcontactsmobility/tests/auto/qversitwriter/ut_qversitwriter.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +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 UT_QVERSITWRITER_H -#define UT_QVERSITWRITER_H - -#include -#include -#include -#include "qversitwriter.h" - -QTM_BEGIN_NAMESPACE - -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 - -private slots: // Tests - - void init(); - void cleanup(); - - void testDevice(); - void testDefaultCodec(); - void testFold(); - void testWriting21(); - void testWriting30(); - -private: // Data - QVersitWriter* mWriter; - QBuffer* mOutputDevice; - SignalCatcher* mSignalCatcher; -}; - -#endif // UT_QVERSITWRITER_H diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.cpp --- a/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.cpp Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1811 +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 "ut_qtcontacts_trackerplugin.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "contactmanager.h" - -// update this when creating debian package -const QString PATH_TO_SPARQL_TESTS("./ut_qtcontacts_trackerplugin_data"); - -ut_qtcontacts_trackerplugin::ut_qtcontacts_trackerplugin() -{ - -} - -void ut_qtcontacts_trackerplugin::initTestCase() -{ - QMap trackerEngineParams; - trackerEngine = new QContactTrackerEngine(trackerEngineParams); - errorMap = new QMap(); -} - -void ut_qtcontacts_trackerplugin::testContacts() -{ - QContact c1; - QContact c2; - - trackerEngine->saveContact(&c1, error); - trackerEngine->saveContact(&c2, error); - QVERIFY2((error == QContactManager::NoError),"Saving contact"); - 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"); -} - -void ut_qtcontacts_trackerplugin::testContact() -{ - // Test invalid contact id - QContact invalidContact = trackerEngine->contact_impl( -1, error); - QVERIFY(error != QContactManager::NoError); - - // Add a contact - QContact newContact; - const QContactLocalId oldid = newContact.localId(); - QVERIFY( trackerEngine->saveContact( &newContact, error ) ); - - QContactLocalId id = newContact.localId(); - QVERIFY( id != oldid ); - - // Find the added contact - QContact c = trackerEngine->contact_impl( id, error ); - QVERIFY( c.localId() == newContact.localId() ); -} - -void ut_qtcontacts_trackerplugin::testSaveName() -{ - QContact c; - QContactLocalId initialId = c.localId(); - int detailsAdded = 0; - - QMap nameValues; - QContactName name; - nameValues.insert(QLatin1String(QContactName::FieldPrefix), "Mr"); - nameValues.insert(QLatin1String(QContactName::FieldFirst), "John"); - nameValues.insert(QLatin1String(QContactName::FieldMiddle), "Rupert"); - nameValues.insert(QLatin1String(QContactName::FieldLast), "Doe"); -// nameValues.insert(QContactName::FieldSuffix, "III"); - - foreach (QString field, nameValues.keys()) { - name.setValue(field, nameValues.value(field)); - } - c.saveDetail(&name); - - QContactNickname nick; - nick.setValue(QLatin1String(QContactNickname::FieldNickname), "Johnny"); - c.saveDetail(&nick); - - QVERIFY(c.detail().prefix() == "Mr"); - QVERIFY(c.detail().firstName() == "John"); - QVERIFY(c.detail().middleName() == "Rupert"); - QVERIFY(c.detail().lastName() == "Doe"); - QVERIFY(c.detail().nickname() == "Johnny"); - - detailsAdded++; - - trackerEngine->saveContact(&c, error); - QCOMPARE(error, QContactManager::NoError); - QVERIFY(c.localId() != initialId); - QContact contact = trackerEngine->contact_impl(c.localId(), error); - QList details = contact.details(); - QList details2 = contact.details(); - QCOMPARE(details.count(), detailsAdded); - QCOMPARE(details2.count(), detailsAdded); - // Name is unique - foreach(QString field, nameValues.keys()) { - QCOMPARE(details.at(0).value(field), nameValues.value(field)); - } - QCOMPARE(details2.at(0).value(QLatin1String(QContactNickname::FieldNickname)), QString("Johnny")); - - // Try changing the name of the saved contact. - { - QMap nameValues; - QContactName name = c.detail(); - nameValues.insert(QLatin1String(QContactName::FieldPrefix), "Mr2"); - nameValues.insert(QLatin1String(QContactName::FieldFirst), "John2"); - nameValues.insert(QLatin1String(QContactName::FieldMiddle), "Rupert2"); - nameValues.insert(QLatin1String(QContactName::FieldLast), ""); - // nameValues.insert(QContactName::FieldSuffix, "III"); - - foreach (QString field, nameValues.keys()) { - name.setValue(field, nameValues.value(field)); - } - c.saveDetail(&name); - - QContactNickname nick = c.detail(); - nick.setValue(QLatin1String(QContactNickname::FieldNickname), "Johnny2"); - c.saveDetail(&nick); - - - QVERIFY(trackerEngine->saveContact(&c, error)); - QCOMPARE(error, QContactManager::NoError); - QVERIFY(c.localId() != initialId); - - QContact contact = trackerEngine->contact_impl(c.localId(), error); - QCOMPARE(error, QContactManager::NoError); - QList details = contact.details(); - QList details2 = contact.details(); - QCOMPARE(details.count(), detailsAdded); - QCOMPARE(details2.count(), detailsAdded); - // Name is unique - foreach(QString field, nameValues.keys()) { - QCOMPARE(details.at(0).value(field), nameValues.value(field)); - } - QCOMPARE(details2.at(0).value(QLatin1String(QContactNickname::FieldNickname)), QString("Johnny2")); - - // now try to add new name detail fails - this is how currently unique fields are implemented - // so cover it in unit tests - QContactName name1; - name1.setValue(QContactName::FieldFirst, "Something that wont be stored as name is unique"); - c.saveDetail(&name1); - // validate that unique name is not saved - QVERIFY(!trackerEngine->saveContact(&c, error)); - details = contact.details(); - details2 = contact.details(); - QCOMPARE(details.count(), detailsAdded); - QCOMPARE(details2.count(), detailsAdded); - } -} - -void ut_qtcontacts_trackerplugin::testSavePhoneNumber() -{ - // use the same values for 2 contacts - for (int i = 0; i <2; i++ ) - { - QContact c; - QContactLocalId initialId = c.localId(); - int detailsAdded = 0; - QContactName name; - name.setFirstName("I have phone numbers"); - name.setLastName("Girl"); - c.saveDetail(&name); - - // key: phonenumber; value: context,subtype - QMap > phoneValues; - - phoneValues.insert("(704)486-6472", QPair(QLatin1String(QContactDetail::ContextHome), QString())); - phoneValues.insert("(765)957-1663", QPair(QLatin1String(QContactDetail::ContextHome), QString())); - phoneValues.insert("(999)888-1111", QPair(QLatin1String(QContactDetail::ContextHome), - QLatin1String(QContactPhoneNumber::SubTypeMobile))); - - phoneValues.insert("(792)123-6113", QPair(QLatin1String(QContactDetail::ContextWork), QString())); - phoneValues.insert("(918)491-7361", QPair(QLatin1String(QContactDetail::ContextWork), - 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); - } - if (!phoneValues.value(number).second.isEmpty()) { - phone.setSubTypes(phoneValues.value(number).second); - } - c.saveDetail(&phone); - detailsAdded++; - } - - trackerEngine->saveContact(&c, error); - QCOMPARE(error, QContactManager::NoError); - QVERIFY(c.localId() != initialId); - // wait for commit transaction to be done, no signals yet - for(int i = 0; i < 100; i++) - { - usleep(10000); - QCoreApplication::processEvents(); - } - - - // verify with synchronous read too - QContact contact = trackerEngine->contact_impl(c.localId(), error); - QCOMPARE(error, QContactManager::NoError); - QList details = contact.details(); - - - QCOMPARE(details.count(), detailsAdded); - - - foreach (QContactPhoneNumber detail, details) { - // Verify that the stored values and attributes are the same as given - 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], formattedPhoneValues.value(detail.number()).second); - } - - // edit one of numbers . values, context and subtypes and save again - QString editedPhoneValue = "+7044866473"; - QContactPhoneNumber phone = details[0]; - phone.setNumber(editedPhoneValue); - phone.setContexts(QContactDetail::ContextWork); - phone.setSubTypes(QContactPhoneNumber::SubTypeMobile); - c = contact; - c.saveDetail(&phone); - trackerEngine->saveContact(&c, error); - QCOMPARE(error, QContactManager::NoError); - c = this->contact(c.localId(), QStringList()<(); - QCOMPARE(details.count(), detailsAdded); - bool found = false; - foreach (QContactPhoneNumber detail, details) { - if(detail.number() == phone.number()) - { - found = true; - QVERIFY(detail.subTypes().contains(QContactPhoneNumber::SubTypeMobile)); - QVERIFY(detail.contexts().contains(QContactPhoneNumber::ContextWork)); - break; - } - } - QVERIFY(found); - } -} - -void ut_qtcontacts_trackerplugin::testPhoneNumberContext() -{ - QContact c; - QContactPhoneNumber phone; - phone.setContexts(QContactDetail::ContextHome); - phone.setNumber("555-888"); - phone.setSubTypes(QContactPhoneNumber::SubTypeMobile); - c.saveDetail(&phone); - QContact contactToSave = c; - // Let's do this all twice, first time save new detail, and next iteration change the context - for (int iterations = 0; iterations < 2; iterations++) { - QVERIFY(trackerEngine->saveContact(&contactToSave, error)); - // wait for commit transaction to be done, no signals yet - for(int i = 0; i < 100; i++) { - usleep(10000); - QCoreApplication::processEvents(); - } - - QContactFetchRequest request; - QContactLocalIdFilter filter; - QList ids; - ids.append(contactToSave.localId()); - filter.setIds(ids); - request.setFilter(filter); - - QStringList details; - details << QContactPhoneNumber::DefinitionName; - request.setDefinitionRestrictions(details); - - Slots slot; - QObject::connect(&request, SIGNAL(progress(QContactFetchRequest*, bool)), - &slot, SLOT(progress(QContactFetchRequest*, bool ))); - - trackerEngine->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(!slot.contacts.isEmpty()); - - QContact contactToTest; - foreach (QContact savedContact, slot.contacts) { - if (savedContact.localId() == contactToSave.localId()) { - contactToTest = savedContact; - } - } - QVERIFY(contactToTest.localId() == contactToSave.localId()); // Just to be sure we got the saved contact - qDebug()<().count(); - - QVERIFY(contactToTest.details().count() == 1); - if (0 == iterations) { - // perform context change - QContactPhoneNumber phoneToEdit = contactToTest.detail(); - phoneToEdit.setContexts(QContactDetail::ContextWork); - contactToTest.saveDetail(&phoneToEdit); - contactToSave = contactToTest; - } - QVERIFY(contactToTest.details().count() == 1); - } -} - -void ut_qtcontacts_trackerplugin::testWritingOnlyWorkMobile() -{ - QContact c; - QContactPhoneNumber phone; - phone.setContexts(QContactDetail::ContextWork); - phone.setNumber("555999"); - phone.setSubTypes(QContactPhoneNumber::SubTypeMobile); - c.saveDetail(&phone); - QContact& contactToSave = c; - QVERIFY(trackerEngine->saveContact(&contactToSave, error)); - // wait for commit transaction to be done, no signals yet - for(int i = 0; i < 100; i++) { - usleep(10000); - QCoreApplication::processEvents(); - } - - QContactFetchRequest request; - QContactLocalIdFilter filter; - QList ids; - ids.append(contactToSave.localId()); - filter.setIds(ids); - request.setFilter(filter); - QStringList details; - details << QContactPhoneNumber::DefinitionName; - request.setDefinitionRestrictions(details); - - Slots slot; - QObject::connect(&request, SIGNAL(progress(QContactFetchRequest*, bool)), - &slot, SLOT(progress(QContactFetchRequest*, bool ))); - - trackerEngine->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(!slot.contacts.isEmpty()); - - QContact contactToTest; - foreach (QContact savedContact, slot.contacts) { - if (savedContact.localId() == c.localId()) { - contactToTest = savedContact; - } - } - QVERIFY(contactToTest.localId() == c.localId()); // Just to be sure we got the saved contact - QVERIFY(contactToTest.details().count() == 1); - QVERIFY(contactToTest.detail().number() == phone.number()); - QVERIFY(contactToTest.detail().subTypes() == phone.subTypes()); - QVERIFY(contactToTest.detail().contexts() == phone.contexts()); -} - -void ut_qtcontacts_trackerplugin::testSaveAddress() -{ - QContact c; - QContactName name; - name.setFirstName("Aruba & Barbados"); - name.setLastName("Girl"); - c.saveDetail(&name); - QContactLocalId initialId = c.localId(); - int detailsAdded = 0; - - // List of pairs of field-value map and context - typedef QMap typeAddress; - typedef QPair typeAddressWithContext; - QList addressValues; - - // TODO check status of 137174 and other libqttracker1pre6 bugs before refactoring - typeAddress values; - values.insert(QLatin1String(QContactAddress::FieldCountry), "Barbados"); - values.insert(QLatin1String(QContactAddress::FieldPostcode), "55555"); - values.insert(QLatin1String(QContactAddress::FieldStreet), "Martindales Rd"); - values.insert(QLatin1String(QContactAddress::FieldRegion), "Bridgetown"); - addressValues.append(typeAddressWithContext(values, QLatin1String(QContactDetail::ContextHome))); - values.clear(); - values.insert(QLatin1String(QContactAddress::FieldCountry), "Aruba"); - values.insert(QLatin1String(QContactAddress::FieldPostcode), "44444"); - values.insert(QLatin1String(QContactAddress::FieldStreet), "Brazilie Straat"); - values.insert(QLatin1String(QContactAddress::FieldRegion), "Oranjestad"); - addressValues.append(typeAddressWithContext(values, QLatin1String(QContactDetail::ContextHome))); - values.clear(); - values.insert(QLatin1String(QContactAddress::FieldCountry), "ArubaWork"); - values.insert(QLatin1String(QContactAddress::FieldPostcode), "44445"); - values.insert(QLatin1String(QContactAddress::FieldStreet), "Sunset Blvd"); - values.insert(QLatin1String(QContactAddress::FieldRegion), "Oranjestad"); - addressValues.append(typeAddressWithContext(values, QLatin1String(QContactDetail::ContextHome))); - foreach (typeAddressWithContext addressWithContext, addressValues) { - QContactAddress address; - foreach (QString field, addressWithContext.first.keys()) { - address.setValue(field, addressWithContext.first.value(field)); - } - address.setContexts(addressWithContext.second); - c.saveDetail(&address); - detailsAdded++; - } - - trackerEngine->saveContact(&c, error); - QCOMPARE(error, QContactManager::NoError); - QVERIFY(c.localId() != initialId); - QContact contact = trackerEngine->contact_impl(c.localId(), error); - QList details = contact.details(); - QCOMPARE(details.count(), detailsAdded); - bool found = false; - // Test if inserted values are found in some of the details - foreach (typeAddressWithContext addressWithContext, addressValues) { - foreach (QContactAddress detail, details) { - foreach (QString field, addressWithContext.first.keys()) { - found = (detail.value(field) == addressWithContext.first.value(field)); - if (!found) - break; - } - if (found) - break; - } - QVERIFY2(found, "Inserted detail was not found in the fetched details"); - } -} - -void ut_qtcontacts_trackerplugin::testSaveEmailAddress() -{ - QContact c; - QContactLocalId initialId = c.localId(); - int detailsAdded = 0; - - QMap values; - values.insert("john.does@hotmail.com", QContactDetail::ContextHome); - values.insert("john.doe@gmail.com", QContactDetail::ContextWork); - values.insert("john.doe@nokia.com", QContactDetail::ContextWork); - values.insert("john.doe@johndoe.com", QContactDetail::ContextHome); - foreach(QString address, values.keys()) { - QContactEmailAddress emailAddress; - emailAddress.setEmailAddress(address); - emailAddress.setContexts(values.value(address)); - c.saveDetail(&emailAddress); - detailsAdded++; - } - QContactName name; - name.setFirstName("Jo"); - name.setLastName("H N Doe"); - c.saveDetail(&name); - trackerEngine->saveContact(&c, error); - QCOMPARE(error, QContactManager::NoError); - QVERIFY(c.localId() != initialId); - QContact contact = trackerEngine->contact_impl(c.localId(), error); - QList details = contact.details(); - QCOMPARE(details.count(), detailsAdded); - foreach (QContactEmailAddress detail, details) { - QString address = detail.value(QContactEmailAddress::FieldEmailAddress); - QVERIFY(values.contains(address)); - QCOMPARE(detail.contexts()[0], values.value(address)); - } -} - -void ut_qtcontacts_trackerplugin::testRemoveContact() -{ - QContact c; - QContactPhoneNumber phone; - phone.setNumber("+358501234567"); - c.saveDetail(&phone); - QContactEmailAddress email; - email.setEmailAddress("super.man@hotmail.com"); - c.saveDetail(&email); - QContactName name; - name.setFirstName("Super"); - name.setLastName("Man"); - c.saveDetail(&name); - - QVERIFY2(trackerEngine->saveContact(&c, error) && error == QContactManager::NoError, "Saving a contact failed"); - QVERIFY2(trackerEngine->removeContact(c.localId(), error), "Removing a contact failed"); - QCOMPARE(error, QContactManager::NoError); - QVERIFY2(trackerEngine->contact_impl(c.localId(), error) == QContact(), "Found a contact, which should have been removed"); -} - -void ut_qtcontacts_trackerplugin::testSaveContacts() -{ - QList contacts; - for (int i = 0; i < 3; i++) { - QContact c; - QContactName name; - name.setFirstName("John"); - name.setLastName(QString::number(i,10)); - c.saveDetail(&name); - contacts.append(c); - } - - 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).lastName(), - QString("%1").arg(QString::number(i,10))); - } -} - -void ut_qtcontacts_trackerplugin::testRemoveContacts() -{ - QList addedIds; - for (int i = 0; i < 5; i++) { - QContact c; - QContactName name; - 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()); - } - QList toApiRemove; - toApiRemove.append(addedIds.takeLast()); - toApiRemove.append(addedIds.takeLast()); - QList toPluginRemove(addedIds); - // Remove all, but last of the added contacts - 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); - - 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 - 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"); - } -} - -void ut_qtcontacts_trackerplugin::testAvatar() -{ - QContact contactWithAvatar; - QContactAvatar avatar; - - avatar.setAvatar("file:///home/user/.contacts/avatars/default_avatar.png"); - contactWithAvatar.saveDetail(&avatar); - QContactName name; - name.setFirstName("John");name.setLastName("A Frog"); - contactWithAvatar.saveDetail(&name); - QVERIFY(trackerEngine->saveContact( &contactWithAvatar, error)); - - QContact c = trackerEngine->contact_impl( contactWithAvatar.localId(), error); - QList avatars = c.details(); - QVERIFY( avatars.size() ); - QCOMPARE( avatars[0].avatar(), avatar.avatar() ); -} - -void ut_qtcontacts_trackerplugin::testUrl() -{ - - //Context home, homepage url - QContact contactWithUrl1; - QContactUrl url1; - url1.setUrl("http://home.homepage"); - url1.setContexts(QContactDetail::ContextHome); - url1.setSubType(QContactUrl::SubTypeHomePage); - QContactName name; - name.setFirstName("John");name.setLastName("TestUrl1"); - contactWithUrl1.saveDetail(&name); - contactWithUrl1.saveDetail(&url1); - QVERIFY(trackerEngine->saveContact(&contactWithUrl1, error)); - - //Context work, homepage url - QContact contactWithUrl2; - QContactUrl url2; - url2.setUrl("http://work.homepage"); - url2.setContexts(QContactDetail::ContextWork); - url2.setSubType(QContactUrl::SubTypeHomePage); - QContactName name2; - name2.setLastName("TestUrl2"); - contactWithUrl2.saveDetail(&name2); - contactWithUrl2.saveDetail(&url2); - QVERIFY(trackerEngine->saveContact(&contactWithUrl2, error)); - - //Context home, favourite url - QContact contactWithUrl3; - QContactUrl url3; - url3.setUrl("http://home.favourite"); - url3.setContexts(QContactDetail::ContextHome); - url3.setSubType(QContactUrl::SubTypeFavourite); - - name2.setLastName("TestUrl3"); - contactWithUrl3.saveDetail(&name2); - contactWithUrl3.saveDetail(&url3); - QVERIFY(trackerEngine->saveContact(&contactWithUrl3, error)); - - - QContactLocalId id1 = contactWithUrl1.localId(); - QContactLocalId id2 = contactWithUrl2.localId(); - QContactLocalId id3 = contactWithUrl3.localId(); - QCOMPARE(trackerEngine->contact_impl(id1, error).detail().url(), QString("http://home.homepage")); - QCOMPARE(trackerEngine->contact_impl(id2, error).detail().url(), QString("http://work.homepage")); - QCOMPARE(trackerEngine->contact_impl(id3, error).detail().url(), QString("http://home.favourite")); - - QVERIFY(trackerEngine->contact_impl(id1, error).detail().contexts()[0] == - QContactDetail::ContextHome ); - QVERIFY(trackerEngine->contact_impl(id2, error).detail().contexts()[0] == - QContactDetail::ContextWork ); - QVERIFY(trackerEngine->contact_impl(id3, error).detail().contexts()[0] == - QContactDetail::ContextHome ); - - QVERIFY(trackerEngine->contact_impl(id1, error).detail().subType() == - QContactUrl::SubTypeHomePage ); - QVERIFY(trackerEngine->contact_impl(id2, error).detail().subType() == - QContactUrl::SubTypeHomePage ); - QVERIFY(trackerEngine->contact_impl(id3, error).detail().subType() == - QContactUrl::SubTypeFavourite ); - -} - -/* -void ut_qtcontacts_trackerplugin::testGroups() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} - -void ut_qtcontacts_trackerplugin::testGroup() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} - -void ut_qtcontacts_trackerplugin::testSaveGroup() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} - -void ut_qtcontacts_trackerplugin::testRemoveGroup() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} - -void ut_qtcontacts_trackerplugin::testDetailDefinitions() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} - -void ut_qtcontacts_trackerplugin::testDetailDefinition() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} - -void ut_qtcontacts_trackerplugin::testSaveDetailDefinition() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} - -void ut_qtcontacts_trackerplugin::testRemoveDetailDefinition() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} -*/ - -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.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()); - } -} - -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()); - } - - // now one asynchronous request to read all the - QContactFetchRequest request; - QContactChangeLogFilter filter(QContactChangeLogFilter::EventAdded); - filter.setSince(start); - request.setFilter(filter); - - // here You specify which details are of interest - QStringList details; - details << QContactAvatar::DefinitionName - << QContactBirthday::DefinitionName - << QContactAddress::DefinitionName - << QContactEmailAddress::DefinitionName - << QContactDisplayLabel::DefinitionName - << QContactGender::DefinitionName - << QContactAnniversary::DefinitionName - << QContactName::DefinitionName - << QContactOnlineAccount::DefinitionName - << QContactOrganization::DefinitionName - << QContactPhoneNumber::DefinitionName; - request.setDefinitionRestrictions(details); - - Slots slot; - QObject::connect(&request, SIGNAL(progress(QContactFetchRequest*, bool)), - &slot, SLOT(progress(QContactFetchRequest*, bool ))); - - // start. clients should, instead of following use - // request.setManager(trackermanagerinstance); - // request.start(); - trackerEngine->startRequest(&request); - trackerEngine->waitForRequestFinished(&request, 10000); - // if it takes more, then something is wrong - QVERIFY(request.isFinished()); - QCOMPARE(slot.contacts.count(), addedIds.count()); - - foreach(QContact cont, slot.contacts) { - QVERIFY2(addedIds.contains(cont.localId()), "One of the added contacts was not reported as added"); - } - - QContactLocalIdFetchRequest idreq; - filter.setSince(start); - idreq.setFilter(filter); - - Slots slot2; - QObject::connect(&idreq, SIGNAL(progress(QContactLocalIdFetchRequest*, bool)), - &slot2, SLOT(progress(QContactLocalIdFetchRequest*, bool ))); - trackerEngine->startRequest(&idreq); - trackerEngine->waitForRequestFinished(&idreq, 10000); - QVERIFY(idreq.isFinished()); - QCOMPARE(slot2.ids.count(), addedIds.count()); - foreach(QContactLocalId id, slot2.ids) { - QVERIFY2(addedIds.contains(id), "One of the added contacts was not reported as added"); - } - -} - -void ut_qtcontacts_trackerplugin::testContactsModifiedSince() -{ - QDateTime start; - QList addedIds; - QList modified; - - const int contactsToAdd = 5; - const int contactsToModify = 3; - QVERIFY2(contactsToAdd >= contactsToModify, "Cannot modify more contacts than this test has added"); - QVERIFY2(contactsToModify+1 <= contactsToAdd, "Cannot modify more contacts than this test has added"); - - // Add contacts with only first name and store them to list of added - for (int i = 0; i < contactsToAdd; 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"); - addedIds.append(c.localId()); - } - - QTest::qWait(2000); - start = QDateTime::currentDateTime(); - - // Modify and save rest of the contacts - for (int i = 0; i < contactsToModify; i++) { - QContact c = trackerEngine->contact_impl(addedIds[i], error); - QContactName name = c.detail(); - // Modify name - 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()); - } - // Set filter - QContactChangeLogFilter filter(QContactChangeLogFilter::EventChanged); - filter.setSince(start); - - QContactLocalIdFetchRequest idfetch; - QContactFetchRequest fetch; - idfetch.setFilter(filter); - fetch.setFilter(filter); - trackerEngine->startRequest(&idfetch); - trackerEngine->waitForRequestFinished(&idfetch, 10000); - QVERIFY2(idfetch.isFinished(), "Id fetch request did not finish on time"); - QVERIFY2(idfetch.error() == QContactManager::NoError, "Id fetch request finished with errors"); - QList actuallyModifiedIds = idfetch.ids(); - trackerEngine->startRequest(&fetch); - trackerEngine->waitForRequestFinished(&fetch, 10000); - QVERIFY2(fetch.isFinished(), "Fetch request did not finish on time"); - QVERIFY2(fetch.error() == QContactManager::NoError, "Fetch request finished with errors"); - QList actuallyModified = fetch.contacts(); - - // Num of actually modified should be same as supposedly modified - QCOMPARE(actuallyModifiedIds.count(), modified.count()); - QCOMPARE(actuallyModified.count(), modified.count()); - // All the ids of the modified contacts should be found in the result list - foreach (QContactLocalId id, modified) { - QVERIFY2(actuallyModifiedIds.contains(id), "One the modified contacts was not reported as modified"); - } -} - -void ut_qtcontacts_trackerplugin::testContactsRemovedSince() -{ - QDateTime start = QDateTime::currentDateTime(); - QContactChangeLogFilter filter(QContactChangeLogFilter::EventRemoved); - filter.setSince(start); - QList sorts; - QList actuallyRemoved = trackerEngine->contactIds(filter, sorts, error); - QVERIFY(actuallyRemoved.isEmpty()); - QVERIFY(error == QContactManager::NotSupportedError); -} -/* -void ut_qtcontacts_trackerplugin::testGroupsAddedSince() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} - -void ut_qtcontacts_trackerplugin::testGroupsModifiedSince() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} - -void ut_qtcontacts_trackerplugin::testGroupsRemovedSince() -{ - qDebug() << "Not implemented"; - QVERIFY(false); -} -*/ - -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() -{ - using namespace SopranoLive; - - QList ids; - RDFVariable RDFContact = RDFVariable::fromType(); - RDFSelect query; - - query.addColumn("contact_uri", RDFContact); - query.addColumn("contactId", RDFContact.property()); - LiveNodes ncoContacts = ::tracker()->modelQuery(query); - foreach( Live p, ncoContacts ) { - QVERIFY(p.hasType()); - QVERIFY(p.hasType()); - QVERIFY(p.hasType()); - } -} - -void ut_qtcontacts_trackerplugin::testAsyncReadContacts() -{ - addedContacts.clear(); - // Add at least one contact to be sure that this doesn't fail because tracker is clean - - 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 - - Slots slot; - QContactFetchRequest request; - QList sorting; - QContactSortOrder sort, sort1; - sort.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldLast); - sort1.setDetailDefinitionName(QContactName::DefinitionName, QContactName::FieldFirst); - sorting << sort << sort1; - QStringList details; details << QContactName::DefinitionName << QContactAvatar::DefinitionName; - request.setDefinitionRestrictions(details); - request.setSorting(sorting); - request.setFilter(filter); - - QObject::connect(&request, SIGNAL(progress(QContactFetchRequest*, bool)), - &slot, SLOT(progress(QContactFetchRequest*, bool ))); - - // this one only ids - QContactLocalIdFetchRequest request1; - request1.setFilter(filter); - QObject::connect(&request1, SIGNAL(progress(QContactLocalIdFetchRequest*, bool)), - &slot, SLOT(progress(QContactLocalIdFetchRequest*, bool ))); - - // the purpose is to compare if all contacts are loaded, and - // if optional fields are defined properly in request - - // start both at once - trackerEngine->startRequest(&request); - trackerEngine->startRequest(&request1); - trackerEngine->waitForRequestFinished(&request, 10000); - trackerEngine->waitForRequestFinished(&request1, 10000); - - - // if it takes more, then something is wrong - QVERIFY(request.isFinished()); - QVERIFY(request1.isFinished()); - - // there need1 to be something added to be verified - QVERIFY(!request.contacts().isEmpty()); - // now ask for one contact - QVERIFY(!slot.contacts.isEmpty()); - // there need to be something added to be verified - QVERIFY(!request1.ids().isEmpty()); - // now ask for one contact - QVERIFY(!slot.ids.isEmpty()); - - 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]; - QString last0 = contact.detail().lastName(); - QString first0 = contact.detail().firstName(); - QString last1 = contact1.detail().lastName(); - QString first1 = contact1.detail().firstName(); - // sorting - 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."); - } - -} - -void ut_qtcontacts_trackerplugin::testFilterContacts() -{ - // this one will get complete contacts - QContact c; - QContactName name; - 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; - details << QContactName::DefinitionName << QContactAvatar::DefinitionName - << QContactPhoneNumber::DefinitionName; - - QContactFetchRequest request; - QContactDetailFilter filter; - filter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldNumber); - - Slots slot; - QObject::connect(&request, SIGNAL(progress(QContactFetchRequest*, bool)), - &slot, SLOT(progress(QContactFetchRequest*, bool ))); - filter.setValue(QString("4872444")); - filter.setMatchFlags(QContactFilter::MatchEndsWith); - - request.setDefinitionRestrictions(details); - request.setFilter(filter); - - trackerEngine->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(!slot.contacts.isEmpty()); - - bool containsThisId = false; - foreach(const QContact &contact, slot.contacts) - { - if( contact.localId() == c.localId()) - containsThisId = true; - bool containsPhone = false; - foreach(const QContactDetail &detail, contact.details(QContactPhoneNumber::DefinitionName)) - { - if(detail.value(QContactPhoneNumber::FieldNumber).contains("4872444")) - { - containsPhone = true; - break; - } - } - 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() -{ - QSettings settings(QSettings::IniFormat, QSettings::UserScope, "Nokia", "Trackerplugin"); - QString restoreValue = settings.value("phoneNumberMatchDigitCount", "7").toString(); - - QContact matchingContact; - QContactName name; - name.setFirstName("Zuba"); - name.setLastName("Zub"); - matchingContact.saveDetail(&name); - QContactPhoneNumber phone; - // TODO doesnt work yet phone.setContexts(QContactPhoneNumber::ContextWork); - phone.setNumber("3210987654321"); - matchingContact.saveDetail(&phone); - trackerEngine->saveContact(&matchingContact, error); - - QStringList details; - details << QContactName::DefinitionName << QContactAvatar::DefinitionName - << QContactPhoneNumber::DefinitionName; - - QContactFetchRequest request; - QContactDetailFilter filter; - filter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldNumber); - - Slots slot; - QObject::connect(&request, SIGNAL(progress(QContactFetchRequest*, bool)), - &slot, SLOT(progress(QContactFetchRequest*, bool ))); - - { - // test matching of 7 last digits - int matchCount = 7; - qDebug() << "Test matching of" << matchCount << "last digits."; - settings.setValue("phoneNumberMatchDigitCount", matchCount); - QString matchValue = "3000007654321"; - QContact nonMatchingContact; - nonMatchingContact.saveDetail(&name); - phone.setNumber("3210980654321"); - nonMatchingContact.saveDetail(&phone); - trackerEngine->saveContact(&nonMatchingContact, error); - - filter.setValue(matchValue); - filter.setMatchFlags(QContactFilter::MatchEndsWith); - - request.setDefinitionRestrictions(details); - request.setFilter(filter); - - trackerEngine->startRequest(&request); - - for(int i = 0; i < 100; i++) { - usleep(100000); - QCoreApplication::processEvents(); - if (request.isFinished()) - break; - } - QVERIFY(request.isFinished()); - QVERIFY(!slot.contacts.isEmpty()); - - bool containsMatchingId = false; - bool containsNonMatchingId = false; - foreach(const QContact &contact, slot.contacts) { - if (contact.localId() == nonMatchingContact.localId()) - containsNonMatchingId = true; - if (contact.localId() == matchingContact.localId()) - containsMatchingId = true; - bool containsPhone = false; - foreach(const QContactDetail &detail, contact.details(QContactPhoneNumber::DefinitionName)) { - if (detail.value(QContactPhoneNumber::FieldNumber).endsWith(matchValue.right(matchCount))) { - containsPhone = true; - break; - } - } - QVERIFY(containsPhone); - } - QVERIFY(containsMatchingId); - QVERIFY(!containsNonMatchingId); - } - - { - // test matching of 11 last digits - int matchCount = 11; - qDebug() << "Test matching of" << matchCount << "last digits."; - settings.setValue("phoneNumberMatchDigitCount", matchCount); - QString matchValue = "3010987654321"; - QContact nonMatchingContact; - nonMatchingContact.saveDetail(&name); - phone.setNumber("3200987654321"); - nonMatchingContact.saveDetail(&phone); - trackerEngine->saveContact(&nonMatchingContact, error); - - QContact matchingContactWithShorterNumber; - QContactName name1; - name1.setFirstName("ShortNumber"); - name1.setLastName("Zub1"); - matchingContactWithShorterNumber.saveDetail(&name1); - QContactPhoneNumber phone1; - phone1.setNumber("54321"); - matchingContactWithShorterNumber.saveDetail(&phone1); - trackerEngine->saveContact(&matchingContactWithShorterNumber, error); - QVERIFY(QContactManager::NoError == error); - - - filter.setValue(matchValue); - filter.setMatchFlags(QContactFilter::MatchEndsWith); - - request.setDefinitionRestrictions(details); - request.setFilter(filter); - - trackerEngine->startRequest(&request); - - for(int i = 0; i < 100; i++) { - usleep(100000); - QCoreApplication::processEvents(); - if (request.isFinished()) - break; - } - QVERIFY(request.isFinished()); - QVERIFY(!slot.contacts.isEmpty()); - - bool containsMatchingId = false; - bool containsNonMatchingId = false; - foreach(const QContact &contact, slot.contacts) { - if (contact.localId() == nonMatchingContact.localId()) - containsNonMatchingId = true; - if (contact.localId() == matchingContact.localId()) - containsMatchingId = true; - bool containsPhone = false; - foreach(const QContactDetail &detail, contact.details(QContactPhoneNumber::DefinitionName)) { - if (detail.value(QContactPhoneNumber::FieldNumber).endsWith(matchValue.right(matchCount))) { - containsPhone = true; - break; - } - } - QVERIFY(containsPhone); - } - QVERIFY(containsMatchingId); - QVERIFY(!containsNonMatchingId); - - // now verify with short number - filter.setValue("54321"); - filter.setMatchFlags(QContactFilter::MatchEndsWith); - - request.setDefinitionRestrictions(details); - request.setFilter(filter); - - trackerEngine->startRequest(&request); - - for(int i = 0; i < 100; i++) { - usleep(100000); - QCoreApplication::processEvents(); - if (request.isFinished()) - break; - } - QVERIFY(request.isFinished()); - QVERIFY(!slot.contacts.isEmpty()); - bool containsShort = false; - foreach(const QContact &contact, slot.contacts) { - if (contact.localId() == matchingContactWithShorterNumber.localId()) - containsShort = true; - } - QVERIFY(containsShort); - } - 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"; - QContactLocalId id = url2UniqueId( uri ); - QCOMPARE( (int)id, 1234567 ); -} - -void ut_qtcontacts_trackerplugin::testQRelationshipAndMetacontacts() -{ - QContact firstContact; - QContactName name; - name.setFirstName("FirstMeta"); - firstContact.saveDetail(&name); - QVERIFY(trackerEngine->saveContact(&firstContact, error)); - - QList secondIds; - QStringList names(QStringList()<<"SecondMeta"<<"ThirdMeta"); - foreach (QString firstname, names) - { - QContact secondContact; - QContactName name1; - name1.setFirstName(firstname); - secondContact.saveDetail(&name1); - QVERIFY(trackerEngine->saveContact(&secondContact, error)); - secondIds<()<startRequest(&req)); - trackerEngine->waitForRequestFinished(&req, 10000); - // if it takes more, then something is wrong - QVERIFY(req.isFinished()); - QVERIFY(QContactManager::NoError == req.error()); - } - - QContactRelationshipFetchRequest req1; - req1.setFirst(firstContact.id()); - QVERIFY(trackerEngine->startRequest(&req1)); - trackerEngine->waitForRequestFinished(&req1, 10000); - // if it takes more, then something is wrong - QVERIFY(req1.isFinished()); - QVERIFY(QContactManager::NoError == req1.error()); - QVERIFY(2 == req1.relationships().size()); - foreach(QContactRelationship r, req1.relationships()) - { - QVERIFY(secondIds.removeOne(r.second().localId())); - } -} - -void ut_qtcontacts_trackerplugin::insertContact(const QString& URI, QContactLocalId uid, QString imId, QString imStatus, QString accountPath, QString protocol ) -{ - QProcess inserter; - QStringList args; - args << URI << QString::number(uid) << imId << accountPath << imStatus << "In Helsinki" << protocol << "Some" << "Guy"; - inserter.start( PATH_TO_SPARQL_TESTS+"/insertTpContact.sparql", args ); - inserter.waitForFinished(); -} - -void ut_qtcontacts_trackerplugin::updateIMContactStatus(const QString& uri, QString imStatus) -{ - QProcess inserter; - QStringList args; - args << uri << imStatus; - inserter.start( PATH_TO_SPARQL_TESTS+"/updateTpStatus.sparql", args ); - inserter.waitForFinished(); -} - -void ut_qtcontacts_trackerplugin::testIMContactsAndMetacontactMasterPresence() -{ - if( !QFileInfo(PATH_TO_SPARQL_TESTS).exists() ) - { - qWarning()< idstoremove; - QContactLocalId masterContactId; // using one master contact later for additional testing - for( int i = 0; i < 2; i++ ) - { - unsigned int contactid = qHash(QString("/org/freedesktop/fake/account/") + QString::number(999998+i) + "@ovi.com"); - idstoremove << contactid; - 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.setFirstName("FirstMetaWithIM"+QString::number(contactid)); - firstContact.saveDetail(&name); - QVERIFY(trackerEngine->saveContact(&firstContact, error)); - - // save metarelationship - QContactRelationship rel; - rel.setRelationshipType(QContactRelationship::Is); - rel.setFirst(firstContact.id()); - idstoremove << firstContact.localId(); - masterContactId = firstContact.localId(); - rel.setSecond(c.id()); - QContactRelationshipSaveRequest req; - req.setRelationships(QList()<startRequest(&req)); - trackerEngine->waitForRequestFinished(&req, 1000); - QVERIFY(req.isFinished()); - QVERIFY(QContactManager::NoError == req.error()); - } - - // expected behavior - for now - is that master contact contains details from - // IMContacts - that way we don't have to use QContactRelationships to fetch - // all contacts in master contact in order to calculate master presence - { - QList cons = contacts(QList () - << 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); - - bool containDetail = false; - foreach(QContactOnlineAccount det, cons[0].details()) - { - if (det.value("Account") == "999999@ovi.com" // deprecated, going to account URI - || det.accountUri() == "999999@ovi.com") - { - QVERIFY(det.presence() == QContactOnlineAccount::PresenceAvailable); - // keeping the reference to tp contact - 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(QString("telepathy://org/freedesktop/fake/account/") + QString::number(999999) + "@ovi.com", "nco:presence-status-offline"); - { - QList cons = contacts(QList () - << 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); - - bool containDetail = false; - foreach(QContactOnlineAccount det, cons[0].details()) - { - if (det.value("Account") == "999999@ovi.com" // deprecated, going to account URI - || det.accountUri() == "999999@ovi.com") - { - QVERIFY(det.presence() == QContactOnlineAccount::PresenceOffline); - // keeping the reference to tp contact - QVERIFY(det.value("QContactLocalId") == QString::number(qHash(QString("/org/freedesktop/fake/account/") + QString::number(999999) + "@ovi.com"))); - containDetail = true; - } - } - QVERIFY(containDetail); - } - - // TODO load only one contact should load also content from other in the same metacontacts - { - QList cons = contacts(QList () - << masterContactId, QStringList() - << QContactOnlineAccount::DefinitionName); - QVERIFY(cons.size() == 1); - QVERIFY(cons[0].id().localId() == masterContactId); - - bool containDetail = false; - foreach(QContactOnlineAccount det, cons[0].details()) - { - if (det.value("Account") == "999999@ovi.com" // deprecated, going to account URI - || det.accountUri() == "999999@ovi.com") - { - QVERIFY(det.presence() == QContactOnlineAccount::PresenceOffline); - // keeping the reference to tp contact - QVERIFY(det.value("QContactLocalId") == QString::number(qHash(QString("/org/freedesktop/fake/account/") + QString::number(999999) + "@ovi.com"))); - containDetail = true; - } - } - QVERIFY(containDetail); - } - - // remove them - foreach(unsigned int id, idstoremove) - { - QVERIFY2(trackerEngine->removeContact(id, error), "Removing a contact failed"); - } -} - -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->state() == QContactAbstractRequest::FinishedState ) - { - ids << self->ids(); - } -} - -void Slots::progress(QContactFetchRequest* self, bool appendOnly) -{ - Q_UNUSED(appendOnly) - contacts = self->contacts(); - QList idsFromAllContactReq; - foreach( QContact contact, contacts) - { - idsFromAllContactReq << contact.localId(); - } -} - -QString Slots::requestStatusToString(QContactAbstractRequest::Status status) -{ - switch (status) { - case QContactAbstractRequest::Inactive: - return "Inactive"; - case QContactAbstractRequest::Active: - return "Active"; - case QContactAbstractRequest::Cancelling: - return "Cancelling"; - case QContactAbstractRequest::Cancelled: - return "Cancelled"; - case QContactAbstractRequest::Finished: - return "Finished"; - default: - return QString::number((int)status); - } -} - -QTEST_MAIN(ut_qtcontacts_trackerplugin) diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.h --- a/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.h Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +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 UT_QTCONTACTS_TRACKERPLUGIN_H -#define UT_QTCONTACTS_TRACKERPLUGIN_H - -#include -#include -#include -#include - -QTM_BEGIN_NAMESPACE -class QContactLocalIdFetchRequest; -class QContactFetchRequest; -QTM_END_NAMESPACE - -class QContactTrackerEngine; -QTM_USE_NAMESPACE - -/** - * QtContacts Tracker plugin unittests - */ -class ut_qtcontacts_trackerplugin : public QObject -{ -Q_OBJECT -public: - ut_qtcontacts_trackerplugin(); -private slots: - void initTestCase(); - void cleanupTestCase(); - void cleanup(); - void testSavePhoneNumber(); - void testPhoneNumberContext(); - void testWritingOnlyWorkMobile(); - void testContacts(); - void testContact(); - void testAvatar(); - - void testSaveEmailAddress(); - void testSaveName(); - void testSaveAddress(); - - void testRemoveContact(); - void testSaveContacts(); - void testRemoveContacts(); - void testUrl(); - -// void testGroups(); -// void testGroup(); -// void testSaveGroup(); -// void testRemoveGroup(); -// void testDetailDefinitions(); -// void testDetailDefinition(); -// void testSaveDetailDefinition(); -// void testRemoveDetailDefinition(); - void testSyncContactManagerContactsAddedSince(); - void testSyncTrackerEngineContactsIdsAddedSince(); - void testSyncContactManagerContactIdsAddedSince(); - void testContactsAddedSince(); - void testContactsModifiedSince(); - void testContactsRemovedSince(); -// void testGroupsAddedSince(); -// void testGroupsModifiedSince(); -// void testGroupsRemovedSince(); - void testNcoTypes(); - void testQRelationshipAndMetacontacts(); - void testAsyncReadContacts(); - void testFilterContacts(); - void testFilterContactsEndsWith(); - void testFilterTwoNameFields(); - void testTrackerUriToUniqueId(); - void testIMContactsAndMetacontactMasterPresence(); - void testIMContactsFilterring(); - void testContactsWithoutMeContact(); - -private: - 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 -{ - Q_OBJECT -public: - QList ids; - QList contacts; -public slots: - void progress(QContactLocalIdFetchRequest* self, bool appendOnly); - void progress(QContactFetchRequest* self, bool appendOnly); -private: - QString requestStatusToString(QContactAbstractRequest::Status status); -}; -#endif diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.pro --- a/qtcontactsmobility/tests/auto/ut_qtcontacts_trackerplugin/ut_qtcontacts_trackerplugin.pro Fri Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -TARGET = ut_qtcontacts_trackerplugin - -test.depends = all -QMAKE_EXTRA_TARGETS += test -QCONTACTS_TRACKER_BACKENDDIR = ../../ - -CONFIG += test -QT += testlib - -LIBS += -lqttracker -LIBS += -lQtContacts - -MOC_DIR = .moc -OBJECTS_DIR = .obj - -# CONFIG += contacts -INCLUDEPATH += /usr/include/qt4/QtContacts \ - /usr/include \ - $$QCONTACTS_TRACKER_BACKENDDIR - -## Include source files under test. -HEADERS += $$QCONTACTS_TRACKER_BACKENDDIR/qcontacttrackerbackend_p.h \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackercontactasyncrequest.h \ - $$QCONTACTS_TRACKER_BACKENDDIR/trackerchangelistener.h \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackercontactslive.h \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackercontactsaverequest.h \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackerrelationshipfetchrequest.h \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackerrelationshipsaverequest.h \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackercontactidfetchrequest.h - - -SOURCES += $$QCONTACTS_TRACKER_BACKENDDIR/qcontacttrackerbackend.cpp \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackercontactasyncrequest.cpp \ - $$QCONTACTS_TRACKER_BACKENDDIR/trackerchangelistener.cpp \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackercontactslive.cpp \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackercontactsaverequest.cpp \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackerrelationshipfetchrequest.cpp \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackerrelationshipsaverequest.cpp \ - $$QCONTACTS_TRACKER_BACKENDDIR/qtrackercontactidfetchrequest.cpp - - -## Include unit test files -HEADERS += ut_qtcontacts_trackerplugin.h \ - contactmanager.h - -SOURCES += ut_qtcontacts_trackerplugin.cpp \ - contactmanager.cpp - diff -r 76a2435edfd4 -r de1630741fbe 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 Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -#!/bin/bash - -if [ -z "$1" ]; then -echo "usage: $0 " -exit 1 -fi - -echo "create nco:IMAccount" -tracker-sparql -u -q " -INSERT -{ - - - -} -" - -tracker-sparql -u -q " -INSERT -{ - - nco:imDisplayName '$7' -} -" - -echo "create nco:IMContact" -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 { - <$1> a nco:IMContact; - nco:nameGiven '$8'; - nco:nameFamily '$9' -} -" \ No newline at end of file diff -r 76a2435edfd4 -r de1630741fbe 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 Apr 16 14:53:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -#!/bin/bash - -if [ -z "$1" ]; then -echo "usage: $0 " -exit 1 -fi -tracker-sparql --update --query " -DELETE { <$1> nco:imContactPresence ?status } -WHERE { <$1> nco:imContactPresence ?status } -INSERT { <$1> nco:imContactPresence $2 } -" diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/benchmarks/benchmarks.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/benchmarks/benchmarks.pro Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,13 @@ +include(../../staticconfig.pri) + +TEMPLATE = subdirs + +contains(mobility_modules,serviceframework): SUBDIRS += sampleserviceplugin serviceframework +contains(mobility_modules,contacts): SUBDIRS += contacts +contains(mobility_modules,systeminfo): SUBDIRS += qsysteminfo +#contains(mobility_modules,messaging) { +# contains(qmf_enabled,yes)|wince*|win32|symbian|maemo5 { +# !win32-g++: SUBDIRS += messaging +# } +#} + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/benchmarks/contacts/contacts.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/benchmarks/contacts/contacts.pro Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,26 @@ +TEMPLATE = app +TARGET = tst_bm_contacts +CONFIG += testcase + +SOURCES += tst_bm_contacts.cpp + +QT += core \ + network + +INCLUDEPATH += ../../../src/contacts\ + ../../../src/contacts/details \ + ../../../src/contacts/filters + +include(../../../common.pri) + +CONFIG += mobility +MOBILITY = contacts + +symbian { + LIBS += -lcntmodel + TARGET.CAPABILITY = All -TCB +} + +maemo { + QT += dbus xml gui +} diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/benchmarks/contacts/tst_bm_contacts.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/benchmarks/contacts/tst_bm_contacts.cpp Mon May 03 12:24:20 2010 +0300 @@ -0,0 +1,968 @@ +/**************************************************************************** +** +** 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 +#include +//#include "contact.h" +//#include +#include +#include +#include + +#include +#include +#include +#include
+ +#ifdef Q_OS_SYMBIAN +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +QTM_USE_NAMESPACE + +//Q_DECLARE_METATYPE(QSystemInfo::Version); +//Q_DECLARE_METATYPE(QSystemInfo::Feature); + +class tst_Contact : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void cleanupTestCase(); + + void tst_createTime(); + + void tst_fetchAllContactIds(); + void tst_fetchOneContact(); + void tst_fetchTenContact(); + //void tst_fetchAllContact(); + + void tst_createContact(); + void tst_saveContact(); + + void tst_nameFilter(); + + void tst_removeOneContact(); + void tst_removeAllContacts(); + + +// void tst_currentLanguage(); +// void tst_availableLanguages(); +// +// void tst_versions_data(); +// void tst_versions(); +// +// void tst_hasFeatures_data(); +// void tst_hasFeatures(); + +public slots: + + void gotContact(QContactFetchRequest*,bool); + void stateChanged(QContactAbstractRequest::State newState); + void timeout(); + void resultsAvailable(); + void resultsAvailableFilter(); + void setBackend(QString); + +private: + void createContact(); + void clearContacts(); + int countContacts(); + + enum { + BackendQContacts, + BackendContactsModel + } m_backend; + QString manager; + QEventLoop *loop; + QContactManager *m_qm; + int m_num_contacts; + QList id_list; + + int m_run; + + int m_num_start; + + QTimer *m_timer; + QStringList firstNames; + QStringList lastNames; + +}; + +void tst_Contact::setBackend(QString backend) +{ + manager = backend; + if(manager == "SymbianContactsModel") // Only one at the moment + m_backend = BackendContactsModel; + else + m_backend = BackendQContacts; + qWarning() << "Backend set to: " << manager; +} + +void tst_Contact::initTestCase() +{ + qDebug() << "Managers: " << QContactManager::availableManagers(); + m_run = 0; + +#if defined(Q_WS_MAEMO_6) + QStringList list = QContactManager::availableManagers(); + int found = 0; + while(!list.empty()){ + if(list.takeFirst() == "tracker"){ + found = 1; + break; + } + } + if(!found) + QFAIL("Unable to find Maemo 6 tracker plugin. Please check install"); + + if(manager.isEmpty()) + manager = "memory"; + m_qm = new QContactManager(manager); +#elif defined(Q_WS_MAEMO_5) + if(manager.isEmpty()){ + //Looking for a manager + QStringList list = QContactManager::availableManagers(); + if (list.contains("maemo5")){ + manager = "maemo5"; + } else { + QFAIL("Unable to find Maemo 5 plugin. Please check install"); + } + } + m_qm = new QContactManager(manager); + +#elif defined(Q_OS_SYMBIAN) + if(m_backend != BackendContactsModel) { + QStringList list = QContactManager::availableManagers(); + int found = 0; + while(!list.empty()){ + if(list.takeFirst() == "symbian"){ + found = 1; + break; + } + } + if(!found) { + QFAIL("Unable to find Symbian plugin. Please check install"); + } + + if(manager.isEmpty()) { + manager = "symbian"; + } + m_qm = new QContactManager(manager); + } + else { + m_qm = 0x0; + } +#else + if(manager != "memory"){ + QFAIL("Platform no supported"); + } + else { + m_qm = new QContactManager(manager); + } +#endif + + + // setup an event loop for waiting + loop = new QEventLoop; + + firstNames << "Anahera" << "Anaru" << "Hemi" << "Hine" << "Kiri" << "Maata" << "Mere" << "Moana" << "Paora" << "Petera" << "Piripi" << "Ruiha" << "Tane" << "Whetu"; + lastNames << "Ati Awa" << "Kai Taho" << "Moriori" << "Muaupoko" << "Nga Rauru" << "Taranaki" << "Opotoki" << "Aotea" << "Taninui" << "Tuhourangi" << "Tainui" << "Waitaha"; + + m_num_start = countContacts(); + qDebug() << "Number of Contact: " << m_num_start; + + + for(int i = 0; i < 20; i++){ + createContact(); + } + + int after = countContacts(); + if(after - m_num_start != 20){ + qWarning() << "Failed to create 20 contacts"; + } + + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), this, SLOT(timeout())); + +} + +int tst_Contact::countContacts() +{ + if(m_backend == BackendQContacts) { + QList qcl = m_qm->contactIds(); + return qcl.count(); + } else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + CContactDatabase* contactsDb = CContactDatabase::OpenL(); + CleanupStack::PushL(contactsDb); + + int num = contactsDb->CountL(); + + CleanupStack::PopAndDestroy(contactsDb); + + return num; +#endif + } + + qWarning("No backend support in countContacts()"); + return 0; + +} + +void tst_Contact::cleanupTestCase() +{ + clearContacts(); + int num_end = countContacts(); + if(m_num_start != num_end){ + QFAIL(QString("Number of contacts ending: %2 is different that starting number %1. Poor cleanup").arg(m_num_start).arg(num_end).toAscii()); + } +} + +void tst_Contact::clearContacts() +{ + if(m_backend == BackendQContacts) { + QMap errorMap; + m_qm->removeContacts(id_list, &errorMap); + id_list.clear(); + } + else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + CContactDatabase* db = CContactDatabase::OpenL(); + CleanupStack::PushL(db); + + CContactIdArray* idArray = CContactIdArray::NewLC(); + while(!id_list.isEmpty()) + idArray->AddL(id_list.takeFirst()); + db->DeleteContactsL(*idArray); + + CleanupStack::PopAndDestroy(2); //idArray, contactsDb +#endif + } + +} + +void tst_Contact::tst_createTime() +{ + + if(m_backend == BackendQContacts){ + QContactManager *qm = 0x0; + + QBENCHMARK { + qm = new QContactManager(manager); + } + + delete qm; + } + else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + CContactDatabase* db = 0x0; + QBENCHMARK { + db = CContactDatabase::OpenL(); + } + CleanupStack::PushL(db); + CleanupStack::PopAndDestroy(1); //db +#endif + } +} + +void tst_Contact::tst_fetchAllContactIds() +{ + if(m_backend == BackendQContacts) { + QList ql; + QBENCHMARK { + ql = m_qm->contactIds(); + } + } + else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + //open database + // Open the default contact database + CContactDatabase* contactsDb = CContactDatabase::OpenL(); + CleanupStack::PushL(contactsDb); + + CCntFilter *filter = CCntFilter::NewLC(); + + //get all contact items (no groups, templates...) + filter->SetContactFilterTypeALL(EFalse); + filter->SetContactFilterTypeCard(ETrue); + + CContactIdArray *iContacts = 0x0; + + QBENCHMARK { + contactsDb->FilterDatabaseL(*filter); + iContacts = CContactIdArray::NewLC(filter->iIds); + } + + CleanupStack::PopAndDestroy(3); //iContacts, filter, contactsDb +#endif + } +} + +void tst_Contact::tst_fetchOneContact() +{ + if(m_backend == BackendQContacts){ + QContact c; + + m_run++; + +#if defined(Q_WS_MAEMO_6) + int ret; + QContactFetchRequest* req = new QContactFetchRequest; + + QList qcl = m_qm->contactIds(); + if(qcl.count() < 1) + QFAIL("No contacts to pull from tracker"); + QList one; + one += qcl.takeFirst(); + QContactLocalIdFilter idFil; + idFil.setIds(one); + req->setFilter(idFil); + + req->setManager(m_qm); + //connect(req, SIGNAL(progress(QContactFetchRequest*, bool)), this, SLOT(gotContact(QContactFetchRequest*,bool))); + //connect(req, SIGNAL(stateChanged(QContactAbstractRequest::State)), this, SLOT(stateChanged(QContactAbstractRequest::State))); + connect(req, SIGNAL(resultsAvailable()), this, SLOT(resultsAvailable())); + + m_num_contacts = 1; + m_timer->start(1000); + + QBENCHMARK { + req->start(); + ret = loop->exec(); + } + m_timer->stop(); + + //qDebug() << "Got Contact: " << qm->synthesizeDisplayLabel(c); + if(ret){ + QFAIL("Failed to load one contact"); + } + delete req; + +//#elif defined(Q_OS_SYMBIAN) +#else + QList qcl = m_qm->contactIds(); + if(qcl.count() < 1) + QFAIL("No contacts to pull from tracker"); + + QBENCHMARK { + c = m_qm->contact(qcl.first()); + } +#endif + } + else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + //open database + // Open the default contact database + CContactDatabase* contactDb = CContactDatabase::OpenL(); + CleanupStack::PushL(contactDb); + + int id = id_list.takeFirst(); + id_list.append(id); + + CContactItem *item; + TInt r; + + QBENCHMARK { + TRAP(r, item = contactDb->ReadContactL(id)); + } + CleanupStack::PushL(item); + + if(r != KErrNone){ qWarning() << "Error by OpenContactL: " << r; } + +// TRAP(r, contactDb->CloseContactL(id)); +// if(r != KErrNone){qWarning() << "Error by CloseContactL: " << r; } + + //qDebug() << "Call FetchContactDone: " << id; + + CleanupStack::PopAndDestroy(2); //contact, lock, contactsDb + +#endif + } +} + + + +void tst_Contact::tst_fetchTenContact() +{ + if(m_backend == BackendQContacts){ + QContact c; + m_run++; + +#if defined(Q_WS_MAEMO_6) + int ret; + + QContactFetchRequest* req = new QContactFetchRequest; + + QList qcl = m_qm->contactIds(); + if(qcl.count() < 10){ + QFAIL("No enough contacts to get 10"); + } + QList one; + for(int i = 0; i<10; i++) + one += qcl.takeFirst(); + m_num_contacts = 10; + + QContactLocalIdFilter idFil; + idFil.setIds(one); + req->setFilter(idFil); + + req->setManager(m_qm); + + // connect(req, SIGNAL(progress(QContactFetchRequest*, bool)), this, SLOT(gotContact(QContactFetchRequest*,bool))); + connect(req, SIGNAL(resultsAvailable()), this, SLOT(resultsAvailable())); + + m_timer->start(1000); + + QBENCHMARK { + req->start(); + ret = loop->exec(); + } + m_timer->stop(); + + //qDebug() << "Got Contact: " << qm->synthesizeDisplayLabel(c); + if(ret){ + QFAIL("Failed to load one contact"); + } + + delete req; + +//#elif defined(Q_OS_SYMBIAN) +#else + QList qcl = m_qm->contactIds(); + if(qcl.count() < 10){ + QFAIL("No enough contacts to get 10"); + } + QList one; + for(int i = 0; i<10; i++) + one += qcl.takeFirst(); + + QContactLocalIdFilter idFil; + idFil.setIds(one); + + QList qlc; + + QBENCHMARK { + qlc = m_qm->contacts(idFil, QList(), QContactFetchHint()); + } + + if(qlc.count() != 10){ + QFAIL("Did not get 10 contacts back"); + } + +#endif + } + else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + //open database + // Open the default contact database + CContactDatabase* contactDb = CContactDatabase::OpenL(); + CleanupStack::PushL(contactDb); + + int id = id_list.takeFirst(); + id_list.append(id); + + TInt r; + + CContactItem *item1; + CContactItem *item2; + CContactItem *item3; + CContactItem *item4; + CContactItem *item5; + CContactItem *item6; + CContactItem *item7; + CContactItem *item8; + CContactItem *item9; + CContactItem *item10; + + QBENCHMARK { + TRAP(r, item1 = contactDb->ReadContactL(id)); + id = id_list.takeFirst(); + id_list.append(id); + TRAP(r, item2 = contactDb->ReadContactL(id)); + id = id_list.takeFirst(); + id_list.append(id); + TRAP(r, item3 = contactDb->ReadContactL(id)); + id = id_list.takeFirst(); + id_list.append(id); + TRAP(r, item4 = contactDb->ReadContactL(id)); + id = id_list.takeFirst(); + id_list.append(id); + TRAP(r, item5 = contactDb->ReadContactL(id)); + id = id_list.takeFirst(); + id_list.append(id); + TRAP(r, item6 = contactDb->ReadContactL(id)); + id = id_list.takeFirst(); + id_list.append(id); + TRAP(r, item7 = contactDb->ReadContactL(id)); + id = id_list.takeFirst(); + id_list.append(id); + TRAP(r, item8 = contactDb->ReadContactL(id)); + id = id_list.takeFirst(); + id_list.append(id); + TRAP(r, item9 = contactDb->ReadContactL(id)); + id = id_list.takeFirst(); + id_list.append(id); + TRAP(r, item10 = contactDb->ReadContactL(id)); + } + CleanupStack::PushL(item1); + CleanupStack::PushL(item2); + CleanupStack::PushL(item3); + CleanupStack::PushL(item4); + CleanupStack::PushL(item5); + CleanupStack::PushL(item6); + CleanupStack::PushL(item7); + CleanupStack::PushL(item8); + CleanupStack::PushL(item9); + CleanupStack::PushL(item10); + + if(r != KErrNone){ qWarning() << "Error by OpenContactL: " << r; } + + CleanupStack::PopAndDestroy(11); //10*item + contactsDb +#endif + } +} + +void tst_Contact::timeout() +{ + qDebug() << "***** Timeout, haven't received the signal/contact within 1sec"; + loop->exit(1); // timeout, fail test + +} + +void tst_Contact::gotContact(QContactFetchRequest *request, bool appendOnly) +{ + Q_UNUSED(appendOnly); + + // first, check to make sure that the request is still valid. + if (request->state() == QContactAbstractRequest::CanceledState) { + delete request; + QWARN("Contact request canceled"); + loop->exit(1); + return; // ignore these results. + } + + if(request->contacts().count() > 0) { + m_num_contacts -= request->contacts().count(); + if(m_num_contacts <= 0) + loop->exit(0); + return; // got one or more + } + + // check to see if the request status is "finished" - clean up. + if (request->state() == QContactAbstractRequest::FinishedState) { + delete request; + } + +} + +void tst_Contact::resultsAvailable() +{ + + QContactFetchRequest *req = qobject_cast(sender()); + if(req){ + //qDebug() << m_run << " Got resultsAvailable: " << req->contacts().count() << " need: " << m_num_contacts; + if(!req->contacts().empty()) { + m_num_contacts -= req->contacts().count(); + if(m_num_contacts <= 0) + loop->exit(0); + return; // got one or more + } + } + +} + +void tst_Contact::resultsAvailableFilter() +{ + + QContactFetchRequest *req = qobject_cast(sender()); + if(req){ + if(!req->contacts().empty()) { // we got enough certainly...don't know how many are coming back with the filter + loop->exit(0); + return; // got one or more + } + } +} + +void tst_Contact::stateChanged(QContactAbstractRequest::State /*newState*/) +{ + qDebug() << "Got state change"; +} + +void tst_Contact::tst_createContact() +{ + QBENCHMARK { + createContact(); + } +} + +void tst_Contact::tst_saveContact() +{ + if(m_backend == BackendQContacts) { + QContact *c = new QContact; + c->setType("Contact"); + QContactName cname; + QString name; + name = firstNames.takeFirst(); + firstNames.push_back(name); + cname.setFirstName(name); + name = lastNames.takeFirst(); + lastNames.push_back(name); + cname.setLastName(name); +#ifndef Q_WS_MAEMO_5 + cname.setPrefix("Mr"); +#endif + c->saveDetail(&cname); + + int ret = 0; + + QBENCHMARK { + ret = m_qm->saveContact(c); + } + if(!ret){ + qDebug() << "Failed to create contact durring setup"; + return; + } + id_list.append(c->localId()); + delete c; + } + else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + // Create a contact card and add a work phone number. Numeric values are + // stored in a text field (storage type = KStorageTypeText). + + CContactDatabase* db = CContactDatabase::OpenL(); + CleanupStack::PushL(db); + + CContactCard* newCard = CContactCard::NewLC(); + + QString name; + + // Create the firstName field and add the data to it + name = firstNames.takeFirst(); + firstNames.push_back(name); + CContactItemField* firstName = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldGivenName); + TPtrC Firstname(reinterpret_cast(name.utf16())); + firstName->TextStorage()->SetTextL(Firstname); + newCard->AddFieldL(*firstName); + CleanupStack::Pop(firstName); + + // Create the lastName field and add the data to it + name = lastNames.takeFirst(); + lastNames.push_back(name); + CContactItemField* lastName= CContactItemField::NewLC(KStorageTypeText, KUidContactFieldFamilyName); + TPtrC Lastname(reinterpret_cast(name.utf16())); + lastName->TextStorage()->SetTextL(Lastname); + newCard->AddFieldL(*lastName); + CleanupStack::Pop(lastName); +#ifndef Q_WS_MAEMO_5 + CContactItemField* prefix = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldPrefixName); + _LIT(KPrefix, "Mr"); + prefix->TextStorage()->SetTextL(KPrefix); + newCard->AddFieldL(*prefix); + CleanupStack::Pop(prefix); +#endif + QBENCHMARK { + // Add newCard to the database + const TContactItemId contactId = db->AddNewContactL(*newCard); + db->CloseContactL(contactId); + id_list.append(contactId); + } + + CleanupStack::PopAndDestroy(2); //newCard, contactsDb +#else + qWarning("ContactModel set but Q_OS_SYMBIAN not set, this doesn't make sense"); +#endif + } +} + + +void tst_Contact::createContact() +{ + if(m_backend == BackendQContacts) { + QContact *c = new QContact; + c->setType(QContactType::TypeContact); + QContactName cname; + QString name; + name = firstNames.takeFirst(); + firstNames.push_back(name); + cname.setFirstName(name); + name = lastNames.takeFirst(); + lastNames.push_back(name); + cname.setLastName(name); +#ifndef Q_WS_MAEMO_5 + cname.setPrefix("Mr"); +#endif + c->saveDetail(&cname); + + if(!m_qm->saveContact(c)){ + qDebug() << "Failed to create contact durring setup"; + return; + } + id_list.append(c->localId()); + delete c; + } + else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + // Create a contact card and add a work phone number. Numeric values are + // stored in a text field (storage type = KStorageTypeText). + + CContactDatabase* db = CContactDatabase::OpenL(); + CleanupStack::PushL(db); + + CContactCard* newCard = CContactCard::NewLC(); + + QString name; + + // Create the firstName field and add the data to it + name = firstNames.takeFirst(); + firstNames.push_back(name); + CContactItemField* firstName = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldGivenName); + TPtrC Firstname(reinterpret_cast(name.utf16())); + firstName->TextStorage()->SetTextL(Firstname); + newCard->AddFieldL(*firstName); + CleanupStack::Pop(firstName); + + // Create the lastName field and add the data to it + name = lastNames.takeFirst(); + lastNames.push_back(name); + CContactItemField* lastName= CContactItemField::NewLC(KStorageTypeText, KUidContactFieldFamilyName); + TPtrC Lastname(reinterpret_cast(name.utf16())); + lastName->TextStorage()->SetTextL(Lastname); + newCard->AddFieldL(*lastName); + CleanupStack::Pop(lastName); +#ifndef Q_WS_MAEMO_5 + CContactItemField* prefix = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldPrefixName); + _LIT(KPrefix, "Mr"); + prefix->TextStorage()->SetTextL(KPrefix); + newCard->AddFieldL(*prefix); + CleanupStack::Pop(prefix); +#endif + // Add newCard to the database + const TContactItemId contactId = db->AddNewContactL(*newCard); + db->CloseContactL(contactId); + + id_list.append(contactId); + CleanupStack::PopAndDestroy(2); //newCard, contactsDb +#else + qWarning("ContactModel set but Q_OS_SYMBIAN not set, this doesn't make sense"); +#endif + } +} + +void tst_Contact::tst_nameFilter() +{ + if(m_backend == BackendQContacts){ + QContactFilter fil = QContactName::match(firstNames.first(),""); // pick one first name to find + //QContactFilter fil = QContactName::match("sdfsdfsdfjhsjkdfshdkf", ""); // pick one first name to find + QContact c; + + m_run++; + + + +#if defined(Q_WS_MAEMO_6) + int ret; + QContactFetchRequest* req = new QContactFetchRequest; + req->setFilter(fil); + req->setManager(m_qm); + + connect(req, SIGNAL(resultsAvailable()), this, SLOT(resultsAvailableFilter())); + + m_timer->start(1000); + + QBENCHMARK { + req->start(); + ret = loop->exec(); + } + m_timer->stop(); + + //qDebug() << "Got Contact: " << qm->synthesizeDisplayLabel(c); + if(ret){ + QFAIL("Failed to load one contact"); + } + +// QList qcl = req->contacts(); +// while(!qcl.isEmpty()){ +// QContact c = qcl.takeFirst(); +// qDebug() << "Contact: " << c.displayLabel(); +// } + delete req; + +#elif defined(Q_OS_SYMBIAN) + QList qlc; + + QBENCHMARK { + qlc = m_qm->contacts(fil, QList(), QContactFetchHint()); + } + +// while(!qlc.isEmpty()){ +// QContact c = qlc.takeFirst(); +// qDebug() << "Contact: " << c.displayLabel(); +// } +#endif + } + else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + //open database + // Open the default contact database + CContactDatabase* contactDb = CContactDatabase::OpenL(); + CleanupStack::PushL(contactDb); + + CContactItem *item = 0x0; + + const TPtrC Firstname(reinterpret_cast(firstNames.first().utf16())); + CContactIdArray* idArray; + + CContactItemFieldDef* fieldDef = new (ELeave) CContactItemFieldDef(); + CleanupStack::PushL(fieldDef); + + fieldDef->AppendL( KUidContactFieldGivenName); + + QBENCHMARK { + idArray = contactDb->FindLC(Firstname, fieldDef); + if(idArray->Count() > 0) + item = contactDb->ReadContactL((*idArray)[0]); + else + QFAIL("No contacts returned from CContactDatabase::FindLC"); + } + CleanupStack::PushL(item); + + CleanupStack::PopAndDestroy(4); //item, idArray, fielddef, lock, contactsDb +#endif + } +} + +void tst_Contact::tst_removeOneContact() +{ + if(m_backend == BackendQContacts){ + QList one; + QMap errorMap; + + if(id_list.count() < 1){ // incase we run out of contacts + createContact(); + } + + one += id_list.takeFirst(); + QBENCHMARK { + m_qm->removeContacts(one, &errorMap); + } + + } + else if(m_backend == BackendContactsModel){ +#ifdef Q_OS_SYMBIAN + CContactDatabase* db = CContactDatabase::OpenL(); + CleanupStack::PushL(db); + + if(id_list.isEmpty()) + QFAIL("no contacts available to be removed for tst_removeOnContact()"); + + + TInt32 id = id_list.takeFirst(); + + TInt err = 0; + + QBENCHMARK_ONCE { + TRAP(err, db->DeleteContactL(id)); + } + + if(err){ + QFAIL("Failed to delete a contact"); + } + + CleanupStack::PopAndDestroy(1); //idArray, contactsDb +#endif + } +} + +void tst_Contact::tst_removeAllContacts() +{ + int before = countContacts(); + + if(before < 20) { + for(int i = before; i < 20; i++){ + createContact(); + } + } + + QBENCHMARK { + clearContacts(); + } + +} + +int main(int argc, char **argv){ + + QApplication app(argc, argv); + + tst_Contact test1; + test1.setBackend("memory"); + QTest::qExec(&test1, argc, argv); + +// tst_Contact test2; +// test2.setBackend("tracker"); +// QTest::qExec(&test2, argc, argv); +#if defined(Q_WS_MAEMO_5) + tst_Contact test2; + test2.setBackend("maemo5"); + QTest::qExec(&test2, argc, argv); +#endif +#if defined(Q_OS_SYMBIAN) + tst_Contact test2; + test2.setBackend("symbian"); + QTest::qExec(&test2, argc, argv); + + tst_Contact test3; + test3.setBackend("SymbianContactsModel"); + QTest::qExec(&test3, argc, argv); +#endif + +} + +#include "tst_bm_contacts.moc" + diff -r 76a2435edfd4 -r de1630741fbe qtcontactsmobility/tests/tests.pro --- a/qtcontactsmobility/tests/tests.pro Fri Apr 16 14:53:18 2010 +0300 +++ b/qtcontactsmobility/tests/tests.pro Mon May 03 12:24:20 2010 +0300 @@ -1,8 +1,7 @@ -include(../pathconfig.pri) -include($$QT_MOBILITY_BUILD_TREE/config.pri) +include(../staticconfig.pri) TEMPLATE = subdirs -SUBDIRS += auto +SUBDIRS += auto benchmarks contains(mobility_modules,serviceframework): SUBDIRS += testservice2 sampleserviceplugin sampleserviceplugin2 contains(mobility_modules,bearer) { @@ -14,6 +13,6 @@ symbian { contains(mobility_modules,messaging): SUBDIRS += messagingex - contains(mobility_modules,multimedia): SUBDIRS += cameracapture_s60 playerex_s60 + contains(mobility_modules,multimedia): SUBDIRS += playerex_s60 contains(mobility_modules,publishsubscribe): SUBDIRS += publishsubscribeex }