Revision: 201033
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 03 Sep 2010 07:53:25 +0300
changeset 1 753e33780645
parent 0 39ab869ed429
child 2 453d490c84a5
Revision: 201033 Kit: 201035
htiui/HtiServicePlugins/HtiAppServicePlugin/src/HtiAppControl.cpp
htiui/HtiServicePlugins/HtiMessagesServicePlugin/group/HtiMessagesServicePlugin.mmp
htiui/HtiServicePlugins/HtiMessagesServicePlugin/inc/HtiMessagesServicePlugin.h
htiui/HtiServicePlugins/HtiMessagesServicePlugin/inc/HtiNotificationHandler.h
htiui/HtiServicePlugins/HtiMessagesServicePlugin/src/HtiMessagesServicePlugin.cpp
htiui/HtiServicePlugins/HtiMessagesServicePlugin/src/HtiNotificationHandler.cpp
htiui/HtiServicePlugins/HtiPIMServicePlugin/group/HtiPIMServicePlugin.mmp
htiui/HtiServicePlugins/HtiPIMServicePlugin/inc/HtiPIMServicePlugin.h
htiui/HtiServicePlugins/HtiPIMServicePlugin/src/HtiPIMServicePlugin.cpp
htiui/HtiServicePlugins/HtiSysInfoServicePlugin/src/HtiSysInfoServicePlugin.cpp
htiui/sis/HTI_S60-10_1.pkg
htiui/sis/HTI_S60-52.pkg
htiui/sis/HTI_S60_Upgrade-10_1.pkg
htiui/sis/HTI_S60_Upgrade-52.pkg
htiui/sis/HTI_stub.pkg
htiui/symbian_version.hrh
layers.sysdef.xml
stifui/avkon/group/ReleaseNote.txt
stifui/avkon/stifui/data/Stifui.rss
stifui/avkon/stifui/inc/version.h
sysdef_1_4_0.dtd
--- a/htiui/HtiServicePlugins/HtiAppServicePlugin/src/HtiAppControl.cpp	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/HtiServicePlugins/HtiAppServicePlugin/src/HtiAppControl.cpp	Fri Sep 03 07:53:25 2010 +0300
@@ -33,12 +33,12 @@
 #include <SWInstApi.h>
 #include <swi/sisregistrysession.h>
 #include <swi/sisregistrypackage.h>
+#include <widgetregistryclient.h>
 #else
 #include <usif/sif/sif.h>
 #include <usif/scr/scr.h>    //RSoftwareComponentRegistry
 #endif
 #include <javaregistryincludes.h>
-#include <widgetregistryclient.h>
 
 using namespace Java;
 #if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_4 )
@@ -49,6 +49,7 @@
 _LIT8( KJarMIMEType, "application/java-archive" );
 _LIT8( KJavaMIMEType, "application/java");
 _LIT8( KJarxMIMEType, "application/x-java-archive");
+_LIT8( KWidgetMime, "application/x-nokia-widget");
 #endif
 
 // CONSTANTS
--- a/htiui/HtiServicePlugins/HtiMessagesServicePlugin/group/HtiMessagesServicePlugin.mmp	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/HtiServicePlugins/HtiMessagesServicePlugin/group/HtiMessagesServicePlugin.mmp	Fri Sep 03 07:53:25 2010 +0300
@@ -17,6 +17,7 @@
 
 
 #include <platform_paths.hrh>
+#include "../../../symbian_version.hrh"
 
 TARGET          HtiMessagesServicePlugin.dll
 TARGETTYPE      PLUGIN
@@ -34,6 +35,9 @@
 SOURCE          HtiIAPHandler.cpp
 SOURCE          HtiMailboxHandler.cpp
 SOURCE          HtiMsgSettingsHandler.cpp
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+SOURCE          HtiNotificationHandler.cpp
+#endif
 
 USERINCLUDE     ../inc
 APP_LAYER_SYSTEMINCLUDE
@@ -62,6 +66,13 @@
 LIBRARY         mmsserversettings.lib
 LIBRARY         flogger.lib
 
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+// For CHtiNotificationHandler to create voice message notification
+LIBRARY         avkon.lib
+LIBRARY         aknnotify.lib
+LIBRARY         aknnotifyplugin.lib
+#endif
+
 SMPSAFE
 
 // End of file
--- a/htiui/HtiServicePlugins/HtiMessagesServicePlugin/inc/HtiMessagesServicePlugin.h	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/HtiServicePlugins/HtiMessagesServicePlugin/inc/HtiMessagesServicePlugin.h	Fri Sep 03 07:53:25 2010 +0300
@@ -22,6 +22,7 @@
 
 // INCLUDES
 #include <HtiServicePluginInterface.h>
+#include "../../../symbian_version.hrh"
 
 // CONSTANTS
 const TInt KHtiMessagesServiceUidValue = 0x10210CCF; // ECOM Implementation UID
@@ -32,6 +33,9 @@
 class CHtiIAPHandler;
 class CHtiMailboxHandler;
 class CHtiMsgSettingsHandler;
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+class CHtiNotificationHandler;
+#endif
 
 // CLASS DECLARATION
 
@@ -74,6 +78,12 @@
         ESetSmsSettings      = 0x42,
         ESetMmsSettings      = 0x45,
 
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+        // NotificationHandler
+        ECreateVoiceMessageNotification = 0x50,
+        EClearAllNotifications          = 0x51,
+#endif
+        
         // only for response message
         EResultOk            = 0xFF,
         };
