adaptationlayer/modematadaptation/modematcontroller_exe/src/cmodematsrv.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 "cmodematsrv.h"
       
    21 #include "modematclientsrv.h"
       
    22 #include "modematsecpolicy.h"
       
    23 #include "cmodematsession.h"
       
    24 #include "cmodemathandler.h"
       
    25 #include "modemattrace.h"
       
    26 #include "catmessage.h"
       
    27 
       
    28 
       
    29 CModemAtSrv::CModemAtSrv( TInt aPriority ) :
       
    30     CPolicyServer( aPriority, KSrvPolicy ), iHandler(NULL)
       
    31     {
       
    32     }
       
    33 
       
    34 CModemAtSrv::~CModemAtSrv()
       
    35     {
       
    36     C_TRACE (( _L(">>CModemAtSrv::~CModemAtSrv()") ));
       
    37     iAtMessageArray.ResetAndDestroy();
       
    38     iAtMessageArray.Close();
       
    39     C_TRACE (( _L("<<CModemAtSrv::~CModemAtSrv()") ));
       
    40     }
       
    41 
       
    42 CModemAtSrv* CModemAtSrv::NewLC()
       
    43     {
       
    44     CModemAtSrv* self = new (ELeave) CModemAtSrv( EPriorityNormal );
       
    45     CleanupStack::PushL( self );
       
    46     self->ConstructL();
       
    47     self->StartL( KATExtSrvName );
       
    48     RThread().SetPriority( EPriorityNormal );
       
    49     return self;
       
    50     }
       
    51 
       
    52 void CModemAtSrv::RemovePipe( const TUint8 aDteId )
       
    53     {
       
    54     C_TRACE((_L("CModemAtSrv::RemovePipe()") ));
       
    55     iHandler->RemovePipe( aDteId );
       
    56     }
       
    57 
       
    58 void CModemAtSrv::ClientClosed( CModemAtSession* aSession )
       
    59     {
       
    60     C_TRACE (( _L("CModemAtSrv::ClientClosed()") ));
       
    61     TInt index = iSessions.Find( aSession );
       
    62     if( index >= 0 )
       
    63         {
       
    64         //remove session from routing table, if dteId exists
       
    65         if(iSessions[index]->GetDteId() != KInitialDteId )
       
    66             {
       
    67             iRouteTable[ iSessions[index]->GetPluginType() ][ iSessions[index]->GetDteId() ] = NULL;
       
    68             }
       
    69         
       
    70         if( iSessions.Count() == 1 )
       
    71             {
       
    72             C_TRACE((_L("Disconnecting ISI message handler ") ));
       
    73             iHandler->Disconnect( iSessions[ index ]->GetDteId() );
       
    74             }
       
    75     
       
    76         C_TRACE((_L("Removing session (plugin type %d dteid: %d)"), iSessions[index]->GetPluginType(), iSessions[index]->GetDteId() ));
       
    77         iSessions.Remove( index );
       
    78         
       
    79         C_TRACE((_T("<<CModemAtSrv::ClientClosed()") ));
       
    80         }
       
    81     }
       
    82  
       
    83 CSession2* CModemAtSrv::NewSessionL( const TVersion& aVersion,
       
    84                                    const RMessage2& /*aMessage*/ ) const
       
    85     {
       
    86     C_TRACE (( _T("CModemAtSrv::NewSessionL()") ));
       
    87     CModemAtSrv& thisServer = const_cast<CModemAtSrv&>( *this );
       
    88     CModemAtSession* session = CModemAtSession::NewL( thisServer, aVersion );
       
    89     CleanupStack::PushL( session );
       
    90     thisServer.iSessions.AppendL( session );
       
    91     CleanupStack::Pop( session );
       
    92     return session;
       
    93     }
       
    94 
       
    95 void CModemAtSrv::ConstructL()
       
    96     {
       
    97     C_TRACE (( _T("CModemAtSrv::ConstructL()") ));
       
    98     iHandler = CModemAtHandler::NewL( *this );
       
    99     
       
   100      //setup routing table
       
   101     for( TInt i = 0 ; i < KPluginCount ; i++)
       
   102         {
       
   103         for(TInt o = 0; o < KMaxDteIdCount; o++)
       
   104             {
       
   105             iRouteTable[ i ][ o ] = NULL;
       
   106             }
       
   107         }
       
   108     } 
       
   109 
       
   110 void CModemAtSrv::HandleSignalInd( const TInt aDteId )
       
   111     {
       
   112     C_TRACE ((_T("CModemAtSrv::HandleSignalInd aDteId = %d sessions = %d"), aDteId, iSessions.Count() ));
       
   113     for( TInt i = 0; i < iSessions.Count(); i++ )
       
   114         {
       
   115         if( iSessions[i]->GetDteId() == aDteId  && iSessions[i]->IsSignalIndReqActive() )
       
   116             {
       
   117             C_TRACE (( _T("CModemAtSrv::HandleSignalInd() session found") ));
       
   118             iSessions[i]->SignalIndReceived();
       
   119             }
       
   120         }
       
   121     }
       
   122 
       
   123 void CModemAtSrv::HandleUnsolicitedData( const TInt aDteId, const TDesC8& aData )
       
   124     {
       
   125     C_TRACE ((_T("CModemAtSrv::HandleUnsolicitedData aDteId = %d sessions = %d"), aDteId, iSessions.Count() ));
       
   126     for( TInt i = 0; i < iSessions.Count(); i++ )
       
   127         {
       
   128         if( (iSessions[i]->GetDteId() == aDteId || aDteId == KUnsolicitedDataDteId )&&
       
   129             iSessions[i]->IsUnsolicitedDataReqActive() &&
       
   130             iSessions[i]->GetPluginType() == EATExtPlugin )
       
   131             {
       
   132             C_TRACE (( _T("CModemAtSrv::HandleUnsolicitedData() session found") ));
       
   133             iSessions[i]->UnsolicitedData( aData );
       
   134             }
       
   135         }
       
   136     }
       
   137 
       
   138 void CModemAtSrv::HandleCommandModeChange( TInt aDteId, TCommandMode aMode )
       
   139     {
       
   140     C_TRACE ((_T("CModemAtSrv::HandleCommandModeChange aDteId = %d sessions = %d mode = %d"), aDteId, iSessions.Count(), (TInt) aMode ));
       
   141     for( TInt i = 0; i < iSessions.Count(); i++ )
       
   142         {
       
   143         if( iSessions[i]->GetDteId() == aDteId &&
       
   144             iSessions[i]->IsCommandModeReqActive() &&
       
   145             iSessions[i]->GetPluginType() == ECommonPlugin )
       
   146             {
       
   147             C_TRACE (( _T("CModemAtSrv::HandleCommandModeChange() session found") ));
       
   148             iSessions[i]->CommandModeChanged( aMode );
       
   149             }
       
   150         }
       
   151     }
       
   152 
       
   153 void CModemAtSrv::BroadcastModemConnected(const TUint aDteId, TInt aErr )
       
   154     {
       
   155     C_TRACE ((_T("CModemAtSrv::BroadcastModemConnected aDteId = %d err = %d sessions = %d"), aDteId, aErr, iSessions.Count() ));
       
   156     for( TInt i = 0; i < iSessions.Count(); i++ )
       
   157         {
       
   158         if( iSessions[i]->GetDteId() == aDteId  && iSessions[i]->IsConnectReqActive() )
       
   159             {
       
   160             C_TRACE (( _T("CModemAtSrv::BroadcastModemConnected() session found") ));
       
   161             iSessions[i]->ModemConnected( aErr );
       
   162             }
       
   163         }
       
   164     }
       
   165 
       
   166 void CModemAtSrv::HandleIntermediateDataInd( const TInt aDteId,
       
   167     const TATPluginInterface aPluginType,
       
   168     const TDesC8& aResponse,
       
   169     const TUint8 aCommand )
       
   170     {
       
   171     C_TRACE ((_T("CModemAtSrv::HandleIntermediateDataInd aDteId = %d sessions = %d "), aDteId, iSessions.Count() ));
       
   172     C_TRACE ((_T("plugintype = %d command = %d"), (TInt)aPluginType, aCommand ));
       
   173     
       
   174     if ( iAtMessageArray.Count() > 0 )
       
   175         {
       
   176         C_TRACE((_L("iAtMessageArray[0]->ReceiveATResponse Intermediate data")));
       
   177         iAtMessageArray[0]->ReceiveATResponse( aResponse, EFalse );
       
   178         }
       
   179     else
       
   180         {
       
   181         C_TRACE ((_T("CModemAtSrv::HandleIntermediateDataInd INTERMEDIATE DATA received but no request active") ));
       
   182         }
       
   183     }
       
   184 
       
   185 void CModemAtSrv::HandleATResponse( const TInt aDteId, const TDesC8& aResponse, const TUint8 aCommand )
       
   186     {
       
   187     C_TRACE ((_T(">>CModemAtSrv::HandleATResponse aDteId = %d sessions = %d "), aDteId, iSessions.Count() ));
       
   188     C_TRACE ((_T("CModemAtSrv::HandleATResponse command = %d"), aCommand ));
       
   189     
       
   190     if ( iAtMessageArray.Count() > 0 )
       
   191         {
       
   192         CAtMessage* tmp = iAtMessageArray[0];
       
   193         C_TRACE((_L("iAtMessageArray[0]->ReceiveATResponse 0x%x"), tmp ));
       
   194         tmp->ReceiveATResponse( aResponse, ETrue );
       
   195         C_TRACE((_L("CModemAtSrv::HandleATResponse Remove the first message in Fifo")));
       
   196         RemoveFirstFromSendFifo();
       
   197         C_TRACE((_L("CModemAtSrv::HandleATResponse SendNextFromFifo")));
       
   198         SendNextFromFifo();
       
   199         }
       
   200     else
       
   201         {
       
   202         HandleUnsolicitedData( aDteId, aResponse);
       
   203         }
       
   204     C_TRACE ((_T("<<CModemAtSrv::HandleATResponse()") ));
       
   205     }
       
   206 
       
   207 void CModemAtSrv::ConnectToModem(CModemAtSession* aSession) 
       
   208     {
       
   209     C_TRACE ((_T(">>CModemAtSrv::ConnectToModem 0x%x"), aSession));
       
   210     TInt type = aSession->GetPluginType();
       
   211    
       
   212     C_TRACE(( _L("session count: %d, type: %d"), iSessions.Count(), type ));
       
   213     //find already defined dteid
       
   214     for(TInt i = 0; i < iSessions.Count(); i++) 
       
   215         {
       
   216         TInt dteid = iSessions[i]->GetDteId();
       
   217         TDesC8& name = iSessions[i]->GetName();
       
   218         C_TRACE((_L("i: %d, dteid: %d"), i, dteid));
       
   219         
       
   220         //Is there plugin with samename
       
   221         if( name.Compare(aSession->GetName())== 0 && dteid != KInitialDteId )
       
   222             {
       
   223             if( type == iSessions[i]->GetPluginType())
       
   224                 {
       
   225                 TRACE_ASSERT_ALWAYS;
       
   226                 aSession->SetDteId( dteid );
       
   227                 aSession->ModemConnected((TInt)KErrAlreadyExists);
       
   228                 C_TRACE ((_T("<<CModemAtSrv::ConnectToModem 0x%x"), aSession));
       
   229                 return;
       
   230                 }
       
   231             //add current session to route table
       
   232             C_TRACE((_L("AddSessionToRouteTable type: %d, dteid: %d"), type, aSession->GetDteId()));
       
   233             iRouteTable[aSession->GetPluginType()][dteid] = aSession;
       
   234             C_TRACE((_L("Interface exists=> %d"),dteid));
       
   235           
       
   236             aSession->SetDteId( dteid );
       
   237             aSession->ModemConnected(KErrNone); //connected
       
   238             C_TRACE ((_T("<<CModemAtSrv::ConnectToModem 0x%x"), aSession));
       
   239             return;
       
   240             }
       
   241         }
       
   242              
       
   243     //no AT-plugin& Common plugin, find first free dteid
       
   244     TInt dteId = 0;
       
   245     while(iRouteTable[0][dteId] || iRouteTable[1][dteId])
       
   246         {
       
   247         dteId++;
       
   248       }     
       
   249     ASSERT_PANIC_ALWAYS( dteId < KMaxDteIdCount );
       
   250     iRouteTable[type][dteId] = aSession;
       
   251     C_TRACE((_L("Added new dteid: %d"),dteId));
       
   252 
       
   253     aSession->SetDteId(dteId);
       
   254     iHandler->Connect(dteId);
       
   255     C_TRACE ((_T("<<CModemAtSrv::ConnectToModem 0x%x"), aSession));
       
   256     }
       
   257 
       
   258 void CModemAtSrv::AddToSendFifo( const TUint8 aDteId,
       
   259     const TATPluginInterface aPluginType,
       
   260     CAtMessage* aMessage )
       
   261     {
       
   262     C_TRACE (( _T("CModemAtSrv::AddToSendFifo( dteId = %d,0x%x)"), aDteId, aMessage  ));
       
   263 
       
   264     iAtMessageArray.Append( aMessage ); // only one AT command at the time in modem
       
   265 
       
   266     if( iAtMessageArray.Count() == 1 ) //if empty Fifo send immediately
       
   267         {
       
   268         C_TRACE((_L("Sending message immediately")));
       
   269         iHandler->SendATCommand( aDteId, 
       
   270            aPluginType,
       
   271            aMessage->GetMessageType(),
       
   272            aMessage->GetBuffer() );
       
   273         }
       
   274     }
       
   275 
       
   276 void CModemAtSrv::RemoveFirstFromSendFifo()
       
   277     {
       
   278     C_TRACE(( _T("CModemAtSrv::RemoveFirstFromSendFifo iAtMessageArray.Count = %d"), iAtMessageArray.Count() ));
       
   279     if( iAtMessageArray.Count( ) > 0 )
       
   280         {
       
   281         C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 1") ));
       
   282         CAtMessage* msg = iAtMessageArray[0];
       
   283         C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 2 0x%x"), msg ));
       
   284         iAtMessageArray.Remove(0);
       
   285         if( msg )
       
   286             {
       
   287             C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 3") ));
       
   288             delete msg;
       
   289             }
       
   290         else
       
   291             {
       
   292             TRACE_ASSERT_ALWAYS;
       
   293             }
       
   294         C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 4") ));
       
   295         }
       
   296     C_TRACE (( _T("CModemAtSrv::RemoveFirstFromSendFifo 5") ));
       
   297     }
       
   298 
       
   299 void CModemAtSrv::SendNextFromFifo()
       
   300     {
       
   301     C_TRACE ((_T("CModemAtSrv::SendNextFromFifo fifo has %d message(s)"), iAtMessageArray.Count() ));
       
   302     
       
   303     TPtr8 ptr(0,0);
       
   304     if( iAtMessageArray.Count() > 0 )
       
   305         {
       
   306         C_TRACE((_L("Messages in buffer... Sending message")));
       
   307         ptr.Set( iAtMessageArray[0]->GetBuffer() );
       
   308         
       
   309         C_TRACE (( _T("iHandler->SendATCommand()") ));
       
   310         iHandler->SendATCommand( iAtMessageArray[0]->GetSession()->GetDteId(), 
       
   311            iAtMessageArray[0]->GetSession()->GetPluginType(),
       
   312            iAtMessageArray[0]->GetMessageType(),
       
   313            ptr );
       
   314         }
       
   315     }
       
   316 
       
   317 void CModemAtSrv::CancelFifoRequests( const CModemAtSession* aSession )
       
   318     {
       
   319     C_TRACE((_T(">>CModemAtSrv::CancelFifoRequests count: %d"), iAtMessageArray.Count() ));
       
   320     TInt messageCount = iAtMessageArray.Count();
       
   321     for( TInt i = 0; i < messageCount; i++ )
       
   322         {
       
   323         C_TRACE((_T("CancelFifoRequests %d"), i ));
       
   324         CAtMessage* msg = iAtMessageArray[ i ];
       
   325         if( msg )
       
   326             {
       
   327             C_TRACE((_T("Found Request: 0x%x"),msg ));
       
   328             if( msg->GetSession() == aSession)
       
   329                 {
       
   330                 C_TRACE((_T("CancelFifoRequests - canceling request") ));
       
   331                 msg->CancelRequest();
       
   332                 C_TRACE (( _T("CModemAtSrv::CancelFifoRequest delete msg") ));
       
   333                 delete msg;
       
   334                 }
       
   335             }
       
   336         }
       
   337     C_TRACE (( _T("CModemAtSrv::CancelFifoRequest iAtMessageArray.Remove %d messages"), messageCount ));
       
   338     for( TInt j = 0; j < messageCount && iAtMessageArray.Count() > 0; j++ )
       
   339         {
       
   340         iAtMessageArray.Remove( 0 );
       
   341         }
       
   342     C_TRACE(( _T("<<CModemAtSrv::CancelFifoRequests()") ));
       
   343     }
       
   344 
       
   345 TInt CModemAtSrv::SessionCount()
       
   346     {
       
   347     C_TRACE(( _T("CModemAtSrv::SessionCount() %d"), iSessions.Count() ));
       
   348     return iSessions.Count();
       
   349     }
       
   350