Join Now
Quality Rating:
  • Currently 5.0 / 5
(5.0 / 5 - 1 vote cast)
Expertise Level:
  • Currently 5.0 / 5
(5.0 / 5 - 1 vote cast)

This page was last modified 10:46, 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 Messaging
Keywords: Unread messages, unread emails

Введение

Класс CUnreadMsgCalc позволяет получить количество непрочитанных сообщений, а также отслеживает их появление. Отдельно подсчитывается количество непрочитанных писем электронной почты всех почтовых ящиков, зарегистрированных на текущем устройстве (проверяются только загруженные письма). Для получения нужной информации асинхронно открывается сессия для взаимодействия с сервером сообщений (CMsvSession).

Методы NewMsgCount(), NewEmailCount() используются для получения информации о количестве непрочитанных сообщений и непрочитанных писем. С помощью метода IsCalcCompleted() можно определить, успешно ли открылась сессия и не производится ли подсчет сообщений в данный момент.

Заголовочный файл (msgCalc.h)

#include <msvapi.h>   //MMsvSessionObserver
 
 
class CUnreadMsgCalc: public CBase,
                      public MMsvSessionObserver
{
   public:
      static CUnreadMsgCalc* NewL();  // factory
      virtual ~CUnreadMsgCalc();
 
      inline TBool IsCalcCompleted() { return iCalcCompleted; }  // if true - then NewXXXCount returns correct value
 
      inline TInt NewMsgCount()      { return iNewMsgCount; }
      inline TInt NewEmailCount()    { return iNewEmailPopCount + iNewEmailImapCount; }
      
   private:
      void ConstructL();      
      void CalcUnreadEntriesL( const TMsvId aMsvId, TInt& aCounter ); // read one entry
      
   private: // from MMsvSessionObserver      
      void HandleSessionEventL( TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3 );
	   
   private:      
      CMsvSession* iMsvSession;
      TBool iCalcCompleted;
      TInt iNewMsgCount, iNewEmailPopCount, iNewEmailImapCount;	
};

Тело класса (msgCalc.cpp)

#include "msgCalc.h"
 
#include <cemailaccounts.h> //CEmailAccounts
#include <miutmsg.h>        //CImEmailMessage
#include <miuthdr.h>        //CImHeader
 
CUnreadMsgCalc* CUnreadMsgCalc :: NewL()
{
   CUnreadMsgCalc* self = new ( ELeave ) CUnreadMsgCalc;
   CleanupStack :: PushL( self );
   self->ConstructL();
   CleanupStack :: Pop( self );
   return self;	
}
 
CUnreadMsgCalc :: ~CUnreadMsgCalc()
{
   delete iMsvSession;
   iMsvSession = NULL;
}
 
 
void CUnreadMsgCalc :: ConstructL()
{
   iMsvSession = CMsvSession :: OpenAsyncL( *this );	
}
 
void CUnreadMsgCalc :: CalcUnreadEntriesL( const TMsvId aMsvId, TInt& aCounter )
{
   aCounter = 0;
   CMsvEntry* entry = CMsvEntry :: NewL( *iMsvSession, aMsvId, TMsvSelectionOrdering() );
   CleanupStack::PushL( entry );	
   CMsvEntrySelection* entries = entry->ChildrenL(); 
   CleanupStack::PushL( entries );
   for( TInt i = 0; i < entries->Count(); i++ ) 
   {		
      entry->SetEntryL( entries->At( i ) );
      TMsvEntry msvEntry( entry->Entry() );
      if( msvEntry.Unread() )
         aCounter++;
   }    
   CleanupStack::PopAndDestroy( 2 ); // entries entry
}
 
 
void CUnreadMsgCalc :: HandleSessionEventL( TMsvSessionEvent aEvent, TAny* aArg1, TAny* aArg2, TAny* aArg3 )
{
   switch( aEvent )
   {
      case EMsvServerReady:
      case EMsvEntriesCreated:
      case EMsvEntriesChanged:
      case EMsvEntriesDeleted:
      case EMsvEntriesMoved:
      {		 			
         iCalcCompleted = EFalse;
    	 CalcUnreadEntriesL( KMsvGlobalInBoxIndexEntryId, iNewMsgCount ); // reading global indox
    	  
         CEmailAccounts* mailAccount = CEmailAccounts::NewLC(); // get email accounts list
         
         iNewEmailPopCount = 0;
         RArray< TPopAccount >  popAccounts( 10 );    
         mailAccount->GetPopAccountsL( popAccounts );           
         CleanupClosePushL( popAccounts );
         for( TInt i = 0; i < popAccounts.Count(); i++ ) // reading all email inboxes (POP)
         {
            TInt iCounter = 0;
            CalcUnreadEntriesL( popAccounts[i].iPopService, iCounter );
            iNewEmailPopCount += iCounter;
         }
	         
         iNewEmailImapCount = 0;
         RArray< TImapAccount > imapAccounts( 10 );    
         mailAccount->GetImapAccountsL( imapAccounts );
         CleanupClosePushL( imapAccounts );
         for( TInt i = 0; i < imapAccounts.Count(); i++ )   // reading all email inboxes (IMAP)
         {
            TInt iCounter = 0;
            CalcUnreadEntriesL( imapAccounts[i].iImapService, iCounter );
            iNewEmailImapCount += iCounter;
         }         
         CleanupStack::PopAndDestroy( 3 ); // imapAccounts popAccounts mailAccount
         iCalcCompleted = ETrue;
      }  break;
 
      default:
         break; 
   }	
}

Внутренние ссылки

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