@@ -97,6 +107,9 @@
     CHtiIAPHandler*         iIAPHandler;
     CHtiMailboxHandler*     iMailboxHandler;
     CHtiMsgSettingsHandler* iMsgSettingsHandler;
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+    CHtiNotificationHandler* iNotificationHandler;
+#endif
     };
 
 #endif // CHTIMESSAGESSERVICEPLUGIN_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiui/HtiServicePlugins/HtiMessagesServicePlugin/inc/HtiNotificationHandler.h	Fri Sep 03 07:53:25 2010 +0300
@@ -0,0 +1,169 @@
+/*
+* Copyright (c) 2009 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:  HTI NCN notification creating handler.
+*
+*/
+
+
+#ifndef CHTINOTIFICATIONHANDLER_H
+#define CHTINOTIFICATIONHANDLER_H
+
+
+// INCLUDES
+#include <HtiServicePluginInterface.h>
+#include <etelmm.h>
+
+// CONSTANTS
+
+// MACROS
+
+// DATA TYPES
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// CLASS DECLARATION
+#include <AknNotifyStd.h>       //TAknSoftNotificationType
+#include <AknSoftNotifier.h>    //CAknSoftNotifier
+#include <AknSoftNotificationParameters.h>  //CAknSoftNotificationParameters
+
+/**
+*  HTI NCN notification creating handler.
+*/
+class CHtiNotificationHandler : public CActive
+    {
+    public:
+
+        /**
+        * Two-phased constructor.
+        */
+        static CHtiNotificationHandler* NewL();
+
+        /**
+        * Called when there is a message to be processed by this service.
+        * @param aMessage message body destinated to the servive
+        * @param aPriority message priority
+        */
+        void ProcessMessageL( const TDesC8& aMessage,
+                              THtiMessagePriority aPriority );
+
+        /**
+        * Destructor.
+        */
+        virtual ~CHtiNotificationHandler();
+
+        /**
+        * Sets the dispatcher to send outgoing messages to.
+        * @param aDispatcher pointer to dispatcher instance
+        */
+        void SetDispatcher( MHtiDispatcher* aDispatcher );
+    
+    protected:
+        /*! from CActive */
+        void RunL();
+        /* from CActive */
+        void DoCancel();
+        /*! from CActive */
+        TInt RunError(TInt aError);
+
+    private:
+
+        /**
+        * C++ default constructor.
+        */
+        CHtiNotificationHandler();
+
+        /**
+        * 2nd phase constructor.
+        */
+        void ConstructL();
+
+    private:
+        /**
+        * Indicator support values.
+        */
+    enum TNcnIndicator
+        {
+        ENcnIndicatorFax,
+        ENcnIndicatorEmail,
+        ENcnIndicatorOther,
+        ENcnIndicatorVMLine1,
+        ENcnIndicatorVMLine2,
+        
+        ENcnIndicatorLast // This must be last            
+        }; // TNcnIndicator 
+    
+    enum TNcnCommand
+        {
+        ENcnSetIndicator,
+        ENcnResetIndicator
+        }; //TNcnCommand
+    
+    struct TNcnReqQueueElement
+        {
+        TNcnReqQueueElement(TNcnCommand aCmd, TNcnIndicator aIndicator, TUint aMsgCount, TBool aEnable)
+            {
+            iCmd = aCmd;
+            iIndicator = aIndicator;
+            iMsgCount = aMsgCount;
+            iEnable = aEnable;
+            }
+        TNcnCommand iCmd;
+        TNcnIndicator iIndicator;
+        TUint iMsgCount; 
+        TBool iEnable;
+        };
+    
+    private: // helpers
+
+        void HandleCreateVoiceMessageNotificationL( const TDesC8& aData );
+        void HandleClearAllNotificationsL( const TDesC8& aData );
+        
+        CAknSoftNotificationParameters* CreateNotificationParametersLC( TBool aAmountKnown );
+        void ShowNewItemsL( CAknSoftNotifier* aNotifier, 
+                const TAknSoftNotificationType aNotificationType, const TInt aAmount );
+        void SetNotificationL(TUint aAmount);
+        void SetIndicator(const TNcnIndicator aIndicator, TUint aMsgCount, TBool aEnable);
+        void ResetIndicator();
+
+        void SendOkMsgL( const TDesC8& aData );
+        void SendErrorMessageL( TInt aError, const TDesC8& aDescription );
+
+    private:  // Data
+        // Needed to initialize mobilePhone
+        RTelServer iTelServer;
+        
+        // Needed to initialize mobilePhone
+        RTelServer::TPhoneInfo iPhoneInfo;
+            
+        // Used to store indicator flags and message counts. 
+        RMobilePhone iMobilePhone;
+        
+        // Struct is a container for indicator flags and message counts
+        RMobilePhone::TMobilePhoneMessageWaitingV1      iMsgWaiting;
+        
+        // Package for iMsgWaitingV1                      
+        RMobilePhone::TMobilePhoneMessageWaitingV1Pckg  iMsgWaitingPckg;
+        
+        // Pointer to the dispatcher (referenced)
+        MHtiDispatcher* iDispatcher; // referenced
+        
+        TUint iVoiceMailsInLine1;
+        
+        RArray<TNcnReqQueueElement> iReqQueue;          
+    };
+
+
+#endif // CHTINOTIFICATIONHANDLER_H
--- a/htiui/HtiServicePlugins/HtiMessagesServicePlugin/src/HtiMessagesServicePlugin.cpp	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/HtiServicePlugins/HtiMessagesServicePlugin/src/HtiMessagesServicePlugin.cpp	Fri Sep 03 07:53:25 2010 +0300
@@ -22,6 +22,9 @@
 #include "HtiIAPHandler.h"
 #include "HtiMailboxHandler.h"
 #include "HtiMsgSettingsHandler.h"
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+#include "HtiNotificationHandler.h"
+#endif
 
 #include <HtiDispatcherInterface.h>
 #include <HtiLogging.h>
