/*
* Copyright (c) 2006 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:   Communicates message data to SendUILauncher server application
*
*/



#include <aknappui.h>
#include <AknServerApp.h>
#include <s32mem.h>

#include <CMessageData.h>
#include <SendUiConsts.h>

#include "senduiserviceclient.h"
#include "senduiserviceslog.h"
#include "senduilauncher.h"
#include "senduiservicecommands.h"

typedef TBuf8<KTransferBufferSize> TTransferBuf;
// ======== LOCAL FUNCTIONS ========

// ---------------------------------------------------------------------------
// Launch SendUi
// ---------------------------------------------------------------------------
//
void RSendUiServiceClient::LaunchSendUiL( 
    TUid& aServiceUid,
    TUid& aServiceProviderUid, 
    TBool& aLaunchEmbedded, 
    const CMessageData* aMessageData )
    {
    CBufBase* buffer = CBufFlat::NewL( KMessageBufferSize );
    CleanupStack::PushL( buffer );
    
    RBufWriteStream bufStream;
    bufStream.Open( *buffer );
    
    bufStream.WriteUint32L( aServiceProviderUid.iUid );
    TUid dataType(KSenduiMsgDataBase);
    if ( aMessageData )
        {
        dataType = aMessageData->DataType();
        }
    bufStream.WriteUint32L( dataType.iUid );
    bufStream.WriteUint32L( aServiceUid.iUid );
    bufStream.WriteUint32L( aLaunchEmbedded ? 1 : 0);
    bufStream.WriteUint32L( aMessageData ? 1 : 0);
    
    if ( aMessageData )
        {
        aMessageData->ExternalizeL( bufStream );    
        }

    bufStream.CommitL();
    bufStream.Close();


    LOGTEXT2(_L("RSendUiServiceClient->LaunchSendUiL: buffer size %d"), buffer->Size() );
    TInt totalSize = buffer->Size();
    TInt transferredBytes(0);
    TInt blockSize(0);
    
    TTransferBuf transferBuffer;
    
    while( transferredBytes < totalSize)
        {
        // determine block size
        if ( transferredBytes + KTransferBufferSize < totalSize )
            {
            blockSize = KTransferBufferSize;
            }
        else
            {
            // the last block size
            blockSize = totalSize - transferredBytes;
            }
        buffer->Read( transferredBytes, transferBuffer, blockSize );
            
        TPckgBuf<TTransferBuf> transferBufferPckg( transferBuffer );
        TPckgBuf<TInt> totalSizePckg( totalSize );
        TPckgBuf<TInt> blockSizePckg( blockSize );
            
        SendReceive( ESendUiDataBlock, 
            TIpcArgs( &transferBufferPckg, &blockSizePckg, &totalSizePckg ) );
    
        transferredBytes += blockSize;
        } // while..
    
    SendReceive( EDataSent );

    if ( aMessageData )
    {
        TInt index(0);
        TInt fileHandleCount = aMessageData->AttachmentHandleArray().Count();
        
        // Transfer filehandles separately
        while( index < fileHandleCount )
        {
            TIpcArgs ipcArgs;
            aMessageData->AttachmentHandleArray()[index++].TransferToServer(ipcArgs, 0, 1);
            SendReceive(ECopyFileHandle, ipcArgs);
        }
    }
    SendReceive( ELaunchSendUi );
  
    CleanupStack::PopAndDestroy(buffer);
}

// ---------------------------------------------------------------------------
// Return service identifier
// ---------------------------------------------------------------------------
//
TUid RSendUiServiceClient::ServiceUid() const
    {
    return KSendUiLauncherAppServiceUid;
    }

// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
//
RSendUiServiceClient::~RSendUiServiceClient() 
    { 
    Close(); 
    }
