syncmlfw/dm/syncagent/src/nsmldmcmds.cpp
branchRCL_3
changeset 62 19bba8228ff0
parent 61 b183ec05bd8c
child 76 3cdbd92ee07b
--- a/syncmlfw/dm/syncagent/src/nsmldmcmds.cpp	Tue Aug 31 16:04:06 2010 +0300
+++ b/syncmlfw/dm/syncagent/src/nsmldmcmds.cpp	Wed Sep 01 12:27:42 2010 +0100
@@ -25,7 +25,7 @@
 #include <DevManInternalCRKeys.h>
 #include <featmgr.h>
 // FOTA end
-#include <devicedialogsymbian.h>
+#include <SyncMLNotifierParams.h>
 
 #include <nsmlconstants.h>
 #include <nsmldebug.h>
@@ -54,14 +54,10 @@
 #include "smldtd.h"
 #include "smldef.h"
 #include "nsmlagenttestdefines.h"
-#include <hbdevicedialogsymbian.h>
-#include <hbsymbianvariant.h>
 // DM specific includes
 #include "nsmldmagconstants.h"
 #include "NSmlDMCmds.h"
 #include "nsmldmerror.h"
-#include <dmdevdialogclient.h>
-#include "OnlineSupportLogger.h"
 #ifdef __TEST_TREEMODULE
 #include "nsmldmtestmodule.h"
 #else
@@ -77,30 +73,17 @@
 #endif
 
 
-//const TUid KNSmlSyncDialogUid = { 0x101F876A };
+const TUid KNSmlSyncDialogUid = { 0x101F876A };
 // FOTA
 const TInt KNSmlDmNoRequest = -1;
 // FOTA end
+const TInt KNSmlDmChoiceChunkMinSize = 32;
+const TInt KNSmlDmChoiceChunkMaxSize = 10000;
 
 _LIT8 ( KNSmlDMMetaTypeUserRequest, "org.openmobilealliance.dm.firmwareupdate.userrequest" );
 _LIT8 ( KNSmlDMMetaFormatUserRequest, "chr" );
-
-const TUid dmagentuid =
-            {
-            0x101F6DE5
-            };
-
-
+_LIT(KChunkName,"AlertItems");
 
-enum TSyncmlHbNotifierKeys 
-		{
-
-     EHbSOSNotifierKeyStatus = 11, // status set will complete the client subscribe
-     EHbSOSNotifierKeyStatusReturn = 12, // Return the content of actual status value accepted from UI
-     
-     EHbDMSyncNotifierKeyStatus = 13,
-     EHbDMSyncNotifierKeyStatusReturn = 14
-		};
 
 // ---------------------------------------------------------
 // CNSmlDMCmds::NewL()
@@ -323,6 +306,169 @@
 	return valueNum; 
 	}
 