@@ -54,6 +57,9 @@
     delete iIAPHandler;
     delete iMailboxHandler;
     delete iMsgSettingsHandler;
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+    delete iNotificationHandler;
+#endif
     }
 
 // ----------------------------------------------------------------------------
@@ -117,6 +123,18 @@
         iMsgSettingsHandler->ProcessMessageL( aMessage, aPriority );
         }
 
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+    else if ( command >= ECreateVoiceMessageNotification && command <= EClearAllNotifications)
+        {
+        if( !iNotificationHandler )
+            {
+            iNotificationHandler = CHtiNotificationHandler::NewL();
+            iNotificationHandler->SetDispatcher(iDispatcher);
+            }
+        iNotificationHandler->ProcessMessageL( aMessage, aPriority );
+        }
+#endif
+
     else
         {
         User::LeaveIfError( iDispatcher->DispatchOutgoingErrorMessage(
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/htiui/HtiServicePlugins/HtiMessagesServicePlugin/src/HtiNotificationHandler.cpp	Fri Sep 03 07:53:25 2010 +0300
@@ -0,0 +1,463 @@
+/*
+* Copyright (c) 2009 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:  Implementation of creating notifications.
+*
+*/
+
+
+// INCLUDE FILES
+#include "HtiMessagesServicePlugin.h"
+#include "HtiNotificationHandler.h"
+
+#include <HtiDispatcherInterface.h>
+#include <HtiLogging.h>
+
+#include <aknSDData.h>          //CAknSDData
+#include <avkon.rsg>            //R_AVKON_SOFTKEYS_LISTEN_EXIT
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+
+// MACROS
+#define KSpeedDialViewId TVwsViewId( TUid::Uid( 0x1000590A ), TUid::Uid( 0x02 ) )
+#define R_NCN_VOICE_MAIL_NOTE                     0x283d012
+#define R_NCN_VOICE_MAILS_UNK_AMOUNT              0x283d01a
+#define R_NCN_VOICE_MAIL_GROUPED                  0x283d017
+#define R_NCN_VOICE_MAILS_UNK_AMOUNT_GROUPED      0x283d01b
+
+// LOCAL CONSTANTS AND MACROS
+
+_LIT8( KErrorInvalidParameters, "Invalid command parameters" );
+_LIT8( KErrorCreateVoiceMessageNotificationFailed, "Creating voice message notification failed" );
+_LIT8( KErrorClearNotificationFailed, "Clearing notification failed" );
+_LIT8( KErrorUnrecognizedCommand, "Unrecognized command" );
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CHtiNotificationHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CHtiNotificationHandler* CHtiNotificationHandler::NewL()
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::NewL" );
+    CHtiNotificationHandler* self = new (ELeave) CHtiNotificationHandler();
+    CleanupStack::PushL ( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::NewL" );
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CHtiNotificationHandler::CHtiNotificationHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ----------------------------------------------------------------------------
+CHtiNotificationHandler::CHtiNotificationHandler()
+    : CActive( CActive::EPriorityStandard ),
+      iMsgWaiting(),
+      iMsgWaitingPckg( iMsgWaiting ),
+      iVoiceMailsInLine1(0)
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::CHtiNotificationHandler" );
+    CActiveScheduler::Add( this );
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::CHtiNotificationHandler" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CHtiNotificationHandler::~CHtiNotificationHandler
+// Destructor.
+// -----------------------------------------------------------------------------
+CHtiNotificationHandler::~CHtiNotificationHandler()
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::~CHtiNotificationHandler" );
+    Cancel();
+    iMobilePhone.Close();
+    iTelServer.Close();
+    iReqQueue.Close();
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::~CHtiNotificationHandler" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CHtiNotificationHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+void CHtiNotificationHandler::ConstructL()
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::ConstructL" );
+    
+    TInt err;       
+    
+    err = iTelServer.Connect();
+    HTI_LOG_FORMAT("RTelServer::Connect() returns %d",err);
+    User::LeaveIfError( err );
+
+    err = iTelServer.GetPhoneInfo( 0, iPhoneInfo );
+    HTI_LOG_FORMAT("RTelServer::GetPhoneInfo() returns %d",err);
+    User::LeaveIfError( err ); 
+        
+    err = iMobilePhone.Open( iTelServer, iPhoneInfo.iName ); 
+    HTI_LOG_FORMAT("RTelServer::Open() returns %d",err);
+    User::LeaveIfError( err );
+
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::ConstructL" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CHtiNotificationHandler::SetDispatcher
+// Sets the dispatcher pointer.
+// -----------------------------------------------------------------------------
+
+void CHtiNotificationHandler::SetDispatcher( MHtiDispatcher* aDispatcher )
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::SetDispatcher" );
+    iDispatcher = aDispatcher;
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::SetDispatcher" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CHtiNotificationHandler::ProcessMessageL
+// Parses the received message and calls handler functions.
+// -----------------------------------------------------------------------------
+void CHtiNotificationHandler::ProcessMessageL( const TDesC8& aMessage,
+                                              THtiMessagePriority /*aPriority*/ )
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::ProcessMessageL" );
+
+    // Zero length message and command code validity already checked
+    // in HtiMessagesServicePlugin.
+
+    if ( aMessage[0] == CHtiMessagesServicePlugin::ECreateVoiceMessageNotification )
+        {
+        TRAPD(err, HandleCreateVoiceMessageNotificationL(aMessage));
+        if ( err != KErrNone )
+            {
+            SendErrorMessageL( err, KErrorCreateVoiceMessageNotificationFailed );
+            }
+        }
+
+    else if ( aMessage[0] == CHtiMessagesServicePlugin::EClearAllNotifications)
+        {
+        TRAPD(err, HandleClearAllNotificationsL(aMessage));
+        if( err!= KErrNone )
+            {
+            SendErrorMessageL( err, KErrorClearNotificationFailed );
+            }
+        }
+    else
+        {
+        SendErrorMessageL( KErrArgument, KErrorUnrecognizedCommand );
+        }
+
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::ProcessMessageL" );
+    }
+
+
+void CHtiNotificationHandler::RunL()
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::RunL" );
+    if(iReqQueue.Count())
+        {
+        TNcnReqQueueElement elem = iReqQueue[0];
+        iReqQueue.Remove(0);
+        if(elem.iCmd == ENcnSetIndicator)
+            {
+            SetIndicator(elem.iIndicator, elem.iMsgCount, elem.iEnable);
+            }
+        else if(elem.iCmd == ENcnResetIndicator)
+            {
+            ResetIndicator();
+            }
+        }
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::RunL" );
+    }
+
+void CHtiNotificationHandler::DoCancel()
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::DoCancel" );
+    if( IsActive() )
+        {
+        iMobilePhone.CancelAsyncRequest( EMobilePhoneSetIccMessageWaitingIndicators );
+        }
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::DoCancel" );
+    }
+
+TInt CHtiNotificationHandler::RunError(TInt aError)
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::RunError" );
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::RunError" );
+    return aError;
+    }
+
+CAknSoftNotificationParameters* CHtiNotificationHandler::CreateNotificationParametersLC(TBool aAmountKnown)
+    {
+        HTI_LOG_FUNC_IN( "CHtiNotificationHandler::CreateNotificationParametersLC" );
+        const TUid KNcnDefaultMessageUid = { 1 };
+        _LIT( KNcnResourceFile, "z:\\resource\\Ncnlist.rSC" );
+        const TInt KNcnNotificationPriority = 2200;
+
+        TInt noteId = aAmountKnown ? R_NCN_VOICE_MAIL_NOTE : R_NCN_VOICE_MAILS_UNK_AMOUNT;
+        TInt groupId = aAmountKnown ? R_NCN_VOICE_MAIL_GROUPED : R_NCN_VOICE_MAILS_UNK_AMOUNT_GROUPED;
+        TUid customMessageId = KNcnDefaultMessageUid; // default
+        _LIT8( KNcnExternalLaunch, "outside" );
+        CAknSoftNotificationParameters* ret = CAknSoftNotificationParameters::NewL(
+                KNcnResourceFile,
+                noteId,
+                KNcnNotificationPriority,
+                R_AVKON_SOFTKEYS_LISTEN_EXIT,
+                CAknNoteDialog::ENoTone,
+                KSpeedDialViewId,
+                customMessageId,
+                EAknSoftkeyListen,
+                KNcnExternalLaunch );
+        ret->SetGroupedTexts( groupId );
+        CleanupStack::PushL( ret );
+        HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::CreateNotificationParametersLC" );
+        return ret;
+    } 
+
+void CHtiNotificationHandler::ShowNewItemsL( CAknSoftNotifier* aNotifier, 
+        const TAknSoftNotificationType aNotificationType, const TInt aAmount )
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::ShowNewItemsL" );
+    TInt KVMMaximumNumber = 0xfe;
+    TBool amountKnown = ( aAmount <= KVMMaximumNumber );
+
+    // fuzzy voicemail note and normal voice mail note should never exist at the same time. 
+    // Always cancel the other before adding new note.
+    if ( aNotificationType == EVoiceMailNotification
+        || aNotificationType == ESeparateVoiceMailOnLine1Notification
+        || aNotificationType == ESeparateVoiceMailOnLine2Notification )
+        {
+        CAknSoftNotificationParameters* params =
+            CreateNotificationParametersLC(!amountKnown);
+  
+        aNotifier->CancelCustomSoftNotificationL( *params );
+        CleanupStack::PopAndDestroy( params );
+        }
+
+    // create notification parameters
+    CAknSoftNotificationParameters* params =
+        CreateNotificationParametersLC(amountKnown);
+        
+    if( aAmount <= 0 )
+        {
+        aNotifier->CancelCustomSoftNotificationL( *params );
+        }
+    else
+        {
+        aNotifier->SetCustomNotificationCountL( *params, aAmount );
+        }
+
+    // destroy parameters
+    CleanupStack::PopAndDestroy( params );
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::ShowNewItemsL" );
+    }
+
+void CHtiNotificationHandler::SetNotificationL(TUint aAmount)
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::SetNotificationL" );
+    
+    //Convert to avkon type
+    TAknSoftNotificationType aknType = EVoiceMailNotification;
+
+    //Get the secondary display id for this note
+    TInt dialogID = 5; //SecondaryDisplay::ECmdVoiceMailNotification in NcnSecondaryDisplayAPI.h
+
+    // The category UID for the messages in this header file.
+    //
+    const TUid KCatNcnList = {0x100058F1};
+    const TUint KNcnExternalizedNumberMaxLength = 8;
+    
+    // Amount needs to be stored to "additional parameter"
+    TBuf8<KNcnExternalizedNumberMaxLength> additionalData;
+
+    additionalData.Num(aAmount);
+    
+    // Encapsulate the sent data
+    CAknSDData* sdData = NULL;
+    TRAPD( status, sdData = CAknSDData::NewL(
+            KCatNcnList, 
+            dialogID, 
+            additionalData) );
+    
+    // Create notifier instance
+    CAknSoftNotifier* notifier = CAknSoftNotifier::NewL();
+    CleanupStack::PushL(notifier);
+    
+    // Send data to cover ui    
+    if ( status == KErrNone && sdData != NULL)
+        {
+        notifier->SetSecondaryDisplayData( sdData ); //Takes ownership 
+        }
+    
+    // If there are problems with notifier, just catch the error and 
+    // try to finish the other processes.
+    TRAP( status, ShowNewItemsL( notifier, aknType, aAmount ) );
+    
+    CleanupStack::PopAndDestroy(notifier);
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::SetNotificationL" );
+    }
+
+void CHtiNotificationHandler::SetIndicator(const TNcnIndicator aIndicator, TUint aMsgCount, TBool aEnable)
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::SetIndicator" );
+       
+    TInt aId = RMobilePhone::KDisplayVoicemailActive;
+    if( aEnable )       
+        {
+        iMsgWaiting.iDisplayStatus |= aId;          
+        }
+    else
+        {
+        iMsgWaiting.iDisplayStatus &= ~ aId;                    
+        } 
+    iMsgWaiting.iVoiceMsgs = aMsgCount;
+    if(IsActive())
+        {
+        TNcnReqQueueElement elem(ENcnSetIndicator, aIndicator, aMsgCount, aEnable );
+        iReqQueue.Append( elem );
+        }
+    else
+        {
+        iStatus = KRequestPending;
+        iMobilePhone.SetIccMessageWaitingIndicators( iStatus, iMsgWaitingPckg );
+        HTI_LOG_FORMAT("iStatus: %d", iStatus.Int());
+        SetActive();
+        }
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::SetIndicator" );
+    }
+
+void CHtiNotificationHandler::ResetIndicator()
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::ResetIndicator" );
+    if( IsActive() )
+        {
+        TNcnReqQueueElement elem(ENcnResetIndicator, ENcnIndicatorVMLine1, 0, EFalse );
+        iReqQueue.Append( elem );
+        return;
+        }
+    iMsgWaiting.iVoiceMsgs = 0;
+    iMsgWaiting.iDisplayStatus = 0;
+    iMobilePhone.SetIccMessageWaitingIndicators( iStatus, iMsgWaitingPckg );
+    SetActive();
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::ResetIndicator" );
+    }
+
+// ----------------------------------------------------------------------------
+// CHtiNotificationHandler::HandleCreateVoiceMessageNotificationL
+// Creates new voice message notification.
+// ----------------------------------------------------------------------------
+void CHtiNotificationHandler::HandleCreateVoiceMessageNotificationL( const TDesC8& aData )
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::HandleCreateVoiceMessageNotificationL" );
+    
+    if ( aData.Length() == 1 )
+        {
+        HTI_LOG_TEXT( "no command parameter, using default value 1");
+        iVoiceMailsInLine1 = 1;
+        }    
+    else if(aData.Length() == 2) //1-byte command parameter
+        {
+        iVoiceMailsInLine1 = aData[1];
+        HTI_LOG_FORMAT("%d new voice messages", iVoiceMailsInLine1);
+        }
+    else
+        {
+        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
+        HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::HandleCreateVoiceMessageNotificationL" );
+        return;
+        }
+    
+    ResetIndicator();
+    SetNotificationL(iVoiceMailsInLine1);    
+    SetIndicator(ENcnIndicatorVMLine1, iVoiceMailsInLine1, iVoiceMailsInLine1 ? ETrue : EFalse);    
+    SendOkMsgL( KNullDesC8 );    
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::HandleCreateVoiceMessageNotificationL" );
+    }
+
+// ----------------------------------------------------------------------------
+// CHtiNotificationHandler::HandleClearAllNotificationsL
+// Clears all message notifications.
+// ----------------------------------------------------------------------------
+void CHtiNotificationHandler::HandleClearAllNotificationsL( const TDesC8& aData )
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::HandleClearAllNotificationsL" );
+    if ( aData.Length() != 1 )
+        {
+        SendErrorMessageL( KErrArgument, KErrorInvalidParameters );
+        HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::HandleClearAllNotificationsL" );
+        return;
+        }
+
+    CAknSoftNotifier* notifier = CAknSoftNotifier::NewL();
+    CleanupStack::PushL(notifier);
+    CAknSoftNotificationParameters* params = CreateNotificationParametersLC( ETrue );  
+    notifier->CancelCustomSoftNotificationL( *params ); 
+    CleanupStack::PopAndDestroy(2);//param, notifier
+
+    ResetIndicator();
+    
+    SendOkMsgL( KNullDesC8 ); 
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::HandleClearAllNotificationsL" );
+    }
+
+// ----------------------------------------------------------------------------
+// CHtiNotificationHandler::SendOkMsgL
+// Helper function for sending response messages.
+// ----------------------------------------------------------------------------
+void CHtiNotificationHandler::SendOkMsgL( const TDesC8& aData )
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::SendOkMsgL" );
+    User::LeaveIfNull( iDispatcher );
+    HBufC8* temp = HBufC8::NewL( aData.Length() + 1 );
+    TPtr8 response = temp->Des();
+    response.Append( ( TChar ) CHtiMessagesServicePlugin::EResultOk );
+    response.Append( aData );
+    User::LeaveIfError( iDispatcher->DispatchOutgoingMessage(
+        temp, KHtiMessagesServiceUid ) );
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::SendOkMsgL" );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CHtiNotificationHandler::SendErrorMessageL
+// Helper function for sending error response messages.
+// ----------------------------------------------------------------------------
+void CHtiNotificationHandler::SendErrorMessageL( TInt aError, const TDesC8& aDescription )
+    {
+    HTI_LOG_FUNC_IN( "CHtiNotificationHandler::SendErrorMessageL" );
+    User::LeaveIfNull( iDispatcher );
+    User::LeaveIfError( iDispatcher->DispatchOutgoingErrorMessage(
+        aError, aDescription, KHtiMessagesServiceUid ) );
+    HTI_LOG_FUNC_OUT( "CHtiNotificationHandler::SendErrorMessageL" );
+    }
+
+// End of file
--- a/htiui/HtiServicePlugins/HtiPIMServicePlugin/group/HtiPIMServicePlugin.mmp	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/HtiServicePlugins/HtiPIMServicePlugin/group/HtiPIMServicePlugin.mmp	Fri Sep 03 07:53:25 2010 +0300
@@ -17,6 +17,7 @@
 
 
 #include <platform_paths.hrh>
