syncmlfw/ds/alerthandler/src/nsmldsalert.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/alerthandler/src/nsmldsalert.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,447 @@
+/*
+* 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 "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:  DS server alert handler
+*
+*/
+
+
+// INCLUDE FILES
+//system includes
+#include <s32mem.h>
+#include <SyncMLDef.h>
+#include <implementationproxy.h>	// TImplementationProxy definition
+#include <nsmlconstants.h>
+#include <nsmldebug.h>
+#include <nsmlunicodeconverter.h>
+#include <NSmlPrivateAPI.h>
+
+#include "WBXMLSyncMLParser.h"
+#include "WBXMLParser.h"
+#include "WBXMLParserError.h"
+#include "smlmetinfdtd.h"
+#include "NSmlURI.h"
+#include "nsmldsalert.h"
+#include "nsmldssettings.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CNSmlDSAlert::CNSmlDSAlert()
+// Constructor
+// ---------------------------------------------------------
+//
+CNSmlDSAlert::CNSmlDSAlert()
+    {
+	}
+
+
+// ---------------------------------------------------------
+// CNSmlDSAlert::NewL()
+// Creates new instance of CNSmlDSAlert. 
+// Does not leave instance pointer to CleanupStack.
+// ---------------------------------------------------------
+//
+CNSmlDSAlert* CNSmlDSAlert::NewL()
+    {
+	CNSmlDSAlert* self = new (ELeave) CNSmlDSAlert();
+	return self;
+    }
+
+// ---------------------------------------------------------
+// CNSmlDSAlert::~CNSmlDSAlert()
+// Destructor
+// ---------------------------------------------------------
+//
+CNSmlDSAlert::~CNSmlDSAlert()
+    {
+	}
+
+// ---------------------------------------------------------
+// CNSmlDSAlert::StartSync( const TDesC8& aSyncMLMessage, TInt aTransport, TBTDevAddr aBTAddress,
+//    						const TDesC& aBTName, MNSmlAlertObexPluginContext* aPluginContext )
+// Both standards supported (1.1 and 1.2)
+// ---------------------------------------------------------
+//
+	TNSmlAlertResult CNSmlDSAlert::StartSyncL(
+    const TDesC8& aSyncMLMessage,
+    TInt aTransport,
+    TBTDevAddr /* aBTAddress */,
+    const TDesC& /* aBTName */,
+    MNSmlAlertObexPluginContext* /* aPluginContext */)
+ 	{
+	DBG_FILE(_S8("CNSmlDSAlert::StartSync begins"));
+	// Handling 1.2 Notification package
+	//==================================
+	TSmlProtocolVersion protocol(ESmlVersion1_2);
+		
+	if ( ! Is12Package( aSyncMLMessage ) )
+		{
+		// Handling 1.1 Package0
+		//======================
+		TRAPD( parseErr, ParseMessageL( aSyncMLMessage ) );
+		if ( ( parseErr != KErrNone ) || (iPacketShouldGoToMdo) )
+			{
+			// It may be MDO package
+			return TNSmlAlertResult( ENSmlErrNotConsumed );
+			}
+		
+		protocol = ESmlVersion1_1_2;
+		
+		}
+	
+	RNSmlPrivateAPI privateApi;
+	TRAPD(openErr, privateApi.OpenL());
+	
+	if ( openErr != KErrNone )
+		{
+		return ENSmlErrUndefined;
+		}
+	
+	const TUid transportId = { aTransport };
+ 	
+	TRAPD(connErr, privateApi.SendL(aSyncMLMessage, ESmlDataSync, 
+	        protocol, transportId ));
+	
+	if ( connErr != KErrNone )
+		{
+		privateApi.Close();
+		return ENSmlErrUndefined;
+		}
+		
+	privateApi.Close();
+	
+	return ENSmlErrNone;
+	}
+
+
+
+//
+//  Private member functions
+//
+
+// ---------------------------------------------------------
+// CNSmlDSAlert::Is12Package( const TDesC8& aTriggerMessage ) const
+// 
+// ---------------------------------------------------------
+TBool CNSmlDSAlert::Is12Package( const TDesC8& aTriggerMessage ) const
+	{
+	if ( aTriggerMessage.Length() > KNSmlDSAlertVersionPos )
+		{
+		TInt version;
+		version = ((TUint8) aTriggerMessage[ KNSmlDSAlertVersionPos ]) << 8;
+		version |= (TUint8) aTriggerMessage[ KNSmlDSAlertVersionPos + 1 ];
+		version = version >> 6;
+		if ( version == KNSmlDSAlertVersion )
+			{
+			return ETrue;
+			}
+		}
+	return EFalse;
+	}
+
+
+// ---------------------------------------------------------
+// CNSmlDSAlert::ParseMessageL( const TDesC8& aSyncMLMessage )
+// 
+// ---------------------------------------------------------
+void CNSmlDSAlert::ParseMessageL( const TDesC8& aSyncMLMessage )
+    {
+	DBG_FILE(_S8("CNSmlDSAlert::ParseMessageL begins"));
+    CWBXMLSyncMLDocHandler* docHandler = CWBXMLSyncMLDocHandler::NewL( this );
+	CleanupStack::PushL( docHandler );
+	CWBXMLParser* parser = CWBXMLParser::NewL();
+	CleanupStack::PushL( parser );
+	parser->SetDocumentHandler( docHandler );
+	parser->SetExtensionHandler( docHandler );
+	RDesReadStream readStream;
+	readStream.Open( aSyncMLMessage );
+	CleanupClosePushL ( readStream );
+	parser->SetDocumentL( readStream );
+	TWBXMLParserError ret = KWBXMLParserErrorOk;
+	while ( ret == KWBXMLParserErrorOk )
+		{
+	    ret = parser->ParseL();
+		}
+	CleanupStack::PopAndDestroy( 3 ); //readStream, parser, docHandler
+	DBG_FILE(_S8("CNSmlDSAlert::ParseMessageL ends"));
+	}
+
+
+// ---------------------------------------------------------
+// CNSmlDSAlert::PCDATAToUnicodeLC( const SmlPcdata_t& aPcdata, HBufC*& aUnicodeData ) const
+// Converts data in Pcdata structure (used by xml parser)
+// to Unicode 
+// ---------------------------------------------------------
+void CNSmlDSAlert::PCDATAToUnicodeLC( const SmlPcdata_t& aPcdata, HBufC*& aUnicodeData ) const
+	{
+	if ( !aPcdata.content )
+		{
+		aUnicodeData = NULL;
+		aUnicodeData = HBufC::NewLC( 0 );
+		}
+	TPtr8 pcdata( (TUint8*) aPcdata.content, aPcdata.length, aPcdata.length );
+	TrimRightSpaceAndNull( pcdata );
+	NSmlUnicodeConverter::HBufC16InUnicodeLC( pcdata, aUnicodeData );    
+	}
+
+/// ---------------------------------------------------------
+// CNSmlDSAlert::TrimRightSpaceAndNull( TDes8& aDes ) const
+// Trims right spaces and zero terminator (NULL) 
+// ---------------------------------------------------------
+void CNSmlDSAlert::TrimRightSpaceAndNull( TDes8& aDes ) const
+	{
+	aDes.TrimRight();
+	if ( aDes.Length() > 0 )
+		{
+		if ( aDes[aDes.Length() - 1] == NULL )
+			{
+			aDes.SetLength( aDes.Length() - 1 );
+			}	
+		}
+	}
+
+//
+// Callback functions implementation
+//
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlAlertCmdFuncL
+// Alert command from server.  
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlAlertCmdFuncL( SmlAlertPtr_t /*aAlert*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlGetCmdFuncL
+// Get command from server
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlGetCmdFuncL( SmlGetPtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlPutCmdFuncL
+// Put command from server
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlPutCmdFuncL( SmlPutPtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlResultsCmdFuncL
+// Results command from server
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlResultsCmdFuncL( SmlResultsPtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlStatusCmdFuncL
+// Status command from server
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlStatusCmdFuncL( SmlStatusPtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlStartMessageFuncL
+// SyncHdr from server
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlStartMessageFuncL( SmlSyncHdrPtr_t aSyncHdr )
+	{
+	
+	if ( !aSyncHdr || !aSyncHdr->source || !aSyncHdr->source->locURI  ) 
+		{
+		User::Leave( KErrGeneral );
+		}
+
+    if ( ( aSyncHdr->meta ) &&
+		 ( aSyncHdr->meta->content ) &&
+         ( aSyncHdr->meta->contentType == SML_PCDATA_EXTENSION ) && 
+         ( aSyncHdr->meta->extension == SML_EXT_METINF ) )
+        {
+        SmlMetInfMetInf_t* metInf;
+        metInf = (SmlMetInfMetInf_t*) aSyncHdr->meta->content;
+        if ( metInf->emi )
+            {
+            TPtr8 emi( ( TUint8* ) metInf->emi->data->content,
+                       metInf->emi->data->length,
+                       metInf->emi->data->length );
+            TrimRightSpaceAndNull( emi );
+
+            if ( emi.Match(KMdoAgentSupportedVersion) != KErrNotFound )
+                {
+                // the sync message should go to mdo, instead of ds
+                iPacketShouldGoToMdo = ETrue;
+                return 0;
+                }
+            }
+        }
+        
+  	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlEndMessageFuncL
+// End of SyncML message was reached
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlEndMessageFuncL( Boolean_t /*aFinal*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlStartSyncFuncL
+// Sync command from server
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlStartSyncFuncL( SmlSyncPtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlEndSyncFuncL
+// End of Sync command was reached
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlEndSyncFuncL()
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlStartAtomicFuncL
+// Atomic command from server, Atomic is not supported
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlStartAtomicFuncL( SmlAtomicPtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlEndAtomicFuncL
+// End of Atomic command was reached, Atomic is not supported
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlEndAtomicFuncL()
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlStartSequenceFuncL
+// Sequence command from server, Sequence is not supported
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlStartSequenceFuncL( SmlSequencePtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlEndSequenceFuncL
+// 
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlEndSequenceFuncL()
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlAddCmdFuncL
+// 
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlAddCmdFuncL( SmlAddPtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlCopyCmdFuncL
+// 
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlCopyCmdFuncL( SmlCopyPtr_t /*aContent*/)
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlDeleteCmdFuncL
+// 
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlDeleteCmdFuncL( SmlDeletePtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlExecCmdFuncL
+// 
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlExecCmdFuncL( SmlExecPtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlMapCmdFuncL
+// 
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlMapCmdFuncL( SmlMapPtr_t /*aContent*/ )   
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlReplaceCmdFuncL
+// 
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlReplaceCmdFuncL( SmlReplacePtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlSearchCmdFuncL
+// 
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlSearchCmdFuncL( SmlSearchPtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+
+//1.2 CHANGES: Move command
+// ---------------------------------------------------------
+// CNSmlDSAlert::smlMoveCmdFuncL
+// 
+// ---------------------------------------------------------
+Ret_t CNSmlDSAlert::smlMoveCmdFuncL( SmlMovePtr_t /*aContent*/ )
+	{
+	return 0;
+	}
+//Changes end
+
+
+// ------------------------------------------------------------------------------------------------
+// Implementationproxy for ECOM
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+// Constants for implementation proxy
+// ------------------------------------------------------------------------------------------------
+
+#ifndef IMPLEMENTATION_PROXY_ENTRY
+#define IMPLEMENTATION_PROXY_ENTRY(aUid, aFuncPtr)	{{aUid},(aFuncPtr)}
+#endif
+
+const TImplementationProxy ImplementationTable[] = 
+    {
+		IMPLEMENTATION_PROXY_ENTRY(KNSmlDSAlertImplUid, CNSmlDSAlert::NewL)
+    };
+
+// ------------------------------------------------------------------------------------------------
+// TImplementationProxy* ImplementationGroupProxy
+// Implementation proxy
+// ------------------------------------------------------------------------------------------------
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+    {
+	_DBG_FILE("CNSmlDSAlert::ImplementationGroupProxy(): begin");
+    aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+	_DBG_FILE("CNSmlDSAlert::ImplementationGroupProxy(): end");
+    return ImplementationTable;
+	}
+
+//  End of File