syncmlfw/dm/treedbhandler/src/nsmldmaclparser.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/dm/treedbhandler/src/nsmldmaclparser.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,331 @@
+/*
+* Copyright (c) 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:  source file for dm acl parser
+*
+*/
+
+#include "nsmldmaclparser.h"
+
+
+// ===============================================================================================
+// class CNSmlDmACLParser
+// ===============================================================================================
+
+
+// ---------------------------------------------------------------------------
+// TInt CNSmlDmACLParser::NewLC()
+// Returns pointer to newly created CNSmlDmACLParser instance
+// ---------------------------------------------------------------------------
+CNSmlDmACLParser* CNSmlDmACLParser::NewLC()
+	{
+	CNSmlDmACLParser* self = new (ELeave) CNSmlDmACLParser();
+	CleanupStack::PushL( self );
+	return self;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CNSmlDmACLParser::~CNSmlDmACLParser()
+// Destructor
+// ---------------------------------------------------------------------------
+CNSmlDmACLParser::~CNSmlDmACLParser()
+	{
+	Reset();
+	}
+
+// ---------------------------------------------------------------------------
+// CNSmlDmACLParser::ParseL()
+// Parses ACL data and keeps data until Reset() is called or instance
+// is destructed
+// ---------------------------------------------------------------------------
+TInt CNSmlDmACLParser::ParseL(const TDesC8& aACL)
+	{
+	Reset();
+	for(TInt i=EAclExecute;i>=EAclAdd;i--)
+		{
+		TInt aclStart = 0;
+		TBool found=EFalse;
+		switch(i)
+			{
+			case EAclAdd:
+				aclStart = aACL.Find(KNSmlDmAclAddEqual);
+				found = aclStart>=0;
+				aclStart=aclStart+KNSmlDmAclAddEqual().Length();
+				break;
+			case EAclReplace:
+				aclStart = aACL.Find(KNSmlDmAclReplaceEqual);
+				found = aclStart>=0;
+				aclStart=aclStart+KNSmlDmAclReplaceEqual().Length();
+				break;
+			case EAclDelete:
+				aclStart = aACL.Find(KNSmlDmAclDeleteEqual);
+				found = aclStart>=0;
+				aclStart=aclStart+KNSmlDmAclDeleteEqual().Length();
+				break;
+			case EAclGet:
+				aclStart = aACL.Find(KNSmlDmAclGetEqual);
+				found = aclStart>=0;
+				aclStart=aclStart+KNSmlDmAclGetEqual().Length();
+				break;
+			case EAclExecute:
+				aclStart = aACL.Find(KNSmlDmAclExecEqual);
+				found = aclStart>=0;
+				aclStart=aclStart+KNSmlDmAclExecEqual().Length();
+				break;
+			default:
+				User::Panic(KSmlDmTreeDbHandlerPanic,KErrArgument);
+				break;
+
+			}
+		if(found)
+			{
+			TInt aclStop = aACL.Right(aACL.Length()-aclStart).
+				Locate(KNSmlDMAclCommandSeparator);
+
+			if(aclStop<0)
+				{
+				aclStop = aACL.Length()-aclStart;
+				}
+
+			TPtrC8 commandAcl = aACL.Mid(aclStart,aclStop);
+
+			CNSmlAclElement* aclElement = new(ELeave) CNSmlAclElement();
+
+			aclElement->iCommandType = (TNSmlDmCmdType)i;
+			aclElement->iNext = iCommandAcls;
+			iCommandAcls=aclElement;
+
+			if(commandAcl.Compare(KNSmlDmAclAll)==0)
+				{
+				aclElement->iAllServers=ETrue;
+				}
+			else
+				{
+				TBool end = EFalse;
+
+				TInt serverIdStart=0;
+				while(!end)
+					{
+					TPtrC8 serverIdPtr =
+						commandAcl.Right(commandAcl.Length()-serverIdStart);
+						
+					TInt serverIdStop =
+						serverIdPtr.Locate(KNSmlDMAclSeparator);
+						
+					if(serverIdStop == KErrNotFound)
+						{
+						serverIdStop=commandAcl.Length();
+						end=ETrue;
+						}
+					HBufC8* serverId =
+						serverIdPtr.Left(serverIdStop).AllocL();
+						
+					aclElement->iServerIds.AppendL(serverId);
+					serverIdStart=serverIdStart+serverIdStop+1;
+					}
+				}
+			}
+		}
+	return KErrNone;
+	}
+
+// ---------------------------------------------------------------------------
+// CNSmlDmACLParser::GenerateL()
+// Generates ACL data string from the kept data.
+// ---------------------------------------------------------------------------
+HBufC8* CNSmlDmACLParser::GenerateL()
+	{
+	CBufBase *acl = CBufFlat::NewL(32);
+	CleanupStack::PushL(acl);
+
+	CNSmlAclElement* aclElement=iCommandAcls;
+
+	while(aclElement)
+		{
+		TBool anyServerIds=EFalse;
+		if(aclElement->iAllServers||aclElement->iServerIds.Count())
+			{
+			anyServerIds = ETrue;
+			switch(aclElement->iCommandType)
+				{
+				case EAclAdd:
+					acl->InsertL(acl->Size(),KNSmlDmAclAddEqual);
+					break;
+				case EAclReplace:
+					acl->InsertL(acl->Size(),KNSmlDmAclReplaceEqual);
+					break;
+				case EAclDelete:
+					acl->InsertL(acl->Size(),KNSmlDmAclDeleteEqual);
+					break;
+				case EAclGet:
+					acl->InsertL(acl->Size(),KNSmlDmAclGetEqual);
+					break;
+				case EAclExecute:
+					acl->InsertL(acl->Size(),KNSmlDmAclExecEqual);
+					break;
+				default:
+					User::Panic(KSmlDmTreeDbHandlerPanic,KErrArgument);
+					break;
+				}
+			if(aclElement->iAllServers)
+				{
+				acl->InsertL(acl->Size(),KNSmlDmAclAll);
+				}
+			else
+				{
+				for(TInt i=0;i<aclElement->iServerIds.Count();i++)
+					{
+					acl->InsertL(acl->Size(),*aclElement->iServerIds[i]);
+					if(i<aclElement->iServerIds.Count()-1)
+						{
+						acl->InsertL(acl->Size(),KNSmlDmAclServerIdSeparator);
+						}
+					}
+				}
+			}
+
+		aclElement=aclElement->iNext;
+		if(aclElement&&anyServerIds)
+			{
+			acl->InsertL(acl->Size(),KNSmlDmAclSeparator);
+			}
+		}
+	
+	HBufC8 *aclBuf = HBufC8::NewL(acl->Size());
+	TPtr8 bufPtr = aclBuf->Des();
+	acl->Read(0,bufPtr,acl->Size());
+	CleanupStack::PopAndDestroy(); //acl
+	return aclBuf;
+	}
+
+// ---------------------------------------------------------------------------
+// CNSmlDmACLParser::RemoveAllReferences()
+// Removes all references to aServerId
+// ---------------------------------------------------------------------------
+void CNSmlDmACLParser::RemoveAllReferences(const TDesC8& aServerId)
+	{
+	CNSmlAclElement* aclElement=iCommandAcls;
+
+
+	while(aclElement)
+		{
+		for(TInt i=0;i<aclElement->iServerIds.Count();i++)
+			{
+			if(aclElement->iServerIds[i]->Compare(aServerId)==0)
+				{
+				delete aclElement->iServerIds[i];
+				aclElement->iServerIds.Remove(i);
+				break;
+				}
+			}
+		aclElement=aclElement->iNext;
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CNSmlDmACLParser::ShouldDelete()
+// Check if the instance contains any data to generate acl string.
+// If not acl can be deleted
+// ---------------------------------------------------------------------------
+TBool CNSmlDmACLParser::ShouldDelete()
+	{
+	CNSmlAclElement* aclElement=iCommandAcls;
+
+	while(aclElement)
+		{
+		if(aclElement->iAllServers||aclElement->iServerIds.Count())
+			{
+			return EFalse;
+			}
+		aclElement=aclElement->iNext;
+		}
+	return ETrue;	
+	}
+
+// ---------------------------------------------------------------------------
+// CNSmlDmACLParser::HasRights()
+// Check if the aServerId server has rights for command aCommand type
+// ---------------------------------------------------------------------------
+TBool CNSmlDmACLParser::HasRights(const TDesC8& aServerId,
+	TNSmlDmCmdType aCommandType)
+	{
+	CNSmlAclElement* aclElement=iCommandAcls;
+	TBool ret = EFalse;
+
+	while(aclElement)
+		{
+		if(aclElement->iCommandType==aCommandType)
+			{
+			if(aclElement->iAllServers)
+				{
+				ret = ETrue;
+				}
+			else
+				{
+				for(TInt i=0;i<aclElement->iServerIds.Count();i++)
+					{
+					if(aclElement->iServerIds[i]->Compare(aServerId)==0)
+						{
+						ret = ETrue;
+						break;
+						}
+					}
+				}
+			if(ret)
+				{
+				break;
+				}
+			}
+		aclElement=aclElement->iNext;
+		}
+	return ret;	
+	}
+
+// ---------------------------------------------------------------------------
+// CNSmlDmACLParser::Reset()
+// Resets the instance data
+// ---------------------------------------------------------------------------
+ void CNSmlDmACLParser::Reset()
+	{
+	CNSmlAclElement* aclElement=iCommandAcls;
+
+	while(iCommandAcls)
+		{
+		aclElement = iCommandAcls->iNext;
+		delete iCommandAcls;
+		iCommandAcls=aclElement;
+		}
+	}
+
+
+// ===============================================================================================
+// class CNSmlAclElement
+// ===============================================================================================
+
+// ---------------------------------------------------------------------------
+// CNSmlAclElement::CNSmlAclElement()
+// constructor
+// ---------------------------------------------------------------------------
+CNSmlAclElement::CNSmlAclElement()
+	{
+	}
+	
+// ---------------------------------------------------------------------------
+// CNSmlAclElement::~CNSmlAclElement()
+// destructor
+// ---------------------------------------------------------------------------
+CNSmlAclElement::~CNSmlAclElement()
+	{
+	iServerIds.ResetAndDestroy();
+	}