+#include "../../../symbian_version.hrh"
 
 TARGET          HtiPIMServicePlugin.dll
 TARGETTYPE      PLUGIN
@@ -32,8 +33,10 @@
 SOURCE          proxy.cpp
 SOURCE          HtiPIMServicePlugin.cpp
 SOURCE          PIMHandler.cpp
+SOURCE          HtiSimDirHandler.cpp
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
 SOURCE          HtiBookmarkHandler.cpp 
-SOURCE          HtiSimDirHandler.cpp
+#endif
 
 USERINCLUDE     ../inc
 APP_LAYER_SYSTEMINCLUDE
@@ -49,12 +52,16 @@
 LIBRARY         ecom.lib
 LIBRARY         estor.lib
 LIBRARY         euser.lib
-LIBRARY         favouritesengine.lib
 LIBRARY         ws32.lib
 LIBRARY         flogger.lib
 LIBRARY         cntmodel.lib
 LIBRARY			etelmm.lib
 LIBRARY			etel.lib 
+
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+LIBRARY         favouritesengine.lib
+#endif
+
 SMPSAFE
 
 // End of file
--- a/htiui/HtiServicePlugins/HtiPIMServicePlugin/inc/HtiPIMServicePlugin.h	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/HtiServicePlugins/HtiPIMServicePlugin/inc/HtiPIMServicePlugin.h	Fri Sep 03 07:53:25 2010 +0300
@@ -23,6 +23,7 @@
 // INCLUDES
 #include <HtiServicePluginInterface.h>
 #include <w32std.h>
