diff -r 000000000000 -r 3553901f7fa8 smsprotocols/smsstack/ems/src/EMSFormatIE.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/smsprotocols/smsstack/ems/src/EMSFormatIE.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,240 @@ +/* +* Copyright (c) 2009 Sony Ericsson Mobile Communications AB +* 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: +* Sony Ericsson Mobile Communications AB - initial contribution. +* Nokia Corporation - additional changes. +* +* Contributors: +* +* Description: +* Implements the Enhanced SMS Format Information Element. +* +*/ + + +/** + * @file + * + * Implements CEmsFormatIE class + */ + +#include + +/** + * Creates a default ems format object. + * + * @return CEmsFormatIE* newly created object + */ +EXPORT_C CEmsFormatIE* CEmsFormatIE::NewL() +/** + * @capability None + */ + { + CEmsFormatIE* self = new (ELeave) CEmsFormatIE(); + self->SetAlignment(ELangDepend); + return self; + } + +/** + * Creates an exact copy of the object. + * + * @return CEmsFormatIE* Newly created object. + */ +EXPORT_C CEmsInformationElement* CEmsFormatIE::DuplicateL() const +/** + * @capability None + */ + { + CEmsFormatIE* copy = new (ELeave) CEmsFormatIE(); + CleanupStack::PushL(copy); + copy->CopyL(*this); + CleanupStack::Pop(copy); + return copy; + } + +EXPORT_C void CEmsFormatIE::SetBold(TBool aBold) +/** + * @capability None + */ + { + iFormat=(TUint8)(aBold? iFormat|EBold: iFormat&(~EBold)); + } + +EXPORT_C TBool CEmsFormatIE::Bold() const +/** + * @capability None + */ + { + return (EBold&iFormat)?ETrue:EFalse; + } + +EXPORT_C void CEmsFormatIE::SetItalic(TBool aItalic) +/** + * @capability None + */ + { + iFormat=(TUint8)(aItalic? iFormat|EItalic: iFormat&(~EItalic)); + } + +EXPORT_C TBool CEmsFormatIE::Italic() const +/** + * @capability None + */ + { + return (EItalic&iFormat)?ETrue:EFalse; + } + +EXPORT_C void CEmsFormatIE::SetUnderline(TBool aUnderline) +/** + * @capability None + */ + { + iFormat=(TUint8)(aUnderline? iFormat|EUnderline: iFormat&(~EUnderline)); + } + +EXPORT_C TBool CEmsFormatIE::Underline() const +/** + * @capability None + */ + { + return (EUnderline&iFormat)?ETrue:EFalse; + } + +EXPORT_C void CEmsFormatIE::SetStrikethrough(TBool aStrikethrough) +/** + * @capability None + */ + { + iFormat=(TUint8)(aStrikethrough? iFormat|EStrikethrough: iFormat&(~EStrikethrough)); + } + +EXPORT_C TBool CEmsFormatIE::Strikethrough() const +/** + * @capability None + */ + { + return (EStrikethrough&iFormat)?ETrue:EFalse; + } + +EXPORT_C void CEmsFormatIE::SetAlignment(TAlignment aAlignment) +/** + * @capability None + */ + { + iFormat=(TUint8)(iFormat&~EAlignmentMask); + iFormat=(TUint8)(iFormat|aAlignment); + } + +EXPORT_C CEmsFormatIE::TAlignment CEmsFormatIE::Alignment() const +/** + * @capability None + */ + { + return (TAlignment)(EAlignmentMask&iFormat); + } + +EXPORT_C void CEmsFormatIE::SetFontSize(TFontSize aSize) +/** + * @capability None + */ + { + iFormat=(TUint8)(iFormat&~EFontSizeMask); + iFormat=(TUint8)(iFormat|(aSize<<2)); + } + +EXPORT_C CEmsFormatIE::TFontSize CEmsFormatIE::FontSize() const +/** + * @capability None + */ + { + return (TFontSize)((EFontSizeMask&iFormat)>>2); + } + + +EXPORT_C void CEmsFormatIE::SetFormatLength(TUint aLength) +/** + * @capability None + */ + { + iFormatLength = aLength; + } + +EXPORT_C TUint CEmsFormatIE::FormatLength() const +/** + * @capability None + */ + { + return iFormatLength; + } + + +CEmsFormatIE::CEmsFormatIE() :CEmsInformationElement(CSmsInformationElement::ESmsEnhancedTextFormatting),iFormat(0){iEncodedBodyLength=EEnhancedFormatSizeV4;} + +/** + * Encodes the format object into its raw format. (no IE id) + * + * @param aPtr the buffer to be used which is to contain the data + * @param aIsForSerialisation boolean to indicate if it is for serialisation or encoding + */ +void CEmsFormatIE::EncodeBodyL(TPtr8 aPtr, TBool aIsForSerialisation) const + { + // This is the only information element which needs to check the + // aIsForSerialisation flag. If it is for PDU encoding, the + // length field is only 8 bits. Otherwise it is 16. (This is + // because format objects when inserted can extend over a PDU + // boundary, but are split on encoding) + if (aIsForSerialisation) + { + aPtr.Append(HI_BYTE(iFormatLength)); + } + + aPtr.Append(LO_BYTE(iFormatLength)); + aPtr.Append(iFormat); + } + +/** + * Decodes the raw data out of an information element into this class. + * + * @param aPtr The raw predefined animation data + * @param aIsFromSerialisation boolean to indicate if it is from serialisation + * @leave KErrargument If the size of the data does not match what is expected. + */ +void CEmsFormatIE::DecodeBodyL(const TPtrC8 aPtr, TBool aIsFromSerialisation) + { + __ASSERT_ALWAYS((aPtr.Length() >= EEnhancedFormatSizeV4), User::Leave(KErrArgument)); + + // index into byte array we are currently looking at + TInt pos = 0; + iFormatLength = 0; + + if (aIsFromSerialisation) + { + iFormatLength = static_cast(aPtr[pos] * 256); + ++pos; + } + iFormatLength += static_cast(aPtr[pos]); + ++pos; + iFormat=aPtr[pos]; + } + +TInt CEmsFormatIE::SerialisedBodyLength() const + { + // extra byte required for 16-bit length field when serialised + return iEncodedBodyLength + 1; + } + +EXPORT_C void CEmsFormatIE::CopyL(const CEmsFormatIE& aSrc) +/** + * @capability None + */ + { + CEmsInformationElement::CopyL(aSrc); + iFormatLength = aSrc.iFormatLength; + iFormat=aSrc.iFormat; + }