messagingfw/alwaysonline/AlwaysOnlineManager/src/AlwaysOnlineManagerClient.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/alwaysonline/AlwaysOnlineManager/src/AlwaysOnlineManagerClient.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,271 @@
+/*
+* Copyright (c) 2002 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 class
+*
+*/
+
+
+#include "AlwaysOnlineManagerClient.h"
+#include "AlwaysOnlineManagerLogging.h"
+#include "AlwaysOnlineManagerStartupSignaller.h"
+#include "AlwaysOnlineManagerServer.h"
+#include "AOActiveScheduler.h"
+
+// ---------------------------------------------------------------------------
+// RAlwaysOnlineClientSession::RunServerL()
+// Called from AlwaysOnlineStarterApp
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void RunServerL()
+    {
+    KAOMANAGER_LOGGER_FN1("RunServerL()");
+
+    //first thing to do, rename the thread. If construct fails, 
+    //it is easier to debug when it's been named.
+    User::LeaveIfError( User::RenameThread( KAlwaysOnlineManagerServerName ) );
+    
+    
+    // Create and install the active scheduler we need
+	CAOActiveScheduler* AOScheduler = new (ELeave) CAOActiveScheduler( );
+    CleanupStack::PushL( AOScheduler );
+	CActiveScheduler::Install( AOScheduler );
+    
+    CAlwaysOnlineManagerServer* AOserver = CAlwaysOnlineManagerServer::NewL();
+    CleanupStack::PushL( AOserver );
+    
+    // set AOserver object to AOActiveScheduler
+    AOScheduler->SetServerRef( AOserver );
+    
+    // Rendezvous with starter
+    RProcess::Rendezvous( KErrNone );
+    
+    //
+    // Ready to run
+    CActiveScheduler::Start();
+    //
+    // Cleanup the server and scheduler
+    CleanupStack::PopAndDestroy( 2, AOScheduler );	// AOserver
+    KAOMANAGER_LOGGER_FN2("RunServerL()");
+    }
+
+
+// ---------------------------------------------------------------------------
+// StartThread
+// ---------------------------------------------------------------------------
+//
+TInt StartThread()
+    {
+    KAOMANAGER_LOGGER_FN1("StartThread");
+
+	TInt ret = KErrNone;
+	TRequestStatus startedRequestStatus;
+	TOAManagerStartupSignaller start(startedRequestStatus);
+
+    // check server not already started
+    TFindServer findAlwaysOnlineServer( KAlwaysOnlineManagerServerName );
+    TFullName name;
+    if (findAlwaysOnlineServer.Next(name)==KErrNone)
+        { // found server already - bad news
+        KAOMANAGER_LOGGER_FN2("StartThread1");
+        return KErrAlreadyExists;
+        }
+    const TUid KAlwaysOnlineManagerServerUid = {0x101F85EB};
+    const TUidType serverUid( KNullUid,KNullUid,KAlwaysOnlineManagerServerUid );
+
+        // We are on target HW.
+        RProcess server;
+        ret =server.Create(
+            KAlwaysOnlineManagerServerName, // Full path to BT server
+            start.AsCommand(), // Descriptor of parameters
+            serverUid);                // Triplet UID of executable
+
+	// Did we manage to create the thread/process?
+	if	(ret != KErrNone)
+        {
+        KAOMANAGER_LOGGER_FN2("StartThread4");
+		return ret;
+        }
+
+	// Wait to see if the thread/process died during construction
+	TRequestStatus serverDiedRequestStatus;
+	server.Logon(serverDiedRequestStatus);
+	
+	if	(serverDiedRequestStatus != KRequestPending)
+		{
+		//
+		// Logon failed - server is not yet running, so cannot 
+		// have terminated
+		//
+
+		// Eat signal
+		User::WaitForRequest(serverDiedRequestStatus);	// CSI: 94 # This is server side context
+		
+		// Abort startup
+		server.Kill(KErrNone);
+		server.Close();
+
+        KAOMANAGER_LOGGER_FN2("StartThread5");
+		return serverDiedRequestStatus.Int();
+		}
+
+	// Logon OK - start the server
+	server.Resume();
+
+	// Wait for either the server to start or for it to die
+	User::WaitForRequest(startedRequestStatus, serverDiedRequestStatus);	// CSI: 94 # This is server side context
+	if	(startedRequestStatus == KRequestPending)
+		{
+		// Server has died - never made it to the startup signal
+		server.Close();
+        KAOMANAGER_LOGGER_FN2("StartThread6");
+		return serverDiedRequestStatus.Int();
+		}
+
+	//
+	// Server started (at last). Cancel and consume the death-notification
+	// before reporting success
+	//
+	server.LogonCancel(serverDiedRequestStatus);
+	server.Close();
+
+	// Eat the signal (from the cancel)
+	User::WaitForRequest(serverDiedRequestStatus);	// CSI: 94 # This is server side context
+    KAOMANAGER_LOGGER_FN2("StartThread7");
+	return KErrNone;
+	}
+
+// ---------------------------------------------------------------------------
+// RMailboxPollingSession
+// ---------------------------------------------------------------------------
+//
+EXPORT_C RAlwaysOnlineClientSession::RAlwaysOnlineClientSession()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C RAlwaysOnlineClientSession::~RAlwaysOnlineClientSession()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Connect
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt RAlwaysOnlineClientSession::Connect()
+    {
+    KAOMANAGER_LOGGER_FN1("RAlwaysOnlineClientSession::Connect");
+
+    if ( Handle() )
+        {
+        KAOMANAGER_LOGGER_FN2("RAlwaysOnlineClientSession::Connect1");
+        return KErrAlreadyExists;
+        }
+
+    FOREVER
+        {
+        // Try to make session with server
+        TInt ret = CreateSession( KAlwaysOnlineManagerServerName,
+        						Version(), 
+        						KDefaultMessageSlots );
+        
+        if ( ret != KErrNotFound && ret != KErrServerTerminated )
+            {
+            KAOMANAGER_LOGGER_FN2("RAlwaysOnlineClientSession::Connect2");
+            return ret;
+            }
+        
+        // Try to start the server
+        ret=StartThread();
+        
+        if ( ret != KErrNone && ret != KErrAlreadyExists )
+            {
+            // Error can't be handled.
+            KAOMANAGER_LOGGER_FN2("RAlwaysOnlineClientSession::Connect3");
+            return ret;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// RAlwaysOnlineClientSession::Version()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TVersion RAlwaysOnlineClientSession::Version() const
+    {
+    return(TVersion(KAlwaysOnlineMajorVersionNumber,
+        KAlwaysOnlineMinorVersionNumber,
+        KAlwaysOnlineVersionNumber));
+    }
+
+// ---------------------------------------------------------------------------
+// RAlwaysOnlineClientSession::RelayCommandL
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void RAlwaysOnlineClientSession::RelayCommandL( 
+    TAlwaysOnlineServerAPICommands aCommand, 
+    TDes8& aParameter )
+    {
+    User::LeaveIfError( SendReceive( aCommand, TIpcArgs( &aParameter ) ) );
+    }
+
+// ---------------------------------------------------------------------------
+//  RAlwaysOnlineClientSession::AoApiSendMessageL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void RAlwaysOnlineClientSession::SendSinglePacketL(        
+    const TAlwaysOnlineServerAPICommands aCommand, 
+    TDes8& aParameter ) 
+    {
+    // Connect client and close the connection after the message is sent
+    User::LeaveIfError( Connect() );
+
+    // Send message to server and close it
+    RelayCommandL( aCommand, aParameter );
+    Close();
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void RAlwaysOnlineClientSession::SendCommandAsync( 
+    const TAlwaysOnlineServerAPICommands aCommand,
+    TDes8& aParameter,
+    TRequestStatus& aStatus )
+    {
+
+    aStatus = KRequestPending;
+    SendReceive( aCommand, TIpcArgs( &aParameter ), aStatus );
+    }
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt RAlwaysOnlineClientSession::SendReceiveSync(
+    const TAlwaysOnlineServerAPICommands aCommand,
+    TDes8& aParameter,
+    TDes8& aResultParameter )
+    {
+    TRequestStatus status = KRequestPending;
+    SendReceive( aCommand, 
+            TIpcArgs( &aParameter, &aResultParameter ), status );
+    
+    User::WaitForRequest( status );
+    
+    return status.Int();
+    }
+
+//#endif