+#include "../../../symbian_version.hrh"
 
 // CONSTANTS
 const TInt KPIMServiceUidValue = 0x10210CCD; // ECOM Implementation UID
@@ -30,7 +31,11 @@
 
 // FORWARD DECLARATIONS
 class CPIMHandler;
+
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
 class CHtiBookmarkHandler;
+#endif
+
 class CHtiSimDirHandler;
 // CLASS DECLARATION
 
@@ -100,7 +105,9 @@
     private:
 
         CPIMHandler* iPimHandler;
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
         CHtiBookmarkHandler* iBookmarkHandler;
+#endif
         CHtiSimDirHandler* iSimDirHandler;
         };
 
--- a/htiui/HtiServicePlugins/HtiPIMServicePlugin/src/HtiPIMServicePlugin.cpp	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/HtiServicePlugins/HtiPIMServicePlugin/src/HtiPIMServicePlugin.cpp	Fri Sep 03 07:53:25 2010 +0300
@@ -19,14 +19,18 @@
 // INCLUDE FILES
 #include "HtiPIMServicePlugin.h"
 #include "PIMHandler.h"
+
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
 #include "HtiBookmarkHandler.h"
+#endif
+
 #include "HtiSimDirHandler.h"
 #include <HtiDispatcherInterface.h>
 #include <HtiLogging.h>
 
 // CONSTANTS
 _LIT8( KErrorMissingCommand, "Missing command" );
