This page was last modified 10:47, 22 March 2008.
Как подсчитать количество новых непринятых вызовов
From Forum Nokia Wiki
| ID | Creation date | March 20, 2008 | |
| Platform | S60 3rd, S60 3rd FP1 | Tested on devices | N73, N95 8Gb |
| Category | Symbian C++ | Subcategory | Calls |
| Keywords: Recent missed calls |
Введение
Класс CMissedCallCalc позволяет получить количество новых непринятых вызовов (метод Count()), а также отслеживает их появление. Метод IsCalcCompleted() сигнализирует о том, что подсчет количества новых непринятых вызовов в данный момент не производится.
Класс представляет собой активный объект, соответственно логика его работы представлена ввиде конечного автомата (метод RunL()), набор состояний которого определяется перечислением TState.
Для подписки на оповещение о появлении новых непринятых вызовов используется асинхронный метод NotifyChange() класса CLogClient. Вызов данного метода приводит в вызову RunL() в случае изменения базы данных журналов, но не ранне, чем пройдет указанный временной интервал KTimeDelay. При обнаружении изменений в журналах производится асинхронный вызов метода SetRecentListL() объекта класса CLogViewRecent который используется для дальнейшего асинхронного перебора всех новых записей журналов.
Заголовочный файл (callCalc.h)
#include <e32base.h> #include <logcli.h> #include <logview.h> const TInt KTimeDelay = 1000000; // minimum timeout for notification request class CMissedCallCalc : public CActive { enum TState { EWaitingChange = 1, EReadingLog, EReadingLogItems }; public: static CMissedCallCalc* NewL(); // factory ~CMissedCallCalc(); inline TInt Count() { return iCount; } // missed call count inline TBool IsCalcCompleted() { return iState == EWaitingChange; } // if true - then Count() returns final value protected: CMissedCallCalc(); void ConstructL(); void GetLatestL(); void StartL(); void DoCancel(); void RunL(); private: TInt iCount; // current count of the missed calls TState iState; // current state CLogClient* iLogClient; CLogViewRecent* iRecentLogView; RFs iFsSession; };
Тело класса (callCalc.cpp)
#include "callCalc.h" CMissedCallCalc* CMissedCallCalc :: NewL() { CMissedCallCalc* self = new (ELeave) CMissedCallCalc(); CleanupStack :: PushL( self ); self->ConstructL(); CleanupStack :: Pop(self); return self; } CMissedCallCalc :: CMissedCallCalc(): CActive( CActive :: EPriorityStandard ) { } CMissedCallCalc :: ~CMissedCallCalc() { Cancel(); delete iRecentLogView; iRecentLogView = NULL; delete iLogClient; iLogClient = NULL; iFsSession.Close(); } void CMissedCallCalc :: ConstructL() { CActiveScheduler :: Add( this ); User::LeaveIfError( iFsSession.Connect() ); iLogClient = CLogClient :: NewL( iFsSession ); iRecentLogView = CLogViewRecent :: NewL( *iLogClient ); GetLatestL(); } void CMissedCallCalc :: DoCancel() { if( iRecentLogView ) iRecentLogView->Cancel(); if( iLogClient ) { if( iState == EWaitingChange ) iLogClient->NotifyChangeCancel(); else iLogClient->Cancel(); } } void CMissedCallCalc :: RunL() { if( iStatus != KErrCancel ) switch( iState ) { case EWaitingChange: // new event GetLatestL(); break; case EReadingLog: // start reading log events from last to first if( iRecentLogView->CountL() > 0 ) { iCount = 0; // clear value iState = EReadingLogItems; if( iRecentLogView->LastL( iStatus ) ) // to last event SetActive(); else StartL(); } else StartL(); break; case EReadingLogItems: // reading event if( iStatus == KErrNone && iRecentLogView ) { TLogFlags iFlags = iRecentLogView->Event().Flags(); if( !( iFlags & KLogEventRead ) ) iCount ++; // event is unread - so inc value if( iRecentLogView->PreviousL( iStatus ) ) // try to read prev. event SetActive(); else StartL(); } else StartL(); break; default: StartL(); break; } } void CMissedCallCalc :: StartL() { if( iRecentLogView ) iRecentLogView->Cancel(); iLogClient->Cancel(); iState = EWaitingChange; iLogClient->NotifyChange( TTimeIntervalMicroSeconds32( KTimeDelay ), iStatus ); SetActive(); } void CMissedCallCalc :: GetLatestL() { iState = EReadingLog; iRecentLogView->Cancel(); if( iRecentLogView->SetRecentListL( KLogRecentMissedCalls, iStatus ) ) SetActive(); else StartL(); }
Внутренние ссылки
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Переврд курсора в CEikEdwin | SiNoptik | Russian Developer Forum - Форум Российских разработчиков | 5 | Yesterday 07:06 |
| smsu.lib | truf | Russian Developer Forum - Форум Российских разработчиков | 6 | 2008-01-28 15:24 |
| Делаем основной цикл игры | Ecconaut | Russian Developer Forum - Форум Российских разработчиков | 17 | 2007-12-12 04:32 |
| Поворот на телевизоре картинки выдаваемой Nokia N95 | aragsm | Russian Developer Forum - Форум Российских разработчиков | 5 | 2008-03-14 09:49 |
| Вопрос про XML | vanek_sck | Russian Developer Forum - Форум Российских разработчиков | 3 | 2007-12-22 08:31 |
