--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/callcontinuity/nsmldmvccadapter/src/nsmldmvccadapter.cpp Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,1478 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Implementation file for nsmldmvccadapter
+*
+*/
+
+
+#include <e32std.h>
+#include <escapeutils.h>
+#include <spentry.h>
+#include <spproperty.h>
+#include <nsmldmuri.h>
+#include <crcseprofileentry.h>
+#include <crcseprofileregistry.h>
+
+#include "nsmldmvccadapter.h"
+#include "vccspsettings.h"
+#include "vccmiscutils.h"
+#include "rubydebug.h"
+
+
+const TInt KNSmlDMVCC_DefaultResultSize = 255;
+
+/** VCC DDF keywords */
+_LIT8( KNSmlDMVCC_DDFVersion, "1.0" );
+_LIT8( KNSmlDMVCC_Node, "VCC001" );
+_LIT( KNSmlDMVCC_ServiceName, "VCC" );
+
+/** VCC */
+_LIT8( KNSmlDMVCC_Name, "Name" );
+_LIT8( KNSmlDMVCC_VDI, "VDI" );
+_LIT8( KNSmlDMVCC_VDN, "VDN" );
+_LIT8( KNSmlDMVCC_PreferredDomain, "Preferred Domain" );
+_LIT8( KNSmlDMVCC_ImmediateDT, "Immediate DT" );
+_LIT8( KNSmlDMVCC_DTCsToIM, "DT CS-to-IM CN direction" );
+_LIT8( KNSmlDMVCC_DTIMToCs, "DT IM CN-to-CS direction" );
+_LIT8( KNSmlDMVCC_DTHeldWaitingCalls, "DT in held_waiting calls" );
+
+_LIT8( KNSmlDMVCC_WlanHOTreshold, "WLAN HO Treshold" );
+_LIT8( KNSmlDMVCC_WlanHOHysteresis, "WLAN HO Hysteresis" );
+_LIT8( KNSmlDMVCC_WlanHysteresisTimerLow, "WLAN Hysteresis Timer Low" );
+_LIT8( KNSmlDMVCC_WlanHysteresisTimerHigh, "WLAN Hysteresis Timer High" );
+_LIT8( KNSmlDMVCC_CSHOTreshold, "CS HO Treshold" );
+_LIT8( KNSmlDMVCC_CSHOHysteresis, "CS HO Hysteresis" );
+_LIT8( KNSmlDMVCC_CSHysteresisTimerLow, "CS Hysteresis Timer Low" );
+_LIT8( KNSmlDMVCC_CSHysteresisTimerHigh, "CS Hysteresis Timer High" );
+_LIT8( KNSmlDMVCC_VoipServiceId, "VoIP" );
+_LIT8( KNSmlDMVCC_DtAllowedWhenCsOriginated,"DT Allowed When CS Originated" );
+
+_LIT8( KNSmlDMVCC_NodeExp, "Main node for VCC settings" );
+_LIT8( KNSmlDMVCC_NameExp, "Name for the Communication Continuity settings" );
+_LIT8( KNSmlDMVCC_VDIExp, "VCC Transfer URI " );
+_LIT8( KNSmlDMVCC_VDNExp, "VCC Transfer Number" );
+_LIT8( KNSmlDMVCC_PreferredDomainExp, "Preferred domain for UE originated calls/sessions" );
+_LIT8( KNSmlDMVCC_ImmediateDTExp, "Initiate a VCC DT immediately when domain available or not" );
+_LIT8( KNSmlDMVCC_DTCsToIMExp, "DT from CS domain to PS is restricted or not" );
+_LIT8( KNSmlDMVCC_DTIMToCsExp, "DT from PS domain to CS is restricted or not" );
+_LIT8( KNSmlDMVCC_DTHeldWaitingCallsExp, "DT restricted during active and a held/waiting call/session" );
+_LIT8( KNSmlDMVCC_WlanHOTresholdExp, "Handover signal strength treshold value for WLAN" );
+_LIT8( KNSmlDMVCC_WlanHOHysteresisExp, "Handover hysteresis value for WLAN" );
+_LIT8( KNSmlDMVCC_WlanHysteresisTimerLowExp,"Handover hysteresis timer value for WLAN used below treshold" );
+_LIT8( KNSmlDMVCC_WlanHysteresisTimerHighExp, "Handover hysteresis timer value for WLAN used above treshold" );
+_LIT8( KNSmlDMVCC_CSHOTresholdExp, "Handover signal strength treshold value for CS" );
+_LIT8( KNSmlDMVCC_CSHOHysteresisExp, "Handover hysteresis value for CS" );
+_LIT8( KNSmlDMVCC_CSHysteresisTimerLowExp, "Handover hysteresis timer value for CS used below treshold" );
+_LIT8( KNSmlDMVCC_CSHysteresisTimerHighExp, "Handover hysteresis timer value for CS used above treshold" );
+_LIT8( KNSmlDMVCC_VoipServiceIdExp, "VoIP Service Id to be associated with VCC" );
+_LIT8( KNSmlDMVCC_DmToConRef, "ToConRef" );
+_LIT8( KNSmlDMVCC_DmConRef, "ConRef" );
+_LIT8( KNSmlDMVCC_DmToConRefExp, "Refers to a collection of connectivity definitions" );
+_LIT8( KNSmlDMVCC_DmConRefExp, "Indicates the linkage to connectivity parameters" );
+
+_LIT8( KNSmlDMVCC_DmVoipLinkPrefix, "./VoIP");
+_LIT8( KNSmlDMVCC_DmVoipId, "VoIPId");
+_LIT8( KNSmlDMVCC_DmVoip, "VoIP");
+_LIT( KVccServiceName, "VCC" );
+
+
+/** Others */
+_LIT8( KNSmlDMVCCTextPlain, "text/plain" );
+_LIT8( KNSmlDMVCCSeparator, "/" );
+_LIT( KNSmlDMVCCValueNullDesc, "" );
+_LIT( KNSmlDMVCCValueZero, "0" );
+
+const TInt KNSmlDMVCCSeparatorChar = '/';
+const TInt KNSmlDMVCCDefaultResultSize = 64;
+const TInt KNSmlDMVCCMaxResultLength = 256;
+const TInt KNSmlDMVCCMaxUriLength = 100;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ Constructor
+// ---------------------------------------------------------------------------
+//
+CNSmlDmVCCAdapter::CNSmlDmVCCAdapter( TAny* aEcomArguments )
+: CSmlDmAdapter( aEcomArguments )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::CNSmlDmVCCAdapter" );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Second phase constructor
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::ConstructL()
+ {
+ RUBY_DEBUG_BLOCKL( "CNSmlDmVCCAdapter::ConstructL" );
+ iVCCSettings = CVccSPSettings::NewL();
+ iVCCSettings->SetServiceNameL( KNSmlDMVCC_ServiceName );
+ iVCCSettings->ReadSettingsL( KVccServiceName );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor
+// ---------------------------------------------------------------------------
+//
+CNSmlDmVCCAdapter* CNSmlDmVCCAdapter::NewL( MSmlDmCallback* aDmCallback )
+ {
+ RUBY_DEBUG_BLOCKL( "CNSmlDmVCCAdapter::NewL" );
+ CNSmlDmVCCAdapter* self = CNSmlDmVCCAdapter::NewLC( aDmCallback );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor
+// ---------------------------------------------------------------------------
+//
+CNSmlDmVCCAdapter* CNSmlDmVCCAdapter::NewLC( MSmlDmCallback* aDmCallback )
+ {
+ RUBY_DEBUG0( "CNSmlDmVCCAdapter::NewLC --Start" );
+ CNSmlDmVCCAdapter* self = new( ELeave ) CNSmlDmVCCAdapter( aDmCallback );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ RUBY_DEBUG0( "CNSmlDmVCCAdapter::NewLC --End" );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CNSmlDmVCCAdapter::~CNSmlDmVCCAdapter()
+ {
+ RUBY_DEBUG0( "CNSmlDmVCCAdapter::~CNSmlDmVCCAdapter() - ENTER" );
+ delete iVCCSettings;
+ delete iTempBuf;
+ RUBY_DEBUG0( "CNSmlDmVCCAdapter::~CNSmlDmVCCAdapter() - EXIT" );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::DDFVersionL( CBufBase& aVersion )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::DDFVersionL" );
+ aVersion.InsertL( 0,KNSmlDMVCC_DDFVersion );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::DDFStructureL( MSmlDmDDFObject& aDDF )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::DDFStructureL" );
+
+ TSmlDmAccessTypes accessTypesGet;
+ accessTypesGet.SetGet();
+
+ TSmlDmAccessTypes accessTypesGetReplace;
+ accessTypesGetReplace.SetGet();
+ accessTypesGetReplace.SetReplace();
+
+
+ // Main node
+ MSmlDmDDFObject& vccNode = aDDF.AddChildObjectL( KNSmlDMVCC_Node );
+ vccNode.SetAccessTypesL( accessTypesGet );
+ vccNode.SetOccurenceL( MSmlDmDDFObject::EOneOrMore );
+ vccNode.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccNode.SetDFFormatL( MSmlDmDDFObject::ENode );
+ vccNode.SetDescriptionL( KNSmlDMVCC_NodeExp );
+
+ // Name leaf -read only
+ MSmlDmDDFObject& vccName = vccNode.AddChildObjectL( KNSmlDMVCC_Name );
+ vccName.SetAccessTypesL( accessTypesGet );
+ vccName.SetOccurenceL( MSmlDmDDFObject::EZeroOrMore );
+ vccName.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccName.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccName.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccName.SetDescriptionL( KNSmlDMVCC_NameExp );
+
+ // VDI leaf
+ MSmlDmDDFObject& vccVDI = vccNode.AddChildObjectL( KNSmlDMVCC_VDI );
+ vccVDI.SetAccessTypesL( accessTypesGetReplace );
+ vccVDI.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccVDI.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccVDI.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccVDI.SetDescriptionL( KNSmlDMVCC_VDIExp );
+
+ // VDN leaf
+ MSmlDmDDFObject& vccVDN = vccNode.AddChildObjectL( KNSmlDMVCC_VDN );
+ vccVDN.SetAccessTypesL( accessTypesGetReplace );
+ vccVDN.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccVDN.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccVDN.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccVDN.SetDescriptionL( KNSmlDMVCC_VDNExp );
+
+ // Preferred domain leaf
+ MSmlDmDDFObject& vccPD =
+ vccNode.AddChildObjectL( KNSmlDMVCC_PreferredDomain );
+ vccPD.SetAccessTypesL( accessTypesGetReplace );
+ vccPD.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccPD.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccPD.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccPD.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccPD.SetDescriptionL( KNSmlDMVCC_PreferredDomainExp );
+
+ // Immediate DT leaf
+ MSmlDmDDFObject& vccIDT = vccNode.AddChildObjectL( KNSmlDMVCC_ImmediateDT );
+ vccIDT.SetAccessTypesL( accessTypesGetReplace );
+ vccIDT.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccIDT.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccIDT.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccIDT.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccIDT.SetDescriptionL( KNSmlDMVCC_ImmediateDTExp );
+
+ // CS to PS leaf
+ MSmlDmDDFObject& vccDTCS = vccNode.AddChildObjectL( KNSmlDMVCC_DTCsToIM );
+ vccDTCS.SetAccessTypesL( accessTypesGetReplace );
+ vccDTCS.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccDTCS.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccDTCS.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccDTCS.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccDTCS.SetDescriptionL( KNSmlDMVCC_DTCsToIMExp );
+
+ // PS to CS leaf
+ MSmlDmDDFObject& vccDTIM = vccNode.AddChildObjectL( KNSmlDMVCC_DTIMToCs );
+ vccDTIM.SetAccessTypesL( accessTypesGetReplace );
+ vccDTIM.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccDTIM.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccDTIM.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccDTIM.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccDTIM.SetDescriptionL( KNSmlDMVCC_DTIMToCsExp );
+
+ // DT restricted while held or waiting calls leaf
+ MSmlDmDDFObject& vccDTHeld =
+ vccNode.AddChildObjectL( KNSmlDMVCC_DTHeldWaitingCalls );
+ vccDTHeld.SetAccessTypesL( accessTypesGetReplace );
+ vccDTHeld.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccDTHeld.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccDTHeld.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccDTHeld.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccDTHeld.SetDescriptionL( KNSmlDMVCC_DTHeldWaitingCallsExp );
+
+ // DT Allowed when CS Originated Call
+ MSmlDmDDFObject& vccDTAllowedWhenCsOrig =
+ vccNode.AddChildObjectL( KNSmlDMVCC_DtAllowedWhenCsOriginated );
+ vccDTAllowedWhenCsOrig.SetAccessTypesL( accessTypesGetReplace );
+ vccDTAllowedWhenCsOrig.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccDTAllowedWhenCsOrig.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccDTAllowedWhenCsOrig.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccDTAllowedWhenCsOrig.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccDTAllowedWhenCsOrig.SetDescriptionL( KNSmlDMVCC_DtAllowedWhenCsOriginated );
+
+
+ // WLAN HO treshold leaf
+ MSmlDmDDFObject& vccWLANHotreshold =
+ vccNode.AddChildObjectL( KNSmlDMVCC_WlanHOTreshold );
+ vccWLANHotreshold.SetAccessTypesL( accessTypesGetReplace );
+ vccWLANHotreshold.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccWLANHotreshold.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccWLANHotreshold.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccWLANHotreshold.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccWLANHotreshold.SetDescriptionL( KNSmlDMVCC_WlanHOTresholdExp );
+
+ // WLAN HO hysteresis leaf
+ MSmlDmDDFObject& vccWLANHoHysteresis =
+ vccNode.AddChildObjectL( KNSmlDMVCC_WlanHOHysteresis );
+ vccWLANHoHysteresis.SetAccessTypesL( accessTypesGetReplace );
+ vccWLANHoHysteresis.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccWLANHoHysteresis.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccWLANHoHysteresis.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccWLANHoHysteresis.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccWLANHoHysteresis.SetDescriptionL( KNSmlDMVCC_WlanHOHysteresisExp );
+
+ // WLAN HO hysteresis timer low leaf
+ MSmlDmDDFObject& vccWLANHoHysteresisTimerLow =
+ vccNode.AddChildObjectL( KNSmlDMVCC_WlanHysteresisTimerLow );
+ vccWLANHoHysteresisTimerLow.SetAccessTypesL( accessTypesGetReplace );
+ vccWLANHoHysteresisTimerLow.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccWLANHoHysteresisTimerLow.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccWLANHoHysteresisTimerLow.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccWLANHoHysteresisTimerLow.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccWLANHoHysteresisTimerLow.SetDescriptionL( KNSmlDMVCC_WlanHysteresisTimerLowExp );
+
+ // WLAN HO hysteresis timer high leaf
+ MSmlDmDDFObject& vccWLANHoHysteresisTimerHigh =
+ vccNode.AddChildObjectL( KNSmlDMVCC_WlanHysteresisTimerHigh );
+ vccWLANHoHysteresisTimerHigh.SetAccessTypesL( accessTypesGetReplace );
+ vccWLANHoHysteresisTimerHigh.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccWLANHoHysteresisTimerHigh.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccWLANHoHysteresisTimerHigh.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccWLANHoHysteresisTimerHigh.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccWLANHoHysteresisTimerHigh.SetDescriptionL( KNSmlDMVCC_WlanHysteresisTimerHighExp );
+
+ // CS HO treshold leaf
+ MSmlDmDDFObject& vccCSHotreshold =
+ vccNode.AddChildObjectL( KNSmlDMVCC_CSHOTreshold );
+ vccCSHotreshold.SetAccessTypesL( accessTypesGetReplace );
+ vccCSHotreshold.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccCSHotreshold.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccCSHotreshold.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccCSHotreshold.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccCSHotreshold.SetDescriptionL( KNSmlDMVCC_CSHOTresholdExp );
+
+ // CS HO hysteresis leaf
+ MSmlDmDDFObject& vccCSHoHysteresis =
+ vccNode.AddChildObjectL( KNSmlDMVCC_CSHOHysteresis );
+ vccCSHoHysteresis.SetAccessTypesL( accessTypesGetReplace );
+ vccCSHoHysteresis.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccCSHoHysteresis.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccCSHoHysteresis.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccCSHoHysteresis.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccCSHoHysteresis.SetDescriptionL( KNSmlDMVCC_CSHOHysteresisExp );
+
+ // CS HO hysteresis timer low leaf
+ MSmlDmDDFObject& vccCSHoHysteresisTimerLow =
+ vccNode.AddChildObjectL( KNSmlDMVCC_CSHysteresisTimerLow );
+ vccCSHoHysteresisTimerLow.SetAccessTypesL( accessTypesGetReplace );
+ vccCSHoHysteresisTimerLow.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccCSHoHysteresisTimerLow.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccCSHoHysteresisTimerLow.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccCSHoHysteresisTimerLow.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccCSHoHysteresisTimerLow.SetDescriptionL( KNSmlDMVCC_CSHysteresisTimerLowExp );
+
+ // CS HO hysteresis timer high leaf
+ MSmlDmDDFObject& vccCSHoHysteresisTimerHigh =
+ vccNode.AddChildObjectL( KNSmlDMVCC_CSHysteresisTimerHigh );
+ vccCSHoHysteresisTimerHigh.SetAccessTypesL( accessTypesGetReplace );
+ vccCSHoHysteresisTimerHigh.SetOccurenceL( MSmlDmDDFObject::EOne );
+ vccCSHoHysteresisTimerHigh.SetScopeL( MSmlDmDDFObject::EPermanent );
+ vccCSHoHysteresisTimerHigh.SetDFFormatL( MSmlDmDDFObject::EChr );
+ vccCSHoHysteresisTimerHigh.AddDFTypeMimeTypeL( KNSmlDMVCCTextPlain );
+ vccCSHoHysteresisTimerHigh.SetDescriptionL( KNSmlDMVCC_CSHysteresisTimerHighExp );
+
+ // ./VCC001/ToConRef/
+
+ MSmlDmDDFObject& toConRefNode = vccNode.AddChildObjectL(KNSmlDMVCC_DmToConRef);
+ toConRefNode.SetAccessTypesL( accessTypesGet );
+ toConRefNode.SetOccurenceL( MSmlDmDDFObject::EOne );
+ toConRefNode.SetScopeL( MSmlDmDDFObject::EDynamic );
+ toConRefNode.SetDFFormatL( MSmlDmDDFObject::ENode );
+ toConRefNode.SetDescriptionL( KNSmlDMVCC_DmToConRefExp );
+
+ // ./VCC001/ToConRef/VoIP
+
+ MSmlDmDDFObject& voipNode = toConRefNode.AddChildObjectL( KNSmlDMVCC_VoipServiceId );
+ voipNode.SetAccessTypesL( accessTypesGet );
+ voipNode.SetOccurenceL( MSmlDmDDFObject::EOne );
+ voipNode.SetScopeL( MSmlDmDDFObject::EDynamic );
+ voipNode.SetDFFormatL( MSmlDmDDFObject::ENode );
+ voipNode.SetDescriptionL( KNSmlDMVCC_VoipServiceIdExp );
+
+ // ./VCC001/ToConRef/VoIP/ConRef
+
+ MSmlDmDDFObject& conRefVoipNode = voipNode.AddChildObjectL(KNSmlDMVCC_DmConRef);
+ conRefVoipNode.SetAccessTypesL( accessTypesGetReplace );
+ conRefVoipNode.SetOccurenceL( MSmlDmDDFObject::EOne );
+ conRefVoipNode.SetScopeL( MSmlDmDDFObject::EDynamic );
+ conRefVoipNode.SetDFFormatL( MSmlDmDDFObject::EChr );
+ conRefVoipNode.SetDescriptionL( KNSmlDMVCC_DmConRefExp );
+
+ // !NOTE! Ext node not inserted yet
+ }
+
+// ---------------------------------------------------------------------------
+// Note: HBufC* buf points to member iTempBuf that is deleted every time
+// ConvertToUnicodeL is called and in class' destructor.
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::UpdateLeafObjectL( const TDesC8& aURI,
+ const TDesC8& /*aLUID*/, const TDesC8& aObject,
+ const TDesC8& /*aType*/, TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::UpdateLeafObjectL" );
+ RUBY_DEBUG0( "ReadSPSettings" );
+ iVCCSettings->ReadSettingsL( KVccServiceName );
+ CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk;
+ HBufC* buf = ConvertToUnicodeL( aObject );
+
+ // Find the last leaf in URI
+ TPtrC8 uriSeg( LastURISeg( aURI ) );
+
+ if ( KNSmlDMVCC_Name() == uriSeg )
+ {
+ // Don't do anything at the moment
+ //iVCCSettings->SetNameL( aObject );
+ }
+ else if ( KNSmlDMVCC_VDI() == uriSeg )
+ {
+ if ( KErrNone != iVCCSettings->SetVdiL( buf->Des() ) )
+ {
+ retValue = CSmlDmAdapter::EInvalidObject;
+ }
+ }
+ else if ( KNSmlDMVCC_VDN() == uriSeg )
+ {
+ if ( !( iVCCSettings->SetVdnL( buf->Des() ) ) )
+ {
+ retValue = CSmlDmAdapter::EInvalidObject;
+ }
+ }
+ else if ( KNSmlDMVCC_PreferredDomain() == uriSeg )
+ {
+ TInt value = iVCCSettings->ConvertToIntL( buf->Des() );
+
+ switch ( value )
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ iVCCSettings->SetPreferredDomainL( buf->Des() );
+ break;
+ default:
+ retValue = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+ else if ( KNSmlDMVCC_ImmediateDT() == uriSeg )
+ {
+ TInt value = iVCCSettings->ConvertToIntL( buf->Des() );
+
+ switch ( value )
+ {
+ case 0:
+ case 1:
+ iVCCSettings->SetImmediateDtL( buf->Des() );
+ break;
+ default:
+ retValue = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+ else if ( KNSmlDMVCC_DTCsToIM() == uriSeg )
+ {
+ TInt value = iVCCSettings->ConvertToIntL( buf->Des() );
+
+ switch ( value )
+ {
+ case 0:
+ case 1:
+ iVCCSettings->SetDtCsToPsAllowedL( buf->Des() );
+ break;
+ default:
+ retValue = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+ else if ( KNSmlDMVCC_DTIMToCs() == uriSeg )
+ {
+ TInt value = iVCCSettings->ConvertToIntL( buf->Des() );
+
+ switch ( value )
+ {
+ case 0:
+ case 1:
+ iVCCSettings->SetDtPsToCsAllowedL( buf->Des() );
+ break;
+ default:
+ retValue = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+ else if ( KNSmlDMVCC_DtAllowedWhenCsOriginated() == uriSeg )
+ {
+ TInt value = iVCCSettings->ConvertToIntL( buf->Des() );
+
+ switch ( value )
+ {
+ case 0:
+ case 1:
+ iVCCSettings->SetDtAllowedWhenCsOriginated( buf->Des() );
+ break;
+ default:
+ retValue = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+
+ else if ( KNSmlDMVCC_DTHeldWaitingCalls() == uriSeg )
+ {
+ TInt value = iVCCSettings->ConvertToIntL( buf->Des() );
+
+ switch ( value )
+ {
+ case 0:
+ case 1:
+ iVCCSettings->SetDtHeldWaitingCallsAllowedL( buf->Des() );
+ break;
+ default:
+ retValue = CSmlDmAdapter::EInvalidObject;
+ break;
+ }
+ }
+
+ else if ( KNSmlDMVCC_WlanHOTreshold() == uriSeg )
+ {
+ iVCCSettings->SetDtWlanHoTresholdL( buf->Des() );
+ }
+ else if ( KNSmlDMVCC_WlanHOHysteresis() == uriSeg )
+ {
+ iVCCSettings->SetDtWlanHoHysteresisL( buf->Des() );
+ }
+ else if ( KNSmlDMVCC_WlanHysteresisTimerLow() == uriSeg )
+ {
+ iVCCSettings->SetDtWlanHoHysteresisTimerLowL( buf->Des() );
+ }
+ else if ( KNSmlDMVCC_WlanHysteresisTimerHigh() == uriSeg )
+ {
+ iVCCSettings->SetDtWlanHoHysteresisTimerHighL( buf->Des() );
+ }
+
+ else if ( KNSmlDMVCC_CSHOTreshold() == uriSeg )
+ {
+ iVCCSettings->SetDtCsHoTresholdL( buf->Des() );
+ }
+ else if ( KNSmlDMVCC_CSHOHysteresis() == uriSeg )
+ {
+ iVCCSettings->SetDtCsHoHysteresisL( buf->Des() );
+ }
+ else if ( KNSmlDMVCC_CSHysteresisTimerLow() == uriSeg )
+ {
+ iVCCSettings->SetDtCsHoHysteresisTimerLowL( buf->Des() );
+ }
+ else if ( KNSmlDMVCC_CSHysteresisTimerHigh() == uriSeg )
+ {
+ iVCCSettings->SetDtCsHoHysteresisTimerHighL( buf->Des() );
+ }
+ else if ( KNSmlDMVCC_DmConRef() == uriSeg )
+ {
+ retValue = UpdateVoipConRefL(aURI, aObject);
+ }
+
+ else
+ { // No recognized leaf object found
+ retValue = CSmlDmAdapter::EInvalidObject;
+ }
+
+ if ( CSmlDmAdapter::EOk == retValue )
+ {
+ RUBY_DEBUG0( "StoreSPSettings" );
+ // Set operation successfull, store changes into SP Settings table
+ iVCCSettings->StoreL();
+ }
+
+ Callback().SetStatusL( aStatusRef, retValue );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::UpdateLeafObjectL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/,
+ RWriteStream*& /*aStream*/, const TDesC8& /*aType*/,
+ TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::UpdateLeafObjectL -stream" );
+ Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::DeleteObjectL( const TDesC8& aURI,
+ const TDesC8& /*aLUID*/,
+ TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::DeleteObjectL" );
+ iVCCSettings->ReadSettingsL( KVccServiceName );
+
+ CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk;
+ TPtrC8 uriSeg( LastURISeg( aURI ) );
+
+ if ( KNSmlDMVCC_Name() == uriSeg )
+ {
+ // Don't do anything at the moment
+ //iVCCSettings->SetNameL( KNSmlDMVCCValueNullDesc );
+ }
+ else if ( KNSmlDMVCC_VDI() == uriSeg )
+ {
+ iVCCSettings->SetVdiL( KNSmlDMVCCValueNullDesc );
+ }
+ else if ( KNSmlDMVCC_VDN() == uriSeg )
+ {
+ iVCCSettings->SetVdnL( KNSmlDMVCCValueNullDesc );
+ }
+ else if ( KNSmlDMVCC_PreferredDomain() == uriSeg )
+ {
+ iVCCSettings->SetPreferredDomainL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_ImmediateDT() == uriSeg )
+ {
+ iVCCSettings->SetImmediateDtL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_DTCsToIM() == uriSeg )
+ {
+ iVCCSettings->SetDtCsToPsAllowedL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_DTIMToCs() == uriSeg )
+ {
+ iVCCSettings->SetDtPsToCsAllowedL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_DTHeldWaitingCalls() == uriSeg )
+ {
+ iVCCSettings->SetDtHeldWaitingCallsAllowedL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_WlanHOTreshold() == uriSeg )
+ {
+ iVCCSettings->SetDtWlanHoTresholdL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_WlanHOHysteresis() == uriSeg )
+ {
+ iVCCSettings->SetDtWlanHoHysteresisL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_WlanHysteresisTimerLow() == uriSeg )
+ {
+ iVCCSettings->SetDtWlanHoHysteresisTimerLowL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_WlanHysteresisTimerHigh() == uriSeg )
+ {
+ iVCCSettings->SetDtWlanHoHysteresisTimerHighL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_CSHOTreshold() == uriSeg )
+ {
+ iVCCSettings->SetDtCsHoTresholdL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_CSHOHysteresis() == uriSeg )
+ {
+ iVCCSettings->SetDtCsHoHysteresisL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_CSHysteresisTimerLow() == uriSeg )
+ {
+ iVCCSettings->SetDtCsHoHysteresisTimerLowL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_CSHysteresisTimerHigh() == uriSeg )
+ {
+ iVCCSettings->SetDtCsHoHysteresisTimerHighL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_DmConRef() == uriSeg )
+ {
+ iVCCSettings->SetVoipServiceIdL( KNSmlDMVCCValueZero );
+ }
+ else if ( KNSmlDMVCC_DtAllowedWhenCsOriginated() == uriSeg )
+ {
+ iVCCSettings->SetDtAllowedWhenCsOriginated( KNSmlDMVCCValueZero );
+ }
+ else
+ {
+ retValue = CSmlDmAdapter::EInvalidObject;
+ }
+
+ if ( CSmlDmAdapter::EOk == retValue )
+ {
+ iVCCSettings->StoreL();
+ }
+
+ Callback().SetStatusL( aStatusRef, retValue );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::FetchLeafObjectL( const TDesC8& aURI,
+ const TDesC8& /*aLUID*/, const TDesC8& aType,
+ TInt aResultsRef, TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::FetchLeafObjectL" );
+
+ CBufBase* result = CBufFlat::NewL( KNSmlDMVCCDefaultResultSize );
+ CleanupStack::PushL( result );
+ CSmlDmAdapter::TError status = FetchObjectL( aURI, *result );
+
+ if ( status == CSmlDmAdapter::EOk )
+ {
+ Callback().SetResultsL( aResultsRef, *result, aType );
+ }
+
+ Callback().SetStatusL( aStatusRef, status );
+
+ CleanupStack::PopAndDestroy( result );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::FetchLeafObjectSizeL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/, const TDesC8& /*aType*/,
+ TInt /*aResultsRef*/, TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::FetchLeafObjectSizeL" );
+
+ // Not supported
+ Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::ChildURIListL( const TDesC8& aURI,
+ const TDesC8& /*aLUID*/,
+ const CArrayFix<TSmlDmMappingInfo>& /*aPreviousURISegmentList*/,
+ TInt aResultsRef, TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::ChildURIListL" );
+
+ CSmlDmAdapter::TError status = CSmlDmAdapter::EError;
+
+ CBufBase *currentURISegmentList = CBufFlat::NewL( KNSmlDMVCCDefaultResultSize );
+ CleanupStack::PushL( currentURISegmentList );
+ TBuf8<KNSmlDMVCCMaxUriLength> mappingInfo( KNullDesC8 );
+ TBuf8<KNSmlDMVCCMaxUriLength> uri = aURI;
+ TBuf8<KSmlMaxURISegLen> segmentName;
+
+ if ( KNSmlDMVCC_Node() == LastURISeg( aURI ) )
+ {
+ // Name
+ segmentName.Copy( KNSmlDMVCC_Name );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+ // VDI
+ segmentName.Copy( KNSmlDMVCC_VDI );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+ // VDN
+ segmentName.Copy( KNSmlDMVCC_VDN );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+ // Preferred domain
+ segmentName.Copy( KNSmlDMVCC_PreferredDomain );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+ // Immediate dt
+ segmentName.Copy( KNSmlDMVCC_ImmediateDT );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+ // DT CS to PS
+ segmentName.Copy( KNSmlDMVCC_DTCsToIM );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+ // DT PS to CS
+ segmentName.Copy( KNSmlDMVCC_DTIMToCs );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+ // DT Held waiting calls
+ segmentName.Copy( KNSmlDMVCC_DTHeldWaitingCalls );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+ // Wlan Ho Treshold
+ segmentName.Copy( KNSmlDMVCC_WlanHOTreshold );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+ // Wlan Ho Hysteresis
+ segmentName.Copy( KNSmlDMVCC_WlanHOHysteresis );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+ // Wlan Ho Hysteresis Timer Low
+ segmentName.Copy( KNSmlDMVCC_WlanHysteresisTimerLow );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+ // Wlan Ho Hysteresis Timer High
+ segmentName.Copy( KNSmlDMVCC_WlanHysteresisTimerHigh );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+ // CS Ho Treshold
+ segmentName.Copy( KNSmlDMVCC_CSHOTreshold );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+ // CS Ho Hysteresis
+ segmentName.Copy( KNSmlDMVCC_CSHOHysteresis );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+ // CS Ho Hysteresis Timer Low
+ segmentName.Copy( KNSmlDMVCC_CSHysteresisTimerLow );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+ // CS Ho Hysteresis Timer High
+ segmentName.Copy( KNSmlDMVCC_CSHysteresisTimerHigh );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+ // DT Allowed When CS Originated
+ segmentName.Copy( KNSmlDMVCC_DtAllowedWhenCsOriginated );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(),
+ KNSmlDMVCCSeparator );
+
+
+ status = CSmlDmAdapter::EOk;
+ }
+ else if( KNSmlDMVCC_DmToConRef() == LastURISeg( aURI ) ) // ./VCC001/ToConRef
+ {
+ segmentName.Copy( KNSmlDMVCC_VoipServiceId );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(), segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(), KNSmlDMVCCSeparator );
+ status = CSmlDmAdapter::EOk;
+ }
+ else if( KNSmlDMVCC_VoipServiceId() == LastURISeg( aURI ) ) // ./VCC001/ToConRef/VoIP
+ {
+ segmentName.Copy( KNSmlDMVCC_DmConRef );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(), segmentName );
+ currentURISegmentList->InsertL( currentURISegmentList->Size(), KNSmlDMVCCSeparator );
+ status = CSmlDmAdapter::EOk;
+ }
+
+
+ Callback().SetStatusL( aStatusRef, status );
+ Callback().SetResultsL( aResultsRef, *currentURISegmentList, KNullDesC8 );
+ CleanupStack::PopAndDestroy( currentURISegmentList );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::AddNodeObjectL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aParentLUID*/, TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::AddNodeObjectL" );
+
+ // Not supported
+ Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EOk );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::ExecuteCommandL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/, const TDesC8& /*aArgument*/,
+ const TDesC8& /*aType*/, TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::ExecuteCommandL" );
+
+ // Not supported
+ Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::ExecuteCommandL( const TDesC8& /*aURI*/,
+ const TDesC8& /*aLUID*/, RWriteStream*& /*aStream*/,
+ const TDesC8& /*aType*/, TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::ExecuteCommandL -stream" );
+
+ // Not supported
+ Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::CopyCommandL( const TDesC8& /*aTargetURI*/,
+ const TDesC8& /*aTargetLUID*/, const TDesC8& /*aSourceURI*/,
+ const TDesC8& /*aSourceLUID*/, const TDesC8& /*aType*/,
+ TInt aStatusRef )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::CopyCommandL" );
+
+ // Not supported
+ Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::StartAtomicL()
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::StartAtomicL()" );
+ // Not supported
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::CommitAtomicL()
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::CommitAtomicL()" );
+ // Not supported
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::RollbackAtomicL()
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::RollbackAtomicL()" );
+ // Not supported
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CNSmlDmVCCAdapter::StreamingSupport( TInt& /*aItemSize*/ )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::StreamingSupport" );
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::StreamCommittedL()
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::StreamCommittedL" );
+ // Not supported
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::CompleteOutstandingCmdsL()
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::CompleteOutstandingCmdsL()" );
+
+ iVCCSettings->StoreL();
+ }
+
+// ---------------------------------------------------------------------------
+// Returns only the last uri segment.
+// ---------------------------------------------------------------------------
+//
+const TPtrC8 CNSmlDmVCCAdapter::LastURISeg( const TDesC8& aURI )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::LastURISeg" );
+ TInt offset = aURI.LocateReverse( KNSmlDMVCCSeparatorChar );
+
+ RUBY_DEBUG1( " - offset == %d", offset );
+
+ TInt i;
+ for ( i=aURI.Length()-1; i >= 0; i-- )
+ {
+ if ( aURI[i]=='/' )
+ {
+ break;
+ }
+ }
+ if ( i==0 )
+ {
+ return aURI;
+ }
+ else
+ {
+ return aURI.Mid( i + 1 );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CSmlDmAdapter::TError CNSmlDmVCCAdapter::FetchObjectL( const TDesC8& aURI,
+ CBufBase& aResult )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::FetchObjectL" );
+ TInt composeResult = ETrue;
+ iVCCSettings->ReadSettingsL( KVccServiceName );
+
+ CSmlDmAdapter::TError retValue = CSmlDmAdapter::EOk;
+ TInt err( KErrNone );
+ TPtrC8 lastUriSeg = LastURISeg( aURI );
+ CSPEntry* entry = CSPEntry::NewLC();
+
+ iVCCSettings->FindServiceEntryL( KNSmlDMVCC_ServiceName, *entry );
+
+ if ( entry->PropertyCount() > 0 )
+ {
+ RUBY_DEBUG0( "- Service Entry found" );
+ TServiceId serviceId = entry->GetServiceId();
+ CSPProperty* property = CSPProperty::NewLC();
+
+ if ( KNSmlDMVCC_Name() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- Name" );
+ err = iVCCSettings->FindPropertyL( serviceId, ESubPropertyVccName,
+ *property );
+ }
+ else if ( KNSmlDMVCC_VDI() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- VDI" );
+ err = iVCCSettings->FindPropertyL( serviceId, ESubPropertyVccVDI,
+ *property );
+ }
+ else if ( KNSmlDMVCC_VDN() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- VDN" );
+ err = iVCCSettings->FindPropertyL( serviceId, ESubPropertyVccVDN,
+ *property );
+ }
+ else if ( KNSmlDMVCC_PreferredDomain() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- Preferred Domain" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccPreferredDomain,
+ *property );
+ }
+ else if ( KNSmlDMVCC_ImmediateDT() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- Immediate DT" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccImmediateDomainTransfer,
+ *property );
+ }
+ else if ( KNSmlDMVCC_DTCsToIM() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- CS to PS" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtCstoPsAllowed,
+ *property );
+ }
+ else if ( KNSmlDMVCC_DTIMToCs() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- PS to CS" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtPstoCsAllowed,
+ *property );
+ }
+ else if ( KNSmlDMVCC_DTHeldWaitingCalls() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- Held waiting calls" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtHeldWaitingCallsAllowed,
+ *property );
+ }
+
+ else if ( KNSmlDMVCC_WlanHOTreshold() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- WlanHOTreshold" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtWLANHoTriggerLevel,
+ *property );
+ }
+ else if ( KNSmlDMVCC_WlanHOHysteresis() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- WlanHOHysteresis" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtWLANHoHysteresis,
+ *property );
+ }
+
+ else if ( KNSmlDMVCC_WlanHysteresisTimerLow() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- _WlanHysteresisTimerLow" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtWLANHoHysteresisTimerLow,
+ *property );
+ }
+
+ else if ( KNSmlDMVCC_WlanHysteresisTimerHigh() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- WlanHysteresisTimerHigh" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtCSHoHysteresisTimerHigh,
+ *property );
+ }
+
+ else if ( KNSmlDMVCC_CSHOTreshold() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- CSHOTreshold" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtCSHoTriggerLevel,
+ *property );
+ }
+ else if ( KNSmlDMVCC_CSHOHysteresis() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- CSHOHysteresis" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtCSHoHysteresis,
+ *property );
+ }
+
+ else if ( KNSmlDMVCC_CSHysteresisTimerLow() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- CSHysteresisTimerLow" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtCSHoHysteresisTimerLow,
+ *property );
+ }
+
+ else if ( KNSmlDMVCC_CSHysteresisTimerHigh() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- CSHysteresisTimerHigh" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtCSHoHysteresisTimerHigh,
+ *property );
+ }
+
+ else if( KNSmlDMVCC_DmConRef() == lastUriSeg )
+ {
+ TPtrC8 conRefUri = NSmlDmURI::RemoveLastSeg(aURI);
+ TPtrC8 lastConRefSeg = NSmlDmURI::LastURISeg(conRefUri);
+ composeResult = EFalse;
+ if(KNSmlDMVCC_VoipServiceId() == lastConRefSeg )
+ {
+ // Voip ConRef
+ retValue= FetchVoipConRefL(aURI, aResult);
+
+ }
+ else
+ {
+ retValue = CSmlDmAdapter::ENotFound;
+ }
+ }
+ else if ( KNSmlDMVCC_DtAllowedWhenCsOriginated() == lastUriSeg )
+ {
+ RUBY_DEBUG0( "- DT allowed when CS originated" );
+ err = iVCCSettings->FindPropertyL( serviceId,
+ ESubPropertyVccDtAllowedWhenCsOriginated,
+ *property );
+ }
+ else
+ {
+ RUBY_DEBUG0( "- Invalid object" );
+ retValue = CSmlDmAdapter::EInvalidObject;
+ }
+
+ if ( KErrNone == err && composeResult )
+ {
+ RUBY_DEBUG0( "- Result handling STARTt" );
+ // Get result from property
+ TBuf<KNSmlDMVCCMaxResultLength> buf;
+ err = property->GetValue( buf );
+
+ // Insert result into result buffer
+ TBuf8<KNSmlDMVCCMaxResultLength> buf8;
+ buf8.Append( buf );
+ aResult.InsertL( 0, buf8 );
+ RUBY_DEBUG0( "- Result handling STOP" );
+ }
+
+ CleanupStack::PopAndDestroy( property );
+ }
+ else
+ {
+ RUBY_DEBUG0( "- Service not found" );
+ // Service not found
+ retValue = CSmlDmAdapter::ENotFound;
+ }
+
+ if ( KErrNone != err )
+ {
+ RUBY_DEBUG1( "- Other error occurred [%d]", err );
+ // Other error occurred
+ retValue = CSmlDmAdapter::EError;
+ }
+
+ CleanupStack::PopAndDestroy( entry );
+
+ return retValue;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+HBufC* CNSmlDmVCCAdapter::ConvertToUnicodeL( const TDesC8& aSource )
+ {
+ if ( iTempBuf )
+ {
+ delete iTempBuf;
+ iTempBuf = NULL;
+ }
+
+ HBufC* temp = EscapeUtils::ConvertToUnicodeFromUtf8L( aSource );
+ CleanupStack::PushL( temp );
+ iTempBuf = temp->AllocL();
+ CleanupStack::PopAndDestroy( temp );
+
+ //return static_cast<const TDesC&>(*iTempPtr);
+ return iTempBuf;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CSmlDmAdapter::TError CNSmlDmVCCAdapter::FetchVoipConRefL( const TDesC8& /*aUri*/,
+ CBufBase& aObject )
+ {
+ RUBY_DEBUG_BLOCK( "CNSmlDmVCCAdapter::FetchVoipConRefL" );
+ CSmlDmAdapter::TError status( CSmlDmAdapter::EOk );
+
+ iVCCSettings->ReadSettingsL( KVccServiceName );
+
+ // Fetch correct id here
+ RUBY_DEBUG1( "ServiceId=%d", iVCCSettings->VoipServiceId() );
+ CRCSEProfileRegistry* cRCSEProfileRegistry = CRCSEProfileRegistry::NewLC(); // CS: 1
+ RPointerArray<CRCSEProfileEntry> foundEntries;
+ CleanupStack::PushL( TCleanupItem( ResetAndDestroyEntries, &foundEntries ) ); // CS: 2
+
+ cRCSEProfileRegistry->FindByServiceIdL( (TUint32)iVCCSettings->VoipServiceId(),
+ foundEntries );
+
+ RUBY_DEBUG1( "ProfileCount=%d", foundEntries.Count() );
+ if ( foundEntries.Count() > 0 )
+ {
+ RUBY_DEBUG1( "VoipId=%d", foundEntries[0]->iId );
+ TInt voipId = foundEntries[0]->iId;
+
+ CBufBase* result = CBufFlat::NewL( 1 );
+ CleanupStack::PushL( result ); // CS: 3
+
+ // Request all VoIP identifiers
+ Callback().FetchLinkL( KNSmlDMVCC_DmVoipLinkPrefix, *result, status );
+
+ if( status == CSmlDmAdapter::EOk )
+ {
+ TInt resultSize( result->Size() );
+ HBufC8* linkList = HBufC8::NewLC( resultSize ); // CS: 4
+ TPtr8 linkListPtr( linkList->Des() );
+ TInt numOfUriSegs( KErrNone );
+
+ if( resultSize > 0 )
+ {
+ linkListPtr.Copy( result->Ptr(0) );
+ RemoveLastSeparator( linkListPtr );
+ numOfUriSegs = NSmlDmURI::NumOfURISegs( linkListPtr );
+ }
+
+ // Find correct VoIP profile
+ while( numOfUriSegs )
+ {
+ TBuf8<KNSmlDMVCC_DefaultResultSize> object;
+
+ // Build URI: ./VoIP/<X>/VoIPId
+ object.Copy( KNSmlDMVCC_DmVoipLinkPrefix );
+ object.Append( KNSmlDMVCCSeparator );
+ object.Append( NSmlDmURI::LastURISeg( linkListPtr ) );
+ object.Append( KNSmlDMVCCSeparator );
+ object.Append( KNSmlDMVCC_DmVoipId );
+
+ // Fetch VoIPId from URI
+ result->Reset();
+ Callback().FetchLinkL( object, *result, status );
+
+ if( status == CSmlDmAdapter::EOk )
+ {
+ // Check if VoIPId match
+ TLex8 lex( result->Ptr( 0 ) );
+ TInt voipIdFromVoipAdapter( KErrNotFound );
+ lex.Val( voipIdFromVoipAdapter );
+
+ if( voipId == voipIdFromVoipAdapter )
+ {
+ aObject.InsertL( 0, NSmlDmURI::RemoveLastSeg( object ) );
+ break;
+ }
+ }
+
+ // VoIPId did not match --> continue
+ linkListPtr.Copy( NSmlDmURI::RemoveLastSeg( linkListPtr ) );
+
+ --numOfUriSegs;
+ }
+ CleanupStack::PopAndDestroy( linkList ); // CS: 3
+ }
+ CleanupStack::PopAndDestroy( result ); // CS: 2
+ }
+ else
+ {
+ RUBY_DEBUG0("Profiles not found");
+ status = CSmlDmAdapter::ENotFound;
+ }
+ CleanupStack::PopAndDestroy(); // CS: 1
+ CleanupStack::PopAndDestroy( cRCSEProfileRegistry ); // CS: 0
+ return status;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmVCCAdapter::UpdateVoipConRefL
+// -----------------------------------------------------------------------------
+//
+CSmlDmAdapter::TError CNSmlDmVCCAdapter::UpdateVoipConRefL(const TDesC8& /*aUri*/,
+ const TDesC8& aObject)
+ {
+ RUBY_DEBUG_BLOCK("CNSmlDmVCCAdapter::UpdateVoipConRefL");
+
+ CSmlDmAdapter::TError status( CSmlDmAdapter::EOk );
+
+ CBufBase* result = CBufFlat::NewL(1);
+ CleanupStack::PushL(result); // CS: 1
+
+ // Request all voip settings identifiers
+ Callback().FetchLinkL(KNSmlDMVCC_DmVoip, *result, status);
+
+ if( status == CSmlDmAdapter::EOk )
+ {
+ RUBY_DEBUG0("Voip profiles found");
+ // Fetch VoIP profile id
+ TBuf8<KNSmlDMVCC_DefaultResultSize> object;
+ object.Copy( aObject );
+ object.Append( KNSmlDMVCCSeparator );
+ object.Append( KNSmlDMVCC_DmVoipId );
+
+ result->Reset();
+ Callback().FetchLinkL( object, *result, status );
+
+ if( status == CSmlDmAdapter::EOk )
+ {
+ RUBY_DEBUG0("Voip Link fetched ok");
+
+ // Convert VoipId to ServiceID
+ CRCSEProfileRegistry* cRCSEProfileRegistry = CRCSEProfileRegistry::NewLC(); // CS: 2
+
+ TInt voipProfileId;
+ TLex8 temp( result->Ptr( 0 ) );
+ TInt res = temp.Val(voipProfileId) ;
+
+ RUBY_DEBUG1( "VoipId=%d", voipProfileId );
+ if (res == KErrNone )
+ {
+ CRCSEProfileEntry* foundEntry = CRCSEProfileEntry::NewLC(); // CS: 3
+ TRAP( res, cRCSEProfileRegistry->FindL( voipProfileId, *foundEntry ) );
+
+ RUBY_DEBUG1( "ServiceId=%d", foundEntry->iServiceProviderId );
+ if (res==KErrNone)
+ {
+ // And save
+ iVCCSettings->SetVoipServiceIdL(foundEntry->iServiceProviderId);
+ }
+ else
+ {
+ RUBY_DEBUG0("Service id not found");
+ status = CSmlDmAdapter::EError;
+ }
+ CleanupStack::PopAndDestroy( foundEntry ); // CS: 2
+ }
+ else
+ {
+ RUBY_DEBUG0("Voip id fetch failed");
+ status = CSmlDmAdapter::EError;
+ }
+ CleanupStack::PopAndDestroy( cRCSEProfileRegistry ); // CS: 1
+ }
+ else
+ {
+ RUBY_DEBUG0("Voip link not found");
+ status = CSmlDmAdapter::EError;
+ }
+ }
+ else
+ {
+ RUBY_DEBUG0("Voip profiles not found");
+ status = CSmlDmAdapter::ENotFound;
+ }
+
+ CleanupStack::PopAndDestroy(result); // CS: 0
+ return status;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CNSmlDmVCCAdapter::RemoveLastSeparator
+// -----------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::RemoveLastSeparator( TPtr8& aURI )
+ {
+
+ if( aURI.Length() > 0 )
+ {
+ TChar separator( '/' );
+ TInt lastchar( aURI.Length() - 1 );
+
+ // Check if last character is separator.
+ if( aURI[lastchar] == separator )
+ {
+ // Delete separator.
+ aURI.Delete( lastchar, 1 );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDmVCCAdapter::ResetAndDestroyEntries
+// -----------------------------------------------------------------------------
+//
+void CNSmlDmVCCAdapter::ResetAndDestroyEntries( TAny* anArray )
+ {
+
+ RPointerArray<CRCSEProfileEntry>* array =
+ reinterpret_cast<RPointerArray<CRCSEProfileEntry>*>( anArray );
+
+ if (array)
+ {
+ array->ResetAndDestroy();
+ array->Close();
+ }
+ }
+
+// End of File
+