diff -r b3cee849fa46 -r fad26422216a creator/src/creator_scriptelement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/creator/src/creator_scriptelement.cpp Wed Sep 01 12:30:35 2010 +0100 @@ -0,0 +1,721 @@ +/* +* Copyright (c) 2008 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 "creator_traces.h" +#include "creator_scriptelement.h" +#include +#include +#include // KMaxTelNumberSize + +using namespace Xml; + +CCreatorScriptElementCache* CCreatorScriptElementCache::NewL() +{ + CCreatorScriptElementCache* self = new (ELeave) CCreatorScriptElementCache; + CleanupStack::PushL(self); + + self->ConstructL(); + CleanupStack::Pop(); + return self; +} + +CCreatorScriptElementCache::CCreatorScriptElementCache() + { + + } + +void CCreatorScriptElementCache::ConstructL() + { + + } + +CCreatorScriptElementCache::~CCreatorScriptElementCache() + { + iElementCache.Reset(); + iElementCache.Close(); + } + +void CCreatorScriptElementCache::RemoveElements() + { + iElementCache.Reset(); + } + + +void CCreatorScriptElementCache::AddElementL(CCreatorScriptElement* aElement) + { + iElementCache.AppendL(aElement); + } + +/** + * + */ +CCreatorScriptAttribute* CCreatorScriptAttribute::NewLC(const TDesC& aName, const TDesC& aValue) + { + CCreatorScriptAttribute* self = new(ELeave) CCreatorScriptAttribute(); + CleanupStack::PushL(self); + self->ConstructL(aName, aValue); + return self; + } + +CCreatorScriptAttribute* CCreatorScriptAttribute::NewL(const TDesC& aName, const TDesC& aValue) + { + CCreatorScriptAttribute* self = CCreatorScriptAttribute::NewLC(aName, aValue); + CleanupStack::Pop(); // self + return self; + } + +CCreatorScriptAttribute::~CCreatorScriptAttribute() + { + delete iName; + delete iValue; + } + +TPtrC CCreatorScriptAttribute::Name() const + { + return iName->Des(); + } + +void CCreatorScriptAttribute::SetNameL(const TDesC& aName) + { + if( iName ) + { + delete iName; + iName = 0; + } + iName = HBufC::NewL(aName.Length()); + iName->Des() = aName; + } + +TPtrC CCreatorScriptAttribute::Value() const + { + return iValue->Des(); + } + +void CCreatorScriptAttribute::SetValueL(const TDesC& aValue) + { + if( iValue ) + { + delete iValue; + iValue = 0; + } + iValue = HBufC::NewL(aValue.Length()); + iValue->Des() = aValue; + } + +CCreatorScriptAttribute::CCreatorScriptAttribute() + { + } + +void CCreatorScriptAttribute::ConstructL(const TDesC& aName, const TDesC& aValue) + { + SetNameL(aName); + SetValueL(aValue); + } + +/** + * CCreatorScriptElement + */ + +CCreatorScriptElement* CCreatorScriptElement::NewL(CCreatorEngine* aEngine, const TDesC& aName, const TDesC& aContext) + { + CCreatorScriptElement* self = new (ELeave) CCreatorScriptElement(aEngine); + CleanupStack::PushL(self); + self->ConstructL(aName, aContext); + CleanupStack::Pop(); + return self; + } + +CCreatorScriptElement::~CCreatorScriptElement() + { + LOGSTRING("Creator: CCreatorScriptElement::~CCreatorScriptElement"); + iSubElements.ResetAndDestroy(); + iAttributes.ResetAndDestroy(); + iSubElements.Close(); + iAttributes.Close(); + iParameters.Reset(); + iParameters.Close(); + delete iName; + delete iContent; + delete iContext; + } + +RPointerArray const& CCreatorScriptElement::SubElements() const + { + return iSubElements; + } + +RPointerArray& CCreatorScriptElement::SubElements() + { + return iSubElements; + } + +CCreatorScriptElement* CCreatorScriptElement::SubElement(TInt aIndex) + { + return iSubElements[aIndex]; + } + +CCreatorScriptElement* CCreatorScriptElement::FindSubElement(const TDesC& aName) + { + for( TInt i = 0; i < iSubElements.Count(); ++i ) + { + if( iSubElements[i]->Name() == aName ) + { + return iSubElements[i]; + } + } + return 0; + } + +void CCreatorScriptElement::RemoveSubElements() + { + iSubElements.ResetAndDestroy(); + } + +void CCreatorScriptElement::RemoveSubElementL(TInt aIndex) + { + if( aIndex < iSubElements.Count()) + { + delete iSubElements[aIndex]; + iSubElements.Remove(aIndex); + } + else + { + User::Leave(KErrArgument); + } + } + +void CCreatorScriptElement::AddSubElementL(CCreatorScriptElement* aElem, TInt aIndex ) + { + if( aIndex == -1 || aIndex == iSubElements.Count() ) + { + iSubElements.AppendL(aElem); + } + else if( aIndex < iSubElements.Count()) + { + iSubElements.Insert(aElem, aIndex); + } + else + { + User::Leave(KErrArgument); + } + } + +RPointerArray const& CCreatorScriptElement::Attributes() const + { + return iAttributes; + } + + + CCreatorScriptAttribute* CCreatorScriptElement::Attribute(TInt aIndex) + { + return iAttributes[aIndex]; + } + +void CCreatorScriptElement::RemoveAttributes() + { + iAttributes.ResetAndDestroy(); + } + + +void CCreatorScriptElement::RemoveAttributeL(TInt aIndex) + { + if( aIndex < iAttributes.Count()) + { + delete iAttributes[aIndex]; + iAttributes.Remove(aIndex); + } + else + { + User::Leave(KErrArgument); + } + } + +void CCreatorScriptElement::AddAttributeL(CCreatorScriptAttribute* aAttribute, TInt aIndex ) + { + if( aIndex == -1 || aIndex == iAttributes.Count() ) + { + iAttributes.AppendL(aAttribute); + } + else if( aIndex < iAttributes.Count()) + { + iAttributes.Insert(aAttribute, aIndex); + } + else + { + User::Leave(KErrArgument); + } + } + +TPtrC CCreatorScriptElement::Name() const + { + if( iName ) + return iName->Des(); + return TPtrC(); + } + +void CCreatorScriptElement::SetNameL(const TDesC& aName) + { + if( iName ) + { + delete iName; + iName = 0; + } + iName = HBufC::NewL(aName.Length()); + iName->Des() = aName; + } + + +TPtrC CCreatorScriptElement::Content() const + { + if (iContent) + return iContent->Des(); + return TPtrC(); + } + +void CCreatorScriptElement::SetContentL(const TDesC& aContent) + { + if( iContent ) + { + delete iContent; + iContent = 0; + } + iContent = HBufC::NewL(aContent.Length()); + iContent->Des() = aContent; + } + +void CCreatorScriptElement::AppendContentL(const TDesC& aContent) + { + if( iContent == 0 ) + { + SetContentL(aContent); + return; + } + + iContent = iContent->ReAllocL(iContent->Length() + aContent.Length() ); + + TPtr ptr(iContent->Des()); + ptr += aContent; + } + +TPtrC CCreatorScriptElement::Context() const + { + if( iContext ) + return iContext->Des(); + return TPtrC(); + } + +void CCreatorScriptElement::SetContextL(const TDesC& aContext) + { + if( iContext ) + { + delete iContext; + iContext = 0; + } + iContext = HBufC::NewL(aContext.Length()); + iContext->Des() = aContext; + } + +const CCreatorScriptAttribute* CCreatorScriptElement::FindAttributeByName(const TDesC& aName) const + { + for( TInt i = 0; i < iAttributes.Count(); ++i ) + { + CCreatorScriptAttribute* attr = iAttributes[i]; + if( attr->Name() == aName ) + { + return attr; + } + } + return 0; + } + +CCreatorScriptAttribute* CCreatorScriptElement::FindAttributeByName(const TDesC& aName) + { + for( TInt i = 0; i < iAttributes.Count(); ++i ) + { + CCreatorScriptAttribute* attr = iAttributes[i]; + if( attr->Name() == aName ) + { + return attr; + } + } + return 0; + } + +TBool CCreatorScriptElement::IsCacheNeeded() + { + _LIT(KIDAttrName, "id"); + const CCreatorScriptAttribute* attr = FindAttributeByName(KIDAttrName); + return attr != 0; + } + +void CCreatorScriptElement::AddToCacheL(CCreatorScriptElementCache& aCache) + { + aCache.AddElementL(this); + } + +RPointerArray& CCreatorScriptElement::CommandParameters() + { + return iParameters; + } + +const RPointerArray& CCreatorScriptElement::CommandParameters() const + { + return iParameters; + } + +void CCreatorScriptElement::AddToCacheL() + { + } + +TBool CCreatorScriptElement::IsCommandElement() const + { + return iIsCommandElement; + } + +void CCreatorScriptElement::ExecuteCommandL() + { + + } + +TBool CCreatorScriptElement::IsRoot() const + { + _LIT(KRootName, "creatorscript"); + if(iName->Des() == KRootName) + return ETrue; + return EFalse; + } + +CCreatorScriptElement::CCreatorScriptElement(CCreatorEngine* aEngine) +: +iIsCommandElement(EFalse), +iIsRoot(EFalse), +iEngine(aEngine) + {} + +void CCreatorScriptElement::ConstructL(const TDesC& aName, const TDesC& aContext) + { + SetNameL(aName); + SetContextL(aContext); + } + +TBool CCreatorScriptElement::IsSubElementSupported(const CCreatorScriptElement& /*aElem*/) const + { + return ETrue; + } + +TBool CCreatorScriptElement::ConvertStrToBooleanL(const TDesC& aStr) const + { + TBool boolVal = EFalse; + _LIT(KYes, "yes"); + _LIT(KTrue, "true"); + if( CompareIgnoreCase(aStr, KYes) == 0 || + CompareIgnoreCase(aStr, KTrue) == 0 ) + { + boolVal = ETrue; + } + return boolVal; + } + +TInt CCreatorScriptElement::ConvertStrToIntL(const TDesC& aStr) const + { + TInt intVal = 0; + TLex lex(aStr); + TInt errorCode=lex.Val(intVal); + User::LeaveIfError(errorCode); + return intVal; + } + +TUint CCreatorScriptElement::ConvertStrToUintL(const TDesC& aStr) const + { + TUint uintVal = 0; + TLex lex(aStr); + TInt errorCode=lex.Val(uintVal); + User::LeaveIfError(errorCode); + return uintVal; + } +void CCreatorScriptElement::ConvertStrToReal64L(const TDesC& aStr, TReal64& aVal) const + { + TLex lex(aStr); + TInt errorCode=lex.Val(aVal); + User::LeaveIfError(errorCode); + } + +void CCreatorScriptElement::ConvertStrToReal32L(const TDesC& aStr, TReal32& aVal) const + { + TLex lex(aStr); + TInt errorCode=lex.Val(aVal); + User::LeaveIfError(errorCode); + } + +MCreatorRandomDataField::TRandomLengthType CCreatorScriptElement::ResolveRandomDataTypeL(const CCreatorScriptAttribute& aAttr, TInt& aRandomLen) const + { + TPtrC attrVal = aAttr.Value(); + if(attrVal == KMax ) + return MCreatorRandomDataField::ERandomLengthMax; + if(attrVal == KDefault) + return MCreatorRandomDataField::ERandomLengthDefault; + + // Let's see if the value is numeric: + TInt val = 0; + TLex lex(attrVal); + TInt errorCode=lex.Val(val); + if( errorCode == KErrNone ) + { + aRandomLen = val; + return MCreatorRandomDataField::ERandomLengthExplicit; + } + return MCreatorRandomDataField::ERandomLengthUndefined; + } + +void CCreatorScriptElement::AppendContactSetReferenceL( + const CCreatorScriptElement& aContactSetRefElem, + RArray& aLinkArray ) const + { + const TDesC& eName = aContactSetRefElem.Name(); + if( eName != KContactSetRef ) + return; + + const CCreatorScriptAttribute* linkIdAttr = aContactSetRefElem.FindAttributeByName(KId); + if( linkIdAttr ) + { + TInt linkId = ConvertStrToIntL(linkIdAttr->Value()); + if( linkId > 0 ) + { + TLinkIdParam linkParams; + // Add contact-set-reference id to links + linkParams.iLinkId = linkId; + linkParams.iLinkAmount = KUndef; // undefined + // Resolve maxamount: + const CCreatorScriptAttribute* maxAmount = aContactSetRefElem.FindAttributeByName(KMaxAmount); + if( maxAmount ) + { + TInt maxAmountVal = ConvertStrToIntL(maxAmount->Value()); + if( maxAmountVal > 0 ) + { + linkParams.iLinkAmount = maxAmountVal; + } + } + aLinkArray.AppendL(linkParams); + } + } + } + +TTime CCreatorScriptElement::ConvertToDateTimeL(const TDesC& aDtStr) const + { + _LIT(KDateFieldSeparator, "-"); + _LIT(KTimeFieldSeparator, ":"); + _LIT(KDateTimeSeparator, "T"); + _LIT(KTimeSuffix, "."); + _LIT(KDateSuffix, ":"); + // Format date-time string: + HBufC* formatted = HBufC::NewLC(aDtStr.Length()); + formatted->Des().Copy(aDtStr); + + TBool hasTimePart = EFalse; + TBool hasDateTimeSeparator = EFalse; + TInt pos = 0; + + // Date and month numbering starts from 0 in Symbian, so first + // we need to decrease the date and month by one. Script format is following: + // yyyy-mm-ddThh:mm:ss + // Remove also date field separators ('-') + while( (pos = formatted->Find(KDateFieldSeparator)) != KErrNotFound ) + { + // decrease month or date by one + + // First char. Can be zero also: + TInt newValue = 0; + const TPtrC& char1 = formatted->Des().Mid(pos+1).Left(1); + newValue = 10 * ConvertStrToIntL(char1); + // Next char: + const TPtrC& char2 = formatted->Des().Mid(pos+2).Left(1); + newValue += ConvertStrToIntL(char2); + + if( newValue > 0 ) + { + --newValue; + } + + _LIT(KTemp, "%d"); + HBufC* formatBuf = KTemp().AllocLC(); + HBufC* buf = 0; + if( newValue < 10 ) + buf = HBufC::NewLC(1); + else + buf = HBufC::NewLC(2); + + TPtr temp(buf->Des()); + temp.Format(*formatBuf, newValue); + if( newValue < 10 ) + { + formatted->Des()[pos+1] = TChar('0'); + formatted->Des()[pos+2] = buf->Des()[0]; + } + else + { + formatted->Des()[pos+1] = buf->Des()[0]; + formatted->Des()[pos+2] = buf->Des()[1]; + } + // Finally, delete the '-' separator: + formatted->Des().Delete(pos, 1); + CleanupStack::PopAndDestroy(2); + } + + while( (pos = formatted->Find(KTimeFieldSeparator)) != KErrNotFound ) + { + formatted->Des().Delete(pos, 1); + hasTimePart = ETrue; + } + + // Replace 'T' with ':': + if( (pos = formatted->Find(KDateTimeSeparator)) != KErrNotFound ) + { + formatted->Des().Replace(pos, 1, KDateSuffix); + hasDateTimeSeparator = ETrue; + } + + if( hasTimePart ) + formatted->Des().Append(KTimeSuffix); + else if( !hasDateTimeSeparator ) + formatted->Des().Append(KDateSuffix); + + + TTime ret; + ret.Set(*formatted); + CleanupStack::PopAndDestroy(); // formatted + return ret; + } + +TInt CCreatorScriptElement::CompareIgnoreCase(const TDesC& aStr1, const TDesC& aStr2 ) const + { + // Get default collation method: + TCollationMethod defaultCollationMethod = *Mem::CollationMethodByIndex(0); + + // Add ignore case flag: + defaultCollationMethod.iFlags |= TCollationMethod::EFoldCase; + + return aStr1.CompareF(aStr2); + } + +void CCreatorScriptElement::SetContentToTextParamL(HBufC*& aPtr, const TDesC& aContent ) + { + delete aPtr; + aPtr = 0; + aPtr = HBufC::NewL(aContent.Length()); + aPtr->Des().Copy(aContent); + } + +/** + * Increases phonenumber by aDelta. + */ +void CCreatorScriptElement::IncreasePhoneNumL( const TDesC& aOriginal, TInt aDelta, HBufC* aIncreased ) const + { + LOGSTRING("Creator: CCreatorMessageElement::IncreasePhoneNumL"); + __ASSERT_ALWAYS( aDelta >= 0, User::Panic( _L("IncreasePhoneNumL"), KErrArgument ) ); + + // special cases, that are handled: + // +9 -> +9, +10, +11... + // +3584098#99 -> +3584098#99, +3584098#100, +3584098#101... + // # -> #0, #1, #2... + // 123# -> 123#0, 123#1, 123#2... + // 099 -> 099, 100, 101... + + // find out if there are any special characters, like # p or *, in the original number + TInt startIndex( aOriginal.Length() -1 ); + while ( startIndex >= 0 && + aOriginal[startIndex] >= '0' && + aOriginal[startIndex] <= '9' ) + { + startIndex--; + } + startIndex++; + + // append original head that may contain any non number characters + aIncreased->Des().Append( aOriginal.Left( startIndex ) ); + + TBuf tailBuf; + if ( aOriginal.Length() > startIndex ) + { + tailBuf.Copy( aOriginal.Right( aOriginal.Length() -startIndex ) ); + } + + // parse the tail part of the original number + TInt64 intVal = 0; + if ( aOriginal.Length() > startIndex ) + { + TLex lex( tailBuf ); + User::LeaveIfError( lex.Val( intVal ) ); // this loses leading zeros + } + + // increase + intVal += aDelta; + + // restore leading zeros to tail, if any + TBuf resultTailNoZeros; + resultTailNoZeros.AppendNum( intVal ); + TInt tailLeadingZerosToRestore = tailBuf.Length() - resultTailNoZeros.Length(); + for ( TInt i = 0; i < tailLeadingZerosToRestore; i++ ) + { + aIncreased->Des().AppendNum( 0 ); + } + + // and finally, append the increased value as tail part of the result + aIncreased->Des().Append( resultTailNoZeros ); + } + +CCreatorScriptRoot* CCreatorScriptRoot::NewL(CCreatorEngine* aEngine, const TDesC& aName, const TDesC& aContext) + { + CCreatorScriptRoot* self = new (ELeave) CCreatorScriptRoot(aEngine); + CleanupStack::PushL(self); + self->ConstructL(aName, aContext); + CleanupStack::Pop(); + return self; + } +CCreatorScriptRoot::CCreatorScriptRoot(CCreatorEngine* aEngine) +: +CCreatorScriptElement(aEngine) + { + iIsRoot=ETrue; + } + + +CCreatorCalendarElementBase* CCreatorCalendarElementBase::NewL(CCreatorEngine* aEngine, const TDesC& aName, const TDesC& aContext) + { + CCreatorCalendarElementBase* self = new (ELeave) CCreatorCalendarElementBase(aEngine); + CleanupStack::PushL(self); + self->ConstructL(aName, aContext); + CleanupStack::Pop(); + return self; + } +CCreatorCalendarElementBase::CCreatorCalendarElementBase(CCreatorEngine* aEngine) +: +CCreatorScriptElement(aEngine) + { } + +CCreatorMessageElementBase* CCreatorMessageElementBase::NewL(CCreatorEngine* aEngine, const TDesC& aName, const TDesC& aContext) + { + CCreatorMessageElementBase* self = new (ELeave) CCreatorMessageElementBase(aEngine); + CleanupStack::PushL(self); + self->ConstructL(aName, aContext); + CleanupStack::Pop(); + return self; + } +CCreatorMessageElementBase::CCreatorMessageElementBase(CCreatorEngine* aEngine) +: +CCreatorScriptElement(aEngine) + { }