--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/server/CalenSvrClient/src/CalSvrClient.cpp Wed Sep 01 12:32:31 2010 +0100
@@ -0,0 +1,264 @@
+/*
+* 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: Provides methods for client session implementation of calendar server.
+ *
+*/
+
+
+
+//debug
+#include "calendarui_debug.h"
+
+#include "CalSvrClient.h"
+#include "CalSvrInitializer.h"
+
+#include "CalSvrDef.h"
+#include "CalServerSignaller.h"
+
+#include <e32base.h>
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+static TInt StartCalendarServer()
+ {
+ TRACE_ENTRY_POINT;
+
+ TRequestStatus started;
+ TCalServerStart start( started );
+
+ const TUidType serverUid( KNullUid, KNullUid, KNullUid );
+
+ //
+ // EPOC is easy, we just create a new server process. Simultaneous
+ // launching of two such processes should be detected when the
+ // second one attempts to create the server object, failing with
+ // KErrAlreadyExists.
+ //
+ RProcess server;
+ const TInt ret=server.Create( KCalSvrServerExe, start.AsCommand(), serverUid );
+
+ // Did we manage to create the thread/process?
+ if(ret != KErrNone)
+ {
+ TRACE_EXIT_POINT;
+ return ret;
+ }
+
+ // Wait to see if the thread/process died during construction
+ TRequestStatus serverDiedRequestStatus;
+ server.Rendezvous(serverDiedRequestStatus);
+
+ // do we have to abort?
+ if(serverDiedRequestStatus != KRequestPending)
+ {
+ server.Kill(0); // abort the sartup here
+ }
+ else
+ {
+ server.Resume(); // start server
+ }
+
+ User::WaitForRequest(serverDiedRequestStatus);
+
+ // determine the reason for the server exit
+ const TInt exitReason =(server.ExitType()==EExitPanic) ? KErrGeneral : serverDiedRequestStatus.Int();
+ server.Close();
+
+ TRACE_EXIT_POINT;
+ return exitReason;
+ }
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RCalSvrSession::RCalSvrSession()
+:RSessionBase(), iListenerCallback(NULL), iInitializer(NULL)
+ {
+ TRACE_ENTRY_POINT;
+ TRACE_EXIT_POINT;
+ }
+
+// open/close
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCalSvrSession::ConnectL()
+ {
+ TRACE_ENTRY_POINT;
+
+ // connect to server
+ TInt err( KErrNone );
+
+ for( TInt tries(0); tries < 2; tries++ )
+ {
+ err = CreateSession( KCalendarServerName, TVersion(0,0,0) );
+
+ if( !err )
+ {
+ // connected to existing server - ok
+ break;
+ }
+
+ if( err != KErrNotFound && err != KErrServerTerminated )
+ {
+ // problems other than server not here - propagate error
+ break;
+ }
+
+ err = StartCalendarServer();
+
+ if( !err || (err==KErrAlreadyExists) )
+ {
+ // if server launched ok, try again to connect
+ // OR
+ // if someone else got there first, try again to connect
+ continue;
+ }
+
+ break; // server not launched: don't cycle round again
+ }
+
+ User::LeaveIfError( err );
+
+ CleanupClosePushL( *this ); // Close if next operation leaves
+
+ iInitializer = new( ELeave )CCalSvrInitializer( *this );
+
+ CleanupStack::Pop( this );
+
+ TRACE_EXIT_POINT;
+ }
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCalSvrSession::Close()
+ {
+ TRACE_ENTRY_POINT;
+
+ delete iInitializer;
+ iInitializer = NULL;
+ RSessionBase::Close();
+
+ TRACE_EXIT_POINT;
+ }
+
+///////////////////////////////
+// These are high-level client interface functions
+///////////////////////////////
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCalSvrSession::Initialize(MCalSvrAgendaUpdateListener& aListener)
+ {
+ TRACE_ENTRY_POINT;
+
+ //__ASSERT_ALWAYS(!iInitializer->IsActive(), User::Invariant());
+ if(!(iInitializer->IsActive()) && (KRequestPending != iInitializer->iStatus.Int()))
+ {
+ iInitializer->Initialize(&aListener);
+ }
+
+ TRACE_EXIT_POINT;
+ }
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCalSvrSession::StopInitialization()
+ {
+ TRACE_ENTRY_POINT;
+
+ iInitializer->Cancel();
+
+ TRACE_EXIT_POINT;
+ }
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RCalSvrSession::Uninitialize()
+ {
+ TRACE_ENTRY_POINT;
+
+ if(iInitializer->IsActive())
+ {
+ iInitializer->Cancel();
+ }
+ SendReceive(ECalSvrUninitialize, TIpcArgs());
+
+ TRACE_EXIT_POINT;
+ }
+
+
+///////////////////////////////
+// These are low-level functions talking to server
+//////////////////////////////
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void RCalSvrSession::Initialize(TRequestStatus& aStatus)
+ {
+ TRACE_ENTRY_POINT;
+
+ SendReceive(ECalSvrInitialize, TIpcArgs(), aStatus);
+
+ TRACE_EXIT_POINT;
+ }
+
+// -----------------------------------------------------------------------------
+// ?classname::?member_function
+// ?implementation_description
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void RCalSvrSession::CancelInitialize()
+ {
+ TRACE_ENTRY_POINT;
+
+ SendReceive(ECalSvrCancelInitialize, TIpcArgs());
+
+ TRACE_EXIT_POINT;
+ }
+
+
+// End of File