cbs/CbsServer/ServerSrc/CCbsRecWcdmaMessage.cpp
changeset 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbs/CbsServer/ServerSrc/CCbsRecWcdmaMessage.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,250 @@
+/*
+* Copyright (c) 2004-2009 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 module contains the implementation of CCbsRecWcdmaMessage 
+*                class member functions.
+*    
+*                CCbsRecWcdmaMessage represents a WCDMA message page generated 
+*                by CCbsRecEtelMonitor. CCbsRecWcdmaMessage is constructed from a
+*                CB message page received from ETel server.   
+*
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <e32svr.h>
+#include "CCbsRecWcdmaMessage.h"
+#include "CbsServerPanic.h"
+#include "CbsLogger.h"
+
+// The empty message length. 1 octet is for page parameter 
+const TInt KCbsRecWcdmaMessageMinLength = 1;
+// The maximum message length
+const TInt KCbsRecWcdmaMessageMaxLength = 82;
+// The value that use for parse the page parameter octet.
+const TInt KCbsRecWcdmaPageOfNumberMaskForLow4 = 0x000f;
+
+
+// ================= MEMBER FUNCTIONS =======================================
+
+// -----------------------------------------------------------------------------
+// CCbsRecWcdmaMessage::CCbsRecWcdmaMessage
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCbsRecWcdmaMessage::CCbsRecWcdmaMessage( 
+    const RMobileBroadcastMessaging::TMobileBroadcastAttributesV2& aAttributes )    
+    : iWcdmaAttributes( aAttributes )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsRecWcdmaMessage::CCbsRecWcdmaMessage
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCbsRecWcdmaMessage::CCbsRecWcdmaMessage()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsRecWcdmaMessage::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCbsRecWcdmaMessage::ConstructL( 
+    const TDes8& aMessagePage,    // ETel received msg page
+    const RMobileBroadcastMessaging::TMobileBroadcastAttributesV2& aAttributes )
+    {
+    // Message attributes
+    iTotalNumberOfPages = 
+     ( aAttributes.iNumberOfPages & KCbsRecWcdmaPageOfNumberMaskForLow4 ) ?
+     ( aAttributes.iNumberOfPages & KCbsRecWcdmaPageOfNumberMaskForLow4 ) : 1;
+
+    iMessageType = aAttributes.iMessageType;
+    iMessageIdentifier = aAttributes.iMessageId;
+    iSerialNumber = aAttributes.iSerialNum;
+    iDCS = aAttributes.iDCS;
+
+    // 16-bit representation not prepared.
+    iMessage = NULL;
+    // A buffer for the message contents.
+    iMessage8 = HBufC8::NewL( RMobileBroadcastMessaging::KWCdmaBroadcastPageSize );    
+    TPtr8 messagePtr = iMessage8->Des();
+    messagePtr.Trim();
+
+    TPtrC8 sourceMessagePtr;
+    TInt msgLength = aMessagePage.Length();
+    CBSLOGSTRING2("CBSSERVER: CCbsRecWcdmaMessage::\
+                   ConstructL(): msgLength: %d", msgLength );
+
+    // Message from ETel for 3G has no header and CTSY will append the page 
+    // parameter to the last of message. So the non-empty message's length
+    // must more than 1 octet. The max length for one message page must
+    // less than 82 octets. Additional octets will be omitted.
+    if ( msgLength > KCbsRecWcdmaMessageMinLength )
+        {
+        // Number of this page. Taken form the last byte of the message. 
+        // Max 15, therefore masked with 0xF
+        iPageParameter = 
+            ( aMessagePage[ msgLength - KCbsRecWcdmaMessageMinLength ] 
+            & KCbsRecWcdmaPageOfNumberMaskForLow4 ) ?
+            ( aMessagePage[ msgLength - KCbsRecWcdmaMessageMinLength ] 
+              & KCbsRecWcdmaPageOfNumberMaskForLow4 ) : 1;
+        
+        sourceMessagePtr.Set( aMessagePage.Left( msgLength - 
+                    KCbsRecWcdmaMessageMinLength) );
+
+        if ( KCbsRecWcdmaMessageMaxLength < sourceMessagePtr.Length() )
+            {
+            sourceMessagePtr.Set( aMessagePage.Left( 
+                        KCbsRecWcdmaMessageMaxLength ) );
+            }
+        }
+
+    // Copy the TCbs page contents into this buffer.
+    messagePtr.Copy( sourceMessagePtr );
+
+    // Indicate that we have no network info available
+    iNetworkInfo.iCountryCode = KRecMessageNoNetworkInfo;
+
+    // Set network mode
+    iNetworkMode = ECbsNetworkWcdma;
+
+    CBSLOGSTRING2("CBSSERVER: CCbsRecWcdmaMessage::ConstructL(): \
+                   iTotalNumberOfPages: %d", iTotalNumberOfPages );
+    CBSLOGSTRING2("CBSSERVER: CCbsRecWcdmaMessage::ConstructL(): \
+                   iSerialNumber: %d", iSerialNumber );
+    CBSLOGSTRING2("CBSSERVER: CCbsRecWcdmaMessage::ConstructL(): \
+                   iMessageIdentifier: %d", iMessageIdentifier );
+    CBSLOGSTRING2("CBSSERVER: CCbsRecWcdmaMessage::ConstructL(): \
+                   iDCS: %d", iDCS );
+    CBSLOGSTRING2("CBSSERVER: CCbsRecWcdmaMessage::ConstructL(): \
+                   iPageParameter: %d", iPageParameter );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsRecWcdmaMessage::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCbsRecWcdmaMessage::ConstructL( const CCbsMessage& aMessage )
+    {
+    // Message attributes
+    iTotalNumberOfPages = aMessage.TotalPages();
+    iMessageType = (TUint8) aMessage.MessageType();
+    iMessageIdentifier = aMessage.TopicNumber();
+    iSerialNumber = aMessage.Key();
+    iDCS = aMessage.DCS();
+    // Number of this page, extracted from last octet of the message data
+    iPageParameter = aMessage.PageParameter();
+
+    iLanguage = aMessage.Language();
+
+    // A buffer for the message contents.
+    if ( aMessage.Message() )
+        {
+        iMessage = HBufC::NewL( aMessage.Contents().Length() );
+        iMessage->Des().Copy( aMessage.Contents() );
+        }
+
+    if ( aMessage.Message8() )
+        {
+        iMessage8 = HBufC8::NewL( aMessage.Contents8().Length() );
+        TPtr8 messagePtr = iMessage8->Des();
+        messagePtr.Copy( aMessage.Contents8() );
+        }
+    }
+   
+// -----------------------------------------------------------------------------
+// CCbsRecWcdmaMessage::NewL
+// Two-phased constructor.
+// Constructs a new CCbsRecWcdmaMessage based on TDes8& and message attributes
+// (which is a descriptor) received from EPOC Telephony Server.
+// -----------------------------------------------------------------------------
+//
+CCbsRecWcdmaMessage* CCbsRecWcdmaMessage::NewL( 
+    const TDes8& aMessagePage,  // page received from EPOC Telephony Server 
+    const RMobileBroadcastMessaging::TMobileBroadcastAttributesV2& aAttributes ) 
+    {
+    CCbsRecWcdmaMessage* self = new ( ELeave ) CCbsRecWcdmaMessage( aAttributes );
+    CleanupStack::PushL( self );
+    self->ConstructL( aMessagePage, aAttributes );
+    CleanupStack::Pop( self );
+    return self;
+    } 
+
+// -----------------------------------------------------------------------------
+// CCbsRecWcdmaMessage::NewL
+// Two-phased constructor.
+// Constructs a new CCbsRecWcdmaMessage based on an existing message.
+// -----------------------------------------------------------------------------
+//
+CCbsRecWcdmaMessage* CCbsRecWcdmaMessage::NewL( const CCbsMessage& aMessage )
+    {
+    CCbsRecWcdmaMessage* self = new ( ELeave ) CCbsRecWcdmaMessage();
+    CleanupStack::PushL( self );
+    self->ConstructL( aMessage );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+   
+// Destructor
+CCbsRecWcdmaMessage::~CCbsRecWcdmaMessage()
+    {
+    CBSLOGSTRING("CBSSERVER: >>> CCbsRecWcdmaMessage::~CCbsRecWcdmaMessage()");
+    delete iMessage;
+    delete iMessage8;
+    CBSLOGSTRING("CBSSERVER: <<< CCbsRecWcdmaMessage::~CCbsRecWcdmaMessage()");
+    }
+    
+// -----------------------------------------------------------------------------
+// CCbsRecWcdmaMessage::ThisPage
+// Returns the page number of this page in the message page sequence
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+TUint CCbsRecWcdmaMessage::ThisPage() const
+    {
+    return PageParameter();    
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsRecWcdmaMessage::TotalPages
+// Returns the total number of pages in this page's message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+TUint CCbsRecWcdmaMessage::TotalPages() const
+    {
+    return iTotalNumberOfPages;
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsRecWcdmaMessage::MessageType
+// Returns the message type of this message.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCbsRecWcdmaMessage::MessageType() const
+    {
+    return iMessageType;
+    }
+
+//  End of File