--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpdataproviders/mtppictbridgedp/pictbridgeengine/src/dpsxmlparser.cpp Fri Jun 11 14:27:06 2010 +0300
@@ -0,0 +1,445 @@
+/*
+* Copyright (c) 2006, 2007 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: This class parses the dps xml script.
+*
+*/
+
+
+#include <e32debug.h>
+#include "dpsxmlparser.h"
+#include "dpsconst.h"
+#include "pictbridge.h"
+#include "dpsxmlstring.h"
+
+#ifdef _DEBUG
+# define IF_DEBUG(t) {RDebug::t;}
+# define PRINT_DES(t)\
+ {TBuf<KMaxArgLen> _buf; _buf.Copy(t);RDebug::Print(_L("---%S"), &_buf);}
+#else
+# define IF_DEBUG(t)
+# define PRINT_DES(t)
+#endif
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CDpsXmlParser* CDpsXmlParser::NewL(CDpsEngine* aEngine)
+ {
+ IF_DEBUG(Print(_L("CDpsXmlParser::NewL")));
+ CDpsXmlParser* self = new (ELeave) CDpsXmlParser(aEngine);
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CDpsXmlParser::~CDpsXmlParser()
+ {
+ IF_DEBUG(Print(_L(">>>~CDpsXmlParser")));
+ iDpsArgs.Close();
+ __IF_DEBUG(Print(_L("<<<~CDpsXmlParser")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CDpsXmlParser::CDpsXmlParser(CDpsEngine* aEngine) : iEngine(aEngine)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::Ctor")));
+ Reset();
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::Ctor")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnStartDocumentL(
+ const RDocumentParameters& /*aDocParam*/, TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnStartDocumentL")));
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("---, error code is %d"), aErrorCode));
+ User::Leave(aErrorCode);
+ }
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnStartDocumentL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnEndDocumentL(TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnEndDocumentL")));
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("---, error code is %d"), aErrorCode));
+ User::Leave(aErrorCode);
+ }
+
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnEndDocumentL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnStartElementL(const RTagInfo& aElement,
+ const RAttributeArray& aAttributes,
+ TInt aErrCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnStartElementL")));
+
+ if (aErrCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("---, error code is %d"), aErrCode));
+ User::Leave(aErrCode);
+ }
+ if (aAttributes.Count() > 1)
+ {
+ IF_DEBUG(Print(_L("---cannot have more than one attribute!")));
+ User::Leave(KErrArgument);
+ }
+
+ // Gets the name of the tag
+ const TDesC8& name = aElement.LocalName().DesC();
+
+ IF_DEBUG(Print(_L("---Start"))); PRINT_DES(name);
+
+ //Checks the element
+ // this is the first layer <dps>
+ if (!name.Compare(KDpsXml))
+ {
+ iAction = EDpsXmlStart;
+ }
+ // this is the second layer <input|output>
+ else if (!name.Compare(KDpsXmlOutput))
+ {
+ iAction = EDpsXmlOutput;
+ }
+ else if (!name.Compare(KDpsXmlInput))
+ {
+ // operation and event cannot be distiguised here
+ iAction = EDpsXmlInput;
+ }
+ // this is the third layer <operation|event|result>
+ else if (iAction == EDpsXmlOutput && !name.Compare(KDpsXmlResult))
+ {
+ // output must be result
+ iAction = EDpsXmlResult;
+ }
+ else if (iAction == EDpsXmlInput &&
+ (!name.Compare(iEngine->DpsParameters()->iDpsEventStrings[0]) ||
+ !name.Compare(iEngine->DpsParameters()->iDpsEventStrings[1])))
+ {
+ if (!name.Compare(iEngine->DpsParameters()->iDpsEventStrings[0]))
+ {
+ iDpsEvent = EDpsEvtNotifyJobStatus;
+ }
+ else
+ {
+ iDpsEvent = EDpsEvtNotifyDeviceStatus;
+ }
+ iAction = EDpsXmlEvent;
+ }
+ else if (iAction == EDpsXmlInput || iAction == EDpsXmlResult)
+ {
+ iAction = EDpsXmlOperation;
+ for (TInt i= 0; i < EDpsOpMax-1; i++) //i=0 as AppendL() method adds item on first free position in array
+ {
+ if (!name.Compare(iEngine->DpsParameters()->iDpsOperationStrings[i]))
+ {
+ IF_DEBUG(Print(_L("---found the operation")));
+ PRINT_DES(name);
+ iDpsOperation = (TDpsOperation)(i+1);// i+1 to by pass first operation EDpsOpEmpty in enum which is not added to array
+ break;
+ }
+ }
+ }
+
+ // below is the fourth layer, e.g. the argument list/element. there
+ // could be many arugments, but only one element
+ else if (iAction == EDpsXmlOperation || iAction == EDpsXmlEvent)
+ {
+ // only element in output is capability
+ if (!name.Compare(iEngine->DpsParameters()->iDpsElementStrings[0]))
+ {
+ IF_DEBUG(Print(_L("---the element is")));
+ PRINT_DES(name);
+ iElement = EDpsCapability;
+ }
+ else
+ {
+ for (TInt i = 0; i < EDpsArgMax; i++)
+ {
+ if (!name.Compare(iEngine->DpsParameters()->iDpsArgStrings[i]))
+ {
+ IF_DEBUG(Print(_L("---the argument is ")));
+ PRINT_DES(name);
+ TDpsArg arg;
+ arg.iElement = (TDpsArgument)i;
+ arg.iContent.Copy(_L(""));
+ iDpsArgs.Append(arg);
+ break;
+ }
+ }
+ }
+
+ }
+ else
+ {
+ // something wrong
+ IF_DEBUG(Print(_L("--- non-PB element! %S"), &name));
+ User::Leave(KErrNotSupported);
+ }
+ if (aAttributes.Count() == 1)
+ {
+ ParseAttributesL(aAttributes, name);
+ }
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnStartElementL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::ParseAttributesL(const RAttributeArray& aAttributes,
+ const TDesC8& tag)
+ {
+ // element
+ const TDesC8& name = aAttributes[0].Attribute().LocalName().DesC();
+ // only "layouts" and "paperTypes" have attributes
+ if (tag.Compare(KDpsXmlPaperTypes) && tag.Compare(KDpsXmlLayouts))
+ {
+ // error
+ IF_DEBUG(Print(_L("--- this tag have no attribute")));
+ PRINT_DES(name);
+ User::Leave(KErrArgument);
+ }
+ // the element of the attributes must be "paperSize"
+ if (name.Compare(KDpsXmlPaperSize))
+ {
+ // error
+ IF_DEBUG(Print(_L("--- wrong attribute")))
+ PRINT_DES(name);
+ User::Leave(KErrArgument);
+ }
+ // value
+ HBufC8* value = aAttributes[0].Value().DesC().AllocLC();
+ TUint32 result;
+ TLex8 converter(*value);
+ TInt error = converter.Val(result, EHex);
+ if (error != KErrNone)
+ {
+ IF_DEBUG(Print(_L("--- convert error %d"), error));
+ User::Leave(error);
+ }
+ iAttrib = result >> KShiftLength;
+ CleanupStack::PopAndDestroy(value);
+ IF_DEBUG(Print(_L("--- attribte value %x"), result));
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnEndElementL(const RTagInfo& aElement,
+ TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnEndElementL")));
+
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("--- error code is %d"), aErrorCode));
+ User::Leave(aErrorCode);
+ }
+
+ // Get the name of the tag
+ const TDesC8& name = aElement.LocalName().DesC();
+ PRINT_DES(name);
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnEndElementL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnContentL(const TDesC8& aBytes, TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnContentL content is")));
+ PRINT_DES(aBytes);
+
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("--- error code %d"), aErrorCode));
+ User::Leave(aErrorCode);
+ }
+ if (aBytes[0] >= KSOH && aBytes[0] <= KSpace)
+ {
+ IF_DEBUG(Print(_L("the unprintable char %d"), aBytes[0]));
+ return;
+ }
+ // parses the result
+ if (iAction == EDpsXmlResult)
+ {
+ TUint32 value;
+ TLex8 converter(aBytes);
+ TInt error = converter.Val(value, EHex);
+ if (error != KErrNone)
+ {
+ IF_DEBUG(Print(_L("--- convert error %d"), error));
+ User::Leave(error);
+ }
+ IF_DEBUG(Print(_L("--- result %x"), value));
+ // we have got the result
+ iDpsResult.iMajorCode =
+ static_cast<TDpsResultMajorCode>(value >> KShiftLength);
+ iDpsResult.iMinorCode =
+ static_cast<TDpsResultMinorCode>(value & KDpsMinorMask);
+ }
+ // gets the argument
+ else if (iAction == EDpsXmlOperation || iAction == EDpsXmlEvent)
+ {
+ iDpsArgs[iDpsArgs.Count() - 1].iContent.Copy(aBytes);
+ }
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnContentL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnStartPrefixMappingL(const RString& /*aPrefix*/,
+ const RString& /*aUri*/,
+ TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnStartPrefixMappingL")));
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("--- error code %d"), aErrorCode));
+ User::Leave(aErrorCode);
+ }
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnStartPrefixMappingL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnEndPrefixMappingL(const RString& /*aPrefix*/,
+ TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnEndPrefixMappingL")));
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("--- error code %d"), aErrorCode));
+ User::Leave(aErrorCode);
+ }
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnEndPrefixMappingL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnIgnorableWhiteSpaceL(const TDesC8& /*aBytes*/,
+ TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnIgnorableWhiteSpaceL")));
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("---error code %d"), aErrorCode));
+ User::Leave(aErrorCode);
+ }
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnIgnorableWhiteSpaceL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnSkippedEntityL(const RString& /*aName*/,
+ TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnSkippedEntityL")));
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("--- error code %d"), aErrorCode));
+ User::Leave(aErrorCode);
+ }
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnSkippedEntityL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnProcessingInstructionL(const TDesC8& /*aTarget*/,
+ const TDesC8& /*aData*/,
+ TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnProcessingInstructionL")));
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("--- error code %d"), aErrorCode));
+ User::Leave(aErrorCode);
+ }
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnProcessingInstructionL")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::OnError(TInt aErrorCode)
+ {
+ IF_DEBUG(Print(_L(">>>CDpsXmlParser::OnError()")));
+ if (aErrorCode != KErrNone)
+ {
+ IF_DEBUG(Print(_L("---error code %d"), aErrorCode));
+ }
+ IF_DEBUG(Print(_L("<<<CDpsXmlParser::OnError()")));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+
+TAny* CDpsXmlParser::GetExtendedInterface(const TInt32 aUid)
+ {
+ return aUid == MDpsExtensionHandler::EInterfaceUid ?
+ static_cast<MDpsExtensionHandler*>(this) : 0;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CDpsXmlParser::Reset()
+ {
+ iDpsArgs.Reset();
+ iAction = EDpsXmlEmpty;
+ iDpsEvent = EDpsEvtEmpty;
+ iDpsOperation = EDpsOpEmpty;
+ iElement = EDpsEleEmpty;
+ iAttrib = 0;
+ }
+