+//#ifdef RD_DM_TEXT_INPUT_ALERT
+// ---------------------------------------------------------
+// CNSmlDMCmds::AlertInputTypeParameter()
+// For 1102-User Input server alert
+// For Input Type optional parameter
+// ---------------------------------------------------------
+TInt CNSmlDMCmds::AlertInputTypeParameter( const SmlPcdata_t* aData, const TDesC8& aParamID ) const
+	{
+	_DBG_FILE("CNSmlDMCmds::AlertInputTypeParameter: begin");
+	TInt valueNum = 0;//alphanumeric by default
+	if ( aData )
+		{
+		if ( aData->content )
+			{
+			TPtr8 parameters( (TUint8*) aData->content, aData->length, aData->length );
+			TrimRightSpaceAndNull( parameters );
+			TInt startPos = parameters.Find( aParamID );
+			if ( startPos >= 0 )
+				{
+				if ( parameters.Length() > startPos + aParamID.Length() )
+					{
+					TPtrC8 strPart = parameters.Right( parameters.Length() - ( startPos + aParamID.Length() ) );
+					TInt length = 0;
+					TChar character = strPart[length];
+						
+						switch( character )
+						{
+							case 'A': //Alphanumeric
+							 valueNum = ESyncMLInputTypeAlphaNumeric;
+							 break;
+							case 'N': //Numeric
+							 valueNum = ESyncMLInputTypeNumeric;
+							 break;
+							case 'D': //Date
+							 valueNum = ESyncMLInputTypeDate;
+							 break;
+							case 'T': //Time
+							 valueNum = ESyncMLInputTypeTime;
+							 break;
+							case 'P': //Phone number
+							 valueNum = ESyncMLInputTypePhoneNumber;
+							 break;
+							case 'I': //Ip address
+							 valueNum = ESyncMLInputTypeIPAddress;
+							 break;
+						}
+					}
+				}
+			}
+		}
+		_DBG_FILE("CNSmlDMCmds::AlertInputTypeParameter: end");
+	return valueNum; 
+	}	
+	
+// ---------------------------------------------------------
+// CNSmlDMCmds::AlertEchoTypeParameter()
+// For 1102-User Input server alert
+// For Echo Type optional parameter
+// ---------------------------------------------------------	
+TInt CNSmlDMCmds::AlertEchoTypeParameter( const SmlPcdata_t* aData, const TDesC8& aParamID ) const
+	{
+	_DBG_FILE("CNSmlDMCmds::AlertEchoTypeParameter: begin");
+	TInt valueNum = 0;//Text by default
+	if ( aData )
+		{
+		if ( aData->content )
+			{
+			TPtr8 parameters( (TUint8*) aData->content, aData->length, aData->length );
+			TrimRightSpaceAndNull( parameters );
+			TInt startPos = parameters.Find( aParamID );
+			if ( startPos >= 0 )
+				{
+				if ( parameters.Length() > startPos + aParamID.Length() )
+					{
+					TPtrC8 strPart = parameters.Right( parameters.Length() - ( startPos + aParamID.Length() ) );
+					TInt length = 0;
+					TChar character = strPart[length];
+						switch( character )
+						{
+							 
+							case 'T': valueNum = ESyncMLEchoTypeText;
+							 break;
+							case 'P': valueNum = ESyncMLEchoTypePassword;
+							 break;
+							 default: 
+							 break;
+						}
+					}
+				}
+			}
+		}
+		_DBG_FILE("CNSmlDMCmds::AlertEchoTypeParameter: end");
+	return valueNum; 
+	}
+// ---------------------------------------------------------
+// CNSmlDMCmds::CheckDRPresence()
+// For 1102-User Input server alert
+// For Default Response item existence verification
+// ---------------------------------------------------------		
+TBool CNSmlDMCmds::CheckDRPresence( const SmlPcdata_t* aData, const TDesC8& aParamID ) const
+   {
+   	if ( aData )
+		{
+		if ( aData->content )
+			{
+			TPtr8 parameters( (TUint8*) aData->content, aData->length, aData->length );
+			TrimRightSpaceAndNull( parameters );
+			TInt startPos = parameters.Find( aParamID );
+			if ( startPos >= 0 )
+				{
+				 return ETrue;
+				}
+			}
+		}
+		return EFalse;
+   }
+	
+// ---------------------------------------------------------
+// CNSmlDMCmds::AlertDefaultResponseParam()
+// For 1102-User Input server alert
+// For Default Response optional parameter
+// ---------------------------------------------------------
+TPtrC8 CNSmlDMCmds::AlertDefaultResponseParam( const SmlPcdata_t* aData, const TDesC8& aParamID ) const
+	{
+	_DBG_FILE("CNSmlDMCmds::AlertDefaultResponseParam: begin");
+	TLex8 value;
+	if ( aData )
+		{
+		if ( aData->content )
+			{
+			TPtr8 parameters( (TUint8*) aData->content, aData->length, aData->length );
+			TrimRightSpaceAndNull( parameters );
+			TInt startPos = parameters.Find( aParamID );
+			if ( startPos >= 0 )
+				{
+				if ( parameters.Length() > startPos + aParamID.Length() )
+					{
+					 TPtrC8 strPart = parameters.Right( parameters.Length() - ( startPos + aParamID.Length() ) );
+					TInt length = 0;
+					while ( length < strPart.Length() )
+						{
+						TChar character = strPart[length];
+						if ( character != '&' )
+							{
+							++length;
+							}
+						else
+							{
+							break;
+							}
+						}
+					TPtrC8 valueStr = strPart.Left(	length );
+					value.Assign( valueStr );
+										
+					}
+				}
+			}
+		}
+		_DBG_FILE("CNSmlDMCmds::AlertDefaultResponseParam: end");
+	 return value.Remainder();
+	}	
+//#endif
+
 // ---------------------------------------------------------
 // CNSmlDMCmds::AlertDataLC()
 // 
@@ -510,6 +656,7 @@
 
 	TPtr8 targeturi = HBufC8::NewLC ( (*aItemList[i].iTarget).Length())->Des();
 	targeturi.Append ( *aItemList[i].iTarget);	
+	if(targeturi.Compare(KNullDesC8)!=0)
 	DoTargetL ( itemPtr->item->target, targeturi  );
 	CleanupStack::PopAndDestroy();  // targeturi   
 	
@@ -969,7 +1116,10 @@
 		 alertCode == KNSmlDMAgentNextMessage ||
 		 alertCode == KNSmlDMAgentSessionAbortAlert ||
 		 alertCode == KNSmlDMAgentServerInitAlert ||
-		 alertCode == KNSmlDMAgentClientInitAlert )
+		 alertCode == KNSmlDMAgentClientInitAlert 
+		 || alertCode == KNSmlDMAgentUserInputAlert 
+		 || alertCode == KNSmlDMAgentSingleChoiceAlert 
+		 || alertCode == KNSmlDMAgentMultipleChoiceAlert)
 		{
 		HandleAlertsL(aAlert,statusID);
 		}
