diff -r 000000000000 -r 62f9d29f7211 webservices/wsdescription/src/senpolicy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsdescription/src/senpolicy.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,493 @@ +/* +* Copyright (c) 2002-2005 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: +* +*/ + + + + + + + + + + + +// INCLUDE FILES +#include +#include + +//#include "SenDebug.h" + +#include +#include + +#include "senpolicy.h" +#include "SenIdentityProviderIdArray8.h" + +// ============================ LOCAL FUNCTIONS =============================== + +namespace + { + _LIT8(KPolicyLocalName, "Policy"); + _LIT8(KTransportLocalName, "Transport"); + _LIT8(KIapIdLocalName, "IapId"); + _LIT8(KSnapIdLocalName, "SnapId"); + _LIT8(KIdentityProviderIDsLocalName, "IdentityProviderIDs"); + _LIT8(KIdentityProviderIDsStrictAttrName, "strict"); + _LIT8(KIdentityProviderIDsStrictAttrTrue, "true"); + _LIT8(KIdentityProviderIDLocalName, "IdentityProviderID"); + } + + +EXPORT_C CSenPolicy* CSenPolicy::NewL() + { + CSenPolicy* pNew = NewLC(); + CleanupStack::Pop(); + return(pNew) ; + } + +EXPORT_C CSenPolicy* CSenPolicy::NewLC() + { + CSenPolicy* pNew = new (ELeave) CSenPolicy; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(KPolicyLocalName()); + return pNew; + } + + +EXPORT_C CSenPolicy* CSenPolicy::NewL(TUint32 aIapId) + { + CSenPolicy* pNew = NewLC(aIapId); + CleanupStack::Pop(); + return(pNew) ; + } + + +EXPORT_C CSenPolicy* CSenPolicy::NewLC(TUint32 aIapId) + { + CSenPolicy* pNew = new (ELeave) CSenPolicy; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(KPolicyLocalName(), aIapId); + return pNew; + } + +EXPORT_C CSenPolicy* CSenPolicy::NewL(TUint32 aId, TBool aIsSnapId) + { + CSenPolicy* pNew = NewLC(aId, aIsSnapId); + CleanupStack::Pop(); + return(pNew) ; + } + + +EXPORT_C CSenPolicy* CSenPolicy::NewLC(TUint32 aId, TBool aIsSnapId) + { + CSenPolicy* pNew = new (ELeave) CSenPolicy; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(KPolicyLocalName(), aId, aIsSnapId); + return pNew; + } + + +CSenPolicy::CSenPolicy() +: iIdpIdList(NULL) + { + } + +CSenPolicy::~CSenPolicy() + { + delete iIdpIdList; + } + +EXPORT_C void CSenPolicy::BaseConstructL(const TDesC8& aPolicyLocalName) + { + CSenBaseFragment::BaseConstructL(aPolicyLocalName); + } + +EXPORT_C void CSenPolicy::BaseConstructL(const TDesC8& aPolicyLocalName, + TUint32 aIapId) + { + CSenBaseFragment::BaseConstructL(aPolicyLocalName); + SetIapIdL(aIapId); + } + +EXPORT_C void CSenPolicy::BaseConstructL(const TDesC8& aPolicyLocalName, + TUint32 aId, TBool aIsSnapId) + { + CSenBaseFragment::BaseConstructL(aPolicyLocalName); + if (aIsSnapId == EFalse) + { + SetIapIdL(aId); + } + else + { + SetSnapIdL(aId); + } + } + +EXPORT_C TBool CSenPolicy::Accepts(MSenPolicy& aPolicyPattern) + { + TBool retVal(ETrue); + TRAPD(err, retVal = AcceptsL(aPolicyPattern)); + if (err) return EFalse; + return retVal; + } + +TBool CSenPolicy::AcceptsL(MSenPolicy& aPolicyPattern) + { + TUint32 thisIapID(0); + TUint32 patternIapID(0); + + if(aPolicyPattern.IapId(patternIapID) == KErrNone + && (IapId(thisIapID) != KErrNone + || patternIapID!=thisIapID)) + { + return EFalse; // policies do NOT match(!) + } + + const CSenIdentityProviderIdArray8& patternIdps = + aPolicyPattern.IdentityProviderIds8L(); + if(patternIdps.IsStrict()) + { + const CSenIdentityProviderIdArray8& thisIdps = IdentityProviderIds8L(); + TInt thisCount(thisIdps.Count()); + TInt pos(-1); + TBool matches(EFalse); + for(TInt i=0; i 0) + { + if(!pTransportElement) + { + pTransportElement = &(AsElement().AddElementL(KTransportLocalName)); + } + CSenElement* pSnapIdElement = + pTransportElement->Element(KSnapIdLocalName); + + if(pSnapIdElement) + { + pSnapIdElement = pTransportElement->RemoveElement(KSnapIdLocalName); + } + CSenElement* pIapIdElement = + pTransportElement->Element(KIapIdLocalName); + if(!pIapIdElement) + { + pIapIdElement = &(pTransportElement->AddElementL(KIapIdLocalName)); + } + TBuf8<128> buf; + buf.AppendFormat(_L8("%u"), aIapId); + pIapIdElement->SetContentL(buf); + } + else + { + if(pTransportElement) + { + CSenElement* pIapIdElement = + pTransportElement->Element(KIapIdLocalName); + + if(pIapIdElement) + { + pIapIdElement = pTransportElement->RemoveElement(KIapIdLocalName); + } + } + } + + + } + +// Getter for IAP ID +EXPORT_C TInt CSenPolicy::IapId(TUint32& aCurrentIapId) + { + CSenElement* pTransportElement = AsElement().Element(KTransportLocalName); + if(pTransportElement) + { + CSenElement* pIapIdElement = + pTransportElement->Element(KIapIdLocalName); + if(pIapIdElement && pIapIdElement->HasContent()) + { + //SENDEBUG((_L("CSenPolicy::IapIdL: content found"))); + TPtrC8 content = pIapIdElement->Content(); + TLex8 lex(content); + + TInt err = lex.Val(aCurrentIapId, EDecimal); + return err; + } + //SENDEBUG((_L("CSenPolicy::IapIdL: element not found"))); + } + //SENDEBUG((_L("CSenPolicy::IapIdL: element not found"))); + return KErrNotFound; + } + +// Setter for SNAP ID +EXPORT_C void CSenPolicy::SetSnapIdL(TUint32 aSnapId) + { + if(aSnapId > 0) + { + CSenElement* pTransportElement = AsElement().Element(KTransportLocalName); + if(!pTransportElement) + { + pTransportElement = &(AsElement().AddElementL(KTransportLocalName)); + } + + CSenElement* pIapIdElement = + pTransportElement->Element(KIapIdLocalName); + + if(pIapIdElement) + { + pIapIdElement = pTransportElement->RemoveElement(KIapIdLocalName); + } + + CSenElement* pSnapIdElement = + pTransportElement->Element(KSnapIdLocalName); + if(!pSnapIdElement) + { + pSnapIdElement = &(pTransportElement->AddElementL(KSnapIdLocalName)); + } + TBuf8<128> buf; + buf.AppendFormat(_L8("%u"), aSnapId); + pSnapIdElement->SetContentL(buf); + } + else + { + CSenElement* pTransportElement = AsElement().Element(KTransportLocalName); + if(pTransportElement) + { + CSenElement* pSnapIdElement = + pTransportElement->Element(KSnapIdLocalName); + + if(pSnapIdElement) + { + pSnapIdElement = pTransportElement->RemoveElement(KSnapIdLocalName); + } + } + } + + } + +// Getter for SNAP ID +EXPORT_C TInt CSenPolicy::SnapId(TUint32& aCurrentSnapId) + { + CSenElement* pTransportElement = AsElement().Element(KTransportLocalName); + if(pTransportElement) + { + CSenElement* pSnapIdElement = + pTransportElement->Element(KSnapIdLocalName); + if(pSnapIdElement && pSnapIdElement->HasContent()) + { + //SENDEBUG((_L("CSenPolicy::SnapIdL: content found"))); + TPtrC8 content = pSnapIdElement->Content(); + TLex8 lex(content); + + TInt err = lex.Val(aCurrentSnapId, EDecimal); + return err; + } + //SENDEBUG((_L("CSenPolicy::SnapIdL: element not found"))); + } + //SENDEBUG((_L("CSenPolicy::SnapIdL: element not found"))); + return KErrNotFound; + } + +// Setter: overrides current values with the given values from the array +EXPORT_C void CSenPolicy::SetIdentityProviderIdsL( + CSenIdentityProviderIdArray8& aList) + { + CSenElement* pListElement = + AsElement().Element(KIdentityProviderIDsLocalName); + + if(pListElement) + { + CSenElement* pRemoved = AsElement().RemoveElement(*pListElement); + delete pRemoved; + } + + TInt count(aList.Count()); + if(count>0) + { + for(TInt i=0; i0) + { + AddIdentityProviderIdL(providerId); + } + } + } + } + +// Adder: adds a new IDP ID value at the end of the current list value(s) +// Checks for duplicate (does not insert new ID elements with equal content) +// @return KErrAlreadyExists, if a duplicate is tried to add +// KErrArgument if a zero-length descriptor is tried +// to add (aProviderId.Length() == 0) +// +// NOTE: allocates a copy of given aProviderId! +// +EXPORT_C TInt CSenPolicy::AddIdentityProviderIdL(const TDesC8& aProviderId) + { + if(aProviderId.Length()>0) + { + // there is something relevant to add.. + + // check next that element exists + CSenElement* pListElement = + AsElement().Element(KIdentityProviderIDsLocalName); + + // check if this policy is "empty" (no content yet) + if(!pListElement) + { + // add the element.. + pListElement = + &AsElement().AddElementL(KIdentityProviderIDsLocalName); + } + else + { + // check if ID being inserted already exists + // (prevent inserting a duplicate) + + RPointerArray& children = pListElement->ElementsL(); + TInt childCount(children.Count()); + + // loop through child elements and check their content + for(TInt i=0; iContent(); + if(content == aProviderId) + { + // duplicate found(!) + return KErrAlreadyExists; + } + } + + } + + CSenElement& added = + pListElement->AddElementL(KIdentityProviderIDLocalName); + + added.SetContentL(aProviderId); + // content set: ok + return KErrNone; + } + else // tried to add zero length descriptor (aProviderId.Length() == 0) + { + // return argument error + return KErrArgument; + } + } + +// sets (rebuilds) the IAP ID and IDP ID list values from template +// @return - a error, if at least one addition of new contents has +// failed OR KerrNone if every property was successfully reset +EXPORT_C TInt CSenPolicy::RebuildFrom(MSenPolicy& aTemplate) + { + TInt retVal(KErrNone); + TRAPD(err, retVal = RebuildFromL(aTemplate)); + if (err != KErrNone) + { + retVal = err; + } + return retVal; + } + +TInt CSenPolicy::RebuildFromL(MSenPolicy& aTemplate) + { + TInt retVal(KErrNone); + // check for possible provider policy definition + + TUint32 iapId(0); + TInt err = aTemplate.IapId(iapId); + if(err==KErrNone) + { + // update the latest IAP "recommendation" + SetIapIdL(iapId); + } + const CSenIdentityProviderIdArray8& ids = + aTemplate.IdentityProviderIds8L(); + TInt idsCount(ids.MdcaCount()); + for(TInt j=0; j0) + { + err = AddIdentityProviderIdL(value); + if(err!=KErrNone) + { + retVal = err; // indicate that some IDP could not be added + } + } + } + return retVal; + } + +// Getter: return an empty array if no IDP:s have been spesified +// or a list of IDP arrays if such value(s) have been set. +// +// Ownership of the array remains within this class +EXPORT_C const CSenIdentityProviderIdArray8& + CSenPolicy::IdentityProviderIds8L() + { + // construct temporary array and fill it with the xml content + CSenIdentityProviderIdArray8* pArray = + CSenIdentityProviderIdArray8::NewLC(); + + // check next that element exists + CSenElement* pListElement = + AsElement().Element(KIdentityProviderIDsLocalName); + if(pListElement) + { + // Check if strict attribute has "true" value. + const TDesC8* pStrictValue = + pListElement->AttrValue(KIdentityProviderIDsStrictAttrName); + if(pStrictValue && *pStrictValue == KIdentityProviderIDsStrictAttrTrue) + { + pArray->SetStrict(ETrue); + } + + // next check that child elements exist + RPointerArray& elements = pListElement->ElementsL(); + TInt count(elements.Count()); + for(TInt i=0; iHasContent()) + { + pArray->AppendL(element->Content()); + } + } + } + + delete iIdpIdList; + iIdpIdList = pArray; + CleanupStack::Pop(); // pArray + return *iIdpIdList; + } + +// End of file