--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/contentstorage/caclient/s60/src/caclientsession.cpp Fri Mar 19 09:35:23 2010 +0200
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 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:
+ *
+ */
+
+#include "cautils.h"
+#include "caclientsession.h"
+#include "caclientsubsession.h"
+#include "caclientproxy.h"
+#include "cainnerentry.h"
+#include "cainnerquery.h"
+#include "caidsarray.h"
+#include "caentriesarray.h"
+#include "caclientnotifierproxy.h"
+
+const TInt KInnerEntryExpandSize = 1024;
+
+// Function prototypes
+static TInt StartServer();
+static TInt CreateServerProcess();
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+RCaClientSession::RCaClientSession() :
+ RSessionBase()
+ {
+ // No implementation required
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+TInt RCaClientSession::Connect()
+ {
+ TInt error =
+ CreateSession( KCaSrvName, Version() );
+ if( error == KErrNone )
+ {
+ ShareAuto();
+ }
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+TInt RCaClientSession::StartServer()
+ {
+ return ::StartServer();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void RCaClientSession::Close()
+ {
+ RSessionBase::Close();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+TVersion RCaClientSession::Version() const
+ {
+ return ( TVersion( KCaMajorVersion, KCaMinorVersion, KCaBuild ) );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void RCaClientSession::GetListL( const CCaInnerQuery& aQuery,
+ RCaEntriesArray& aResult )
+ {
+ TInt resultSize(0);
+ TInt error = GetSizeL( aQuery, EContentArsenalGetList_GetSize,
+ resultSize );
+
+ if( error == KErrNone )
+ {
+ error = GetResultL( resultSize, EContentArsenalGetList_GetData,
+ aResult );
+ }
+
+ User::LeaveIfError( error );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void RCaClientSession::GetEntryIdsL( const CCaInnerQuery& aQuery,
+ RCaIdsArray& aResult )
+ {
+ TInt resultSize( 0 );
+ TInt error = GetSizeL( aQuery, EContentArsenalGetIds_GetSize,
+ resultSize );
+
+ if( error == KErrNone )
+ {
+ error = GetResultL( resultSize, EContentArsenalGetIds_GetData,
+ aResult );
+ }
+
+ User::LeaveIfError( error );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+TInt RCaClientSession::GetSizeL( const CCaInnerQuery& aQuery,
+ const TCaServerRequests aServerRequest, TInt& aResultSize )
+ {
+ TIpcArgs args;
+ HBufC8* serializedQuery = MenuUtils::MarshalDataL( aQuery, 128 );
+ CleanupStack::PushL( serializedQuery );
+ args.Set( KInputPosition1, serializedQuery );
+ TPckg<TInt> sizeDes( aResultSize );
+ args.Set( KOutputPosition, &sizeDes );
+ TInt error = SendReceive( aServerRequest, args );
+ CleanupStack::PopAndDestroy( serializedQuery );
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void RCaClientSession::AddL( CCaInnerEntry& aEntry )
+ {
+ TIpcArgs args;
+ HBufC8* serializedEntry = MenuUtils::MarshalDataL( aEntry, KInnerEntryExpandSize );
+ CleanupStack::PushL( serializedEntry );
+ args.Set( KInputPosition1, serializedEntry );
+ TInt id( 0 );
+ TPckg<TInt> resultId( id );
+ args.Set( KOutputPosition, &resultId );
+
+ TInt error = SendReceive( EContentArsenalAdd, args );
+ User::LeaveIfError( error );
+ aEntry.SetId( id );
+
+ CleanupStack::PopAndDestroy( serializedEntry );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void RCaClientSession::RemoveL( const RCaIdsArray& aEntries )
+ {
+ TIpcArgs args;
+ HBufC8* inbuf = aEntries.MarshalDataLC();
+ args.Set( KInputPosition1, inbuf );
+ User::LeaveIfError( SendReceive( EContentArsenalRemove, args ) );
+ CleanupStack::PopAndDestroy( inbuf );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void RCaClientSession::OrganizeL( const RCaIdsArray& aEntries,
+ TCaOperationParams aParams )
+ {
+ TIpcArgs args;
+ HBufC8* inbuf = aEntries.MarshalDataLC();
+ args.Set( KInputPosition1, inbuf );
+ TPckg<TCaOperationParams> data( aParams );
+ args.Set( KInputPosition2, &data );
+ User::LeaveIfError( SendReceive( EContentArsenalOrganize, args ) );
+ CleanupStack::PopAndDestroy( inbuf );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void RCaClientSession::TouchL( const CCaInnerEntry& aEntry )
+ {
+ TIpcArgs args;
+ HBufC8* serializedEntry = MenuUtils::MarshalDataL( aEntry, KInnerEntryExpandSize );
+ CleanupStack::PushL( serializedEntry );
+ args.Set( KInputPosition1, serializedEntry );
+
+ User::LeaveIfError( SendReceive( EContentArsenalTouch, args ) );
+
+ CleanupStack::PopAndDestroy( serializedEntry );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void RCaClientSession::CustomSortL( const RCaIdsArray& aEntries,
+ const TInt aGroupId )
+ {
+ TIpcArgs args;
+ HBufC8* inbuf = aEntries.MarshalDataLC();
+ args.Set( KInputPosition1, inbuf );
+ TPckg<TInt> groupId( aGroupId );
+ args.Set( KInputPosition2, &groupId );
+ User::LeaveIfError( SendReceive( EContentArsenalCustomSort, args ) );
+ CleanupStack::PopAndDestroy( inbuf );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+template<typename SerializableObject>
+TInt RCaClientSession::GetResultL( TInt aSize, TCaServerRequests aRequest,
+ SerializableObject& aObject )
+ {
+ TIpcArgs args;
+ RBuf8 outbuf;
+ outbuf.CleanupClosePushL();
+ outbuf.CreateL( aSize );
+ args.Set( KOutputPosition, &outbuf );
+ TInt error = SendReceive( aRequest, args );
+ if( error == KErrNone )
+ {
+ RDesReadStream stream( outbuf );
+ CleanupClosePushL( stream );
+ aObject.InternalizeL( stream );
+ CleanupStack::PopAndDestroy( &stream );
+ }
+ CleanupStack::PopAndDestroy( &outbuf );
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// StartServer
+// Static function to start the server.
+// -----------------------------------------------------------------------------
+//
+static TInt StartServer()
+ {
+ TInt result;
+
+ TFindServer findServer( KCaSrvName );
+ TFullName name;
+
+ result = findServer.Next( name );
+ if( result != KErrNone )
+ {
+ // Server not running
+ result = CreateServerProcess();
+ }
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CreateServerProcess
+// Static function to create the server process.
+// -----------------------------------------------------------------------------
+//
+static TInt CreateServerProcess()
+ {
+ TInt err( KErrNone );
+ RProcess server;
+ err = server.Create( KCaSrvExe, KNullDesC, EOwnerThread );
+ if( !err )
+ {
+ TRequestStatus status;
+ server.Rendezvous( status );
+ if( status != KRequestPending )
+ {
+ server.Kill( 0 ); // Abort startup.
+ }
+ else
+ {
+ server.Resume(); // Logon OK - start the server.
+ }
+ User::WaitForRequest( status ); // Wait for start or death.
+ // 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.
+ err = ( server.ExitType() == EExitPanic ) ? KErrGeneral
+ : status.Int();
+ server.Close();
+ }
+ return err;
+ }
+