clock/clockengines/clockserver/client/src/clockserverclt.cpp
changeset 18 c198609911f9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clock/clockengines/clockserver/client/src/clockserverclt.cpp	Fri Apr 16 14:57:40 2010 +0300
@@ -0,0 +1,376 @@
+/*
+* Copyright (c) 2009 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:   The source file of the RClkSrvInterface class
+*
+*/
+
+// System includes
+#include <f32file.h>
+
+// User includes
+#include "clockserverclt.h"
+#include "clockservercommon.h"
+#include "clockservercmds.h"
+#include "clocktimesourceinterface.hrh"
+#include "clock_debug.h"
+
+// Constants
+const TInt KClockServerMajorVN( 1 );
+const TInt KClockServerMinorVN( 0 );
+const TInt KClockServerBuildVN( 1 );
+const TInt KOneSecond = 1000000;
+const TInt KMaxRetryTimes = 3;
+
+// Literals
+_LIT( KPanicLabel, "RClkSrvSession:Panic" );
+_LIT( KCommand, "");
+_LIT(KDC_PROGRAMS_DIR,"\\sys\\bin\\");
+_LIT( KClockServer, "Z:clockserver.exe");
+
+// ---------------------------------------------------------
+// RClkSrvInterface::RClkSrvInterface
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C RClkSrvInterface::RClkSrvInterface() : iWhatChanged( NULL, NULL, NULL ),
+										 		iWhoChanged( NULL, NULL, NULL )
+	{
+	__PRINTS( "RClkSrvInterface::RClkSrvInterface - Entry" );
+	
+    __PRINTS( "RClkSrvInterface::RClkSrvInterface - Exit" );
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::Connect
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::Connect()
+	{
+	__PRINTS( "RClkSrvInterface::Connect - Entry" );
+
+	TInt errVal( KErrNone );
+
+	// Create the session to the mentioned server.
+	errVal = CreateSession( KNameClockServer, Version(), KClockServerMessageSlots );
+
+	// Try to start the server and then try to create session.
+	if( KErrNone != errVal )
+		{
+		__PRINT( "RClkSrvInterface::Connect - Server has not been started - error code : %d", errVal );
+		
+		TRAP_IGNORE( StartClockSrvL() );
+
+		// Wait till server gets started.
+		TInt seconds(0);
+		while ( KErrNone != errVal )
+			{
+			errVal = CreateSession( KNameClockServer, Version(), KClockServerMessageSlots );
+			User::After( KOneSecond );
+			seconds++;
+			if ( KMaxRetryTimes == seconds )
+				{
+				errVal = KErrServerTerminated;
+				break;
+				}
+			}
+
+		}
+
+    __PRINTS( "RClkSrvInterface::Connect - Exit" );
+	
+	return errVal;
+}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::Version
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TVersion RClkSrvInterface::Version() const
+	{
+	__PRINTS( "RClkSrvInterface::Version - Entry" );
+	
+    __PRINTS( "RClkSrvInterface::Version - Exit" );
+
+	return TVersion( KClockServerMajorVN, KClockServerMinorVN, KClockServerBuildVN );
+	}
+	
+// ---------------------------------------------------------
+// RClkSrvInterface::ActivateProtocol
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::ActivateProtocol( TInt aClkSrvProtocol )
+	{
+	__PRINTS( "RClkSrvInterface::ActivateProtocol - Entry" );
+	__PRINT( "%x", aClkSrvProtocol );
+	
+    __PRINTS( "RClkSrvInterface::ActivateProtocol - Exit" );
+
+	// Send the message and receive completion status (synchronous)
+	return SendReceive( EClkSrvActivateProtocol, TIpcArgs( aClkSrvProtocol ) );
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::ActivateAllProtocols
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::ActivateAllProtocols()
+	{
+	__PRINTS( "RClkSrvInterface::ActivateAllProtocols - Entry" );
+	
+    __PRINTS( "RClkSrvInterface::ActivateAllProtocols - Exit" );
+
+	// Send the message and receive completion status (synchronous)
+	return SendReceive( EClkSrvActivateProtocol, TIpcArgs() );
+	}
+	
+// ---------------------------------------------------------
+// RClkSrvInterface::IsProtocolActive
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::IsProtocolActive( TInt aClkSrvProtocol, TBool& aActive )
+	{
+	__PRINTS( "RClkSrvInterface::IsProtocolActive - Entry" );
+	__PRINT( "%x", aClkSrvProtocol );
+	
+	TPckg< TBool > boolArg( aActive );
+
+    __PRINTS( "RClkSrvInterface::IsProtocolActive - Exit" );
+
+	// Send the message and receive completion status (synchronous)
+	return SendReceive( EClkSrvIsProtocolActive, TIpcArgs( aClkSrvProtocol, &boolArg ) );
+	}	
+
+// ---------------------------------------------------------
+// RClkSrvInterface::DeActivateProtocol()
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::DeActivateProtocol( TInt aClkSrvProtocol )
+	{
+	__PRINTS( "RClkSrvInterface::DeActivateProtocol() - Entry" );
+	__PRINT( "%x", aClkSrvProtocol );
+	
+    __PRINTS( "RClkSrvInterface::DeActivateProtocol() - Exit" );
+    
+	// Send the message and receive completion status (synchronous)
+	return SendReceive( EClkSrvDeactivateProtocol, TIpcArgs( aClkSrvProtocol ) );
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::DeActivateAllProtocols()
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::DeActivateAllProtocols()
+	{
+	__PRINTS( "RClkSrvInterface::DeActivateAllProtocols() - Entry" );
+	
+    __PRINTS( "RClkSrvInterface::DeActivateAllProtocols() - Exit" );
+    
+	// Send the message and receive completion status (synchronous)
+	return SendReceive( EClkSrvDeactivateProtocol, TIpcArgs() );
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::GetProtocolInfo()
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::GetProtocolInfo( TInt aClkSrvProtocol, STimeAttributes& aTimeAttribute )
+	{
+	__PRINTS( "RClkSrvInterface::GetProtocolInfo() - Entry" );
+	
+	TPckg< STimeAttributes > timeAttributeArg( aTimeAttribute );
+		
+	__PRINTS( "RClkSrvInterface::GetProtocolInfo() - Exit" );
+	
+	// Send the message and receive completion status (synchronous)
+	return SendReceive( EClkSrvGetProtocolInfo, TIpcArgs( aClkSrvProtocol, &timeAttributeArg ) );
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::GetCurrentMcc()
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::GetCurrentMcc( TInt& aCurrentMcc )
+	{
+	__PRINTS( "RClkSrvInterface::GetCurrentMcc() - Entry" );
+	
+	TPckg< TInt > aCurrentMccBuf( aCurrentMcc );
+	
+	TInt returnVal( SendReceive( EClkSrvGetCurrentMcc, TIpcArgs( &aCurrentMccBuf ) ) );
+	
+	__PRINT( "Current MCC - %d", aCurrentMcc );
+	
+	__PRINTS( "RClkSrvInterface::GetCurrentMcc() - Exit" );
+	
+	return returnVal;
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::GetCurrentTimeZondId()
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::GetCurrentTimeZondId( TInt& aCurrentTimeZoneId )
+	{
+	__PRINTS( "RClkSrvInterface::GetCurrentTimeZondId() - Entry" );
+	
+	TPckg< TInt > aCurrentTzIdBuf( aCurrentTimeZoneId );
+	
+	TInt returnVal( SendReceive( EClkSrvGetCurrentTimeZoneId, TIpcArgs( &aCurrentTzIdBuf ) ) );
+	
+	__PRINT( "Current timezone ID - %d", aCurrentTimeZoneId );
+	
+	__PRINTS( "RClkSrvInterface::GetCurrentTimeZondId() - Exit" );
+	
+	return returnVal;
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::NotifyOnChange()
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C void RClkSrvInterface::NotifyOnChange( TInt32& aWhatChanged, TInt32& aWhoChanged, TRequestStatus& aStatus )
+	{
+	__PRINTS( "RClkSrvInterface::NotifyOnChange() - Entry" );
+
+	iWhatChanged.Set( ( TUint8* )&aWhatChanged, sizeof( aWhatChanged ), sizeof( aWhatChanged ) );
+	iWhoChanged.Set( ( TUint8* )&aWhoChanged, sizeof( aWhoChanged ), sizeof( aWhoChanged ) );
+	
+	// Send the message and receive completion status (asynchronous)
+	SendReceive( EClkSrvNotifyOnChange, TIpcArgs( &iWhatChanged, &iWhoChanged ), aStatus );
+	
+	__PRINTS( "RClkSrvInterface::NotifyOnChange() - Exit" );
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::NotifyOnChange()
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C void RClkSrvInterface::NotifyOnChangeCancel()
+	{
+	__PRINTS( "RClkSrvInterface::NotifyOnChangeCancel() - Entry" );
+	
+	// Send the message and receive completion status (synchronous)
+	TInt returnVal = SendReceive( EClkSrvCancelNotifyOnChange, TIpcArgs() );
+	
+	__ASSERT_ALWAYS( KErrNone == returnVal || KErrServerTerminated,
+                                    Panic( EClkSrvCltNotifyChangeCancel ) );
+	
+	__PRINTS( "RClkSrvInterface::NotifyOnChangeCancel - Exit" );
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::IsAutoTimeUpdateOn
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RClkSrvInterface::IsAutoTimeUpdateOn( TBool& aEnabled )
+    {
+    __PRINTS( "RClkSrvInterface::IsAutoTimeUpdateOn - Entry" );
+
+    TPckg< TBool > boolArg( aEnabled );
+
+    __PRINTS( "RClkSrvInterface::IsAutoTimeUpdateOn - Exit" );
+    
+    // Send the message and receive completion status (synchronous)
+    return SendReceive( EClkSrvIsAutoTimeUpdadeOn, TIpcArgs( &boolArg ) );
+    }
+
+// ---------------------------------------------------------
+// RClkSrvInterface::IsClockSrvRunning() const
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+TInt RClkSrvInterface::IsClockSrvRunning() const
+	{
+	__PRINTS( "RClkSrvInterface::IsClockSrvRunning - Entry" );
+	
+	TInt retVal( KErrNone );
+	TFindServer findServer( KNameClockServer );
+	TFullName name;
+	if ( KErrNone != findServer.Next( name ) )
+		{
+		__PRINTS( "RClkSrvInterface::Server is not running - Entry" );
+		
+		RSemaphore semaphore;
+		// Waites for Starter to start the nitz server for max. 3 seconds.
+		for ( TInt i( 0 ); i < KMaxRetryTimes; i++ )
+			{
+			retVal = semaphore.OpenGlobal( KNameClockServerStartSemaphore );
+			if ( KErrNone == retVal )
+				{
+				__PRINTS( "RClkSrvInterface::Server is now running - Entry" );
+				
+				semaphore.Close();
+				break;
+				}
+			User::After( KOneSecond );
+			}
+		}
+		
+	__PRINTS( "RClkSrvInterface::IsClockSrvRunning - Exit" );
+	
+	return retVal;
+	}
+
+// ---------------------------------------------------------
+// RClkSrvInterface::StartClockSrvL()
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//
+void RClkSrvInterface::StartClockSrvL()
+	{
+	__PRINTS( "RClkSrvInterface::StartClockSrvL - Entry" );
+	
+	if ( KErrNone != IsClockSrvRunning( ) )
+        {
+		__PRINTS( "RClkSrvInterface::StartClockSrvL:IsClockSrvRunning - Entry" );
+		
+		TParse fileparser;
+		fileparser.Set( KClockServer, &KDC_PROGRAMS_DIR, NULL );
+
+		RProcess ClockSrvProc;
+		CleanupClosePushL( ClockSrvProc );        
+		User::LeaveIfError( ClockSrvProc.Create( fileparser.FullName( ), KCommand,
+												 TUidType( KNullUid, KNullUid, KClockSrvUid ) ) ); 
+
+
+		ClockSrvProc.Resume();
+		CleanupStack::PopAndDestroy( &ClockSrvProc );
+	}
+		
+	__PRINTS( "RClkSrvInterface::StartClockSrvL - Exit" );
+	}
+
+// ---------------------------------------------------------
+// Panic
+// rest of the details are commented in the header.
+// ---------------------------------------------------------
+//	
+GLDEF_C void Panic( TClkSrvSessionPanic aPanic )
+    {
+    User::Panic( KPanicLabel, aPanic );
+    }
+    
+// End of file