localconnectivityservice/dun/client/src/dunclient.cpp
branchRCL_3
changeset 42 0aa8cc770c8a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localconnectivityservice/dun/client/src/dunclient.cpp	Tue Aug 31 16:03:15 2010 +0300
@@ -0,0 +1,164 @@
+/*
+* Copyright (c) 2006-2007 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:  Main client side interface of DUN
+*
+*/
+
+
+#include "dunclient.h"
+#include "dunserverdef.h"
+#include "DunDebug.h"
+#include "dunactive.h"
+
+const TInt KDunRetryCount        = 3;
+const TInt KDunNumOfMessageSlots = 4;
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Create server thread/process
+// ---------------------------------------------------------------------------
+//
+static TInt StartServer()
+    {
+    FTRACE(FPrint( _L("StartServer()") ));
+    TInt retVal = KErrNone;
+    TRequestStatus statusStarted;
+
+    RProcess server;
+    retVal = server.Create( KDialupServerName, KNullDesC, EOwnerThread );
+
+    if ( retVal != KErrNone )
+        {
+        FTRACE(FPrint( _L("StartServer() complete (%d)"), retVal ));
+        return retVal;
+        }
+
+    TRequestStatus stat;
+    server.Rendezvous( stat );
+
+    if ( stat != KRequestPending )
+        {
+        server.Kill( 0 );  //abort startup
+        }
+    else
+        {
+        server.Resume(); //logon OK - start the server
+        }
+
+    User::WaitForRequest( stat ); //wait the start or death of the server
+
+    /*
+    we can't use the 'exit reason' if the server panicked as this
+    is the panic 'reason' and may be '0' which cannot be distinguished
+    from KErrNone
+    */
+    retVal = stat.Int();
+    if ( server.ExitType() == EExitPanic )
+        {
+        retVal = KErrServerTerminated;
+        }
+
+    server.Close();
+    FTRACE(FPrint( _L("StartServer() complete (%d)"), retVal ));
+    return retVal;
+    }
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// RDun::RDun()
+// ---------------------------------------------------------------------------
+//
+RDun::RDun()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// This function starts DUN open/close for different medias
+// ---------------------------------------------------------------------------
+//
+TInt RDun::ManageService( MDunActive* aRequest, TRequestStatus& aReqStatus )
+    {
+    FTRACE(FPrint( _L("RDun::ManageService()") ));
+    SendReceive( EDunFuncManageService,
+                 TIpcArgs(aRequest->Bearer(),
+                          aRequest->BearerStatus()),
+                 aReqStatus );
+    FTRACE(FPrint( _L("RDun::ManageService() complete") ));
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// This function gets the active connection
+// ---------------------------------------------------------------------------
+//
+TAny* RDun::ActiveConnection()
+    {
+    FTRACE(FPrint( _L("RDun::ActiveConnection()") ));
+    TAny* connId = NULL;
+    TPckg<TAny*> connIdPckg( connId );
+    SendReceive( EDunFuncActiveConnection,
+                 TIpcArgs(&connIdPckg) );
+    FTRACE(FPrint( _L("RDun::ActiveConnection() complete") ));
+    return connId;
+    }
+
+// ---------------------------------------------------------------------------
+// Version number
+// ---------------------------------------------------------------------------
+//
+TVersion RDun::Version() const
+    {
+    FTRACE(FPrint( _L("RDun::Version()") ));
+    FTRACE(FPrint( _L("RDun::Version() complete") ));
+    return ( TVersion(KDunServerMajorVersionNumber,
+                      KDunServerMinorVersionNumber,
+                      KDunServerBuildVersionNumber) );
+    }
+
+// ---------------------------------------------------------------------------
+// This function connects to DUN server and creates a new session.
+// ---------------------------------------------------------------------------
+//
+TInt RDun::Connect()
+    {
+    FTRACE(FPrint( _L("RDun::Connect()") ));
+    TInt retry;
+    TInt retVal = KErrNone;
+    for ( retry=KDunRetryCount; retry>=0; retry-- )
+        {
+        retVal=CreateSession( KDialupServerName,
+                              TVersion(KDunServerMajorVersionNumber,
+                                       KDunServerMinorVersionNumber,
+                                       KDunServerBuildVersionNumber),
+                              KDunNumOfMessageSlots );
+        if ( retVal == KErrNotFound || retVal == KErrServerTerminated )
+            {
+            retVal = StartServer();
+            if ( retVal!=KErrNone && retVal!=KErrAlreadyExists )
+                {
+                FTRACE(FPrint( _L("RDun::Connect() complete (%d)"), retVal ));
+                return retVal;
+                }
+            }
+        else // KErrNone, or other error code.
+            {
+            FTRACE(FPrint( _L("RDun::Connect() complete (%d)"), retVal ));
+            return retVal;
+            }
+        }
+    FTRACE(FPrint( _L("RDun::Connect() complete (%d)"), retVal ));
+    return retVal;
+    }