diff -r 48060abbbeaf -r b3cee849fa46 creator/src/creator_scriptelement.cpp --- a/creator/src/creator_scriptelement.cpp Thu Aug 19 09:55:38 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,721 +0,0 @@ -/* -* 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) - { }