-
+_LIT8( KErrorUnrecognizedCommand, "Unrecognized command" );
 // ----------------------------------------------------------------------------
 // Create instance of concrete ECOM interface implementation
 CHtiPIMServicePlugin* CHtiPIMServicePlugin::NewL()
@@ -48,7 +52,9 @@
     {
     HTI_LOG_TEXT("CHtiPIMServicePlugin destroy");
     delete iPimHandler;
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
     delete iBookmarkHandler;
+#endif
     delete iSimDirHandler;
     }
 
@@ -91,7 +97,8 @@
             }
         iSimDirHandler->ProcessMessageL( aMessage, aPriority );
         }
-    else
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+    else if ( aCommand <= EDeleteBookmark)
         {
         if ( iBookmarkHandler == NULL )
             {
@@ -100,6 +107,12 @@
             }
         iBookmarkHandler->ProcessMessageL( aMessage, aPriority );
         }
+#endif
+    else
+        {
+        User::LeaveIfError( iDispatcher->DispatchOutgoingErrorMessage(
+            KErrArgument, KErrorUnrecognizedCommand, KPIMServiceUid ) );
+        }
 
     HTI_LOG_FUNC_OUT( "CHtiPIMServicePlugin::ProcessMessageL" );
     }
@@ -112,11 +125,13 @@
         {
         return iPimHandler->IsBusy();
         }
-
+    
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
     if ( iBookmarkHandler )
         {
         return iBookmarkHandler->IsBusy();
         }
