cellular/ServiceRequest/src/CServiceRequest.cpp
changeset 0 ff3b6d0fd310
child 19 7d48bed6ce0c
--- /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    <ServiceRequest.rsg>
+
+#include    <AknWaitDialog.h>
+#include    <AknGlobalNote.h>
+#include    <aknnotewrappers.h>
+#include    <avkon.hrh>
+
+#include    <StringLoader.h>
+#include    <gsmerror.h>
+#include    <exterror.h>
+#include    <ConeResLoader.h> 
+#include    <textresolver.h>
+
+
+// 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