Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

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
 
Powered by MediaWiki