--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/alertqueue/src/NSmlMessageQueue.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,275 @@
+/*
+* 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: Alert queue and handler
+*
+*/
+
+
+#include <centralrepository.h>
+#include <DevManInternalCRKeys.h>
+#include "NSmlAlertQueue.h"
+#include "nsmldebug.h"
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::NewL(MNSmlAlertObserver* aObserver)
+// Two phase constructor
+// ---------------------------------------------------------
+//
+EXPORT_C CNSmlMessageQueue* CNSmlMessageQueue::NewL( MNSmlAlertObserver* aObserver )
+ {
+ CNSmlMessageQueue* self = new (ELeave) CNSmlMessageQueue( aObserver );
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); //self
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::~CNSmlMessageQueue()
+// Destructor
+// ---------------------------------------------------------
+EXPORT_C CNSmlMessageQueue::~CNSmlMessageQueue()
+ {
+ DestroyItems();
+ iAlertQueue.Reset();
+ iAlertHandler->Cancel();
+ delete iAlertHandler;
+ }
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::AddMessageL(const TDesC8& aMessage,
+// TSmlUsageType aType, TSmlProtocolVersion aVersion, TSmlTransportId aBearerType )
+// Adds new alert message to alert queue
+// ---------------------------------------------------------
+EXPORT_C void CNSmlMessageQueue::AddMessageL(
+ const TDesC8& aMessage,
+ TSmlUsageType aType,
+ TSmlProtocolVersion aVersion,
+ TSmlTransportId aBearerType )
+ {
+ CNSmlMessageItem* item = CNSmlMessageItem::NewL( aMessage, aType,
+ aVersion, aBearerType );
+
+ iAlertQueue.AddLast(*item);
+
+ if ( iState == ENSmlIdle )
+ {
+ iAlertHandler->ProcessAlert();
+ }
+
+ }
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::ServerSuspended( TBool aSuspend )
+// Sets the suspend state
+// ---------------------------------------------------------
+EXPORT_C void CNSmlMessageQueue::ServerSuspended( TBool aSuspend )
+ {
+ iState = ( aSuspend ) ? ENSmlSuspended : ENSmlIdle;
+
+ if ( iState == ENSmlSuspended )
+ {
+ iAlertHandler->Cancel();
+ }
+ else if ( ! IsEmpty() )
+ {
+ iAlertHandler->ProcessAlert();
+ }
+ }
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::IsEmpty()
+//
+// ---------------------------------------------------------
+EXPORT_C TBool CNSmlMessageQueue::IsEmpty()
+ {
+ return iAlertQueue.IsEmpty();
+ }
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::CheckMessage( TBool& aMore, TSmlUsageType& aType,
+// TSmlProtocolVersion& aVersion, TSmlTransportId& aBearerType )
+// Checks if there is alert message in queue. Returns also the usage type
+// and protocol version of the message.
+// ---------------------------------------------------------
+void CNSmlMessageQueue::CheckMessage(
+ TBool& aMore,
+ TSmlUsageType& aType,
+ TSmlProtocolVersion& aVersion,
+ TSmlTransportId& aBearerType )
+ {
+ iState = ENSmlProcessing;
+
+ iAlertIterator.SetToFirst();
+ CNSmlMessageItem* item = iAlertIterator;
+
+ aMore = ( item != NULL );
+
+ if ( aMore )
+ {
+ aType = item->iUsageType;
+ aVersion = item->iProtocol;
+ aBearerType = item->iBearerType;
+ }
+ }
+
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::MessageSize()
+// Returns the size of alert message
+// ---------------------------------------------------------
+TInt CNSmlMessageQueue::MessageSize()
+ {
+ iAlertIterator.SetToFirst();
+ CNSmlMessageItem* item = iAlertIterator;
+
+ if (item)
+ {
+ return item->Message().Length();
+ }
+
+ return 0;
+ }
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::AlertMessage( TDes8& aMessage )
+// Fetches the message from alert queue
+// ---------------------------------------------------------
+void CNSmlMessageQueue::AlertMessage( TDes8& aMessage )
+ {
+ iAlertIterator.SetToFirst();
+ CNSmlMessageItem* item = iAlertIterator;
+
+ if (item)
+ {
+ aMessage.Zero();
+
+ aMessage.Append( item->Message() );
+
+ item->iDlink.Deque();
+ delete item;
+ item = NULL;
+ }
+
+ }
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::CreateJobL( CSmlAlertInfo& aInfo, TBool& aQuit, const TPtrC8& aPackage )
+// Creates job from supplied onformation and passes it to observer
+// ---------------------------------------------------------
+void CNSmlMessageQueue::CreateJobL( CSmlAlertInfo& aInfo, TBool& aQuit, const TPtrC8& aPackage )
+ {
+ _DBG_FILE("CNSmlMessageQueue::CreateJobL: begin");
+ if ( aInfo.JobControl() != CSmlAlertInfo::EDoNotCreateJob )
+ {
+ CNSmlAlertJobInfo jobInfo;
+ jobInfo.iProfileId = aInfo.Profile();
+ jobInfo.iType = aInfo.Protocol();
+ jobInfo.iContentType = new (ELeave) CArrayFixFlat<TNSmlContentTypeInfo>(1);
+ jobInfo.iTransportId = aInfo.Transport();
+ jobInfo.iPackage.Set( aPackage );
+ jobInfo.iSessionId = aInfo.SessionId();
+ TInt SanSupport( KErrNone );
+ CRepository* centrep = NULL;
+ TRAPD( err, centrep = CRepository::NewL( KCRUidDeviceManagementInternalKeys) );
+ if( err == KErrNone )
+ {
+ centrep->Get( KDevManSANUIBitVariation, SanSupport );
+ }
+ delete centrep;
+ if( SanSupport == 1 )
+ {
+ jobInfo.iUimode = aInfo.GetUimode();
+ }
+ DBG_FILE_CODE(jobInfo.iUimode, _S8("CNSmlMessageQueue::CreateJobL() :Uimode result"));
+
+ TInt count = aInfo.TaskIds().Count();
+ const RArray<TInt>& tasks = aInfo.TaskIds();
+ const RArray<TSmlSyncType>& syncTypes = aInfo.TaskSyncTypes();
+
+ TNSmlContentTypeInfo info;
+
+ for (TInt index = 0; index < count; index++)
+ {
+ info.iTaskId = tasks[index];
+ info.iSyncType = syncTypes[index];
+ jobInfo.iContentType->AppendL(info);
+ }
+ iAlertObserver->CreateJobL( jobInfo );
+ }
+
+ //Check next alert message
+ iAlertIterator.SetToFirst();
+ CNSmlMessageItem* item = iAlertIterator;
+
+ aQuit = (item == NULL);
+
+ if ( iState == ENSmlSuspended )
+ {
+ aQuit = ETrue;
+ }
+ else
+ {
+ iState = ENSmlIdle;
+ }
+ _DBG_FILE("CNSmlMessageQueue::CreateJobL: end!");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlMessageQueue::DoDisconnect()
+// -----------------------------------------------------------------------------
+//
+void CNSmlMessageQueue::DoDisconnect()
+ {
+ TRAP_IGNORE( iAlertObserver->DoDisconnectL() );
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlMessageQueue::DestroyItems()
+// -----------------------------------------------------------------------------
+//
+void CNSmlMessageQueue::DestroyItems()
+ {
+ CNSmlMessageItem* item;
+
+ iAlertIterator.SetToFirst();
+
+ while ( ( item = iAlertIterator++ ) != NULL )
+ {
+ item->iDlink.Deque();
+ delete item;
+ item = NULL;
+ };
+
+ }
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::CNSmlMessageQueue( MNSmlAlertObserver* aObserver )
+// Constructor
+// ---------------------------------------------------------
+EXPORT_C CNSmlMessageQueue::CNSmlMessageQueue( MNSmlAlertObserver* aObserver )
+: iAlertQueue( CNSmlMessageItem::iOffset ),iAlertIterator( iAlertQueue ), iAlertObserver( aObserver )
+ {
+ iState = ENSmlIdle;
+ }
+
+// ---------------------------------------------------------
+// CNSmlMessageQueue::ConstructL()
+// Second phase constructor
+// ---------------------------------------------------------
+void CNSmlMessageQueue::ConstructL()
+ {
+ iAlertHandler = CNSmlAlertHandler::NewL( this );
+ }