--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsharing/upnpcontentserver/src/upnpcontentserverclient.cpp Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,447 @@
+/*
+* Copyright (c) 2006-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: RUpnpContentServerClient class implementation
+*
+*/
+
+
+
+
+
+
+// INCLUDES
+#include <f32file.h>
+#include <s32mem.h>
+
+#include "upnpcontentserverclient.h"
+
+_LIT( KComponentLogfile, "contentserver.txt");
+#include "upnplog.h"
+
+// CONSTANTS
+const TInt KDefaultBufferSize( 512 ); //default size for any receice buffer
+const TInt KContentBufferSize( 10*1024 ); //size for media content buffer
+
+using namespace UpnpContentServer;
+
+//---------------------------------------------------------------------------
+// LaunchServer
+// Launches the server
+//---------------------------------------------------------------------------
+//
+TInt LaunchServer()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ TInt res = KErrNone;
+
+ // DLL launch
+ RProcess server;
+ res = server.Create( KUpnpContentServerNameAndDir,
+ KNullDesC );
+
+ // Loading failed.
+ if ( res == KErrNone )
+ {
+ server.SetPriority( EPriorityLow );
+ TRequestStatus status;
+ server.Rendezvous(status);
+
+ if ( status != KRequestPending)
+ {
+ server.Kill(0); // abort startup
+ server.Close();
+ res = KErrGeneral;
+ }
+ if( !res )
+ {
+ server.Resume(); // Logon OK - start the server.
+
+ User::WaitForRequest(status);
+ server.Close();
+ res = status.Int();
+ }
+ }
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ return res;
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::RUpnpContentServerClient
+// C++ Constructor
+// --------------------------------------------------------------------------
+//
+EXPORT_C RUpnpContentServerClient::RUpnpContentServerClient()
+ : iSendBufferPtr( NULL, 0 ),
+ iSendBuffer( NULL ),
+ iReceiveBufferPtr( NULL, 0 ),
+ iReceiveBuffer( NULL ),
+ iContentBufferPtr( NULL, 0 ),
+ iContentBuffer( NULL )
+ {
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::OpenL
+// Creates connection to server
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::OpenL()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ TVersion version( KUpnpContentServerVersionMajor,
+ KUpnpContentServerVersionMinor,
+ 0 );
+
+ TInt res = CreateSession( KUpnpContentServer, version,
+ KDefaultMessageSlots );
+ if ( res != KErrNone )
+ {
+ __LOG1( "Error: %d", res );
+ res = LaunchServer();
+ if ( res != KErrNone )
+ {
+ __LOG1( "Error: %d", res );
+ }
+ User::LeaveIfError( res );
+ res = CreateSession( KUpnpContentServer, version,
+ KDefaultMessageSlots );
+ if ( res != KErrNone )
+ {
+ __LOG1( "Error: %d", res );
+ }
+ ShareAuto();
+ }
+ User::LeaveIfError( res );
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::Close
+// close connection to server
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::Close()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ // close session
+ delete iSendBuffer;
+ iSendBuffer = NULL;
+ delete iReceiveBuffer;
+ iReceiveBuffer = NULL;
+ delete iContentBuffer;
+ iContentBuffer = NULL;
+ RSessionBase::Close();
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::StartUploadListenerL
+// Starts the media server upload listener
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::StartUploadListenerL( )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ User::Leave( KErrNotSupported );
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::StopUploadListenerL
+// Stops the media server upload listener
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::StopUploadListenerL()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ User::Leave( KErrNotSupported );
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::GetSelectionContentL
+// Gets the names of existed albums/playlists
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::GetSelectionContentL(
+ UpnpContentServer::TUpnpMediaType aType,
+ TRequestStatus& aStatus )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+ delete iSendBuffer;
+ iSendBuffer = NULL;
+ iSendBuffer = CBufFlat::NewL( KTintSize );
+
+ // Need to externalize a data to buffer to send it with IPC
+ RBufWriteStream sendstream;
+ sendstream.Open( *iSendBuffer );
+ CleanupClosePushL( sendstream );
+ sendstream.WriteInt32L( aType );
+ iSendBufferPtr.Set( iSendBuffer->Ptr(0) );
+
+ // Prepare receive buffers
+ delete iContentBuffer;
+ iContentBuffer = NULL;
+ iContentBuffer = HBufC8::NewL( KContentBufferSize );
+ iContentBufferPtr.Set( iContentBuffer->Des() );
+
+ SendReceive( ERequestSelectionContent,
+ TIpcArgs( &iSendBufferPtr, &iContentBufferPtr ),
+ aStatus );
+ CleanupStack::PopAndDestroy( &sendstream );
+
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::GetSelectionContentResultL
+// Ask the result of GetSelectionContentL call
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::GetSelectionContentResultL(
+ CDesCArray& aIDArray )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+ if ( !iContentBuffer )
+ {
+ User::Leave( KErrNotReady );
+ }
+
+ RDesReadStream stream;
+ stream.Open( iContentBufferPtr );
+ CleanupClosePushL( stream );
+ // leaves -25 if empty stream
+ TInt itemCount( 0 );
+ TRAP_IGNORE( itemCount = stream.ReadUint32L() );
+
+ for ( TInt i(0); i < itemCount; i++ )
+ {
+ const TInt desLen( static_cast<TInt>( stream.ReadUint32L() ));
+ TBuf<KMaxFileName> item;
+ stream.ReadL( item, desLen );
+ aIDArray.AppendL( item );
+ }
+
+ CleanupStack::PopAndDestroy( &stream );
+ delete iContentBuffer;
+ iContentBuffer = NULL;
+
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::ChangeSharedContentL
+// Sends the selected indexes to server and starts sharing
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::ChangeSharedContentL(
+ UpnpContentServer::TUpnpMediaType aType,
+ const CArrayFix<TInt>& aMarkedItems,
+ TRequestStatus& aStatus )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+ TInt objectCount( aMarkedItems.Count() );
+ if ( objectCount < 1 )
+ {
+ __LOG1( "Error: %d", __LINE__ );
+ User::Leave( KErrArgument );
+ }
+
+ delete iSendBuffer;
+ iSendBuffer = NULL;
+ // Calculate correct size for send buffer on basis of the amount
+ // of items user has selected
+ iSendBuffer = CBufFlat::NewL( objectCount * KTintSize + 2*KTintSize );
+
+ // Need to externalize a data to buffer to send it with IPC
+ RBufWriteStream stream;
+ stream.Open( *iSendBuffer );
+ CleanupClosePushL( stream );
+ stream.WriteInt32L( aType );
+ stream.WriteInt32L( objectCount );
+ for( TInt i(0); i< objectCount; i++ )
+ {
+ stream.WriteInt32L( aMarkedItems[ i ] );
+ }
+ iSendBufferPtr.Set( iSendBuffer->Ptr(0) );
+
+ SendReceive( EChangeShareContent,
+ TIpcArgs( &iSendBufferPtr ),
+ aStatus );
+ CleanupStack::PopAndDestroy( &stream );
+
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::RefreshSharedContentL
+// Refresh the shared content
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::RefreshSharedContentL(
+ UpnpContentServer::TUpnpMediaType aType,
+ TRequestStatus& aStatus )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+ delete iSendBuffer;
+ iSendBuffer = NULL;
+ iSendBuffer = CBufFlat::NewL( KTintSize );
+
+ // Need to externalize a data to buffer to send it with IPC
+ RBufWriteStream stream;
+ stream.Open( *iSendBuffer );
+ CleanupClosePushL( stream );
+ stream.WriteInt32L( aType );
+ iSendBufferPtr.Set( iSendBuffer->Ptr(0) );
+
+ SendReceive( ERefreshShareContent,
+ TIpcArgs( &iSendBufferPtr ),
+ aStatus );
+ CleanupStack::PopAndDestroy( &stream );
+
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::GetSelectionIndexesL
+// Gets the users previous selections as list of selected indexes
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::GetSelectionIndexesL(
+ UpnpContentServer::TUpnpMediaType aType,
+ TRequestStatus& aStatus )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+ delete iSendBuffer;
+ iSendBuffer = NULL;
+ iSendBuffer = CBufFlat::NewL( KTintSize );
+
+ // Need to externalize a data to buffer to send it with IPC
+ RBufWriteStream sendstream;
+ sendstream.Open( *iSendBuffer );
+ CleanupClosePushL( sendstream );
+ sendstream.WriteInt32L( aType );
+ iSendBufferPtr.Set( iSendBuffer->Ptr(0) );
+
+ // Prepare receive buffers
+ PrepareReceiveBuffersL( KDefaultBufferSize );
+
+ SendReceive( EGetSelectionIndexes,
+ TIpcArgs( &iSendBufferPtr, &iReceiveBufferPtr ),
+ aStatus );
+ CleanupStack::PopAndDestroy( &sendstream );
+
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::GetSelectionIndexesResultL
+// Ask the result of GetSelectionIndexesL call
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::GetSelectionIndexesResultL(
+ CArrayFix<TInt>& aMarkedItems )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+ if ( !iReceiveBuffer )
+ {
+ User::Leave( KErrNotReady );
+ }
+
+ RDesReadStream stream;
+ stream.Open( iReceiveBufferPtr );
+ CleanupClosePushL( stream );
+
+ // leaves -25 if empty stream
+ TInt itemCount( 0 );
+ TRAP_IGNORE( itemCount = stream.ReadUint32L() );
+
+ for ( TInt i(0); i < itemCount; i++ )
+ {
+ const TInt val = static_cast<TInt>( stream.ReadUint32L() );
+ aMarkedItems.AppendL( val );
+ }
+
+ CleanupStack::PopAndDestroy( &stream );
+ delete iReceiveBuffer;
+ iReceiveBuffer = NULL;
+
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::StartConnectionMonitorL
+// Start connection monitor in content server
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::StartConnectionMonitorL(
+ TInt aIapId,
+ TRequestStatus& aStatus )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+ delete iSendBuffer;
+ iSendBuffer = NULL;
+ iSendBuffer = CBufFlat::NewL( KTintSize );
+
+ // Need to externalize a data to buffer to send it with IPC
+ RBufWriteStream sendstream;
+ sendstream.Open( *iSendBuffer );
+ CleanupClosePushL( sendstream );
+ sendstream.WriteInt32L( aIapId );
+ iSendBufferPtr.Set( iSendBuffer->Ptr(0) );
+
+ SendReceive( EStartConnectionMonitor,
+ TIpcArgs( &iSendBufferPtr ),
+ aStatus );
+ CleanupStack::PopAndDestroy( &sendstream );
+
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::StopConnectionMonitorL
+// Stop connection monitor in content server
+// --------------------------------------------------------------------------
+//
+EXPORT_C void RUpnpContentServerClient::StopConnectionMonitorL(
+ TRequestStatus& aStatus )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ SendReceive( EStopConnectionMonitor, aStatus );
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// RUpnpContentServerClient::PrepareReceiveBuffers
+// Prepares the receive buffers
+// --------------------------------------------------------------------------
+//
+void RUpnpContentServerClient::PrepareReceiveBuffersL( TInt aSize )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ delete iReceiveBuffer;
+ iReceiveBuffer = NULL;
+ iReceiveBuffer = HBufC8::NewL( aSize );
+ iReceiveBufferPtr.Set( iReceiveBuffer->Des() );
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+//End of File