pushmtm/ViewerSrc/PushViewerMsgEdAppUi.cpp
changeset 51 48e827313edd
parent 37 481242ead638
child 53 f427d27b98d8
--- a/pushmtm/ViewerSrc/PushViewerMsgEdAppUi.cpp	Tue Feb 02 00:12:41 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,677 +0,0 @@
-/*
-* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "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:  Application Ui member definitions.
-*
-*/
-
-
-
-// INCLUDE FILES
-
-#include "PushViewerMsgEdAppUi.h"
-#include "PushViewerDoc.h"
-#include "PushViewerDef.h"
-#include "PushViewerPanic.h"
-#include "PushMtmUtil.h"
-#include "PushViewer.hrh"
-#include "PushMtmLog.h"
-#include <push/CSIPushMsgEntry.h>
-#include <push/CSLPushMsgEntry.h>
-#include <PushViewer.rsg>
-#include <aknmessagequerydialog.h>
-#include <AknQueryDialog.h>
-#include <MsgEditorView.h>
-#include <MsgBodyControl.h>
-#include <txtrich.h>
-#include <txtfrmat.h>
-#include <txtfmlyr.h>
-#include <gdi.h>
-#include <bldvariant.hrh>
-#include <eikrted.h>
-#include <barsread.h>
-#include <AknNoteWrappers.h>
-#ifdef __SERIES60_HELP
-// Context-Sensitve Help File
-#include <hlplch.h>
-#include <csxhelp/wpush.hlp.hrh>
-#endif // __SERIES60_HELP
-
-#include "eikon.hrh"
-
-// ================= MEMBER FUNCTIONS =======================
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::CPushViewerMsgEdAppUi
-// ---------------------------------------------------------
-//
-CPushViewerMsgEdAppUi::CPushViewerMsgEdAppUi()
-    {
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::~CPushViewerMsgEdAppUi
-// ---------------------------------------------------------
-//
-CPushViewerMsgEdAppUi::~CPushViewerMsgEdAppUi()
-    {
-    PUSHLOG_ENTERFN("CPushViewerMsgEdAppUi::~CPushViewerMsgEdAppUi")
-    delete iView;
-    iView = NULL;
-    delete iContext;
-    iContext = NULL;
-    PUSHLOG_LEAVEFN("CPushViewerMsgEdAppUi::~CPushViewerMsgEdAppUi")
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::ConstructL
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::ConstructL()
-    {
-    PUSHLOG_ENTERFN("CPushViewerMsgEdAppUi::ConstructL")
-
-    CMsgEditorAppUi::ConstructL();
-
-    if ( !iEikonEnv->StartedAsServerApp( ) )
-        {
-        // If the app was not started as server app,
-        // we can call PrepareLaunchL
-        Document()->PrepareToLaunchL( this );
-        }
-
-    PUSHLOG_LEAVEFN("CPushViewerMsgEdAppUi::ConstructL")
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::ConstructBodyTextL
-// ---------------------------------------------------------
-//
-TInt CPushViewerMsgEdAppUi::ConstructBodyTextL
-    ( CMsgBodyControl& aBodyControl1, CMsgBodyControl& aBodyControl2 ) const
-    {
-    PUSHLOG_ENTERFN("CPushViewerMsgEdAppUi::ConstructBodyTextL");
-
-    HBufC* staticText = iEikonEnv->AllocReadResourceLC
-                        ( R_PUSHVIEWER_MAINPANE_TEXT );
-
-    TPtrC renderedTextPtr( *staticText ); // Static text by default.
-    TPtrC renderedHrefPtr( KNullDesC );
-
-    if ( Model().PushMsgType() == KUidWapPushMsgSI.iUid )
-        {
-        CSIPushMsgEntry* si = STATIC_CAST( CSIPushMsgEntry*, &Model() );
-
-        const TPtrC text = si->Text();
-        if ( text.Length() )
-            {
-            renderedTextPtr.Set( text );
-            }
-        else
-            {
-            renderedTextPtr.Set( *staticText );
-            }
-
-        const TPtrC url = si->Url();
-        if ( url.Length() )
-            {
-            renderedHrefPtr.Set( url );
-            }
-        }
-    else if ( Model().PushMsgType() == KUidWapPushMsgSL.iUid )
-        {
-        CSLPushMsgEntry* sl = STATIC_CAST( CSLPushMsgEntry*, &Model() );
-
-        const TPtrC url = sl->Url();
-        if ( url.Length() )
-            {
-            renderedHrefPtr.Set( url );
-            }
-        }
-    else
-        {
-        User::Leave( KErrNotSupported );
-        }
-
-    // The message goes to the first body control by default, but
-    // if it does not fit into one screen, then first comes the href.
-
-    aBodyControl1.InsertTextL( renderedTextPtr );
-
-    CMsgBodyControl* controlContainingTheUrl = NULL;
-    TInt indexOfHrefControl = KErrNotFound;
-
-    // Add the href
-    if ( renderedHrefPtr.Length() == 0 )
-        {
-        // No href.
-        controlContainingTheUrl = NULL;
-        iAvkonAppUi->Cba()->SetCommandSetL( R_PUSHVIEWER_SOFTKEYS );
-        iAvkonAppUi->Cba()->DrawNow();
-        }
-    else
-        {
-        aBodyControl2.InsertTextL( renderedHrefPtr );
-        controlContainingTheUrl = &aBodyControl2;
-        indexOfHrefControl = 1; // Zero based.
-        }
-
-    aBodyControl1.SetPlainTextMode( ETrue );
-    aBodyControl2.SetPlainTextMode( ETrue );
-
-    // Switch on URL highlighting. We use FindItem for it -
-    // otherwise Find Item has no other role!
-    if ( controlContainingTheUrl != NULL )
-        {
-        if ( controlContainingTheUrl->ItemFinder() )
-            {
-            controlContainingTheUrl->
-                ItemFinder()->SetFindModeL( CItemFinder::EUrlAddress );
-            controlContainingTheUrl->
-                SetupAutomaticFindAfterFocusChangeL( ETrue );
-            }
-        controlContainingTheUrl->Editor().SetAlignment( EAknEditorAlignCenter );
-        }
-
-    CleanupStack::PopAndDestroy( staticText ); // staticText
-
-    PUSHLOG_LEAVEFN("CPushViewerMsgEdAppUi::ConstructBodyTextL");
-    return indexOfHrefControl;
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::ConstructViewL
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::ConstructViewL()
-    {
-    CMsgEditorView* newView = CMsgEditorView::NewL
-                              ( *this, CMsgEditorView::EMsgReadOnly );
-    delete iView;
-    iView = newView;
-
-    // Let two body controls: one for the message text and one for the Href
-
-    // There is already one by default - get a pointer to it.
-    CMsgBodyControl* bodyControl1 = REINTERPRET_CAST( CMsgBodyControl*,
-                                    iView->ControlById( EMsgComponentIdBody ) );
-
-    // Create the second:
-    CMsgBodyControl* bodyControl2 = CMsgBodyControl::NewL( iView );
-    CleanupStack::PushL( bodyControl2 );
-    iView->AddControlL( bodyControl2,
-                        /*aControlId*/EMyMsgComponentIdBody,
-                        /*aIndex*/1,
-                        /*aFormComponent*/EMsgBody );
-    CleanupStack::Pop( bodyControl2 ); // bodyControl2
-
-    TInt indexOfHrefControl = ConstructBodyTextL( *bodyControl1, *bodyControl2 );
-
-    // Construct the view.
-    TInt controlIdForFocus = indexOfHrefControl==1?EMyMsgComponentIdBody:EMsgComponentIdBody;
-    iView->ExecuteL( ClientRect(), controlIdForFocus );
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::HandleKeyEventL
-// ---------------------------------------------------------
-//
-TKeyResponse CPushViewerMsgEdAppUi::HandleKeyEventL
-                                    ( const TKeyEvent& aKeyEvent,
-                                      TEventCode aType )
-    {
-    PUSHLOG_WRITE_FORMAT
-        ("CPushViewerMsgEdAppUi::HandleKeyEventL <%d>",aKeyEvent.iCode)
-    // Check for iView and iContext objects are created before Handle
-    if ( (NULL == iView) || (NULL == iContext) )
-        {
-        return (EKeyWasConsumed);
-        }
-
-    if ( aType == EEventKey )
-        {
-        switch ( aKeyEvent.iCode )
-            {
-
-            case EKeyDevice3:
-                {
-                // Selection key pressed. Behave as "Load service" if there is
-                // service to download.
-                const TMsvEntry& context = Model().Entry();
-                if ( CPushMtmUtil::Attrs( context ) & EPushMtmAttrHasHref )
-                    {
-                    HandleCommandL( EPushViewerCmdLoadService );
-                    }
-                break;
-                }
-
-            case EKeyLeftUpArrow:         // Northwest
-            case EStdKeyDevice10:         //   : Extra KeyEvent supports diagonal event simulator wedge
-            case EKeyLeftArrow:           // West
-            case EKeyLeftDownArrow:       // Southwest
-            case EStdKeyDevice13:         //   : Extra KeyEvent supports diagonal event simulator wedge
-                {
-                HandleCommandL( EPushViewerCmdPreviousMessage );
-                break;
-                }
-
-            case EKeyRightUpArrow:        // Northeast
-            case EStdKeyDevice11:         //   : Extra KeyEvent supports diagonal event simulator wedge
-            case EKeyRightArrow:          // East
-            case EKeyRightDownArrow:      // Southeast
-            case EStdKeyDevice12:         //   : Extra KeyEvent supports diagonal event simulator wedge
-                {
-                HandleCommandL( EPushViewerCmdNextMessage );
-                break;
-                }
-
-            case EKeyBackspace :
-                {
-                CAknQueryDialog* dlg = CAknQueryDialog::NewL();
-                if ( dlg->ExecuteLD
-                    ( R_PUSHVIEWER_ENTRY_DELETE_CONFIRM ) == EAknSoftkeyYes )
-                    {
-                    DeleteAndExitL();
-                    }
-                break;
-                }
-
-            default:
-                {
-                iView->OfferKeyEventL( aKeyEvent, aType );
-                break;
-                }
-
-            }
-        }
-
-    return EKeyWasConsumed;
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::DynInitMenuPaneL
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::DynInitMenuPaneL( TInt aMenuId,
-                                         CEikMenuPane* aMenuPane )
-    {
-    if ( aMenuId == R_PUSHVIEWER_OPTIONS_MENU_PANE )
-        {
-        // Remove EPushViewerCmdLoadService if the current message
-        // does not contain URL.
-        CPushMsgEntryBase& modelBase = Model();
-        if ( Model().PushMsgType() == KUidWapPushMsgSI.iUid )
-            {
-            CSIPushMsgEntry& si = (CSIPushMsgEntry&)modelBase;
-            if ( !si.Url().Length() )
-                {
-                aMenuPane->DeleteMenuItem( EPushViewerCmdLoadService );
-                Cba()->SetCommandSetL( R_PUSHVIEWER_SOFTKEYS );
-                }
-            }
-        else if ( Model().PushMsgType() == KUidWapPushMsgSL.iUid )
-            {
-            CSLPushMsgEntry& sl = (CSLPushMsgEntry&)modelBase;
-            __ASSERT_DEBUG( sl.Url().Length() != 0,
-                            ViewerPanic( EPushViewerPanSlEmptyHref ) );
-            if ( !sl.Url().Length() )
-                {
-                aMenuPane->DeleteMenuItem( EPushViewerCmdLoadService );
-                Cba()->SetCommandSetL( R_PUSHVIEWER_SOFTKEYS );
-                }
-            }
-        }
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::Model
-// ---------------------------------------------------------
-//
-CPushMsgEntryBase& CPushViewerMsgEdAppUi::Model() const
-    {
-    PUSHLOG_WRITE_FORMAT("CPushViewerMsgEdAppUi::Model <%x>",iContext)
-    return *iContext;
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::PushDoc
-// ---------------------------------------------------------
-//
-CPushViewerDocument& CPushViewerMsgEdAppUi::PushDoc() const
-    {
-    PUSHLOG_ENTERFN("CPushViewerMsgEdAppUi::PushDoc")
-    return REINTERPRET_CAST( CPushViewerDocument&, *Document() );
-    PUSHLOG_LEAVEFN("CPushViewerMsgEdAppUi::PushDoc")
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::UpdateNaviPaneL
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::UpdateNaviPaneL()
-    {
-    PUSHLOG_ENTERFN("CPushViewerMsgEdAppUi::UpdateNaviPaneL")
-
-    CEikImage* image = new (ELeave) CEikImage;
-    CleanupStack::PushL( image );
-
-    // Read image from resource.
-    //
-    TResourceReader reader;
-    iCoeEnv->CreateResourceReaderLC( reader, R_PUSHVIEWER_NAVI_IMAGE );
-    image->ConstructFromResourceL( reader );
-    CleanupStack::PopAndDestroy(); // reader
-
-    CMsgEditorAppUi::UpdateNaviPaneL( image->Bitmap(), image->Mask() );
-    image->SetPictureOwnedExternally( ETrue );
-
-    CleanupStack::PopAndDestroy(); // image
-
-    PUSHLOG_LEAVEFN("CPushViewerMsgEdAppUi::UpdateNaviPaneL")
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::IsExpired
-// ---------------------------------------------------------
-//
-TBool CPushViewerMsgEdAppUi::IsExpired()
-    {
-    TBool ret( EFalse );
-
-    if ( Document()->Entry().iBioType == KUidWapPushMsgSI.iUid )
-        {
-        CSIPushMsgEntry* si = STATIC_CAST( CSIPushMsgEntry*, iContext );
-        // Check expiration if expiration time was set.
-        if ( si->Expires() != Time::NullTTime() )
-            {
-            TTime today;
-            today.UniversalTime();
-            if ( si->Expires() < today )
-                {
-                ret = ETrue;
-                }
-            }
-        }
-
-    return ret;
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::DoMsgSaveExitL
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::DoMsgSaveExitL()
-    {
-    PUSHLOG_ENTERFN("CPushViewerMsgEdAppUi::DoMsgSaveExitL");
-
-    Exit( EAknSoftkeyBack );
-
-    PUSHLOG_LEAVEFN("CPushViewerMsgEdAppUi::DoMsgSaveExitL")
-    };
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::NotifyAndExitL
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::NotifyAndExitL( TInt aResId )
-    {
-    PUSHLOG_ENTERFN("CPushViewerMsgEdAppUi::NotifyAndExitL");
-
-    HBufC* noteText = iCoeEnv->AllocReadResourceLC( aResId );
-    CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue );
-    note->ExecuteLD( *noteText );
-    CleanupStack::PopAndDestroy( noteText ); // noteText
-
-    // Close the application.
-    if ( !IsAppShutterRunning() )
-        {
-        PUSHLOG_WRITE(" RunAppShutter")
-        RunAppShutter();
-        }
-
-    PUSHLOG_LEAVEFN("CPushViewerMsgEdAppUi::NotifyAndExitL");
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::LaunchViewL
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::LaunchViewL()
-    {
-    __ASSERT_ALWAYS( Document()->Entry().iMtm == KUidMtmWapPush,
-                     ViewerPanic( EPushViewerPanBadMtmType ) );
-
-    // Construct model.
-    CPushMsgEntryBase* newContext = NULL;
-    const TInt32 bioType( Document()->Entry().iBioType );
-
-    if ( bioType == KUidWapPushMsgSI.iUid )
-        {
-        newContext = CSIPushMsgEntry::NewL();
-        }
-    else if ( bioType == KUidWapPushMsgSL.iUid )
-        {
-        newContext = CSLPushMsgEntry::NewL();
-        }
-    else if ( bioType == KUidWapPushMsgMultiPart.iUid )
-        {
-#ifdef __TEST_MULTIPART_SUPP
-        newContext = CMultiPartPushMsgEntry::NewL();
-#else // __TEST_MULTIPART_SUPP
-        User::Leave( KErrNotSupported );
-#endif // __TEST_MULTIPART_SUPP
-        }
-    else
-        {
-        __ASSERT_DEBUG( EFalse, ViewerPanic( EPushViewerPanBadPushType ) );
-        User::Leave( KErrNotSupported );
-        }
-
-    CleanupStack::PushL( newContext );
-    newContext->RetrieveL( Document()->Session(), Document()->Entry().Id() );
-    delete iContext;
-    iContext = NULL;
-    iContext = newContext;
-    CleanupStack::Pop( newContext ); // newContext
-
-    // Construct view.
-    UpdateNaviPaneL();
-    ConstructViewL();
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::HandleEntryChangeL
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::HandleEntryChangeL()
-    {
-    PUSHLOG_ENTERFN("CPushViewerMsgEdAppUi::HandleEntryChangeL");
-
-
-    // We have to act only in case of such changes where the content
-    // of the message changes, not only the unread/read flag.
-    // The content handlers and the Push subsystem behave so that
-    // the content is changed only when the entry becomes 'unread',
-    // except one case where the CH changes the content, but the
-    // message becomes 'read' (SL-execute-high). In this case
-    // a flag indicates that the content was changed.
-
-    // Get an up-to-date entry and check the necessary flags:
-    TMsvEntry tEntry;
-    TMsvId service;
-    TMsvId entryId = Document()->Entry().Id();
-    CMsvSession& msvSession = Document()->Session();
-    User::LeaveIfError( msvSession.GetEntry( entryId, service, tEntry ) );
-    TBool isChangeToUnread = tEntry.Unread();
-    TBool contentChangedFlagSet =
-          CPushMtmUtil::Attrs( tEntry ) & EPushMtmReadButContentChanged;
-
-    if ( !isChangeToUnread && !contentChangedFlagSet )
-        {
-        // Nothing to do. Somebody just set it as read.
-        PUSHLOG_WRITE(" Content not changed");
-        }
-    else
-        {
-        // Show note about the message changes & close the application.
-        NotifyAndExitL( R_PUSHVIEWER_INFO_REPLACED );
-        }
-
-    PUSHLOG_LEAVEFN("CPushViewerMsgEdAppUi::HandleEntryChangeL")
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::HandleEntryDeletedL
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::HandleEntryDeletedL()
-    {
-    PUSHLOG_ENTERFN("CPushViewerMsgEdAppUi::HandleEntryDeletedL");
-    // Check for iView and iContext objects are created before Handle
-    if ( (NULL == iView) || (NULL == iContext))
-        {
-        return;
-        }
-    // Show note about the message deletion & close the application.
-    NotifyAndExitL( R_PUSHVIEWER_INFO_DELETED );
-
-    PUSHLOG_LEAVEFN("CPushViewerMsgEdAppUi::HandleEntryDeletedL")
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::GetHelpContextForControl
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::GetHelpContextForControl
-                           ( TCoeHelpContext& /*aContext*/ ) const
-    {
-    }
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::HandleCommandL
-// See DynInitMenuPaneL() to see which commands are valid
-// on a given type of item.
-// ---------------------------------------------------------
-//
-void CPushViewerMsgEdAppUi::HandleCommandL( TInt aCommand )
-    {
-    PUSHLOG_WRITE_FORMAT("CPushViewerMsgEdAppUi::HandleCommandL <%d>",aCommand)
-    // Check for iView and iContext objects are created before Handle
-    if ( (NULL == iView) || (NULL == iContext))
-        {
-        return;
-        }
-    switch ( aCommand )
-        {
-        case EPushViewerCmdLoadService:
-            {
-            if ( IsExpired() )
-                {
-                // The entry is expired.
-                HBufC* value =
-                    iCoeEnv->AllocReadResourceLC( R_PUSHVIEWER_EXPIRED_NOTE );
-                CAknInformationNote* note =
-                    new (ELeave) CAknInformationNote( ETrue );
-                note->ExecuteLD( *value );
-                CleanupStack::PopAndDestroy( value ); // value
-
-                // Delete the expired message and exit.
-                DeleteAndExitL();
-                }
-            else
-                {
-                PushDoc().IssueLoadServiceL();
-                }
-            break;
-            }
-
-        case EPushViewerCmdDelete:
-            {
-            CAknQueryDialog* dlg = CAknQueryDialog::NewL();
-            if ( dlg->ExecuteLD
-                ( R_PUSHVIEWER_ENTRY_DELETE_CONFIRM ) == EAknSoftkeyYes )
-                {
-                DeleteAndExitL();
-                }
-            break;
-            }
-
-        case EPushViewerCmdMessageInfo:
-            {
-            PushDoc().IssueMessageInfoL();
-            break;
-            }
-
-        case EPushViewerCmdPreviousMessage:
-            {
-            if ( IsNextMessageAvailableL( EFalse ) )
-                {
-                NextMessageL( EFalse );
-                }
-            break;
-            }
-
-        case EPushViewerCmdNextMessage:
-            {
-            if ( IsNextMessageAvailableL( ETrue ) )
-                {
-                NextMessageL( ETrue );
-                }
-            break;
-            }
-
-#ifdef __SERIES60_HELP
-
-        case EPushViewerCmdHelp:
-            {
-            HlpLauncher::LaunchHelpApplicationL
-                ( iEikonEnv->WsSession(), AppHelpContextL() );
-            break;
-            }
-
-#endif //__SERIES60_HELP
-
-        case EPushViewerCmdBack:
-        case EPushViewerCmdExit:
-            {
-            DoMsgSaveExitL();
-            break;
-            }
-
-        default:
-            {
-            break;
-            }
-        }
-    }
-
-#ifdef __SERIES60_HELP
-
-// ---------------------------------------------------------
-// CPushViewerMsgEdAppUi::HelpContextL
-// ---------------------------------------------------------
-//
-CArrayFix<TCoeHelpContext>* CPushViewerMsgEdAppUi::HelpContextL() const
-    {
-    CArrayFix<TCoeHelpContext>* contexts = new (ELeave) CArrayFixFlat<TCoeHelpContext>( 1 );
-    CleanupStack::PushL( contexts );
-    TCoeHelpContext help( TUid::Uid( EUidPushViewerApp ), KWPUSH_HLP_VIEWER );
-    contexts->AppendL( help );
-    CleanupStack::Pop(); // contexts
-    return contexts;
-    }
-
-#endif // __SERIES60_HELP
-
-// End of file.
-