bearermanagement/mpm/src/rmpm.cpp
changeset 0 5a93021fdf25
child 12 ea6e024ea6f9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bearermanagement/mpm/src/rmpm.cpp	Thu Dec 17 08:55:21 2009 +0200
@@ -0,0 +1,766 @@
+/*
+* Copyright (c) 2004-2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: MPM server client interface
+*
+*/
+
+
+/**
+@file rmpm.cpp
+Mobility Policy Manager server client interface.
+*/
+
+// INCLUDE FILES
+#include "rmpm.h"
+#include "mpmcommon.h"
+#include "mpmlauncher.h"
+#include "mpmlogger.h"
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// Panic 
+// Panics the client in case of programming error.
+// -----------------------------------------------------------------------------
+//
+void Panic( TInt aPanic )
+    {
+    User::Panic( KPanicCategory, aPanic );
+    }
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RMPM::LaunchServer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::LaunchServer()
+    {
+    return KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::Connect
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::Connect(  )
+    {
+    TRequestStatus status;
+    Connect( status );
+    User::WaitForRequest( status );
+    TInt err = status.Int();
+    if ( err != KErrNone )
+        {
+        iConnected = EFalse;
+        MPMLOGSTRING2( "RMPM::Connect - Error <%i> in CreateSession", err )
+        } 
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::Connect
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::Connect( TRequestStatus& aStatus )
+    {
+    TInt err( KErrNone );
+
+    if ( !iConnected )
+        {
+        MPMLOGSTRING( "RMPM::Connect: Client connecting to MPM Server" )
+        err = CreateSession( 
+                KMPMServerName,
+                Version(),
+                KNumMessageSlots,
+                EIpcSession_Unsharable,
+                (TSecurityPolicy*)0,
+                &aStatus );
+        if ( err != KErrNone )
+            {
+            //Connecting failed, probably because this is the first Connect() attempt.
+            TVersion version = Version();
+            MPMLOGSTRING3("Mobility Policy Manager version %d.%d", version.iMajor, 
+                                                                   version.iMinor )
+            err = MPMLauncher::LaunchServer( KMPMServerImg, 
+                                             KServerUid2, 
+                                             KServerUid3 );
+            if ( err != KErrNone )
+                {
+                MPMLOGSTRING2( "RMPM::Connect - Error <%i> in LaunchServer", err )
+                }
+            else
+                {
+                err = CreateSession( 
+                    KMPMServerName,
+                    Version(),
+                    KNumMessageSlots,
+                    EIpcSession_Unsharable,
+                    (TSecurityPolicy*)0,
+                    &aStatus );
+#ifdef _DEBUG
+                if (err != KErrNone)
+                    MPMLOGSTRING2( "RMPM::Connect - Error <%i> in CreateSession", err )
+#endif
+                }
+            }   
+        
+        //This can't be else, in case the inner CreateSession() succeeds.
+        if (err == KErrNone)
+           {
+           // session ok but waiting for MPM startup.
+           // We have to assume that it'll be ok.
+           TPtr8 ptr( reinterpret_cast< TUint8* >( NULL ), 0 );
+           TBool errFound = EFalse;
+           for (TUint i=0; ( (i < KNumPtrs) && !errFound ); i++)
+               {
+               err = iPtrArray.Append( ptr );
+               if ( err != KErrNone )
+                   {
+                   MPMLOGSTRING2(
+                       "RMPM::Connect - Error <%i> in ptrArray Append", err )
+                    errFound = ETrue;
+                   }
+               }
+           // If everything is fine, set client connected to true.
+           if ( err == KErrNone )
+               {
+               iConnected = ETrue;
+               }
+           // Else close the created session.
+           else
+               {
+               Close();
+               }
+           }
+        }
+    else
+        {
+        MPMLOGSTRING( "RMPM::Connect: Already connected to MPM Server" )
+        err = KErrNone;
+        }
+
+    // Finally, always complete the failing connects 
+    if ( err != KErrNone )
+        {
+        TRequestStatus* status = &aStatus;
+        User::RequestComplete( status, err );
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ChooseBestIAP
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ChooseBestIAP( TConnPref&           aConnPref,
+                                   const TConnectionId  aConnId,
+                                   const TUid           aAppUid,
+                                   TConnPref&           aPolicyPref,
+                                   TRequestStatus&      aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+    MPMLOGSTRING( "RMPM::ChooseBestIAP: Client asking iap" )
+
+    SendReceive( EMPMServerChooseIap,
+                 TIpcArgs( &aConnPref,
+                           aConnId, 
+                           aAppUid.iUid, 
+                           &aPolicyPref ),
+                 aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::ReselectBestIAP
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ReselectBestIAP( const TConnectionId    aConnId,
+                                     TConnPref&             aPolicyPref,
+                                     TRequestStatus&        aStatus ) 
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    MPMLOGSTRING( "RMPM::ReselectBestIAP: Client asking iap" )
+
+    SendReceive( EMPMServerReselectIap,
+                 TIpcArgs( aConnId, &aPolicyPref ),
+                 aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationLeavesConnection
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::ApplicationLeavesConnection( const TUint32       aIapId,
+                                                 const TConnectionId aConnId )
+    {
+    TRequestStatus status;
+    ApplicationLeavesConnection( aIapId, aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::IAPConnectionStopped
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::IAPConnectionStopped( const TUint32         aIapId,
+                                          const TConnectionId   aConnId )
+    {
+    TRequestStatus status;
+    IAPConnectionStopped( aIapId, aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+
+EXPORT_C void RMPM::IAPConnectionStopped( const TUint32         aIapId,
+                                          const TConnectionId   aConnId,
+                                          TRequestStatus&       aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    TIpcArgs args( aIapId, aConnId );
+
+    SendReceive( EMPMServerIapConnectionStopped, args, aStatus );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ProcessError
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ProcessError( TInt&                 aError,
+                                  const TConnectionId   aConnId,
+                                  TBMNeededAction&      aNeededAction,
+                                  TRequestStatus&       aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    TPtr8& pkg = NextPtr();
+    pkg.Set( reinterpret_cast< TUint8* >( &aError ),
+             sizeof( aError ),
+             sizeof( aError ) );
+
+    TPtr8& pkgAction = NextPtr();
+    pkgAction.Set( reinterpret_cast< TUint8* >( &aNeededAction ),
+                   sizeof( aNeededAction ),
+                   sizeof( aNeededAction ) );
+
+    TIpcArgs args( &pkg, aConnId, &pkgAction );
+
+    SendReceive( EMPMServerProcessError, args, aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::ProcessError
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ProcessError( TConnPref&           /*aConnPref*/,
+                                  TInt&                /*aError*/,
+                                  const TConnectionId  /*aConnId*/,
+                                  TBMNeededAction&     /*aNeededAction*/,
+                                  TRequestStatus&      /*aStatus*/ )
+    {
+    __ASSERT_ALWAYS( EFalse, Panic( KErrNotSupported ) );
+    //-jl- TODO remove this function from the API.
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::RegisterPrefIAPNotif
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::RegisterPrefIAPNotif( const TConnectionId   aConnId )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    TIpcArgs args( aConnId );
+
+    // SendReceive used here. MPM first sends preferred iap notifs before 
+    // completing this
+    // 
+    TRequestStatus status;
+    RegisterPrefIAPNotif( aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::RegisterPrefIAPNotif
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::RegisterPrefIAPNotif( const TConnectionId   aConnId,
+                                          TRequestStatus&       aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    TIpcArgs args( aConnId );
+
+    // SendReceive used here. MPM first sends preferred iap notifs before 
+    // completing this
+    // 
+    return SendReceive( EMPMServerRegisterPrefIAPNotif, args, aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::RegisterPrefIAPNotif
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::RegisterPrefIAPNotif( const TConnPref&     /*aConnPref*/,
+                                          const TConnectionId  /*aConnId*/ )
+    {
+    __ASSERT_ALWAYS( EFalse, Panic( KErrNotSupported ) );
+    //-jl- TODO remove this function from the API.
+    return NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::UnregisterPrefIAPNotif
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::UnregisterPrefIAPNotif( const TConnectionId aConnId )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    TIpcArgs args( aConnId );
+
+    // Server should update the connection state before function returns 
+    // No time consuming activities are done.
+    //
+    TRequestStatus status;
+    UnregisterPrefIAPNotif( aConnId, status );
+    User::WaitForRequest( status );
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::UnregisterPrefIAPNotif
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::UnregisterPrefIAPNotif( const TConnectionId aConnId,
+                                            TRequestStatus&     aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    TIpcArgs args( aConnId );
+
+    // Server should update the connection state before function returns 
+    // No time consuming activities are done.
+    //
+    SendReceive( EMPMServerUnregisterPrefIAPNotif, args, aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::WaitNotification
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::WaitNotification( TMPMMessageBuffer& aMpmNotification,
+                                      TRequestStatus&    aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    TIpcArgs args( &aMpmNotification );
+
+    SendReceive( EMPMServerWaitNotification, args, aStatus );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::SortSNAP
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::SortSNAP( const TUint32     aSNAP, 
+                              TMpmSnapBuffer&   aSortedList )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+    TRequestStatus status;
+    SortSNAP( aSNAP, aSortedList, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationJoinsConnection
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::ApplicationJoinsConnection( const TUint32       aIapId,
+                                                const TConnectionId aConnId )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+    TRequestStatus status;
+    ApplicationJoinsConnection( aIapId, aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::IAPConnectionActivated
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::IAPConnectionActivated( const TUint32       aIapId,
+                                            const TConnectionId aConnId )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    // Server response not necessary for the client, using Send
+    //
+    return Send( EMPMServerIapConnectionActivated, 
+                 TIpcArgs( aIapId, 
+                           aConnId ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::IAPConnectionStarted
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::IAPConnectionStarted( const TUint32         aIapId,
+                                          const TConnectionId   aConnId )
+    {
+    TRequestStatus status;
+    IAPConnectionStarted( aIapId, aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+
+EXPORT_C void RMPM::IAPConnectionStarted( const TUint32         aIapId,
+                                          const TConnectionId   aConnId,
+                                          TRequestStatus&       aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    // Server should update the connection state before function returns 
+    // No time consuming activities are done.
+    //
+    return SendReceive( EMPMServerIapConnectionStarted, 
+                        TIpcArgs( aIapId, aConnId ),
+                        aStatus );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationConnectionEnds
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::ApplicationConnectionEnds( const TConnectionId aConnId ) 
+    {
+    TRequestStatus status;
+    ApplicationConnectionEnds( aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationMigratesToCarrier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::ApplicationMigratesToCarrier( 
+    const TUint32         aIapId,
+    const TConnectionId   aConnId )
+    {
+    TRequestStatus status;
+    ApplicationMigratesToCarrier( aIapId, aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationIgnoredTheCarrier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::ApplicationIgnoredTheCarrier( 
+    const TUint32         aIapId,
+    const TConnectionId   aConnId )
+    {
+    TRequestStatus status;
+    ApplicationIgnoredTheCarrier( aIapId, aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationAcceptedTheCarrier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::ApplicationAcceptedTheCarrier( 
+    const TUint32        aIapId,
+    const TConnectionId  aConnId )
+    {
+    TRequestStatus status;
+    ApplicationAcceptedTheCarrier( aIapId, aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationRejectedTheCarrier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::ApplicationRejectedTheCarrier( 
+    const TUint32        aIapId,
+    const TConnectionId  aConnId )
+    {
+    TRequestStatus status;
+    ApplicationRejectedTheCarrier( aIapId, aConnId, status );
+    User::WaitForRequest( status );
+    return status.Int();
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::EasyWlanSsid
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::EasyWlanSsid( const TWlanSsid& aSSID )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    return SendReceive( EMPMServerEasyWlanSsid, 
+                        TIpcArgs( &aSSID ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::Version
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TVersion RMPM::Version() const
+    {
+    return TVersion( KMPMServerMajorVersionNumber,
+                     KMPMServerMinorVersionNumber,
+                     KMPMServerBuildVersionNumber );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::Cancel
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::Cancel( TMpmAsynchCodes aReqToCancel ) const
+    {
+    __ASSERT_ALWAYS( iConnected, Panic(ERMPMPanicClientNotConnected) );
+    MPMLOGSTRING("RMPM::Cancel: Client canceling the request")
+    SendReceive( EMPMServerCancelRequest, TIpcArgs( aReqToCancel ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::Close
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::Close()
+    {
+    MPMLOGSTRING("RMPM::Close: Client closing connection")
+
+    iPtrArray.Close() ;
+    iConnected = EFalse;
+
+    RSessionBase::Close();
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::Connected
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool RMPM::Connected()
+    {
+    return iConnected;
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationJoinsConnection
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ApplicationJoinsConnection( const TUint32       aIapId,
+                                                const TConnectionId aConnId,
+                                                TRequestStatus&     aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    // Server should update the connection state before function returns 
+    // No time consuming activities are done.
+    //
+    return SendReceive( EMPMServerApplicationJoinsConnection, 
+                        TIpcArgs( aIapId, aConnId ),
+                        aStatus );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationLeavesConnection
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ApplicationLeavesConnection( const TUint32       aIapId,
+                                                 const TConnectionId aConnId,
+                                                 TRequestStatus&     aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    TIpcArgs args( aIapId, aConnId );
+
+    return SendReceive( EMPMServerApplicationLeavesConnection, args, aStatus );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationConnectionEnds
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ApplicationConnectionEnds( const TConnectionId aConnId,
+                                               TRequestStatus&     aStatus ) 
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    // Server should update the connection state before function returns 
+    // No time consuming activities are done.
+    //
+    return SendReceive( EMPMServerApplicationConnectionEnds, 
+                        TIpcArgs( aConnId ), aStatus );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::SendCancelRequest
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RMPM::SendCancelRequest( TMpmAsynchCodes aReqToCancel ) const
+    {
+    __ASSERT_ALWAYS( iConnected, Panic(ERMPMPanicClientNotConnected) );
+    MPMLOGSTRING("RMPM::SendCancelRequest: Client canceling the request")
+    // There must always be one free slot.
+    return Send( EMPMServerCancelRequest, TIpcArgs( aReqToCancel ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationMigratesToCarrier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ApplicationMigratesToCarrier( const TUint32         aIapId,
+                                                  const TConnectionId   aConnId,
+                                                  TRequestStatus&       aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    return SendReceive( EMPMServerApplicationMigratesToCarrier,  
+                        TIpcArgs( aIapId, aConnId ), 
+                        aStatus );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationIgnoredTheCarrier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ApplicationIgnoredTheCarrier( const TUint32         aIapId,
+                                                  const TConnectionId   aConnId,
+                                                  TRequestStatus&       aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    // SendReceive used here. MPM sends preferred iap or error notification 
+    // before completing this
+    // 
+    return SendReceive( EMPMServerApplicationIgnoredTheCarrier,  
+                        TIpcArgs( aIapId, aConnId ), 
+                        aStatus );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationAcceptedTheCarrier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ApplicationAcceptedTheCarrier( const TUint32        aIapId,
+                                                   const TConnectionId  aConnId,
+                                                   TRequestStatus&      aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    // Server should update the connection state before function returns 
+    // No time consuming activities are done.
+    //
+    return SendReceive( EMPMServerApplicationAcceptedTheCarrier, 
+                        TIpcArgs( aIapId, aConnId ),
+                        aStatus );
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPM::ApplicationRejectedTheCarrier
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::ApplicationRejectedTheCarrier( const TUint32        aIapId,
+                                                   const TConnectionId  aConnId,
+                                                   TRequestStatus&      aStatus )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    // SendReceive used here. MPM sends preferred iap or error notifications 
+    // before completing this
+    // 
+    return SendReceive( EMPMServerApplicationRejectedTheCarrier, 
+                        TIpcArgs( aIapId, aConnId ),
+                        aStatus);
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::SortSNAP
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RMPM::SortSNAP( const TUint32   aSNAP, 
+                              TMpmSnapBuffer& aSortedList,
+                              TRequestStatus& aStatus,
+                              const TUint32   aMaxAgeSeconds )
+    {
+    __ASSERT_ALWAYS( iConnected, Panic( ERMPMPanicClientNotConnected ) );
+
+    TPtr8 n( reinterpret_cast< TUint8* >( &aSortedList ), sizeof( aSortedList ) );
+    TIpcArgs args( aSNAP, &n, aMaxAgeSeconds );
+
+    // Server response is needed before returning from the call
+    //
+    return SendReceive( EMPMServerSortSNAP, args, aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// RMPM::NextPtr
+// -----------------------------------------------------------------------------
+//
+TPtr8& RMPM::NextPtr()
+    {
+    __ASSERT_ALWAYS( iConnected, Panic(ERMPMPanicClientNotConnected) );
+
+    if ( iIndex >= iPtrArray.Count() )
+        {
+        iIndex = 0;
+        }
+
+    return iPtrArray[ iIndex++ ];
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File