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 |