@@ -1010,7 +1160,10 @@
 void CNSmlDMCmds::HandleAlertsL( SmlAlert_t* aAlert, TInt& aStatusId)
 	    {
 	    TPtr8 alertCode = AlertCode( aAlert );
-	    if ( alertCode == KNSmlDMAgentDisplayAlert ||  alertCode == KNSmlDMAgentContinueOrAbortAlert )
+	    if ( alertCode == KNSmlDMAgentDisplayAlert ||  alertCode == KNSmlDMAgentContinueOrAbortAlert 
+	            || alertCode == KNSmlDMAgentUserInputAlert
+	            || alertCode == KNSmlDMAgentSingleChoiceAlert
+	            || alertCode == KNSmlDMAgentMultipleChoiceAlert )
 	        {
 	        if ( !aAlert->itemList )
 	            {
@@ -1033,7 +1186,15 @@
 	            {
 	            HandleConfirmationAlertL(aAlert,aStatusId);
 	            }
-
+	        else if(alertCode == KNSmlDMAgentUserInputAlert)
+	            {
+	            HandleUserInputalertL(aAlert,aStatusId);
+	            }
+	        else if(alertCode == KNSmlDMAgentSingleChoiceAlert
+	                || alertCode == KNSmlDMAgentMultipleChoiceAlert)
+	            {	            	            
+	            HandleChoiceAlertsL(aAlert,aStatusId);
+	            }
 	        else //
 	            {
 
@@ -1041,6 +1202,260 @@
 	        }
 	    }
 
+// ---------------------------------------------------------
+// CNSmlDMCmds::HandleChoiceAlertsL
+// Handles Choice Alert commands from a server.  
+// ---------------------------------------------------------
+void CNSmlDMCmds::HandleChoiceAlertsL( SmlAlert_t* aAlert, TInt& aStatusId)
+    {    
+    const TChar KDRSeparator('-');
+    const TChar KChoiceItemSeparator(',');
+    TPtr8 alertCode = AlertCode( aAlert );
+    // MINDT 
+    TInt mindt = AlertParameter( aAlert->itemList->item->data, KNSmlDMAgentMINDT );
+    // MAXDT 
+    TInt maxdt = AlertParameter( aAlert->itemList->item->data, KNSmlDMAgentMAXDT );
+    if ( mindt > maxdt )
+        {
+        maxdt = mindt;
+        }   
+    TSyncMLDlgNotifParams notifyParams;
+    TInt maxlen = AlertParameter( aAlert->itemList->item->data, KNSmlDMAgentMAXLEN );
+
+    //check if iDR, Default response parameter is there or not
+    //DRPresent is used for destroying how many items in the pop up stack 
+    TBool DRPresent = CheckDRPresence( aAlert->itemList->item->data, KNSmlDMAgentDR );
+    if( DRPresent )
+        {
+        TPtrC8 DrPtr = AlertDefaultResponseParam( aAlert->itemList->item->data, KNSmlDMAgentDR );       
+        HBufC8* hptr = HBufC8::NewLC( DrPtr.Length()+ 4 ); //cs 1dr
+        TPtr8 DrBuf(hptr->Des());                           
+        if(alertCode == KNSmlDMAgentMultipleChoiceAlert)
+            {       
+            _DBG_FILE("drbuf multichoice");                     
+            DrBuf.Append(KDRSeparator);         
+            DrBuf.Append(DrPtr);
+            DrBuf.Append(KDRSeparator);         
+            }
+        else
+            {           
+            DrBuf.Append(DrPtr);
+            }
+        HBufC* DrBuf16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( DrBuf  );
+        CleanupStack::PushL( DrBuf16 ); //cs 2dr
+        notifyParams.iDR = *DrBuf16;
+        }
+    HBufC8* alertData = AlertDataLC( aAlert->itemList ); //cs 1
+    if ( alertData->Length() == 0)
+        {
+        if( DRPresent )
+            {
+            CleanupStack::PopAndDestroy(2);//alertData,hptr,DrBuf16
+            }	        
+        CleanupStack::PopAndDestroy();//alertData	        
+        iStatusToServer->SetStatusCodeL( aStatusId, TNSmlError::ESmlStatusIncompleteCommand );
+        HandleAlertErrorL();
+        return;   
+        }
+		
+    HBufC8* alertDataWithMDT = HBufC8::NewLC(alertData->Length()+KNSmlDMAgentMINDT().Length()+KNSmlDMAgentMAXDT().Length()+6); //cs 2
+    TPtr8 dataBuf = alertDataWithMDT->Des();
+    dataBuf.Append(*alertData);
+    HBufC* dataBuf16 = NULL;
+    TRAPD(errC,  dataBuf16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L(dataBuf));
+    if( errC == KErrCorrupt )
+        {
+        if( DRPresent )
+            {
+            CleanupStack::PopAndDestroy(2); //alertData hptr,DrBuf16,alertDataWithMDT
+            }	        
+        CleanupStack::PopAndDestroy(2); //alertData alertDataWithMDT	        
+        iStatusToServer->SetStatusCodeL( aStatusId, TNSmlError::ESmlStatusCommandFailed );
+        return;
+        }
+    CleanupStack::PushL(dataBuf16);   //cs    3
+    //RNotifier notifier;
+    //User::LeaveIfError( notifier.Connect() );
+    //CleanupClosePushL(notifier); //cs
+    TPckgBuf<TBool> resBuf;    
+    /* 
+	//TO reduce cyclomatic complexity
+	if( dataBuf16->Length() > KSyncMLMaxServerMsgLength )
+        {
+        notifyParams.iServerMsg = (*dataBuf16).Left(KSyncMLMaxServerMsgLength) ;    
+        }
+    else
+        {
+        notifyParams.iServerMsg = *dataBuf16;   
+        }     */
+	TInt datalength = FindMaxLength(dataBuf16->Length(),KSyncMLMaxServerMsgLength);	
+	notifyParams.iServerMsg = (*dataBuf16).Left(datalength);  
+    notifyParams.iMaxTime = maxdt;
+    notifyParams.iMaxLength = maxlen;	                   
+    TRequestStatus status;      
+    _DBG_FILE("starting of choice alerts"); 
+    //Retrieve items list 
+    HBufC8* lengthbuf = HBufC8::NewLC(100); //cs 4
+    TInt NumItems = 0 ;
+    HBufC8* listitems = AlertChoiceItemsLC(aAlert->itemList,lengthbuf,NumItems);      //cs 5                  
+	if(!NumItems)
+	{
+	if( DRPresent )
+            {
+            CleanupStack::PopAndDestroy(2); 
+            }	        
+        CleanupStack::PopAndDestroy(5); 	       
+        iStatusToServer->SetStatusCodeL( aStatusId, TNSmlError::ESmlStatusIncompleteCommand );
+        return;
+	}
+    notifyParams.iNumberOfItems = NumItems;         
+    HBufC* choiceitemslength = NULL;    
+    TRAPD(errL,  choiceitemslength = CnvUtfConverter::ConvertToUnicodeFromUtf8L(lengthbuf->Des()));
+    if( errL/* == KErrCorrupt*/ )//useful for low memory and other cases
+        {
+        if( DRPresent )
+            {
+            CleanupStack::PopAndDestroy(2); 
+            }	        
+        CleanupStack::PopAndDestroy(5); 	       
+        iStatusToServer->SetStatusCodeL( aStatusId, TNSmlError::ESmlStatusCommandFailed );
+        return;
+        }
+    CleanupStack::PushL(choiceitemslength); //cs 6
+
+   /* if( choiceitemslength->Length() > KSyncMLChoiceItemsLengthBuffer )
+        {
+        notifyParams.iItemLength = (*choiceitemslength).Left(KSyncMLChoiceItemsLengthBuffer) ;    
+        }
+    else
+        {
+        notifyParams.iItemLength = *choiceitemslength;
+        }   */
+   datalength = FindMaxLength(choiceitemslength->Length(),KSyncMLChoiceItemsLengthBuffer);			
+   notifyParams.iItemLength = (*choiceitemslength).Left(datalength);  
+    if( alertCode == KNSmlDMAgentMultipleChoiceAlert)
+        {
+        _DBG_FILE("multiple choice alerts");    
+        notifyParams.iNoteType = ESyncMLMultiChoiceQuery;
+        }
+    else
+        {
+        _DBG_FILE("single choice alerts");  
+        notifyParams.iNoteType = ESyncMLSingleChoiceQuery;
+        }             
+    if(iChunk.Handle())
+        iChunk.Close();
+    else
+        {
+        TTime now;
+        now.HomeTime();
+        TInt64 rand = now.Int64();
+        // Use timestamp to get a unique seed
+        TInt randnum = Math::Rand( rand );
+        TBuf<KSyncMLMaxProfileNameLength> chunkname;
+        chunkname.AppendNum(randnum);
+        chunkname.Append(KChunkName);
+        notifyParams.iChunkName = chunkname;
+        TInt err1 = iChunk.CreateGlobal( chunkname,
+                KNSmlDmChoiceChunkMinSize, KNSmlDmChoiceChunkMaxSize );
+        DBG_FILE_CODE(err1,_S8("chunk creating error is "));
+        if( err1 < 0 && err1 != KErrAlreadyExists )
+            User::LeaveIfError(err1);
+        if( err1 == KErrAlreadyExists )
+            {    err1 = iChunk.OpenGlobal(chunkname,EFalse);
+            DBG_FILE_CODE(err1,_S8("chunk opening error is "));
+            User::LeaveIfError(err1);
+            }
+        }
+    TInt size1 = iChunk.Size();
+    DBG_FILE_CODE(size1,_S8("chunk size is "));
+
+    RMemWriteStream chunkStream ( iChunk.Base(), iChunk.Size() );
+    CleanupClosePushL ( chunkStream ); //cs
+    chunkStream.WriteL ( listitems->Des() );
+    CleanupStack::PopAndDestroy(1);//chunkstream 
+    TPckgBuf<TSyncMLDlgNotifParams> pkgBuf( notifyParams );                            
+    TSyncMLDlgNotifReturnParams emptybuf;
+    TSyncMLDlgNotifReturnParamsPckg resultBuf( emptybuf );
+    RNotifier notifier;
+    User::LeaveIfError( notifier.Connect() );
+    CleanupClosePushL(notifier); //cs  7
+    _DBG_FILE("starting choice notifier");  
+    notifier.StartNotifierAndGetResponse( status, KNSmlSyncDialogUid, pkgBuf, resultBuf );
+    _DBG_FILE("notifier returned"); 
+    User::WaitForRequest( status );
+    CleanupStack::PopAndDestroy(4);//notifier,lengthbuf,listitems,choiceitemslength
+    iChunk.Close();
+    TBuf8<KSyncMLMaxAlertResultLength> rettext;
+    rettext.Copy( resultBuf().irettext.Left( KSyncMLMaxAlertResultLength ) );
+    if ( status != KErrNone )
+        {
+        TInt error = TNSmlError::ESmlStatusOperationCancelled ;
+        iStatusToServer->SetStatusCodeL( aStatusId, error );
+        HandleAlertErrorL();
+        }
+    else
+        {
+        //For sending data to server
+        if( alertCode == KNSmlDMAgentMultipleChoiceAlert)
+            {
+            SendMultiChoiceDataToServerL(rettext,aStatusId);                   
+            }
+        else
+            {
+            SmlPcdata_t* data = NULL;
+            PcdataNewL( data, rettext);
+            CleanupStack::PushL( data );
+            iStatusToServer->AddItemDataL( aStatusId, data );
+            CleanupStack::PopAndDestroy(); //data           
+            }           
+        }    
+    if( DRPresent ) 
+        CleanupStack::PopAndDestroy(2); //hptr,DrBuf16
+
+    CleanupStack::PopAndDestroy(3); //notifier,alertData,alertDataWithMDT,dataBuf16     
+    }
+
+// ---------------------------------------------------------
+// CNSmlDMCmds::SendMultiChoiceDataToServerL
+// Sends Multiple Choice Alert status to server.  
+// ---------------------------------------------------------
+void CNSmlDMCmds::SendMultiChoiceDataToServerL(TDes8& aData,TInt& aStatusId)
+    {
+    const TChar KDRSeparator('-');
+    TPtrC8 temp1,temp2;
+    TInt prevcommapos = 0;
+    SmlPcdata_t* data = NULL;      
+    for(TInt i=0;i<aData.Length();i++)
+        {
+        //find a slash  
+
+        if(aData[i]== KDRSeparator)
+            {
+            if(prevcommapos)
+                {
+
+                temp1.Set(aData.Left(i));
+                temp2.Set(temp1.Right(i-(prevcommapos+1)));
+                prevcommapos=  i;
+                }
+            else //firsttime finding comma
+                {
+                prevcommapos=  i;
+                temp1.Set(aData.Left(i));
+                temp2.Set(temp1.Right(i));
+                }
+            //convert temp2 to number
+            PcdataNewL( data, temp2);
+            CleanupStack::PushL( data );
+            iStatusToServer->AddItemDataL( aStatusId, data );
+            CleanupStack::PopAndDestroy(); //data
+            data = NULL;
+
+            }
+        }                           
+
+    }
 
 // ---------------------------------------------------------
 // CNSmlDMCmds::HandleConfirmationAlertL
@@ -1078,7 +1493,9 @@
         return;
         }
     CleanupStack::PushL(dataBuf16);    
-   
+    RNotifier notifier;
+    User::LeaveIfError( notifier.Connect() );
+    CleanupClosePushL(notifier);
     TPckgBuf<TBool> resBuf;
     if( dataBuf16->Length() > KSyncMLMaxServerMsgLength )
         {
@@ -1093,38 +1510,131 @@
     TRequestStatus status;      
     //Note type to Query note
     notifyParams.iNoteType = ESyncMLYesNoQuery;
-    TPckgBuf<TSyncMLDlgNotifParams> pkgBuf(notifyParams);
-    
-    
-    if(!IsHbSyncmlNotifierEnabledL())
-    {
-    	_DBG_FILE("starting notifier");  
-
-    }
-    else
-    {
- 
-    TInt statusval;
-    ServerHbNotifierL(notifyParams.iNoteType, notifyParams.iServerMsg);
-    TInt err = RProperty::Get(dmagentuid, EHbDMSyncNotifierKeyStatusReturn, statusval);
-    	LOGSTRING2("get error status = %d", err);
-    	if(err == KErrNone)
-    		{
-    			status = statusval;
-    			LOGSTRING2("get statusval = %d", status.Int());
-    		}
- 
-    }
-    
-    if (status == KErrCancel || status == KErrTimedOut)
+    TPckgBuf<TSyncMLDlgNotifParams> pkgBuf( notifyParams );
+    notifier.StartNotifierAndGetResponse(status,KNSmlSyncDialogUid,pkgBuf,resBuf);
+    User::WaitForRequest(status);
+    TBool ret = resBuf();
+    if ( status == KErrCancel || status == KErrTimedOut )
         {
         TInt error = status == KErrCancel ? TNSmlError::ESmlStatusNotModified : TNSmlError::ESmlStatusRequestTimeout;
         iStatusToServer->SetStatusCodeL( aStatusId, error );
         HandleAlertErrorL();
         }
-    CleanupStack::PopAndDestroy(3); //alertData alertDataWithMDT,databuf16 
+    CleanupStack::PopAndDestroy(4); //alertData alertDataWithMDT,databuf16,notifier   
     }
 
+// ---------------------------------------------------------
+// CNSmlDMCmds::HandleUserInputalertL
+// Handles user Text Input Alert command from a server.  
+// ---------------------------------------------------------    
+ void CNSmlDMCmds::HandleUserInputalertL( SmlAlert_t* aAlert, TInt& aStatusId)
+     {     
+     // MINDT 
+     TInt mindt = AlertParameter( aAlert->itemList->item->data, KNSmlDMAgentMINDT );
+     // MAXDT 
+     TInt maxdt = AlertParameter( aAlert->itemList->item->data, KNSmlDMAgentMAXDT );
+     if ( mindt > maxdt )
+         {
+         maxdt = mindt;
+         }   
+     TSyncMLDlgNotifParams notifyParams;
+     TInt maxlen = AlertParameter( aAlert->itemList->item->data, KNSmlDMAgentMAXLEN );
+     TInt InputType = AlertInputTypeParameter( aAlert->itemList->item->data, KNSmlDMAgentIT );
+     TInt EchoType = AlertEchoTypeParameter( aAlert->itemList->item->data, KNSmlDMAgentET );
+     //check if iDR, Default response parameter is there or not
+     //DRPresent is used for destroying how many items in the pop up stack 
+     TBool DRPresent = CheckDRPresence( aAlert->itemList->item->data, KNSmlDMAgentDR );
+     if( DRPresent )
+         {
+         TPtrC8 DrPtr = AlertDefaultResponseParam( aAlert->itemList->item->data, KNSmlDMAgentDR );       
+         HBufC8* hptr = HBufC8::NewLC( DrPtr.Length()+ 4 ); //cs
+         TPtr8 DrBuf(hptr->Des());                           
+
+         DrBuf.Append(DrPtr);
+
+         HBufC* DrBuf16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( DrBuf  );
+         CleanupStack::PushL( DrBuf16 );//cs
+         notifyParams.iDR = *DrBuf16;
+         }
+     HBufC8* alertData = AlertDataLC( aAlert->itemList );//cs
+     if ( alertData->Length() == 0)
+         {
+         if( DRPresent )
+             {
+             CleanupStack::PopAndDestroy(3);//alertData,hptr,DrBuf16
+             }
+         else
+             {
+             CleanupStack::PopAndDestroy();//alertData
+             }
+         iStatusToServer->SetStatusCodeL( aStatusId, TNSmlError::ESmlStatusIncompleteCommand );
+         HandleAlertErrorL();
+         return;   
+         }
+     HBufC8* alertDataWithMDT = HBufC8::NewLC(alertData->Length()+KNSmlDMAgentMINDT().Length()+KNSmlDMAgentMAXDT().Length()+6);//cs
+     TPtr8 dataBuf = alertDataWithMDT->Des();
+     dataBuf.Append(*alertData);
+     HBufC* dataBuf16 = NULL;
+     TRAPD(errC,  dataBuf16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L(dataBuf));
+     if( errC == KErrCorrupt )
+         {
+         if( DRPresent )
+             {
+             CleanupStack::PopAndDestroy(4); //alertData hptr,DrBuf16,alertDataWithMDT
+             }
+         else
+             {
+             CleanupStack::PopAndDestroy(2); //alertData alertDataWithMDT
+             }
+         iStatusToServer->SetStatusCodeL( aStatusId, TNSmlError::ESmlStatusCommandFailed );
+         return;
+         }
+     CleanupStack::PushL(dataBuf16);    //cs
+     RNotifier notifier;
+     User::LeaveIfError( notifier.Connect() );
+     CleanupClosePushL(notifier); //cs
+     TPckgBuf<TBool> resBuf;     
+     if( dataBuf16->Length() > KSyncMLMaxServerMsgLength )
+         {
+         notifyParams.iServerMsg = (*dataBuf16).Left(KSyncMLMaxServerMsgLength) ;    
+         }
+     else
+         {
+         notifyParams.iServerMsg = *dataBuf16;   
+         }     
+     notifyParams.iMaxTime = maxdt;
+     notifyParams.iMaxLength = maxlen;
+     notifyParams.iET = EchoType;
+     notifyParams.iIT = InputType;       
+     TRequestStatus status;      
+     //Note type to Text input note
+     notifyParams.iNoteType = ESyncMLInputQuery;
+     TPckgBuf<TSyncMLDlgNotifParams> pkgBuf( notifyParams );
+     TSyncMLDlgNotifReturnParams emptybuf;
+     TSyncMLDlgNotifReturnParamsPckg resultBuf( emptybuf );
+     notifier.StartNotifierAndGetResponse( status, KNSmlSyncDialogUid, pkgBuf, resultBuf );
+     User::WaitForRequest( status );
+     TBuf8<KSyncMLMaxDefaultResponseMsgLength> rettext;
+     rettext.Copy( resultBuf().irettext.Left( KSyncMLMaxDefaultResponseMsgLength ) );
+     if ( status == KErrCancel || status == KErrTimedOut || status ==  KErrAbort )
+         {
+         TInt error = TNSmlError::ESmlStatusOperationCancelled ;
+         iStatusToServer->SetStatusCodeL( aStatusId, error );
+         HandleAlertErrorL();
+         }
+     //For sending data to server    
+     SmlPcdata_t* data = NULL;
+     PcdataNewL( data, rettext);
+     CleanupStack::PushL( data );
+     iStatusToServer->AddItemDataL( aStatusId, data );
+     CleanupStack::PopAndDestroy(); //data
+     if( DRPresent ) 
+         CleanupStack::PopAndDestroy(6); //notifier,alertData,alertDataWithMDT,dataBuf16,hptr,DrBuf16
+     else
+         //#endif
+         CleanupStack::PopAndDestroy(4); //notifier,alertData,alertDataWithMDT,dataBuf16     
+     }
+
  // ---------------------------------------------------------
  // CNSmlDMCmds::HandleDisplayAlertL
  // Handles Display Alert command from a server.  
@@ -1161,7 +1671,9 @@
          return;
          }
      CleanupStack::PushL(dataBuf16);    
