adaptationlayer/tsy/nokiatsy_dll/src/cmmbroadmesshandler.cpp
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
equal deleted inserted replaced
-1:000000000000 0:63b37f68c1ce
       
     1 /*
       
     2 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 // INCLUDE FILES
       
    22 #include <ctsy/pluginapi/cmmdatapackage.h>
       
    23 #include <ctsy/serviceapi/mmtsy_ipcdefs.h>
       
    24 #include <tisi.h>
       
    25 #include <smsisi.h>
       
    26 #include "cmmbroadmesshandler.h"
       
    27 #include "cmmmessagerouter.h"
       
    28 #include "tsylogger.h"
       
    29 #include "cmmphonetsender.h"
       
    30 #include "cmmstaticutility.h"
       
    31 #include "osttracedefinitions.h"
       
    32 #ifdef OST_TRACE_COMPILER_IN_USE
       
    33 #include "cmmbroadmesshandlertraces.h"
       
    34 #endif
       
    35 
       
    36 
       
    37 // EXTERNAL DATA STRUCTURES
       
    38     //none
       
    39 
       
    40 // EXTERNAL FUNCTION PROTOTYPES
       
    41     //none
       
    42 
       
    43 // CONSTANTS
       
    44 const TUint8 KBroadPadding( 0x00 );
       
    45 
       
    46 // MACROS
       
    47     //none
       
    48 //  LOCAL CONSTANTS AND MACROS
       
    49     //none
       
    50 
       
    51 //  MODULE DATA STRUCTURES
       
    52     //none
       
    53 
       
    54 // LOCAL FUNCTION PROTOTYPES
       
    55     //none
       
    56 
       
    57 // FORWARD DECLARATIONS
       
    58     //none
       
    59 
       
    60 // ============================= LOCAL FUNCTIONS ===============================
       
    61     //none
       
    62 
       
    63 // ============================ MEMBER FUNCTIONS ===============================
       
    64 
       
    65 // -----------------------------------------------------------------------------
       
    66 // CMmBroadMessHandler::CMmBroadMessHandler
       
    67 // C++ constructor
       
    68 // -----------------------------------------------------------------------------
       
    69 //
       
    70 CMmBroadMessHandler::CMmBroadMessHandler()
       
    71     {
       
    72 TFLOGSTRING("TSY: CMmBroadMessHandler::CMmBroadMessHandler");
       
    73 OstTrace0( TRACE_NORMAL, CMMBROADMESSHANDLER_CMMBROADMESSHANDLER, "CMmBroadMessHandler::CMmBroadMessHandler" );
       
    74     }
       
    75 
       
    76 // -----------------------------------------------------------------------------
       
    77 // CMmSmsMessHandler::ConstructL
       
    78 // Symbian 2nd phase constructor can leave.
       
    79 // -----------------------------------------------------------------------------
       
    80 //
       
    81 void CMmBroadMessHandler::ConstructL()
       
    82     {
       
    83 TFLOGSTRING("TSY: CMmBroadMessHandler::ConstructL");
       
    84 OstTrace0( TRACE_NORMAL, CMMBROADMESSHANDLER_CONSTRUCTL, "CMmBroadMessHandler::ConstructL" );
       
    85     // Initialise the array. Maximun of pages in a WCDMA CBS message is 15
       
    86     iCbsMsg = new( ELeave ) CArrayPtrFlat< TWcdmaCbsMsg >( 10 );
       
    87     }
       
    88 
       
    89 // -----------------------------------------------------------------------------
       
    90 // CMmBroadMessHandler:: NewL
       
    91 // Two-phased constructor.
       
    92 // Creates a new MessageHandler object instance
       
    93 // -----------------------------------------------------------------------------
       
    94 //
       
    95 CMmBroadMessHandler* CMmBroadMessHandler::NewL
       
    96     (
       
    97     CMmPhoNetSender* aPhoNetSender,     // a pointer to the PhonetSender
       
    98     CMmPhoNetReceiver* aPhoNetReceiver, // a pointer to the phonetReceiver
       
    99     CMmMessageRouter* aMessageRouter    // a pointer to the Message router
       
   100     )
       
   101     {
       
   102 TFLOGSTRING("TSY: CMmBroadMessHandler::NewL");
       
   103 OstTrace0( TRACE_NORMAL, CMMBROADMESSHANDLER_NEWL, "CMmBroadMessHandler::NewL" );
       
   104     CMmBroadMessHandler* mmBroadMessHandler =
       
   105         new( ELeave ) CMmBroadMessHandler();
       
   106 
       
   107     CleanupStack::PushL( mmBroadMessHandler );
       
   108     mmBroadMessHandler->iPhoNetSender = aPhoNetSender;
       
   109     mmBroadMessHandler->iMessageRouter = aMessageRouter;
       
   110 
       
   111     aPhoNetReceiver->RegisterL(
       
   112         mmBroadMessHandler,
       
   113         PN_SMS,
       
   114         SMS_CB_ROUTING_RESP );
       
   115     aPhoNetReceiver->RegisterL(
       
   116         mmBroadMessHandler,
       
   117         PN_SMS,
       
   118         SMS_CB_ROUTING_IND );
       
   119 
       
   120     mmBroadMessHandler->ConstructL();
       
   121     CleanupStack::Pop( mmBroadMessHandler );
       
   122 
       
   123     return mmBroadMessHandler;
       
   124     }
       
   125 
       
   126 // -----------------------------------------------------------------------------
       
   127 // CMmBroadMessHandler:: ~CMmBroadMessHandler
       
   128 // C++ destructor destroys all objects which are used
       
   129 // -----------------------------------------------------------------------------
       
   130 //
       
   131 CMmBroadMessHandler::~CMmBroadMessHandler()
       
   132     {
       
   133 TFLOGSTRING("TSY: CMmBroadMessHandler::~CMmBroadMessHandler");
       
   134 OstTrace0( TRACE_NORMAL, DUP1_CMMBROADMESSHANDLER_CMMBROADMESSHANDLER, "CMmBroadMessHandler::~CMmBroadMessHandler" );
       
   135     if ( iCbsMsg )
       
   136         {
       
   137         iCbsMsg->ResetAndDestroy();
       
   138         delete iCbsMsg;
       
   139         }
       
   140     }
       
   141 
       
   142 // -----------------------------------------------------------------------------
       
   143 // CMmBroadMessHandler:: ReceiveMessageL
       
   144 // Called by PhonetReceiver when an ISI message has been received
       
   145 // -----------------------------------------------------------------------------
       
   146 //
       
   147 void CMmBroadMessHandler::ReceiveMessageL( const TIsiReceiveC& aIsiMessage )
       
   148     {
       
   149     TUint8 resource( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_RESOURCEID ) );
       
   150     TUint8 messageId( aIsiMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) );
       
   151 
       
   152 TFLOGSTRING3("TSY: CMmBroadMessHandler::ReceiveMessageL. Resource:%d, MsgId:%d", resource,messageId);
       
   153 OstTraceExt2( TRACE_NORMAL, CMMBROADMESSHANDLER_RECEIVEMESSAGEL, "CMmBroadMessHandler::ReceiveMessageL;resource=%hhd;messageId=%hhx", resource, messageId );
       
   154 
       
   155     switch ( resource )
       
   156         {
       
   157         case PN_SMS:
       
   158             {
       
   159 TFLOGSTRING("TSY: CMmBroadMessHandler::ReceiveMessageL - PN_SMS");
       
   160 OstTrace0( TRACE_NORMAL, DUP1_CMMBROADMESSHANDLER_RECEIVEMESSAGEL, "CMmBroadMessHandler::ReceiveMessageL - PN_SMS" );
       
   161 
       
   162             switch( messageId )
       
   163                 {
       
   164                 case SMS_CB_ROUTING_RESP:
       
   165                     {
       
   166                     SmsCbRoutingResp( aIsiMessage );
       
   167                     break;
       
   168                     }
       
   169                 case SMS_CB_ROUTING_IND:
       
   170                     {
       
   171                     SmsCbRoutingIndL( aIsiMessage );
       
   172                     break;
       
   173                     }
       
   174                 default:
       
   175                     {
       
   176 TFLOGSTRING("TSY: CMmBroadMessHandler::ReceiveMessageL - PN_SMS - default");
       
   177 OstTrace0( TRACE_NORMAL, DUP3_CMMBROADMESSHANDLER_RECEIVEMESSAGEL, "CMmBroadMessHandler::ReceiveMessageL - PN_SMS - default" );
       
   178                     // No appropriate handler methods for ISI-message found.
       
   179                     break;
       
   180                     }
       
   181                 }
       
   182             break;
       
   183             }
       
   184         default:
       
   185             {
       
   186 TFLOGSTRING("TSY: CMmBroadMessHandler::ReceiveMessageL. Switch resource case default");
       
   187 OstTrace0( TRACE_NORMAL, DUP2_CMMBROADMESSHANDLER_RECEIVEMESSAGEL, "CMmBroadMessHandler::ReceiveMessageL. Switch resource case default" );
       
   188             // No appropriate handler methods for ISI-message found.
       
   189             break;
       
   190             }
       
   191         }
       
   192     return;
       
   193     }
       
   194 
       
   195 
       
   196 // -----------------------------------------------------------------------------
       
   197 // CMmBroadMessHandler:: SmsCbRoutingRequest
       
   198 // Send CB message routing request to the SMS server
       
   199 // -----------------------------------------------------------------------------
       
   200 //
       
   201 TInt CMmBroadMessHandler::SmsCbRoutingRequest
       
   202     (
       
   203     TUint8 aTransId, // Transaction ID
       
   204     const CMmDataPackage* aDataPackage // Data Package
       
   205     )
       
   206     {
       
   207 TFLOGSTRING("TSY: CMmBroadMessHandler::SmsCbRoutingRequest");
       
   208 OstTrace0( TRACE_NORMAL, CMMBROADMESSHANDLER_SMSCBROUTINGREQUEST, "CMmBroadMessHandler::SmsCbRoutingRequest" );
       
   209 
       
   210     // Variable for the routing command initialized
       
   211     TUint8 routingCommand( 0 );
       
   212     // Contents of the data package
       
   213     TCbsCbmiAndLangAndFilter data;
       
   214     // Unpack data
       
   215     aDataPackage->UnPackData( data );
       
   216 
       
   217     if ( RMobileBroadcastMessaging::EBroadcastAcceptNone == data.iSetting )
       
   218         {
       
   219         // Release routing
       
   220 TFLOGSTRING("TSY:CMmBroadMessHandler::SmsCbRoutingRequest:CB routing will be released.");
       
   221 OstTrace0( TRACE_NORMAL, DUP1_CMMBROADMESSHANDLER_SMSCBROUTINGREQUEST, "CMmBroadMessHandler::SmsCbRoutingRequest:CB routing will be released." );
       
   222         routingCommand = SMS_ROUTING_RELEASE;
       
   223         }
       
   224     else if ( RMobileBroadcastMessaging::EBroadcastAcceptAll == data.iSetting )
       
   225         {
       
   226         // Activate routing
       
   227 TFLOGSTRING("TSY:CMmBroadMessHandler::SmsCbRoutingRequest:CB routing will be activated.");
       
   228 OstTrace0( TRACE_NORMAL, DUP2_CMMBROADMESSHANDLER_SMSCBROUTINGREQUEST, "CMmBroadMessHandler::SmsCbRoutingRequest:CB routing will be activated." );
       
   229         routingCommand = SMS_ROUTING_SET;
       
   230         }
       
   231     else
       
   232         {
       
   233 TFLOGSTRING2("TSY:CMmBroadMessHandler::SmsCbRoutingRequest:Unsupported filter 0x%x.",data.iSetting);
       
   234 // Following lines flagged out just get rid of compiler warning when trace
       
   235 // compiler is not in use.
       
   236 #ifdef OST_TRACE_COMPILER_IN_USE
       
   237         TUint tempValue = data.iSetting; // Parameter just for tracing
       
   238 OstTraceExt1( TRACE_NORMAL, DUP3_CMMBROADMESSHANDLER_SMSCBROUTINGREQUEST, "CMmBroadMessHandler::SmsCbRoutingRequest;data.iSetting=%hhx", tempValue );
       
   239 #endif // OST_TRACE_COMPILER_IN_USE
       
   240         return KErrArgument;
       
   241         }
       
   242 
       
   243     // Create a buffer to hold the request
       
   244     TBuf8<SIZE_SMS_CB_ROUTING_REQ> dataBuffer;
       
   245     dataBuffer.Append( routingCommand ); // Routing command
       
   246     dataBuffer.Append( SMS_NEW_SUBSCRIPTION  ); // Subscription number
       
   247     dataBuffer.Append( SMS_TYPE_DEFAULT ); // Subscription type
       
   248     dataBuffer.Append( KBroadPadding ); // Filler
       
   249     dataBuffer.Append( KBroadPadding ); // Filler
       
   250     dataBuffer.Append( 0 ); // Number of subblocks
       
   251 
       
   252     return iPhoNetSender->Send(
       
   253         PN_SMS,
       
   254         aTransId,
       
   255         SMS_CB_ROUTING_REQ,
       
   256         dataBuffer );
       
   257    }
       
   258 
       
   259 
       
   260 // -----------------------------------------------------------------------------
       
   261 // CMmBroadMessHandler:: SmsCbRoutingResp
       
   262 // Response for SmsCbRoutingReq.
       
   263 // Response doesn't include CB message
       
   264 // -----------------------------------------------------------------------------
       
   265 //
       
   266 void CMmBroadMessHandler::SmsCbRoutingResp
       
   267     (
       
   268     const TIsiReceiveC& aSmsCbRoutingResp // Received isimsg
       
   269     )
       
   270     {
       
   271 TFLOGSTRING("TSY: CMmBroadMessHandler::SmsCbRoutingResp");
       
   272 OstTrace0( TRACE_NORMAL, CMMBROADMESSHANDLER_SMSGSMCBROUTINGRESP, "CMmBroadMessHandler::SmsCbRoutingResp" );
       
   273     TInt ipc( 0 ); // Initialize to zero
       
   274 
       
   275     TUint8 isiCause( aSmsCbRoutingResp.Get8bit( ISI_HEADER_SIZE
       
   276         + SMS_CB_ROUTING_RESP_OFFSET_SMSCAUSE ) );
       
   277 
       
   278     TInt cause( CMmStaticUtility::CSCauseToEpocError(
       
   279         PN_SMS,
       
   280         SMS_CAUSE_TYPE_COMMON,
       
   281         isiCause ) );
       
   282 
       
   283     TUint8 traid( aSmsCbRoutingResp.Get8bit( ISI_HEADER_SIZE
       
   284         + SMS_CB_ROUTING_RESP_OFFSET_TRANSID ) );
       
   285 
       
   286     // Response for SmsGsmCbRoutingReq (receive message)
       
   287     if ( EBroadcastMessagingReceiveMessage == traid )
       
   288         {
       
   289         ipc = EMobileBroadcastMessagingReceiveMessage;
       
   290         }
       
   291     // Response for SmsGsmCbRoutingReq (receive message cancel)
       
   292     else if ( EBroadcastMessagingReceiveMessageCancel == traid )
       
   293         {
       
   294         ipc = EMobileBroadcastMessagingReceiveMessageCancel;
       
   295         }
       
   296     // Response for SmsGsmCbRoutingReq (set filter setting)
       
   297     else if ( EBroadcastMessagingSetFilterSetting == traid )
       
   298         {
       
   299         ipc = EMobileBroadcastMessagingSetFilterSetting;
       
   300         }
       
   301 
       
   302     // Complete status change indication, if ipc is set
       
   303     if ( 0 != ipc )
       
   304         {
       
   305         iMessageRouter->Complete( ipc, cause );
       
   306         }
       
   307 
       
   308     return;
       
   309     }
       
   310 
       
   311 // -----------------------------------------------------------------------------
       
   312 // CMmBroadMessHandler:: SmsCbRoutingInd
       
   313 // Incoming CB message. When the SMS Server receives a CB message
       
   314 // from the network and routing of this CB message has been
       
   315 // accepted, the server shall send message to the client
       
   316 // -----------------------------------------------------------------------------
       
   317 //
       
   318 void CMmBroadMessHandler::SmsCbRoutingIndL
       
   319     (
       
   320     const TIsiReceiveC& aSmsCbRoutingInd // Received ISI message
       
   321     )
       
   322     {
       
   323 TFLOGSTRING("TSY: CMmBroadMessHandler::SmsCbRoutingInd");
       
   324 OstTrace0( TRACE_NORMAL, CMMBROADMESSHANDLER_SMSGSMCBROUTINGNTFL, "CMmBroadMessHandler::SmsCbRoutingIndL" );
       
   325 
       
   326     CMmDataPackage data;
       
   327     TInt error ( KErrNone );
       
   328 
       
   329     // Get the number of subblocks
       
   330     TUint sbNumber( aSmsCbRoutingInd.Get8bit( ISI_HEADER_SIZE
       
   331         + SMS_CB_ROUTING_IND_OFFSET_SUBBLOCKCOUNT ) );
       
   332 
       
   333     // Check the info length of the 1st SMS_SB_CB_MESSAGE subblock to
       
   334     // know if it is a WCDMA CBS message or a GSM one
       
   335     TUint firstSbOffset( 0 );
       
   336     TInt sbFound( aSmsCbRoutingInd.FindSubBlockOffsetById(
       
   337         ISI_HEADER_SIZE + SIZE_SMS_CB_ROUTING_IND,
       
   338         SMS_SB_CB_MESSAGE,
       
   339         EIsiSubBlockTypeId16Len16,
       
   340         firstSbOffset ) );
       
   341 
       
   342     TUint8 infoLength( SMS_CB_MESSAGE_CONTENT_SIZE + 1 ); // Illegal value
       
   343     if ( KErrNone == sbFound )
       
   344         {
       
   345         infoLength = aSmsCbRoutingInd.Get8bit( firstSbOffset
       
   346             + SMS_SB_CB_MESSAGE_OFFSET_INFOLENGTH );
       
   347         }
       
   348 
       
   349 TFLOGSTRING2("TSY: CMmBroadMessHandler::SmsCbRoutingIndL. infoLength:%d",infoLength);
       
   350 OstTraceExt1( TRACE_NORMAL, DUP1_CMMBROADMESSHANDLER_SMSGSMCBROUTINGNTFL, "CMmBroadMessHandler::SmsCbRoutingIndL;infoLength=%hhu", infoLength );
       
   351 
       
   352     // Reset and destroy the array
       
   353     iCbsMsg->ResetAndDestroy();
       
   354 
       
   355     // GSM mode, don't care of info length
       
   356     if ( KInfoLengthIgnored == infoLength )
       
   357         {
       
   358         // GSM CB Message. First SMS_SB_CB_MESSAGE sub block is the only one.
       
   359         TGsmCbsMsg cbsMsg;
       
   360 
       
   361         // Get serial number
       
   362         TUint16 serialNumber( aSmsCbRoutingInd.Get16bit( firstSbOffset
       
   363             + SMS_SB_CB_MESSAGE_OFFSET_SERIALNUMBER ) );
       
   364         // Append MSB bits from serial number
       
   365         cbsMsg.iCbsMsg.Append( serialNumber >> 8 );
       
   366         // Append LSB bits from serial number
       
   367         cbsMsg.iCbsMsg.Append( serialNumber & 0x00FF );
       
   368 
       
   369         // Get message ID
       
   370         TUint16 messageId( aSmsCbRoutingInd.Get16bit( firstSbOffset
       
   371             + SMS_SB_CB_MESSAGE_OFFSET_CBMESSAGEID ) );
       
   372         // Append MSB bits from message ID
       
   373         cbsMsg.iCbsMsg.Append( messageId >> 8 );
       
   374         // Append LSB bits from message ID
       
   375         cbsMsg.iCbsMsg.Append( messageId & 0x00FF );
       
   376 
       
   377         // Data coding scheme
       
   378         cbsMsg.iCbsMsg.Append( aSmsCbRoutingInd.Get8bit( firstSbOffset
       
   379             + SMS_SB_CB_MESSAGE_OFFSET_DATACODINGSCHEME ) );
       
   380 
       
   381         // Number of pages
       
   382         cbsMsg.iCbsMsg.Append( aSmsCbRoutingInd.Get8bit( firstSbOffset
       
   383             + SMS_SB_CB_MESSAGE_OFFSET_PAGE ) );
       
   384 
       
   385         // Content of the message
       
   386         cbsMsg.iCbsMsg.Append( aSmsCbRoutingInd.GetData( firstSbOffset
       
   387             + SMS_SB_CB_MESSAGE_OFFSET_CONTENTOFMESSAGE,
       
   388             SMS_CB_MESSAGE_CONTENT_SIZE ) );
       
   389 
       
   390         // Pack data
       
   391         data.PackData( &cbsMsg );
       
   392 
       
   393         // Complete
       
   394         iMessageRouter->Complete(
       
   395             EMmTsyGsmBroadcastNotifyMessageReceived,
       
   396             &data,
       
   397             error );
       
   398         }
       
   399 
       
   400     // WCDMA mode,take care of info length and number of subblocks should be
       
   401     // less or equal to 15
       
   402     else if ( ( SMS_CB_MESSAGE_CONTENT_SIZE >= infoLength )
       
   403         && ( KWcdmaCbsNumberOfSbMax >= sbNumber ) )
       
   404         {
       
   405         TUint currSbOffset( firstSbOffset );
       
   406         // Loop through the SMS_SB_CB_MESSAGE sub blocks.
       
   407         for ( TInt i( 0 ); i < sbNumber; i++)
       
   408             {
       
   409             TWcdmaCbsMsg* wcdmaCbsMsg = new ( ELeave ) TWcdmaCbsMsg;
       
   410             CleanupStack::PushL( wcdmaCbsMsg );
       
   411 
       
   412             // Total number of subblocks in SMS_CB_ROUTING_IND
       
   413             wcdmaCbsMsg->iSbNumber = sbNumber;
       
   414 
       
   415             // Serial number
       
   416             wcdmaCbsMsg->iSerialNum = aSmsCbRoutingInd.Get16bit(
       
   417                 currSbOffset + SMS_SB_CB_MESSAGE_OFFSET_SERIALNUMBER );
       
   418 
       
   419             // Message ID
       
   420             wcdmaCbsMsg->iMessageId = aSmsCbRoutingInd.Get16bit(
       
   421                 currSbOffset + SMS_SB_CB_MESSAGE_OFFSET_CBMESSAGEID );
       
   422 
       
   423             // Data coding scheme
       
   424             wcdmaCbsMsg->iDCS = aSmsCbRoutingInd.Get8bit(
       
   425                 currSbOffset + SMS_SB_CB_MESSAGE_OFFSET_DATACODINGSCHEME );
       
   426 
       
   427             // Number of pages
       
   428             wcdmaCbsMsg->iNumberOfPages = static_cast<TInt>(
       
   429                 aSmsCbRoutingInd.Get8bit(
       
   430                     currSbOffset + SMS_SB_CB_MESSAGE_OFFSET_PAGE ) );
       
   431 
       
   432             // Information length
       
   433             wcdmaCbsMsg->iInfoLength = aSmsCbRoutingInd.Get8bit(
       
   434                 currSbOffset + SMS_SB_CB_MESSAGE_OFFSET_INFOLENGTH );
       
   435 
       
   436             // Message type is here CBS Message
       
   437             // (see spec 3GPP 25.324 v6.1 chapter 11.1.2)
       
   438             wcdmaCbsMsg->iMessageType = KCbsMessageType;
       
   439 
       
   440             // Content of the message
       
   441             TBuf8<RMobileBroadcastMessaging::KBroadcastPageSize>
       
   442                 wcdmaCbsDataTemp = aSmsCbRoutingInd.GetData(
       
   443                 currSbOffset + SMS_SB_CB_MESSAGE_OFFSET_CONTENTOFMESSAGE,
       
   444                 SMS_CB_MESSAGE_CONTENT_SIZE );
       
   445 
       
   446             // Append data portion from beginning to info length
       
   447             wcdmaCbsMsg->iWcdmaCbsData.Append(
       
   448                 wcdmaCbsDataTemp.Mid ( 0, wcdmaCbsMsg->iInfoLength ) );
       
   449 
       
   450             iCbsMsg->AppendL( wcdmaCbsMsg );
       
   451 
       
   452             currSbOffset += SIZE_SMS_SB_CB_MESSAGE;
       
   453 
       
   454             // Pop wcdmaCbsMsg but don't destroy it
       
   455             CleanupStack::Pop( wcdmaCbsMsg );
       
   456             //note: Lint doesn't understand the use of PopAndDestroy and 'thinks'
       
   457             //that there is a memory leak for wcdmaCbsMsg, we disable that warning with
       
   458             //the following command
       
   459             //lint -e429
       
   460             }
       
   461 
       
   462         // Pack data
       
   463         data.PackData( &iCbsMsg, &sbNumber );
       
   464 
       
   465         // Complete
       
   466         iMessageRouter->Complete(
       
   467             EMmTsyWcdmaBroadcastNotifyMessageReceived,
       
   468             &data,
       
   469             error );
       
   470         }
       
   471     else    // Illegal value ( e.g network is not working correctly )
       
   472         {
       
   473 TFLOGSTRING("TSY: CMmBroadMessHandler::SmsGsmCbRoutingNtfL illegal value (e.g network problem )");
       
   474 OstTrace0( TRACE_NORMAL, DUP2_CMMBROADMESSHANDLER_SMSGSMCBROUTINGNTFL, "CMmBroadMessHandler::SmsGsmCbRoutingNtfL-illegal value (e.g network problem" );
       
   475 
       
   476         error = KErrGeneral;
       
   477         // Complete. We could complete with either ipc
       
   478         // EMmTsyWcdmaBroadcastNotifyMessageReceived or
       
   479         // EMmTsyGsmBroadcastNotifyMessageReceived but as it doesn't matter,
       
   480         // we arbitrarily decide to complete with a GSM CBS ipc
       
   481         iMessageRouter->Complete(
       
   482             EMmTsyGsmBroadcastNotifyMessageReceived,
       
   483             &data,
       
   484             error );
       
   485         }
       
   486     return;
       
   487     }
       
   488 
       
   489 // -----------------------------------------------------------------------------
       
   490 // CMmBroadMessHandler::ExtFuncL
       
   491 // Dispatches Etel requests to DOS level handlers
       
   492 // -----------------------------------------------------------------------------
       
   493 //
       
   494 TInt CMmBroadMessHandler::ExtFuncL
       
   495     (
       
   496     TInt aIpc, // IPC number
       
   497     const CMmDataPackage* aDataPackage // packed data
       
   498     )
       
   499     {
       
   500 TFLOGSTRING("TSY: CMmBroadMessHandler::ExtFuncL");
       
   501 OstTrace0( TRACE_NORMAL, CMMBROADMESSHANDLER_EXTFUNCL, "CMmBroadMessHandler::ExtFuncL" );
       
   502     TInt ret( KErrNone );
       
   503 
       
   504     TUint8 transId( 0 ); // Initialize to zero
       
   505 
       
   506     switch ( aIpc )
       
   507         {
       
   508         case EMobileBroadcastMessagingReceiveMessage:
       
   509             {
       
   510             transId = EBroadcastMessagingReceiveMessage;
       
   511             break;
       
   512             }
       
   513         case EMobileBroadcastMessagingReceiveMessageCancel:
       
   514             {
       
   515             transId = EBroadcastMessagingReceiveMessageCancel;
       
   516             break;
       
   517             }
       
   518         case EMobileBroadcastMessagingSetFilterSetting:
       
   519             {
       
   520             transId = EBroadcastMessagingSetFilterSetting;
       
   521             break;
       
   522             }
       
   523         default:
       
   524             {
       
   525             // This method should only be called for Broadcast cases
       
   526 TFLOGSTRING2("TSY: CMmBroadMessHandler::ExtFuncL - Unknown IPC: %d", aIpc);
       
   527 OstTrace1( TRACE_NORMAL, DUP1_CMMBROADMESSHANDLER_EXTFUNCL, "CMmBroadMessHandler::ExtFuncL;aIpc=%d", aIpc );
       
   528             ret = KErrArgument;
       
   529             break;
       
   530             }
       
   531         }
       
   532     if ( EBroadcastMessagingUnknown != transId )
       
   533         {
       
   534         ret = SmsCbRoutingRequest( transId, aDataPackage );
       
   535         }
       
   536     return ret;
       
   537     }
       
   538 
       
   539 
       
   540 // End of the file
       
   541