policymanagement/policyengine/policyengineserver/src/OperationParser.cpp
changeset 0 b497e44ab2fc
child 25 b183ec05bd8c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/policymanagement/policyengine/policyengineserver/src/OperationParser.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,570 @@
+/*
+* Copyright (c) 2002-2004 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 of policymanagement components
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "OperationParser.h"
+#include "PolicyParser.h"
+#include "OperationParserConstants.h"
+#include "PolicyManager.h"
+#include "PolicyStorage.h"
+#include "debug.h"
+#include "ErrorCodes.h"
+
+
+// CONSTANTS
+_LIT8( KCDataElement, "KCData");
+const TChar KXMLElementEndMark = '>';
+
+// -----------------------------------------------------------------------------
+// COperationParser::COperationParser()
+// -----------------------------------------------------------------------------
+//
+
+COperationParser::COperationParser()
+{
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::~COperationParser()
+// -----------------------------------------------------------------------------
+//
+
+COperationParser::~COperationParser()
+{
+	ResetOperations();
+	delete iParser;
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::NewL()
+// -----------------------------------------------------------------------------
+//
+
+COperationParser * COperationParser::NewL( const TDesC8& aOperationDescription)
+{
+	//2nd phase constructor
+	COperationParser * self = new (ELeave) COperationParser();
+	
+	CleanupStack::PushL( self);
+	self->ConstructL( aOperationDescription);
+	CleanupStack::Pop( self);
+	
+	return self;
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::ConstructL()
+// -----------------------------------------------------------------------------
+//
+
+void COperationParser::ConstructL( const TDesC8& aOperationDescription)
+{
+	//2nd phase constructor
+	iParser = Xml::CParser::NewL( _L8( "text/xml"), *this );	
+	iXMLContent.Set( aOperationDescription);
+}	
+
+
+// -----------------------------------------------------------------------------
+// COperationParser::ResetOperations()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::ResetOperations()
+{
+	for ( TInt i(0); i < iOperations.Count(); i++)
+	{
+		delete iOperations[i];
+		iOperations[i] = NULL;
+	}
+
+	iOperations.Close();
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::ConstructL()
+// -----------------------------------------------------------------------------
+//
+
+void COperationParser::HandleErrorL( const TDesC8& aErrorTxt, const TDesC8& aElementName)
+{
+	//parse error text
+	iReturnText->Copy( _L8("(Line "));
+	iReturnText->AppendNum( iActiveLine);
+	iReturnText->Append( _L8(") "));
+	iReturnText->Append( aErrorTxt);
+	iReturnText->Append( _L8(": "));
+	iReturnText->Append( aElementName);
+		
+	RDEBUG_2("Operation parser error: %S", &iReturnText);
+
+	User::Leave( KErrOpParser);	
+}
+
+
+
+
+// -----------------------------------------------------------------------------
+// COperationParser::ParseOperationsL()
+// -----------------------------------------------------------------------------
+//
+
+void COperationParser::ParseOperationsL( TDes8& aReturnTxt)
+{
+	//reset line counter and initialize XML-parser
+	iActiveLine = 0;
+	iReturnText = &aReturnTxt;
+	iXMLStackPointer = 0;
+	ResetOperations();
+
+
+	//initliaze symbian xml parser
+	iParser->ParseBeginL();
+	
+	//Max size of chunk (max text length, which go once to parser)
+	const TInt KMaxChunkLength = 1000;
+	
+	TPtrC8 xml = iXMLContent;
+	TPtrC8 chunk;
+	TInt length = KMaxChunkLength < xml.Length() ? KMaxChunkLength : xml.Length();
+
+	do
+	{
+		//Find line feed mark (asciicode 10)
+		TInt indexLineFeed = xml.Locate(10);
+		TInt elementEndIndex = xml.Locate( KXMLElementEndMark );
+
+		if ( elementEndIndex != KErrNotFound && (elementEndIndex < indexLineFeed || indexLineFeed == KErrNotFound))
+		{
+			length = elementEndIndex + 1;
+		}
+		else
+		if ( indexLineFeed != KErrNotFound)
+		{ 
+			//max text, which go to parser is one line or KMaxChunkLength. Counter tracks line, where parsing is going
+			iActiveLine++;
+		
+			length = indexLineFeed + 1;
+		}
+
+		//set chunk pointer
+		chunk.Set( xml.Left(length));
+		
+
+		if ( ParserUtility::ContainsCDataField( chunk))
+		{
+			//cdata mark indicated in chunk, remove cdata area from chunk, 
+			TPtrC8 cdata;
+			ParserUtility::ReadCDataAreaL( cdata, chunk, xml);
+			
+			//pointer to cdata content
+			ParserUtility::RemoveCDataMarksL( cdata);
+	
+			if ( !iActiveOperation)
+			{
+				HandleErrorL( ParserErrors::UnexpectedElement, KCDataElement); 
+			}
+			
+			iActiveOperation->SetXACMLContentL( cdata);
+			iActiveOperation->SetLineOffset( iActiveLine - 1);
+			
+			iActiveLine += ParserUtility::LineCounter( cdata);
+		}
+		else
+		{
+			//set remaining XACML description to xacmlDescription
+			xml.Set( xml.Mid(length));			
+		}
+
+		//'|' and '~' are not allowed in policy system...
+		if ( chunk.Locate('|') != KErrNotFound || chunk.Locate('~') != KErrNotFound)
+		{
+			HandleErrorL( ParserErrors::InvalidMark, ParserErrors::InvalidMarks); 
+		}
+		
+		//drive description to parser	
+		iParser->ParseL( chunk);
+	
+		length = KMaxChunkLength < xml.Length() ? KMaxChunkLength : xml.Length();
+	} while ( length);
+
+	//close parser
+	iParser->ParseEndL();	
+}
+
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnProcessingInstructionL()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::ExecuteL( TInt aIndex, CPolicyManager *aManager)
+{
+	iOperations[ aIndex]->ExecuteL( aManager);
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OperationCount()
+// -----------------------------------------------------------------------------
+//
+TInt COperationParser::OperationCount()
+{
+	return iOperations.Count();
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnStartDocumentL()
+// -----------------------------------------------------------------------------
+//
+	
+
+void COperationParser::OnStartDocumentL(const Xml::RDocumentParameters& /*aDocParam*/, TInt /*aErrorCode*/)
+{
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnEndDocumentL()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::OnEndDocumentL(TInt /*aErrorCode*/)
+{
+	
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnStartElementL()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::OnStartElementL(const Xml::RTagInfo& aElement, const Xml::RAttributeArray& aAttributes, TInt /*aErrorCode*/)
+{
+	using namespace OperationParserConstants;
+
+  	TPtrC8 elementName = aElement.LocalName().DesC();
+  	CPolicyStorage* policyStorage = CPolicyStorage::PolicyStorage();
+
+	//package starts operation package
+  	if ( elementName != XMLStack[ iXMLStackPointer] )
+  	{
+		HandleErrorL( ParserErrors::UnexpectedElement, elementName); 
+  	}
+  	
+  	if ( elementName == Operation )
+  	{
+  		if ( !iActiveOperation )
+  		{
+  			iActiveOperation = COperationInfo::NewL();
+  		}
+  		else
+  		{
+  			HandleErrorL( ParserErrors::UnexpectedElement, elementName); 
+  		}
+  	} 
+  	
+   	//search element attributes
+	for ( TInt i = 0; i < aAttributes.Count(); i++)
+	{
+		Xml::RAttribute attribute( aAttributes[i]);
+		
+		TPtrC8 attributeName = attribute.Attribute().LocalName().DesC();
+		TPtrC8 attributeValue = attribute.Value().DesC();
+
+	  	
+		if ( iActiveOperation && elementName == Operation )
+		{
+			if ( attributeName == ActionId )
+			{
+				iActiveOperation->SetActionIdL( attributeValue );
+			}
+			else if ( attributeName == TargetId)
+			{
+				iActiveOperation->SetTargetElementIdL( attributeValue );
+			}
+			else if ( attributeName == UseBearerCert)
+			{
+				if ( attributeValue == True)
+				{
+					iActiveOperation->UseBearerCertificate( ETrue);
+				}
+				else
+				{
+					iActiveOperation->UseBearerCertificate( EFalse);
+				}
+			}
+			else if ( attributeName == AddServerId)
+			{
+				if ( KErrNone != policyStorage->AddNewServerId( attributeValue))
+				{
+	  				HandleErrorL( ManagementErrors::ServerIdManagementError, attributeName); 
+				}
+			}
+			else if ( attributeName == RemoveServerId)
+			{
+				if ( attributeValue == ResetAllTag)
+				{
+					if ( KErrNone != policyStorage->ResetServerIdList())
+					{
+	  					HandleErrorL( ManagementErrors::ServerIdManagementError, attributeName); 
+					}
+				}
+				else
+				{
+					if ( KErrNone != policyStorage->RemoveServerId( attributeValue))
+					{
+		  				HandleErrorL( ManagementErrors::ServerIdManagementError, attributeName); 
+					}
+				}
+			}
+			else
+			{
+  				HandleErrorL( ParserErrors::UnexpectedAttribute, attributeName); 
+			}
+		}
+		else
+		{
+  			HandleErrorL( ParserErrors::UnexpectedAttribute, attributeName); 
+		}
+
+	}
+	
+	iXMLStackPointer++;
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnEndElementL()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::OnEndElementL(const Xml::RTagInfo& aElement, TInt /*aErrorCode*/)
+{
+	using namespace OperationParserConstants;
+
+  	TPtrC8 elementName = aElement.LocalName().DesC();
+
+	//Add new operation operation list
+	if ( elementName == Operation )
+  	{
+  		iOperations.AppendL( iActiveOperation);
+  		iActiveOperation = NULL;
+  	}
+  	
+  	iXMLStackPointer--;
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnContentL()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::OnContentL(const TDesC8& /*aBytes*/, TInt /*aErrorCode*/)
+{
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnStartPrefixMappingL()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::OnStartPrefixMappingL(const RString& /*aPrefix*/, const RString& /*aUri*/, TInt /*aErrorCode*/)
+{
+	
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnEndPrefixMappingL()
+// -----------------------------------------------------------------------------
+//
+
+void COperationParser::OnEndPrefixMappingL(const RString& /*aPrefix*/, TInt /*aErrorCode*/)
+{
+	
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnIgnorableWhiteSpaceL()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::OnIgnorableWhiteSpaceL(const TDesC8& /*aBytes*/, TInt /*aErrorCode*/)
+{
+	
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnSkippedEntityL()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::OnSkippedEntityL(const RString& /*aName*/, TInt /*aErrorCode*/)
+{
+	
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnProcessingInstructionL()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::OnProcessingInstructionL(const TDesC8& /*aTarget*/, const TDesC8& /*aData*/, TInt /*aErrorCode*/)
+{
+	
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::OnError()
+// -----------------------------------------------------------------------------
+//
+void COperationParser::OnError(TInt /*aErrorCode*/)
+{
+	//parse error text
+	iReturnText->Copy( _L8("(Line "));
+	iReturnText->AppendNum( iActiveLine);
+	iReturnText->Append( _L8(") "));
+	iReturnText->Append( ParserErrors::SyntaxError);
+
+	RDEBUG_2("Operation parser error: %S", &iReturnText);
+
+	// PolicyEngine expects this leave in error conditions -> prgram flow
+	// goes to correct TRAP after this. Can not remove this Leave although
+	// the function name does not have "L"
+	User::Leave( KErrOpParser ); 	
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::GetExtendedInterface()
+// -----------------------------------------------------------------------------
+//
+TAny* COperationParser::GetExtendedInterface(const TInt32 /*aUid*/)
+{
+	return NULL;
+}
+
+
+// -----------------------------------------------------------------------------
+// COperationParser::GetExtendedInterface()
+// -----------------------------------------------------------------------------
+//
+COperationInfo::COperationInfo()
+{
+}
+
+
+// -----------------------------------------------------------------------------
+// COperationParser::~COperationInfo()
+// -----------------------------------------------------------------------------
+//
+COperationInfo::~COperationInfo()
+{
+	delete iActionId;
+	delete iTargetElement;
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::NewL()
+// -----------------------------------------------------------------------------
+//
+
+COperationInfo* COperationInfo::NewL()
+{
+	return new (ELeave) COperationInfo();
+}
+
+// -----------------------------------------------------------------------------
+// COperationInfo::UseBearerCertificate()
+// -----------------------------------------------------------------------------
+//
+void COperationInfo::UseBearerCertificate( const TBool aUseBearerCertificate)
+{
+	iUseBearerCertificate = aUseBearerCertificate;
+}
+
+
+// -----------------------------------------------------------------------------
+// COperationParser::SetActionIdL()
+// -----------------------------------------------------------------------------
+//	
+	
+void COperationInfo::SetActionIdL( const TDesC8& aActionId)
+{
+	if ( iActionId )
+	{
+		User::Leave( KErrOpParser);
+	}
+	
+	iActionId = aActionId.AllocL();
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::SetTargetElementIdL()
+// -----------------------------------------------------------------------------
+//
+
+void COperationInfo::SetTargetElementIdL( const TDesC8& aTargetElementId)
+{
+	if ( iTargetElement )
+	{
+		User::Leave( KErrOpParser);
+	}
+	
+	iTargetElement = aTargetElementId.AllocL();
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::SetXACMLContentL()
+// -----------------------------------------------------------------------------
+//
+
+void COperationInfo::SetXACMLContentL( const TPtrC8& aXACMLContent)
+{
+	if ( iXACMLContent.Length())
+	{
+		User::Leave( KErrOpParser);
+	}
+	
+	iXACMLContent.Set( aXACMLContent);
+}
+
+
+// -----------------------------------------------------------------------------
+// COperationParser::ExecuteL()
+// -----------------------------------------------------------------------------
+//
+		
+void COperationInfo::ExecuteL( CPolicyManager *iManager)
+{
+	if ( *iActionId == OperationParserConstants::Add)
+	{
+		iManager->NewElementL( iLineOffset, *iTargetElement, iXACMLContent, iUseBearerCertificate);
+	} 
+	else if ( *iActionId == OperationParserConstants::Remove)
+	{
+		iManager->RemoveElementL( *iTargetElement);
+	}
+	else if ( *iActionId == OperationParserConstants::Replace)
+	{
+		iManager->ReplaceElementL( iLineOffset, *iTargetElement, iXACMLContent);
+	}
+	else
+	{
+		User::Panic( Panics::OperationParserPanic, KErrGeneral);
+	}
+}
+
+// -----------------------------------------------------------------------------
+// COperationParser::SetLineOffset()
+// -----------------------------------------------------------------------------
+//
+
+void COperationInfo::SetLineOffset( const TInt& aLineOffset)
+{
+	iLineOffset = aLineOffset;
+}
+
+