upnp/upnpstack/controlpointbase/src/upnpfilesender.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:12:20 +0200
changeset 0 f5a58ecadc66
permissions -rw-r--r--
Revision: 201003

/** @file
 * Copyright (c) 2009 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:  CUpnpFileSender implementation
 *
 */

#include "upnpfilesender.h"
#include "httpuploader.h"
#include "upnphttpmessage.h"
#include "upnpstring.h"
#include "upnpcons.h"
#include "upnphttpmessagefactory.h"
#include "upnpcontrolpoint.h"

// --------------------------------------------------------------------------
// CUpnpFileSender::CUpnpFileSender
// --------------------------------------------------------------------------
//
CUpnpFileSender::CUpnpFileSender( CUpnpControlPoint& aCPToNotifyOfSendingResult )
    : iControlPoint( aCPToNotifyOfSendingResult )
    {
    // No implementation required
    }

// --------------------------------------------------------------------------
// CUpnpFileSender::~CUpnpFileSender
// --------------------------------------------------------------------------
//
CUpnpFileSender::~CUpnpFileSender()
    {
    delete iUploader;
    }

// --------------------------------------------------------------------------
// CUpnpFileSender::NewLC
// --------------------------------------------------------------------------
//
CUpnpFileSender* CUpnpFileSender::NewLC( CUpnpControlPoint& aCPToNotifyOfSendingResult )
    {
    CUpnpFileSender* self = new (ELeave) CUpnpFileSender( aCPToNotifyOfSendingResult );
    CleanupStack::PushL( self );
    return self;
    }

// --------------------------------------------------------------------------
// CUpnpFileSender::NewL
// --------------------------------------------------------------------------
//
CUpnpFileSender* CUpnpFileSender::NewL( CUpnpControlPoint& aCPToNotifyOfSendingResult )
    {
    CUpnpFileSender* self = CUpnpFileSender::NewLC( aCPToNotifyOfSendingResult );
    CleanupStack::Pop(self);
    return self;
    }

// --------------------------------------------------------------------------
// DestinationUriL
// Allocate destination uri from message
// --------------------------------------------------------------------------
//
static HBufC8* DestinationUriL( CUpnpHttpMessage& aMessage )
    {
    TInetAddr add( aMessage.Receiver() );
    HBufC8* address = UpnpString::InetToStringL( add );
    CleanupStack::PushL( address );
    TPtrC8 path( aMessage.SenderPathFromHeader() ) ;
    HBufC8* uriBuf = HBufC8::NewL(
        UpnpHTTP::KHTTPUrl().Length() + address->Length() + path.Length() );
    TPtr8 uri( uriBuf->Des() );
    uri.Append( UpnpHTTP::KHTTPUrl );
    uri.Append( *address );
    uri.Append( path );
    CleanupStack::PopAndDestroy( address );
    return uriBuf;
    }

// --------------------------------------------------------------------------
// CUpnpFileSender::SendL
// --------------------------------------------------------------------------
//
void CUpnpFileSender::SendL( CUpnpHttpMessage& aMessageToSend )
    {
    ASSERT( aMessageToSend.Method() == KHttpPost && aMessageToSend.OutFilename().Length() > 0 );
    if ( !iUploader )   //late initialisation
        {
        const TInt KUnused(0);
        const TUint KBufferSize( 10 * 1024 );
        const TUint KParallelTransfersNumber( 1 );
        iUploader = CHttpUploader::NewL(*this,KUnused,KBufferSize,KParallelTransfersNumber);
        }

    RBuf fileName;
    User::LeaveIfError( fileName.Create( aMessageToSend.OutFilename().Length() ) );
    CleanupClosePushL( fileName );
    fileName.Copy( aMessageToSend.OutFilename() );
    HBufC8* destUri = DestinationUriL( aMessageToSend );
    CleanupStack::PushL( destUri );

    iUploader->UploadFileL( *destUri, fileName, (TAny*)aMessageToSend.SessionId() );

    CleanupStack::PopAndDestroy( destUri );
    CleanupStack::PopAndDestroy( &fileName );
    }

// --------------------------------------------------------------------------
// CUpnpFileSender::TransferProgress
// --------------------------------------------------------------------------
//
void CUpnpFileSender::TransferProgress( TAny* /*aKey*/,
                               TInt /*aBytes*/,
                               TInt /*aTotalBytes*/ )
     {
     // no implementation needed
     }

// --------------------------------------------------------------------------
// CUpnpFileSender::ReadyForTransferL
// --------------------------------------------------------------------------
//
void CUpnpFileSender::ReadyForTransferL( TAny* aKey )
    {
    _LIT8( KTextHtmlMimeType, "text/html" );
    iUploader->SetHeaderL( aKey, UpnpHTTP::KHdrContentType, KTextHtmlMimeType );
    iUploader->SetHeaderL( aKey, UpnpHTTP::KConnection, UpnpHTTP::KClose );
    iUploader->StartTransferL( aKey );
    }

// --------------------------------------------------------------------------
// CUpnpFileSender::TransferCompleted
// --------------------------------------------------------------------------
//
void CUpnpFileSender::TransferCompleted( TAny* /*aKey*/, TInt aStatus )
    {
    CUpnpHttpMessage* rsp = NULL;
    TRAP_IGNORE(
        rsp = RUpnpHttpMessageFactory::HttpResponseErrorL( TInetAddr(), aStatus ) );
    iControlPoint.HttpResponseReceived( rsp );
    delete rsp;
    }