upnpsharing/upnpcontentserver/src/upnpcontentserverclient.cpp
changeset 0 7f85d04be362
child 30 5ec426854821
--- /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