/* Copyright (c) 2003, Nokia. All rights reserved */
// INCLUDE FILES
#include <eikenv.h>
#include <coemain.h>
#include <e32std.h>
#include <msvids.h>
#include <msvstd.h>
#include <smsclnt.h>
#include <smut.h>
#include <mtclreg.h>
#include <txtrich.h>
#include <smscmds.h>
#include <mtmuibas.h>
#include <mtmdef.h>
#include <AknNoteWrappers.h>
#include <stringloader.h>
#include <smssend.rsg>
#include "CSmsHandler.h"
#include "CSmsAppUi.h"
#include "smutset.h"
#include "smuthdr.h"
// ============================ MEMBER FUNCTIONS ===============================
// -----------------------------------------------------------------------------
// CSmsHandler::CSmsHandler()
// C++ default constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CSmsHandler::CSmsHandler( CSmsAppUi* aSmsAppUi )
: CActive( CActive::EPriorityStandard )
{
CActiveScheduler::Add( this );
iSmsAppUi = aSmsAppUi; // pointer to AppUi
iNextUnread = 0; // index of next unread message in iSelection
}
// -----------------------------------------------------------------------------
// CSmsHandler::ConstructL()
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CSmsHandler::ConstructL()
{
// Session to message server is opened asynchronously.
iSession = CMsvSession::OpenAsyncL( *this );
// Entry selection for all received messages.
iSelection = new ( ELeave ) CMsvEntrySelection();
}
// -----------------------------------------------------------------------------
// CSmsHandler::NewL()
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CSmsHandler* CSmsHandler::NewL( CSmsAppUi* aSmsAppUi )
{
CSmsHandler* self = NewLC( aSmsAppUi );
CleanupStack::Pop( self );
return self;
}
// -----------------------------------------------------------------------------
// CSmsHandler::NewLC()
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CSmsHandler* CSmsHandler::NewLC( CSmsAppUi* aSmsAppUi )
{
CSmsHandler* self = new ( ELeave ) CSmsHandler( aSmsAppUi );
CleanupStack::PushL( self );
self->ConstructL();
return self;
}
// ----------------------------------------------------------
// CSmsHandler::~CSmsHandler()
// Destructor.
// ----------------------------------------------------------
//
CSmsHandler::~CSmsHandler()
{
Cancel(); // cancel any outstanding request
delete iOperation;
delete iMtmUiRegistry;
delete iSelection;
delete iSmsMtm;
delete iMtmRegistry;
delete iSession; // session must be deleted last
}
// -----------------------------------------------------------------------------
// CSmsHandler::DoCancel()
// Cancels a request.
// -----------------------------------------------------------------------------
//
void CSmsHandler::DoCancel()
{
if ( iOperation )
{
iOperation->Cancel();
}
}
// -----------------------------------------------------------------------------
// CSmsHandler::RunL()
// Handles request completion events.
// -----------------------------------------------------------------------------
//
void CSmsHandler::RunL()
{
User::LeaveIfError( iStatus != KErrNone );
// Determine the current operations progress.
// ProgressL returns an 8 bit descriptor.
TBufC8<KMsvProgressBufferLength> progress( iOperation->ProgressL() );
_LIT8( KCompare, "KErrNone" );
User::LeaveIfError( !progress.Compare( KCompare ) );
// The pointer to the current CMsvOperation object is no longer needed.
delete iOperation;
iOperation = NULL;
// Determine which request has finished.
switch ( iState )
{
case EWaitingForMoving:
// Once a message is moved to Outbox it is scheduled for sending.
ScheduleL();
break;
case EWaitingForScheduling:
{
TMsvEntry entry( iSmsMtm->Entry().Entry() );
TInt state( entry.SendingState() );
if ( state == KMsvSendStateWaiting || state == KMsvSendStateScheduled)
{
HBufC* text = StringLoader::LoadLC( R_SMS_MOVED_TO_OUTBOX );
CAknInformationNote* informationNote =
new ( ELeave ) CAknInformationNote;
informationNote->ExecuteLD( *text );
CleanupStack::PopAndDestroy( text );
}
break;
}
default:
break;
}
}
// -----------------------------------------------------------------------------
// CSmsHandler::HandleSessionEventL()
// Handles notifications of events from the Message Server.
// -----------------------------------------------------------------------------
//
void CSmsHandler::HandleSessionEventL( TMsvSessionEvent aEvent,
TAny* aArg1, TAny* aArg2, TAny* /*aArg3*/)
{
switch ( aEvent )
{
// Session to server established
case EMsvServerReady:
{
TMsvId serviceId( KUidMsgTypeSMS.iUid ); // SMS service id
// Determine if the event was succesful.
// ServiceProgress inserts TBuf8 value in progress.
TBuf8<KBfrLength> progress;
iSession->ServiceProgress( serviceId, progress );
_LIT8( KCompare, "KErrNone" );
if ( progress.Compare( KCompare ) )
{
HBufC* text = StringLoader::LoadLC( R_SMS_SERVER_SESSION );
CAknInformationNote* informationNote =
new ( ELeave ) CAknInformationNote;
informationNote->ExecuteLD( *text );
CleanupStack::PopAndDestroy( text );
// Check that MtmRegistry has not already been accessed.
if ( !iMtmRegistry )
{
AccessMtmL();
}
}
else
{
HBufC* text = StringLoader::LoadLC( R_SMS_SESSION_ERROR );
CAknErrorNote* errorNote = new ( ELeave ) CAknErrorNote;
errorNote->ExecuteLD( *text );
CleanupStack::PopAndDestroy( text );
}
break;
}
// A new entry has been created on the message server.
case EMsvEntriesCreated:
{
// Entry id is obtained from the session event arguments.
TMsvId* entryId = STATIC_CAST( TMsvId*, aArg2 );
// We are interested in messages that are created in Inbox.
if ( *entryId != KMsvGlobalInBoxIndexEntryId )
{
break;
}
// We take the created entries into a selection
CMsvEntrySelection* newEntries =
STATIC_CAST( CMsvEntrySelection*, aArg1 );
// Process each created entry.
for ( TInt i( 0 ); i < newEntries->Count(); i++ )
{
// We are interested in SMS messages.
if ( ( iSession->GetEntryL( newEntries->At( i ) ) )
->Entry().iMtm == KUidMsgTypeSMS )
{
// Add the entry to the selection of all received messages.
iSelection->AppendL( newEntries->At( i ), 1 );
// Set received messages visible.
MessageReceivedL( newEntries->At( i ) );
}
}
break;
}
case EMsvCloseSession:
case EMsvServerT
评论0