/*
* Copyright (c) 2004 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 file contains the header file of the CCbsMessage class.
*
*/
#ifndef CCBSMESSAGE_H
#define CCBSMESSAGE_H
// INCLUDES
#include <etelmm.h>
#include "CbsReceiverTypes.h"
#include "CbsCommon.h"
#include "CbsMcnCommon.h"
// CONSTANTS
// If this constant is set to iPLMN.iMCC, iPLMN does not contain network info
_LIT( KRecMessageNoNetworkInfo, "-1" );
/// Defines association element (ISO639-code, language)
struct TCbsIso639ToLangMapElement
{
const TLitC< 3 > iCode;
const TCbsDbLanguage iLang;
TCbsIso639ToLangMapElement::TCbsIso639ToLangMapElement(
const TLitC< 3 > aCode,
TCbsDbLanguage aLang )
:iCode( aCode ),
iLang( aLang ) { }
};
// ISO639 codes defining recognized languages
_LIT( KIso639Danish, "DA" );
_LIT( KIso639German, "DE" );
_LIT( KIso639Greek, "EL" );
_LIT( KIso639English, "EN" );
_LIT( KIso639Spanish, "ES" );
_LIT( KIso639Finnish, "FI" );
_LIT( KIso639French, "FR" );
_LIT( KIso639Italian, "IT" );
_LIT( KIso639Dutch, "NL" );
_LIT( KIso639Norwegian, "NO" );
_LIT( KIso639Portuguese, "PT" );
_LIT( KIso639Swedish, "SV" );
_LIT( KIso639Turkish, "TR" );
_LIT( KIso639Hungarian, "HU" );
_LIT( KIso639Polish, "PL" );
_LIT( KIso639Czech, "CS" );
_LIT( KIso639Hebrew, "HE" );
_LIT( KIso639Arabic, "AR" );
_LIT( KIso639Russian, "RU" );
_LIT( KIso639Icelandic, "IS" );
// Amount of languages that are mapped to ISO639 codes.
const TInt KNumberOfLanguageMappings = 20;
// CB message header size in bytes.
const TInt KHeaderLength = 6;
// Offset in CB message to index header in characters.
const TInt KIndexHeaderPosition = 0;
// Index header length in characters (e.g., "EI1<cr><lf>")
const TInt KIndexHeaderLength = 5; // including trailing <cr><lf>
// Offset to language indication, if applicable
const TInt KLanguageIndicationPosition = 0;
// Fixed length of language indication preceding message body
const TInt KLanguageIndicationLength = 3;
// Fixed length of language indication without trailing CR.
const TInt KLanguageIndicationLengthWithoutCR = 2;
// Geographical scope of CB message: cell wide / immediate display
const TInt KGeographicalScopeCellImmediate = 0x00;
// Geographical scope of CB message: operator wide / normal display
const TInt KGeographicalScopePLMNNormal = 0x01;
// Geographical scope of CB message: location area wide / normal display
const TInt KGeographicalScopeLACNormal = 0x02;
// Geographical scope of CB message: cell wide / normal display
const TInt KGeographicalScopeCellNormal = 0x03;
// Message code of an index message.
const TUint16 KIndexMessageCode = 0x02AA; // 1010101010b
const TUint8 KPageParameterSingle = 0x11; // this page: 1, total pages: 1
// ETSI DCS specification
const TUint8 DCS_MASK_GENERAL_DATA_CODING_INDICATION = 0xcc;
const TUint8 DCS_MASK_MESSAGE_HANDLING = 0xf4;
const TUint8 DCS_MASK_LANGUAGE_INDICATION_PRECEDES = 0xff;
const TUint8 DCS_GDCI_8BIT = 0x44;
const TUint8 DCS_GDCI_UCS2 = 0x48;
const TUint8 DCS_DCMH_8BIT = 0xf4;
const TUint8 DCS_MPLI_UCS2 = 0x11;
const TUint16 KMessageCodeMask = 0x3FF0;
const TUint8 DCS_MASK_UDH = 0x9c;
const TUint8 DCS_UDH_8BIT = 0x94;
const TUint8 DCS_MASK_CLASS0 = 0xd3;
const TUint8 DCS_CLASS0 = 0x50;
// Message identifier value indicating that the message contains
// a base station identity.
const TUint16 KCbsBaseStationId = 50;
// Information on Data Coding Scheme values.
// Refer to ETSI GSM 03.38 for details.
enum
{
// Bits 4-7 0000: Language specified with bits 0-3, default alphabet.
ECbsRecLanguageGerman = 0,
ECbsRecLanguageEnglish = 1,
ECbsRecLanguageItalian = 2,
ECbsRecLanguageFrench = 3,
ECbsRecLanguageSpanish = 4,
ECbsRecLanguageDutch = 5,
ECbsRecLanguageSwedish = 6,
ECbsRecLanguageDanish = 7,
ECbsRecLanguagePortuguese = 8,
ECbsRecLanguageFinnish = 9,
ECbsRecLanguageNorwegian = 10,
ECbsRecLanguageGreek = 11,
ECbsRecLanguageTurkish = 12,
ECbsRecLanguageHungarian = 13,
ECbsRecLanguagePolish = 14,
ECbsRecLanguageUnspecified = 15,
// Bits 4-7 0001: Message preceded by language indication,
// default or UCS2 alphabet.
ECbsRecDCSDefaultMsgPrecededByLanguage = 16,
ECbsRecDCSUCS2MsgPrecededByLanguage = 17,
// Bits 4-7 0010: Czech language, reservations for European languages
// using the default alphabet.
ECbsRecLanguageCzech = 32,
ECbsRecLanguageHebrew = 33,
ECbsRecLanguageArabic = 34,
ECbsRecLanguageRussian = 35,
ECbsRecLanguageIcelandic = 36,
// Bits 4-7 0011: Reserved for European languages using the default
// alphabet, with unspecified handling at the MS.
// Max value of language enum, this MUST remain as last
ECbsRecLanguageMax = 100
};
// Message types, GSM, WCDMA, Livecast
enum TCbsMessageType
{
ECbsMessageGsm,
ECbsMessageWcdma,
ECbsMessageLivecast,
ECbsMessageTypeUnspecified
};
// CLASS DECLARATION
/**
* CCbsMessage is the base class for GSM anf WCDMA message classes.
*
*/
class CCbsMessage : public CBase
{
public:
/**
* Virtual destructor
*/
virtual ~CCbsMessage();
public:
/**
* Returns the type of the message (only in WCDMA)
*
* @return Type of this message
*/
virtual TInt MessageType() const = 0;
/**
* Returns ETrue, if this message is a child subindex message.
*
* Child subindex messages have message code 1010101010b and
* message identifier other than 0.
*
* @return ETrue, if the message is child subindex
*/
virtual TBool IsChildSubindex() const;
/**
* Returns ETrue, if this message is a livecast message.
*
*
* @return ETrue, if the message is livecast message
*/
TBool IsLivecastMessage() const;
/**
* Returns the message code of the message.
*
* @return Message Code.
*/
TCbsRecMessageCode MessageCode() const;
/**
* Returns the update number of the message.
*
* @return Update Number.
*/
TCbsRecUpdateNumber UpdateNumber() const;
/**
* Returns the alphabet set of this message.
*
* Possible values are:
*
* ECbsRecAlphabetDefault 7-bit GSM encoding
* ECbsRecAlphabet8bit 8-bit data, unknown encoding
* ECbsRecAlphabetUCS2 16-bit, UCS-2 encoding
* ECbsRecAlphabetUnspecified Unknown encoding
*
* @return Alphabet
*/
TCbsRecAlphabet Alphabet() const;
/**
* Appends another message's content to this message's content.
*
* @param aMsg Message that is appended
* to this msg.
*/
void AppendContent( const TDesC& aMsg );
/**
* Appends another 8-bit message's content to this message's content.
*
* @param aMsg Message that is appended
* to this msg.
*/
void AppendContent8( const TDesC8& aMsg );
/**
* Returns identifier of the cell in which the phone was when this
* message was received.
*
* @return Cell identifier
*/
TUint CellId() const;
/**
* Returns a pointer descriptor to the Unicode contents of the
* message.
*
* Panics if 16-bit presentation is not prepared.
*
* @return Pointer descriptor to the contents of
* the message.
*/
const TDesC& Contents() const;
/**
* Returns a pointer descriptor to 8-bit descriptor representation
* of the message body. Panics if 8-bit representation
* is not prepared.
*
* @return Pointer descriptor to the 8-bit
* representation of this message's body.
*/
const TDesC8& Contents8() const;
/**
* Returns the Data Coding Scheme of this message page.
*
* Refer to GSM specification 03.38 for details on DCS.
*
* @return Data Coding Scheme.
*/
TCbsRecDCS DCS() const;
/**
* Returns the geographical scope of the message.
*
* @return Geographical scope.
*/
TCbsRecGeographicalScope GeographicalScope() const;
/**
* On return, aNetworkId contains identity of the network
* in which the phone was when this message was received.
*
* @param aNetworkInfo Returns: Operator information
*/
void GetPLMN( RMobilePhone::TMobilePhoneNetworkInfoV1& aNetworkInfo ) const;
/**
* Returns ETrue, if this message is a Class 0 message according
* to ETSI GSM specification 03.38.
*/
TBool IsClass0() const;
/**
* Returns ETrue, if the message is compressed.
*
* @return ETrue, if the message is compressed.
*/
TBool IsCompressed() const;
/**
* Returns boolean value indicating if this is the index message.
*
* Index messages have message code 1010101010b.
*
* Refer to GSM specifications to for details.
*
* @return Boolean value indicating if this is
* an index message.
*/
TBool IsIndexMessage() const;
/**
* Returns the key of the message (serial number).
*
* Refer to GSM specifications for details.
*
* @return Key of the message.
*/
TCbsDbMessageKey Key() const;
/**
* Returns the LAC (Location Area Code) of the area where the phone
* was when this message was received.
*
* @return Location area code
*/
TUint LAC() const;
/**
* Returns the language in which the message is written.
*
* Function will panic, if the language has not been resolved
* with ResolveLanguage().
*
* @return The language of the message.
*/
TCbsDbLanguage Language() const;
/**
* Determines and returns the language of this message
* based on first two characters of message content.
* Assumes that the message content contains language
* indication and that the content has been decoded
* into UCS-2 representation.
*
* @returns Language of the message
*/
TCbsDbLanguage LanguagePrecedingMessage() const;
/**
* Determines and returns the language of this message
* based on DCS value. Assumes that the same DCS value
* indicates, that the language can be determined in this
* way (and not from message content).
*
* @returns Language of the message
*/
TCbsDbLanguage LanguageWithDefaultAlphabet() const;
/**
* Returns the 16-bit representation of the message
* contents.
*
* @returns Message contents
*/
HBufC* Message() const;
/**
* Returns the 8-bit representation of the message
* contents.
*
* @returns Message contents
*/
HBufC8* Message8() const;
/**
* Returns the message class of the message.
*
* @return Message Class.
*/
TInt MessageClass() const;
/**
* Returns ECbsRecLanguageIndicationBody, if message's content is
* preceded by language indication (see GSM 03.38).
*
* Return values:
* ECbsRecLanguageIndicationHeader Language indicated by the message
* header DCS value
* ECbsRecLanguageIndicationBody Language indicated by
* a two-character prefix in message
* body.
*
* @return Indication location.
*/
TCbsRecLanguageIndication MessagePrecededByLanguageIndication() const;
/**
* Returns the network mode (GSM/WCDMA) of this message page.
*
* @return Network in which this message was
* received (GSM/WCDMA).
*/
TCbsNetworkMode NetworkMode() const;
/**
* Returns the page parameter of this message page.
*
* Total and this page -fields can be accessed with
* methods TotalPages() and ThisPage().
*
* @return Page Parameter.
*/
TCbsRecPageParameter PageParameter() const;
/**
* Frees the memory allocated for 8-bit representation of message
* content.
*/
void ReleaseEightBitRepresentation();
/**
* Removes any index header prefix from the message body.
*
* This method assumes that the index header is contained in the
* first line of message body. This line, including trailing <cr><lf>
* is removed.
*
* Index header prefix is assumed to contain "EIn<cr><lf>", where n
* specifies the version number this index message claims to
* follow and <cr><lf> is a carriage return + line feed.
*
* It is also assumed that any language indication prefix has
* already been removed prior to this operation.
*
* Message must be in UCS-2 representation.
*
* Leave reasons:
* KErrUnderflow Message is too short to contain index header.
*/
void RemoveIndexHeaderL();
/**
* Removes language indication field from the message body.
*
* Presence of an indication is verified with the DCS value
* according to ETSI specifications. Message is assumed to
* contain valid indication, i.e., three bytes preceding the message
* body specifying the language code.
*
* The correctness of this operation is not checked. If the
* indication is invalid, the message body is likely to either have
* a couple of characters too many or few.
*
* Message is assumed to be decoded into UCS-2.
*
* Leave reasons:
* KErrUnderflow Message is too short to contain language indication.
*/
void RemoveLanguageIndicationFromBodyL();
/**
* Returns ETrue, if this message requires to be displayed
* immediately.
*
* The CB message has to be displayed immediately
* if either it is flagged as a Class 0 message (see GSM 03.38)
* or has a geographical scope of the type "Immediate"
* (see GSM 03.41).
*
* This function always returns EFalse for Base station ID messages
* (message identifier = 50).
*
* @return Immediate display indication.
*/
TBool RequiresImmediateDisplay() const;
/**
* Increases the space allocated for message content.
*
* @param aLength New number of characters in msg
* content.
*/
void ReserveContentSizeL( TInt aLength );
/**
* Increases the space allocated for 8-bit message content.
*
* @param aLength New number of characters in msg
* content.
*/
void ReserveContentSize8L( TInt aLength );
/**
* Determines language of this message so that calls to Language()
* will return the correct value.
*
* Language information may be determined from Data Coding Scheme
* of message header or from the first characters in message body.
* For the latter to succeed, the message has to be decoded into
* UCS-2.
*/
void ResolveLanguage();
/**
* Sets the network information of this message.
*
* @param aNetworkInfo Network information
* @param aArea Area information
*/
void SetNetworkInfo(
const RMobilePhone::TMobilePhoneNetworkInfoV1& aNetworkInfo,
const RMobilePhone::TMobilePhoneLocationAreaV1& aArea );
/**
* Returns the page number of this page in the message page sequence,
*
* @return Page number of this page.
*/
virtual TUint ThisPage() const = 0;
/**
* Returns the topic number to which the message belongs.
* (Message Identifier)
*
* @return The number of the topic
*/
TCbsDbTopicNumber TopicNumber() const;
/**
* Returns the total number of pages in this page's message.
*
* @return Total number of pages in this message
*/
virtual TUint TotalPages() const = 0;
protected:
CCbsMessage();
protected:
// Data Coding Scheme (language, encoding, compression)
TCbsRecDCS iDCS;
// Own: contents of the message page in 16-bit representation
HBufC* iMessage;
// Own: contents of the message page in 8-bit representation
HBufC8* iMessage8;
// Serial Number (GS, Message Code, Update Number)
TUint16 iSerialNumber;
// Message Identifier (Topic number)
TUint16 iMessageIdentifier;
// Page Parameter (this page, total pages)
TCbsRecPageParameter iPageParameter;
// Total number of pages
TInt iTotalNumberOfPages;
// Location area information
RMobilePhone::TMobilePhoneLocationAreaV1 iLocationArea;
// Network information
RMobilePhone::TMobilePhoneNetworkInfoV1 iNetworkInfo;
// Language of this message
TCbsDbLanguage iLanguage;
// Network in which current message was received
TCbsNetworkMode iNetworkMode;
};
#endif // CCBSMESSAGE_H
// End of File