webservices/wsstar/wsstarpolicy/src/wspolicywriter.cpp
changeset 0 62f9d29f7211
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsstar/wsstarpolicy/src/wspolicywriter.cpp	Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,388 @@
+/*
+* Copyright (c) 2009 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 "wspolicywriter.h"
+#include "wspolicyreader.h"
+
+#include "policyassertion.h"
+#include "andcompositeassertion.h"
+#include "xorcompositeassertion.h"
+#include "assertion.h"
+#include "primitiveassertion.h"
+#include "policyreferenceassertion.h"
+using namespace WSPolicy;
+using namespace PolicyWriter;    
+
+CWSPolicyWriter* CWSPolicyWriter::NewL()
+{
+     CWSPolicyWriter* pSelf = CWSPolicyWriter::NewLC();
+    CleanupStack::Pop(pSelf);
+    return pSelf;
+    
+}
+CWSPolicyWriter* CWSPolicyWriter::NewLC()
+{
+       CWSPolicyWriter* pSelf = new (ELeave) CWSPolicyWriter();
+    CleanupStack::PushL(pSelf);
+    pSelf->ConstructL();
+    return pSelf;
+     
+}
+CWSPolicyWriter::~CWSPolicyWriter()
+{
+    iNamespcaes.Reset();
+}
+CWSPolicyWriter::CWSPolicyWriter():iNamespcaes(ETrue,ETrue)
+{
+}
+void CWSPolicyWriter::ConstructL()
+{
+count = 0;    
+}
+
+TPtrC8 CWSPolicyWriter::WriteToBufL(CBufBase& aBuf, CPolicyAssertion* aEle)
+    {
+    RBufWriteStream bufWs(aBuf);
+    CleanupClosePushL(bufWs);
+    WritePolicyL(aEle, bufWs);
+    CleanupStack::PopAndDestroy(); // bufWs.Close();
+//    TPtrC8 p = aBuf.Ptr(0);
+//    TInt size(p.Length());
+    iNamespcaes.Reset();
+    return aBuf.Ptr(0);
+    }
+HBufC8* CWSPolicyWriter::WriteAllAsXMlL(CPolicyAssertion* aPolicy)
+{
+   if(!aPolicy)
+    return NULL;
+   
+    CBufFlat *pBuf = CBufFlat::NewL(128);
+    CleanupStack::PushL(pBuf);
+    TPtrC8 p = WriteToBufL(*pBuf, aPolicy);
+
+    TInt size(p.Length());
+    HBufC8* pRet = NULL; //p.AllocL();   
+    
+    if (size > 0)
+    {
+        pRet = HBufC8::NewLC(size);
+        TPtr8 retP = pRet->Des();
+        retP.Copy(p.Ptr(),size);
+        CleanupStack::Pop(); //pRet
+        WriteToFileAllL(retP);            
+    }
+    
+    CleanupStack::PopAndDestroy(); // pBuf;
+    iNamespcaes.Reset();    
+    return pRet;    
+}
+HBufC8* CWSPolicyWriter::WriteAllAsXmlL(CSenElement* /*aXml*/)
+{
+return NULL;    
+}
+         
+TInt CWSPolicyWriter::WritePolicyL(CPolicyAssertion* aEle, RWriteStream& aWriteStream)
+{
+    aWriteStream.WriteL(KStartElement);
+    aWriteStream.WriteL(KWspPolicyPrefix);
+    TPtrC8 name(KSenXmlNsAttNamePlusColonWsp);
+    if(IsNamespaceAdded(name) == KErrNotFound)
+    {
+        aWriteStream.WriteL(KSenXmlNsAttNamePlusColonWsp); //namespace
+        aWriteStream.WriteL(KSenEqualsDblQuot);
+        aWriteStream.WriteL(KWsPolicyNsUri); //namespace
+        aWriteStream.WriteL(KSenDblQuot);
+        TPtrC8 nameuri(KWsPolicyNsUri);
+        AddNameSpaceL(name, nameuri);	//codescannerwarnings
+    }
+    
+/*
+		if (policy.getId() != null) {
+
+			writer.writeNamespace(PolicyConstants.WSU_NAMESPACE_PREFIX,
+					PolicyConstants.WSU_NAMESPACE_URI);
+			writer.setPrefix(PolicyConstants.WSU_NAMESPACE_PREFIX,
+					PolicyConstants.WSU_NAMESPACE_URI);
+
+			writer.writeAttribute("wsu", PolicyConstants.WSU_NAMESPACE_URI,
+					"Id", policy.getId());
+		}
+*/
+		RPolicyTerms terms = aEle->GetTerms();
+		
+		if(terms.Count() > 0)
+		{
+		    aWriteStream.WriteL(KSenGreaterThan);		    
+       		for (TInt i = 0; i< terms.Count(); i++) 
+       		{
+			MAssertion* term = terms[i];
+			WriteAssertionL(term, aWriteStream);
+		    }
+		}
+		else
+		{
+		    aWriteStream.WriteL(KSenGreaterThan);
+		}
+        
+        
+        aWriteStream.WriteL(KSenLessThanSlash);
+        aWriteStream.WriteL(KWspPolicyPrefix);
+		aWriteStream.WriteL(KSenGreaterThan);
+
+        return KErrNone;
+}
+TInt CWSPolicyWriter::WriteAndAssertionL(CAndCompositeAssertion* aEle, RWriteStream& aWriteStream)
+{
+    aWriteStream.WriteL(KStartElement);
+    aWriteStream.WriteL(KWspAndPrefix);
+    aWriteStream.WriteL(KSenGreaterThan);
+	RPolicyTerms terms = aEle->GetTerms();
+	
+	if(terms.Count() > 0)
+	{
+    	WriteTermsL(terms, aWriteStream);
+	}
+		
+    aWriteStream.WriteL(KSenLessThanSlash);
+    aWriteStream.WriteL(KWspAndPrefix);
+    aWriteStream.WriteL(KSenGreaterThan);  
+    
+    return KErrNone; 
+}
+TInt CWSPolicyWriter::WriteXorAssertionL(CXorCompositeAssertion* aEle, RWriteStream& aWriteStream)
+{
+    aWriteStream.WriteL(KStartElement);
+    aWriteStream.WriteL(KWspXorPrefix);
+    aWriteStream.WriteL(KSenGreaterThan);
+	RPolicyTerms terms = aEle->GetTerms();
+	
+	if(terms.Count() > 0)
+	{
+    	WriteTermsL(terms, aWriteStream);
+	}
+
+		
+    aWriteStream.WriteL(KSenLessThanSlash);
+    aWriteStream.WriteL(KWspXorPrefix);
+    aWriteStream.WriteL(KSenGreaterThan);  
+    return KErrNone; 
+}
+TInt CWSPolicyWriter::WriteAssertionL(MAssertion* aEle, RWriteStream& aWriteStream)
+{
+    if(!aEle)
+        return KErrNone; 
+    
+		if (aEle->Type() == EPrimitiveType)
+		{
+			WritePrimitiveAssertionL((CPrimitiveAssertion*) aEle, aWriteStream);
+
+		}
+		else if (aEle->Type() == ECompositeXorType)
+		{
+			WriteXorAssertionL((CXorCompositeAssertion*) aEle,	aWriteStream);
+		}
+		else if (aEle->Type()== EPolicyReferenceType ) 
+		{
+			WritePolicyReferenceL((CPolicyReferenceAssertion*)aEle, aWriteStream);
+		} 
+		else if (aEle->Type() == ECompositePolicyType)
+		{
+			WritePolicyL((CPolicyAssertion*) aEle, aWriteStream);
+		
+		}
+		else if (aEle->Type() == ECompositeAndType)
+		{
+			WriteAndAssertionL((CAndCompositeAssertion*) aEle,aWriteStream);
+
+		} 
+		else 
+		{
+		}
+    
+        return KErrNone;
+}
+TInt CWSPolicyWriter::WritePolicyReferenceL(CPolicyReferenceAssertion* aAssertion, RWriteStream& aWriteStream)
+{
+
+    aWriteStream.WriteL(KStartElement);
+    aWriteStream.WriteL(KWspPolicyReferencePrefix);
+    aWriteStream.WriteL(KSenSpace);
+    aWriteStream.WriteL(KWspPolicyReferenceUri);
+
+    aWriteStream.WriteL(KSenEqualsDblQuot);
+    aWriteStream.WriteL(aAssertion->PolicyUri());
+    aWriteStream.WriteL(KSenDblQuot);
+    aWriteStream.WriteL(KSenGreaterThan);
+    
+    
+    aWriteStream.WriteL(KSenLessThanSlash);
+    aWriteStream.WriteL(KWspPolicyReferencePrefix);
+    aWriteStream.WriteL(KSenGreaterThan);  
+
+    return KErrNone;
+}
+TInt CWSPolicyWriter::WritePrimitiveAssertionL(CPrimitiveAssertion* aAssertion, RWriteStream& aWriteStream)
+{
+	TPtrC8 qname = aAssertion->Name();
+	aWriteStream.WriteL(KStartElement);
+    aWriteStream.WriteL(qname);
+
+    TBuf8<200> name(KSenXmlNsAttNamePlusColon);
+    name.Append(aAssertion->iQname->Prefix());
+//    if(IsNamespaceAdded(name) == KErrNotFound)
+    {
+        aWriteStream.WriteL(name); //namespace
+        aWriteStream.WriteL(KSenEqualsDblQuot);
+        aWriteStream.WriteL(aAssertion->iQname->Uri()); //namespace
+        aWriteStream.WriteL(KSenDblQuot);
+        TPtrC8 nameuri(aAssertion->iQname->Uri());
+        AddNameSpaceL(name, nameuri);	//codescannerwarnings
+    }
+    
+	WriteAttributesL(aAssertion, aWriteStream);
+    aWriteStream.WriteL(KSenGreaterThan);	
+    
+    TPtrC8 strValue = aAssertion->StrValue();    
+
+	if (strValue != KNullDesC8()) {
+	
+		aWriteStream.WriteL(strValue);
+	}
+
+    
+	RPolicyTerms terms = aAssertion->GetTerms();
+	if(terms.Count() > 0)
+	{
+	    
+    	WriteTermsL(terms, aWriteStream);
+	}
+
+	aWriteStream.WriteL(KSenLessThanSlash);
+    aWriteStream.WriteL(qname);
+    aWriteStream.WriteL(KSenGreaterThan);   
+    return KErrNone; 
+}
+TInt CWSPolicyWriter::WriteTermsL(RPointerArray<MAssertion>& aTerms, RWriteStream& aWriteStream)
+{
+
+    for (TInt i=0; i<aTerms.Count(); i++ )
+    {
+        CAssertion* obj = (CAssertion*)aTerms[i];
+        if(obj)
+        {
+            WriteAssertionL(obj, aWriteStream);
+        }
+    }
+    return KErrNone;
+}
+void WriteAttrToL(RWriteStream& aWriteStream, TDesC8& aName, TDesC8& aValue)
+{
+    aWriteStream.WriteL(KSenSpace);
+    aWriteStream.WriteL(aName);
+    aWriteStream.WriteL(KSenEqualsDblQuot);
+    aWriteStream.WriteL(aValue);
+    aWriteStream.WriteL(KSenDblQuot);    
+}
+
+void CWSPolicyWriter::WriteAttributesL(CPrimitiveAssertion* aAssertion, RWriteStream& aWriteStream)
+{
+
+	RAttributeMap& attributes = aAssertion->Attributes();
+	
+	TInt attCount = attributes.Count();
+	
+	for (TInt i=0; i<attCount; i++ )
+    {
+        const TDesC8* nameptr= attributes.KeyAt(i);
+        const TDesC8* valptr= attributes.ValueAt(i);
+        HBufC8* tt = nameptr->AllocL();
+        HBufC8* tt2 = valptr->AllocL();
+        TPtrC8 name =  tt->Des();   
+        TPtrC8 value =  tt2->Des();
+        WriteAttrToL(aWriteStream, name, value);
+        delete tt;
+        delete tt2;
+        
+    }
+}
+
+TPtrC8 CWSPolicyWriter::GetAttrib(TPtrC8 /*aReference*/, CSenElement* /*aEle*/)
+{
+    return KNullDesC8();
+}
+TBool CWSPolicyWriter::IsNamespaceAdded(TPtrC8 aName)
+{
+    return iNamespcaes.Find(aName);
+}
+
+TInt CWSPolicyWriter::AddNameSpaceL(TPtrC8 aName, TPtrC8 aUri)	//codescannerwarnings
+{
+    if(IsNamespaceAdded(aName) == KErrNotFound)
+    {
+        return iNamespcaes.Append(aName.AllocL(),aUri.AllocL());            
+    }
+    return KErrGeneral;
+}
+
+//#ifdef _SENDEBUG  
+void CWSPolicyWriter::WriteToFileAllL(CSenElement* aXml)
+{
+  RFs fss;
+  User::LeaveIfError(fss.Connect());
+  CleanupClosePushL(fss);
+    
+  TBuf<255> file;
+  _LIT( KFileName, "c:\\logs\\normalizer%d.xml");
+  file.Format(KFileName, count);
+  count++;
+  TPtrC OutputFile(file);
+    
+   RFile  xmlFile;
+   xmlFile.Replace(fss , OutputFile, EFileWrite );
+   HBufC8* temp = aXml->AsXmlL();
+   CleanupStack::PushL(temp);
+   xmlFile.Write(temp->Des());
+   xmlFile.Close();
+   CleanupStack::PopAndDestroy(temp);
+   CleanupStack::PopAndDestroy(1); // fss
+}
+void CWSPolicyWriter::WriteToFileAllL(TDesC8& aXml)
+{
+  RFs fss;
+  User::LeaveIfError(fss.Connect());
+  CleanupClosePushL(fss);
+    
+  TBuf<255> file;
+  _LIT( KFileName, "c:\\logs\\normalizer%d.xml");
+  file.Format(KFileName, count);
+  count++;
+  TPtrC OutputFile(file);
+    
+   RFile  xmlFile;
+   xmlFile.Replace(fss , OutputFile, EFileWrite );
+   xmlFile.Write(aXml);
+   xmlFile.Close();
+   CleanupStack::PopAndDestroy(1); // fss
+}
+
+//#endif