diff -r 000000000000 -r c8caa15ef882 simpleengine/xdmrlspres/src/presencetransformxdm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpleengine/xdmrlspres/src/presencetransformxdm.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,521 @@ +/* +* Copyright (c) 2006 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: RLS and Presence XDM, This class represents Presence Transform +* +*/ + + + + +//Includes +#include +#include +#include +#include + +#include "cpresencexdm.h" +#include "presencetransformxdm.h" +#include "rlspresxdmlogger.h" +#include "rlspresxdmconstsint.h" + + + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::TPresenceTransformXDM() +// --------------------------------------------------------------------------- +// +EXPORT_C TPresenceTransformXDM::TPresenceTransformXDM():iPresXDM(NULL) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::TPresenceTransformXDM()" ) ); + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::Init() +// --------------------------------------------------------------------------- +// +EXPORT_C void TPresenceTransformXDM::Init(CPresenceXDM* const aPresXDM) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::Init(%d)"),aPresXDM); + iPresXDM = aPresXDM; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::~TPresenceTransformXDM() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt TPresenceTransformXDM::AddTransComplexL(const TDesC& aRuleID, + const TDesC& aComplexChild, + const RArray& aTypeAndValues) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::AddTransComplexL" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S), aComplexChild(%S), aTypeAndValuesCount(%d)"), + &aRuleID, &aComplexChild, aTypeAndValues.Count()); + + // check validity of input data + if (!((aComplexChild==KXdmProvidePersons)||(aComplexChild==KXdmProvideServices)|| + (aComplexChild==KXdmProvideDevices))) + return KErrArgument; + + if(!AreNodeNamesValid(aComplexChild, aTypeAndValues)) + return KErrArgument; + + CXdmDocumentNode* complexChildNode = GetTransformChildNodeL(aRuleID, + aComplexChild, ETrue); + if(complexChildNode==NULL) + return KErrNotFound; + + // delete the provide all if they exist + if (IsProvideAllExistL(aRuleID, aComplexChild)) + { + complexChildNode->SetEmptyNode(ETrue); + complexChildNode->SetEmptyNode(EFalse); + } + + CXdmDocumentNode* childNode(NULL); + TInt childCount = aTypeAndValues.Count(); + TBuf nodeName; + for(TInt i=0;iCreateChileNodeL(nodeName); + childNode->SetLeafNode(ETrue); + childNode->SetLeafNodeContentL((aTypeAndValues[i]).nodeContent); + OPENG_DP(D_OPENG_LIT( " i(%d), nodeName(%S)"), i, &nodeName); + } + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::AddOrRepProvideAllTransComplexL() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt TPresenceTransformXDM::AddOrRepProvideAllTransComplexL( + const TDesC& aRuleID, const TDesC& aComplexChild) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::AddOrRepProvideAllTransComplexL" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S), aComplexChild(%S)"), + &aRuleID, &aComplexChild); + + TBuf nodeName; + if (aComplexChild==KXdmProvideServices) + nodeName = KPresAllServices; + else if (aComplexChild==KXdmProvidePersons) + nodeName = KPresAllPersons; + else if (aComplexChild==KXdmProvideDevices) + nodeName = KPresAllDevices; + else if (aComplexChild==KPresProvideAllAttributes) + nodeName = KPresProvideAllAttributes; + else + return KErrArgument; + + CXdmDocumentNode* complexChildNode = GetTransformChildNodeL(aRuleID, + aComplexChild, ETrue); + if(complexChildNode==NULL) + return KErrNotFound; + + if (aComplexChild!=KPresProvideAllAttributes) + { + // delete all children from this node + complexChildNode->SetEmptyNode(ETrue); + complexChildNode->SetEmptyNode(EFalse); + + CXdmDocumentNode* emptyNode = complexChildNode->CreateChileNodeL(nodeName); + emptyNode->SetEmptyNode(ETrue); + } + else + complexChildNode->SetEmptyNode(ETrue); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::GetTransComplexL() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt TPresenceTransformXDM::GetTransComplexL(const TDesC& aRuleID, + const TDesC& aComplexChild, + RArray& aTypeAndValues) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::GetTransComplexL" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S), aComplexChild(%S)"), + &aRuleID, &aComplexChild); + + // check validity of input data + if (!((aComplexChild==KXdmProvidePersons)||(aComplexChild==KXdmProvideServices)|| + (aComplexChild==KXdmProvideDevices))) + return KErrArgument; + + CXdmDocumentNode* complexChildNode = GetTransformChildNodeL(aRuleID, + aComplexChild, EFalse); + + if (complexChildNode==NULL) + return KErrNotFound; + + CXdmDocumentNode* childNode(NULL); + TBuf nodeName; + HBufC* nodeContents(NULL); + TTransDataCompo myDataCompo; + + TInt childCount = complexChildNode->NodeCount(); + OPENG_DP(D_OPENG_LIT( " childCount(%d)" ),childCount ); + + for (TInt i=0; iChileNode(i); + nodeName.Copy(childNode->NodeName()); + (myDataCompo.nodeName).Copy(nodeName); + + // get attribute if nodeType support attribute + if ((nodeName==KPresAllDevices)||(nodeName==KPresAllPersons)|| + (nodeName==KPresAllServices)) + { + aTypeAndValues.Append(myDataCompo); + break; + } + + childNode->SetLeafNode(ETrue); + nodeContents = CnvUtfConverter::ConvertToUnicodeFromUtf8L + (childNode->LeafNodeContent()); + (myDataCompo.nodeContent).Copy(nodeContents->Des()); + aTypeAndValues.Append(myDataCompo); + delete nodeContents; + } + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::AddOrRepTransKnownBoolL() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt TPresenceTransformXDM::AddOrRepTransKnownBoolL(const TDesC& aRuleID, + const TDesC& aBoolChild, TBool aValue) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::AddOrRepTransKnownBoolL" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S), aBoolChild(%S)"), + &aRuleID, &aBoolChild); + if (!IsBoolChildSupported(aBoolChild)) + return KErrArgument; + + return AddOrRepTransBoolL(aRuleID, aBoolChild, aValue); + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::GetTransKnownBoolL() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt TPresenceTransformXDM::GetTransKnownBoolL(const TDesC& aRuleID, + const TDesC& aBoolChild, TBool& aValue) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::GetTransKnownBoolL" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S)"), &aRuleID); + if (!IsBoolChildSupported(aBoolChild)) + return KErrArgument; + + return GetTransBoolL(aRuleID, aBoolChild, aValue); + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::AddOrRepTransUnknownBoolL() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt TPresenceTransformXDM::AddOrRepTransUnknownBoolL( + const TDesC& aRuleID, const TDesC& aChildName, TBool aValue) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::AddOrRepTransUnknownBoolL" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S), aChildName(%S)"), &aRuleID, &aChildName); + return AddOrRepTransBoolL(aRuleID, aChildName, aValue); + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::GetTransUnknownBoolL() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt TPresenceTransformXDM::GetTransUnknownBoolL(const TDesC& aRuleID, + const TDesC& aChildName, TBool& aValue) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::GetTransUnknownBoolL" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S), aChildName(%S)"), &aRuleID, &aChildName); + return GetTransBoolL(aRuleID, aChildName, aValue); + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::RemoveTransformL() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt TPresenceTransformXDM::RemoveTransformL(const TDesC& aRuleID, + const TDesC& aChildElement) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::RemoveTransformL" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S), aChildElement(%S)"), &aRuleID, + &aChildElement); + + __ASSERT_ALWAYS(iPresXDM, User::Leave(KErrNotReady)); + + CXdmDocumentNode* myNode(NULL); + if(aChildElement==KNullDesC) // remove whole transform + { + myNode = iPresXDM->GetRuleChildNodeL(aRuleID, KXdmTransformations, EFalse); + } + else + { + myNode = GetTransformChildNodeL(aRuleID, aChildElement, EFalse); + } + if(myNode==NULL) + return KErrNotFound; + iPresXDM->RemoveFromModelL(myNode); + OPENG_DP(D_OPENG_LIT( " removed" ) ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::IsTransformExistL() +// --------------------------------------------------------------------------- +// +EXPORT_C TBool TPresenceTransformXDM::IsTransformExistL(const TDesC& aRuleID, + const TDesC& aChildElement) + { + OPENG_DP(D_OPENG_LIT( "TPresenceTransformXDM::IsTransformExist" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S), aChildElement(%S)"), &aRuleID, + &aChildElement); + + CXdmDocumentNode* myNode = GetTransformChildNodeL(aRuleID, aChildElement, EFalse); + if(myNode) + { + OPENG_DP(D_OPENG_LIT( " True" ) ); + return ETrue; + } + return EFalse; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::GetTransformChildNodeL() +// --------------------------------------------------------------------------- +// +CXdmDocumentNode* TPresenceTransformXDM::GetTransformChildNodeL( const TDesC& aRuleID, + const TDesC& aChild, TBool aCreate) + { + OPENG_DP(D_OPENG_LIT( " TPresenceTransformXDM::GetTransformChildNodeL" ) ); + OPENG_DP(D_OPENG_LIT( " aRuleID(%S), aChild(%S), aCreate(%d)"), &aRuleID, + &aChild, aCreate); + + __ASSERT_ALWAYS(iPresXDM, User::Leave(KErrNotReady)); + + CXdmDocumentNode* transformNode = iPresXDM->GetRuleChildNodeL(aRuleID, + KXdmTransformations, aCreate); + if ( (!aCreate) && (transformNode==NULL)) + return NULL; + + RPointerArray nodes; + CXdmDocumentNode* childNode(NULL); + + // Finding transform node + transformNode->Find(aChild, nodes); + OPENG_DP(D_OPENG_LIT( " nodeCount(%d)" ), nodes.Count()); + if(nodes.Count()) // if transform node exist + { + childNode = nodes[0]; // only one complex child node can exist + } + else if (aCreate) // if asked to create + { + childNode = transformNode->CreateChileNodeL(aChild); + } + + nodes.Close(); + return childNode; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::AreNodeNamesValid() +// --------------------------------------------------------------------------- +// +TBool TPresenceTransformXDM::AreNodeNamesValid(const TDesC& aComplexChild, + const RArray& aTypeAndValues) + { + OPENG_DP(D_OPENG_LIT( " TPresenceTransformXDM::AreNodeNamesValid" ) ); + OPENG_DP(D_OPENG_LIT( " aComplexChild(%S)"), &aComplexChild); + + TInt nodeCount = aTypeAndValues.Count(); + TBuf myNodeName; + TInt i(0); + + if(aComplexChild == KXdmProvideDevices) + { + for(i=0;i nodeName; + if (aComplexChild==KXdmProvideServices) + nodeName = KPresAllServices; + else if (aComplexChild==KXdmProvidePersons) + nodeName = KPresAllPersons; + else if (aComplexChild==KXdmProvideDevices) + nodeName = KPresAllDevices; + else + return EFalse; + + if ((myComplexChild->NodeCount()) == 1) + { + CXdmDocumentNode* provideAllNode = myComplexChild->ChileNode(0); + if ((provideAllNode->NodeName()) == nodeName) + { + OPENG_DP(D_OPENG_LIT( " True")); + return ETrue; + } + } + + return EFalse; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::IsBoolChildSupported() +// --------------------------------------------------------------------------- +// +TBool TPresenceTransformXDM::IsBoolChildSupported(const TDesC& aBoolChild) + { + OPENG_DP(D_OPENG_LIT( " TPresenceTransformXDM::IsBoolChildSupported" ) ); + + if( (aBoolChild==KPresProvideActivities)|| + (aBoolChild==KPresProvideClass)|| + (aBoolChild==KPresProvideDeviceID)|| + (aBoolChild==KPresProvideMood)|| + (aBoolChild==KPresProvidePlaceIs)|| + (aBoolChild==KPresProvidePlaceType)|| + (aBoolChild==KPresProvidePrivacy)|| + (aBoolChild==KPresProvideRelationship)|| + (aBoolChild==KPresProvideSphere)|| + (aBoolChild==KPresProvideStatusIcon)|| + (aBoolChild==KPresProvideTimeOffset)|| + (aBoolChild==KPresProvideNote)|| + (aBoolChild==KPresProvideUnknownAttribute)|| + + (aBoolChild==KPresProvideWillingness)|| + (aBoolChild==KPresProvideNetworkAvailability)|| + (aBoolChild==KPresProvideSessionParticipation)|| + (aBoolChild==KPresProvideGeoPriv)|| + (aBoolChild==KPresProvideRegistrationState)|| + (aBoolChild==KPresProvideBarringState) ) + return ETrue; + return EFalse; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::AddOrRepTransBoolL() +// --------------------------------------------------------------------------- +// +TInt TPresenceTransformXDM::AddOrRepTransBoolL(const TDesC& aRuleID, + const TDesC& aBoolChild, TBool aValue) + { + OPENG_DP(D_OPENG_LIT( " TPresenceTransformXDM::AddOrRepTransBoolL" ) ); + + CXdmDocumentNode* childNode = GetTransformChildNodeL(aRuleID, + aBoolChild, ETrue); + if(childNode==NULL) + return KErrNotFound; + + TBuf8 childContents; + if(aValue) + childContents = KXdmTrue; + else + childContents = KXdmFalse; + + childNode->SetLeafNode(ETrue); + childNode->SetLeafNodeContentL(childContents); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// TPresenceTransformXDM::GetTransBoolL() +// --------------------------------------------------------------------------- +// +TInt TPresenceTransformXDM::GetTransBoolL(const TDesC& aRuleID, + const TDesC& aBoolChild, TBool& aValue) + { + OPENG_DP(D_OPENG_LIT( " TPresenceTransformXDM::GetTransBoolL" ) ); + + CXdmDocumentNode* childNode = GetTransformChildNodeL(aRuleID, + aBoolChild, EFalse); + if (childNode==NULL) + return KErrNotFound; + + TInt err(KErrNone); + + childNode->SetLeafNode(ETrue); + + TPtrC8 nodeContents = childNode->LeafNodeContent(); + + if(nodeContents == KXdmTrue) + aValue = ETrue; + else if (nodeContents == KXdmFalse) + aValue = EFalse; + else + err = KErrNotFound; + + return err; + } + +//end of file