diff -r 000000000000 -r 8e480a14352b messagingfw/alwaysonline/AlwaysOnlineManager/src/AlwaysOnlineManagerClient.cpp --- /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