diff -r 000000000000 -r ff3b6d0fd310 cellular/ServiceRequest/src/CServiceRequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cellular/ServiceRequest/src/CServiceRequest.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,401 @@ +/* +* Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Interface for service request +* +*/ + + + +// INCLUDE FILES +#include "CServiceRequest.h" +#include "MServiceRequestObserver.h" +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +// CONSTANTS +_LIT( KSerqResourcesWithFullPath,"z:\\resource\\ServiceRequest.rsc" ); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CServiceRequest::CServiceRequest +// C++ default constructor can NOT contain any code that +// might leave. +// ----------------------------------------------------------------------------- +// +CServiceRequest::CServiceRequest( MServiceRequestObserver& aObserver ) +: CActive(EPriorityStandard) , iObserver( aObserver ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CServiceRequest::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CServiceRequest::ConstructL() + { + iResourceLoader = new(ELeave) RConeResourceLoader( *CCoeEnv::Static() ); + TFileName fileName( KSerqResourcesWithFullPath ); + iResourceLoader->OpenL(fileName); + } + +// ----------------------------------------------------------------------------- +// CServiceRequest::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CServiceRequest* CServiceRequest::NewL( MServiceRequestObserver& aObserver ) + { + CServiceRequest* self = new( ELeave ) CServiceRequest( aObserver ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// Destructor +EXPORT_C CServiceRequest::~CServiceRequest() + { + Reset(); + + if ( iResourceLoader ) + { + iResourceLoader->Close(); + } + delete iResourceLoader; + iResourceLoader = NULL; + + // If instance is deleted in call back - inform the function. + if ( iDestroyed ) + { + *iDestroyed = ETrue; + } + } + +// ----------------------------------------------------------------------------- +// CServiceRequest::Reset +// Deletes used member data +// ----------------------------------------------------------------------------- +// +void CServiceRequest::Reset() + { + Cancel(); + + delete iRequestingNote; + iRequestingNote = NULL; + + delete iNoteText; + iNoteText = NULL; + } + +// ----------------------------------------------------------------------------- +// CServiceRequest::StartL +// Launches the request note. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CServiceRequest::StartL( const TDesC& aText ) + { + + // delete possible old data: + Reset(); + + // Choose alternative "requesting" text if given + if ( aText.Length() ) + { + iNoteText = aText.AllocL(); + } + + // Create note and launch it. + CAknWaitDialog* requestingNote = new(ELeave) CAknWaitDialog( + (REINTERPRET_CAST(CEikDialog**,&iRequestingNote)) , ETrue ); + iRequestingNote = requestingNote; + requestingNote->PrepareLC( R_SERQ_REQUESTING_WAIT_NOTE ); + if ( iNoteText ) + { + requestingNote->SetTextL( iNoteText->Des() ); + } + requestingNote->SetCallback( this ); + requestingNote->RunLD(); + } + +// ----------------------------------------------------------------------------- +// CServiceRequest::DialogDismissedL +// Called when the note is cancelled. Observer call made asyncronously. +// ----------------------------------------------------------------------------- +// +void CServiceRequest::DialogDismissedL( TInt aButtonId ) + { + Cancel(); + + if ( aButtonId == EAknSoftkeyQuit || aButtonId == EEikBidCancel ) + { + // Activate new request + TRequestStatus* status = &iStatus; + User::RequestComplete( status, aButtonId ); + SetActive(); + } + } + +// ----------------------------------------------------------------------------- +// CServiceRequest::ShowCompletionNoteL +// Removes the wait note and shows another note if needed. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CServiceRequest::ShowCompletionNoteL( + TBool aShowNote, + TInt aError, + TSerqNoteType aNoteType, + const TDesC& aText ) + { + // delete old instances + Reset(); + + // if new notes are not required + if ( !aShowNote ) + { + return; + } + + // Check default note appearance + TInt defaultTextId; + TSerqNoteType defaultNoteType; + GetDefaultNote( aError , defaultNoteType , defaultTextId ); + + // Choose text + if ( aText.Length() ) + { + iNoteText = aText.AllocL(); + } + else + { + // read from resources + iNoteText = StringLoader::LoadL( defaultTextId, CCoeEnv::Static() ); + } + + // Choose note type + TSerqNoteType noteType; + if ( aNoteType != ESerqDefault ) + { + noteType = aNoteType; + } + else + { + noteType = defaultNoteType; + } + + // Start note + LaunchNoteL( noteType ); + } + +// ----------------------------------------------------------------------------- +// CServiceRequest::GetDefaultNote +// Decides note type based on the given error value. +// ----------------------------------------------------------------------------- +// +void CServiceRequest::GetDefaultNote( + const TInt aError, + TSerqNoteType& aNoteType, + TInt& aResourceId ) + { + switch ( aError ) + { + case KErrNone: + aResourceId = R_TEXT_DONE; + aNoteType = ESerqGlobalConfirmationNote; + break; + case KErrCancel: + aResourceId = R_TEXT_UNCONFIRMED; + aNoteType = ESerqLocalInformationNote; + break; + case KErrInUse: + case KErrAccessDenied: + case KErrGsmSSUnknownSubscriber: + case KErrGsmSSAbsentSubscriber: + case KErrGsmSSIllegalOperation: + case KErrGsmSSIllegalSubscriber: + case KErrGsmSSSubscriptionViolation: + case KErrGsmSSIllegalEquipment: + aResourceId = R_TEXT_NOT_ALLOWED; + aNoteType = ESerqGlobalInformationNote; + break; + case KErrGsmSSCallBarred: + case KErrGsmSSIncompatibility: + aResourceId = R_QTN_SRVRQ_INFO_CONFL; + aNoteType = ESerqGlobalInformationNote; + break; + case KErrGsmSSSystemFailure: + aResourceId = R_TEXT_RESULT_UNKNOWN; + aNoteType = ESerqGlobalInformationNote; + break; + case KErrGsmSSErrorStatus: + case KErrGsmSSUnexpectedDataValue: + case KErrGsmSSResourcesUnavailable: + aResourceId = R_TEXT_REQUEST_REJECTED; + aNoteType = ESerqGlobalInformationNote; + break; + case KErrGsmSSPasswordAttemptsViolation: + case KErrGsmSSNegativePasswordCheck: + case KErrGsmSSPasswordRegistrationFailure: + aResourceId = R_PASSWORD_ERROR_NOTE; + aNoteType = ESerqGlobalErrorNote; + break; + case KErrGsmNoService: + aResourceId = R_TEXT_NO_SERVICE; + aNoteType = ESerqGlobalInformationNote; + break; + default: + aResourceId = R_TEXT_NOT_DONE; + aNoteType = ESerqGlobalInformationNote; + break; + } + } + +// ----------------------------------------------------------------------------- +// CServiceRequest::LaunchNoteL +// Launches given note type. Text is got from iNoteText member variable. +// ----------------------------------------------------------------------------- +// +void CServiceRequest::LaunchNoteL( const TSerqNoteType aNoteType) + { + + switch ( aNoteType ) + { + case ESerqLocalInformationNote: + case ESerqLocalConfirmationNote: + { + CAknResourceNoteDialog* dlg = NULL; + if ( aNoteType == ESerqLocalInformationNote ) + { + dlg = new ( ELeave ) CAknInformationNote( ETrue ); + } + else + { + dlg = new ( ELeave ) CAknConfirmationNote( ETrue ); + } + dlg->ExecuteLD( iNoteText->Des() ); + + delete iNoteText; + iNoteText = NULL; + break; + } + case ESerqGlobalInformationNote: + case ESerqGlobalErrorNote: + case ESerqGlobalConfirmationNote: + { + CAknGlobalNote* dlg = CAknGlobalNote::NewLC(); + if ( aNoteType == ESerqGlobalInformationNote ) + { + dlg->ShowNoteL( EAknGlobalInformationNote , iNoteText->Des() ); + } + else if ( aNoteType == ESerqGlobalErrorNote ) + { + dlg->ShowNoteL( EAknGlobalErrorNote , iNoteText->Des() ); + } + else + { + dlg->ShowNoteL( EAknGlobalConfirmationNote , iNoteText->Des() ); + } + CleanupStack::PopAndDestroy( dlg ); + delete iNoteText; + iNoteText = NULL; + break; + } + default: + User::Invariant(); + break; + } + } + +// ----------------------------------------------------------------------------- +// CServiceRequest::RunL +// Calls observer interface to tell that the notes has been dismissed. +// ----------------------------------------------------------------------------- +// +void CServiceRequest::RunL() + { + __ASSERT_ALWAYS( !iDestroyed, User::Invariant() ); + + TBool destr = EFalse; // Destructor changes to ETrue if deleted. + iDestroyed = &destr; + + // Object still exists and the note is cancelled: + TRAPD( error , + iObserver.MServiceRequestNoteCancelledL( iStatus.Int() == EEikBidCancel ) ); + + // All OK + if ( error == KErrNone ) + { + if ( !destr ) + { + iDestroyed = NULL; + } + return; + } + + // We got an error value. + if ( !destr ) + { + iDestroyed = NULL; + User::Leave( error ); + } + else + { + CTextResolver* textResolver = CTextResolver::NewLC(); + HBufC* buffer = textResolver->ResolveErrorString( error ).AllocLC(); + CAknGlobalNote* note = CAknGlobalNote::NewLC(); + note->ShowNoteL( EAknGlobalErrorNote, *buffer ); + CleanupStack::PopAndDestroy( note ); + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( textResolver ); + } + } + +// --------------------------------------------------------- +// CServiceRequest::RunError +// Called when RunL leaves +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CServiceRequest::RunError( TInt /*aError*/ ) + { + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CServiceRequest::DoCancel +// Does nothing. Must be implemented due inheritance. +// ----------------------------------------------------------------------------- +// +void CServiceRequest::DoCancel() + { + } + +// End of File