adaptationlayer/modematadaptation/modematcontroller_exe/src/cmodemathandler.cpp
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
equal deleted inserted replaced
-1:000000000000 0:63b37f68c1ce
       
     1 /*
       
     2 * Copyright (c) 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 #include <e32std.h>
       
    21 #include <iscapi.h>
       
    22 #include <iscnokiadefinitions.h>
       
    23 #include <pn_const.h>
       
    24 #ifndef NCP_COMMON_BRIDGE_FAMILY       
       
    25 #include <nsisi.h>
       
    26 #endif
       
    27 #include <pipeisi.h>
       
    28 #include <pipe_sharedisi.h>
       
    29 #include <tisi.h>
       
    30 #include <at_modemisi.h>
       
    31 #include "cmodemathandler.h"
       
    32 #include "cmodematpipecontroller.h"
       
    33 #include "modemattrace.h"
       
    34 #include "cmodematsrv.h"
       
    35 
       
    36 #define KCommandBits 0x0f
       
    37 #define KMaxBufferLength 1024
       
    38 #define KTransactionIdBitsShift 4
       
    39 #define KFiller 0
       
    40 #define KIndicationOrderMsgLength 14
       
    41 #define KObjectIdLength 2
       
    42 #define KEightBits 8
       
    43 #define KDefaultTId 0
       
    44 
       
    45 const TInt KUnsubscribeFourEvents(4);
       
    46 const TInt KAlignToFourBytes(4);
       
    47 
       
    48 #ifdef __WINSCW__
       
    49 #define KEmulatedReplyMsgLength 50
       
    50 #endif
       
    51 
       
    52 CModemAtHandler* CModemAtHandler::NewL( CModemAtSrv& aServer )
       
    53     {
       
    54     CModemAtHandler* self = new (ELeave) CModemAtHandler( aServer );
       
    55     CleanupStack::PushL( self );
       
    56     self->ConstructL();
       
    57     CleanupStack::Pop( self );
       
    58     return self;
       
    59     }
       
    60 
       
    61 CModemAtHandler::~CModemAtHandler()
       
    62     {
       
    63     C_TRACE(( _T("CModemAtHandler::~CModemAtHandler()") ));
       
    64     TBuf8<KUnsubscribeFourEvents> events;
       
    65     events.Append( KFiller );
       
    66     events.Append( KFiller );  
       
    67     events.Append( KFiller );
       
    68     events.Append( KFiller );
       
    69 
       
    70     if( iIscApi )
       
    71         {
       
    72         iIscApi->CustomFunction( EIscNokiaEventSubscribe, &events );
       
    73         }
       
    74 
       
    75     if(iPipeController)
       
    76         {
       
    77         delete iPipeController;
       
    78         iPipeController = NULL;
       
    79         } 
       
    80     Cancel();
       
    81 
       
    82     if( iIscApi )
       
    83         {
       
    84         iIscApi->Close();
       
    85         delete iIscApi;
       
    86         }
       
    87    }
       
    88 
       
    89 CModemAtHandler::CModemAtHandler( CModemAtSrv& aServer )
       
    90     : CActive( EPriorityHigh ),
       
    91     iServer( aServer ),
       
    92     iIscApi( NULL ),
       
    93     iReceivedMessageBuffer( NULL ),
       
    94     iMessageBufferSize( KMaxBufferLength ),
       
    95     iReceivePtr( 0, 0 ),
       
    96     iReceiveMessageLength( 0 ),
       
    97     iReceivedMessage( NULL ),
       
    98     iPepObjId(0),
       
    99     iPipeController(NULL),
       
   100     iDisconnected( EFalse )
       
   101     {
       
   102     C_TRACE (( _T("CModemAtHandler::CModemAtHandler") ));
       
   103     
       
   104     }
       
   105 
       
   106 void CModemAtHandler::DoCancel()
       
   107     {
       
   108     C_TRACE (( _T("CModemAtHandler::DoCancel()") ));
       
   109     iIscApi->ReceiveCancel();
       
   110     
       
   111     }
       
   112 
       
   113 
       
   114 void CModemAtHandler::RunL()
       
   115     {
       
   116     C_TRACE (( _T("CModemAtHandler::RunL()") ));
       
   117    
       
   118     if( iStatus == KErrNone ) 
       
   119         {
       
   120         TIsiReceiveC receiveMessage = TIsiReceiveC( *iReceivedMessageBuffer );
       
   121         DUMP_MESSAGE( iReceivePtr );
       
   122             
       
   123         if( iReceivedMessageBuffer->Length() > ISI_HEADER_OFFSET_MESSAGEID )
       
   124             {
       
   125             switch(receiveMessage.Get8bit(ISI_HEADER_OFFSET_RESOURCEID))
       
   126                 {
       
   127                 case PN_AT_MODEM: //AT MODEM COMMANDS
       
   128                     C_TRACE(_L("PN_AT_MODEM"));
       
   129 
       
   130                     switch( receiveMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) )
       
   131                         {
       
   132                         case AT_MODEM_CONNECT_RESP: 
       
   133                             HandleModemConnectResp( receiveMessage );
       
   134                             break;
       
   135 
       
   136                         case AT_MODEM_DISCONNECT_RESP:
       
   137                             C_TRACE(_L("AT_MODEM_DISCONNECT_RESP"));
       
   138                             break;
       
   139 
       
   140                         case AT_MODEM_CMD_RESP:
       
   141                             HandleATResponse( receiveMessage );
       
   142                             break;
       
   143 
       
   144                         case AT_MODEM_SIGNAL_IND:
       
   145                             HandleSignalInd( receiveMessage );
       
   146                             break;
       
   147 
       
   148                         case AT_MODEM_UNSOLICITED_DATA_IND:
       
   149                             HandleUnsolicitedData( receiveMessage );
       
   150                             break;
       
   151 
       
   152                         case AT_MODEM_INTERMEDIATE_DATA_IND:
       
   153                             HandleIntermediateDataInd( receiveMessage );
       
   154                             break;
       
   155 
       
   156                         case AT_MODEM_DATA_REDIRECT_IND:
       
   157                             HandleRedirectInd( receiveMessage );
       
   158                             break;
       
   159                             
       
   160                         case AT_MODEM_DATA_REDIRECT_RESULT_RESP:
       
   161                             C_TRACE((_L("AT_MODEM_DATA_REDIRECT_RESULT_RESP")));
       
   162                             HandleRedirectResultResp( receiveMessage );
       
   163                             break;
       
   164 
       
   165                         case AT_MODEM_SIGNAL_DETECTED_RESP:
       
   166                             C_TRACE((_L("AT_MODEM_SIGNAL_DETECTED_RESP")));
       
   167                             HandleSignalDetectedResp(  receiveMessage  );
       
   168                             break;
       
   169                         default: 
       
   170                             C_TRACE(_L("CModemAtHandler::RunL: Not a valid message"))  ;
       
   171                             TRACE_ASSERT_ALWAYS;
       
   172                             break;
       
   173                          } //switch( receiveMessage.Get8bit( ISI_HEADER_OFFSET_MESSAGEID ) )
       
   174                         
       
   175                     break;  //case PN_AT_MODEM: //AT MODEM COMMANDS
       
   176 
       
   177 #ifndef NCP_COMMON_BRIDGE_FAMILY
       
   178                 case PN_NAME_SERVICE: 
       
   179                     C_TRACE(_L("PN_NAME_SERVICE"));
       
   180                     iPipeController->HandleNameServiceMessage(receiveMessage);
       
   181                     break;
       
   182 
       
   183                 case PN_PIPE:
       
   184                     C_TRACE(_L("Pipe message"));
       
   185                     iPipeController->HandlePipeServiceMessage(receiveMessage);
       
   186                     break;
       
   187 #endif
       
   188                 default:  
       
   189                     C_TRACE((_L("Unknown resource id")));
       
   190                     TRACE_ASSERT_ALWAYS;
       
   191                     break; 
       
   192                 }
       
   193                 
       
   194             } //if( receiveMessageBuffer->Length() > ISI_HEADER_OFFSET_MESSAGEID )
       
   195         else 
       
   196             {
       
   197             C_TRACE(_L("ISI essage is too short"));
       
   198             TRACE_ASSERT_ALWAYS;
       
   199             }
       
   200         
       
   201         //Start receiving ISI messages again
       
   202         iReceivePtr.Set( iReceivedMessageBuffer->Des() );
       
   203         iIscApi->Receive( iStatus, iReceivePtr, iReceiveMessageLength );
       
   204         SetActive();
       
   205         } // if( iStatus == KErrNone )
       
   206     else 
       
   207         {
       
   208         TRACE_ASSERT_ALWAYS;
       
   209         } 
       
   210     }
       
   211 
       
   212 
       
   213 void CModemAtHandler::ConstructL()
       
   214     {
       
   215    C_TRACE (( _T("CModemAtHandler::ConstructL()") ));
       
   216 
       
   217     CActiveScheduler::Add( this );
       
   218     
       
   219     iIscApi = new ( ELeave ) RIscApi;
       
   220     C_TRACE(_L("RIscApi created"));
       
   221 
       
   222     //used with intermediate data ind
       
   223     //can be removed, when AT_MODEM_INTERMEDIATE_DATA_IND supports transactionid 
       
   224     for( TInt i = 0 ; i < KMaxDteIdCount ; i++) 
       
   225         {
       
   226         iLastTransactionId[i]=0;
       
   227         }
       
   228     
       
   229 #ifndef __WINSCW__
       
   230       OpenChannelL();
       
   231 #ifndef NCP_COMMON_BRIDGE_FAMILY
       
   232       iPipeController->SendTaskIdQuery();
       
   233 #endif
       
   234 #else
       
   235       iEmulatedValue = 0;
       
   236 #endif
       
   237     
       
   238     }
       
   239 
       
   240 
       
   241 TInt CModemAtHandler::GetMinSizeDividendByFour( TInt aSize)
       
   242     {
       
   243      C_TRACE (( _T("CModemAtHandler::GetMinSizeDividendByFour(%d)"),aSize ));
       
   244      aSize += aSize % KAlignToFourBytes;
       
   245       
       
   246      C_TRACE (( _T("CModemAtHandler::GetMinSizeDividendByFour return: %d"),aSize ));
       
   247      return aSize;
       
   248     }
       
   249 
       
   250 TInt CModemAtHandler::SendATCommand(const TUint8 aDteId,
       
   251     const TATPluginInterface aPluginType,
       
   252     const TUint8 aMessageType,
       
   253     const TDesC8& aCmd)
       
   254     {
       
   255     C_TRACE (( _T(">>CModemAtHandler::SendATCommand()") ));
       
   256 
       
   257     TInt err = KErrNone;
       
   258     // aMessageType contains normal AT-cmd (0) or Nvram-query (1)
       
   259     TUint transactionId= (aPluginType << KTransactionIdBitsShift) | aMessageType;
       
   260     //used with intermediate data ind
       
   261     //can be removed, when AT_MODEM_INTERMEDIATE_DATA_IND supports transactionid        
       
   262     iLastTransactionId[aDteId] = transactionId;  //messages are routed to correct plugin by transaction id
       
   263     C_TRACE((_L("transaction id %d, plugintype %d, aMessageType %d"), transactionId, aPluginType, aMessageType));
       
   264     C_TRACE((_L("iLastTransctionId[%d] = %d "),aDteId,iLastTransactionId[aDteId]));
       
   265 
       
   266     #ifdef __WINSCW__
       
   267     iDteId = aDteId;
       
   268     iChannel = aMessageType;
       
   269     iPluginType = aPluginType;
       
   270     HandleATResponse();
       
   271     return KErrNone;
       
   272     #endif
       
   273 
       
   274     TInt size = ISI_HEADER_SIZE + AT_MODEM_CMD_REQ_OFFSET_CMDLINEBUFFER + aCmd.Length();
       
   275     
       
   276     TInt sizeWithFillers = GetMinSizeDividendByFour( size );
       
   277     C_TRACE((_L("Message length %d"), sizeWithFillers));
       
   278 
       
   279     HBufC8* message = HBufC8::New( sizeWithFillers );
       
   280     if( message )
       
   281       {
       
   282       TPtr8 messageptr = message->Des();
       
   283       TIsiSend isimessage( messageptr, sizeWithFillers );
       
   284       isimessage.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_AT_MODEM );       
       
   285       isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_CMD_REQ_OFFSET_TID, transactionId );
       
   286       isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_CMD_REQ_OFFSET_MESSAGEID, AT_MODEM_CMD_REQ );
       
   287       isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_CMD_REQ_OFFSET_DTEID, aDteId );
       
   288       isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_CMD_REQ_OFFSET_FILLERBYTE1, 0 );
       
   289       C_TRACE((_L("AT command length: %d"), aCmd.Length()));
       
   290       isimessage.Set16bit( ISI_HEADER_SIZE + AT_MODEM_CMD_REQ_OFFSET_LENGTH, (TUint16) aCmd.Length() );
       
   291 
       
   292       const TUint8* ptr = aCmd.Ptr();
       
   293       for ( TInt i = 0; i < aCmd.Length(); i++ )
       
   294           {
       
   295           C_TRACE((_L("message %d, 0x%x '%c'"), i, ptr[i], ptr[i]));
       
   296           isimessage.Set8bit(ISI_HEADER_SIZE + AT_MODEM_CMD_REQ_OFFSET_CMDLINEBUFFER + i, ptr[i]);
       
   297           }
       
   298 
       
   299       for( TInt j = sizeWithFillers; j < size; j++ )
       
   300           {
       
   301           C_TRACE((_L("Add filler [%d]"), j));
       
   302           isimessage.Set8bit( j , KFiller );
       
   303           }
       
   304 
       
   305       isimessage.Complete();
       
   306       C_TRACE(_L("Created ISI-message"));
       
   307       DUMP_MESSAGE( messageptr );
       
   308 
       
   309       err = iIscApi->Send( messageptr );
       
   310       TRACE_ASSERT( err == KErrNone );
       
   311       delete message;
       
   312       message = NULL;
       
   313       }
       
   314     else
       
   315       {
       
   316       C_TRACE(_L("No memory - error in sending ISI message from heap"));
       
   317       TRACE_ASSERT_ALWAYS;
       
   318       }
       
   319     C_TRACE (( _T("<<CModemAtHandler::SendATCommand() err: %d"), err ));
       
   320     return err;
       
   321     }
       
   322 
       
   323 void CModemAtHandler::OpenChannelL()
       
   324     {
       
   325     C_TRACE (( _T("CModemAtHandler::OpenChannelL()") ));
       
   326     TRequestStatus openStatus;
       
   327 
       
   328     iIscApi->Open( EIscNokiaAtController, openStatus, EOwnerThread );
       
   329     User::WaitForRequest( openStatus );
       
   330 
       
   331     TRACE_ASSERT( !openStatus.Int());
       
   332     
       
   333     if( iReceivedMessageBuffer )
       
   334         {
       
   335         delete iReceivedMessageBuffer;
       
   336         iReceivedMessageBuffer = NULL;
       
   337         }
       
   338 
       
   339     iReceivedMessageBuffer = HBufC8::NewL(iMessageBufferSize);
       
   340     TRACE_ASSERT(iReceivedMessageBuffer);
       
   341     iReceivePtr.Set( iReceivedMessageBuffer->Des() );
       
   342 
       
   343     C_TRACE(_L("Start receive ISI messages"));
       
   344     iIscApi->Receive( iStatus, iReceivePtr, iReceiveMessageLength );
       
   345 
       
   346     SetActive();
       
   347     
       
   348     C_TRACE(_L("Start receive indications"));
       
   349     TBuf8<KIndicationOrderMsgLength> events;
       
   350     events.Append( PN_AT_MODEM );
       
   351     events.Append( AT_MODEM_INTERMEDIATE_DATA_IND );  
       
   352     events.Append( PN_AT_MODEM );
       
   353     events.Append( AT_MODEM_SIGNAL_IND );  
       
   354     events.Append( PN_AT_MODEM );
       
   355     events.Append( AT_MODEM_UNSOLICITED_DATA_IND );  
       
   356     events.Append( PN_AT_MODEM );
       
   357     events.Append( AT_MODEM_DATA_REDIRECT_IND );  
       
   358     events.Append( PN_PIPE );
       
   359     events.Append( PNS_PEP_STATUS_IND );
       
   360 
       
   361 #ifndef NCP_COMMON_BRIDGE_FAMILY       
       
   362     //name add ind
       
   363     events.Append( PN_NAMESERVICE );
       
   364     events.Append( PNS_NAME_ADD_IND );  
       
   365     events.Append( PN_NAMESERVICE );
       
   366     events.Append( PNS_NAME_REMOVE_IND );
       
   367 #else
       
   368     events.Append( 0 );
       
   369     events.Append( 0 );  
       
   370     events.Append( 0 );
       
   371     events.Append( 0 );
       
   372 #endif
       
   373     
       
   374     iIscApi->CustomFunction(EIscNokiaEventSubscribe,&events);
       
   375     TBuf8<KObjectIdLength> objId;
       
   376     iIscApi->GetChannelInfo(EIscNokiaAtController, objId);
       
   377     
       
   378     iPepObjId = (((TUint16)(objId[0]))<<KEightBits) + objId[1];
       
   379     C_TRACE((_L("PepObjId 0x%x"),iPepObjId));
       
   380     iPipeController = CModemAtPipeController::NewL(*iIscApi, iPepObjId, *this); 
       
   381     C_TRACE((_L("iPipeController 0x%x"),iPipeController ));
       
   382     ASSERT_PANIC_ALWAYS( iPipeController );
       
   383     }
       
   384 
       
   385 
       
   386 void CModemAtHandler::HandleATResponse( const TIsiReceiveC& aMessage )
       
   387     {
       
   388     C_TRACE (( _T("CModemAtHandler::HandleATResponse()") ));
       
   389     
       
   390     TInt dteId = aMessage.Get8bit( ISI_HEADER_SIZE+ AT_MODEM_CMD_RESP_OFFSET_DTEID ) ;
       
   391     TUint transactionId = aMessage.Get8bit( ISI_HEADER_SIZE + AT_MODEM_CMD_RESP_OFFSET_TID );
       
   392     TUint8 command = transactionId & KCommandBits; //normal AT-cmd or Nvram-query
       
   393     TInt length = aMessage.Get16bit( ISI_HEADER_SIZE+AT_MODEM_CMD_RESP_OFFSET_LENGTH );
       
   394     C_TRACE(( _L("DteId: %d AT (0) or nvram command (1): %d Response length %d"), dteId, command, length ));
       
   395 
       
   396     /**
       
   397      * Plugintype can be read from transaction id:
       
   398      * TUint8 pluginType = transactionId >> KTransactionIdBitsShift;
       
   399      * (TATPluginInterface) pluginType
       
   400      *
       
   401      * Current implementation uses first in first out response completion
       
   402      * so plugintype is not needed.
       
   403      */
       
   404     C_TRACE(( _L("Plugintype: %d"), transactionId >> KTransactionIdBitsShift ));
       
   405     
       
   406     iServer.HandleATResponse( dteId,  
       
   407       aMessage.GetData( ISI_HEADER_SIZE + AT_MODEM_CMD_RESP_OFFSET_CMDLINEBUFFER, length),
       
   408       command );
       
   409     }
       
   410 
       
   411 #ifdef __WINSCW__
       
   412 void CModemAtHandler::HandleATResponse( )
       
   413     {
       
   414     C_TRACE (( _T("CModemAtHandler::HandleATResponse()") ));
       
   415     //reply back immediately
       
   416     const TInt KReplyLength(50);
       
   417     TBuf8<KReplyLength> replyEmulated = _L8("\r\nAT TEST REPLY");
       
   418     replyEmulated.AppendNum(iEmulatedValue++);
       
   419     replyEmulated.Append(_L8("\r\n"));
       
   420     iServer.HandleATResponse( iDteId, replyEmulated, 0 /* 0 = AT-cmd, 1 = nvram */);
       
   421     }
       
   422 #endif
       
   423 
       
   424     
       
   425 TInt CModemAtHandler::Connect(const TUint8 aDteId)
       
   426     {
       
   427    C_TRACE (( _T("CModemAtHandler::Connect()") ));
       
   428 
       
   429     C_TRACE((_L("Connecting with dteid:%d "), aDteId));
       
   430     SetDisconnected( EFalse );
       
   431     
       
   432     #ifdef __WINSCW__ //emulate, modem is connected
       
   433     iServer.BroadcastModemConnected( aDteId, KErrNone );
       
   434     iDteId = aDteId;
       
   435     return KErrNone;
       
   436     #endif
       
   437 #ifndef NCP_COMMON_BRIDGE_FAMILY
       
   438     iPipeController->LinkDteIdToPipe( aDteId );
       
   439 #endif
       
   440     TInt size = ISI_HEADER_SIZE + SIZE_AT_MODEM_CONNECT_REQ;
       
   441     
       
   442     HBufC8* message = HBufC8::New( size );
       
   443     TRACE_ASSERT( message );
       
   444     TPtr8 messageptr = message->Des();
       
   445     TIsiSend isimessage( messageptr, size );
       
   446     isimessage.Set8bit(ISI_HEADER_OFFSET_RESOURCEID, PN_AT_MODEM); 
       
   447     isimessage.Set8bit(ISI_HEADER_SIZE + AT_MODEM_CONNECT_REQ_OFFSET_TID, KDefaultTId);
       
   448     isimessage.Set8bit(ISI_HEADER_SIZE + AT_MODEM_CONNECT_REQ_OFFSET_MESSAGEID, AT_MODEM_CONNECT_REQ);
       
   449     isimessage.Set8bit(ISI_HEADER_SIZE + AT_MODEM_CONNECT_REQ_OFFSET_DTEID, aDteId);
       
   450     isimessage.Set8bit(ISI_HEADER_SIZE + AT_MODEM_CONNECT_REQ_OFFSET_FILLERBYTE1, KFiller);
       
   451     isimessage.Complete();
       
   452 
       
   453     DUMP_MESSAGE( messageptr );
       
   454     TInt err = iIscApi->Send( messageptr );
       
   455     TRACE_ASSERT( err == KErrNone );
       
   456     delete message;
       
   457     message = NULL;
       
   458     return err;
       
   459     }
       
   460 
       
   461 void CModemAtHandler::SetDisconnected( TBool aIsDisconnected )
       
   462     {
       
   463     C_TRACE (( _T("CModemAtHandler::SetDisconnected(%d)"),aIsDisconnected ));
       
   464     iDisconnected = aIsDisconnected;
       
   465     }
       
   466 
       
   467 TBool CModemAtHandler::IsDisconnected()
       
   468     {
       
   469     C_TRACE (( _T("CModemAtHandler::IsDisconnected(%d)"),iDisconnected ));
       
   470     return iDisconnected;
       
   471     }
       
   472 
       
   473 TBool CModemAtHandler::IsPluginConnected()
       
   474     {
       
   475     C_TRACE (( _T("CModemAtHandler::IsPluginConnected() sessions: %d"), iServer.SessionCount() ));
       
   476     return iServer.SessionCount() > 0;
       
   477     }
       
   478 
       
   479 void CModemAtHandler::RemovePipe( const TUint8 aDteId )
       
   480     {
       
   481     C_TRACE(( _T("CModemAtHandler::RemovePipe()")));
       
   482     iDisconnected = ETrue;
       
   483 #ifndef NCP_COMMON_BRIDGE_FAMILY
       
   484     iPipeController->RemovePipe( aDteId );
       
   485 #endif
       
   486     }
       
   487 
       
   488 TInt CModemAtHandler::Disconnect( const TUint8 aDteId )
       
   489     {
       
   490     C_TRACE (( _T("CModemAtHandler::Disconnect(%d)"),aDteId ));
       
   491     #ifdef __WINSCW__
       
   492     iDteId = aDteId;
       
   493     return KErrNone;
       
   494     #endif
       
   495  
       
   496     TInt size = ISI_HEADER_SIZE + SIZE_AT_MODEM_DISCONNECT_REQ;
       
   497     HBufC8* message = HBufC8::New( size );
       
   498     TRACE_ASSERT( message );
       
   499     TPtr8 messageptr = message->Des();
       
   500     TIsiSend isimessage( messageptr, size );
       
   501     isimessage.Set8bit(ISI_HEADER_OFFSET_RESOURCEID,PN_AT_MODEM);
       
   502     isimessage.Set8bit(ISI_HEADER_SIZE + AT_MODEM_DISCONNECT_REQ_OFFSET_TID, 0);
       
   503     isimessage.Set8bit(ISI_HEADER_SIZE + AT_MODEM_DISCONNECT_REQ_OFFSET_MESSAGEID,
       
   504       AT_MODEM_DISCONNECT_REQ);
       
   505     isimessage.Set8bit(ISI_HEADER_SIZE + AT_MODEM_DISCONNECT_REQ_OFFSET_DTEID, aDteId);
       
   506     isimessage.Set8bit(ISI_HEADER_SIZE + AT_MODEM_DISCONNECT_REQ_OFFSET_FILLERBYTE1, KFiller);
       
   507     isimessage.Complete();
       
   508 
       
   509     C_TRACE (( _T("CModemAtHandler::Disconnect Sending AT_MODEM_DISCONNECT_REQ")));
       
   510     TInt err = iIscApi->Send(messageptr);
       
   511     TRACE_ASSERT( err == KErrNone );
       
   512     delete message;
       
   513     return err;
       
   514     }
       
   515 
       
   516 
       
   517 
       
   518 void CModemAtHandler::HandleModemConnectResp( const TIsiReceiveC& aMessage )
       
   519     {
       
   520     C_TRACE (( _T("CModemAtHandler::HandleModemConnectResp()") ));
       
   521     TInt dteId= aMessage.Get8bit(ISI_HEADER_SIZE+ AT_MODEM_CONNECT_RESP_OFFSET_DTEID);
       
   522     TInt status = aMessage.Get8bit(ISI_HEADER_SIZE+ AT_MODEM_CONNECT_RESP_OFFSET_RESULT);
       
   523     TInt err = KErrGeneral;
       
   524     if( status == AT_MODEM_RESULT_OK )
       
   525         {
       
   526         C_TRACE(_L("Connected ok, AT_MODEM_RESULT_OK received"));
       
   527         err = KErrNone;
       
   528         }   
       
   529     else 
       
   530         {
       
   531         C_TRACE((_L("Connection failed, AT_MODEM_RESULT_ERROR received (%d)"),status));
       
   532         TRACE_ASSERT_ALWAYS;
       
   533         }
       
   534 
       
   535     iServer.BroadcastModemConnected( dteId, err );
       
   536     }
       
   537 
       
   538 
       
   539 void CModemAtHandler::HandleSignalInd( const TIsiReceiveC& aMessage )
       
   540     {
       
   541     C_TRACE (( _T("CModemAtHandler::HandleSignalInd()") ));
       
   542     TInt dteId = aMessage.Get8bit(ISI_HEADER_SIZE+ AT_MODEM_SIGNAL_IND_OFFSET_DTEID);
       
   543     iServer.HandleSignalInd( dteId );
       
   544     }
       
   545 
       
   546 void CModemAtHandler::HandleUnsolicitedData( const TIsiReceiveC& aMessage )
       
   547     {
       
   548     C_TRACE (( _T("CModemAtHandler::HandleUnsolicitedData()") ));
       
   549     TInt dteId = aMessage.Get8bit( ISI_HEADER_SIZE+ AT_MODEM_UNSOLICITED_DATA_IND_OFFSET_LENGTH );
       
   550     TInt length = aMessage.Get16bit( ISI_HEADER_SIZE+AT_MODEM_UNSOLICITED_DATA_IND_OFFSET_LENGTH );
       
   551     
       
   552     iServer.HandleUnsolicitedData( dteId,
       
   553       aMessage.GetData( ISI_HEADER_SIZE + AT_MODEM_UNSOLICITED_DATA_IND_OFFSET_UNSOLICITEDDATABUFFER,
       
   554       length ) );
       
   555     }
       
   556 
       
   557 
       
   558 void CModemAtHandler::HandleIntermediateDataInd( const TIsiReceiveC& aMessage )
       
   559     {
       
   560     C_TRACE (( _T("CModemAtHandler::HandleIntermediateDataInd()") ));
       
   561     TInt dteId = aMessage.Get8bit( ISI_HEADER_SIZE+ AT_MODEM_INTERMEDIATE_DATA_IND_OFFSET_DTEID );
       
   562     TInt length= aMessage.Get16bit( ISI_HEADER_SIZE+AT_MODEM_INTERMEDIATE_DATA_IND_OFFSET_LENGTH );
       
   563      
       
   564     TUint transactionId = aMessage.Get8bit( ISI_HEADER_SIZE+ AT_MODEM_CMD_RESP_OFFSET_TID );
       
   565     transactionId = iLastTransactionId[ dteId ];
       
   566     TUint8 command = transactionId & KCommandBits;
       
   567     TUint8 pluginType = transactionId >> KTransactionIdBitsShift;
       
   568     C_TRACE((_L("dteid %d iLastrid[dteid] = %d trid %d"), dteId, iLastTransactionId[dteId], transactionId));
       
   569     
       
   570     iServer.HandleIntermediateDataInd( dteId,
       
   571       (TATPluginInterface) pluginType,
       
   572       aMessage.GetData( ISI_HEADER_SIZE + AT_MODEM_INTERMEDIATE_DATA_IND_OFFSET_INTERMEDIATEDATABUFFER,
       
   573       length),
       
   574       command );
       
   575     }
       
   576 
       
   577 
       
   578 void CModemAtHandler::HandleRedirectInd( const TIsiReceiveC& aMessage ) 
       
   579     {
       
   580     C_TRACE (( _T("CModemAtHandler::HandleRedirectInd()") ));
       
   581   
       
   582     TInt dteId = aMessage.Get8bit( ISI_HEADER_SIZE+  AT_MODEM_DATA_REDIRECT_IND_OFFSET_DTEID );
       
   583     TInt newSecondDevId = aMessage.Get8bit( ISI_HEADER_SIZE +  AT_MODEM_DATA_REDIRECT_IND_OFFSET_DEVICEID );
       
   584     TInt newSecondObjId = aMessage.Get16bit( ISI_HEADER_SIZE + AT_MODEM_DATA_REDIRECT_IND_OFFSET_SERVERID );
       
   585 #ifndef NCP_COMMON_BRIDGE_FAMILY
       
   586     iPipeController->RedirectPipe( dteId, newSecondDevId, newSecondObjId ); 
       
   587 #endif
       
   588     }
       
   589 
       
   590 void CModemAtHandler::SendAtModemDataRedirectResultReq( const TUint8 aDteId, const TUint aResult )
       
   591     {
       
   592     C_TRACE (( _T("CModemAtHandler::SendAtModemDataRedirectResultReq()") ));
       
   593     HBufC8* message = HBufC8::New( ISI_HEADER_SIZE + SIZE_AT_MODEM_DATA_REDIRECT_RESULT_REQ );
       
   594     C_TRACE((_L("Sending AT_MODEM_DATA_REDIRECT_RESULT_REQ dteid %d result %d"), aDteId, aResult));
       
   595     
       
   596     TPtr8 messageptr = message->Des();
       
   597     TIsiSend isimessage( messageptr, ISI_HEADER_SIZE + SIZE_AT_MODEM_DATA_REDIRECT_RESULT_REQ );
       
   598     isimessage.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_AT_MODEM);       
       
   599     isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_DATA_REDIRECT_RESULT_REQ_OFFSET_TID, 0 );
       
   600     isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_DATA_REDIRECT_RESULT_REQ_OFFSET_MESSAGEID,
       
   601       AT_MODEM_DATA_REDIRECT_RESULT_REQ );
       
   602     isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_DATA_REDIRECT_RESULT_REQ_OFFSET_DTEID ,aDteId );
       
   603     isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_DATA_REDIRECT_RESULT_REQ_OFFSET_RESULT ,aResult );
       
   604     isimessage.Complete();
       
   605         
       
   606     C_TRACE(_L("Created ISI-message"));
       
   607     for( TInt i = 0 ; i < (ISI_HEADER_SIZE + SIZE_AT_MODEM_DATA_REDIRECT_RESULT_REQ); i++ ) 
       
   608         {
       
   609         C_TRACE((_L("[%d] 0x%x"),i ,(*message)[i]) );
       
   610         }
       
   611 
       
   612     TInt err = iIscApi->Send( messageptr );
       
   613     TRACE_ASSERT( err == KErrNone );
       
   614     delete message;
       
   615     message = NULL;
       
   616     }
       
   617 
       
   618 
       
   619 void CModemAtHandler::HandleRedirectResultResp(const TIsiReceiveC& aMessage)
       
   620     {
       
   621     C_TRACE (( _T("CModemAtHandler::HandleRedirectResultResp()") ));
       
   622     TInt dteId = aMessage.Get8bit( ISI_HEADER_SIZE + AT_MODEM_DATA_REDIRECT_RESULT_RESP_OFFSET_DTEID );
       
   623     TInt error = aMessage.Get8bit( ISI_HEADER_SIZE + AT_MODEM_DATA_REDIRECT_RESULT_RESP_OFFSET_RESULT );
       
   624     C_TRACE((_L("CModemAtHandler::HandleRedirectResultResp() dte %d"), dteId));
       
   625     
       
   626     if( error == AT_MODEM_RESULT_ERROR ) 
       
   627         {
       
   628         C_TRACE(_L("CModemAtHandler::HandleRedirectResultResp() AT_MODEM_RESULT_ERROR received, redirect failed"));
       
   629         TRACE_ASSERT_ALWAYS;
       
   630         }
       
   631     else 
       
   632         {
       
   633         C_TRACE(_L("CModemAtHandler::HandleRedirectResultResp() redirect OK"));
       
   634         }
       
   635     
       
   636     }
       
   637 void CModemAtHandler::HandleCommandModeChange( TInt aDteId, TCommandMode aMode )
       
   638     {
       
   639     C_TRACE(( _T("CModemAtHandler::HandleCommandModeChange() aDteId: %d aMode: %d"),aDteId, (TInt) aMode ));
       
   640     iServer.HandleCommandModeChange( aDteId, aMode );
       
   641     }
       
   642 
       
   643 TInt CModemAtHandler::SendEscapeSignalDetection( const TUint8 aDteId )
       
   644     {
       
   645     C_TRACE((_T("CModemAtHandler::SendEscapeSignalDetection(%d)"), aDteId));
       
   646     #ifdef __WINSCW__
       
   647     iDteId = aDteId;
       
   648     return KErrNone;
       
   649     #endif
       
   650   
       
   651     TInt error( KErrGeneral );  
       
   652     TUint msgSize( ISI_HEADER_SIZE + SIZE_AT_MODEM_SIGNAL_DETECTED_REQ );
       
   653     TUint size( msgSize + SIZE_AT_MODEM_SB_SIGNAL_DETECTED ); 
       
   654     HBufC8* message = HBufC8::New( size );
       
   655     if( message )
       
   656       {
       
   657       TPtr8 messageptr = message->Des();
       
   658       TIsiSend isimessage( messageptr, size );
       
   659       isimessage.Set8bit( ISI_HEADER_OFFSET_RESOURCEID, PN_AT_MODEM );
       
   660       isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_SIGNAL_DETECTED_REQ_OFFSET_TID, 0x00 );
       
   661       isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_SIGNAL_DETECTED_REQ_OFFSET_MESSAGEID,
       
   662         AT_MODEM_SIGNAL_DETECTED_REQ );
       
   663       isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_SIGNAL_DETECTED_REQ_OFFSET_DTEID, aDteId );
       
   664       isimessage.Set8bit( ISI_HEADER_SIZE + AT_MODEM_SIGNAL_DETECTED_REQ_OFFSET_NOOFSUBBLOCKS, 0x01 );
       
   665       isimessage.Set8bit( msgSize + AT_MODEM_SB_SIGNAL_DETECTED_OFFSET_SUBBLOCKID,
       
   666         AT_MODEM_SB_SIGNAL_DETECTED );
       
   667       isimessage.Set8bit( msgSize + AT_MODEM_SB_SIGNAL_DETECTED_OFFSET_SUBBLOCKLENGTH,
       
   668         SIZE_AT_MODEM_SB_SIGNAL_DETECTED );
       
   669       isimessage.Set8bit( msgSize + AT_MODEM_SB_SIGNAL_DETECTED_OFFSET_TYPEOFSIGNALDETECTED,
       
   670         AT_MODEM_SIGNAL_ESCAPE_DETECTED );
       
   671       isimessage.Set8bit( msgSize + AT_MODEM_SB_SIGNAL_DETECTED_OFFSET_FILLERBYTE1, 0x00 );
       
   672       isimessage.Complete();
       
   673       error = iIscApi->Send(messageptr);
       
   674         C_TRACE((_L("escape send result %d"), error ));
       
   675       delete message;
       
   676       message = NULL;
       
   677       }
       
   678     else
       
   679       {
       
   680       ASSERT_ALWAYS;
       
   681       error = KErrNoMemory;
       
   682       }
       
   683     return error; 
       
   684     }
       
   685 
       
   686 
       
   687 void CModemAtHandler::HandleSignalDetectedResp( const TIsiReceiveC& aMessage )
       
   688     {
       
   689     C_TRACE (( _T("CModemAtHandler::HandleSignalDetectedResp() escape sequence detect response received from cellmo") ));
       
   690     TInt dteId( aMessage.Get8bit( ISI_HEADER_SIZE + AT_MODEM_SIGNAL_DETECTED_RESP_OFFSET_DTEID ) );
       
   691     TRACE_ASSERT( dteId < KMaxDteIdCount );
       
   692     TInt result = aMessage.Get8bit( ISI_HEADER_SIZE + AT_MODEM_SIGNAL_DETECTED_RESP_OFFSET_RESULT );
       
   693     C_TRACE((_L("CModemAtHandler::HandleSignalDetectedResp() dteId %d"), dteId));
       
   694     TRACE_ASSERT( result == AT_MODEM_RESULT_OK );
       
   695     }
       
   696