adaptationlayer/tsy/nokiatsy_dll/src/cmmconferencecallmesshandler.cpp
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
equal deleted inserted replaced
-1:000000000000 0:63b37f68c1ce
       
     1 /*
       
     2 * Copyright (c) 2007-2008 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 // INCLUDE FILES
       
    21 #include "cmmphonetsender.h"
       
    22 #include "cmmconferencecallmesshandler.h"
       
    23 #include "cmmstaticutility.h"
       
    24 #include "cmmcallmesshandler.h"
       
    25 #include "cmmmessagerouter.h"
       
    26 #include "tsylogger.h"
       
    27 #include "osttracedefinitions.h"
       
    28 
       
    29 #include <etelmm.h>
       
    30 #include <tisi.h>
       
    31 #include <call_modemisi.h>
       
    32 #include <ctsy/pluginapi/cmmdatapackage.h>
       
    33 
       
    34 #ifdef OST_TRACE_COMPILER_IN_USE
       
    35 #include "cmmconferencecallmesshandlertraces.h"
       
    36 #endif
       
    37 
       
    38 // EXTERNAL DATA STRUCTURES
       
    39     // None
       
    40 
       
    41 // EXTERNAL FUNCTION PROTOTYPES
       
    42     // None
       
    43 
       
    44 // CONSTANTS
       
    45 const TUint8 KConfCallPadding = 0x00; // Filler byte for ISI messages
       
    46 
       
    47 // MACROS
       
    48     // None
       
    49 
       
    50 // LOCAL CONSTANTS AND MACROS
       
    51     // None
       
    52 
       
    53 // MODULE DATA STRUCTURES
       
    54     // None
       
    55 
       
    56 // LOCAL FUNCTION PROTOTYPES
       
    57     // None
       
    58 
       
    59 // ======================= LOCAL FUNCTIONS =====================================
       
    60     // None
       
    61 
       
    62 // ==================== MEMBER FUNCTIONS =======================================
       
    63 
       
    64 // -----------------------------------------------------------------------------
       
    65 // CMmConferenceCallMessHandler::CMmConferenceCallMessHandler
       
    66 // C++ default constructor
       
    67 // -----------------------------------------------------------------------------
       
    68 //
       
    69 CMmConferenceCallMessHandler::CMmConferenceCallMessHandler()
       
    70     {
       
    71     // None
       
    72 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CMmConferenceCallMessHandler");
       
    73 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CMMCONFERENCECALLMESSHANDLER, "CMmConferenceCallMessHandler::CMmConferenceCallMessHandler" );
       
    74     }
       
    75 
       
    76 // -----------------------------------------------------------------------------
       
    77 // CMmConferenceCallMessHandler::NewL
       
    78 // Creates a new CMmConferenceCallMessHandler object instance.
       
    79 // -----------------------------------------------------------------------------
       
    80 //
       
    81 CMmConferenceCallMessHandler* CMmConferenceCallMessHandler::NewL(
       
    82     CMmPhoNetSender* aPhoNetSender, //pointer to the phonet sender
       
    83     CMmPhoNetReceiver* aPhoNetReceiver, //pointer to the phonet receiver
       
    84     CMmMessageRouter* aMessageRouter// pointer to the message router
       
    85     )
       
    86     {
       
    87 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::NewL");
       
    88 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_NEWL, "CMmConferenceCallMessHandler::NewL" );
       
    89 
       
    90     CMmConferenceCallMessHandler* conferenceCallMessHandler =
       
    91         new ( ELeave ) CMmConferenceCallMessHandler();
       
    92 
       
    93     CleanupStack::PushL( conferenceCallMessHandler );
       
    94     conferenceCallMessHandler->iPhoNetSender = aPhoNetSender;
       
    95     conferenceCallMessHandler->iMessageRouter = aMessageRouter;
       
    96     conferenceCallMessHandler->ConstructL();
       
    97 
       
    98     aPhoNetReceiver->RegisterL(
       
    99         conferenceCallMessHandler,
       
   100         PN_MODEM_CALL,
       
   101         CALL_MODEM_CONTROL_IND );
       
   102     aPhoNetReceiver->RegisterL(
       
   103         conferenceCallMessHandler,
       
   104         PN_MODEM_CALL,
       
   105         CALL_MODEM_CONTROL_RESP );
       
   106     aPhoNetReceiver->RegisterL(
       
   107         conferenceCallMessHandler,
       
   108         PN_MODEM_CALL,
       
   109         CALL_MODEM_RELEASE_RESP );
       
   110 
       
   111     CleanupStack::Pop( conferenceCallMessHandler );
       
   112 
       
   113     return conferenceCallMessHandler;
       
   114     }
       
   115 
       
   116 // -----------------------------------------------------------------------------
       
   117 // CMmConferenceCallMessHandler::ConstructL
       
   118 // Initialises object attributes.
       
   119 // -----------------------------------------------------------------------------
       
   120 //
       
   121 void CMmConferenceCallMessHandler::ConstructL()
       
   122     {
       
   123 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::ConstructL");
       
   124 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CONSTRUCTL, "CMmConferenceCallMessHandler::ConstructL" );
       
   125 
       
   126     iIsCreateConference = EFalse;
       
   127     iLastOperation = 0;
       
   128     }
       
   129 
       
   130 // -----------------------------------------------------------------------------
       
   131 // CMmConferenceCallMessHandler::~CMmConferenceCallMessHandler
       
   132 // C++ destructor
       
   133 // -----------------------------------------------------------------------------
       
   134 //
       
   135 CMmConferenceCallMessHandler::~CMmConferenceCallMessHandler()
       
   136     {
       
   137 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::~CMmConferenceCallMessHandler");
       
   138 OstTrace0( TRACE_NORMAL, DUP1_CMMCONFERENCECALLMESSHANDLER_CMMCONFERENCECALLMESSHANDLER, "CMmConferenceCallMessHandler::~CMmConferenceCallMessHandler" );
       
   139     }
       
   140 
       
   141 // -----------------------------------------------------------------------------
       
   142 // CMmConferenceCallMessHandler::ExtFuncL
       
   143 // Forwards requests coming from the Symbian OS layer to the
       
   144 // specific method.
       
   145 // -----------------------------------------------------------------------------
       
   146 //
       
   147 TInt CMmConferenceCallMessHandler::ExtFuncL(
       
   148     TInt aIpc,
       
   149     const CMmDataPackage* aDataPackage )
       
   150     {
       
   151 TFLOGSTRING2("TSY: CMmConferenceCallMessHandler::ExtFuncL. Ipc:%d", aIpc);
       
   152 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_EXTFUNCL, "CMmConferenceCallMessHandler::ExtFuncL" );
       
   153 
       
   154     TInt ret( KErrNone );
       
   155     TUint8 transId( KConferenceCallTransId );
       
   156 
       
   157     switch( aIpc )
       
   158         {
       
   159         case EMobileConferenceCallAddCall:
       
   160             {
       
   161             // A CCallDataPackage is expected here
       
   162             const CCallDataPackage* callDataPackage =
       
   163                 static_cast<const CCallDataPackage*>( aDataPackage );
       
   164 
       
   165             TUint8 isaCallId( CALL_MODEM_ID_NONE );
       
   166             TInt eTelCallId( KSymbianCallIdNone );
       
   167             RMobilePhone::TMobileService service(
       
   168                 RMobilePhone::EServiceUnspecified );
       
   169             // Unpack ETel call ID parameter
       
   170             callDataPackage->GetCallIdAndMode( eTelCallId, service );
       
   171             // Map to ISA call ID
       
   172             isaCallId = MapETelCallIdToISACallId( eTelCallId );
       
   173             if ( CALL_MODEM_ID_NONE == isaCallId )
       
   174                 {
       
   175                 ret = KErrArgument;
       
   176                 }
       
   177             else
       
   178                 {
       
   179                 ret = CallControlReq(
       
   180                     transId,
       
   181                     isaCallId,
       
   182                     CALL_MODEM_OP_CONFERENCE_BUILD,
       
   183                     EFalse );
       
   184                 }
       
   185             break;
       
   186             }
       
   187         case EMobileConferenceCallCreateConference:
       
   188             {
       
   189             // No data to unpack
       
   190             ret = CallControlReq(
       
   191                 transId,
       
   192                 CALL_MODEM_ID_ACTIVE,
       
   193                 CALL_MODEM_OP_CONFERENCE_BUILD,
       
   194                 ETrue );
       
   195             break;
       
   196             }
       
   197         case EMobileConferenceCallSwap:
       
   198             {
       
   199             // No data to unpack
       
   200             ret = CallControlReq(
       
   201                 transId,
       
   202                 CALL_MODEM_ID_ACTIVE,
       
   203                 CALL_MODEM_OP_SWAP,
       
   204                 EFalse );
       
   205             break;
       
   206             }
       
   207         case EMobileConferenceCallHangUp:
       
   208             {
       
   209             // No data to unpack
       
   210             ret = CallReleaseReq(
       
   211                 transId,
       
   212                 CALL_MODEM_ID_CONFERENCE,
       
   213                 CALL_MODEM_CAUSE_RELEASE_BY_USER );
       
   214             break;
       
   215             }
       
   216         // No DOS call is required for the following Conference Call IPCs:
       
   217         // Notifications
       
   218         case EMobileConferenceCallNotifyCapsChange:
       
   219         case EMobileConferenceCallNotifyConferenceStatusChange:
       
   220         case EMobileConferenceCallNotifyConferenceEvent:
       
   221         // Cancellations
       
   222         case EMobileConferenceCallNotifyCapsChangeCancel:
       
   223         case EMobileConferenceCallCreateConferenceCancel:
       
   224         case EMobileConferenceCallAddCallCancel:
       
   225         case EMobileConferenceCallSwapCancel:
       
   226         case EMobileConferenceCallHangUpCancel:
       
   227         case EMobileConferenceCallNotifyConferenceStatusChangeCancel:
       
   228         case EMobileConferenceCallNotifyConferenceEventCancel:
       
   229         // Query methods (do not change any state)
       
   230         case EMobileConferenceCallGetCaps:
       
   231         case EMobileConferenceCallEnumerateCalls:
       
   232         case EMobileConferenceCallGetMobileCallInfo:
       
   233         case EMobileConferenceCallGetConferenceStatus:
       
   234         default:
       
   235             {
       
   236 TFLOGSTRING2("TSY: CMmConferenceCallMessHandler::ExtFuncL - Unknown IPC: %d", aIpc);
       
   237 OstTrace1( TRACE_NORMAL, DUP1_CMMCONFERENCECALLMESSHANDLER_EXTFUNCL, "CMmConferenceCallMessHandler::ExtFuncL - Unknown IPC=%d", aIpc );
       
   238             ret = KErrNotSupported;
       
   239             break;
       
   240             }
       
   241         }
       
   242     return ret;
       
   243     }
       
   244 
       
   245 // -----------------------------------------------------------------------------
       
   246 // CMmConferenceCallMessHandler::MapETelCallIdToISACallId
       
   247 // Utility function that maps an ETel call id to a call id
       
   248 // in ISA Call Server's format.
       
   249 // -----------------------------------------------------------------------------
       
   250 //
       
   251 TUint8 CMmConferenceCallMessHandler::MapETelCallIdToISACallId(
       
   252     const TInt aETelCallId )
       
   253     {
       
   254 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::MapETelCallIdToISACallId");
       
   255 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_MAPETELCALLIDTOISACALLID, "CMmConferenceCallMessHandler::MapETelCallIdToISACallId" );
       
   256 
       
   257     TUint8 callId( CALL_MODEM_ID_NONE );
       
   258 
       
   259     if ( CALL_MODEM_ID_1 > aETelCallId || CALL_MODEM_ID_7 < aETelCallId )
       
   260         {
       
   261         callId = CALL_MODEM_ID_NONE;
       
   262         }
       
   263     else
       
   264         {
       
   265         callId = static_cast<TUint8>( aETelCallId );
       
   266         }
       
   267 
       
   268     return callId;
       
   269     }
       
   270 
       
   271 // -----------------------------------------------------------------------------
       
   272 // CMmConferenceCallMessHandler::ReceiveMessageL
       
   273 // Called when an ISI message has been received.
       
   274 // -----------------------------------------------------------------------------
       
   275 //
       
   276 void CMmConferenceCallMessHandler::ReceiveMessageL(
       
   277     const TIsiReceiveC& aIsiMsg )
       
   278     {
       
   279 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::ReceiveMessageL.");
       
   280 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_RECEIVEMESSAGEL, "CMmConferenceCallMessHandler::ReceiveMessageL" );
       
   281 
       
   282     TInt resource( aIsiMsg.Get8bit( ISI_HEADER_OFFSET_RESOURCEID ) );
       
   283     TInt messageId( aIsiMsg.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) );
       
   284 
       
   285     switch( resource )
       
   286         {
       
   287         case PN_MODEM_CALL:
       
   288             {
       
   289             switch( messageId )
       
   290                 {
       
   291                 case CALL_MODEM_CONTROL_IND:
       
   292                     {
       
   293                     CallControlInd( aIsiMsg );
       
   294                     break;
       
   295                     }
       
   296                 case CALL_MODEM_CONTROL_RESP:
       
   297                     {
       
   298                     CallControlResp( aIsiMsg );
       
   299                     break;
       
   300                     }
       
   301                 case CALL_MODEM_RELEASE_RESP:
       
   302                     {
       
   303                     CallReleaseResp( aIsiMsg );
       
   304                     break;
       
   305                     }
       
   306                 default:
       
   307                     {
       
   308 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::ReceiveMessageL. PN_CALL Switch messageID case default.");
       
   309 OstTrace0( TRACE_NORMAL, DUP1_CMMCONFERENCECALLMESSHANDLER_RECEIVEMESSAGEL, "CMmConferenceCallMessHandler::ReceiveMessageL. PN_CALL Switch messageID case default" );
       
   310                     break;
       
   311                     }
       
   312                 }
       
   313             break; // Case PN_CALL
       
   314             }
       
   315         default:
       
   316             {
       
   317 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::ReceiveMessageL. Switch resource case default.");
       
   318 OstTrace0( TRACE_NORMAL, DUP2_CMMCONFERENCECALLMESSHANDLER_RECEIVEMESSAGEL, "CMmConferenceCallMessHandler::ReceiveMessageL. Switch resource case default" );
       
   319             break;
       
   320             }
       
   321         }
       
   322     }
       
   323 
       
   324 // -----------------------------------------------------------------------------
       
   325 // CMmConferenceCallMessHandler::CallControlReq
       
   326 // Sends Conference call related control requests to the Phonet
       
   327 // -----------------------------------------------------------------------------
       
   328 //
       
   329 TInt CMmConferenceCallMessHandler::CallControlReq(
       
   330     TUint8 aTransactionId,
       
   331     TUint8 aCallId,
       
   332     TUint8 aOperation,
       
   333     TBool aIsCreateConference )
       
   334     {
       
   335 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallControlReq");
       
   336 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLCONTROLREQ, "CMmConferenceCallMessHandler::CallControlReq" );
       
   337 
       
   338     // Data for ISI message
       
   339     TBuf8<2 + SIZE_CALL_MODEM_SB_OPERATION> messageBuf;
       
   340 
       
   341     messageBuf.Append( aCallId );
       
   342 
       
   343     messageBuf.Append( 1 ); // Number of Subblocks
       
   344 
       
   345     // Set value if this is conference call creation request or not.
       
   346     iIsCreateConference = aIsCreateConference;
       
   347 
       
   348     // Save control operation
       
   349     iLastOperation = aOperation;
       
   350 
       
   351     // Call control request sub blocks
       
   352     messageBuf.Append( CALL_MODEM_SB_OPERATION );
       
   353     messageBuf.Append( SIZE_CALL_MODEM_SB_OPERATION );
       
   354     messageBuf.Append( aOperation );
       
   355     // Call operation sub block, no operation info used
       
   356     messageBuf.Append( KConfCallPadding ); // Padding
       
   357 
       
   358     // Call conrol req
       
   359     // Send message via phonet
       
   360     return iPhoNetSender->Send(
       
   361         PN_MODEM_CALL,
       
   362         aTransactionId,
       
   363         CALL_MODEM_CONTROL_REQ,
       
   364         messageBuf );
       
   365     }
       
   366 
       
   367 // -----------------------------------------------------------------------------
       
   368 // CMmConferenceCallMessHandler::CallControlResp
       
   369 // Breaks a CALL_MODEM_CONTROL_RESP ISI-message. Completes failed
       
   370 // CreateConference, AddCall or Swap API request if there is a cause sub
       
   371 // block in this response
       
   372 // -----------------------------------------------------------------------------
       
   373 //
       
   374 void CMmConferenceCallMessHandler::CallControlResp(
       
   375     const TIsiReceiveC& aIsiMsg )
       
   376     {
       
   377 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallControlResp");
       
   378 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLCONTROLRESP, "CMmConferenceCallMessHandler::CallControlResp" );
       
   379 
       
   380     TUint sbStartOffSet( 0 );
       
   381 
       
   382     // Try to find CALL_MODEM_SB_CAUSE subblock. If found something has gone wrong.
       
   383     if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
       
   384         ISI_HEADER_SIZE + SIZE_CALL_MODEM_CONTROL_RESP,
       
   385         CALL_MODEM_SB_CAUSE,
       
   386         EIsiSubBlockTypeId8Len8,
       
   387         sbStartOffSet ) )
       
   388         {
       
   389         // CALL_CAUSE sub block found, something has gone wrong.
       
   390         // Get cause type
       
   391         TUint8 causeType( aIsiMsg.Get8bit(
       
   392             sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSETYPE ) );
       
   393         // Get cause value
       
   394         TUint8 causeValue( aIsiMsg.Get8bit(
       
   395             sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSE ) );
       
   396 
       
   397         // Get Symbian OS error value
       
   398         TInt result( CMmStaticUtility::CSCauseToEpocError(
       
   399             PN_MODEM_CALL,
       
   400             causeType,
       
   401             causeValue ) );
       
   402 
       
   403         // If last operation was build, CreateConference or AddCall was asked
       
   404         if ( CALL_MODEM_OP_CONFERENCE_BUILD == iLastOperation )
       
   405             {
       
   406             // Has CreateConference been requested last.
       
   407             if ( iIsCreateConference )
       
   408                 {
       
   409                 // Complete with error
       
   410                 iMessageRouter->Complete(
       
   411                     EMobileConferenceCallCreateConference,
       
   412                     result );
       
   413                 // Reset flag
       
   414                 iIsCreateConference = EFalse;
       
   415                 }
       
   416             else
       
   417                 {
       
   418                 // Must be response to AddCall request
       
   419                 iMessageRouter->Complete(
       
   420                     EMobileConferenceCallAddCall,
       
   421                     result );
       
   422                 }
       
   423             iLastOperation = 0;
       
   424             }
       
   425         // If last operation was hold or retrieve
       
   426         else if ( CALL_MODEM_OP_HOLD == iLastOperation ||
       
   427             CALL_MODEM_OP_RETRIEVE == iLastOperation )
       
   428             {
       
   429             // Complete swap with error
       
   430             iMessageRouter->Complete(
       
   431                 EMobileConferenceCallSwap,
       
   432                 result );
       
   433             }
       
   434         // No else
       
   435         }
       
   436     // No else
       
   437     }
       
   438 
       
   439 // -----------------------------------------------------------------------------
       
   440 // CMmConferenceCallMessHandler::CallControlInd
       
   441 // Breaks a CALL_CONTROL_IND ISI-message. Completes failed
       
   442 // CreateConference, AddCall or Swap API request if there is a cause sub
       
   443 // block in this response. In case that this message contains Split operation
       
   444 // sub block, inform ConferenceCallTsy that GoOneToOne handling has started
       
   445 // -----------------------------------------------------------------------------
       
   446 //
       
   447 void CMmConferenceCallMessHandler::CallControlInd(
       
   448     const TIsiReceiveC& aIsiMsg )
       
   449     {
       
   450 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallControlInd");
       
   451 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLCONTROLIND, "CMmConferenceCallMessHandler::CallControlInd" );
       
   452 
       
   453     TUint sbStartOffSet( 0 );
       
   454 
       
   455     // Try to find CALL_MODEM_SB_CAUSE subblock. If found something has gone wrong
       
   456     if( KErrNone == aIsiMsg.FindSubBlockOffsetById(
       
   457         ISI_HEADER_SIZE + SIZE_CALL_MODEM_CONTROL_IND,
       
   458         CALL_MODEM_SB_CAUSE,
       
   459         EIsiSubBlockTypeId8Len8,
       
   460         sbStartOffSet ) )
       
   461         {
       
   462         // CALL_MODEM_SB_CAUSE sub block found, something has gone wrong.
       
   463         // Get cause type
       
   464         TUint8 causeType( aIsiMsg.Get8bit(
       
   465             sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSETYPE ) );
       
   466         // Get cause value
       
   467         TUint8 causeValue( aIsiMsg.Get8bit(
       
   468             sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSE ) );
       
   469 
       
   470         // Get Symbian OS error value
       
   471         TInt result( CMmStaticUtility::CSCauseToEpocError(
       
   472             PN_MODEM_CALL,
       
   473             causeType,
       
   474             causeValue ) );
       
   475 
       
   476         // If last operation was build, CreateConference or AddCall was asked
       
   477         if ( CALL_MODEM_OP_CONFERENCE_BUILD == iLastOperation )
       
   478             {
       
   479             // Has CreateConference been requested last.
       
   480             if ( iIsCreateConference )
       
   481                 {
       
   482                 // Complete with error
       
   483                 iMessageRouter->Complete(
       
   484                     EMobileConferenceCallCreateConference,
       
   485                     result);
       
   486                 // Reset flag
       
   487                 iIsCreateConference = EFalse;
       
   488                 }
       
   489             else
       
   490                 {
       
   491                 // Must be response to AddCall request
       
   492                 iMessageRouter->Complete(
       
   493                     EMobileConferenceCallAddCall,
       
   494                     result );
       
   495                 }
       
   496             iLastOperation = 0;
       
   497             }
       
   498         // if last operation was hold or retrieve
       
   499         else if ( CALL_MODEM_OP_HOLD == iLastOperation ||
       
   500             CALL_MODEM_OP_RETRIEVE == iLastOperation )
       
   501             {
       
   502             // Complete swap with error
       
   503             iMessageRouter->Complete(
       
   504                 EMobileConferenceCallSwap,
       
   505                 result );
       
   506             }
       
   507         // No else
       
   508         }
       
   509     // Successful operation handling for operations
       
   510     // Initiated bypassing the ETel (ghost operetion).
       
   511     else if ( !iIsCreateConference && 0 == iLastOperation )
       
   512         {
       
   513         TUint8 callOperation( 0 );
       
   514         // Get call Id (three bits (1-3) contain unique call ID)
       
   515         TInt uniqueCallId( static_cast<TInt>( aIsiMsg.Get8bit(
       
   516             ISI_HEADER_SIZE + CALL_MODEM_CONTROL_IND_OFFSET_CALLID )
       
   517             & KMaskBits1to3 ) );
       
   518 
       
   519         // Get call operation sub block
       
   520         if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
       
   521             ISI_HEADER_SIZE + CALL_MODEM_CONTROL_IND_OFFSET_OPERATION,
       
   522             CALL_MODEM_SB_OPERATION,
       
   523             EIsiSubBlockTypeId8Len8,
       
   524             sbStartOffSet ) )
       
   525             {
       
   526             TInt symbianConferenceEvent( -1 );
       
   527             // Get call operation
       
   528             callOperation = aIsiMsg.Get8bit(
       
   529                 sbStartOffSet + CALL_MODEM_SB_OPERATION_OFFSET_OPERATION );
       
   530 
       
   531 TFLOGSTRING2("TSY: CMmConferenceCallMessHandler::CallControlInd - Call operation: %d", callOperation);
       
   532 OstTraceExt1( TRACE_NORMAL, DUP1_CMMCONFERENCECALLMESSHANDLER_CALLCONTROLIND, "CMmConferenceCallMessHandler::CallControlInd;callOperation=%hhu", callOperation );
       
   533             // Purpose of this case is to prepare handling of externally
       
   534             // controlled conference call
       
   535             switch ( callOperation )
       
   536                 {
       
   537                 case CALL_MODEM_OP_CONFERENCE_BUILD:
       
   538                     {
       
   539                     symbianConferenceEvent =
       
   540                         RMobileConferenceCall::EConferenceBuilt;
       
   541                     break;
       
   542                     }
       
   543                 case CALL_MODEM_OP_HOLD:
       
   544                 case CALL_MODEM_OP_SWAP:
       
   545                     {
       
   546                     symbianConferenceEvent =
       
   547                         RMobileConferenceCall::EConferenceSwapped;
       
   548                     break;
       
   549                     }
       
   550                 case CALL_MODEM_OP_CONFERENCE_SPLIT:
       
   551                     {
       
   552                     symbianConferenceEvent =
       
   553                         RMobileConferenceCall::EConferenceSplit;
       
   554                     break;
       
   555                     }
       
   556                 default:
       
   557                     {
       
   558                     // Nothing to do
       
   559                     break;
       
   560                     }
       
   561                 }
       
   562 
       
   563             // Update the information to Conference call
       
   564             if ( 0 <= symbianConferenceEvent )
       
   565                 {
       
   566                 // Create call package
       
   567                 CCallDataPackage callData;
       
   568                 // Pack the data for sending to the manager
       
   569                 callData.SetCallIdAndMode(
       
   570                     uniqueCallId,
       
   571                     RMobilePhone::EVoiceService );
       
   572                 // Pack conference event
       
   573                 callData.PackData( &symbianConferenceEvent );
       
   574                 // Pass call information to the Symbian OS layer
       
   575                 // complete mobile call info change
       
   576                 iMessageRouter->Complete(
       
   577                     EMobileConferenceCallNotifyConferenceEvent,
       
   578                     &callData,
       
   579                     KErrNone );
       
   580                 }
       
   581             // No else
       
   582             }
       
   583         // No else
       
   584         }
       
   585     // No else
       
   586 
       
   587     iIsCreateConference = EFalse;
       
   588     iLastOperation = 0;
       
   589     }
       
   590 
       
   591 // -----------------------------------------------------------------------------
       
   592 // CMmConferenceCallMessHandler::CallReleaseReq
       
   593 // Called by conference call Tsy to construct a
       
   594 // CALL_MODEM_RELEASE_REQ ISI message. Releases whole Conference call.
       
   595 // -----------------------------------------------------------------------------
       
   596 //
       
   597 TInt CMmConferenceCallMessHandler::CallReleaseReq(
       
   598     TUint8 aTransactionId,
       
   599     TUint8 aCallId,
       
   600     TUint8 aCause )
       
   601     {
       
   602 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallReleaseReq");
       
   603 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLRELEASEREQ, "CMmConferenceCallMessHandler::CallReleaseReq" );
       
   604 
       
   605     // Create isi message
       
   606     TIsiSend callreleaseReq( iPhoNetSender->SendBufferDes() );
       
   607     callreleaseReq.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_MODEM_CALL );
       
   608 
       
   609     // Set the Call Release Req data
       
   610     callreleaseReq.Set8bit(
       
   611         ISI_HEADER_OFFSET_TRANSID,
       
   612         aTransactionId );
       
   613     callreleaseReq.Set8bit(
       
   614         ISI_HEADER_OFFSET_MESSAGEID,
       
   615         CALL_MODEM_RELEASE_REQ );
       
   616     callreleaseReq.Set8bit(
       
   617         ISI_HEADER_SIZE + CALL_MODEM_RELEASE_REQ_OFFSET_CALLID,
       
   618         aCallId );
       
   619 
       
   620     // Initialize message offset
       
   621     TInt currentMsgOffset(
       
   622         ISI_HEADER_SIZE + CALL_MODEM_RELEASE_REQ_OFFSET_CAUSE );
       
   623 
       
   624     iReleaseCauseValueSent = aCause;
       
   625 
       
   626     // Number of subblocks
       
   627     TUint8 numOfSbInMessage( 0 );
       
   628 
       
   629     // CALL_MODEM_SB_CAUSE Sub block
       
   630     TBuf8< SIZE_CALL_MODEM_SB_CAUSE > callCauseBuf( 0 );
       
   631     TIsiSubBlock callCauseSb(
       
   632         callCauseBuf,
       
   633         CALL_MODEM_SB_CAUSE,
       
   634         EIsiSubBlockTypeId8Len8 );
       
   635 
       
   636     callCauseBuf.Append( CALL_MODEM_CAUSE_TYPE_CLIENT );
       
   637     callCauseBuf.Append( aCause );
       
   638     callreleaseReq.CopyData(
       
   639         currentMsgOffset,
       
   640         callCauseSb.CompleteSubBlock() );
       
   641 
       
   642     // Increase subblock count
       
   643     numOfSbInMessage++;
       
   644 
       
   645     // Set new offset
       
   646     currentMsgOffset = currentMsgOffset + SIZE_CALL_MODEM_SB_CAUSE;
       
   647 
       
   648     // CALL_MODEM_SB_STATE_AUTO_CHANGE subblock
       
   649     TBuf8< SIZE_CALL_MODEM_SB_STATE_AUTO_CHANGE > callStateAutoChangeBuf( 0 );
       
   650     TIsiSubBlock callStateAutoChangeSb(
       
   651         callStateAutoChangeBuf,
       
   652         CALL_MODEM_SB_STATE_AUTO_CHANGE,
       
   653         EIsiSubBlockTypeId8Len8 );
       
   654 
       
   655     // Disables auto retrieve when a waiting call exists.
       
   656     callStateAutoChangeBuf.Append( CALL_MODEM_AUTO_ST_CHANGE_DISABLE );
       
   657     callStateAutoChangeBuf.Append( KConfCallPadding );
       
   658 
       
   659     callreleaseReq.CopyData(
       
   660         currentMsgOffset,
       
   661         callStateAutoChangeSb.CompleteSubBlock() );
       
   662 
       
   663     // Increase subblock count
       
   664     numOfSbInMessage++;
       
   665 
       
   666     // Set number of subblocs in CALL_MODEM_RELEASE_REQ message
       
   667     callreleaseReq.Set8bit(
       
   668         ISI_HEADER_SIZE + CALL_MODEM_RELEASE_REQ_OFFSET_SUBBLOCKS,
       
   669         numOfSbInMessage );
       
   670 
       
   671     // Send CALL_MODEM_RELEASE_REQ message
       
   672     return iPhoNetSender->Send( callreleaseReq.Complete() );
       
   673     }
       
   674 
       
   675 // -----------------------------------------------------------------------------
       
   676 // CMmConferenceCallMessHandler::CallReleaseResp
       
   677 // Breaks a CALL_MODEM_RELEASE_RESP ISI-message. This handles the
       
   678 // situation where Conference call releasing has failed.
       
   679 // -----------------------------------------------------------------------------
       
   680 //
       
   681 void CMmConferenceCallMessHandler::CallReleaseResp(
       
   682     const TIsiReceiveC& aIsiMsg )
       
   683     {
       
   684 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::CallReleaseResp");
       
   685 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_CALLRELEASERESP, "CMmConferenceCallMessHandler::CallReleaseResp" );
       
   686 
       
   687     TUint sbStartOffSet( 0 );
       
   688 
       
   689     // Try to find CALL_MODEM_SB_CAUSE subblock. If found something has gone wrong
       
   690     if ( KErrNone == aIsiMsg.FindSubBlockOffsetById(
       
   691         ISI_HEADER_SIZE + SIZE_CALL_MODEM_RELEASE_RESP,
       
   692         CALL_MODEM_SB_CAUSE,
       
   693         EIsiSubBlockTypeId8Len8,
       
   694         sbStartOffSet ) )
       
   695         {
       
   696         // Get cause type
       
   697         TUint8 causeType( aIsiMsg.Get8bit(
       
   698             sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSETYPE ) );
       
   699 
       
   700         // Get cause value
       
   701         TUint8 causeValue( aIsiMsg.Get8bit(
       
   702             sbStartOffSet + CALL_MODEM_SB_CAUSE_OFFSET_CAUSE ) );
       
   703 
       
   704         // Get Symbian OS error value
       
   705         TInt result( CMmStaticUtility::CSCauseToEpocError(
       
   706             PN_MODEM_CALL,
       
   707             causeType,
       
   708             causeValue ) );
       
   709 
       
   710         // Complete conference call hangup
       
   711         if ( iReleaseCauseValueSent != causeValue )
       
   712             {
       
   713             // Error occurred. Route the error value up.
       
   714             iMessageRouter->Complete(
       
   715                 EMobileConferenceCallHangUp,
       
   716                 result );
       
   717             }
       
   718         // No else
       
   719         iReleaseCauseValueSent = 0;
       
   720         }
       
   721     // No else
       
   722     }
       
   723 
       
   724 // -----------------------------------------------------------------------------
       
   725 // CMmConferenceCallMessHandler::HandleError
       
   726 // Handles CMmConferenceCallMessHandler's errors that comes
       
   727 // via PhoNetReceiver RunError method.
       
   728 // -----------------------------------------------------------------------------
       
   729 //
       
   730 void CMmConferenceCallMessHandler::HandleError(
       
   731     const TIsiReceiveC& /*aIsiMsg*/,
       
   732     TInt /*aError*/ )
       
   733     {
       
   734 TFLOGSTRING("TSY: CMmConferenceCallMessHandler::HandleError");
       
   735 OstTrace0( TRACE_NORMAL, CMMCONFERENCECALLMESSHANDLER_HANDLEERROR, "CMmConferenceCallMessHandler::HandleError" );
       
   736 
       
   737     // None
       
   738     }
       
   739 
       
   740 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   741     // None
       
   742 
       
   743 // End of File