adaptationlayer/dataport/dataport_csy/src/dpdataconfig.cpp
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/adaptationlayer/dataport/dataport_csy/src/dpdataconfig.cpp	Fri Nov 06 17:28:23 2009 +0000
@@ -0,0 +1,1520 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "dpdef.h"          // dataport definitions
+#include <pipeisi.h>        // isi pipe
+#include "pep_comm_types.h" // structures for isi-message interface
+
+#include "dpdataport.h"     // dataport main and c32 interface
+#include "dpdataconfig.h"   // configuration store
+#include "dppif.h"          // dcs pipe interface
+#include "dpdatabuffer.h"   // base class for rx and tx buffers
+#include "dpmif.h"          // message interface mif
+#include "dplog.h"          // dataport logging
+
+#include <pipe_sharedisi.h>
+#include "osttracedefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "dpdataconfigtraces.h"
+#endif
+
+
+// LOCAL FUNCTION PROTOTYPES
+// none
+
+// ==================== LOCAL FUNCTIONS ====================
+// none
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// -----------------------------------------------------------------------------
+// DPDataConfig::NewL
+// Creates a new  DPDataConfig object instance
+// -----------------------------------------------------------------------------
+CDpDataConfig *CDpDataConfig::NewL(
+    CDpDataPort& aDataPort )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_NEWL, "CDpDataConfig::NewL" );
+    CDpDataConfig* self = new( ELeave ) CDpDataConfig( aDataPort );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// DPDataConfig::ConstructL
+// Initialises object attributes
+// -----------------------------------------------------------------------------
+void CDpDataConfig::ConstructL()
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_CONSTRUCTL, "CDpDataConfig::ConstructL" );
+    // set role capabilities
+    User::LeaveIfError( SetRoleCap( iRole ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CDpDataConfig::CDpDataConfig
+// C++ default constructor.
+// -----------------------------------------------------------------------------
+CDpDataConfig::CDpDataConfig(
+    CDpDataPort& aDataPort ) :
+    iDataPort( aDataPort )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_CDPDATACONFIG, "CDpDataConfig::CDpDataConfig" );
+    LOGM(" CDpDataConfig::CDpDataConfig");
+
+    iDataPort.GetRole( iRole );
+    iDteParityBitWhen7Mode = PEP_COMM_DATA_WITH_PARITY;
+
+    // set default configuration
+    iConfig.iRate = EBps9600;
+
+    // default data format 8N1
+    iConfig.iDataBits = EData8;
+    iConfig.iStopBits = EStop1;
+    iConfig.iParity = EParityNone;
+
+    // DTE defaults
+    iConfig.iHandshake = KConfigObeyCTS;
+    // Other options to handshake default:
+    // KConfigObeyXoff
+    // KConfigSendXoff
+    // KConfigObeyCTS;
+    // KConfigObeyDSR
+    // KConfigObeyDCD
+    // KConfigFreeRTS
+    // KConfigFreeDTR
+
+    // not really applicable
+    iConfig.iFifo = EFifoEnable;
+
+    // use no special rate
+    iConfig.iSpecialRate = 0;
+
+    // use no terminators
+    iConfig.iTerminatorCount = 0;
+
+    // set XON/XOFF characters into 'typical' values
+    iConfig.iXonChar = KDcsDefaultXonChar;
+    iConfig.iXoffChar = KDcsDefaultXoffChar;
+
+    // ignore parity errors
+    iConfig.iParityError = KConfigParityErrorIgnore;
+
+    // ignoring parity errors
+    iConfig.iParityErrorChar = 0;
+
+    // we do no IR
+    iConfig.iSIREnable = ESIRDisable;
+    iConfig.iSIRSettings = 0;
+
+    // flowcontrol extraction
+    iFlowCtrlCharExtraction = ETrue;
+
+    iSignals = 0;
+    // signals are low, but signal changed bits are up
+    // that is because otherwise we might miss clients first signal change,
+    // case of signal change is up->low.
+
+    // set capabilities
+    // data rate
+    iCapsV02.iRate =
+        KCapsBps2400 |
+        KCapsBps4800 |
+        KCapsBps9600 |
+        KCapsBps19200 |
+        KCapsBps38400 |
+        KCapsBps57600 |
+        KCapsBps115200;
+        //| KCapsBpsSpecial; // unsupported currently
+
+    // data bits
+    iCapsV02.iDataBits = KCapsData7 | KCapsData8;
+
+    // stop bits
+    iCapsV02.iStopBits = KCapsStop1 | KCapsStop2;
+
+    // parity
+    iCapsV02.iParity =
+        KCapsParityNone |
+        KCapsParityOdd |
+        KCapsParityEven |
+        KCapsParityMark |
+        KCapsParitySpace;
+
+    iCapsV02.iSignals =
+        KCapsSignalDSRSupported |
+        KCapsSignalDCDSupported |
+        KCapsSignalDTRSupported |
+        KCapsSignalRNGSupported;
+
+    // not really applicable
+    // KCapsHasFifo;
+    iCapsV02.iFifo = 0;
+
+    // no IR
+    iCapsV02.iSIR = 0;
+
+    // supported notifications
+    iCapsV02.iNotificationCaps =
+        KNotifySignalsChangeSupported |
+        KNotifyRateChangeSupported |
+        KNotifyDataFormatChangeSupported |
+        KNotifyHandshakeChangeSupported |
+        KNotifyBreakSupported |
+        KNotifyFlowControlChangeSupported |
+        KNotifyDataAvailableSupported |
+        KNotifyOutputEmptySupported;
+
+    iCapsV02.iRoleCaps = KCapsRoleSwitchSupported;
+
+    // port supports retrieval of flow control status
+    iCapsV02.iFlowControlCaps = KCapsFlowControlStatusSupported;
+
+    // '+'
+    iEscChar = KEscChar;
+    // in 50 millisec note: previous comment was in 20 milliseconds
+    iEscTime = KEscTime50millisec;
+    }
+
+// -----------------------------------------------------------------------------
+// CDpDataConfig::~CDpDataConfig
+// Destructor
+// -----------------------------------------------------------------------------
+CDpDataConfig::~CDpDataConfig()
+    {
+    OstTrace0( TRACE_NORMAL, DUP1_CDPDATACONFIG_CDPDATACONFIG, "CDpDataConfig::~CDpDataConfig" );
+    LOGM(" CDpDataConfig::~CDpDataConfig");
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::SetRoleCap
+// Sets role Capabalities
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::SetRoleCap(
+    TCommRole aRole )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_SETROLECAP, "CDpDataConfig::SetRoleCap" );
+    TInt ret( KErrNone );
+
+    switch ( aRole )
+        {
+        case ECommRoleDTE:
+            {
+            // we cope with both sw & hw flow control
+            iCapsV02.iHandshake =
+                KCapsObeyXoffSupported |
+                KCapsSendXoffSupported |
+                KCapsObeyCTSSupported |
+                KCapsObeyDSRSupported |
+                KCapsObeyDCDSupported |
+                KCapsFreeDTRSupported |
+                KCapsFailDCDSupported |
+                KCapsFreeRTSSupported;
+            break;
+            }
+        case ECommRoleDCE:
+            {
+            // we cope with sw flow control and RTS DTR
+            iCapsV02.iHandshake =
+                KCapsObeyXoffSupported |
+                KCapsSendXoffSupported |
+                KCapsObeyCTSSupported |
+                KCapsObeyDTRSupported |
+                0x1000 | // KCapsObeyRTSSupported
+                0x4000 | // KCapsFreeDSRSupported
+                0x10000; // KCapsFreeDCDSupported
+            break;
+            }
+        default:
+            {
+            ret = KErrGeneral;
+            break;
+            }
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::GetCommCaps
+// This method gets port capabilities in TCommCapsV01.
+// ---------------------------------------------------------
+//
+void CDpDataConfig::GetCommCaps(
+    TCommCapsV01& aCommCaps ) const
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_GETCOMMCAPS, "CDpDataConfig::GetCommCaps" );
+    LOGM(" CDpDataConfig::GetCommCaps");
+
+    aCommCaps.iRate = iCapsV02.iRate;
+    aCommCaps.iDataBits = iCapsV02.iDataBits;
+    aCommCaps.iStopBits = iCapsV02.iStopBits;
+    aCommCaps.iParity = iCapsV02.iParity;
+    aCommCaps.iHandshake = iCapsV02.iHandshake;
+    aCommCaps.iSignals = iCapsV02.iSignals;
+    aCommCaps.iFifo = iCapsV02.iFifo;
+    aCommCaps.iSIR = iCapsV02.iSIR;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::GetCommCapsV02
+// This method gets port capabilities in TCommCapsV02.
+// ---------------------------------------------------------
+//
+void CDpDataConfig::GetCommCapsV02(
+    TCommCapsV02& aCommCaps2 ) const
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_GETCOMMCAPSV02, "CDpDataConfig::GetCommCapsV02" );
+    LOGM(" CDpDataConfig::GetCommCapsV02");
+
+    GetCommCaps( aCommCaps2 );
+
+    aCommCaps2.iNotificationCaps = iCapsV02.iNotificationCaps;
+    aCommCaps2.iRoleCaps = iCapsV02.iRoleCaps;
+    aCommCaps2.iFlowControlCaps = iCapsV02.iFlowControlCaps;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::SetConfig
+// This method sets DTE interface port configuration
+// settings.
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::SetConfig(
+    TCommConfigV01& aConfig )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_SETCONFIG, "CDpDataConfig::SetConfig" );
+    LOGM(" CDpDataConfig::SetConfig");
+
+    TInt ret( KErrNone );
+
+    //Initialise these values to 0
+    TUint8 rate( 0 );
+    TUint8 dataBits( 0 );
+    TUint8 stopBits( 0 );
+    TUint8 parity( 0 );
+    TBool saveSettings ( EFalse );
+
+    // Check against supported values, NOTE: caps is a bitmask,
+    // when config is enumerated.
+    if ( !( iCapsV02.iRate & ( 1 << aConfig.iRate ) ) )
+        {
+        ret = KErrNotSupported;
+        }
+    else if ( !( iCapsV02.iDataBits & ( 1 << aConfig.iDataBits ) ) )
+        {
+        ret = KErrNotSupported;
+        }
+    else if ( !( iCapsV02.iStopBits & ( 1 << aConfig.iStopBits ) ) )
+        {
+        ret = KErrNotSupported;
+        }
+    else if ( !( iCapsV02.iParity & ( 1 << aConfig.iParity ) ) )
+        {
+        ret = KErrNotSupported;
+        }
+    else if ( ( ~iCapsV02.iHandshake & aConfig.iHandshake ) &&
+        ( 0 != aConfig.iHandshake ) )
+        {
+        ret = KErrNotSupported;
+        }
+    else
+        {
+        // We do not parity check, disable fifo, do special rate nor IR.
+        if ( ( aConfig.iParityError != KConfigParityErrorIgnore ) ||
+            ( aConfig.iFifo != EFifoEnable ) ||
+            aConfig.iSpecialRate ||
+            aConfig.iParityErrorChar ||
+            ( aConfig.iSIREnable != ESIRDisable ) ||
+            aConfig.iSIRSettings )
+            {
+            LOG("  ERROR, SetConfig - KErrNotSupported");
+            OstTrace0( TRACE_NORMAL, DUP1_CDPDATACONFIG_SETCONFIG, "CDpDataConfig:: ERROR, SetConfig - KErrNotSupported" );
+
+            ret = KErrNotSupported;
+            }
+        else if ( KConfigMaxTerminators < aConfig.iTerminatorCount )
+            {
+            LOG("  ERROR, CDpDataConfig::SetConfig, KErrArgument");
+            OstTrace0( TRACE_NORMAL, DUP2_CDPDATACONFIG_SETCONFIG, "CDpDataConfig:: ERROR, SetConfig - KErrArgument" );
+
+            ret = KErrArgument;
+            }
+        // We care only databits, stopbits and parity changes.
+        // We don't send message to CMT when only speed has changed.
+        // CMT is not using speed setting at all.
+        else if ( ( iConfig.iDataBits == aConfig.iDataBits ) &&
+            ( iConfig.iStopBits == aConfig.iStopBits ) &&
+            ( iConfig.iParity == aConfig.iParity ) )
+            {
+            // Save settings, to return same
+            // settings when client is asking them.
+            iConfig = aConfig;
+            saveSettings = ETrue;
+            }
+        // Do parameter mapping.
+        // check data rate
+        else if ( KErrNone != Rate( aConfig, rate ) )
+            {
+            ret = Rate( aConfig, rate );
+            }
+        // check data bits
+        else if ( KErrNone != DataBits( aConfig, dataBits ) )
+            {
+            ret = DataBits( aConfig, dataBits );
+            }
+        // check stop bits
+        else if ( KErrNone != StopBits( aConfig, stopBits ) )
+            {
+            ret = StopBits( aConfig, stopBits );
+            }
+        // check parity
+        else if ( KErrNone != Parity( aConfig, parity ) )
+            {
+            ret = Parity( aConfig, parity );
+            }
+        //no else
+
+        if ( KErrNone == ret && !saveSettings )
+            {
+            // this is for if Client uses SetConfig before we have pipe up.
+            if ( CDpPif::EDpPipeEnabled != iDataPort.Pif().PipeState() )
+                {
+                ret = KErrNotReady;
+                }
+            else
+                {
+                // Create PNS_PEP_STATUS_IND : PEP_COMM_IND_ID_PARAM
+                // (Indication data, PEP_COMM_CTRL_ID_PARAM_STR size = 4 bytes)
+                TBuf8<SIZE_PNS_PEP_STATUS_IND + 4 > messageData;
+                // Pipe Handle
+                messageData.Append( iDataPort.Pif().PipeHandle() );
+                // PEP Type
+                messageData.Append( PN_PEP_TYPE_COMM );
+                // Indication ID
+                messageData.Append( PEP_COMM_IND_ID_PARAM );
+                // Filler bytes
+                messageData.Append( KDpPadding );
+                messageData.Append( KDpPadding );
+                // Indication data (PEP_COMM_CTRL_ID_PARAM_STR)
+                messageData.Append( dataBits );
+                messageData.Append( stopBits );
+                messageData.Append( rate );
+                messageData.Append( parity );
+
+                // Send messages
+                TInt result = iDataPort.Mif().SendMessage(
+                    PN_PIPE,
+                    iDataPort.CreateTransactionId(),
+                    PNS_PEP_STATUS_IND,
+                    messageData );
+
+                LOG("  <== PNS_PEP_STATUS_IND ind sent (PEP_COMM_IND_ID_PARAM)");
+                OstTrace0( TRACE_NORMAL, DUP3_CDPDATACONFIG_SETCONFIG, "CDpDataConfig:: <== PNS_PEP_STATUS_IND ind sent (PEP_COMM_IND_ID_PARAM)" );
+
+#if defined(_DEBUG)
+                if ( KErrNone != result )
+                    {
+                    LOG1("Error isc api send %d", result );
+                    OstTrace1( TRACE_NORMAL, DUP4_CDPDATACONFIG_SETCONFIG, "CDpDataConfig:: Error isc api send %d", result );
+                    }
+                //no else
+#endif
+                // accept new values
+                iConfig = aConfig;
+                }
+            }
+        //no else
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::GetSignals
+// This method gets status of signals.
+////  On return, contains signals
+// ---------------------------------------------------------
+//
+void CDpDataConfig::GetSignals(
+    TUint& aSignals )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_GETSIGNALS, "CDpDataConfig::GetSignals" );
+    LOGM(" CDpDataConfig::GetSignals");
+
+    aSignals = iSignals;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::SetSignals2Epoc
+// Signal cahnges from CMT. This method sets signal values.
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::SetSignals2Epoc(
+    const TUint aSignals )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_SETSIGNALS2EPOC, "CDpDataConfig::SetSignals2Epoc" );
+    LOGM(" CDpDataConfig::SetSignals2Epoc");
+
+    TCommRole role;
+    TUint newSignals( 0 );
+    iDataPort.GetRole( role );
+
+    // accept new signals
+    iSignals = aSignals;
+
+    // signal change came from DCS
+
+    if ( iSignalNotify )
+        {
+        newSignals = iSignals & (
+            iNotifySignalMask | iNotifySignalMask * KSignalChanged );
+
+        if ( ECommRoleDTE == role )
+            {
+            newSignals &= ( KSignalDTEInputs | KDTEDeltaInput );
+            }
+        else
+            {
+            newSignals &= ( KSignalDCEInputs | KDCEDeltaInput );
+            }
+
+        // we should indicate client
+        CompleteSignalChangeNotify( newSignals );
+        }
+    //no else
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::SetSignals2Cmt
+// Signal changes from the C32 client.
+// This method sends mapped signal values to CMT and sets
+// signal values.
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::SetSignals2Cmt(
+    const TUint aSignals )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_SETSIGNALS2CMT, "CDpDataConfig::SetSignals2Cmt" );
+    LOGM(" CDpDataConfig::SetSignals2Cmt");
+
+    TCommRole role;
+    iDataPort.GetRole( role );
+
+    // signal change came from client
+
+    TInt ret( MapSignalsEpoc2Cmt( aSignals, role ) );
+
+    if ( KErrNone == ret )
+        {
+        // accept new signals
+        iSignals = aSignals;
+
+        TUint newSignals( 0 );
+
+        if ( iSignalNotify )
+            {
+            newSignals = iSignals & (
+                iNotifySignalMask | iNotifySignalMask * KSignalChanged );
+            if ( ECommRoleDTE == role )
+                {
+                newSignals &= ( KSignalDCEInputs | KDCEDeltaInput );
+                }
+            else
+                {
+                newSignals &= ( KSignalDTEInputs | KDTEDeltaInput );
+                }
+
+            // we should indicate client
+            CompleteSignalChangeNotify( newSignals );
+            }
+        //no else
+        }
+    //no else
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::SetSignalNotify
+// Activate/deactivate signal change notify.
+// ---------------------------------------------------------
+//
+void CDpDataConfig::SetSignalNotify(
+    const TBool aEnableNotify )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_SETSIGNALNOTIFY, "CDpDataConfig::SetSignalNotify" );
+    LOGM(" CDpDataConfig::SetSignalNotify");
+
+    iSignalNotify = aEnableNotify;
+
+    // Forget signal changes
+    iSignals &= ( KSignalDTEOutputs | KSignalDTEInputs );
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::SetNotifySignalMask
+// Client sets a signal mask. i.e. Client can give a mask
+// and we only notify client when one of the signals given
+// in mask changes.
+// ---------------------------------------------------------
+//
+void CDpDataConfig::SetNotifySignalMask(
+    const TUint aSignalMask )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_SETNOTIFYSIGNALMASK, "CDpDataConfig::SetNotifySignalMask" );
+    LOGM(" CDpDataConfig::SetNotifySignalMask");
+
+    iNotifySignalMask = aSignalMask;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::SetConfigNotify
+// Client is requesting to notify when configuration changes
+// ---------------------------------------------------------
+//
+void CDpDataConfig::SetConfigNotify(
+    const TBool aEnableNotify )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_SETCONFIGNOTIFY, "CDpDataConfig::SetConfigNotify" );
+    LOGM(" CDpDataConfig::SetConfigNotify");
+
+    iConfigNotify = aEnableNotify;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::MapSignalsCmt2Epoc
+// This method map signals from CMT messages to C32 signals.
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::MapSignalsCmt2Epoc(
+    TDesC8& aIndData )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_MAPSIGNALSCMT2EPOC, "CDpDataConfig::MapSignalsCmt2Epoc" );
+    LOGM(" CDpDataConfig::MapSignalsCmt2Epoc");
+
+    TUint signalsC32( iSignals );
+    TInt ret( KErrNone );
+    TBool noSignalChanged( EFalse );
+
+    PEP_COMM_IND_ID_V24_CHANGE_STR& pepParam = *(
+        ( PEP_COMM_IND_ID_V24_CHANGE_STR* ) aIndData.Ptr() );
+
+    // DTE inputs from CMT side
+    if ( PEP_COMM_SIGNAL_RI_ON == pepParam.new_state )
+        {
+        LOG(" PEP_COMM_SIGNAL_RI_ON");
+        OstTrace0( TRACE_NORMAL, DUP1_CDPDATACONFIG_MAPSIGNALSCMT2EPOC, "CDpDataConfig:: PEP_COMM_SIGNAL_RI_ON" );
+
+        if ( ( signalsC32 & KSignalRNG ) != KSignalRNG )
+            {
+            signalsC32 |= KSignalRNG | KRNGChanged;
+            }
+        else
+            {
+            // No signals has changed
+            noSignalChanged = ETrue;
+            }
+        }
+    else if ( PEP_COMM_SIGNAL_RI_OFF == pepParam.new_state )
+        {
+        LOG(" PEP_COMM_SIGNAL_RI_OFF");
+        OstTrace0( TRACE_NORMAL, DUP2_CDPDATACONFIG_MAPSIGNALSCMT2EPOC, "CDpDataConfig:: PEP_COMM_SIGNAL_RI_OFF" );
+
+        if ( ( signalsC32 & KSignalRNG ) == KSignalRNG )
+            {
+            signalsC32 &= ~KSignalRNG;
+            signalsC32 |= KRNGChanged;
+            }
+        else
+            {
+            // No signals has changed
+            noSignalChanged = ETrue;
+            }
+        }
+    else if ( PEP_COMM_SIGNAL_DCD_ON == pepParam.new_state )
+        {
+        LOG(" PEP_COMM_SIGNAL_DCD_ON");
+        OstTrace0( TRACE_NORMAL, DUP3_CDPDATACONFIG_MAPSIGNALSCMT2EPOC, "CDpDataConfig:: PEP_COMM_SIGNAL_DCD_ON" );
+
+        if ( ( signalsC32 & KSignalDCD ) != KSignalDCD )
+            {
+            LOG("DCD_ON");
+            OstTrace0( TRACE_NORMAL, DUP4_CDPDATACONFIG_MAPSIGNALSCMT2EPOC, "CDpDataConfig:: DCD_ON" );
+
+            signalsC32 |= KSignalDCD | KDCDChanged;
+            }
+        else
+            {
+            // No signals has changed
+            noSignalChanged = ETrue;
+            }
+        }
+    else if ( PEP_COMM_SIGNAL_DCD_OFF == pepParam.new_state )
+        {
+        LOG(" PEP_COMM_SIGNAL_DCD_OFF");
+        OstTrace0( TRACE_NORMAL, DUP5_CDPDATACONFIG_MAPSIGNALSCMT2EPOC, "CDpDataConfig:: PEP_COMM_SIGNAL_DCD_OFF" );
+
+        if ( ( signalsC32 & KSignalDCD ) == KSignalDCD )
+            {
+            LOG("DCD_OFF");
+            OstTrace0( TRACE_NORMAL, DUP6_CDPDATACONFIG_MAPSIGNALSCMT2EPOC, "CDpDataConfig:: DCD_OFF" );
+
+            signalsC32 &= ~KSignalDCD;
+            signalsC32 |= KDCDChanged;
+            }
+        else
+            {
+            // No signals has changed
+            noSignalChanged = ETrue;
+            }
+        }
+    else
+        {
+        // No signals has changed
+        noSignalChanged = ETrue;
+        }
+
+    if ( !noSignalChanged )
+        {
+        ret = SetSignals2Epoc( signalsC32 );
+        }
+    //no else
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::MapSignalsEpoc2Cmt
+// Map signals to CMT and send signal change message.
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::MapSignalsEpoc2Cmt(
+    const TUint aSignals,
+    const TCommRole aRole )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_MAPSIGNALSEPOC2CMT, "CDpDataConfig::MapSignalsEpoc2Cmt" );
+    LOGM(" CDpDataConfig::MapSignalsEpoc2Cmt");
+
+    TInt ret( KErrNone );
+
+    // PEP_COMM_IND_ID_V24_CHANGE_STR
+    TBuf8<1> data;
+
+    switch ( aRole )
+        {
+        case ECommRoleDTE:
+            {
+            HandleDteSignalMapping( aSignals, data );
+            break;
+            }
+        case ECommRoleDCE:
+            {
+            HandleDceSignalMapping( aSignals, data );
+            break;
+            }
+       default:
+            {
+            LOG("  ERROR, CDpDataConfig::MapSignalsEpoc2Cmt, Unsupported role");
+            OstTrace0( TRACE_NORMAL, DUP1_CDPDATACONFIG_MAPSIGNALSEPOC2CMT, "ERROR, CDpDataConfig::MapSignalsEpoc2Cmt, Unsupported role" );
+
+            ret = KErrNotSupported;
+            }
+        }
+
+    //if data = 0, do not send
+    if ( ( 0 != data.Length() ) && ( KErrNone == ret ) )
+        {
+        // Create PNS_PEP_STATUS_IND
+        TBuf8<SIZE_PNS_PEP_STATUS_IND> messageData;
+        // Pipe Handle
+        messageData.Append( iDataPort.Pif().PipeHandle() );
+        // PEP Type
+        messageData.Append( PN_PEP_TYPE_COMM );
+        // Indication ID
+        messageData.Append( PEP_COMM_IND_ID_V24_CHANGE );
+        // Filler bytes
+        messageData.Append( KDpPadding );
+        messageData.Append( KDpPadding );
+        // Indication data
+        messageData.Append( data );
+
+        // Send message
+#if defined(_DEBUG)
+        TInt err =
+#endif
+        iDataPort.Mif().SendMessage(
+            PN_PIPE,
+            iDataPort.CreateTransactionId(),
+            PNS_PEP_STATUS_IND,
+            messageData );
+
+        LOG("  <== PNS_PEP_STATUS_IND sent (PEP_COMM_IND_ID_V24_CHANGE)");
+        OstTrace0( TRACE_NORMAL, DUP2_CDPDATACONFIG_MAPSIGNALSEPOC2CMT, "CDpDataConfig:: <== PNS_PEP_STATUS_IND sent (PEP_COMM_IND_ID_V24_CHANGE)" );
+
+#if defined(_DEBUG)
+        if ( KErrNone != err )
+            {
+            LOG1("Error isc api send %d", err );
+            OstTrace1( TRACE_NORMAL, DUP3_CDPDATACONFIG_MAPSIGNALSEPOC2CMT, "CDpDataConfig:: Error isc api send %d", err );
+            }
+        //no else
+#endif
+        }
+    //no else
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::CompleteSignalChangeNotify
+// This method completes signal change notify, if there are
+// new signals. New signals are already mapped with notify
+// mask. This method disables notifying after completion.
+// ---------------------------------------------------------
+//
+void CDpDataConfig::CompleteSignalChangeNotify(
+    const TUint aNewSignals)
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_COMPLETESIGNALCHANGENOTIFY, "CDpDataConfig::CompleteSignalChangeNotify" );
+    LOGM(" CDpDataConfig::CompleteSignalChangeNotify");
+
+    if ( aNewSignals )
+        {
+        iDataPort.SignalChangeCompleted( aNewSignals, KErrNone );
+
+        SetSignalNotify( EFalse );
+        }
+    //no else
+
+    // otherwise client is not interested in these signals
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::CompleteConfigChangeNotify
+// Check if client has 'ordered' config change notify and there
+// is something changed. Complete config change to client.
+// ---------------------------------------------------------
+//
+void CDpDataConfig::CompleteConfigChangeNotify()
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_COMPLETECONFIGCHANGENOTIFY, "CDpDataConfig::CompleteConfigChangeNotify" );
+    LOGM(" CDpDataConfig::CompleteConfigChangeNotify");
+
+    if ( ( iConfigNotify ) && ( 0 < iPeerConfig.iChangedMembers ) )
+        {
+        TPckg<TCommNotificationV01> cfg( iPeerConfig );
+        iDataPort.ConfigChangeCompleted( cfg, KErrNone );
+        iConfigNotify = EFalse;
+        iPeerConfig.iChangedMembers = 0;
+        }
+    //no else
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::SetFlowControlConfig
+// This method sets flow control configuration. This is
+// called from COMM PEP.
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::SetFlowControlConfig(
+    const TUint8 aFlowCtrlInwards,
+    const TUint8 aFlowCtrlOutwards,
+    const TUint8 aExtract )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_SETFLOWCONTROLCONFIG, "CDpDataConfig::SetFlowControlConfig" );
+    LOGM(" CDpDataConfig::SetFlowControlConfig");
+
+    TUint handshake( iConfig.iHandshake );
+    TInt ret( KErrNone );
+    TCommRole role;
+    iDataPort.GetRole( role );
+
+    // clear peer configuration notify flags
+    iPeerConfig.iChangedMembers = 0;
+
+    // Inwards=DCS->DP data flow
+    switch ( aFlowCtrlInwards )
+        {
+        case PEP_COMM_FLOW_CTRL_SW:
+            {
+            if ( role == ECommRoleDTE )
+                {
+                handshake |= KConfigObeyXoff;
+                handshake &= ~KConfigObeyDSR;
+                handshake &= ~KConfigObeyDCD;
+                handshake &= ~KConfigObeyCTS;
+                }
+            else
+                {
+                handshake |= KConfigObeyXoff;
+                handshake &= ~KConfigObeyDTR;
+                handshake &= ~KConfigObeyRTS;
+                }
+            break;
+            }
+        case PEP_COMM_FLOW_CTRL_HW:
+            {
+            if ( role == ECommRoleDTE )
+                {
+                handshake |= KConfigObeyCTS;
+                handshake &= ~KConfigObeyDCD;
+                handshake &= ~KConfigObeyDSR;
+                handshake &= ~KConfigObeyXoff;
+                }
+            else
+                {
+                handshake |= KConfigObeyRTS;
+                handshake &= ~KConfigObeyXoff;
+                handshake &= ~KConfigObeyDTR;
+                }
+            break;
+            }
+        case PEP_COMM_FLOW_CTRL_BOTH:
+            {
+            if ( role == ECommRoleDTE )
+                {
+                handshake |= KConfigObeyXoff;
+                handshake |= KConfigObeyCTS;
+                handshake &= ~KConfigObeyDCD;
+                handshake &= ~KConfigObeyDSR;
+                }
+            else
+                {
+                handshake |= KConfigObeyXoff;
+                handshake |= KConfigObeyRTS;
+                handshake &= ~KConfigObeyDTR;
+                }
+            break;
+            }
+        case PEP_COMM_FLOW_CTRL_NONE:
+            {
+            if ( role == ECommRoleDTE )
+                {
+                handshake &= ~KConfigObeyXoff;
+                handshake &= ~KConfigObeyCTS;
+                handshake &= ~KConfigObeyDCD;
+                handshake &= ~KConfigObeyDSR;
+                }
+            else
+                {
+                handshake &= ~KConfigObeyXoff;
+                handshake &= ~KConfigObeyRTS;
+                handshake &= ~KConfigObeyDTR;
+                }
+            break;
+            }
+        default:
+            {
+            LOG1("  ERROR, CDpDataConfig::SetFlowControlConfig, Unsupported flowCtrl status: %d",
+                aFlowCtrlInwards );
+            OstTraceExt1( TRACE_NORMAL, DUP1_CDPDATACONFIG_SETFLOWCONTROLCONFIG, "CDpDataConfig:: ERROR, CDpDataConfig::SetFlowControlConfig, Unsupported flowCtrl status: %hhu", aFlowCtrlInwards );
+
+            ret = KErrNotSupported;
+            }
+        }
+
+    if ( KErrNone == ret )
+        {
+        // Outwards=DP->DCS data flow
+        switch ( aFlowCtrlOutwards )
+            {
+            case PEP_COMM_FLOW_CTRL_SW:
+                {
+                if ( role == ECommRoleDTE )
+                    {
+                    handshake |= KConfigSendXoff;
+                    handshake |= KConfigFreeDTR;
+                    handshake |= KConfigFreeRTS;
+                    }
+                else
+                    {
+                    handshake |= KConfigSendXoff;
+                    handshake |= KConfigFreeDSR;
+                    handshake |= KConfigFreeDCD;
+                    }
+                break;
+                }
+            case PEP_COMM_FLOW_CTRL_HW:
+                {
+                if ( role == ECommRoleDTE )
+                    {
+                    handshake &= ~KConfigFreeRTS;
+                    handshake |= KConfigFreeDTR;
+                    handshake &= ~KConfigSendXoff;
+                    }
+                else
+                    {
+                    handshake |= KConfigFreeDCD;
+                    handshake |= KConfigFreeDSR;
+                    handshake &= ~KConfigSendXoff;
+                    }
+                break;
+                }
+            case PEP_COMM_FLOW_CTRL_BOTH:
+                {
+                if ( role == ECommRoleDTE )
+                    {
+                    handshake |= KConfigSendXoff;
+                    handshake &= ~KConfigFreeRTS;
+                    handshake |= KConfigFreeDTR;
+                    }
+                else
+                    {
+                    handshake |= KConfigSendXoff;
+                    handshake |= KConfigFreeDCD;
+                    handshake |= KConfigFreeDSR;
+                    }
+                break;
+                }
+            case PEP_COMM_FLOW_CTRL_NONE:
+                {
+                if ( role == ECommRoleDTE )
+                    {
+                    handshake &= ~KConfigSendXoff;
+                    handshake |= KConfigFreeRTS;
+                    handshake |= KConfigFreeDTR;
+                    }
+                else
+                    {
+                    handshake &= ~KConfigSendXoff;
+                    handshake |= KConfigFreeDSR;
+                    handshake |= KConfigFreeDCD;
+                    }
+                break;
+                }
+            default:
+                {
+                LOG1("  ERROR, CDpDataConfig::SetFlowControlConfig, Unsupported flowCtrl status: %d",
+                    aFlowCtrlInwards );
+                OstTraceExt1( TRACE_NORMAL, DUP2_CDPDATACONFIG_SETFLOWCONTROLCONFIG, "ERROR, CDpDataConfig::SetFlowControlConfig, Unsupported flowCtrl status: %hhu", aFlowCtrlInwards );
+
+                ret = KErrNotSupported;
+                }
+            }
+
+        if ( KErrNone == ret )
+            {
+            // set flow control char extraction
+            switch ( aExtract )
+                {
+                case PEP_COMM_FLOW_CTRL_EXTRACT:
+                    {
+                    iFlowCtrlCharExtraction = ETrue;
+                    break;
+                    }
+                case PEP_COMM_FLOW_CTRL_NO_EXTRACT:
+                    {
+                    iFlowCtrlCharExtraction = EFalse;
+                    break;
+                    }
+                default:
+                    {
+                    LOG1("  ERROR unsupported extract status: %d", aExtract );
+                    OstTraceExt1( TRACE_NORMAL, DUP3_CDPDATACONFIG_SETFLOWCONTROLCONFIG, "CDpDataConfig:: ERROR unsupported extract status: %hhu", aExtract );
+
+                    ret = KErrNotSupported;
+                    }
+                }
+
+            if ( KErrNone == ret )
+                {
+                if ( iPeerConfig.iHandshake != handshake )
+                    {
+                    // turn change flags on
+                    iPeerConfig.iChangedMembers |= KHandshakeChanged;
+
+                    iPeerConfig.iHandshake = handshake;
+                    iConfig.iHandshake = iPeerConfig.iHandshake;
+
+                    // we should indicate client
+                    CompleteConfigChangeNotify();
+                    }
+                //no else
+                }
+            //no else
+            }
+        //no else
+        }
+    //no else
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::SetEchoDte
+// This method sets DTE interface echo mode. This method is
+// called from COMM PEP.
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::SetEchoDte(
+    const TUint8 aEcho)
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_SETECHODTE, "CDpDataConfig::SetEchoDte" );
+    LOGM1("  CDpDataConfig::SetEchoDte, aEcho: %d", aEcho );
+
+    TInt ret( KErrNone );
+
+    switch ( aEcho )
+        {
+        case PEP_COMM_ECHO_ON:
+            {
+            iEchoDte = ETrue;
+            break;
+            }
+        case PEP_COMM_ECHO_OFF:
+            {
+            iEchoDte = EFalse;
+            break;
+            }
+        default:
+            {
+            LOG1("  ERROR, CDpDataConfig::SetEchoDte, Not supported echo value %d",
+                aEcho );
+            OstTraceExt1( TRACE_NORMAL, DUP1_CDPDATACONFIG_SETECHODTE, "ERROR, CDpDataConfig::SetEchoDte, Not supported echo value %hhu", aEcho );
+
+            ret = KErrNotSupported;
+            }
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::WaterMarkHighSize
+// Size of xx% of buffer size (typically 75% or 50% of buffer
+// size) e.g. if buffer size is 1024 and '%' is 50% returns
+// 512.
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::WaterMarkHighSize(
+    CDpDataBuffer& aBuffer )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_WATERMARKHIGHSIZE, "CDpDataConfig::WaterMarkHighSize" );
+    LOGM(" CDpDataConfig::WaterMarkHighSize");
+
+    return ( ( aBuffer.Size() * KDpFlowCtrlWaterMarkHighProsOfBuff ) / 100 );
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::WaterMarkLowSize
+// Size of x% of buffer size (typically 25% of buffer size).
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::WaterMarkLowSize(
+    CDpDataBuffer& aBuffer )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_WATERMARKLOWSIZE, "CDpDataConfig::WaterMarkLowSize" );
+    LOGM(" CDpDataConfig::WaterMarkLowSize");
+
+    return ( ( aBuffer.Size() * KDpFlowCtrlWaterMarkLowProsOfBuff ) / 100 );
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::IsLineFail
+// True if there is line fail. i.e. Client has configured
+// some signal example CTS --> KConfigFailCTS. Now when CTS
+// goes down it is a line fail.
+// ---------------------------------------------------------
+//
+TBool CDpDataConfig::IsLineFail(
+    TCommRole aRole ) const
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_ISLINEFAIL, "CDpDataConfig::IsLineFail" );
+    LOGM(" CDpDataConfig::IsLineFail");
+
+    TBool ret( EFalse );
+
+    if ( ECommRoleDTE == aRole )
+        {
+        if ( ( !( iSignals & KSignalDSR ) &&
+                ( iConfig.iHandshake & KConfigFailDSR ) ) ||
+            ( !( iSignals & KSignalDCD ) &&
+                ( iConfig.iHandshake & KConfigFailDCD ) ) )
+            {
+            ret = ETrue;
+            }
+        //no else
+        }
+    else
+        {
+        if ( ( !( iSignals & KSignalRTS ) &&
+                ( iConfig.iHandshake & KConfigFailRTS ) ) ||
+            ( !( iSignals & KSignalDTR ) &&
+                ( iConfig.iHandshake & KConfigFailDTR ) ) )
+            {
+            ret = ETrue;
+            }
+        //no else
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::Terminator
+// This method gets DTE interface terminator character.
+// ---------------------------------------------------------
+//
+TText8 CDpDataConfig::Terminator(
+    const TUint aIndex )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_TERMINATOR, "CDpDataConfig::Terminator" );
+    LOGM(" CDpDataConfig::Terminator");
+
+    return iConfig.iTerminator[aIndex];
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::Rate
+// Solves out the bit rate
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::Rate(
+    TCommConfigV01& aConfig,
+    TUint8& aRate)
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_RATE, "CDpDataConfig::Rate" );
+    OstTraceExt1( TRACE_NORMAL, DUP1_CDPDATACONFIG_RATE, "CDpDataConfig::Rate, Config rate: %hhu", aRate );
+
+    LOGM1(" CDpDataConfig::Rate, Config rate: %d.", aRate );
+
+    TInt ret( KErrNone );
+
+    switch ( aConfig.iRate )
+        {
+        case EBps2400:
+            {
+            aRate = EPEP_COMM_RATE_2400;
+            break;
+            }
+        case EBps4800:
+            {
+            aRate = EPEP_COMM_RATE_4800;
+            break;
+            }
+        case EBps9600:
+            {
+            aRate = EPEP_COMM_RATE_9600;
+            break;
+            }
+        case EBps19200:
+            {
+            aRate = EPEP_COMM_RATE_19200;
+            break;
+            }
+        case EBps38400:
+            {
+            aRate = EPEP_COMM_RATE_38400;
+            break;
+            }
+        case EBps57600:
+            {
+            aRate = EPEP_COMM_RATE_57600;
+            break;
+            }
+        case EBps115200:
+            {
+            aRate = EPEP_COMM_RATE_115200;
+            break;
+            }
+        default:
+            {
+            LOG1("  ERROR, CDpDataConfig::Rate, Unsupported rate value: %d.",
+                aRate );
+            OstTraceExt1( TRACE_NORMAL, DUP2_CDPDATACONFIG_RATE, "CDpDataConfig:: ERROR, Unsupported rate value:%hhu", aRate );
+
+            ret = KErrNotSupported;
+            }
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::DataBits
+// Solves out data bits.
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::DataBits(
+    TCommConfigV01& aConfig,
+    TUint8& aDataBits)
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_DATABITS, "CDpDataConfig::DataBits" );
+    OstTraceExt1( TRACE_NORMAL, DUP1_CDPDATACONFIG_DATABITS, "CDpDataConfig::DataBits: %hhu in DataConfig::DataBits", aDataBits );
+
+    LOGM(" CDpDataConfig::DataBits");
+    LOGM1("  DataBits: %d in DataConfig::DataBits.", aDataBits );
+
+    TInt ret( KErrNone );
+
+    switch ( aConfig.iDataBits )
+        {
+        case EData7:
+            {
+            aDataBits = PEP_COMM_DATA_BITS_7;
+            break;
+            }
+        case EData8:
+            {
+            aDataBits = PEP_COMM_DATA_BITS_8;
+            break;
+            }
+        default:
+            {
+            LOG1("  ERROR, CDpDataConfig::DataBits, Unsupported DataBits: %d.",
+                aDataBits);
+            OstTraceExt1( TRACE_NORMAL, DUP2_CDPDATACONFIG_DATABITS, "CDpDataConfig:: ERROR, Unsupported DataBits: %hhu", aDataBits );
+
+            ret =KErrNotSupported;
+            }
+         }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::StopBits
+// Solves out the stop bits
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::StopBits(
+    TCommConfigV01& aConfig,
+    TUint8& aStopBits)
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_STOPBITS, "CDpDataConfig::StopBits" );
+    OstTraceExt1( TRACE_NORMAL, DUP2_CDPDATACONFIG_STOPBITS, "CDpDataConfig::StopBits: %hhu", aStopBits );
+
+    LOGM1(" CDpDataConfig::StopBits, StopBits: %d.", aStopBits );
+
+    TInt ret( KErrNone );
+
+    switch ( aConfig.iStopBits )
+        {
+        case EStop1:
+            {
+            aStopBits = PEP_COMM_STOP_BITS_1;
+            break;
+            }
+        case EStop2:
+            {
+            aStopBits = PEP_COMM_STOP_BITS_2;
+            break;
+            }
+        default:
+            {
+            LOG1("  ERROR, CDpDataConfig::StopBits, Unsupported StopBits: %d.",
+                aStopBits );
+            OstTraceExt1( TRACE_NORMAL, DUP1_CDPDATACONFIG_STOPBITS, "ERROR, CDpDataConfig::StopBits, Unsupported StopBits: %hhu", aStopBits );
+
+            ret = KErrNotSupported;
+            }
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::Parity
+// Solves out the parity bit
+// ---------------------------------------------------------
+//
+TInt CDpDataConfig::Parity(
+    TCommConfigV01& aConfig,
+    TUint8& aParity )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_PARITY, "CDpDataConfig::Parity" );
+    OstTraceExt1( TRACE_NORMAL, DUP1_CDPDATACONFIG_PARITY, "CDpDataConfig::Parity: %hhu", aParity );
+
+    LOGM1(" CDpDataConfig::Parity, Parity: %d.", aParity );
+
+    TInt ret( KErrNone );
+
+    switch ( aConfig.iParity )
+        {
+        case EParityNone:
+            {
+            aParity = PEP_COMM_PARITY_NONE;
+            break;
+            }
+        case EParityEven:
+            {
+            aParity = PEP_COMM_PARITY_EVEN;
+            break;
+            }
+        case EParityOdd:
+            {
+            aParity = PEP_COMM_PARITY_ODD;
+            break;
+            }
+        case EParityMark:
+            {
+            aParity = PEP_COMM_PARITY_MARK;
+            break;
+            }
+        case EParitySpace:
+            {
+            aParity = PEP_COMM_PARITY_SPACE;
+            break;
+            }
+        default:
+            {
+            LOG1("  ERROR, CDpDataConfig::Parity, Unsupported parity: %d.",
+                aParity );
+            OstTraceExt1( TRACE_NORMAL, DUP2_CDPDATACONFIG_PARITY, "ERROR, CDpDataConfig::Parity, Unsupported parity: %hhu", aParity );
+
+            ret = KErrNotSupported;
+            }
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::HandleDteSignalMapping
+// Maps the DTE type signals.
+// ---------------------------------------------------------
+//
+void CDpDataConfig::HandleDteSignalMapping(
+    const TUint aSignals,
+    TDes8& aData )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_HANDLEDTESIGNALMAPPING, "CDpDataConfig::HandleDteSignalMapping" );
+    OstTrace1( TRACE_NORMAL, DUP1_CDPDATACONFIG_HANDLEDTESIGNALMAPPING, "CDpDataConfig:: aSignals: %u\n", aSignals );
+    OstTrace1( TRACE_NORMAL, DUP2_CDPDATACONFIG_HANDLEDTESIGNALMAPPING, "CDpDataConfig:: aHandshake: %u\n", iConfig.iHandshake );
+
+    LOGM(" CDpDataConfig::HandleDteSignalMapping");
+    LOG1("  HandleDteSignalsMapping - aSignals: %x\n", aSignals );
+    LOG1("  HandleDteSignalsMapping - aHandshake: %x\n", iConfig.iHandshake );
+
+    TUint8 state( 0 );
+
+    if ( ( iConfig.iHandshake & KConfigFreeDTR ) )
+        {
+        LOG("  CDpDataConfig::HandleDteSignalMapping, iConfig.iHandshake & KConfigFreeDTR == TRUE");
+        OstTrace0( TRACE_NORMAL, DUP3_CDPDATACONFIG_HANDLEDTESIGNALMAPPING, "CDpDataConfig:: iConfig.iHandshake and KConfigFreeDTR == TRUE" );
+
+        // This is little bit simplified. Win2000 doesn't send DTR signal properly
+        if ( ( aSignals & KDTRChanged ) )
+            {
+            if ( aSignals & KSignalDTR )
+                {
+                LOG("  DTR signal ON");
+                OstTrace0( TRACE_NORMAL, DUP4_CDPDATACONFIG_HANDLEDTESIGNALMAPPING, "CDpDataConfig:: DTR signal ON" );
+
+                state = PEP_COMM_SIGNAL_DTR_ON;
+                }
+            else
+                {
+                LOG("  DTR signal OFF");
+                OstTrace0( TRACE_NORMAL, DUP5_CDPDATACONFIG_HANDLEDTESIGNALMAPPING, "CDpDataConfig:: DTR signal OFF" );
+
+                state = PEP_COMM_SIGNAL_DTR_OFF;
+                }
+            }
+        }
+    //no else
+
+    aData.Append( state );
+    }
+
+// ---------------------------------------------------------
+// CDpDataConfig::HandleDceSignalMapping
+// Maps the DCE type signals
+// ---------------------------------------------------------
+//
+void CDpDataConfig::HandleDceSignalMapping(
+    const TUint aSignals,
+    TDes8& aData )
+    {
+    OstTrace0( TRACE_NORMAL, CDPDATACONFIG_HANDLEDCESIGNALMAPPING, "CDpDataConfig::HandleDceSignalMapping" );
+    LOGM(" CDpDataConfig::HandleDceSignalMapping");
+
+    TUint8 state( 0 );
+
+    if ( ( iConfig.iHandshake & KConfigFreeDSR ) )
+        {
+        if ( ( ( aSignals & KSignalDSR) != (iSignals & KSignalDSR) ) ||
+            ( ( aSignals & KDSRChanged ) && ( aSignals & KSignalDSR ) ) )
+            {
+            if ( aSignals & KSignalDSR )
+                {
+                state |= PEP_COMM_SIGNAL_DSR_ON;
+                }
+            else
+                {
+                state |= PEP_COMM_SIGNAL_DSR_OFF;
+                }
+            }
+       //no else
+       }
+    //no else
+
+    if ( ( iConfig.iHandshake & KConfigFreeDCD ) )
+        {
+        if ( ( ( aSignals & KSignalDCD ) != (iSignals & KSignalDCD) ) ||
+            ( ( aSignals & KDCDChanged ) && ( aSignals & KSignalDCD) ) )
+            {
+            if ( aSignals & KSignalDCD )
+                {
+                state |= PEP_COMM_SIGNAL_DCD_ON;
+                }
+            else
+                {
+                state |= PEP_COMM_SIGNAL_DCD_OFF;
+                }
+            }
+        //no else
+        }
+    //no else
+
+    if ( ( iConfig.iHandshake & KConfigFreeRI ) )
+        {
+        if ( ( ( aSignals & KSignalRNG ) != ( iSignals & KSignalRNG ) ) ||
+            ( ( aSignals & KRNGChanged ) && ( aSignals & KSignalRNG) ) )
+            {
+            if ( aSignals & KSignalRNG )
+                {
+                state |= PEP_COMM_SIGNAL_RI_ON;
+                }
+            else
+                {
+                state |= PEP_COMM_SIGNAL_RI_OFF;
+                }
+            }
+        //no else
+        }
+    //no else
+
+    aData.Append( state );
+    }
+
+//  OTHER EXPORTED FUNCTIONS
+//  none
+
+//  End of File