-    
+     RNotifier notifier;
+     User::LeaveIfError( notifier.Connect() );
+     CleanupClosePushL(notifier);
      TPckgBuf<TBool> resBuf;
      if( dataBuf16->Length() > KSyncMLMaxServerMsgLength )
          {
@@ -1176,70 +1688,11 @@
      TRequestStatus status;              
      notifyParams.iNoteType = ESyncMLInfoNote;
      TPckgBuf<TSyncMLDlgNotifParams> pkgBuf( notifyParams );
-    if(!IsHbSyncmlNotifierEnabledL())
-        {
-     
-        }
-    else
-        {
-        LOGSTRING("HandleDisplayAlertL Start test 1 start");  
-        ServerHbNotifierL(notifyParams.iNoteType, notifyParams.iServerMsg);
-        LOGSTRING("HandleDisplayAlertL Start test 2 end");
-        }
-    
-    CleanupStack::PopAndDestroy(3); //alertData alertDataWithMDT,databuf16   
-
-
-    }
-
-void CNSmlDMCmds::ServerHbNotifierL(TSyncMLDlgNoteTypes& aNotetype, TDesC& aServerMsg)
-    
-    {
-				LOGSTRING("HandleDisplayAlertL ServerHbNotifier start");                
-        RDmDevDialog DmDevdialog;
-        TInt err = DmDevdialog.OpenL();
-        User::LeaveIfError(err);
-        TRequestStatus status = KRequestPending;
-        if(aNotetype == ESyncMLInfoNote)
-            {
-        DmDevdialog.ShowDisplayAlert(aServerMsg,status);
-            }
-            
-        else 
-            {
-        TInt timeout = 30; // dummy
-        TBuf<30> header; // dummy
-        DmDevdialog.ShowConfirmationAlert(timeout,header,aServerMsg,status);
-            }
-       
-        User::WaitForRequest(status);
-
-DmDevdialog.Close();
-        LOGSTRING("HandleDisplayAlertL ServerHbNotifier end");
-
-}
-TBool CNSmlDMCmds::IsHbSyncmlNotifierEnabledL()
-    {
-    CRepository * rep =
-            CRepository::NewLC(KCRUidDeviceManagementInternalKeys);
-
-    TInt notifierenabled = KErrNone;
-
-    TInt err = rep->Get(KDevManEnableHbNotifier, notifierenabled);
-
-    CleanupStack::PopAndDestroy(rep);
-
-    if (err == KErrNone && notifierenabled)
-        {
-        return ETrue;
-        }
-    else
-        {
-        return EFalse;
-        }
-
-    }
-
+     notifier.StartNotifierAndGetResponse(status,KNSmlSyncDialogUid,pkgBuf,resBuf);
+     User::WaitForRequest(status);
+     CleanupStack::PopAndDestroy(4); //alertData alertDataWithMDT,databuf16,notifier     
+     }
+	
 // ---------------------------------------------------------
 // CNSmlDMCmds::ProcessSyncL()
 // Process received Add, Replace and Delete commands
@@ -1836,3 +2289,131 @@
 		aStatusCode = TNSmlError::ESmlStatusIncompleteCommand;
 		}
 	}
+
+// ---------------------------------------------------------------------------------------------------------------
+// CNSmlDMCmds::AlertChoiceItemsLC()
+//  Retrieves the choice alerts information 
+// ---------------------------------------------------------------------------------------------------------------
+HBufC8* CNSmlDMCmds::AlertChoiceItemsLC(SmlItemList_t* aItemList,HBufC8*& aLengthBuf ,TInt& aNumItems ) const
+    {
+    /*cleanupstack contains
+     * top : tempdata
+     *      : unicodeData
+     * bottom: aLengthBuf
+     */
+	 const TChar KDRSeparator('-');
+const TChar KChoiceItemSeparator(',');
+    HBufC8* unicodeData = HBufC8::NewLC(200);
+    HBufC8* tempdata = NULL;
+    HBufC8* lengthbuf = aLengthBuf;
+    TBuf<20> lennum; 
+    SmlItemList_t* temp;
+    if (  aItemList )//Not null
+        {
+        if(aItemList->next)//removing header of dialog
+            {
+            temp = aItemList->next;
+            while(temp->next)
+                {
+                if (  temp->next->item )
+                    {
+                    if (  temp->next->item->data )
+                        {
+                        if (  temp->next->item->data->content )
+                            {
+                            TPtr8 data( (TUint8*)  temp->next->item->data->content,  temp->next->item->data->length, temp->next->item->data->length );
+                            TrimRightSpaceAndNull( data );
+                            tempdata = data.AllocLC();
+                            TInt length = data.Length();//item length
+                            //add length to buffer and add comma 
+                            if(lengthbuf->Des().MaxLength() > (lengthbuf->Des().Length() + 5/*bytes*/) )
+                                {
+                                if(length > KSyncMLMaxChoiceItemLength ) // choice item length restricting to 200
+                                    {
+                                    lennum.Num(KSyncMLMaxChoiceItemLength);
+                                    lengthbuf->Des().Append(lennum);
+                                    lengthbuf->Des().Append(KChoiceItemSeparator);                                    
+                                    }
+                                else
+                                    {
+                                    lennum.Num(length);                            
+                                    lengthbuf->Des().Append(lennum);
+                                    lengthbuf->Des().Append(KChoiceItemSeparator);
+                                    }
+                                }
+                            else
+                                {
+                                //Pop the aLengthBuf from cleanupstack and realloc
+                                CleanupStack::Pop(3); //tempdata,unicodeData,aLengthBuf
+                                lengthbuf = lengthbuf->ReAllocL(lengthbuf->Des().Length() + 100);
+                                CleanupStack::PushL(lengthbuf);
+                                CleanupStack::PushL(unicodeData);
+                                CleanupStack::PushL(tempdata);
+                                if(length > KSyncMLMaxChoiceItemLength ) // choice item length restricting to 200
+                                    {
+                                    lengthbuf->Des().AppendNum(KSyncMLMaxChoiceItemLength);
+                                    lengthbuf->Des().Append(KChoiceItemSeparator);  
+                                    }
+                                else
+                                    {
+                                    lengthbuf->Des().AppendNum(length); //Append(length);
+                                    lengthbuf->Des().Append(KChoiceItemSeparator);
+                                    }
+                                }
+                            if(unicodeData->Des().MaxLength()> (unicodeData->Des().Length() + length))
+                                {
+                                if(length > KSyncMLMaxChoiceItemLength ) // choice item length restricting to 200
+                                    {
+                                    unicodeData->Des().Append(tempdata->Des().Left(KSyncMLMaxChoiceItemLength)); 
+                                    }
+                                else
+                                    {
+                                    unicodeData->Des().Append(tempdata->Des());
+                                    }
+                                }
+                            else
+                                {
+                                CleanupStack::Pop(2);//tempdata,unicodeData
+                                unicodeData = unicodeData->ReAllocL(unicodeData->Des().Length() + length + 200);
+                                CleanupStack::PushL(unicodeData);
+                                CleanupStack::PushL(tempdata);
+                                if(length > KSyncMLMaxChoiceItemLength ) // choice item length restricting to 200
+                                    {
+                                    unicodeData->Des().Append(tempdata->Des().Left(KSyncMLMaxChoiceItemLength)); 
+                                    }
+                                else
+                                    {
+                                    unicodeData->Des().Append(tempdata->Des());
+                                    }
+                                }
+                            CleanupStack::PopAndDestroy(tempdata);
+                            aNumItems++;
+                            data.Zero();
+                            }
+                        }
+                    }
+                temp = temp->next;
+                }
+            }
+        }  
+        _DBG_FILE("CNSmlDMCmds::AlertDataLC: end"); 
+        aLengthBuf = lengthbuf;
+        return unicodeData;          
+    }
+	
+// ---------------------------------------------------------------------------------------------------------------
+// CNSmlDMCmds::FindMaxLength()
+// ---------------------------------------------------------------------------------------------------------------	
+TInt CNSmlDMCmds::FindMaxLength(TInt aSourceLength, TInt aDestLength)
+	{
+	TInt length = 0;
+	if(aSourceLength > aDestLength )
+	 {
+	  length = aDestLength;
+	 }
+	else
+	 {
+	  length = aSourceLength;	  
+	 }
+	return length;
+	}