+#endif
     
     if( iSimDirHandler)
         {
--- a/htiui/HtiServicePlugins/HtiSysInfoServicePlugin/src/HtiSysInfoServicePlugin.cpp	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/HtiServicePlugins/HtiSysInfoServicePlugin/src/HtiSysInfoServicePlugin.cpp	Fri Sep 03 07:53:25 2010 +0300
@@ -1929,6 +1929,7 @@
             {
             iDispatcher->DispatchOutgoingErrorMessage( KErrAccessDenied,
                 KErrDescrBtOnDenied, KSysInfoServiceUid );
+            CleanupStack::PopAndDestroy(); // btSettings
             return;
             }
 
--- a/htiui/sis/HTI_S60-10_1.pkg	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/sis/HTI_S60-10_1.pkg	Fri Sep 03 07:53:25 2010 +0300
@@ -18,7 +18,7 @@
 &EN
 
 ; Using UID of HtiFramework project
-#{"HTI"},(0x1020DEB6),2,27,0
+#{"HTI"},(0x1020DEB6),2,28,0
 
 ; Series60 product id for S60 5.2
 [0x20022E6D], 0, 0, 0, {"Series60ProductID"}
--- a/htiui/sis/HTI_S60-52.pkg	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/sis/HTI_S60-52.pkg	Fri Sep 03 07:53:25 2010 +0300
@@ -18,7 +18,7 @@
 &EN
 
 ; Using UID of HtiFramework project
-#{"HTI"},(0x1020DEB6),2,27,0
+#{"HTI"},(0x1020DEB6),2,28,0
 
 ; Series60 product id for S60 5.2
 [0x20022E6D], 0, 0, 0, {"Series60ProductID"}
--- a/htiui/sis/HTI_S60_Upgrade-10_1.pkg	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/sis/HTI_S60_Upgrade-10_1.pkg	Fri Sep 03 07:53:25 2010 +0300
@@ -18,7 +18,7 @@
 &EN
 
 ; Using UID of HtiFramework project
-#{"HTI"},(0x1020DEB6),2,27,0,TYPE=SA,RU
+#{"HTI"},(0x1020DEB6),2,28,0,TYPE=SA,RU
 
 ; Series60 product id for S60 5.2
 [0x20022E6D], 0, 0, 0, {"Series60ProductID"}
--- a/htiui/sis/HTI_S60_Upgrade-52.pkg	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/sis/HTI_S60_Upgrade-52.pkg	Fri Sep 03 07:53:25 2010 +0300
@@ -18,7 +18,7 @@
 &EN
 
 ; Using UID of HtiFramework project
-#{"HTI"},(0x1020DEB6),2,27,0,TYPE=SA,RU
+#{"HTI"},(0x1020DEB6),2,28,0,TYPE=SA,RU
 
 ; Series60 product id for S60 5.2
 [0x20022E6D], 0, 0, 0, {"Series60ProductID"}
--- a/htiui/sis/HTI_stub.pkg	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/sis/HTI_stub.pkg	Fri Sep 03 07:53:25 2010 +0300
@@ -18,7 +18,7 @@
 &EN
 
 ; Using UID of HtiFramework project
-#{"HTI"},(0x1020DEB6),2,27,0
+#{"HTI"},(0x1020DEB6),2,28,0
 
 ; Localised Vendor name
 %{"Nokia"}
--- a/htiui/symbian_version.hrh	Wed Aug 25 15:45:01 2010 +0300
+++ b/htiui/symbian_version.hrh	Fri Sep 03 07:53:25 2010 +0300
@@ -37,7 +37,7 @@
  * used to variate the source code based on the SDK in use. The value of the
  * flag should be always changed to reflect the current build environment.
  */
-#define SYMBIAN_VERSION_SUPPORT                              SYMBIAN_3
+#define SYMBIAN_VERSION_SUPPORT                              SYMBIAN_4
 
 
 #endif  // __SYMBIAN_VERSION_HRH
--- a/layers.sysdef.xml	Wed Aug 25 15:45:01 2010 +0300
+++ b/layers.sysdef.xml	Fri Sep 03 07:53:25 2010 +0300
@@ -1,17 +1,20 @@
 <?xml version="1.0"?>
-<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_4_0.dtd" [
+<!DOCTYPE SystemDefinition SYSTEM "sysdef_1_5_1.dtd" [
   <!ENTITY layer_real_source_path "sf/app/testtools" >
 ]>
 
-<SystemDefinition name="testtools" schema="1.4.0">
+<SystemDefinition name="testtools" schema="1.5.1">
   <systemModel>
     <layer name="app_layer">
-      <module name="htiui">
-        <unit unitID="testtools.htiui" mrp="" bldFile="&layer_real_source_path;/htiui/group" name="htiui" />
-      </module>
+			<module name="htiui">
+				<unit unitID="testtools.htiuiqt" mrp="" bldFile="&layer_real_source_path;/htiui" proFile="htiui.pro" name="htiui" />
+			</module>
       <module name="stifui">
         <unit unitID="testtools.stifui" mrp="" bldFile="&layer_real_source_path;/stifui/avkon/group" name="stifui" />
       </module>
+      <module name="sutui">
+        <unit unitID="testtools.sutui" mrp="" bldFile="&layer_real_source_path;/symbianunittestui/qt" proFile="symbianunittestqt.pro" name="sutui" />
+      </module>
     </layer>
   </systemModel>
 </SystemDefinition>
--- a/stifui/avkon/group/ReleaseNote.txt	Wed Aug 25 15:45:01 2010 +0300
+++ b/stifui/avkon/group/ReleaseNote.txt	Fri Sep 03 07:53:25 2010 +0300
@@ -1,5 +1,5 @@
 ========================================================================
-RELEASE NOTE FOR STIF UI - STIF_201028 (7.3.37)
+RELEASE NOTE FOR STIF UI - STIF_201030 (7.3.38)
 SUPPORTING SERIES 60 3.0 ->
 ========================================================================
 
--- a/stifui/avkon/stifui/data/Stifui.rss	Wed Aug 25 15:45:01 2010 +0300
+++ b/stifui/avkon/stifui/data/Stifui.rss	Fri Sep 03 07:53:25 2010 +0300
@@ -27,8 +27,8 @@
 #include <avkon.rh>
 #include <avkon.mbg>
 #include <avkon.hrh>
-#include <CommonDialogs.hrh> // Enumerations of memory selection, file selection, save etc dialogs
-#include <CommonDialogs.rh> // Resource structures of memory selection, file selection, save etc dialogs
+//#include <CommonDialogs.hrh> // Enumerations of memory selection, file selection, save etc dialogs
+//#include <CommonDialogs.rh> // Resource structures of memory selection, file selection, save etc dialogs
 #if defined (__S60_)
     #include <data_caging_paths_strings.hrh>
 #endif
--- a/stifui/avkon/stifui/inc/version.h	Wed Aug 25 15:45:01 2010 +0300
+++ b/stifui/avkon/stifui/inc/version.h	Fri Sep 03 07:53:25 2010 +0300
@@ -20,9 +20,9 @@
 
 #define STIFUI_MAJOR_VERSION 7
 #define STIFUI_MINOR_VERSION 3
-#define STIFUI_BUILD_VERSION 37
+#define STIFUI_BUILD_VERSION 38
 
-#define STIFUI_REL_DATE "13th July 2010"
+#define STIFUI_REL_DATE "27th July 2010"
 
 #define TO_UNICODE(text) _L(text) 
 
--- a/sysdef_1_4_0.dtd	Wed Aug 25 15:45:01 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
- <!ELEMENT SystemDefinition (systemModel?, build?)>
- <!ATTLIST SystemDefinition
-  name CDATA #REQUIRED
-  schema CDATA #REQUIRED>
- <!ELEMENT systemModel (layer+)>
- <!ELEMENT layer (logicalset* | module*)*>
- <!ATTLIST layer
-  name CDATA #REQUIRED
-  levels CDATA #IMPLIED
-  span CDATA #IMPLIED>
- <!ELEMENT logicalset (logicalsubset* | module* | unit* | package* | prebuilt*)*>
- <!ATTLIST logicalset name CDATA #REQUIRED>
- <!ELEMENT logicalsubset (module* | unit* | package* | prebuilt*)*>
- <!ATTLIST logicalsubset name CDATA #REQUIRED>
- <!ELEMENT module (component* | unit* | package* | prebuilt*)*>
- <!ATTLIST module
-  name CDATA #REQUIRED
-  level CDATA #IMPLIED>
- <!ELEMENT component (unit* | package* | prebuilt*)*>
- <!ATTLIST component name CDATA #REQUIRED>
- <!ELEMENT unit EMPTY>
- <!ATTLIST unit
-  unitID ID #REQUIRED
-  name CDATA #REQUIRED
-  mrp CDATA #REQUIRED
-  filter CDATA #IMPLIED
-  bldFile CDATA #REQUIRED
-  priority CDATA #IMPLIED
-  contract CDATA #IMPLIED>
- <!ELEMENT package EMPTY>
- <!ATTLIST package
-  name CDATA #REQUIRED
-  mrp CDATA #REQUIRED
-  filter CDATA #IMPLIED
-  contract CDATA #IMPLIED>
- <!ELEMENT prebuilt EMPTY>
- <!ATTLIST prebuilt
-  name CDATA #REQUIRED
-  version CDATA #REQUIRED
-  late (Y|N) #IMPLIED
-  filter CDATA #IMPLIED
-  contract CDATA #IMPLIED>
- <!ELEMENT build (option* | target+ | targetList+ | unitList+ | configuration+)*>
- <!ELEMENT unitList (unitRef+)>
- <!ATTLIST unitList
-  name ID #REQUIRED
-  description CDATA #REQUIRED>
- <!ELEMENT unitRef EMPTY>
- <!ATTLIST unitRef unit IDREF #REQUIRED>
- <!ELEMENT targetList EMPTY>
- <!ATTLIST targetList
-  name ID #REQUIRED
-  description CDATA #REQUIRED
-  target IDREFS #REQUIRED>
- <!ELEMENT target EMPTY>
- <!ATTLIST target
-  name ID #REQUIRED
-  abldTarget CDATA #REQUIRED
-  description CDATA #REQUIRED>
- <!ELEMENT option EMPTY>
- <!ATTLIST option
-  name ID #REQUIRED
-  abldOption CDATA #REQUIRED
-  description CDATA #REQUIRED
-  enable (Y | N | y | n) #REQUIRED>
- <!ELEMENT configuration (unitListRef+ | layerRef+ | task+)*>
- <!ATTLIST configuration
-  name ID #REQUIRED
-  description CDATA #REQUIRED
-  filter CDATA #REQUIRED>
- <!ELEMENT task ( unitListRef* , (buildLayer | specialInstructions))>
- <!ELEMENT unitListRef EMPTY>
- <!ATTLIST unitListRef unitList IDREF #REQUIRED>
- <!ELEMENT layerRef EMPTY>
- <!ATTLIST layerRef layerName CDATA #REQUIRED>
- <!ELEMENT buildLayer EMPTY>
- <!ATTLIST buildLayer
-  command CDATA #REQUIRED
-  targetList IDREFS #IMPLIED
-  unitParallel (Y | N | y | n) #REQUIRED
-  targetParallel (Y | N | y | n) #IMPLIED>
- <!ELEMENT specialInstructions EMPTY>
- <!ATTLIST specialInstructions
-  name CDATA #REQUIRED
-  cwd CDATA #REQUIRED
-  command CDATA #REQUIRED>