# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1272965977 -10800 # Node ID 4a5361db893725be3d34a9ce4873588fed30176a Revision: 201015 Kit: 201018 diff -r 000000000000 -r 4a5361db8937 layers.sysdef.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layers.sysdef.xml Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,18 @@ + + +]> + + + + + + + + + + + + + + diff -r 000000000000 -r 4a5361db8937 logsui/bwins/logscntfinderu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/bwins/logscntfinderu.def Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,18 @@ +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 000000000000 -r 4a5361db8937 logsui/cenrep/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/cenrep/backup_registration.xml Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,6 @@ + + + + + + diff -r 000000000000 -r 4a5361db8937 logsui/cenrep/keys_logs.xls Binary file logsui/cenrep/keys_logs.xls has changed diff -r 000000000000 -r 4a5361db8937 logsui/conf/logs.confml Binary file logsui/conf/logs.confml has changed diff -r 000000000000 -r 4a5361db8937 logsui/conf/logs_101F874E.crml Binary file logsui/conf/logs_101F874E.crml has changed diff -r 000000000000 -r 4a5361db8937 logsui/conf/logs_102750C6.crml Binary file logsui/conf/logs_102750C6.crml has changed diff -r 000000000000 -r 4a5361db8937 logsui/inc/logscntfinderexport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/inc/logscntfinderexport.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/inc/logsexport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/inc/logsexport.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/inc/logslogger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/inc/logslogger.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,127 @@ +/* +* 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 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logsabstractviewmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logsabstractviewmanager.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logsbaseview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logsbaseview.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,184 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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(); + virtual void resetView(); + +public slots: + + virtual void handleExit(); + void closeEmptyMenu(); + +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 ); + /* + * + */ + bool askConfirmation( QString heading , QString text ); + +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 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logscomponentrepository.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logscomponentrepository.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#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 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logsdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logsdefs.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,78 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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"; +const char logsPageIndicatorId[] = "logs_page_indicator"; + +//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 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logsdetailsview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logsdetailsview.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,81 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logseffecthandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logseffecthandler.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#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); + void startMoveNotPossibleEffect(QObject& effectTarget, bool moveLeft, 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; + QPropertyAnimation* mItemMoveNotPossibleAnimationStart; + QPropertyAnimation* mItemMoveNotPossibleAnimationEnd; + QSequentialAnimationGroup* mMoveGroup; + QSequentialAnimationGroup* mMoveGroup2; + QSequentialAnimationGroup* mFadeGroup; + QSequentialAnimationGroup* mMoveNotPossibleGroup; + +}; + +#endif // LOGSEFFECTHANDLER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logsmainwindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logsmainwindow.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,63 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 LogsForegroundWatcher; + + +class LogsMainWindow : public HbMainWindow + { + Q_OBJECT + +public: + + LogsMainWindow(); + virtual ~LogsMainWindow(); + + void sendAppToBackground(); + void bringAppToForeground(); + + bool isForeground() const; + +protected: // From HbMainWindow + + void keyPressEvent( QKeyEvent *event ); + +signals: + + void callKeyPressed(); + void appFocusGained(); + void appFocusLost(); + +private: + + LogsForegroundWatcher* mWatcher; + bool mForeground; + + friend class UT_LogsMainWindow; + friend class UT_LogsServiceHandler; + friend class UT_LogsViewManager; + + }; + + +#endif //LOGSMAINWINDOW_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logsmatchesview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logsmatchesview.h Tue May 04 12:39:37 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 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 handleBackSoftkey(); + 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 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logspageindicator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logspageindicator.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef LOGSPAGEINDICATOR_H +#define LOGSPAGEINDICATOR_H + +#include + + +class LogsPageIndicatorItem; + + +class LogsPageIndicator: public HbWidget +{ + friend class UT_LogsPageIndicator; + Q_OBJECT + +public: + + explicit LogsPageIndicator(QGraphicsItem *parent = 0); + ~LogsPageIndicator(); + +public: + + void initialize(int itemCount, int activeItemIndex); + + int itemCount() const; + + void setActiveItemIndex(int index); + int activeItemIndex() const; + + +private: + + void layoutItems(); + +private: + + QList mItems; + int mActiveItemIndex; +}; + +#endif //LOGSPAGEINDICATOR diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logspageindicatoritem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logspageindicatoritem.h Tue May 04 12:39:37 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 LOGSPAGEINDICATORITEM_H +#define LOGSPAGEINDICATORITEM_H + +#include + + +class LogsPageIndicatorItem : public HbIconItem +{ + Q_OBJECT + friend class UT_LogsPageIndicatorItem; + +public: + + explicit LogsPageIndicatorItem(bool active = false, QGraphicsItem *parent = 0); + ~LogsPageIndicatorItem(); + +public: + + void setActive(bool active = true); + bool isActive() const; + + +private: + + void startAnimation(); + +private slots: + + void animationFinished(); + +private: + + bool mIsActive; +}; + +#endif // LOGSPAGEINDICATORITEM_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logsrecentcallsview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logsrecentcallsview.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,130 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 LogsPageIndicator; + + +/** + * + */ +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(); + virtual void resetView(); + +public slots: + + void handleExit(); + 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(); + void scrollToTopItem(); + +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); + 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; + LogsPageIndicator* mPageIndicator; + bool mResetted; + +}; + +#endif // LOGSRECENTCALLSVIEW_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logsservicehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logsservicehandler.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#ifndef LOGSSERVICEHANDLER_H +#define LOGSSERVICEHANDLER_H + +#include +#include + +class LogsMainWindow; + +class LogsServiceHandler : public XQServiceProvider + { + Q_OBJECT + public: + explicit LogsServiceHandler(LogsMainWindow& mainWindow); + ~LogsServiceHandler(); + + public slots: + int start(int activatedView, bool showDialpad); + int startWithNum(int activatedView, bool showDialpad, QString dialpadText); + + signals: + + void activateView(LogsServices::LogsView activatedView, bool showDialpad); + void activateView(QString dialpadText); + + public: + + LogsServices::LogsView currentlyActivatedView(); + bool isStartedUsingService() const; + + private: + int mActivatedView; + LogsMainWindow& mMainWindow; + bool mIsAppStartedUsingService; + + private: + friend class UT_LogsServiceHandler; + friend class UT_LogsViewManager; + }; + +#endif //LOGSSERVICEHANDLER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/inc/logsviewmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/inc/logsviewmanager.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#ifndef LOGVIEWMANAGER_H +#define LOGVIEWMANAGER_H + + +#include +#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; + friend class UT_LogsServiceHandler; + +public: + + /** + * Constructor + * @param mainWindow + * @param service + */ + LogsViewManager( LogsMainWindow& mainWindow, LogsServiceHandler& service ); + ~LogsViewManager(); + +public slots: + + void changeRecentView(LogsServices::LogsView view, bool showDialpad); + void changeMatchesView(QString dialpadText); + void appFocusGained(); + void appFocusLost(); + +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 proceedExit(); + void handleOrientationChanged(); + void completeViewActivation(); + +private: + + void initViews(); + bool doActivateView(LogsAppViewId viewId, bool showDialpad, QVariant args); + +private: //data + + LogsMainWindow& mMainWindow; + LogsServiceHandler& mService; + LogsComponentRepository* mComponentsRepository; + QList mViewStack; + bool mFirstActivation; + QVariant mViewActivationArgs; + bool mViewActivationShowDialpad; + +}; + +#endif //LOGVIEWMANAGER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/logsapp.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/logsapp.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,70 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +# + +TEMPLATE = app +TARGET = logs +CONFIG += hb +CONFIG += service +RESOURCES += logsapp.qrc +TRANSLATIONS = dialer.ts + +INCLUDEPATH += ./ +INCLUDEPATH += ./inc +INCLUDEPATH += ../logsengine +INCLUDEPATH += ../logsengine/inc +INCLUDEPATH += ../logsengine/logssymbianos/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 +HEADERS += inc/logspageindicator.h +HEADERS += inc/logspageindicatoritem.h +HEADERS += ../logsengine/logssymbianos/inc/logsforegroundwatcher.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 +SOURCES += src/logspageindicator.cpp +SOURCES += src/logspageindicatoritem.cpp +SOURCES += ../logsengine/logssymbianos/src/logsforegroundwatcher.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 000000000000 -r 4a5361db8937 logsui/logsapp/logsapp.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/logsapp.qrc Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,16 @@ + + + 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 + + + resources/hblistviewitem.css + resources/hblistviewitem.widgetml + + diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/resources/hblistviewitem.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/resources/hblistviewitem.css Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,38 @@ +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 000000000000 -r 4a5361db8937 logsui/logsapp/resources/hblistviewitem.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/resources/hblistviewitem.widgetml Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/resources/logs_default.qm Binary file logsui/logsapp/resources/logs_default.qm has changed diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/resources/logs_view_fade_in_scale.fxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/resources/logs_view_fade_in_scale.fxml Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,23 @@ + + + + 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 000000000000 -r 4a5361db8937 logsui/logsapp/resources/logs_view_fade_out.fxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/resources/logs_view_fade_out.fxml Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,10 @@ + + + + 0.2 + + 1.0 + 0.0 + + + \ No newline at end of file diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/service_conf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/service_conf.xml Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,7 @@ + + + Logs services + + Starter interface + + diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/src/logsbaseview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logsbaseview.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,909 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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::resetView() +{ + LOGS_QDEBUG( "logs [UI] -> LogsBaseView::resetView()" ); + mDialpad->editor().setText(QString()); + if ( mDialpad->isOpen() ){ + mDialpad->closeDialpad(); + } + LOGS_QDEBUG( "logs [UI] <- LogsBaseView::resetView()" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +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.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(); + connect(menu(), SIGNAL(aboutToShow()), this, + SLOT(closeEmptyMenu()), Qt::QueuedConnection); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +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()" ); +} +// ----------------------------------------------------------------------------- +// LogsBaseView::closeEmptyMenu() +// ----------------------------------------------------------------------------- +// +void LogsBaseView::closeEmptyMenu() +{ + bool visibleActionsExist = false; + foreach (QAction* action, menu()->actions()) { + if (action->isVisible()) { + visibleActionsExist = true ; + } + } + + if (!visibleActionsExist) { + menu()->close(); + } +} +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +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(); + // layoutrect broken, fix will be in MCL wk14, use workaround meanwhile + //QRectF screenRect = window.layoutRect(); + QRectF screenRect = (window.orientation() == Qt::Horizontal) ? + QRectF(0,0,640,360) : QRectF(0,0,360,640); + + 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 ) { + if ( askConfirmation( hbTrId("txt_dialer_ui_title_delete_event"), + hbTrId("txt_dialer_info_call_event_will_be_removed_from"))){ + 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 ); + } +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +bool LogsBaseView::askConfirmation( QString heading , QString text ) +{ + bool result(false); + HbMessageBox *note = new HbMessageBox("", HbMessageBox::MessageTypeQuestion); + note->setHeadingWidget(new HbLabel( heading )); + note->setText( text ); + 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()){ + result = true; + } + delete note; + return result; +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/src/logscomponentrepository.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logscomponentrepository.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,261 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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" +#include "logspageindicator.h" + +//SYSTEM +#include +#include +#include +#include + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +LogsComponentRepository::LogsComponentRepository(LogsAbstractViewManager& viewManager) + : HbDocumentLoader(), + mViewManager(viewManager), + mRecentCallsView(0), + mDetailsView(0), + mMatchesView(0), + mDialpad(0), + mDialpadKeyHandler(0) +{ + bool resourceControl = true; + mModel = new LogsModel(LogsModel::LogsRecentModel, resourceControl); +} +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +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 if (name == logsPageIndicatorId) { + LOGS_QDEBUG( "logs [UI] creating LogsPageIndicator" ); + object = new LogsPageIndicator; + } else { + 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 000000000000 -r 4a5361db8937 logsui/logsapp/src/logsdetailsview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logsdetailsview.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,364 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 +#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 ) { + if ( askConfirmation( hbTrId("txt_dialer_ui_title_delete_event"), + hbTrId("txt_dialer_info_call_event_will_be_removed_from"))){ + 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 000000000000 -r 4a5361db8937 logsui/logsapp/src/logseffecthandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logseffecthandler.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,266 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 logsEffectMoveNotPossibleDurationInMs = 200; +const int logsMoveNotPossibleAmount = 30; + +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(); + mItemMoveNotPossibleAnimationStart = new QPropertyAnimation(); + mItemMoveNotPossibleAnimationEnd = new QPropertyAnimation(); + + mMoveGroup = new QSequentialAnimationGroup; + mMoveGroup2 = new QSequentialAnimationGroup; + mFadeGroup = new QSequentialAnimationGroup; + mMoveNotPossibleGroup = 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); + + mMoveNotPossibleGroup->addAnimation(mItemMoveNotPossibleAnimationStart); + mMoveNotPossibleGroup->addAnimation(mItemMoveNotPossibleAnimationEnd); + + 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; + delete mMoveNotPossibleGroup; + + 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::startMoveNotPossibleEffect( + QObject& effectTarget, bool moveLeft, int origX) +{ + LOGS_QDEBUG( "logs [UI] -> LogsEffectHandler::startMoveNotPossibleEffect()" ); + + // Move a bit to attempted direction and then back + // + //int origX = effectTarget.property("x").toInt(); + int moveNotPossiblePos = + moveLeft ? -logsMoveNotPossibleAmount : logsMoveNotPossibleAmount; + QEasingCurve easing(QEasingCurve::OutBack); + initMoveHorizontallyEffect( + *mItemMoveNotPossibleAnimationStart, &effectTarget, origX, moveNotPossiblePos, + logsEffectMoveNotPossibleDurationInMs, easing); + QEasingCurve easing2(QEasingCurve::OutQuad); + initMoveHorizontallyEffect( + *mItemMoveNotPossibleAnimationEnd, &effectTarget, moveNotPossiblePos, origX, + logsEffectMoveNotPossibleDurationInMs, easing2); + mMoveNotPossibleGroup->start(); + + LOGS_QDEBUG( "logs [UI] <- LogsEffectHandler::startMoveNotPossibleEffect()" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +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 000000000000 -r 4a5361db8937 logsui/logsapp/src/logsmainwindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logsmainwindow.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,101 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "logsmainwindow.h" +#include "logslogger.h" +#include "logsforegroundwatcher.h" +#include +#include + +// ----------------------------------------------------------------------------- +// LogsMainWindow::LogsMainWindow +// ----------------------------------------------------------------------------- +// +LogsMainWindow::LogsMainWindow() : HbMainWindow(), mForeground(false) +{ + if ( viewport() ){ + viewport()->grabGesture(Qt::SwipeGesture); + } + mWatcher = new LogsForegroundWatcher(this); + connect( mWatcher, SIGNAL(losingForeground()), this, SIGNAL(appFocusLost()) ); + connect( mWatcher, SIGNAL(gainingForeground()), this, SIGNAL(appFocusGained()) ); +} + +// ----------------------------------------------------------------------------- +// LogsMainWindow::~LogsMainWindow +// ----------------------------------------------------------------------------- +// +LogsMainWindow::~LogsMainWindow() +{ + if ( viewport() ){ + viewport()->ungrabGesture(Qt::SwipeGesture); + } +} + +// ----------------------------------------------------------------------------- +// LogsMainWindow::sendAppToBackground +// ----------------------------------------------------------------------------- +// +void LogsMainWindow::sendAppToBackground() +{ + LOGS_QDEBUG( "logs [UI] -> LogsMainWindow::sendAppToBackground" ); + mForeground = false; + XQServiceUtil::toBackground(true); + LOGS_QDEBUG( "logs [UI] <- LogsMainWindow::sendAppToBackground" ); +} + +// ----------------------------------------------------------------------------- +// LogsMainWindow::bringAppToForeground +// ----------------------------------------------------------------------------- +// +void LogsMainWindow::bringAppToForeground() +{ + LOGS_QDEBUG( "logs [UI] -> LogsMainWindow::bringAppToForeground" ); + if ( !mForeground ){ + mForeground = true; + show(); + raise(); + } + LOGS_QDEBUG( "logs [UI] <- LogsMainWindow::bringAppToForeground" ); +} + +// ----------------------------------------------------------------------------- +// LogsMainWindow::isForeground +// ----------------------------------------------------------------------------- +// +bool LogsMainWindow::isForeground() const +{ + return mForeground; +} + +// ----------------------------------------------------------------------------- +// 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); +} + diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/src/logsmatchesview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logsmatchesview.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,357 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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()); + 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::::handleBackSoftkey +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::handleBackSoftkey() +{ + LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::::handleBackSoftkey()" ); + + if (mDialpad->isOpen()){ + LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::::handleBackSoftkey() closeDialpad" ); + // Block aboutToClose signal to interfere with layout loading + // at backstepping phase + mDialpad->blockSignals(true); + mDialpad->closeDialpad(); + mDialpad->blockSignals(false); + } + + LogsBaseView::handleBackSoftkey(); + + LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::::handleBackSoftkey()" ); +} + +// ----------------------------------------------------------------------------- +// LogsMatchesView::dialpadEditorTextChanged +// ----------------------------------------------------------------------------- +// +void LogsMatchesView::dialpadEditorTextChanged() +{ + updateCallButton(); + updateMenu(); + + QString pattern = mDialpad->editor().text(); + if ( pattern.isEmpty() ){ + // Treat empty input field same was as back press + LogsBaseView::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 000000000000 -r 4a5361db8937 logsui/logsapp/src/logspageindicator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logspageindicator.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,112 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 "logspageindicator.h" +#include "logspageindicatoritem.h" + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +LogsPageIndicator::LogsPageIndicator(QGraphicsItem *parent) + : HbWidget(parent), + mActiveItemIndex(-1) +{ +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +LogsPageIndicator::~LogsPageIndicator() +{ + qDeleteAll(mItems); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsPageIndicator::initialize(int itemCount, int activeItemIndex) +{ + qDeleteAll(mItems); + mItems.clear(); + mActiveItemIndex = -1; + + if (itemCount < 1 || activeItemIndex < 0 || + itemCount <= activeItemIndex) { + return; + } + + for (int i = 0; i < itemCount; ++i) { + mItems << new LogsPageIndicatorItem(i == activeItemIndex); + } + mActiveItemIndex = activeItemIndex; + layoutItems(); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +int LogsPageIndicator::itemCount() const +{ + return mItems.count(); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsPageIndicator::setActiveItemIndex(int activeItemIndex) +{ + if (activeItemIndex < 0 || itemCount() <= activeItemIndex) { + return; + } + + mActiveItemIndex = activeItemIndex; + for (int i = 0; i < mItems.count(); ++i) { + mItems[i]->setActive(i == activeItemIndex); + } +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +int LogsPageIndicator::activeItemIndex() const +{ + return mActiveItemIndex; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsPageIndicator::layoutItems() +{ + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; + layout->setContentsMargins(0, 0, 0, 0); + layout->addStretch(); + foreach (LogsPageIndicatorItem *item, mItems) { + layout->addItem(item); + } + layout->addStretch(); + setLayout(layout); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/src/logspageindicatoritem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logspageindicatoritem.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,108 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 "logspageindicatoritem.h" + + +const char logsNormalIconName[] = "qtg_graf_hspage_normal";//"qtg_mono_tab_passive";// +const char logsHighlightIconName[] = "qtg_graf_hspage_highlight";//"qtg_mono_tab_active";// + +const int logsEffectDurationInMs = 1000; + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +LogsPageIndicatorItem::LogsPageIndicatorItem(bool active, QGraphicsItem *parent) + : HbIconItem(parent), + mIsActive(active) +{ + if (active) { + setIcon(HbIcon(logsHighlightIconName)); + } else { + setIcon(HbIcon(logsNormalIconName)); + } + + QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect; + effect->setColor(Qt::white); + effect->setStrength(0); + effect->setEnabled(false); + setGraphicsEffect(effect); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +LogsPageIndicatorItem::~LogsPageIndicatorItem() +{ +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsPageIndicatorItem::setActive(bool active) +{ + if (mIsActive != active) { + mIsActive = active; + if (mIsActive) { + setIcon(HbIcon(logsHighlightIconName)); + startAnimation(); + } else { + setIcon(HbIcon(logsNormalIconName)); + } + } +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +bool LogsPageIndicatorItem::isActive() const +{ + return mIsActive; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsPageIndicatorItem::startAnimation() +{ + graphicsEffect()->setEnabled(true); + setTransformOriginPoint(rect().center()); + QPropertyAnimation *animation = + new QPropertyAnimation(graphicsEffect(), "strength"); + animation->setDuration(logsEffectDurationInMs); + animation->setKeyValueAt(0.2, 1); + animation->setEndValue(0); + connect(animation, SIGNAL(finished()), SLOT(animationFinished())); + animation->start(QAbstractAnimation::DeleteWhenStopped); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsPageIndicatorItem::animationFinished() +{ + graphicsEffect()->setEnabled(false); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/src/logsrecentcallsview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logsrecentcallsview.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,724 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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" +#include "logspageindicator.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), + mPageIndicator(0), + mResetted(false) +{ + LOGS_QDEBUG( "logs [UI] <-> LogsRecentCallsView::LogsRecentCallsView()" ); + mModel = mRepository.model(); + + //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()); + + mPageIndicator->setActiveItemIndex(mConversionMap.value(mCurrentView)); + + if ( mResetted ){ + // After reset, first data addition should cause scrolling to topitem + connect( mFilter, SIGNAL(rowsInserted(const QModelIndex&,int,int)), + this, SLOT(scrollToTopItem()) ); + mResetted = false; + } + + LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::activated()" ); +} + +// ----------------------------------------------------------------------------- +// LogsRecentCallsView::deactivated +// ----------------------------------------------------------------------------- +// +void LogsRecentCallsView::deactivated() +{ + //base class handling first + LogsBaseView::deactivated(); + + deactivateEmptyListIndicator(mFilter); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsRecentCallsView::handleExit() +{ + markMissedCallsSeen(); + LogsBaseView::handleExit(); +} + +// ----------------------------------------------------------------------------- +// LogsRecentCallsView::isExitAllowed +// ----------------------------------------------------------------------------- +// +bool LogsRecentCallsView::isExitAllowed() +{ + return !mMarkingMissedAsSeen; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsRecentCallsView::resetView() +{ + LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::resetView()" ); + LogsBaseView::resetView(); + mResetted = true; + LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::resetView()" ); +} + +// ----------------------------------------------------------------------------- +// 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())); + + mPageIndicator = qobject_cast + (mRepository.findWidget(logsPageIndicatorId)); + + mPageIndicator->initialize(mTitleMap.count(), mConversionMap.value(mCurrentView)); + + 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 ) { + if ( askConfirmation( hbTrId("txt_dialer_ui_title_clear_list"), + hbTrId("txt_dialer_ui_info_all_call_events_will_be_remo"))){ + mModel->clearList( mFilter->clearType() ); + } + } + 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")); + + mConversionMap.insert(LogsServices::ViewAll, LogsBaseView::ViewAll); + mConversionMap.insert(LogsServices::ViewCalled, LogsBaseView::ViewCalled); + mConversionMap.insert(LogsServices::ViewReceived, LogsBaseView::ViewReceived); + mConversionMap.insert(LogsServices::ViewMissed, LogsBaseView::ViewMissed); +} + +// ----------------------------------------------------------------------------- +// 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 + + scrollToTopItem(); + + 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) +{ + 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 { + if (model() && model()->rowCount() > 0) { + mEffectHandler->startMoveNotPossibleEffect(*mListView, false, mListViewX); + } else { + mEffectHandler->startMoveNotPossibleEffect(*mEmptyListLabel, false, mListViewX); + } + } + 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 { + if (model() && model()->rowCount() > 0) { + mEffectHandler->startMoveNotPossibleEffect(*mListView, true, mListViewX); + } else { + mEffectHandler->startMoveNotPossibleEffect(*mEmptyListLabel, true, mListViewX); + } + } + LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::rightFlick()" ); +} + +// ----------------------------------------------------------------------------- +// LogsRecentCallsView::changeView +// ----------------------------------------------------------------------------- +// +void LogsRecentCallsView::changeView(LogsServices::LogsView view) +{ + 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; + } + + mMoveLeftInList = mConversionMap.value(view) < mConversionMap.value(mCurrentView); + + mAppearingView = view; + mEffectHandler->startDissappearAppearByFadingEffect(*mViewName); + mEffectHandler->startDissappearAppearByMovingEffect( + *mListView, *mEmptyListLabel, !mMoveLeftInList, mListViewX); + + mPageIndicator->setActiveItemIndex(mConversionMap.value(mAppearingView)); + + 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 && !mResetted && + ( 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; +} + +// ----------------------------------------------------------------------------- +// LogsRecentCallsView::scrollToTopItem +// ----------------------------------------------------------------------------- +// +void LogsRecentCallsView::scrollToTopItem() +{ + LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::scrollToTopItem()" ); + disconnect( mFilter, SIGNAL(rowsInserted(const QModelIndex&,int,int)), + this, SLOT(scrollToTopItem())); + if ( mFilter && mFilter->hasIndex(0,0) ) { + mListView->scrollTo( mFilter->index(0,0) ); + } + LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::scrollToTopItem()" ); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/src/logsservicehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logsservicehandler.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,121 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +//USER +#include "logsservicehandler.h" +#include "logslogger.h" +#include "logsmainwindow.h" +#include + +//SYSTEM + +// ----------------------------------------------------------------------------- +// LogsService::LogsService +// ----------------------------------------------------------------------------- +// +LogsServiceHandler::LogsServiceHandler(LogsMainWindow& mainWindow) + : XQServiceProvider(QLatin1String("com.nokia.services.logsservices.starter"),0), + mActivatedView(0), + mMainWindow(mainWindow) +{ + 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; + } + mIsAppStartedUsingService = true; + mActivatedView = activatedView; + + LOGS_QDEBUG( "logs [UI] Bring app to foreground" ) + mMainWindow.bringAppToForeground(); + + emit activateView((LogsServices::LogsView)mActivatedView, showDialpad); + + LOGS_QDEBUG( "logs [UI] <- LogsServiceHandler::start()" ) + return 0; +} + +// ----------------------------------------------------------------------------- +// LogsServiceHandler::startWithNum +// ----------------------------------------------------------------------------- +// +int LogsServiceHandler::startWithNum(int activatedView, bool showDialpad, QString dialpadText) +{ + LOGS_QDEBUG_2( "logs [UI] -> LogsServiceHandler::startWithNum(), view:", activatedView ) + + Q_UNUSED(showDialpad); + + if ( activatedView < LogsServices::ViewAll || + activatedView > LogsServices::ViewMissed ){ + LOGS_QDEBUG( "logs [UI] <- LogsServiceHandler::startWithNum(), incorrect view" ) + return -1; + } + mIsAppStartedUsingService = true; + mActivatedView = activatedView; + + LOGS_QDEBUG( "logs [UI] Bring app to foreground" ) + mMainWindow.bringAppToForeground(); + + emit activateView(dialpadText); + + LOGS_QDEBUG( "logs [UI] <- LogsServiceHandler::startWithNum()" ) + return 0; +} + +// ----------------------------------------------------------------------------- +// LogsServiceHandler::currentlyActivatedView +// ----------------------------------------------------------------------------- +// +LogsServices::LogsView LogsServiceHandler::currentlyActivatedView() +{ + return (LogsServices::LogsView)mActivatedView; +} + +// ----------------------------------------------------------------------------- +// LogsServiceHandler::isStartedUsingService +// ----------------------------------------------------------------------------- +// +bool LogsServiceHandler::isStartedUsingService() const +{ + return mIsAppStartedUsingService; +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/src/logsviewmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/logsviewmanager.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,335 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 +#include +#include + +// ----------------------------------------------------------------------------- +// LogsViewManager::LogsViewManager +// ----------------------------------------------------------------------------- +// +LogsViewManager::LogsViewManager( + LogsMainWindow& mainWindow, LogsServiceHandler& service ) : + QObject( 0 ), mMainWindow( mainWindow ), mService( service ), + mFirstActivation(true), mViewActivationShowDialpad(false) +{ + 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( &mService, SIGNAL( activateView(QString) ), + this, SLOT( changeMatchesView(QString) )); + + connect( &mMainWindow, SIGNAL(appFocusGained()), this, SLOT(appFocusGained()) ); + connect( &mMainWindow, SIGNAL(appFocusLost()), this, SLOT(appFocusLost()) ); + + 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); + + // Don't activate any view, app focus gaining or service request + // will cause view activation + // + 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); + + LogsDetailsView* detailsView = mComponentsRepository->detailsView(); + mViewStack.append(detailsView); + mMainWindow.addView(detailsView); + + LogsMatchesView* matchesView = mComponentsRepository->matchesView(); + mViewStack.append(matchesView); + mMainWindow.addView(matchesView); + + LOGS_QDEBUG( "logs [UI] <- LogsViewManager::initViews()" ); +} + +// ----------------------------------------------------------------------------- +// LogsViewManager::changeRecentView +// ----------------------------------------------------------------------------- +// +void LogsViewManager::changeRecentView(LogsServices::LogsView view, bool showDialpad) +{ + QVariant args(view); + doActivateView(LogsRecentViewId, showDialpad, args); +} + +// ----------------------------------------------------------------------------- +// LogsViewManager::changeMatchesView +// ----------------------------------------------------------------------------- +// +void LogsViewManager::changeMatchesView(QString dialpadText) +{ + Dialpad* dialpad = mComponentsRepository->dialpad(); + dialpad->editor().setText(dialpadText); + doActivateView(LogsMatchesViewId, true, QVariant()); +} + +// ----------------------------------------------------------------------------- +// LogsViewManager::appFocusGained +// Activate recent view if gaining focus first time and app was not started +// via highway service. If app was started by using service request, +// wait the request to appear before activating view. +// ----------------------------------------------------------------------------- +// +void LogsViewManager::appFocusGained() +{ + LOGS_QDEBUG( "logs [UI] -> LogsViewManager::appFocusGained()" ); + + foreach ( LogsBaseView* view, mViewStack ){ + disconnect( view, SIGNAL(exitAllowed()), this, SLOT(proceedExit()) ); + } + + if ( mFirstActivation && !mService.isStartedUsingService() ){ + changeRecentView( mService.currentlyActivatedView(), false ); + mMainWindow.bringAppToForeground(); + } + + mComponentsRepository->model()->refreshData(); + + LOGS_QDEBUG( "logs [UI] <- LogsViewManager::appFocusGained()" ); +} + +// ----------------------------------------------------------------------------- +// LogsViewManager::appFocusLost +// ----------------------------------------------------------------------------- +// +void LogsViewManager::appFocusLost() +{ + LOGS_QDEBUG( "logs [UI] -> LogsViewManager::appFocusLost()" ); + + LOGS_QDEBUG( "logs [UI] <- LogsViewManager::appFocusLost()" ); +} + +// ----------------------------------------------------------------------------- +// LogsViewManager::proceedExit +// ----------------------------------------------------------------------------- +// +void LogsViewManager::proceedExit() +{ + LOGS_QDEBUG( "logs [UI] -> LogsViewManager::proceedExit()" ); + + mComponentsRepository->model()->compressData(); + + LOGS_QDEBUG( "logs [UI] <- LogsViewManager::proceedExit()" ); +} + + +// ----------------------------------------------------------------------------- +// 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()" ); + + LOGS_QDEBUG( "logs [UI] Exit delayed" ); + + // Fake exit by sending app to background + mMainWindow.sendAppToBackground(); + + // Set application to default state (recent calls and no dialpad) + activateView( LogsRecentViewId, false, QVariant() ); + mComponentsRepository->recentCallsView()->resetView(); + + 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] Handle exit immediataly" ); + proceedExit(); + } else { + // Just wait for signal from view(s) that exiting can proceed + LOGS_QDEBUG( "logs [UI] Delayed exit handling" ); + } + + 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); + mViewActivationArgs = args; + mViewActivationShowDialpad = showDialpad; + completeViewActivation(); + activated = true; + } + + LOGS_QDEBUG( "logs [UI] <- LogsViewManager::doActivateView()" ); + + return activated; +} + +// ----------------------------------------------------------------------------- +// LogsViewManager::completeViewActivation +// ----------------------------------------------------------------------------- +// +void LogsViewManager::completeViewActivation() +{ + LOGS_QDEBUG_2( "logs [UI] -> LogsViewManager::completeViewActivation(), first", + mFirstActivation ); + if ( mFirstActivation ){ + mFirstActivation = false; + connect( &mMainWindow, SIGNAL(viewReady()), this, SLOT(completeViewActivation()) ); + } else { + disconnect( &mMainWindow, SIGNAL(viewReady()), this, SLOT(completeViewActivation()) ); + LogsBaseView* newView = mViewStack.at(0); + newView->activated(mViewActivationShowDialpad, mViewActivationArgs); + connect( &mMainWindow, SIGNAL( callKeyPressed() ), newView, SLOT( callKeyPressed() ) ); + + // First activation completed, clear counter + mComponentsRepository->model()->clearMissedCallsCounter(); + } + LOGS_QDEBUG( "logs [UI] <- LogsViewManager::completeViewActivation()" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsViewManager::handleOrientationChanged() +{ + LOGS_QDEBUG( "logs [UI] -> LogsViewManager::handleOrientationChanged()" ); + QMetaObject::invokeMethod(mMainWindow.currentView(), "handleOrientationChanged"); + LOGS_QDEBUG( "logs [UI] <- LogsViewManager::handleOrientationChanged()" ); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +//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(window); + LogsViewManager viewManager(window, service); + + // Don't show window yet as app might be started at background + int err = app.exec(); + + HbStyleLoader::unregisterFilePath(":/logslayouts"); + + LOGS_QDEBUG( "logs [UI] <- main()" ) + return err; +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/logsviewmanagerstub.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/logsviewmanagerstub.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,91 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 testResetView(); + 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 testCloseEmptyMenu(); + 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logscomponentrepository.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logscomponentrepository.h Tue May 04 12:39:37 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: +* +*/ +#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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsdetailsview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsdetailsview.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logseffecthandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logseffecthandler.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#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(); + void testStartMoveNotPossibleEffect(); + +private: + + LogsEffectHandler* mEffect; + HbLabel* mLabel; + HbLabel* mLabel2; + HbMainWindow* mMainWindow; +}; + +#endif //UT_LOGSEFFECTHANDLER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmainwindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmainwindow.h Tue May 04 12:39:37 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 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 testSendAppToBackground(); + void testBringAppToForeground(); + +private: + + LogsMainWindow* mMainWindow; +}; + +#endif //UT_LOGSMAINWINDOW_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmatchesview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsmatchesview.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logspageindicator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logspageindicator.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#ifndef UT_LOGSPAGEINDICATOR_H +#define UT_LOGSPAGEINDICATOR_H + + +#include + +class LogsPageIndicator; + +class UT_LogsPageIndicator : 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 testInitialize(); + void testSetActiveItemIndex(); + +private: + + LogsPageIndicator* mIndicator; +}; + +#endif //UT_LOGSPAGEINDICATOR_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logspageindicatoritem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logspageindicatoritem.h Tue May 04 12:39:37 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 UT_LOGSPAGEINDICATORITEM_H +#define UT_LOGSPAGEINDICATORITEM_H + + +#include + +class LogsPageIndicatorItem; + +class UT_LogsPageIndicatorItem : 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 testSetActive(); + void testAnimationFinnished(); + +private: + + LogsPageIndicatorItem* mIndicatorItem; +}; + +#endif //UT_LOGSVIEWMANAGER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsrecentcallsview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsrecentcallsview.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,96 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 testResetView(); + 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsservicehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsservicehandler.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#ifndef UT_LOGSSERVICEHANDLER_H +#define UT_LOGSSERVICEHANDLER_H + + +#include + +class LogsServiceHandler; + +class LogsViewManager; +class LogsMainWindow; + + +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(); + void testStartWithNum(); + +private: + + LogsServiceHandler* mService; + LogsMainWindow* mMainWindow; + LogsViewManager* mLogsViewManager; +}; + +#endif //UT_LOGSSERVICEHANDLER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 testchangeMatchesView(); + void testExitApplication(); + void testAppFocusGained(); + void testStartingWithService(); + void testHandleOrientationChanged(); + void testCompleteViewActivation(); + +private: + + LogsMainWindow* mMainWindow; + LogsViewManager* mLogsViewManager; +}; + +#endif //UT_LOGSVIEWMANAGER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsabstractmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsabstractmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,143 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsabstractmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsabstractmodel.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,96 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscall.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logscontact.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#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(); + +signals: + + void openCompleted(bool modified); + void saveCompleted(bool modified); + +public: //stub data + + //LogsEvent& mEvent; + QString mNumber; + +}; + +#endif // LOGSCONTACT_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsdetailsmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsdetailsmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,141 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsdetailsmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsdetailsmodel.h Tue May 04 12:39:37 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: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsevent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsevent.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,468 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsevent.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsevent.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logseventdata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logseventdata.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,220 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logseventdata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logseventdata.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsfilter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsfilter.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsforegroundwatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsforegroundwatcher.cpp Tue May 04 12:39:37 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 "logsforegroundwatcher.h" + +// ----------------------------------------------------------------------------- +// Currently no other way to monitor app foreground/background switches. +// HbForegroundWatcher might become public at some point which could be then +// used instead. +// ----------------------------------------------------------------------------- +// +LogsForegroundWatcher::LogsForegroundWatcher(QObject* parent) : QObject(parent) +{ +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsForegroundWatcher::HandleGainingForeground() +{ + emit gainingForeground(); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsForegroundWatcher::HandleLosingForeground() +{ + emit losingForeground(); +} + diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsforegroundwatcher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsforegroundwatcher.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 LOGSFOREGROUNDWATCHER_H +#define LOGSFOREGROUNDWATCHER_H + + +#include + +class LogsForegroundWatcher : public QObject +{ + Q_OBJECT + +public: + + LogsForegroundWatcher(QObject* parent = 0); + virtual ~LogsForegroundWatcher(){} + +signals: + void gainingForeground(); + void losingForeground(); + +public: // from MCoeForegroundObserver + void HandleGainingForeground(); + void HandleLosingForeground(); + +}; + +#endif //LOGSFOREGROUNDWATCHER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,119 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmatchesmodel.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,85 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmessage.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,197 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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*/, bool /*resourceControl*/) : + LogsAbstractModel(), mDbConnector(0), mIsCleared(false) +{ + mEmptyModel = false; + mTestIsMarkingNeeded = false; + mTestEventsMarked = false; + mMissedCallsCounterCleared = false; + mRefreshCalled = false; + mCompressCalled = 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::refreshData +// ----------------------------------------------------------------------------- +// +int LogsModel::refreshData() +{ + mRefreshCalled = true; +} + +// ----------------------------------------------------------------------------- +// LogsModel::compressData +// ----------------------------------------------------------------------------- +// +int LogsModel::compressData() +{ + mCompressCalled = true; +} + +// ----------------------------------------------------------------------------- +// 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/logsengine_stub/logsmodel.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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, bool resourceControl = false); + ~LogsModel(); + + bool clearList(LogsModel::ClearType cleartype); + int clearMissedCallsCounter(); + LogsMatchesModel* logsMatchesModel(); + bool markEventsSeen(LogsModel::ClearType cleartype); + int refreshData(); + int compressData(); + +public: // From QAbstractItemModel + + int rowCount(const QModelIndex &parent) const; + QVariant data(const QModelIndex &index, int role) const; + +signals: + + void clearingCompleted(int err); + void markingCompleted(int err); + +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; + bool mRefreshCalled; + bool mCompressCalled; +}; + +#endif //LOGSMODEL_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,122 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 "ut_logspageindicator.h" +#include "ut_logspageindicatoritem.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::testResetView() +{ + // Opened dialpad is closed and text in it is cleared + mBaseView->mDialpad->mIsOpen = true; + mBaseView->mDialpad->mLineEdit->setText("testing"); + mBaseView->resetView(); + QVERIFY( !mBaseView->mDialpad->mIsOpen ); + QVERIFY( mBaseView->mDialpad->mLineEdit->text() == "" ); + + // Text is cleared even if dialpad would be closed + mBaseView->mDialpad->mLineEdit->setText("testingagain"); + mBaseView->resetView(); + QVERIFY( !mBaseView->mDialpad->mIsOpen ); + QVERIFY( mBaseView->mDialpad->mLineEdit->text() == "" ); +} + +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::testCloseEmptyMenu() +{ + LogsRecentCallsView* view = mRepository->recentCallsView(); + + //visible actions exist + QVERIFY( view->menu()->actions().count() > 0 ); + HbStubHelper::setWidgetOpen(true); + view->closeEmptyMenu(); + QVERIFY(HbStubHelper::isWidgetOpen()); + + //no visible actions + foreach (QAction* action, view->menu()->actions()) { + action->setVisible(false); + } + view->closeEmptyMenu(); + QVERIFY(!HbStubHelper::isWidgetOpen()); + + //no actions + HbStubHelper::setWidgetOpen(true); + view->menu()->actions().clear(); + view->closeEmptyMenu(); + QVERIFY(!HbStubHelper::isWidgetOpen()); +} + +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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,153 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +//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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsdetailsview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsdetailsview.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,289 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 +#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 + QVERIFY( LogsDetailsModel::mLastCallName.isEmpty() ); + QVERIFY( !mDetailsView->mDetailsModel ); + mDetailsView->deleteEvent(); + QVERIFY( LogsDetailsModel::mLastCallName.isEmpty() ); + + // Model exists, call to delete event made and view is closed + mViewManager->reset(); + LogsDetailsModel* model = new LogsDetailsModel(); + mDetailsView->mDetailsModel = model; + //simulate "Cancel" button press of messagebox + HbMessageBox().setText(tr("Cancel")); + mDetailsView->deleteEvent(); + QVERIFY( LogsDetailsModel::mLastCallName.isEmpty() ); + + //simulate "Ok" button press of messagebox + HbMessageBox().setText(tr("Ok")); + 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->heading().length() > 0 ); + + // No effect if no contact modify occurred + mDetailsView->mViewName->setHeading(""); + mDetailsView->contactActionCompleted(false); + QVERIFY( mDetailsView->mViewName->heading().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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logseffecthandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logseffecthandler.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,101 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +//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); +} + +void UT_LogsEffectHandler::testStartMoveNotPossibleEffect() +{ + QVERIFY( mEffect->mMoveNotPossibleGroup->state() == QAbstractAnimation::Stopped ); + mEffect->startMoveNotPossibleEffect(*mLabel, false, 0); + QVERIFY( mEffect->mMoveNotPossibleGroup->state() == QAbstractAnimation::Running ); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmainwindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmainwindow.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +//USER +#include "ut_logsmainwindow.h" +#include "logsmainwindow.h" +#include "qthighway_stub_helper.h" +#include "hbstubs_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::testSendAppToBackground() +{ + QtHighwayStubHelper::reset(); + mMainWindow->sendAppToBackground(); + QVERIFY( QtHighwayStubHelper::utilToBackground() ); + QVERIFY( !mMainWindow->isForeground() ); +} + +void UT_LogsMainWindow::testBringAppToForeground() +{ + QtHighwayStubHelper::reset(); + HbStubHelper::reset(); + mMainWindow->bringAppToForeground(); + QVERIFY( HbStubHelper::isWidgetRaised() ); + QVERIFY( mMainWindow->isForeground() ); + + // Subsequent call does not raise more + HbStubHelper::reset(); + mMainWindow->bringAppToForeground(); + QVERIFY( !HbStubHelper::isWidgetRaised() ); + QVERIFY( mMainWindow->isForeground() ); +} + diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,391 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logspageindicator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logspageindicator.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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_logspageindicator.h" +#include "logspageindicator.h" + +//SYSTEM +#include + +void UT_LogsPageIndicator::initTestCase() +{ +} + +void UT_LogsPageIndicator::cleanupTestCase() +{ +} + + +void UT_LogsPageIndicator::init() +{ + mIndicator = new LogsPageIndicator(); +} + +void UT_LogsPageIndicator::cleanup() +{ + delete mIndicator; +} + +void UT_LogsPageIndicator::testInitialize() +{ + QVERIFY(mIndicator->mItems.count() == 0); + QVERIFY(mIndicator->mActiveItemIndex == -1); + + //normal init + mIndicator->initialize(2,1); + QVERIFY(mIndicator->mItems.count() == 2); + QVERIFY(mIndicator->mActiveItemIndex == 1); + + //items count is less then 1 + mIndicator->initialize(0,1); + QVERIFY(mIndicator->mItems.count() == 0); + QVERIFY(mIndicator->mActiveItemIndex == -1); + + //index is out of boundaries + mIndicator->initialize(2,2); + QVERIFY(mIndicator->mItems.count() == 0); + QVERIFY(mIndicator->mActiveItemIndex == -1); +} + +void UT_LogsPageIndicator::testSetActiveItemIndex() +{ + mIndicator->initialize(3,1); + QVERIFY(mIndicator->mItems.count() == 3); + QVERIFY(mIndicator->mActiveItemIndex == 1); + + //index is out of boundaries + mIndicator->setActiveItemIndex(3); + QVERIFY(mIndicator->mActiveItemIndex == 1); + + //invalid index + mIndicator->setActiveItemIndex(-1); + QVERIFY(mIndicator->mActiveItemIndex == 1); + + //valid index + mIndicator->setActiveItemIndex(0); + QVERIFY(mIndicator->mActiveItemIndex == 0); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logspageindicatoritem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logspageindicatoritem.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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_logspageindicatoritem.h" +#include "logspageindicatoritem.h" + +//SYSTEM +#include +#include + +void UT_LogsPageIndicatorItem::initTestCase() +{ +} + +void UT_LogsPageIndicatorItem::cleanupTestCase() +{ +} + + +void UT_LogsPageIndicatorItem::init() +{ + mIndicatorItem = new LogsPageIndicatorItem(); +} + +void UT_LogsPageIndicatorItem::cleanup() +{ + delete mIndicatorItem; +} + +void UT_LogsPageIndicatorItem::testConstructorDestructor() +{ + QVERIFY(!mIndicatorItem->mIsActive); + QVERIFY(mIndicatorItem->graphicsEffect()); + + delete mIndicatorItem; + mIndicatorItem = 0; + mIndicatorItem = new LogsPageIndicatorItem(true); + QVERIFY(mIndicatorItem->mIsActive); +} + +void UT_LogsPageIndicatorItem::testSetActive() +{ + //active state not changed, nothing to do + QVERIFY(!mIndicatorItem->mIsActive); + mIndicatorItem->setActive(false); + QVERIFY(!mIndicatorItem->mIsActive); + + //setting active, animation started + mIndicatorItem->setActive(true); + QVERIFY(mIndicatorItem->mIsActive); + QVERIFY(mIndicatorItem->graphicsEffect()); + QVERIFY(mIndicatorItem->graphicsEffect()->isEnabled()); + + //setting inactive + mIndicatorItem->setActive(false); + QVERIFY(!mIndicatorItem->mIsActive); + QVERIFY(mIndicatorItem->graphicsEffect()); + QVERIFY(mIndicatorItem->graphicsEffect()->isEnabled()); +} + +void UT_LogsPageIndicatorItem::testAnimationFinnished() +{ + QVERIFY(mIndicatorItem->graphicsEffect()); + mIndicatorItem->graphicsEffect()->setEnabled(true); + mIndicatorItem->animationFinished(); + QVERIFY(!mIndicatorItem->graphicsEffect()->isEnabled()); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,773 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 ); + view->activated(false, QVariant(LogsServices::ViewAll)); + QVERIFY( view->mInitialized ); + QVERIFY( view->mFilter ); + QVERIFY( view->mEmptyListLabel ); + 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->mResetted = true; + 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 ); + QVERIFY( !view->mResetted ); +} + +void UT_LogsRecentCallsView::testDeactivated() +{ + mRecentCallsView->deactivated(); +} + +void UT_LogsRecentCallsView::testResetView() +{ + // Opened dialpad is closed and text in it is cleared + QVERIFY( !mRecentCallsView->mResetted ); + mRecentCallsView->resetView(); + QVERIFY( mRecentCallsView->mResetted ); +} + +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; + + //filter is updated with a new one, missed calls marking as seen is not started + //as view was resetted + HbStubHelper::reset(); + mRecentCallsView->mResetted = true; + mRecentCallsView->mListView = new HbListView(); + mRecentCallsView->updateFilter(LogsFilter::Missed); + QVERIFY( mRecentCallsView->mFilter ); + QVERIFY( mRecentCallsView->mFilter->filterType() == LogsFilter::Missed ); + QVERIFY( !HbStubHelper::singleShotTimerActive() ); +} + +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 not possible + // List not empty, starting list animation + LogsRecentCallsView* view = mRepository->recentCallsView(); + view->activated( false, QVariant(LogsServices::ViewAll) ); + view->mCurrentView = LogsServices::ViewAll; + QVERIFY(view->model() && view->model()->rowCount()>0); + view->rightFlick(); + QVERIFY(view->mCurrentView == LogsServices::ViewAll); + QVERIFY(view->mAppearingView == LogsServices::ViewAll); + QVERIFY(view->mEffectHandler->mItemMoveNotPossibleAnimationStart->targetObject() + == view->mListView); + + // Moving left not possible, list empty, starting empty label animation + delete view->mFilter; + view->mFilter = 0; + QVERIFY(!view->model()); + view->rightFlick(); + QVERIFY(view->mCurrentView == LogsServices::ViewAll); + QVERIFY(view->mAppearingView == LogsServices::ViewAll); + QVERIFY(view->mEffectHandler->mItemMoveNotPossibleAnimationStart->targetObject() + == view->mEmptyListLabel); + + // Moving to right possible + view->leftFlick(); + QVERIFY(view->mCurrentView == LogsServices::ViewAll); + QVERIFY(view->mAppearingView == LogsServices::ViewCalled); + + // At rightmost list, moving further not possible + // List empty, starting empty label animation + view->mCurrentView = LogsServices::ViewMissed; + QVERIFY(!view->model()); + view->leftFlick(); + QVERIFY(view->mCurrentView == LogsServices::ViewMissed); + QVERIFY(view->mAppearingView == LogsServices::ViewCalled); + QVERIFY(view->mEffectHandler->mItemMoveNotPossibleAnimationStart->targetObject() + == view->mEmptyListLabel); + + // Moving right not possible, list not empty, starting list animation + LogsModel model; + view->mFilter = new LogsFilter(); + view->mFilter->setSourceModel(&model); + view->leftFlick(); + QVERIFY(view->mCurrentView == LogsServices::ViewMissed); + QVERIFY(view->mAppearingView == LogsServices::ViewCalled); + QVERIFY(view->mEffectHandler->mItemMoveNotPossibleAnimationStart->targetObject() + == view->mListView); + + // 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 + mRecentCallsView->handleExit(); + QVERIFY( mRecentCallsView->isExitAllowed() ); + QVERIFY( !mRecentCallsView->mMarkingMissedAsSeen ); + + // Exit not allowed, marking started + mRecentCallsView->mModel->mTestIsMarkingNeeded = true; + mRecentCallsView->handleExit(); + 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsservicehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsservicehandler.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,107 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +//USER +#include "ut_logsservicehandler.h" +#include "logsservicehandler.h" +#include "qthighway_stub_helper.h" +#include "ut_logsviewmanager.h" +#include "logsviewmanager.h" +#include "logsmainwindow.h" +#include "logscomponentrepository.h" +#include "logsmatchesview.h" + +//SYSTEM +#include + +Q_DECLARE_METATYPE(LogsServices::LogsView) + +void UT_LogsServiceHandler::initTestCase() +{ +} + +void UT_LogsServiceHandler::cleanupTestCase() +{ +} + + +void UT_LogsServiceHandler::init() +{ + mMainWindow = new LogsMainWindow(); + mService = new LogsServiceHandler(*mMainWindow); + + mLogsViewManager = new LogsViewManager(*mMainWindow, *mService); + +} + +void UT_LogsServiceHandler::cleanup() +{ + delete mService; + mService = 0; + delete mMainWindow; + mMainWindow = 0; + delete mLogsViewManager; + mLogsViewManager = 0; + + QtHighwayStubHelper::reset(); +} + +void UT_LogsServiceHandler::testConstructor() +{ + QVERIFY( mService ); + QVERIFY( !mService->mIsAppStartedUsingService ); + QVERIFY( !mService->isStartedUsingService() ); + + QtHighwayStubHelper::setIsService(true); + LogsServiceHandler serviceHandler(*mMainWindow); + 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 + mService->mMainWindow.mForeground = false; + 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( mService->mMainWindow.mForeground ); +} + +void UT_LogsServiceHandler::testStartWithNum() +{ + qRegisterMetaType< LogsServices::LogsView >("LogsServices::LogsView"); + QSignalSpy spy2(mService, SIGNAL(activateView(QString))); + + mService->mMainWindow.mForeground = false; + QVERIFY( mService->startWithNum( (int)LogsServices::ViewReceived, true, + QString("+123456") ) == 0 ); + QVERIFY( spy2.count() == 1 ); + QVERIFY( spy2.at(0).at(0).toString() == QString("+123456")); + QVERIFY( mService->mMainWindow.mForeground ); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,178 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 "logsmatchesview.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(*mMainWindow); + 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() == 0 ); + 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->activateView(LogsRecentViewId) ); + 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 ); + 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::testchangeMatchesView() +{ + //Open Matches view, dialpad visible with predefined number + mLogsViewManager->changeMatchesView(QString("+123456")); + QVERIFY( mLogsViewManager->mMainWindow.currentView() == + mLogsViewManager->mComponentsRepository->matchesView() ); +} + +void UT_LogsViewManager::testExitApplication() +{ + // Exit immediately possible, app sent to bg and data is compressed + HbStubHelper::reset(); + mLogsViewManager->mComponentsRepository->model()->mCompressCalled = false; + mLogsViewManager->mMainWindow.mForeground = true; + mLogsViewManager->exitApplication(); + QVERIFY( mLogsViewManager->mComponentsRepository->model()->mCompressCalled ); + QVERIFY( !mLogsViewManager->mMainWindow.isForeground() ); + + // Exit not yet possible, app sent only to bg + mLogsViewManager->mComponentsRepository->model()->mCompressCalled = false; + mLogsViewManager->mMainWindow.mForeground = true; + mLogsViewManager->mComponentsRepository->recentCallsView()->mMarkingMissedAsSeen = true; + HbStubHelper::reset(); + mLogsViewManager->exitApplication(); + QVERIFY( !mLogsViewManager->mComponentsRepository->model()->mCompressCalled ); + QVERIFY( !mLogsViewManager->mMainWindow.isForeground() ); + + // Simulate view allowing exit after denying it first + mLogsViewManager->mComponentsRepository->recentCallsView()->mMarkingMissedAsSeen = false; + mLogsViewManager->proceedExit(); + QVERIFY( mLogsViewManager->mComponentsRepository->model()->mCompressCalled ); +} + +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(*mMainWindow); + 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(); +} + +void UT_LogsViewManager::testCompleteViewActivation() +{ + // On first activation, wait that view has painted itself once + // before completing activation + QVERIFY(mLogsViewManager->mFirstActivation); + mLogsViewManager->activateView(LogsRecentViewId, true, QVariant()); + QVERIFY(!mLogsViewManager->mFirstActivation); + QVERIFY(mLogsViewManager->mViewActivationShowDialpad); + QVERIFY(!mLogsViewManager->mComponentsRepository->model()->mMissedCallsCounterCleared); + mLogsViewManager->completeViewActivation(); // Simulate paint completion (viewReady signal) + QVERIFY(mLogsViewManager->mComponentsRepository->model()->mMissedCallsCounterCleared); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad.h Tue May 04 12:39:37 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: 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(); + void aboutToOpen(); + +public: + HbLineEdit* mLineEdit; + bool mIsCallButtonEnabled; + bool mIsOpen; +}; + +#endif // DIALPAD_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpad_stub.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,52 @@ +/* +* 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,49 @@ +/*! +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Dialpad key handler. +* +*/ + +#ifndef DIALPADKEYHANDLER_H +#define DIALPADKEYHANDLER_H + +#include + +class Dialpad; +class DialpadVoiceMailboxEventFilter; +class DialpadBluetoothEventFilter; +class HbMainWindow; + +/*! + DialpadKeyHandler + Class provides key handling for dialpad component. + + @code + Dialpad *dialpad = new Dialpad(); + DialpadKeyHandler *keyhandler = new DialpadKeyHandler(dialpad, this); + @endcode + +*/ +class DialpadKeyHandler : public QObject +{ + Q_OBJECT + +public: + explicit DialpadKeyHandler(Dialpad *dialPad, HbMainWindow& mainWindow, QObject *parent = 0); + virtual ~DialpadKeyHandler(); + +private: +}; + +#endif // DIALPADKEYHANDLER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/dialpadkeyhandler_stub.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,30 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "dialpadkeyhandler.h" + +DialpadKeyHandler::DialpadKeyHandler(Dialpad *dialPad, HbMainWindow& mainWindow, QObject *parent) +{ + Q_UNUSED(dialPad); + Q_UNUSED(mainWindow); + Q_UNUSED(parent); +} + +DialpadKeyHandler::~DialpadKeyHandler() +{ +} + diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/stubs/hbapplication.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/hbapplication.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,289 @@ +/* +* 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; +bool testIsWidgetOpen = false; +bool testIsWidgetRaised = false; + +void HbStubHelper::reset() +{ + actionCount = 0; + logsMenuShown = false; + testSingleShotTimer = false; + testQuitCalled = false; + testIsWidgetRaised = 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; +} + + +bool HbStubHelper::isWidgetOpen() +{ + return testIsWidgetOpen; +} + +bool HbStubHelper::isWidgetRaised() +{ + return testIsWidgetRaised; +} + +void HbStubHelper::setWidgetOpen(bool isOpen) +{ + testIsWidgetOpen = isOpen; +} + +bool QGraphicsWidget::close() +{ + testIsWidgetOpen = false; +} + +void QWidget::setVisible(bool visible) +{ + Q_UNUSED(visible); +} + +void QWidget::raise() +{ + testIsWidgetRaised = true; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h Tue May 04 12:39:37 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 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); + static void setWidgetOpen(bool isOpen); + static bool isWidgetOpen(); + static bool isWidgetRaised(); +}; + +#endif diff -r 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/stubs/qthighway_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/qthighway_stub.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,154 @@ +/* +* 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/stubs/qthighway_stub_helper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/qthighway_stub_helper.h Tue May 04 12:39:37 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: +* +*/ + +/** +* 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 000000000000 -r 4a5361db8937 logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,113 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +# + +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/ut_logscomponentrepository.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/ut_logspageindicator.h +HEADERS += inc/ut_logspageindicatoritem.h +HEADERS += ../../inc/logsmainwindow.h +HEADERS += ../../inc/logsviewmanager.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/logspageindicator.h +HEADERS += ../../inc/logspageindicatoritem.h +HEADERS += inc/ut_logsservicehandler.h +HEADERS += logsengine_stub/logscontact.h +HEADERS += logsengine_stub/logsforegroundwatcher.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 += logsengine_stub/logsforegroundwatcher.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/ut_logsservicehandler.cpp +SOURCES += src/ut_logspageindicator.cpp +SOURCES += src/ut_logspageindicatoritem.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/logspageindicator.cpp +SOURCES += ../../src/logspageindicatoritem.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 000000000000 -r 4a5361db8937 logsui/logscntfinder/bwins/logscntfinderu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/bwins/logscntfinderu.def Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,25 @@ +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 000000000000 -r 4a5361db8937 logsui/logscntfinder/eabi/logscntfinderu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/eabi/logscntfinderu.def Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,30 @@ +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 000000000000 -r 4a5361db8937 logsui/logscntfinder/inc/logscntfinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/inc/logscntfinder.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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; + void padWithZeros( QString& token, const QString& source, int padIndex ) 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 ); + bool isProgressivePattern( const QString& pattern ) const; + + + +private: + + QString mCurrentPredictivePattern; + LogsCntEntryList mResults; + QContactManager* mContactManager; + LogsCntEntryList mHistoryEvents; + int mCachedCounter; + + friend class UT_LogsCntFinder; + +}; + +#endif //LOGSCNTFINDER_H diff -r 000000000000 -r 4a5361db8937 logsui/logscntfinder/inc/logspredictivetranslator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/inc/logspredictivetranslator.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/logscntfinder.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/logscntfinder.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,60 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/src/logscntfinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/src/logscntfinder.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,796 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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; +const QChar ZeroSepar('0'); + + +// ----------------------------------------------------------------------------- +// 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 ); + if ( target.length() > 1 && separ == ZeroSepar ) { + QString& first = target[0]; + QString& last = target[target.length()-1]; + padWithZeros( first, source, 0 ); + padWithZeros( last, source, last.length() ); + } + return target; + +} + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::padWithLeadingZeros() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::padWithZeros( QString& token, + const QString& source, int padIndex ) const +{ + const QChar* content = source.data(); + int index = !padIndex ? 0 : source.length()-1; + + while( index >= 0 && index < source.length() ) { + if ( content[ index ] == ZeroSepar ) { + token.insert( padIndex, ZeroSepar ); + index = !padIndex ? index+1 : index-1; + } else { + index = -1; + } + } +} + + + +// ----------------------------------------------------------------------------- +// 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 ) +{ + + LogsPredictiveTranslator* translator = + LogsPredictiveTranslator::instance(); + QMutableListIterator names( nameArray ); + bool hasZeros = pattern.contains( ZeroSepar ); + + //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( hasZeros && patternArray.hasNext() ) { + QString patternItem = patternArray.next(); + names.toFront(); + while( names.hasNext() ) { + LogsCntText& nameItem = names.next(); + int matchSize = translator->startsWith( nameItem.mText, + patternItem, !hasZeros ); + 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 +{ + bool match = false; + + //direct match with phone number is enough + match = mPhoneNumber.text().startsWith( pattern ) || + doSimpleMatch( pattern ); + + if ( !match && pattern.contains( ZeroSepar ) ) { + QStringList patternArray = tokens( pattern, ZeroSepar ); + match = 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 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::isProgressivePattern +// ----------------------------------------------------------------------------- +// +bool LogsCntFinder::isProgressivePattern( const QString& pattern ) const +{ + //"" -> XXX not progressive + //XX -> YY not progressive + //XXX -> YY not progressive + int prevPatternLen = mCurrentPredictivePattern.length(); + return prevPatternLen > 0 && + pattern.length() - prevPatternLen > 0; +} + + +// ----------------------------------------------------------------------------- +// LogsCntFinder::predictiveSearchQuery +// ----------------------------------------------------------------------------- +// +void LogsCntFinder::predictiveSearchQuery( const QString& pattern ) +{ + LOGS_QDEBUG( "logs [FINDER] -> LogsCntFinder::predictiveSearchQuery()" ) + LOGS_QDEBUG_2( "logs [FINDER] pattern= ", pattern ) + + if ( pattern.length() > MaxPredSearchPatternLen ) { + LOGS_QDEBUG( "logs [FINDER] too long pattern. Exit quietly.") + LOGS_QDEBUG( "logs [FINDER] <- LogsCntFinder::predictiveSearchQuery()" ) + return; + } + + //in this point mCurrentPredictivePattern is previous + bool patternIsProgressive = isProgressivePattern( pattern ); + bool resultsAreAllCached = resultsCount() > 0 && + mCachedCounter == resultsCount(); + bool nothingToDo = resultsCount() == 0 && + patternIsProgressive; + + LOGS_QDEBUG_2( "logs [FINDER] patternIsProgressive = ", patternIsProgressive ) + LOGS_QDEBUG_2( "logs [FINDER] resultsAreAllCached = ", resultsAreAllCached ) + LOGS_QDEBUG_2( "logs [FINDER] nothingToDo = ", nothingToDo ) + LOGS_QDEBUG_2( "logs [FINDER] cachedCounter = ", mCachedCounter ) + + mCurrentPredictivePattern = pattern; + + if ( mCurrentPredictivePattern.isEmpty() ) { + qDeleteAll( mResults ); + mResults.clear(); + mCachedCounter = 0; + } else if ( ( patternIsProgressive && + resultsAreAllCached ) || + nothingToDo ) { + 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/src/logspredictivetranslator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/src/logspredictivetranslator.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,153 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include +#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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfmainwindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfmainwindow.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#ifndef 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfmodel.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfsearchresultsview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/inc/lcfsearchresultsview.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,90 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.pkg Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,33 @@ +; 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,48 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +# + +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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/lcfprotoui.qrc Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,5 @@ + + + resources/lcfSearchResultsView.xml + + diff -r 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/resources/lcfsearchResultsView.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/resources/lcfsearchResultsView.xml Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/src/lcfmainwindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/src/lcfmainwindow.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/src/lcfmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/src/lcfmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/lcfprotoui/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/lcfprotoui/src/main.cpp Tue May 04 12:39:37 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: +* +*/ +//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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/pt_logscntfinder/inc/pt_logscntfinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/pt_logscntfinder/inc/pt_logscntfinder.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,73 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 +public: + + inline pt_LogsCntFinder( int samples ) : mSamples(samples) {} + +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(); + void statistics(); + +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; + int mSamples; +}; + + +#endif //UT_CNTSPREFILTERING_H diff -r 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/pt_logscntfinder/pt_logscntfinder.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/pt_logscntfinder/pt_logscntfinder.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,52 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,466 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 + + + +class PtTest +{ +public: + + PtTest( const QString& name ); + void execute( LogsCntFinder& engine ); + void calculateMean(); + void calculateVariance(); + void calculateDeviation(); + void print(); + static QString statHeader(); + +public: + + QString mPattern; + QList mSamples; + float mMean; + float mVariance; + float mStdDeviation; + int mMin; + int mMax; + int mMinSample; + int mMaxSample; + int mResults; + +}; + + +PtTest::PtTest( const QString& name ) +: mPattern(name), + mMean(0.0), + mVariance(0.0), + mStdDeviation(0.0), + mMin(0), + mMax(0), + mMinSample(0), + mMaxSample(0), + mResults(0) +{ + +} + +void PtTest::execute( LogsCntFinder& engine ) +{ + engine.predictiveSearchQuery( QString("") ); + + QTime t; + t.start(); + engine.predictiveSearchQuery( mPattern ); + mSamples.append( t.elapsed()); + mResults += engine.resultsCount(); + //mSamples.append( qrand() / 100000000 ); + //mResults += (100 - mPattern.length() ); + +} + + +void PtTest::calculateMean() +{ + mMin = 0; + mMax = 0; + mMaxSample = 0; + mMinSample = 0; + int sum = 0; + int samplesCount = mSamples.length(); + for( int i = 0; i < samplesCount; i++ ) { + int sample = mSamples[i]; + if ( sample > mMax ) { + mMax = sample; + mMaxSample = i; + } + if ( i == 0 || sample < mMin ) { + mMin = sample; + mMinSample = i; + } + sum += mSamples[i]; + } + mMean = (sum / samplesCount); +} + + +void PtTest::calculateVariance() +{ + int samplesCount = mSamples.length(); + float sumdev = 0.0; + + for( int i = 0; i < samplesCount; ++i ) { + float deviation = mSamples[i] - mMean; + sumdev += (deviation * deviation); + } + + mVariance = (sumdev / (samplesCount - 1)); + +} + +void PtTest::calculateDeviation() +{ + mStdDeviation = sqrt(mVariance); +} + +const int collen = 14; + + +void PtTest::print() +{ + int samplesCount = mSamples.length(); + + //test results samples mean variance deviation max min + qDebug() << mPattern.leftJustified( collen + 3) + + QString::number( mResults / samplesCount ).leftJustified( collen ) + + QString::number( samplesCount ).leftJustified( collen ) + + QString::number( mMean ).leftJustified( collen ) + + QString::number( mVariance ).leftJustified( collen ) + + QString::number( mStdDeviation ).leftJustified( collen ) + + QString::number( mMax ).leftJustified( collen ) + + QString::number( mMaxSample ).leftJustified( collen ) + + QString::number( mMin ).leftJustified( collen ) + + QString::number( mMinSample ).leftJustified( collen ); +} + +QString PtTest::statHeader() +{ + return QString( "query" ).leftJustified( collen + 3 ) + + QString( "results/query" ).leftJustified( collen ) + + QString( "samples" ).leftJustified( collen ) + + QString( "mean" ).leftJustified( collen ) + + QString( "variance" ).leftJustified( collen ) + + QString( "deviation" ).leftJustified( collen ) + + QString( "max" ).leftJustified( collen ) + + QString( "maxSample" ).leftJustified( collen ) + + QString( "min" ).leftJustified( collen ) + + QString( "minSample" ).leftJustified( collen ); + +} + +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( *m_manager ); + + 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.setFirstName(firstname); + contactName.setLastName(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"; + 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"; + + +} + +void pt_LogsCntFinder::statistics() +{ + qDebug() << "=> pt_LogsCntFinder::statistics"; + int results = 0; + int queries = 0; + int ind = mSamples; //samples + QTime t; + + QList tests; + tests.append( PtTest("5") ); + tests.append( PtTest("52") ); + tests.append( PtTest("522") ); + tests.append( PtTest("5220") ); + tests.append( PtTest("522000000000007") ); + tests.append( PtTest("205") ); + tests.append( PtTest("34096") ); + tests.append( PtTest("227264583") ); + tests.append( PtTest("404") ); + tests.append( PtTest("4304") ); + tests.append( PtTest("43043") ); + tests.append( PtTest("227264583788378") ); + tests.append( PtTest("00206") ); + tests.append( PtTest("0705") ); + tests.append( PtTest("12005") ); + tests.append( PtTest("227264583") ); + + t.start(); + + while( ind > 0 ) { + for( int j = 0; j < tests.length(); j++ ) { + tests[j].execute( *m_finder ); + queries++; + } + ind--; + } + + int totalTime = t.elapsed(); + + + for( ind = 0; ind < tests.length(); ind++ ) { + tests[ind].calculateMean(); + tests[ind].calculateVariance(); + tests[ind].calculateDeviation(); + results += tests[ind].mResults; + } + + qDebug("-- Statistics --"); + qDebug("%d queries executed with %d results in %d ms.", + queries, results, totalTime ); + qDebug() << PtTest::statHeader(); + for( ind = 0; ind < tests.length(); ind++ ) { + tests[ind].print(); + } + + qDebug() << "<= pt_LogsCntFinder::statistics"; +} + + +//QTEST_MAIN(pt_LogsCntFinder); // on Emulator + +int main(int argc, char *argv[]) //on HW +{ + int samples = 100; + for (int i=0; i +#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 testPredictiveSearchQueryLogsContacts(); + void testQueryOrder(); + +private: + + + + void createOneContact( + QString firstname, + QString Lastname, + QString phnumber); + QContactFilter::MatchFlags flag(int f); + void createContacts(); + void createContactsForQueryOrder(); + void createContactsForQueryZero(); + void createHistoryEvents(); + void createLogEvent( + QString firstname, + QString Lastname, + QString phnumber); + +private: + QContactManager *m_manager; + LogsCntFinder *m_finder; +}; + + +#endif // ST_LOGSCNTFINDER_H diff -r 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,571 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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("Dim-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.setFirstName(firstname); + contactName.setLastName(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(); + + //There is no recent call in logs UI + //case 1 + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 5 ); + //see half of matched results + //results == for(int i =0;iresultCount() / 2;i++){f->resultAt(i);} + /*QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Maria-Zola")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("Jones")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("Jonn")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString("Ennon"));*/ + + m_finder->predictiveSearchQuery( QString("566") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 5 ); + + //case 2 + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 5 ); + //see all of the matched results + //results == for(int i =0;iresultCount();i++){f->resultAt(i);} + /*QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Maria-Zola")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("Jones")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("Jonn")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString("Ennon")); + QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Una Vivi")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("Kantsak")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("Wilda")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString("Lazar")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("Levis")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString("Augustin Zi")); + */ + + m_finder->predictiveSearchQuery( QString("566") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 5 ); + + //case 3 + m_finder->predictiveSearchQuery( QString("6") ); + QCOMPARE( m_finder->resultsCount(), 3 ); + //see all of matched results + //results == for(int i =0;iresultCount();i++){f->resultAt(i);} + /*QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Maria-Zola")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("Jones")); + QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Nancy")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("Csoma")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("Olga")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString("Baraniktestteste"));*/ + + m_finder->predictiveSearchQuery( QString("69") ); + QCOMPARE( m_finder->resultsCount(), 0 ); + m_finder->predictiveSearchQuery( QString("692") ); + QCOMPARE( m_finder->resultsCount(), 0 ); + m_finder->predictiveSearchQuery( QString("6") ); + QCOMPARE( m_finder->resultsCount(), 3 ); + + //case 4 + + m_finder->predictiveSearchQuery( QString("2") ); + QCOMPARE( m_finder->resultsCount(), 3 ); + //see half of matched results + //results == for(int i =0;iresultCount() / 2;i++){f->resultAt(i);} + /*QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Levis")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("Augustin Zi")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString(""));*/ + + m_finder->predictiveSearchQuery( QString("20") ); + QCOMPARE( m_finder->resultsCount(), 3 ); + m_finder->predictiveSearchQuery( QString("209") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + m_finder->predictiveSearchQuery( QString("20") ); + QCOMPARE( m_finder->resultsCount(), 3 ); + m_finder->predictiveSearchQuery( QString("2") ); + QCOMPARE( m_finder->resultsCount(), 3 ); + +} + +/* 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(0).firstName().at(0).text(), QString("Olga")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("Baraniktestteste")); +} + +//There is recent call in logs, no contacts DB +void st_LogsCntFinder::testPredictiveSearchQueryLogs() +{ + createHistoryEvents(); + + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + + //case 1 + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + //see half of matched results + //results == for(int i =0;iresultCount() / 2;i++){f->resultAt(i);} + /*QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString(""));*/ + + m_finder->predictiveSearchQuery( QString("533") ); + QCOMPARE( m_finder->resultsCount(), 0 ); + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + + //case 2 + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + //see half of matched results + //results == for(int i =0;iresultCount() / 2;i++){f->resultAt(i);} + /*QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString(""));*/ + + m_finder->predictiveSearchQuery( QString("50") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + m_finder->predictiveSearchQuery( QString("503") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + m_finder->predictiveSearchQuery( QString("50") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + +} + +//There is recent call in logs, and contacts DB +void st_LogsCntFinder::testPredictiveSearchQueryLogsContacts() +{ + createHistoryEvents(); + createContacts(); + + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + + //case 1 + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + //see half of matched results + //results == for(int i =0;iresultCount() / 2;i++){f->resultAt(i);} + /*QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString(""));*/ + + m_finder->predictiveSearchQuery( QString("533") ); + QCOMPARE( m_finder->resultsCount(), 0 ); + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + + //case 2 + m_finder->predictiveSearchQuery( QString("5") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + //see half of matched results + //results == for(int i =0;iresultCount() / 2;i++){f->resultAt(i);} + /*QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(0).lastName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(1).firstName().at(0).text(), QString("")); + QCOMPARE(m_finder->resultAt(1).lastName().at(0).text(), QString(""));*/ + + m_finder->predictiveSearchQuery( QString("50") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + m_finder->predictiveSearchQuery( QString("503") ); + QCOMPARE( m_finder->resultsCount(), 1 ); + m_finder->predictiveSearchQuery( QString("50") ); + QCOMPARE( m_finder->resultsCount(), 2 ); + 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 + +#include "qtcontacts_stubs.h" + +ContactQueryResults* ContactQueryResults::mInstance = 0; + +// ----------------------------------------------------------------------------- +// ContactsDB::instance() +// ----------------------------------------------------------------------------- +// +ContactQueryResults* ContactQueryResults::instance() +{ + if ( !mInstance ) { + mInstance = new ContactQueryResults(); + } + return mInstance; +} + +// ----------------------------------------------------------------------------- +// ContactsDB::deleteInstance() +// ----------------------------------------------------------------------------- +// +void ContactQueryResults::deleteInstance() +{ + delete mInstance; + mInstance = 0; +} + +// ----------------------------------------------------------------------------- +// ContactsDB::~ContactQueryResults() +// ----------------------------------------------------------------------------- +// +ContactQueryResults::~ContactQueryResults() +{ + reset(); +} + +// ----------------------------------------------------------------------------- +// ContactsDB::set() +// ----------------------------------------------------------------------------- +// +void ContactQueryResults::set( int count, QString fn, QString ln ) +{ + reset(); + for( int i=0;i& /*parameters*/, + QObject* /*parent*/) +{ + +} + +QContactManager::~QContactManager() +{ + +} + + +QList QContactManager::contactIds( + const QContactFilter& filter, + const QList& /*sortOrders*/) const +{ + const QContactDetailFilter& df = + static_cast( filter ); + + QList list; + ContactQueryResults* resultSet = ContactQueryResults::instance(); + + for( int i=0;icontacts();i++) { + list.append( i + 1 ); + } + resultSet->allResultsAdded(); + + 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 +{ + ContactQueryResults* results = ContactQueryResults::instance(); + + if ( definitionId == QContactName::DefinitionName ){ + QContactName name; + QContactLocalId id = localId(); + name.setValue(QContactName::FieldFirst, results->firstNameAt( (int) id-1 ) ); + name.setValue(QContactName::FieldLast, results->lastNameAt( (int) id-1 ) ); + 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/stubs/qtcontacts_stubs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/stubs/qtcontacts_stubs.h Tue May 04 12:39:37 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: +* +*/ + +#ifndef QTCONTACTSDB_H +#define QTCONTACTSDB_H + +#include +#include + +class ContactQueryResults : public QObject +{ + Q_OBJECT + +public: + + static ContactQueryResults* instance(); + static void deleteInstance(); + + ~ContactQueryResults(); + + void set( int count, QString fn = QString("John"), + QString ln = QString("Malkovich") ); + void reset(); + const QString& firstNameAt( int index ) const; + const QString& lastNameAt( int index ) const; + int contacts() const; + inline void allResultsAdded() {emit resultsAdded();} + +signals: + + void resultsAdded(); + +private: + + inline explicit ContactQueryResults() {} + + +private: + + static ContactQueryResults* mInstance; + QStringList mDB; + + +}; + +#endif //QTCONTACTSDB_H + + diff -r 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logscntentry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logscntentry.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,63 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logscntfinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logscntfinder.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,63 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 ContactQueryResults; + +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; + ContactQueryResults* mCntResults; + +}; + + +#endif //UT_LOGSCNTFINDER_H diff -r 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logspredictivetranslator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/inc/ut_logspredictivetranslator.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/ut_logscntfinder/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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->setHighlights( QString( "50" ) ); + QVERIFY( mEntry->firstName()[0].highlights() == 0); + QVERIFY( mEntry->firstName()[1].highlights() == 1); + QVERIFY( mEntry->lastName()[0].highlights() == 1); + + mEntry->setHighlights( QString( "05" ) ); + QVERIFY( mEntry->firstName()[0].highlights() == 0); + QVERIFY( mEntry->firstName()[1].highlights() == 1); + QVERIFY( mEntry->lastName()[0].highlights() == 1); + + mEntry->setFirstName( QString( "John 0John" ) ); + mEntry->setLastName( QString( "Malkovich" ) ); + mEntry->setHighlights( QString( "05" ) ); + + QVERIFY( mEntry->firstName()[0].highlights() == 1); + QVERIFY( mEntry->firstName()[1].highlights() == 2); + QVERIFY( mEntry->lastName()[0].highlights() == 0); + + mEntry->setHighlights( QString( "0506" ) ); + QVERIFY( mEntry->firstName()[0].highlights() == 0); + QVERIFY( mEntry->firstName()[1].highlights() == 2); + QVERIFY( mEntry->lastName()[0].highlights() == 1); + + mEntry->setHighlights( QString( "506" ) ); + QVERIFY( mEntry->firstName()[0].highlights() == 1); + QVERIFY( mEntry->firstName()[1].highlights() == 0); + QVERIFY( mEntry->lastName()[0].highlights() == 1); + + mEntry->setHighlights( QString( "5060" ) ); + QVERIFY( mEntry->firstName()[0].highlights() == 1); + QVERIFY( mEntry->firstName()[1].highlights() == 0); + QVERIFY( mEntry->lastName()[0].highlights() == 0); + + mEntry->setHighlights( QString( "05060" ) ); + QVERIFY( mEntry->firstName()[0].highlights() == 0); + QVERIFY( mEntry->firstName()[1].highlights() == 2); + QVERIFY( mEntry->lastName()[0].highlights() == 0); + + mEntry->setHighlights( QString( "050506" ) ); + QVERIFY( mEntry->firstName()[0].highlights() == 1); + QVERIFY( mEntry->firstName()[1].highlights() == 2); + QVERIFY( mEntry->lastName()[0].highlights() == 1); + + mEntry->setPhoneNumber( QString( "+1234567" ) ); + QVERIFY( mEntry->phoneNumber().text() == QString( "+1234567" ) ); + mEntry->setHighlights( QString( "+12" ) ); + QVERIFY( mEntry->phoneNumber().mHighlights == 3 ); + + mEntry->setPhoneNumber( QString( "1234567" ) ); + QVERIFY( mEntry->phoneNumber().text() == QString( "1234567" ) ); + mEntry->setHighlights( QString( "+12" ) ); + QVERIFY( mEntry->phoneNumber().mHighlights == 0 ); + + mEntry->setHighlights( QString( "12" ) ); + QVERIFY( mEntry->phoneNumber().mHighlights == 2 ); + + mEntry->setFirstName( QString( "Alice 028 Ming" ) ); + mEntry->setHighlights( QString( "028" ) ); + QVERIFY( mEntry->firstName()[0].highlights() == 0); + QVERIFY( mEntry->firstName()[1].highlights() == 3); + QVERIFY( mEntry->firstName()[2].highlights() == 0); + QVERIFY( mEntry->lastName()[0].highlights() == 0); + +} + +void UT_LogsCntEntry::testSetPhoneNumber() +{ + mEntry->setPhoneNumber( QString( "1234567" ) ); + QVERIFY( mEntry->phoneNumber().text() == QString( "1234567" ) ); + QVERIFY( mEntry->phoneNumber().mTranslatedText == QString( "" ) ); + QVERIFY( mEntry->phoneNumber().mHighlights == 0 ); + + mEntry->setPhoneNumber( QString( "+1234567" ) ); + QVERIFY( mEntry->phoneNumber().text() == QString( "+1234567" ) ); + + mEntry->setPhoneNumber( QString( "#1234567" ) ); + QVERIFY( mEntry->phoneNumber().text() == QString( "#1234567" ) ); + + mEntry->setPhoneNumber( QString( "*1234567" ) ); + QVERIFY( mEntry->phoneNumber().text() == QString( "*1234567" ) ); + + mEntry->setPhoneNumber( QString( "*12+345#67" ) ); + QVERIFY( mEntry->phoneNumber().text() == QString( "*12+345#67" ) ); + +} + +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" ) ) ); + QVERIFY( mEntry->match( QString( "0505" ) ) ); + QVERIFY( mEntry->match( QString( "05005" ) ) ); + QVERIFY( mEntry->match( QString( "6005" ) ) ); + QVERIFY( !mEntry->match( QString( "05050" ) ) ); + QVERIFY( !mEntry->match( QString( "00505" ) ) ); + QVERIFY( !mEntry->match( QString( "005050" ) ) ); + QVERIFY( mEntry->match( QString( "0506" ) ) ); + QVERIFY( mEntry->match( QString( "050506" ) ) ); + + mEntry->setPhoneNumber( QString( "+20298457698576" ) ); + mEntry->setFirstName( QString( "John" ) ); + mEntry->setLastName( QString( "Malkovich" ) ); + + QVERIFY( mEntry->match( QString( "+202" ) ) ); + QVERIFY( !mEntry->match( QString( "#202" ) ) ); + QVERIFY( !mEntry->match( QString( "*202" ) ) ); + QVERIFY( !mEntry->match( QString( "202" ) ) ); + QVERIFY( !mEntry->match( QString( "+202#98" ) ) ); + + QVERIFY( mEntry->match( QString( "50" ) ) ); + QVERIFY( mEntry->match( QString( "05" ) ) ); + QVERIFY( mEntry->match( QString( "506" ) ) ); + + +} + + diff -r 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logscntfinder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logscntfinder.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,431 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 "qtcontacts_stubs.h" +#include +#include + +#define CACHE_ALL_RESULTS()\ + for( int i=0;iresultsCount();i++) {\ + mFinder->resultAt( i );\ + } + + +void UT_LogsCntFinder::initTestCase() +{ +} + +void UT_LogsCntFinder::cleanupTestCase() +{ +} + + +void UT_LogsCntFinder::init() +{ + mCntResults = ContactQueryResults::instance(); + mFinder = new LogsCntFinder(); +} + +void UT_LogsCntFinder::cleanup() +{ + delete mFinder; + mFinder = 0; + ContactQueryResults::deleteInstance(); + mCntResults = 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 queryReadySpy(mFinder, SIGNAL(queryReady() ) ); + QSignalSpy resultsAddedSpy(mCntResults, SIGNAL(resultsAdded() ) ); + + int resultsCount = 0; + LogsCntEntryHandle* handle1 = (LogsCntEntryHandle*)1; + LogsCntEntryHandle* handle2 = (LogsCntEntryHandle*)2; + + LogsCntEntry* entry1 = new LogsCntEntry( *handle1,0 ); + entry1->setFirstName( QString("Tim Roth") ); + entry1->setAvatarPath( QString("c:\\data\\images\\logstest1.jpg") ); + mFinder->insertEntry( 0, entry1 ); + QCOMPARE( mFinder->mHistoryEvents.count(), 1 ); + + LogsCntEntry* entry2 = new LogsCntEntry( *handle2,0 ); + entry2->setFirstName( QString("Kai") ); + entry2->setLastName( QString("Öistämö") ); + entry2->setAvatarPath( QString("c:\\data\\images\\logstest2.jpg") ); + mFinder->insertEntry( 0, entry2 ); + QVERIFY( mFinder->mHistoryEvents.count() == 2 ); + QCOMPARE( mFinder->mCachedCounter, 0 ); + + mCntResults->set( 9 );//John1 Malkovich1 ... + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("5") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QVERIFY( mFinder->mCurrentPredictivePattern == QString("5") ); + QCOMPARE( mFinder->resultsCount(), 1 + 9 ); + QVERIFY( mFinder->mResults[0]->isCached() ); + QVERIFY( mFinder->mResults[0]->handle() == handle2 ); + QVERIFY( mFinder->mResults[0]->firstName()[0].text() == QString("Kai") ); + QVERIFY( mFinder->mResults[0]->firstName()[0].highlights() == 1 ); + QVERIFY( mFinder->mResults[0]->avatarPath() == QString("c:\\data\\images\\logstest2.jpg") ); + QVERIFY( !mFinder->mResults[1]->isCached() ); + QVERIFY( mFinder->mResults[1]->handle() == 0 ); + QVERIFY( mFinder->mResults[1]->contactId() == 1 ); + QCOMPARE( mFinder->mCachedCounter, 1 ); + + const LogsCntEntry* firstE = &mFinder->resultAt( 1 ); + QCOMPARE( mFinder->mCachedCounter, 2 ); + QVERIFY( mFinder->mResults[1]->firstName()[0].text() == QString("John1") ); + QVERIFY( mFinder->mResults[1]->firstName()[0].highlights() == 1 ); + + + mCntResults->set( 9 );//John1 Malkovich1 ... + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("56") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->resultsCount(), 0 + 9 ); + QVERIFY( mFinder->mResults[0]->isCached() ); + QVERIFY( mFinder->mResults[0]->handle() == 0 ); + QVERIFY( mFinder->mResults[0]->firstName()[0].text() == QString("John1") ); + QVERIFY( mFinder->mResults[0]->firstName()[0].highlights() == 2 ); + QVERIFY( &mFinder->resultAt(0) == firstE ); + QCOMPARE( mFinder->mCachedCounter, 1 ); + + + mCntResults->set( 0 );//no match + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("562") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->resultsCount(), 0 ); + QCOMPARE( mFinder->mCachedCounter, 0 ); + + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("5627") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 0 ); + QCOMPARE( mFinder->resultsCount(), 0 ); + QCOMPARE( mFinder->mCachedCounter, 0 ); + + mCntResults->set( 9 );//John1 Malkovich1 ... + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("56") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->resultsCount(), 0 + 9 ); + QVERIFY( !mFinder->mResults[0]->isCached() ); + QVERIFY( mFinder->mResults[0]->handle() == 0 ); + QVERIFY( mFinder->mResults[0]->contactId() == 1 ); + //QVERIFY( mFinder->mResults[0] != firstE ); might be the same + QCOMPARE( mFinder->mCachedCounter, 0 ); + + mCntResults->set( 9 );//John1 Malkovich1 ... + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("5") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->resultsCount(), 1 + 9 ); + QVERIFY( mFinder->mResults[0]->isCached() ); + QVERIFY( mFinder->mResults[0]->handle() == handle2 ); + QVERIFY( mFinder->mResults[0]->firstName()[0].text() == QString("Kai") ); + QVERIFY( mFinder->mResults[0]->firstName()[0].highlights() == 1 ); + QVERIFY( !mFinder->mResults[1]->isCached() ); + QVERIFY( mFinder->mResults[1]->contactId() == 1 ); + QCOMPARE( mFinder->mCachedCounter, 1 ); + + CACHE_ALL_RESULTS(); + QCOMPARE( mFinder->mCachedCounter, mFinder->resultsCount() ); + + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("56") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 0 ); + QCOMPARE( mFinder->resultsCount(), 0 + 9 ); + QVERIFY( mFinder->mResults[0]->isCached() ); + QVERIFY( mFinder->mResults[0]->handle() == 0 ); + QVERIFY( mFinder->mResults[0]->firstName()[0].text() == QString("John1") ); + QVERIFY( mFinder->mResults[0]->firstName()[0].highlights() == 2 ); + QCOMPARE( mFinder->mCachedCounter, 9 ); + + mCntResults->set( 9 );//same results ( contact ids ) + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("5") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->resultsCount(), 1 + 9 ); + QVERIFY( mFinder->mResults[0]->isCached() ); + QVERIFY( mFinder->mResults[0]->handle() == handle2 ); + QVERIFY( mFinder->mResults[0]->firstName()[0].text() == QString("Kai") ); + QVERIFY( mFinder->mResults[0]->firstName()[0].highlights() == 1 ); + //althoug had to go to db, contact ids were reused from prev seacrh + QVERIFY( mFinder->mResults[1]->isCached() ); + QVERIFY( mFinder->mResults[1]->handle() == 0 ); + QVERIFY( mFinder->mResults[1]->firstName()[0].text() == QString("John1") ); + QVERIFY( mFinder->mResults[1]->firstName()[0].highlights() == 1 ); + QCOMPARE( mFinder->mCachedCounter, 10 ); + + //refresh + mCntResults->set( 9 ); + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( mFinder->mCurrentPredictivePattern ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->resultsCount(), 1 + 9 ); + + //reset + mCntResults->set( 9 ); + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 0 ); + QCOMPARE( mFinder->resultsCount(),0 ); + QCOMPARE( mFinder->mCachedCounter, 0 ); + + //15 digits query + mCntResults->set( 9 ); + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("123456789112345" ) ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->mCurrentPredictivePattern.length(), 15 ); + int resCount = mFinder->resultsCount(); + QCOMPARE( resCount, 9 ); + + //15 digits query + mCntResults->set( 9 ); + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("222222222222222" ) ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->mCurrentPredictivePattern.length(), 15 ); + resCount = mFinder->resultsCount(); + QCOMPARE( resCount, 9 ); + + //16 digits query + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("1234567891123456") ); + QCOMPARE( queryReadySpy.count(), 0 ); + QCOMPARE( resultsAddedSpy.count(), 0 ); + QCOMPARE( mFinder->mCurrentPredictivePattern.length(), 15 ); + QCOMPARE( mFinder->resultsCount(), resCount ); + + //20 digits query + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("12345678911234567891") ); + QCOMPARE( queryReadySpy.count(), 0 ); + QCOMPARE( resultsAddedSpy.count(), 0 ); + QCOMPARE( mFinder->mCurrentPredictivePattern.length(), 15 ); + QCOMPARE( mFinder->resultsCount(), resCount ); + + //step 1: if query is "20", this is matched (OK) + //step 2: if query is "206", this is matched (OK) + //Step 3: remove 6 in query and query "20", this is matched (OK) + + qDeleteAll( mFinder->mHistoryEvents ); + mFinder->mHistoryEvents.clear(); + mFinder->predictiveSearchQuery( QString("") ); + + mCntResults->set( 1, QString("Alice 028"), QString("Ming") ); + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("20") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->resultsCount(), 1 ); + + CACHE_ALL_RESULTS(); + QCOMPARE( mFinder->mCachedCounter, mFinder->resultsCount() ); + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("206") ); + QCOMPARE( queryReadySpy.count(), 1); + QCOMPARE( resultsAddedSpy.count(), 0 ); + QCOMPARE( mFinder->resultsCount(), 1 ); + + queryReadySpy.clear(); + resultsAddedSpy.clear(); + + mFinder->predictiveSearchQuery( QString("20") ); + QCOMPARE( queryReadySpy.count(), 1 ); + QCOMPARE( resultsAddedSpy.count(), 1 ); + QCOMPARE( mFinder->resultsCount(), 1 ); + + +} + +void UT_LogsCntFinder::testResultAt() +{ + mCntResults->set( 9 , QString( "first"), QString( "last") ); + + 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") ); + QVERIFY( e.lastName()[0].text() == QString("last1") ); + QVERIFY( e.speedDial() == QString("") ); + QVERIFY( e.phoneNumber().text() == QString("555789987") );//stub + QVERIFY( e.phoneNumber().highlights() == 1 ); + QVERIFY( e.avatarPath() != QString("") ); + 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 ); + +} + +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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,180 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include "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" ) ); + QCOMPARE( mTranslator->translate( QString( "+1234567890" ) ) ,QString( "11234567890" ) ); + QCOMPARE( mTranslator->translate( QString( "#1234567890" ) ), QString( "11234567890" ) ); + QCOMPARE( mTranslator->translate( QString( "++##" ) ), QString( "1111" ) ); + QCOMPARE( mTranslator->translate( QString( "-+##" ) ), QString( "1111" ) ); + QCOMPARE( mTranslator->translate( QString( "/+##" ) ), QString( "1111" ) ); + QCOMPARE( mTranslator->translate( QString( "*+##" ) ), QString( "1111" ) ); + + + 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 000000000000 -r 4a5361db8937 logsui/logscntfinder/tsrc/ut_logscntfinder/ut_logscntfinder.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/ut_logscntfinder.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,60 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 +INCLUDEPATH += . + +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 +HEADERS += ../stubs/qtcontacts_stubs.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 000000000000 -r 4a5361db8937 logsui/logsengine/bwins/logsengineu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/bwins/logsengineu.def Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,59 @@ +EXPORTS + ?time@LogsEvent@@QBE?AVQDateTime@@XZ @ 1 NONAME ; class QDateTime LogsEvent::time(void) const + ??0LogsCustomFilter@@QAE@XZ @ 2 NONAME ; LogsCustomFilter::LogsCustomFilter(void) + ?clearEvents@LogsCustomFilter@@QAE_NXZ @ 3 NONAME ; bool LogsCustomFilter::clearEvents(void) + ?ALS@LogsEvent@@QBE_NXZ @ 4 NONAME ; bool LogsEvent::ALS(void) const + ?updateExisting@LogsContact@@QAE_NXZ @ 5 NONAME ; bool LogsContact::updateExisting(void) + ??0LogsModel@@QAE@W4LogsModelType@0@_N@Z @ 6 NONAME ; LogsModel::LogsModel(enum LogsModel::LogsModelType, bool) + ?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) + ?predictiveSearchStatus@LogsModel@@QAEHXZ @ 13 NONAME ; int LogsModel::predictiveSearchStatus(void) + ?duration@LogsEvent@@QBEHXZ @ 14 NONAME ; int LogsEvent::duration(void) const + ?contactLocalId@LogsEvent@@QBEIXZ @ 15 NONAME ; unsigned int LogsEvent::contactLocalId(void) const + ??1LogsMatchesModel@@UAE@XZ @ 16 NONAME ; LogsMatchesModel::~LogsMatchesModel(void) + ?open@LogsContact@@QAE_NXZ @ 17 NONAME ; bool LogsContact::open(void) + ?logId@LogsEvent@@QBEHXZ @ 18 NONAME ; int LogsEvent::logId(void) const + ?call@LogsCall@@QAEXW4CallType@1@@Z @ 19 NONAME ; void LogsCall::call(enum LogsCall::CallType) + ?allowedCallTypes@LogsCall@@QAE?AV?$QList@W4CallType@LogsCall@@@@XZ @ 20 NONAME ; class QList LogsCall::allowedCallTypes(void) + ?callToNumber@LogsCall@@SAXW4CallType@1@ABVQString@@I@Z @ 21 NONAME ; void LogsCall::callToNumber(enum LogsCall::CallType, class QString const &, unsigned int) + ?setContactId@LogsCustomFilter@@QAEXI@Z @ 22 NONAME ; void LogsCustomFilter::setContactId(unsigned int) + ??1LogsModel@@UAE@XZ @ 23 NONAME ; LogsModel::~LogsModel(void) + ?remoteParty@LogsEvent@@QBEABVQString@@XZ @ 24 NONAME ; class QString const & LogsEvent::remoteParty(void) const + ?compressData@LogsModel@@QAEHXZ @ 25 NONAME ; int LogsModel::compressData(void) + ?addNew@LogsContact@@QAE_NXZ @ 26 NONAME ; bool LogsContact::addNew(void) + ?isRead@LogsEvent@@QBE_NXZ @ 27 NONAME ; bool LogsEvent::isRead(void) const + ?ringDuration@LogsEvent@@QBEHXZ @ 28 NONAME ; int LogsEvent::ringDuration(void) const + ?markEventsSeen@LogsCustomFilter@@QAE_NXZ @ 29 NONAME ; bool LogsCustomFilter::markEventsSeen(void) + ??1LogsDetailsModel@@UAE@XZ @ 30 NONAME ; LogsDetailsModel::~LogsDetailsModel(void) + ?number@LogsEvent@@QBEABVQString@@XZ @ 31 NONAME ; class QString const & LogsEvent::number(void) const + ?logsMatchesModel@LogsModel@@QAEPAVLogsMatchesModel@@XZ @ 32 NONAME ; class LogsMatchesModel * LogsModel::logsMatchesModel(void) + ??1LogsFilter@@UAE@XZ @ 33 NONAME ; LogsFilter::~LogsFilter(void) + ??1LogsMessage@@UAE@XZ @ 34 NONAME ; LogsMessage::~LogsMessage(void) + ?logsMatches@LogsMatchesModel@@QAEXABVQString@@@Z @ 35 NONAME ; void LogsMatchesModel::logsMatches(class QString const &) + ?setPredictiveSearch@LogsModel@@QAEH_N@Z @ 36 NONAME ; int LogsModel::setPredictiveSearch(bool) + ?duplicates@LogsEvent@@QBEHXZ @ 37 NONAME ; int LogsEvent::duplicates(void) const + ?getNumberForCalling@LogsEvent@@QAE?AVQString@@XZ @ 38 NONAME ; class QString LogsEvent::getNumberForCalling(void) + ?createContact@LogsMatchesModel@@QAEPAVLogsContact@@ABVQString@@@Z @ 39 NONAME ; class LogsContact * LogsMatchesModel::createContact(class QString const &) + ?direction@LogsEvent@@QBE?AW4LogsDirection@1@XZ @ 40 NONAME ; enum LogsEvent::LogsDirection LogsEvent::direction(void) const + ?refreshData@LogsModel@@QAEHXZ @ 41 NONAME ; int LogsModel::refreshData(void) + ?clearEvent@LogsDetailsModel@@QAEXXZ @ 42 NONAME ; void LogsDetailsModel::clearEvent(void) + ?clearMissedCallsCounter@LogsModel@@QAEHXZ @ 43 NONAME ; int LogsModel::clearMissedCallsCounter(void) + ?filterType@LogsFilter@@QBE?AW4FilterType@1@XZ @ 44 NONAME ; enum LogsFilter::FilterType LogsFilter::filterType(void) const + ?setPredictiveSearch@LogsMatchesModel@@QAEH_N@Z @ 45 NONAME ; int LogsMatchesModel::setPredictiveSearch(bool) + ??1LogsEvent@@UAE@XZ @ 46 NONAME ; LogsEvent::~LogsEvent(void) + ?setMaxSize@LogsFilter@@QAEXH@Z @ 47 NONAME ; void LogsFilter::setMaxSize(int) + ?initiateCallback@LogsCall@@QAEXXZ @ 48 NONAME ; void LogsCall::initiateCallback(void) + ??1LogsCustomFilter@@UAE@XZ @ 49 NONAME ; LogsCustomFilter::~LogsCustomFilter(void) + ?sendMessageToNumber@LogsMessage@@SA_NABVQString@@0I@Z @ 50 NONAME ; bool LogsMessage::sendMessageToNumber(class QString const &, class QString const &, unsigned int) + ?defaultCallType@LogsCall@@QAE?AW4CallType@1@XZ @ 51 NONAME ; enum LogsCall::CallType LogsCall::defaultCallType(void) + ?predictiveSearchStatus@LogsMatchesModel@@QAEHXZ @ 52 NONAME ; int LogsMatchesModel::predictiveSearchStatus(void) + ?eventType@LogsEvent@@QBE?AW4LogsEventType@1@XZ @ 53 NONAME ; enum LogsEvent::LogsEventType LogsEvent::eventType(void) const + ??1LogsCall@@UAE@XZ @ 54 NONAME ; LogsCall::~LogsCall(void) + ?clearList@LogsModel@@QAE_NW4ClearType@1@@Z @ 55 NONAME ; bool LogsModel::clearList(enum LogsModel::ClearType) + ??1LogsContact@@UAE@XZ @ 56 NONAME ; LogsContact::~LogsContact(void) + ?clearType@LogsFilter@@QBE?AW4ClearType@LogsModel@@XZ @ 57 NONAME ; enum LogsModel::ClearType LogsFilter::clearType(void) const + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/eabi/logsengineu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/eabi/logsengineu.def Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,81 @@ +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 + _ZN11LogsMessage19sendMessageToNumberERK7QStringS2_j @ 15 NONAME + _ZN11LogsMessageD0Ev @ 16 NONAME + _ZN11LogsMessageD1Ev @ 17 NONAME + _ZN11LogsMessageD2Ev @ 18 NONAME + _ZN16LogsCustomFilter11clearEventsEv @ 19 NONAME + _ZN16LogsCustomFilter12setContactIdEj @ 20 NONAME + _ZN16LogsCustomFilter14markEventsSeenEv @ 21 NONAME + _ZN16LogsCustomFilterC1Ev @ 22 NONAME + _ZN16LogsCustomFilterC2Ev @ 23 NONAME + _ZN16LogsCustomFilterD0Ev @ 24 NONAME + _ZN16LogsCustomFilterD1Ev @ 25 NONAME + _ZN16LogsCustomFilterD2Ev @ 26 NONAME + _ZN16LogsDetailsModel10clearEventEv @ 27 NONAME + _ZN16LogsDetailsModel20getNumberToClipboardEv @ 28 NONAME + _ZN16LogsDetailsModelD0Ev @ 29 NONAME + _ZN16LogsDetailsModelD1Ev @ 30 NONAME + _ZN16LogsDetailsModelD2Ev @ 31 NONAME + _ZN16LogsMatchesModel11logsMatchesERK7QString @ 32 NONAME + _ZN16LogsMatchesModel13createContactERK7QString @ 33 NONAME + _ZN16LogsMatchesModel19setPredictiveSearchEb @ 34 NONAME + _ZN16LogsMatchesModel22predictiveSearchStatusEv @ 35 NONAME + _ZN16LogsMatchesModelD0Ev @ 36 NONAME + _ZN16LogsMatchesModelD1Ev @ 37 NONAME + _ZN16LogsMatchesModelD2Ev @ 38 NONAME + _ZN8LogsCall12callToNumberENS_8CallTypeERK7QStringj @ 39 NONAME + _ZN8LogsCall15defaultCallTypeEv @ 40 NONAME + _ZN8LogsCall16allowedCallTypesEv @ 41 NONAME + _ZN8LogsCall16initiateCallbackEv @ 42 NONAME + _ZN8LogsCall4callENS_8CallTypeE @ 43 NONAME + _ZN8LogsCallD0Ev @ 44 NONAME + _ZN8LogsCallD1Ev @ 45 NONAME + _ZN8LogsCallD2Ev @ 46 NONAME + _ZN9LogsEvent19getNumberForCallingEv @ 47 NONAME + _ZN9LogsEventC1ERKS_ @ 48 NONAME + _ZN9LogsEventC2ERKS_ @ 49 NONAME + _ZN9LogsEventD0Ev @ 50 NONAME + _ZN9LogsEventD1Ev @ 51 NONAME + _ZN9LogsEventD2Ev @ 52 NONAME + _ZN9LogsModel11refreshDataEv @ 53 NONAME + _ZN9LogsModel12compressDataEv @ 54 NONAME + _ZN9LogsModel14markEventsSeenENS_9ClearTypeE @ 55 NONAME + _ZN9LogsModel16logsMatchesModelEv @ 56 NONAME + _ZN9LogsModel19setPredictiveSearchEb @ 57 NONAME + _ZN9LogsModel22predictiveSearchStatusEv @ 58 NONAME + _ZN9LogsModel23clearMissedCallsCounterEv @ 59 NONAME + _ZN9LogsModel9clearListENS_9ClearTypeE @ 60 NONAME + _ZN9LogsModelC1ENS_13LogsModelTypeEb @ 61 NONAME + _ZN9LogsModelC2ENS_13LogsModelTypeEb @ 62 NONAME + _ZN9LogsModelD0Ev @ 63 NONAME + _ZN9LogsModelD1Ev @ 64 NONAME + _ZN9LogsModelD2Ev @ 65 NONAME + _ZNK10LogsFilter10filterTypeEv @ 66 NONAME + _ZNK10LogsFilter9clearTypeEv @ 67 NONAME + _ZNK9LogsEvent10duplicatesEv @ 68 NONAME + _ZNK9LogsEvent11remotePartyEv @ 69 NONAME + _ZNK9LogsEvent12ringDurationEv @ 70 NONAME + _ZNK9LogsEvent14contactLocalIdEv @ 71 NONAME + _ZNK9LogsEvent3ALSEv @ 72 NONAME + _ZNK9LogsEvent4timeEv @ 73 NONAME + _ZNK9LogsEvent5logIdEv @ 74 NONAME + _ZNK9LogsEvent6isReadEv @ 75 NONAME + _ZNK9LogsEvent6numberEv @ 76 NONAME + _ZNK9LogsEvent8durationEv @ 77 NONAME + _ZNK9LogsEvent9directionEv @ 78 NONAME + _ZNK9LogsEvent9eventTypeEv @ 79 NONAME + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/inc/logscall.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/inc/logscall.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/inc/logscommondata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/inc/logscommondata.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/inc/logscontact.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/inc/logscontact.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,143 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/inc/logsdetailsmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/inc/logsdetailsmodel.h Tue May 04 12:39:37 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: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/logsengine/inc/logsengdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/inc/logsengdefs.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#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_callduration"; +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; + +const int logsReadSizeCompressEnabled = 20; +const int logsReadSizeUndefined = -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 000000000000 -r 4a5361db8937 logsui/logsengine/inc/logseventdata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/inc/logseventdata.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,134 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/logsengine/inc/logsmatchesmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/inc/logsmatchesmodel.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,177 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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); + + /** + * Returns cenrep key status of predictive search feature. + * @return 0 - feature is permanently off and can't be turned on, + * 1 - feature is on + * 2 - feature is temporarily off and can be turned on + * negative value indicates some error in fetching the key + */ + LOGSENGINE_EXPORT int predictiveSearchStatus(); + + /** + * Allows to modify cenrep key value of predictive search features. + * However, this function can't be used if feature is set permanently off + * (see predictiveSearchStatus()) + * @param enabled, specify whether cenrep key will be set to 1 or 2 + * @ return 0 if cenrep key value modified succesfully, + * -1 in case of some error + */ + LOGSENGINE_EXPORT int setPredictiveSearch(bool enabled); + +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; + + +private slots: + + void queryReady(); + void updateContactIcon(int index); + + 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(); + void forceSearchQuery(); + +private: + + void initPredictiveSearch(); + + LogsMatchesModelItemContainer* 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; + bool mSearchEnabled; + int mResultCount; + +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 000000000000 -r 4a5361db8937 logsui/logsengine/inc/logsmessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/inc/logsmessage.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,75 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/inc/logsthumbnailmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/inc/logsthumbnailmanager.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 HbIcon; + +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; + HbIcon* mDefaultIcon; + +private: + + friend class UT_LogsMatchesModel; + friend class UT_LogsThumbnailManager; + +}; + +#endif // LOGSTHUMBNAILMANAGER_H + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logsengine.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logsengine.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,96 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 += ../../recents_plat/logs_engine_api/inc/logsabstractmodel.h +HEADERS += ../../recents_plat/logs_engine_api/inc/logsmodel.h +HEADERS += ../../recents_plat/logs_engine_api/inc/logsevent.h +HEADERS += ../../recents_plat/logs_engine_api/inc/logsfilter.h +HEADERS += ../../recents_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 000000000000 -r 4a5361db8937 logsui/logsengine/logsengine.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logsengine.qrc Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,7 @@ + + + themes/icons/hbdefault/scalable/qtg_large_missed_voice_call_unseen.svg + themes/icons/hbdefault/scalable/qtg_large_missed_video_call_unseen.svg + themes/icons/hbdefault/scalable/qtg_large_missed_voip_call_unseen.svg + + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logsdbconnector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logsdbconnector.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,247 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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, bool resourceControl = 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(); + + int refreshData(); + int compressData(); + + + /** + * Returns cenrep key status of predictive search feature. + * @return 0 - feature is permanently off and can't be turned on, + * 1 - feature is on + * 2 - feature is temporarily off and can be turned on + * negative value indicates some error in fetching the key + */ + int predictiveSearchStatus(); + + /** + * Allows to modify cenrep key value of predictive search features. + * However, this function can't be used if feature is set permanently off + * (see predictiveSearchStatus()) + * @param enabled, specify whether cenrep key will be set to 1 or 2 + * @ return 0 if cenrep key value modified succesfully, + * -1 in case of some error + */ + int setPredictiveSearch(bool enabled); + + + 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; + bool mResourceControl; + CLogClient* mLogClient; + LogsEventStrings mLogEventStrings; + RFs* mFsSession; + LogsReader* mReader; + LogsRemove* mLogsRemove; + CRepository* mRepository; + bool mCompressionEnabled; + + 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logseventdataparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logseventdataparser.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logseventparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logseventparser.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logsforegroundwatcher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logsforegroundwatcher.h Tue May 04 12:39:37 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 LOGSFOREGROUNDWATCHER_H +#define LOGSFOREGROUNDWATCHER_H + + +#include +#include + +class LogsForegroundWatcher : public QObject, public MCoeForegroundObserver +{ + Q_OBJECT + +public: + + LogsForegroundWatcher(QObject* parent = 0); + virtual ~LogsForegroundWatcher(){} + +signals: + void gainingForeground(); + void losingForeground(); + +public: // from MCoeForegroundObserver + void HandleGainingForeground(); + void HandleLosingForeground(); + +}; + +#endif //LOGSFOREGROUNDWATCHER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logsreader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logsreader.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,218 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 createLogViewsL(); + void deleteLogViews(); + LogsReaderStateFiltering* createFilteringState(); + void prepareReadingL(); + void setGlobalObserver(); + void clearGlobalObserver(); + + 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; + bool mGlobalObserverSet; + }; + +#endif // LOGSREADER_H + + +// End of File + + + + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logsreaderobserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logsreaderobserver.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logsreaderstatecontext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logsreaderstatecontext.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logsreaderstates.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logsreaderstates.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,372 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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; +}; + +/** + * Initialize reading state + */ +class LogsReaderStateInitReading : public LogsReaderStateBase { + + friend class UT_LogsReaderStates; + + public: + LogsReaderStateInitReading(LogsReaderStateContext& context); + virtual ~LogsReaderStateInitReading(){} + + public: // From LogsReaderStateBase + virtual bool enterL(); + }; + +/** + * 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logsremove.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logsremove.h Tue May 04 12:39:37 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: +* +*/ +#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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/inc/logsremoveobserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/inc/logsremoveobserver.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/src/logsdbconnector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/src/logsdbconnector.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,605 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 "logscommondata.h" +#include +#include +#include +#include + +// CONSTANTS + + +// ---------------------------------------------------------------------------- +// LogsDbConnector::LogsDbConnector +// ---------------------------------------------------------------------------- +// +LogsDbConnector::LogsDbConnector( + QList& events, bool checkAllEvents, bool resourceControl ) +: QObject(), + mModelEvents( events ), + mCheckAllEvents( checkAllEvents ), + mResourceControl( resourceControl ), + mLogClient( 0 ), + mReader( 0 ), + mLogsRemove( 0 ), + mRepository( 0 ), + mCompressionEnabled(false) +{ + 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 ); + + if ( mResourceControl ){ + LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::initL(), resource control enabled" ) + LogsCommonData::getInstance().configureReadSize( + logsReadSizeCompressEnabled, LogsEvent::DirUndefined); + mCompressionEnabled = true; + } +} + +// ---------------------------------------------------------------------------- +// 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; +} + +// ----------------------------------------------------------------------------- +// Do refresh only if compression has been enabled. Monitoring for database +// changes is restored and current database contents are read. +// ----------------------------------------------------------------------------- +// +int LogsDbConnector::refreshData() +{ + if ( !mResourceControl ){ + return -1; + } + LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::refreshData()" ) + int err = 0; + bool prevCompressionEnabled = mCompressionEnabled; + mCompressionEnabled = false; + LogsCommonData::getInstance().configureReadSize( + logsReadSizeUndefined, LogsEvent::DirUndefined); + if ( mReader ){ + if ( prevCompressionEnabled && !mReader->IsActive() ){ + err = mReader->start(); + } + } + LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::refreshData()" ) + return err; +} + +// ----------------------------------------------------------------------------- +// Compress data, only defined amount of events are kept in memory, others +// are deleted and read back to memory once refreshData is called. Also +// monitoring for database changes is disabled. +// ----------------------------------------------------------------------------- +// +int LogsDbConnector::compressData() +{ + if ( !mResourceControl ){ + return -1; + } + LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::compressData()" ) + mCompressionEnabled = true; + LogsCommonData::getInstance().configureReadSize( + logsReadSizeCompressEnabled, LogsEvent::DirUndefined); + if ( mReader ){ + int numEventsLeftInMemory = qMin(mEvents.count(), logsReadSizeCompressEnabled ); + // Simulate disappearing of compressed events + QList removedIndexes; + for ( int i = 0; i < mEvents.count(); i++ ){ + if ( i == 0 ){ + mModelEvents.clear(); + } + if ( i < numEventsLeftInMemory ){ + mModelEvents.append(mEvents.at(i)); + } else { + removedIndexes.append(mEvents.at(i)->index()); + } + } + emit dataRemoved(removedIndexes); + deleteRemoved( numEventsLeftInMemory ); + mReader->stop(); + } + LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::compressData()" ) + return 0; +} + +// ---------------------------------------------------------------------------- +// LogsDbConnector::predictiveSearchStatus +// ---------------------------------------------------------------------------- +// +int LogsDbConnector::predictiveSearchStatus() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsDbConnector::predictiveSearchStatus()" ) + int status(-1); + if ( mRepository ) { + TInt value(0); + status = mRepository->Get( KLogsPredictiveSearch, value ); + if ( !status ) { + status = value; + } + } + LOGS_QDEBUG_2( "logs [ENG] <- LogsDbConnector::predictiveSearchStatus(), status:", + status ) + return status; +} + +// ---------------------------------------------------------------------------- +// LogsDbConnector::setPredictiveSearch +// ---------------------------------------------------------------------------- +// +int LogsDbConnector::setPredictiveSearch(bool enabled) +{ + int err(-1); + int status = predictiveSearchStatus(); + //if status == 0, it means that predictive search is permanently Off + //and we are not allowed to modify it + if (status != 0 && mRepository) { + int value = enabled ? 1 : 2; + err = mRepository->Set( KLogsPredictiveSearch, value ); + } + return err; +} + +// ---------------------------------------------------------------------------- +// 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); + + if ( mCompressionEnabled ){ + mReader->stop(); + } + + 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/src/logseventdataparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/src/logseventdataparser.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,204 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/src/logseventparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/src/logseventparser.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,176 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// INCLUDE 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/src/logsforegroundwatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/src/logsforegroundwatcher.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "logsforegroundwatcher.h" +#include "logslogger.h" + +// ----------------------------------------------------------------------------- +// Currently no other way to monitor app foreground/background switches. +// HbForegroundWatcher might become public at some point which could be then +// used instead. +// ----------------------------------------------------------------------------- +// +LogsForegroundWatcher::LogsForegroundWatcher(QObject* parent) : QObject(parent) +{ + CCoeEnv* env = CCoeEnv::Static(); + if (env) { + TRAP_IGNORE(env->AddForegroundObserverL(*this)); + } +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsForegroundWatcher::HandleGainingForeground() +{ + LOGS_QDEBUG( "logs [UI] -> LogsForegroundWatcher::HandleGainingForeground" ); + emit gainingForeground(); + LOGS_QDEBUG( "logs [UI] <- LogsForegroundWatcher::HandleGainingForeground" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsForegroundWatcher::HandleLosingForeground() +{ + LOGS_QDEBUG( "logs [UI] -> LogsForegroundWatcher::HandleLosingForeground" ); + emit losingForeground(); + LOGS_QDEBUG( "logs [UI] <- LogsForegroundWatcher::HandleLosingForeground" ); +} + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/src/logsreader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/src/logsreader.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,713 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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), + mGlobalObserverSet(false) +{ + LOGS_QDEBUG( "logs [ENG] -> LogsReader::LogsReader()" ) + + CActiveScheduler::Add( this ); + + initializeReadStates(); + + setGlobalObserver(); + + 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(); + deleteLogViews(); + clearGlobalObserver(); + + 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 ){ + + LogsReaderStateInitReading* init = new LogsReaderStateInitReading(*this); + LogsReaderStateFiltering* filtering = createFilteringState(); + LogsReaderStateReading* reading = new LogsReaderStateReading(*this); + LogsReaderStateFillDetails* fillDetails = new LogsReaderStateFillDetails(*this); + LogsReaderStateDone* done = new LogsReaderStateDone(*this); + init->setNextState(*filtering); + filtering->setNextState(*reading); + reading->setNextState(*fillDetails); + fillDetails->setNextState(*done); + mReadStates.append(init); + 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::createLogViewsL +// ---------------------------------------------------------------------------- +// +void LogsReader::createLogViewsL() +{ + if ( mReadAllEvents ){ + if ( !mLogViewEvent ){ + mLogViewEvent = CLogViewEvent::NewL( mLogClient, *this ); + } + } + else if ( !mLogViewRecent ) { + mLogViewRecent = CLogViewRecent::NewL( mLogClient, *this ); + } + + if ( !mDuplicatesView ){ + mDuplicatesView = CLogViewDuplicate::NewL( mLogClient, *this ); + } +} + +// ---------------------------------------------------------------------------- +// LogsReader::deleteLogViews +// ---------------------------------------------------------------------------- +// +void LogsReader::deleteLogViews() +{ + delete mLogViewEvent; + mLogViewEvent = 0; + delete mLogViewRecent; + mLogViewRecent = 0; + delete mDuplicatesView; + mDuplicatesView = 0; +} + +// ---------------------------------------------------------------------------- +// 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(); + + createLogViewsL(); + + setGlobalObserver(); + + mIndex = 0; +} + +// ---------------------------------------------------------------------------- +// LogsReader::setGlobalObserver +// ---------------------------------------------------------------------------- +// +void LogsReader::setGlobalObserver() +{ + // Have to ensure that same observer is not set twice, otherwise + // causes crash at later point inside eventlogger + if ( !mGlobalObserverSet ){ + TRAP_IGNORE( mLogClient.SetGlobalChangeObserverL( this ) ) + mGlobalObserverSet = true; + } +} + +// ---------------------------------------------------------------------------- +// LogsReader::clearGlobalObserver +// ---------------------------------------------------------------------------- +// +void LogsReader::clearGlobalObserver() +{ + if ( mGlobalObserverSet ){ + TRAP_IGNORE( mLogClient.SetGlobalChangeObserverL( 0 ) ) + mGlobalObserverSet = false; + } +} diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/src/logsreaderstates.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/src/logsreaderstates.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,831 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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; +} + +// ---------------------------------------------------------------------------- +// LogsReaderStateInitReading::LogsReaderStateInitReading +// ---------------------------------------------------------------------------- +// +LogsReaderStateInitReading::LogsReaderStateInitReading( + LogsReaderStateContext& context ) + : LogsReaderStateBase(context) +{ +} + +// ---------------------------------------------------------------------------- +// LogsReaderInitReadingState::enterL +// ---------------------------------------------------------------------------- +// +bool LogsReaderStateInitReading::enterL() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsReaderStateInitReading::enterL" ); + resetEvents(); + return enterNextStateL(); +} + +// ---------------------------------------------------------------------------- +// 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" ); + + 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/src/logsremove.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/src/logsremove.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,220 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/stubs/centralrepository_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/stubs/centralrepository_stub.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,99 @@ +/* +* 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/stubs/centralrepository_stub_helper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/stubs/centralrepository_stub_helper.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,33 @@ +/* +* 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,475 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs_helper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/stubs/logclient_stubs_helper.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,30 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,267 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs_helper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/stubs/qtcontacts_stubs_helper.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsdbconnector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsdbconnector.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,73 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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(); + void testRefreshData(); + void testCompressData(); + void testPredictiveSearchStatus(); + void testSetPredictiveSearch(); + +private: + + LogsDbConnector* mDbConnector; + QList mEvents; + +}; + + +#endif //UT_LOGSDBCONNECTOR_H diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logseventdataparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logseventdataparser.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logseventparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logseventparser.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsforegroundwatcher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsforegroundwatcher.h Tue May 04 12:39:37 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 UT_LOGSFOREGROUNDWATCHER_H +#define UT_LOGSFOREGROUNDWATCHER_H + +#include + +class LogsForegroundWatcher; + +class UT_LogsForegroundWatcher : 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 testHandleLosingForeground(); + void testHandleGainingForeground(); + + +private: + + LogsForegroundWatcher* mWatcher; + +}; + + +#endif //UT_LOGSFOREGROUNDWATCHER_H diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreader.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreaderstates.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsreaderstates.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,131 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 testStateInitReading(); + 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsremove.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/inc/ut_logsremove.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,79 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,103 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include + +#include "ut_logsdbconnector.h" +#include "ut_logsreader.h" +#include "ut_logsreaderstates.h" +#include "ut_logseventparser.h" +#include "ut_logseventdataparser.h" +#include "ut_logsforegroundwatcher.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 ); + QVERIFY( !mDbConnector->mCompressionEnabled ); + QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeUndefined ); + + // Resource control enabled + LogsDbConnector* connector = new LogsDbConnector(mEvents, false, true); + QVERIFY( connector->init() == 0 ); + QVERIFY( connector->mReader ); + QVERIFY( connector->mLogsRemove ); + QVERIFY( connector->mCompressionEnabled ); + QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeCompressEnabled ); + delete connector; +} + +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 ); + + // Read completed when compression is enabled, reader is stopped + QVERIFY( mDbConnector->init() == 0 ); + QVERIFY( mDbConnector->start() == 0 ); + QVERIFY( mDbConnector->mReader->mLogViewRecent != 0 ); + mDbConnector->mCompressionEnabled = true; + mDbConnector->readCompleted(0); + QVERIFY( mDbConnector->mReader->mLogViewRecent == 0 ); +} + +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 ); +} + +void UT_LogsDbConnector::testRefreshData() +{ + QVERIFY( mDbConnector->refreshData() != 0 ); + + // Resource control enabled, no reader + mDbConnector->mResourceControl = true; + QVERIFY( mDbConnector->refreshData() == 0 ); + + // Reader exists, not compressed before, nothing done + mDbConnector->init(); + mDbConnector->mCompressionEnabled = false; + QVERIFY( mDbConnector->refreshData() == 0 ); + QVERIFY( !mDbConnector->mReader->IsActive() ); + QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeUndefined ); + + // Reader exists, compressed before, reading started + mDbConnector->mCompressionEnabled = true; + QVERIFY( mDbConnector->refreshData() == 0 ); + QVERIFY( mDbConnector->mReader->IsActive() ); + QVERIFY( !mDbConnector->mCompressionEnabled ); + QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeUndefined ); + + // Reading not started again as already active + LogsCommonData::getInstance().configureReadSize(30, LogsEvent::DirUndefined); + mDbConnector->mCompressionEnabled = true; + QVERIFY( mDbConnector->refreshData() == 0 ); + QVERIFY( mDbConnector->mReader->IsActive() ); + QVERIFY( !mDbConnector->mCompressionEnabled ); + QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeUndefined ); +} + +void UT_LogsDbConnector::testCompressData() +{ + qRegisterMetaType< QList >("QList"); + QSignalSpy spyRemoved(mDbConnector, SIGNAL(dataRemoved(QList))); + + QVERIFY( mDbConnector->compressData() != 0 ); + + // Reader exists, zero events, nothing really done + mDbConnector->mResourceControl = true; + mDbConnector->init(); + mDbConnector->mCompressionEnabled = false; + QVERIFY( mDbConnector->compressData() == 0 ); + QVERIFY( mDbConnector->mCompressionEnabled ); + QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeCompressEnabled ); + QVERIFY( spyRemoved.count() == 1 ); + QList removedIndexes = qvariant_cast< QList >(spyRemoved.at(0).at(0)); + QVERIFY( removedIndexes.count() == 0 ); + + // Less events than compression limit is, nothing really done + int numEvents = 3; + for ( int i = 0; i < numEvents; i++ ){ + LOGS_TEST_CREATE_EVENT(event, i, LogsEvent::EventAdded ); + } + mDbConnector->mCompressionEnabled = false; + QVERIFY( mDbConnector->compressData() == 0 ); + QVERIFY( mDbConnector->mCompressionEnabled ); + QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeCompressEnabled ); + QVERIFY( spyRemoved.count() == 2 ); + QList removedIndexes2 = qvariant_cast< QList >(spyRemoved.at(1).at(0)); + QVERIFY( removedIndexes2.count() == 0 ); + QVERIFY( mDbConnector->mModelEvents.count() == numEvents ); + + // More events than compression limit is, extra events removed + int numEventsMoreThanCompressLimit = ( numEvents + logsReadSizeCompressEnabled ); + for ( int i = numEvents; i < numEventsMoreThanCompressLimit; i++ ){ + LOGS_TEST_CREATE_EVENT(event, i, LogsEvent::EventAdded ); + } + mDbConnector->mCompressionEnabled = false; + QVERIFY( mDbConnector->compressData() == 0 ); + QVERIFY( mDbConnector->mCompressionEnabled ); + QVERIFY( LogsCommonData::getInstance().maxReadSize() == logsReadSizeCompressEnabled ); + QVERIFY( spyRemoved.count() == 3 ); + QList removedIndexes3 = qvariant_cast< QList >(spyRemoved.at(2).at(0)); + QVERIFY( removedIndexes3.count() == numEvents ); + // Check indexes of those removed events (3 oldest events) + QVERIFY( removedIndexes3.at(0) == ( numEventsMoreThanCompressLimit - 3 ) ); + QVERIFY( removedIndexes3.at(1) == ( numEventsMoreThanCompressLimit - 2) ); + QVERIFY( removedIndexes3.at(2) == ( numEventsMoreThanCompressLimit - 1 ) ); + QVERIFY( mDbConnector->mModelEvents.count() == logsReadSizeCompressEnabled ); +} + +void UT_LogsDbConnector::testPredictiveSearchStatus() +{ + // Not ready + QVERIFY( mDbConnector->predictiveSearchStatus() != 0 ); + + // Ready and value returned + mDbConnector->init(); + CentralRepositoryStubHelper::reset(); + CentralRepositoryStubHelper::setCurrentVal(2); + QVERIFY( mDbConnector->predictiveSearchStatus() == 2 ); + + // Fails with some error + CentralRepositoryStubHelper::setCurrentVal(2); + CentralRepositoryStubHelper::setFailCode(KErrNotSupported); + QVERIFY( mDbConnector->predictiveSearchStatus() == KErrNotSupported ); +} + +void UT_LogsDbConnector::testSetPredictiveSearch() +{ + // Not ready + QVERIFY( mDbConnector->setPredictiveSearch(true) != 0 ); + + // Ready and value change is not allowed + mDbConnector->init(); + CentralRepositoryStubHelper::reset(); + CentralRepositoryStubHelper::setCurrentVal(0); + QVERIFY( mDbConnector->setPredictiveSearch(true) != 0 ); + QVERIFY( CentralRepositoryStubHelper::currentVal() == 0 ); + + // Ready and value is changed + CentralRepositoryStubHelper::setCurrentVal(2); + QVERIFY( mDbConnector->setPredictiveSearch(true) == 0 ); + QVERIFY( CentralRepositoryStubHelper::currentVal() == 1 ); + + // Ready and value is changed + CentralRepositoryStubHelper::setCurrentVal(1); + QVERIFY( mDbConnector->setPredictiveSearch(false) == 0 ); + QVERIFY( CentralRepositoryStubHelper::currentVal() == 2 ); + + // Fails with some error + CentralRepositoryStubHelper::setCurrentVal(1); + CentralRepositoryStubHelper::setFailCode(KErrNotFound); + QVERIFY( mDbConnector->setPredictiveSearch(false) == KErrNotFound ); +} + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logseventdataparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logseventdataparser.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,191 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logseventparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logseventparser.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,168 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsforegroundwatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsforegroundwatcher.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include "ut_logsforegroundwatcher.h" +#include "logsforegroundwatcher.h" + +#include +#include + +CCoeEnv* testEnv = 0; + +CCoeEnv* CCoeEnv::Static() +{ + testEnv = new CCoeEnv(); + return testEnv; +} + +CCoeEnv::CCoeEnv() : CActive(EPriorityNormal) +{ + +} + +CCoeEnv::~CCoeEnv() +{ +} + +void CCoeEnv::AddForegroundObserverL(MCoeForegroundObserver& /*aForegroundObserver*/) +{ + +} + +void UT_LogsForegroundWatcher::initTestCase() +{ +} + +void UT_LogsForegroundWatcher::cleanupTestCase() +{ + delete testEnv; + testEnv = 0; +} + +void UT_LogsForegroundWatcher::init() +{ + mWatcher = new LogsForegroundWatcher(); +} + +void UT_LogsForegroundWatcher::cleanup() +{ + delete mWatcher; +} + +void UT_LogsForegroundWatcher::testConstructor() +{ + QVERIFY( mWatcher ); +} + +void UT_LogsForegroundWatcher::testHandleLosingForeground() +{ + QSignalSpy spyGaining( mWatcher, SIGNAL(gainingForeground()) ); + QSignalSpy spyLosing( mWatcher, SIGNAL(losingForeground()) ); + mWatcher->HandleLosingForeground(); + QVERIFY( spyGaining.count() == 0 ); + QVERIFY( spyLosing.count() == 1 ); +} + +void UT_LogsForegroundWatcher::testHandleGainingForeground() +{ + QSignalSpy spyGaining( mWatcher, SIGNAL(gainingForeground()) ); + QSignalSpy spyLosing( mWatcher, SIGNAL(losingForeground()) ); + mWatcher->HandleGainingForeground(); + QVERIFY( spyGaining.count() == 1 ); + QVERIFY( spyLosing.count() == 0 ); +} + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreader.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,314 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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() ); + QVERIFY( !mReader->mLogViewEvent ); + QVERIFY( !mReader->mDuplicatesView ); +} + +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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreaderstates.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsreaderstates.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,685 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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::testStateInitReading() +{ + LogsReaderStateInitReading init(*this); + CLogEvent* logEvent = CLogEvent::NewL(); + CleanupStack::PushL(logEvent); + logEvent->SetNumber( _L("1234") ); + logEvent->SetId( 100 ); + LogsEvent* logsEvent = new LogsEvent; + logsEvent->setIsInView(true); + int index( 0 ); + QVERIFY( init.constructAndInsertEventL(*logEvent, logsEvent, index, mEvents ) ); + init.enterL(); + QVERIFY( !logsEvent->isInView() ); + CleanupStack::PopAndDestroy( logEvent ); +} + +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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsremove.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsremove.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,187 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/ut_logssymbianos.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/ut_logssymbianos.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,90 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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/ut_logsforegroundwatcher.h +HEADERS += ../../inc/logsdbconnector.h +HEADERS += ../../inc/logsreader.h +HEADERS += ../../inc/logsreaderstates.h +HEADERS += ../../inc/logsreaderobserver.h +HEADERS += ../../inc/logsremove.h +HEADERS += ../../inc/logsforegroundwatcher.h +HEADERS += ../../../../../recents_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/ut_logsforegroundwatcher.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/logsforegroundwatcher.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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logsabstractmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logsabstractmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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.isSeenLocally() ){ + direction = logsMissedVoiceCallUnseenIconId; + } + else { + direction = logsMissedVoiceCallIconId; + } + + } else if ( event.eventType() == LogsEvent::TypeVideoCall ) { + if (!event.isSeenLocally() ){ + direction = logsMissedVideoCallUnseenIconId; + } + else { + direction = logsMissedVideoCallIconId; + } + } else if ( event.eventType() == LogsEvent::TypeVoIPCall ) { + if (!event.isSeenLocally() ){ + 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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logscall.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logscall.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,215 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logscommondata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logscommondata.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,114 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logscontact.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logscontact.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,266 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logscustomfilter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logscustomfilter.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,146 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +//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->isSeenLocally() ){ + ids.append( event->logId() ); + } + } + } + return ids; +} + +// End of file + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/src/logsdetailsmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logsdetailsmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,438 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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->isSeenLocally() && 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_dial_dblist_callee_id"); + } + else{ + headervalue = hbTrId("txt_dialer_ui_dblist_call_id"); + } + } + else { + if ((isOutgoingCall() && isRemote)|| (!isOutgoingCall() && !isRemote)) { + headervalue = hbTrId("txt_dial_dblist_callee_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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logsevent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logsevent.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,641 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 || mIsRead ); +} + +// End of file + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/src/logseventdata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logseventdata.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,221 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logsfilter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logsfilter.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,144 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logsmatchesmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logsmatchesmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,734 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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), + mLogsCntFinder(0), + mIconManager(0), + mSearchEnabled(false), + mResultCount(0) +{ + LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::LogsMatchesModel()" ) + + mDbConnector = &dbConnector; + initPredictiveSearch(); + + 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 mResultCount; +} + +// ----------------------------------------------------------------------------- +// From QAbstractItemModel +// ----------------------------------------------------------------------------- +// +QVariant LogsMatchesModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() >= mResultCount || index.row() < 0 ) { + return QVariant(); + } + + LogsMatchesModelItemContainer* item = 0; + if ( index.row() < mMatches.count() ){ + item = mMatches.at(index.row()); + } else { + item = const_cast(this)->addSearchResult(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; + } else { + connect( logsContact, SIGNAL(saveCompleted(bool)), this, SLOT(forceSearchQuery()) ); + } + QVariant var = qVariantFromValue(logsContact); + LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::createContact()" ) + return var; +} + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +int LogsMatchesModel::predictiveSearchStatus() +{ + return mDbConnector->predictiveSearchStatus(); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +int LogsMatchesModel::setPredictiveSearch(bool enabled) +{ + LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::setPredictiveSearch()" ) + int err = mDbConnector->setPredictiveSearch(enabled); + if (!err) { + if ((mSearchEnabled && !enabled) || (!mSearchEnabled && enabled)) { + //in case of search is turned off, getLogMatches will only reset + //previous search results + mSearchEnabled = enabled; + forceSearchQuery(); + } + } + LOGS_QDEBUG_2( "logs [ENG] <- LogsMatchesModel::setPredictiveSearch(), err: ", err ) + return err; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesModel::queryReady() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::queryReady()" ); + + qDeleteAll(mMatches); + mMatches.clear(); + // Just store number of matches at this point, real data is read only + // once it is asked first time from model. + mResultCount = mLogsCntFinder->resultsCount(); + 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 ){ + forceSearchQuery(); + } + 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); + forceSearchQuery(); + 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 ){ + forceSearchQuery(); + } + LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::eventsRemoved()" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesModel::initPredictiveSearch() +{ + int searchStatus = mDbConnector->predictiveSearchStatus(); + //searchStatus equal to 0 means that search should be permanently disabled + if (searchStatus != 0) { + mSearchEnabled = (searchStatus == 1 || searchStatus < 0); + + mLogsCntFinder = new LogsCntFinder(LogsCommonData::getInstance().contactManager()); + connect(mLogsCntFinder, SIGNAL(queryReady()),this, SLOT(queryReady())); + + connect( &mParentModel, SIGNAL(dataChanged(const QModelIndex&,const QModelIndex&)), + this, SLOT(eventsUpdated(const QModelIndex&,const QModelIndex&))); + connect( &mParentModel, SIGNAL(rowsInserted(const QModelIndex&,int,int)), + this, SLOT(eventsAdded(const QModelIndex&,int,int))); + connect( &mParentModel, SIGNAL(rowsRemoved(const QModelIndex&,int,int)), + this, SLOT(eventsRemoved(const QModelIndex&,int,int))); + connect( &mParentModel, SIGNAL(modelReset()), this, SLOT(doModelReset())); + readEvents(0, mParentModel.rowCount()); + mIconManager = new LogsThumbIconManager(); + connect(mIconManager, SIGNAL(contactIconReady(int)), + this, SLOT(updateContactIcon(int))); + } +} + +// ----------------------------------------------------------------------------- +// Add result container but don't get real data yet. Get data once it is +// really needed. +// ----------------------------------------------------------------------------- +// +LogsMatchesModelItemContainer* LogsMatchesModel::addSearchResult(int resultIndex) +{ + LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer( + mParentModel, *mIconManager, resultIndex); + mMatches.append(item); + return item; +} + +// ----------------------------------------------------------------------------- +// 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 && mLogsCntFinder + && 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) +{ + LogsContact* contact = new LogsContact(number, *mDbConnector); + connect( contact, SIGNAL(saveCompleted(bool)), this, SLOT(forceSearchQuery()) ); + return contact; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +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 && mSearchEnabled){ + mPrevSearchPattern = mCurrentSearchPattern; + if (mCurrentSearchPattern.length() > 0) { + LOGS_QDEBUG( "logs [ENG] do search" ); + mLogsCntFinder->predictiveSearchQuery( mCurrentSearchPattern ); + } else { + // Clear old results for empty search pattern + doModelReset(); + } + } else { + LOGS_QDEBUG( "logs [ENG] pattern hasn't changed or search is OFF" ); + } + LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::doSearchQuery()" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesModel::doModelReset() +{ + qDeleteAll(mMatches); + mMatches.clear(); + mResultCount = 0; + reset(); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsMatchesModel::forceSearchQuery() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::forceSearchQuery()" ); + getLogsMatches( mCurrentSearchPattern, true, true ); + LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::forceSearchQuery()" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logsmessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logsmessage.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logsmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logsmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,398 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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, bool resourceControl) : + LogsAbstractModel(), mModelType(modelType) +{ + LOGS_QDEBUG( "logs [ENG] -> LogsModel::LogsModel()" ) + + initIcons(); + + bool allEvents( mModelType == LogsFullModel ); + mDbConnector = new LogsDbConnector( mEvents, allEvents, resourceControl ); + 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->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; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +int LogsModel::refreshData() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsModel::refreshData()" ) + int err = mDbConnector->refreshData(); + LOGS_QDEBUG_2( "logs [ENG] <- LogsModel::refreshData(), err", err ) + return err; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +int LogsModel::compressData() +{ + LOGS_QDEBUG( "logs [ENG] -> LogsModel::compressData()" ) + int err = mDbConnector->compressData(); + LOGS_QDEBUG_2( "logs [ENG] <- LogsModel::compressData(), err", err ) + return err; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +int LogsModel::predictiveSearchStatus() +{ + return mDbConnector->predictiveSearchStatus(); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +int LogsModel::setPredictiveSearch(bool enabled) +{ + return mDbConnector->setPredictiveSearch(enabled); +} + + +// ----------------------------------------------------------------------------- +// From QAbstractListModel +// ----------------------------------------------------------------------------- +// +int LogsModel::rowCount(const QModelIndex & /* parent */) const +{ + 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.isSeenLocally() ){ + 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 000000000000 -r 4a5361db8937 logsui/logsengine/src/logsthumbnailmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/src/logsthumbnailmanager.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,189 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "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 HbIcon(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->qicon(); +} + +// ----------------------------------------------------------------------------- +// 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); + LOGS_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); + LOGS_QDEBUG_2("LogsThumbIconManager::thumbnailLoad clientData is ", clientData ); + int reqId = mThumbnailManager->getThumbnail(avatarPath, clientData, 0); + LOGS_QDEBUG_2("LogsThumbIconManager::thumbnailLoad reqId is ", reqId ); + mTnmReqMap.insert(reqId, avatarPath); + } + LOGS_QDEBUG( "logs [ENG] -> LogsThumbIconManager::thumbnailLoad()<-" ) +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void LogsThumbIconManager::timerTimeout() +{ + thumbnailLoad(); + +} + + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_video_call_unseen.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_video_call_unseen.svg Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voice_call_unseen.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voice_call_unseen.svg Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voip_call_unseen.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/themes/icons/hbdefault/scalable/qtg_large_missed_voip_call_unseen.svg Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/at_logsengine/at_logsengine.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/at_logsengine/at_logsengine.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,51 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/at_logsengine/inc/at_logsengine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/at_logsengine/inc/at_logsengine.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/at_logsengine/src/at_logsengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/at_logsengine/src/at_logsengine.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/at_logsengine/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/at_logsengine/src/main.cpp Tue May 04 12:39:37 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: +* +*/ + + +#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(const HbIcon &other); + ~HbIcon(); + bool isNull() const; + QIcon &qicon() const; + bool operator==(const HbIcon &other) const; + + operator QVariant() const; + +public: // Data added for the unit testing stub + QString mName; + QIcon* mTestIcon; +}; + +Q_DECLARE_METATYPE(HbIcon) + +#endif // HBICON_H diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/hbstubs/hblineedit.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/hbstubs/hblineedit.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/hbstubs/hbstubs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/hbstubs/hbstubs.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,185 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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(); + mTestIcon = new QIcon; +} + +// ----------------------------------------------------------------------------- +// HbIcon::HbIcon +// ----------------------------------------------------------------------------- +// +HbIcon::HbIcon(const QString &iconName) +{ + mName = iconName; + mTestIcon = new QIcon; +} + +// ----------------------------------------------------------------------------- +// HbIcon::HbIcon +// ----------------------------------------------------------------------------- +// +HbIcon::HbIcon(const QIcon &icon) +{ + mName = "c:\\data\\images\\designer.png"; + mTestIcon = new QIcon; +} + +// ----------------------------------------------------------------------------- +// HbIcon::HbIcon +// ----------------------------------------------------------------------------- +// +HbIcon::HbIcon(const HbIcon &icon) +{ + mName = "c:\\data\\images\\designer.png"; + mTestIcon = new QIcon; +} + +// ----------------------------------------------------------------------------- +// HbIcon::~HbIcon +// ----------------------------------------------------------------------------- +// +HbIcon::~HbIcon() +{ + delete mTestIcon; +} + +// ----------------------------------------------------------------------------- +// HbIcon::isNull +// ----------------------------------------------------------------------------- +// +bool HbIcon::isNull() const +{ + return false; +} + +// ----------------------------------------------------------------------------- +// HbIcon::qicon +// ----------------------------------------------------------------------------- +// +QIcon &HbIcon::qicon() const +{ + return *mTestIcon; +} + +// ----------------------------------------------------------------------------- +// 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/hbstubs/qicon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/hbstubs/qicon.h Tue May 04 12:39:37 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: 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/hbstubs/qiconstubs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/hbstubs/qiconstubs.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,96 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/stubs/logscntfinder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/stubs/logscntfinder.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,188 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/stubs/logscntfinder_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/stubs/logscntfinder_stub.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,469 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/stubs/qthighway_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/stubs/qthighway_stub.cpp Tue May 04 12:39:37 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: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/stubs/qthighway_stub_helper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/stubs/qthighway_stub_helper.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,279 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 = ""; +int logsPredictiveSearchStatus = 0; + +void LogsDbConnectorStubHelper::reset() +{ + logsLastCalledFunction = ""; + logsPredictiveSearchStatus = 0; +} + +QString LogsDbConnectorStubHelper::lastCalledFunction() +{ + return logsLastCalledFunction; +} + +void LogsDbConnectorStubHelper::setPredictiveSearch(int status) +{ + logsPredictiveSearchStatus = status; +} + +// ---------------------------------------------------------------------------- +// LogsDbConnector::LogsDbConnector +// ---------------------------------------------------------------------------- +// +LogsDbConnector::LogsDbConnector( + QList& events, bool checkAllEvents, bool resourceControl ) +: QObject(), mModelEvents( events ), mCheckAllEvents( checkAllEvents ), + mResourceControl( resourceControl ) +{ +} + +// ---------------------------------------------------------------------------- +// 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::refreshData +// ---------------------------------------------------------------------------- +// +int LogsDbConnector::refreshData() +{ + logsLastCalledFunction = "refreshData"; + return 0; +} + +// ---------------------------------------------------------------------------- +// LogsDbConnector::compressData +// ---------------------------------------------------------------------------- +// +int LogsDbConnector::compressData() +{ + logsLastCalledFunction = "compressData"; + return 0; +} + +// ---------------------------------------------------------------------------- +// 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; +} + +// ---------------------------------------------------------------------------- +// LogsDbConnector::predictiveSearchStatus +// ---------------------------------------------------------------------------- +// +int LogsDbConnector::predictiveSearchStatus() +{ + logsLastCalledFunction = "predictiveSearchStatus"; + return logsPredictiveSearchStatus; +} + +// ---------------------------------------------------------------------------- +// LogsDbConnector::setPredictiveSearch +// ---------------------------------------------------------------------------- +// +int LogsDbConnector::setPredictiveSearch(bool enabled) +{ + logsLastCalledFunction = "setPredictiveSearch"; + if (logsPredictiveSearchStatus != 0) { + logsPredictiveSearchStatus = enabled ? 1 : 2; + return 0; + } else { + return -1; + } +} diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub_helper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/symbianos_stub/logsdbconnector_stub_helper.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +/** +* Helper class to control logsdbconnector stub behavior +* +*/ +class LogsDbConnectorStubHelper +{ + public: + static void reset(); + static QString lastCalledFunction(); + static void setPredictiveSearch(int); +}; diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/symbianos_stub/logseventdataparser_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/symbianos_stub/logseventdataparser_stub.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/symbianos_stub/logseventparser_stub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/symbianos_stub/logseventparser_stub.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscall.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscall.h Tue May 04 12:39:37 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: +* +*/ +#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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscommondata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscommondata.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,54 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscontact.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscontact.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +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: +* +*/ +#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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscustomfilter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logscustomfilter.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsdetailsmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsdetailsmodel.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsevent.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsevent.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logseventdata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logseventdata.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsfilter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsfilter.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h Tue May 04 12:39:37 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 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(); + void testPredictiveSearchStatus(); + void testSetPredictiveSearch(); + +private: + + LogsModel* mModel; + LogsMatchesModel* mMatchesModel; + +}; + + +#endif //UT_LOGSMATCHESMODEL_H diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmessage.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmodel.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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(); + void testRefreshData(); + void testCompressData(); + void testPredictiveSearchStatus(); + void testSetPredictiveSearch(); + +private: + + LogsModel* mModel; + +}; + + +#endif //UT_LOGSMODEL_H diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsthumbnailmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsthumbnailmanager.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#ifndef 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,142 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include + +#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->mServiceId = 3; + mLogsCall->call(LogsCall::TypeLogsVoIPCall); + 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logscommondata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logscommondata.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include "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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logscontact.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logscontact.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,277 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logscustomfilter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logscustomfilter.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,144 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsdetailsmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsdetailsmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,454 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsevent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsevent.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,186 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include "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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logseventdata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logseventdata.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsfilter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsfilter.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,166 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,687 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 "logsdbconnector_stub_helper.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(); + LogsDbConnectorStubHelper::setPredictiveSearch(1); + mMatchesModel = mModel->logsMatchesModel(); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_LogsMatchesModel::cleanup() +{ + delete mMatchesModel; + mMatchesModel = 0; + delete mModel; + mModel = 0; +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_LogsMatchesModel::testConstructor() +{ + // Predictive search is on + QVERIFY( mMatchesModel ); + QVERIFY( mMatchesModel->mSearchEnabled ); + QVERIFY( mMatchesModel->mIconManager ); + QVERIFY( mMatchesModel->mLogsCntFinder ); + + // Predictive search is off + delete mMatchesModel; + mMatchesModel = 0; + LogsDbConnectorStubHelper::setPredictiveSearch(2); + mMatchesModel = mModel->logsMatchesModel(); + QVERIFY( mMatchesModel ); + QVERIFY( !mMatchesModel->mSearchEnabled ); + QVERIFY( mMatchesModel->mIconManager ); + QVERIFY( mMatchesModel->mLogsCntFinder ); + + // Predictive search status fetching failure=> assume that search is on + delete mMatchesModel; + mMatchesModel = 0; + LogsDbConnectorStubHelper::setPredictiveSearch(-1); + mMatchesModel = mModel->logsMatchesModel(); + QVERIFY( mMatchesModel ); + QVERIFY( mMatchesModel->mSearchEnabled ); + QVERIFY( mMatchesModel->mIconManager ); + QVERIFY( mMatchesModel->mLogsCntFinder ); + + // Predictive search is permanently disabled + delete mMatchesModel; + mMatchesModel = 0; + LogsDbConnectorStubHelper::setPredictiveSearch(0); + mMatchesModel = mModel->logsMatchesModel(); + QVERIFY( mMatchesModel ); + QVERIFY( !mMatchesModel->mIconManager ); + QVERIFY( !mMatchesModel->mLogsCntFinder ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_LogsMatchesModel::testRowCount() +{ + QVERIFY( mMatchesModel->mIconManager ); + QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 0 ); + LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer( + *mModel, *mMatchesModel->mIconManager, 0); + mMatchesModel->mMatches.append(item); + QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 0 ); + + mMatchesModel->mResultCount = 1; + QVERIFY( mMatchesModel->rowCount(QModelIndex()) == 1 ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_LogsMatchesModel::testData() +{ + QVERIFY( mMatchesModel->mLogsCntFinder ); + QVERIFY( mMatchesModel->mIconManager ); + 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); + + mMatchesModel->mResultCount = 2; + + // 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); + + mMatchesModel->mResultCount = 3; + + 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; + + // Data asked first time for event, no result container exist yet -> it will be created + qDeleteAll( mMatchesModel->mMatches ); + mMatchesModel->mMatches.clear(); + displayData = mMatchesModel->data(mMatchesModel->index(0), Qt::DisplayRole); + QVERIFY ( displayData.type() == QVariant::StringList ); + QCOMPARE( mMatchesModel->mMatches.count(), 1 ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_LogsMatchesModel::testDataAdded() +{ + QVERIFY( mMatchesModel->mLogsCntFinder ); + QVERIFY( mMatchesModel->mIconManager ); + // 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() +{ + QVERIFY( mMatchesModel->mLogsCntFinder ); + QVERIFY( mMatchesModel->mIconManager ); + // 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() +{ + QVERIFY( mMatchesModel->mLogsCntFinder ); + QVERIFY( mMatchesModel->mIconManager ); + // 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() +{ + QVERIFY( mMatchesModel->mLogsCntFinder ); + QVERIFY( mMatchesModel->mIconManager ); + QVERIFY( mMatchesModel->mSearchEnabled ); + // 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 ); + QVERIFY( mMatchesModel->mResultCount == 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() == 0 ); // Matches not added until data is asked + QVERIFY( mMatchesModel->mResultCount == 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() == 0 ); // Matches not added until data is asked + QVERIFY( mMatchesModel->mResultCount == 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 ); + QVERIFY( mMatchesModel->mResultCount == 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() ); + + // Search is Off, current pattern updated, but no search happens + mMatchesModel->mSearchEnabled = false; + mMatchesModel->mPrevSearchPattern = "1"; + mMatchesModel->mCurrentSearchPattern = "2"; + mMatchesModel->logsMatches( "199" ); + QVERIFY( mMatchesModel->mPrevSearchPattern == "1" ); + QVERIFY( mMatchesModel->mCurrentSearchPattern == "199" ); + 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() +{ + QVERIFY( mMatchesModel->mIconManager ); + // 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; + QVERIFY( mMatchesModel->mIconManager ); + + // 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" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_LogsMatchesModel::testPredictiveSearchStatus() +{ + LogsDbConnectorStubHelper::reset(); + QVERIFY( mMatchesModel->predictiveSearchStatus() == 0 ); + QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "predictiveSearchStatus" ); +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void UT_LogsMatchesModel::testSetPredictiveSearch() +{ + QVERIFY( mMatchesModel->mLogsCntFinder ); + QVERIFY( mMatchesModel->mIconManager ); + QVERIFY( mMatchesModel->mSearchEnabled ); + // Predictive search is permanently off in cenrep, setting the value fails + LogsDbConnectorStubHelper::reset(); + QVERIFY( mMatchesModel->setPredictiveSearch(false) != 0 ); + QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "setPredictiveSearch" ); + QVERIFY( mMatchesModel->mSearchEnabled ); + + // Turning off is ok, search results are reset + mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern = "9"; + LogsMatchesModelItemContainer* item = new LogsMatchesModelItemContainer( + *mModel, *mMatchesModel->mIconManager, 0); + mMatchesModel->mMatches.append(item); + mMatchesModel->mPrevSearchPattern = "123"; + mMatchesModel->mCurrentSearchPattern = "567"; + LogsDbConnectorStubHelper::setPredictiveSearch(1); + QVERIFY( mMatchesModel->setPredictiveSearch(false) == 0 ); + QVERIFY( !mMatchesModel->mSearchEnabled ); + QVERIFY( mMatchesModel->mMatches.count() == 0 ); + QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); + QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern == "9" ); + + // Turning search on, search results are updated + mMatchesModel->mPrevSearchPattern = "123"; + mMatchesModel->mCurrentSearchPattern = "567"; + QVERIFY( mMatchesModel->setPredictiveSearch(true) == 0 ); + QVERIFY( mMatchesModel->mPrevSearchPattern.isEmpty() ); + QVERIFY( mMatchesModel->mSearchEnabled ); + mMatchesModel->doSearchQuery(); // simulate async completion + QVERIFY( mMatchesModel->mPrevSearchPattern == "567" ); + QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern == "567" ); + + + // Turning search on, when it is already on => nothing happens + mMatchesModel->mCurrentSearchPattern = "777"; + QVERIFY( mMatchesModel->setPredictiveSearch(true) == 0 ); + QVERIFY( mMatchesModel->mSearchEnabled ); + QVERIFY( mMatchesModel->mPrevSearchPattern == "567" ); + QVERIFY( mMatchesModel->mLogsCntFinder->mCurrentPredictivePattern == "567" ); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmessage.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,102 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmodel.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,498 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 ); +} + +void UT_LogsModel::testRefreshData() +{ + QVERIFY( mModel->refreshData() == 0 ); + QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "refreshData" ); +} + +void UT_LogsModel::testCompressData() +{ + QVERIFY( mModel->compressData() == 0 ); + QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "compressData" ); +} + +void UT_LogsModel::testPredictiveSearchStatus() +{ + LogsDbConnectorStubHelper::setPredictiveSearch(1); + QVERIFY( mModel->predictiveSearchStatus() == 1 ); + QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "predictiveSearchStatus" ); +} + +void UT_LogsModel::testSetPredictiveSearch() +{ + LogsDbConnectorStubHelper::setPredictiveSearch(2); + QVERIFY( mModel->setPredictiveSearch(true) == 0 ); + QVERIFY( LogsDbConnectorStubHelper::lastCalledFunction() == "setPredictiveSearch" ); +} diff -r 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/src/ut_logsthumbnailmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsthumbnailmanager.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,126 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/logsengine/tsrc/ut_logsengine/ut_logsengine.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsengine/tsrc/ut_logsengine/ut_logsengine.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,117 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 += ../../../../recents_plat/logs_engine_api/inc/logsabstractmodel.h +HEADERS += ../../../../recents_plat/logs_engine_api/inc/logsmodel.h +HEADERS += ../../inc/logsdetailsmodel.h +HEADERS += ../../inc/logsmatchesmodel.h +HEADERS += ../../../../recents_plat/logs_engine_api/inc/logsfilter.h +HEADERS += ../../../../recents_plat/logs_engine_api/inc/logscustomfilter.h +HEADERS += ../../inc/logscall.h +HEADERS += ../../inc/logscontact.h +HEADERS += ../../inc/logsmessage.h +HEADERS += ../../../../recents_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 000000000000 -r 4a5361db8937 logsui/logsservices/bwins/logsservicesu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsservices/bwins/logsservicesu.def Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,3 @@ +EXPORTS + ?start@LogsServices@@SAHW4LogsView@1@_NABVQString@@@Z @ 1 NONAME ; int LogsServices::start(enum LogsServices::LogsView, bool, class QString const &) + diff -r 000000000000 -r 4a5361db8937 logsui/logsservices/eabi/logsservicesu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsservices/eabi/logsservicesu.def Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,3 @@ +EXPORTS + _ZN12LogsServices5startENS_8LogsViewEbRK7QString @ 1 NONAME + diff -r 000000000000 -r 4a5361db8937 logsui/logsservices/logsservices.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsservices/logsservices.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,51 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsservices/src/logsservices.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsservices/src/logsservices.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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, const QString& number) +{ + 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. + + bool res( false ); + int retValue = -1; + if ( number.isEmpty() ){ + XQServiceRequest snd("com.nokia.services.logsservices.starter", + "start(int,bool)", false); + snd << (int)activatedView; + snd << showDialpad; + res=snd.send(retValue); + LOGS_QDEBUG_3( "LogsServices::start <-", activatedView, retValue ) + } else { + XQServiceRequest snd("com.nokia.services.logsservices.starter", + "startWithNum(int,bool,QString)", false); + snd << (int)activatedView; + snd << showDialpad; + snd << number; + res=snd.send(retValue); + LOGS_QDEBUG_3( "LogsServices::start <-", activatedView, retValue ) + } + return res ? retValue : -1; +} diff -r 000000000000 -r 4a5361db8937 logsui/logsservices/tsrc/at_logsservices/at_logsservices.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsservices/tsrc/at_logsservices/at_logsservices.pro Tue May 04 12:39:37 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: +# +# + +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 000000000000 -r 4a5361db8937 logsui/logsservices/tsrc/at_logsservices/inc/at_logsservices.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsservices/tsrc/at_logsservices/inc/at_logsservices.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/logsservices/tsrc/at_logsservices/src/at_logsservices.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsservices/tsrc/at_logsservices/src/at_logsservices.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include "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 000000000000 -r 4a5361db8937 logsui/logsservices/tsrc/at_logsservices/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logsservices/tsrc/at_logsservices/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,54 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/ApplicationControl.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/ApplicationControl.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,85 @@ + + +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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/CommonFunctions.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/CommonFunctions.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,172 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/RunTests.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/RunTests.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,128 @@ +#!/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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/TC_DialledCalls.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/TC_DialledCalls.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,102 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/TC_EventDetails.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/TC_EventDetails.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,64 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/TC_MissedCalls.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/TC_MissedCalls.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,60 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/TC_OptionsMenu.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/TC_OptionsMenu.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,123 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/TC_ReceivedCalls.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/TC_ReceivedCalls.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,60 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/TC_RecentCalls.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/TC_RecentCalls.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,42 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/TC_Toolbar.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/TC_Toolbar.rb Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,56 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/MATTItests/testlist.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/MATTItests/testlist.txt Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,40 @@ +//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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation/install/serviceapp.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation/install/serviceapp.pkg Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,39 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: +; +; Language + +&EN + +; SIS header: name, uid, version +#{"serviceapp"},(0xE0022E73),1,0,0 + +; Localised Vendor name +%{"Nokia, Qt Software"} + +; Unique Vendor name +:"Nokia, Qt Software" + +; Dependencies +[0x101F7961],0,0,0,{"S60ProductID"} +[0x102032BE],0,0,0,{"S60ProductID"} +[0x102752AE],0,0,0,{"S60ProductID"} +[0x1028315F],0,0,0,{"S60ProductID"} +(0x2001E61C), 4, 5, 0, {"QtLibs pre-release"} + +; Executable and default resource files +"\epoc32\release\armv5\urel\serviceapp.exe" - "!:\sys\bin\serviceapp.exe" +"\epoc32\data\z\resource\apps\serviceapp.rsc" - "!:\resource\apps\serviceapp.rsc" +"\epoc32\data\z\private\10003a3f\import\apps\serviceapp_reg.rsc" - "!:\private\10003a3f\import\apps\serviceapp_reg.rsc" diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation/service_conf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation/service_conf.xml Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,7 @@ + + + Telephony service + + Dial interface + + \ No newline at end of file diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation/serviceapp.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation/serviceapp.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,36 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation/src/serviceapp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation/src/serviceapp.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,176 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation/src/serviceapp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation/src/serviceapp.h Tue May 04 12:39:37 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 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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation/src/serviceapp.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation/src/serviceapp.pri Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,23 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation2/install/serviceapp2.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation2/install/serviceapp2.pkg Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,39 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: +; +; Language + +&EN + +; SIS header: name, uid, version +#{"serviceapp2"},(0xE0011E73),1,0,0 + +; Localised Vendor name +%{"Nokia, Qt Software"} + +; Unique Vendor name +:"Nokia, Qt Software" + +; Dependencies +[0x101F7961],0,0,0,{"S60ProductID"} +[0x102032BE],0,0,0,{"S60ProductID"} +[0x102752AE],0,0,0,{"S60ProductID"} +[0x1028315F],0,0,0,{"S60ProductID"} +(0x2001E61C), 4, 5, 0, {"QtLibs pre-release"} + +; Executable and default resource files +"\epoc32\release\armv5\urel\serviceapp2.exe" - "!:\sys\bin\serviceapp2.exe" +"\epoc32\data\z\resource\apps\serviceapp2.rsc" - "!:\resource\apps\serviceapp2.rsc" +"\epoc32\data\z\private\10003a3f\import\apps\serviceapp2_reg.rsc" - "!:\private\10003a3f\import\apps\serviceapp2_reg.rsc" diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation2/service_conf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation2/service_conf.xml Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,7 @@ + + + Telephony service + + Dial interface + + \ No newline at end of file diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation2/serviceapp2.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation2/serviceapp2.pro Tue May 04 12:39:37 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: +# + +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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation2/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation2/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include +#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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation2/src/serviceapp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation2/src/serviceapp.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,126 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation2/src/serviceapp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation2/src/serviceapp.h Tue May 04 12:39:37 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: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/tsrc/callservicesimulation2/src/serviceapp.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/callservicesimulation2/src/serviceapp.pri Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,23 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/tsrc/install/logs_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/install/logs_stub.pkg Tue May 04 12:39:37 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: +; +; A package file for creating SIS stub for Logs + +; Supported languages +&EN + +; Header +#{"Logs"},(0x101F4CD5),1,0,0,TYPE=SA + +; Localised Vendor name +%{"Symbian"} + +; Unique Vendor name +:"Symbian" + + +; Backup registration and restore +""-"z:\private\101F4CD5\backup_registration.xml" + +; User interface +""-"z:\sys\bin\logs.exe" +""-"z:\sys\bin\logsengine.dll" +""-"z:\sys\bin\logsservices.dll" +""-"z:\sys\bin\logscntfinder.dll" +""-"z:\resource\apps\logs.rsc" +""-"z:\private\10003a3f\import\apps\logs_reg.rsc" diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/install/logs_update_udeb.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/install/logs_update_udeb.pkg Tue May 04 12:39:37 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: +; +; 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=SP + +; 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\udeb\logs.exe"-"!:\sys\bin\logs.exe" +"\epoc32\release\armv5\udeb\logsengine.dll"-"!:\sys\bin\logsengine.dll" +"\epoc32\release\armv5\udeb\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 000000000000 -r 4a5361db8937 logsui/tsrc/install/logs_update_urel.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/install/logs_update_urel.pkg Tue May 04 12:39:37 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: +; +; 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 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/addeventtest/data/testlogclients.dat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/addeventtest/data/testlogclients.dat Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,152 @@ +//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 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/addeventtest/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/addeventtest/group/bld.inf Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,24 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +PRJ_EXPORTS + +..\data\testlogclients.dat \epoc32\winscw\c\system\testlogclients.dat + + +// Project files +prj_mmpfiles +logclienttest.mmp \ No newline at end of file diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/addeventtest/group/logclienttest.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/addeventtest/group/logclienttest.mmp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include + +TARGET logclienttest.exe +TARGETTYPE exe +UID 0x100039CE 0x20026F62 +SECUREID 0x20026F62 +SOURCEPATH ..\src +SOURCE clientlogstest.cpp +SOURCE argstest.cpp + +EPOCSTACKSIZE 0x5000 + +USERINCLUDE ..\inc +USERINCLUDE ..\data + +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE \epoc32\include\ecom + + +LIBRARY apparc.lib +LIBRARY avkon.lib +LIBRARY bafl.lib +LIBRARY cone.lib +LIBRARY ecom.lib +LIBRARY eikcoctl.lib +LIBRARY eikcore.lib +LIBRARY euser.lib +LIBRARY fbscli.lib +LIBRARY efsrv.lib +LIBRARY CdlEngine.lib // for scalable ui +LIBRARY flogger.lib +LIBRARY charconv.lib +LIBRARY customapi.lib +LIBRARY logcli.lib +LIBRARY logwrap.lib +LIBRARY estor.lib +LIBRARY inetprotutil.lib + +VENDORID 0x101FB657 + +CAPABILITY ALL -TCB diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/addeventtest/inc/argstest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/addeventtest/inc/argstest.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,175 @@ +/* +* 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 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/addeventtest/inc/clientlogstest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/addeventtest/inc/clientlogstest.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,96 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/addeventtest/install/clientlogstest.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/addeventtest/install/clientlogstest.pkg Tue May 04 12:39:37 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: +; +; +; Installtion file for Cenrep Editor +; +;Languages +&EN +; +; UID is the app's UID +; +#{"clientlogstest"},(0x20026F62),2,0,0 +; +; List of localised vendor names +%{"Vendor-EN"} + +; The non-localised, globally unique vendor name (mandatory) +:"Nokia OY" +;Supports Series 60 v 3.x +;This line indicates that this installation is for the Series 60 platform v3.x +;This line must appear _exactly_ as shown below in the sis file +;If this line is missing or incorrect, the sis file will not be able +;to be installed on Series 60 v3.x platforms +(0x101F7961), 0, 0, 0, {"Series60ProductID"} +; +; Three files to install +; +"\epoc32\release\armv5\udeb\logclienttest.exe" -"!:\sys\bin\logclienttest.exe" +"\epoc32\winscw\c\system\testlogclients.dat" -"!:\system\testlogclients.dat" + + diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/addeventtest/install/sis_udeb.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/addeventtest/install/sis_udeb.bat Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,17 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/addeventtest/src/argstest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/addeventtest/src/argstest.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,400 @@ +/* +* 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 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/addeventtest/src/clientlogstest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/addeventtest/src/clientlogstest.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,404 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/clearlisttest/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/clearlisttest/group/bld.inf Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,21 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +PRJ_EXPORTS + +// Project files +prj_mmpfiles +clearlisttest.mmp \ No newline at end of file diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/clearlisttest/group/clearlisttest.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/clearlisttest/group/clearlisttest.mmp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include + +TARGET clearlisttest.exe +TARGETTYPE exe +UID 0x100039CE 0x20026F63 +SECUREID 0x20026F63 + +SOURCEPATH ..\src +SOURCE clearlisttest.cpp + +EPOCSTACKSIZE 0x5000 + +USERINCLUDE ..\inc + +APP_LAYER_SYSTEMINCLUDE // Application layer domain APIs + +SYSTEMINCLUDE \epoc32\include\ecom + +LIBRARY apparc.lib +LIBRARY avkon.lib +LIBRARY bafl.lib +LIBRARY cone.lib +LIBRARY ecom.lib +LIBRARY eikcoctl.lib +LIBRARY eikcore.lib +LIBRARY euser.lib +LIBRARY fbscli.lib +LIBRARY efsrv.lib +LIBRARY aknskins.lib // for skin background +LIBRARY CdlEngine.lib // for scalable ui +LIBRARY flogger.lib +LIBRARY charconv.lib +LIBRARY customapi.lib +LIBRARY logcli.lib +LIBRARY logwrap.lib +LIBRARY estor.lib + +VENDORID 0x101FB657 + +CAPABILITY ALL -TCB diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/clearlisttest/inc/clearlisttest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/clearlisttest/inc/clearlisttest.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/clearlisttest/install/clearlisttest.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/clearlisttest/install/clearlisttest.pkg Tue May 04 12:39:37 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: +; +; +; Installtion file +; +;Languages +&EN +; +; UID is the app's UID +; +#{"clearlisttest"},(0x20026F63),2,0,0 +; +; List of localised vendor names +%{"Vendor-EN"} + +; The non-localised, globally unique vendor name (mandatory) +:"Nokia OY" +;Supports Series 60 v 3.x +;This line indicates that this installation is for the Series 60 platform v3.x +;This line must appear _exactly_ as shown below in the sis file +;If this line is missing or incorrect, the sis file will not be able +;to be installed on Series 60 v3.x platforms +(0x101F7961), 0, 0, 0, {"Series60ProductID"} +; +; Three files to install +; +"\epoc32\release\armv5\udeb\clearlisttest.exe" -"!:\sys\bin\clearlisttest.exe" + + + diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/clearlisttest/install/sis_udeb.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/clearlisttest/install/sis_udeb.bat Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,17 @@ +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 000000000000 -r 4a5361db8937 logsui/tsrc/logdbmodifier/clearlisttest/src/clearlisttest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logdbmodifier/clearlisttest/src/clearlisttest.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,145 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/tsrc/logscenrepeditor/install/logscenrepeditor.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logscenrepeditor/install/logscenrepeditor.pkg Tue May 04 12:39:37 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: +; +; Language + +&EN + +; SIS header: name, uid, version +#{"logscenrepeditor"},(0xE8316BDD),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"} + + +; Executable and default resource files +"\epoc32\release\armv5\urel\logscenrepeditor.exe" - "!:\sys\bin\logscenrepeditor.exe" +"\epoc32\data\z\resource\apps\logscenrepeditor.rsc" - "!:\resource\apps\logscenrepeditor.rsc" +"\epoc32\data\z\private\10003a3f\import\apps\logscenrepeditor_reg.rsc" - "!:\private\10003a3f\import\apps\logscenrepeditor_reg.rsc" diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logscenrepeditor/logscenrepeditor.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logscenrepeditor/logscenrepeditor.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,36 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 = +CONFIG += hb +DEPENDPATH += . + +INCLUDEPATH += . +INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + +# Input +HEADERS += src/logscenrepeditorview.h +SOURCES += src/main.cpp +SOURCES += src/logscenrepeditorview.cpp + +symbian: { + TARGET.UID2 = 0x100039CE + TARGET.UID3 = 0xE8316BDD + TARGET.CAPABILITY = CAP_APPLICATION AllFiles + LIBS += -lcentralrepository +} diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logscenrepeditor/src/logscenrepeditorview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logscenrepeditor/src/logscenrepeditorview.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,93 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 "logscenrepeditorview.h" + +const QStringList KPredictiveSearchList = (QStringList() + << "Permanently Off" + << "On" + << "Temporarily Off" + << "Not defined"); + +LogsCenrepEditorView::LogsCenrepEditorView() + : HbView(0), + mList(0), + mRepository(0) +{ + qDebug() << "[LOGS_CENREP]-> LogsCenrepEditorView::LogsCenrepEditorView()"; + this->setTitle("Logs cenrep editor"); + + QT_TRAP_THROWING( mRepository = CRepository::NewL( KCRUidLogs ) ); + + TInt value(-1); + TInt err = mRepository->Get( KLogsPredictiveSearch, value ); + qDebug() << "[LOGS_CENREP]-> mRepository->Get(KLogsPredictiveSearch) value: " << value + << ", err: " << err; + + mList = new HbRadioButtonList(this); + mList->setItems(KPredictiveSearchList); + int listCurrentIndex = (err == 0) ? value : KPredictiveSearchList.count()-1; + mList->setSelected(listCurrentIndex); + + HbPushButton* buttonSave = new HbPushButton("Save and Exit", this); + buttonSave->setMinimumHeight(60); + connect(buttonSave, SIGNAL(clicked()), this, SLOT(saveSettings())); + connect(buttonSave, SIGNAL(clicked()), qApp, SLOT(quit())); + + HbPushButton* buttonExit = new HbPushButton("Exit without saving", this); + buttonExit->setMinimumHeight(60); + connect(buttonExit, SIGNAL(clicked()), qApp, SLOT(quit())); + + HbLabel* label = new HbLabel("Predictive search feature", this); + + QGraphicsLinearLayout* layout = new QGraphicsLinearLayout(Qt::Vertical); + layout->addItem(label); + layout->addItem(mList); + layout->addItem(buttonSave); + layout->addItem(buttonExit); + setLayout(layout); +} + + +LogsCenrepEditorView::~LogsCenrepEditorView() +{ + qDebug() << "[LOGS_CENREP]-> LogsCenrepEditorView::~LogsCenrepEditorView()"; + delete mRepository; + qDebug() << "[LOGS_CENREP]<- LogsCenrepEditorView::~LogsCenrepEditorView()"; +} + +void LogsCenrepEditorView::saveSettings() +{ + qDebug() << "[LOGS_CENREP]-> LogsCenrepEditorView::saveSettings()"; + if (mList->selected() < KPredictiveSearchList.count()) { + int err = mRepository->Set( KLogsPredictiveSearch, mList->selected() ); + qDebug() << "[LOGS_CENREP]-> mRepository->Set(KLogsPredictiveSearch), value:" + << mList->selected() << ", err: " << err; + } else { + qDebug() << "[LOGS_CENREP]-> not saving!!"; + } + + qDebug() << "[LOGS_CENREP]<- LogsCenrepEditorView::saveSettings()"; +} diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logscenrepeditor/src/logscenrepeditorview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logscenrepeditor/src/logscenrepeditorview.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef LOGSCENREPEDITORVIEW_H +#define LOGSCENREPEDITORVIEW_H + +#include + +class HbRadioButtonList; +class CRepository; + +class LogsCenrepEditorView : public HbView +{ + Q_OBJECT + +public: + LogsCenrepEditorView (); + virtual ~LogsCenrepEditorView (); + +private slots: + + void saveSettings(); + +private: + + +private: + HbRadioButtonList* mList; + CRepository* mRepository; +}; + +#endif // LOGSCENREPEDITORVIEW_H diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logscenrepeditor/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logscenrepeditor/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 "logscenrepeditorview.h" + +int main(int argc, char *argv[]) +{ + + HbApplication app(argc, argv); + HbMainWindow mainWindow; + LogsCenrepEditorView *view = new LogsCenrepEditorView(); + mainWindow.addView(view); + mainWindow.show(); + + return app.exec(); +} diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logsengineapitester/install/logsengineapitester.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logsengineapitester/install/logsengineapitester.pkg Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,39 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: +; +; Language + +&EN + +; SIS header: name, uid, version +#{"logsengineapitester"},(0xE0014E73),1,0,0 + +; Localised Vendor name +%{"Nokia, Qt Software"} + +; Unique Vendor name +:"Nokia, Qt Software" + +; Dependencies +[0x101F7961],0,0,0,{"S60ProductID"} +[0x102032BE],0,0,0,{"S60ProductID"} +[0x102752AE],0,0,0,{"S60ProductID"} +[0x1028315F],0,0,0,{"S60ProductID"} +(0x2001E61C), 4, 5, 0, {"QtLibs pre-release"} + +; Executable and default resource files +"\epoc32\release\armv5\urel\logsengineapitester.exe" - "!:\sys\bin\logsengineapitester.exe" +"\epoc32\data\z\resource\apps\logsengineapitester.rsc" - "!:\resource\apps\logsengineapitester.rsc" +"\epoc32\data\z\private\10003a3f\import\apps\logsengineapitester_reg.rsc" - "!:\private\10003a3f\import\apps\logsengineapitester_reg.rsc" diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logsengineapitester/logsengineapitester.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logsengineapitester/logsengineapitester.pro Tue May 04 12:39:37 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: +# + +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 000000000000 -r 4a5361db8937 logsui/tsrc/logsengineapitester/src/logsengineapitester.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logsengineapitester/src/logsengineapitester.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,301 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/tsrc/logsengineapitester/src/logsengineapitester.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logsengineapitester/src/logsengineapitester.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/tsrc/logsengineapitester/src/logsengineapitester.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logsengineapitester/src/logsengineapitester.pri Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,23 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/tsrc/logsengineapitester/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logsengineapitester/src/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/tsrc/logsservicestester/install/logsservicestester.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logsservicestester/install/logsservicestester.pkg Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,42 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: +; +; +; Installtion file for Cenrep Editor +; +;Languages +&EN +; +; UID is the app's UID +; +#{"logsservicestester"},(0xEC209DCF),2,0,0 +; +; List of localised vendor names +%{"Vendor-EN"} + +; The non-localised, globally unique vendor name (mandatory) +:"Nokia OY" +;Supports Series 60 v 3.x +;This line indicates that this installation is for the Series 60 platform v3.x +;This line must appear _exactly_ as shown below in the sis file +;If this line is missing or incorrect, the sis file will not be able +;to be installed on Series 60 v3.x platforms +(0x101F7961), 0, 0, 0, {"Series60ProductID"} +; +; Three files to install +; +"\epoc32\release\armv5\udeb\logsservicestester.exe" - "!:\sys\bin\logsservicestester.exe" +"\epoc32\data\z\resource\apps\logsservicestester.rsc" - "!:\resource\apps\logsservicestester.rsc" +"\epoc32\data\z\private\10003a3f\import\apps\logsservicestester_reg.rsc" - "!:\private\10003a3f\import\apps\logsservicestester_reg.rsc" diff -r 000000000000 -r 4a5361db8937 logsui/tsrc/logsservicestester/logsservicestester.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logsservicestester/logsservicestester.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,34 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/tsrc/logsservicestester/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/logsservicestester/main.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/tsrc/qtestutils/inc/testresultxmlparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/qtestutils/inc/testresultxmlparser.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#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 000000000000 -r 4a5361db8937 logsui/tsrc/qtestutils/src/testresultxmlparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/qtestutils/src/testresultxmlparser.cpp Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,178 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this 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 000000000000 -r 4a5361db8937 logsui/tsrc/unittestrunner/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/unittestrunner/tsrc.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,26 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 000000000000 -r 4a5361db8937 logsui/tsrc/unittestrunner/unittest_qt.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/unittestrunner/unittest_qt.pl Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,442 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies 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 $qtProFile" ); + doSystemCall( "sbs reallyclean" ); + doSystemCall( "qmake $qtProFile" ); + + $exclude = "-C \"EXCLUDE+*\tsrc\*\" -C \"EXCLUDE+*/*/tsrc/*\" -C \"EXCLUDE+*/*/*/tsrc/*\" -C \"EXCLUDE+moc_*\""; + + doSystemCall( "call ctcwrap -i d -n $coverageResultsDir$coverageSymbols $exclude -2comp sbs.bat -c 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 000000000000 -r 4a5361db8937 logsui/tsrc/unittestrunner/unittest_qt_config.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/tsrc/unittestrunner/unittest_qt_config.txt Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,4 @@ +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_logs_logsForegroundWatcher.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,ut_logsPageIndicator.xml,ut_logsPageIndicatorItem.xml diff -r 000000000000 -r 4a5361db8937 recents.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recents.pro Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,19 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +TEMPLATE = subdirs +SUBDIRS = logsui +CONFIG += ordered \ No newline at end of file diff -r 000000000000 -r 4a5361db8937 recents_plat/logs_engine_api/inc/logsabstractmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recents_plat/logs_engine_api/inc/logsabstractmodel.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,107 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#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 000000000000 -r 4a5361db8937 recents_plat/logs_engine_api/inc/logscustomfilter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recents_plat/logs_engine_api/inc/logscustomfilter.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 recents_plat/logs_engine_api/inc/logsevent.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recents_plat/logs_engine_api/inc/logsevent.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,348 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 000000000000 -r 4a5361db8937 recents_plat/logs_engine_api/inc/logsfilter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recents_plat/logs_engine_api/inc/logsfilter.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#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 000000000000 -r 4a5361db8937 recents_plat/logs_engine_api/inc/logsmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recents_plat/logs_engine_api/inc/logsmodel.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,190 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 + * @param resourceControl, true will start model in compressed data mode + * where memory usage is minimized and refreshData call is required + * to get all available data + */ + LOGSENGINE_EXPORT explicit LogsModel( + LogsModelType modelType = LogsRecentModel, bool resourceControl = false); + + /** + * 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(); + + /** + * Refresh data if it was compressed, can be used only if resourceControl + * is enabled. + * @return 0 if refreshed + */ + LOGSENGINE_EXPORT int refreshData(); + + /** + * Compress data, minimizes memory usage, can be used only if resourceControl + * is enabled. + * @return 0 if compressed + */ + LOGSENGINE_EXPORT int compressData(); + + /** + * Returns cenrep key status of predictive search feature. + * @return 0 - feature is permanently off and can't be turned on, + * 1 - feature is on + * 2 - feature is temporarily off and can be turned on + * negative value indicates some error in fetching the key + */ + LOGSENGINE_EXPORT int predictiveSearchStatus(); + + /** + * Allows to modify cenrep key value of predictive search features. + * However, this function can't be used if feature is set permanently off + * (see predictiveSearchStatus()) + * @param enabled, specify whether cenrep key will be set to 1 or 2 + * @ return 0 if cenrep key value modified succesfully, + * -1 in case of some error + */ + LOGSENGINE_EXPORT int setPredictiveSearch(bool enabled); + +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 000000000000 -r 4a5361db8937 recents_plat/logs_engine_api_extensions/inc/LogsApiConsts.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recents_plat/logs_engine_api_extensions/inc/LogsApiConsts.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,66 @@ +/* +* 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 000000000000 -r 4a5361db8937 recents_plat/logs_services_api/inc/logsservices.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recents_plat/logs_services_api/inc/logsservices.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies 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 +#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 + * @param number Predefined number for dialpad + * @return 0 if started/activated succesfully + */ + LOGSSERVICES_EXPORT static int start( + LogsView activatedView, bool showDialpad, const QString& number = QString()); + +}; + +#endif //LOGSSERVICES_H diff -r 000000000000 -r 4a5361db8937 recents_plat/logs_timers_api/inc/LogsDomainCRKeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/recents_plat/logs_timers_api/inc/LogsDomainCRKeys.h Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,145 @@ +/* +* 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; + +/** +* KLogsPredictiveSearch +* Controls the feature of predictive search in Logs matches view +* 0 - Predictive search is permanently Off, can't be switched on from Logs +* 1 - Predictive search is On +* 2 - Predicitve search is temporarily Off, can be switched on from Logs +*/ +const TUint32 KLogsPredictiveSearch = 0x0000000D; + + +/**************************************************************************/ + + +#endif // LOGSDOMAINCRKEYS_H diff -r 000000000000 -r 4a5361db8937 sysdef_1_5_0.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysdef_1_5_0.dtd Tue May 04 12:39:37 2010 +0300 @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +