diff -r 000000000000 -r b497e44ab2fc policymanagement/policyengine/policyengineserver/src/OperationParser.cpp --- /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; +} + +