mtpdataproviders/mtppictbridgedp/src/rptp.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:11:40 +0200
changeset 0 d0791faffa3f
permissions -rw-r--r--
Revision: 201003 Kit: 201005

// 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:
//


#include <f32file.h>
#include "rptp.h"
#include "ptpdef.h"


//-----------------------------------------------------------------------------
// RPtp::RPtp()
// C++ Constructor
//-----------------------------------------------------------------------------
//
EXPORT_C RPtp::RPtp()
    {
    iConnected=EFalse;
    }

//-----------------------------------------------------------------------------
// RPtp::Connect()
// Creates session with PtpServer
//-----------------------------------------------------------------------------
//
EXPORT_C TInt RPtp::Connect()
    {
    // We do not attempt to start the server since it is started up only when 
    // MTP is loaded (at USB cable connection). To be compatible with previous 
    // version of PTP server we keep track of the connection and try to create it
    // if it does not yet exist.
    if(DoConnect() != KErrNone) // we claim that the connection succeeded.
    	{
    	//Do nothing.Still return KErrNone to lanuch ImagePrint to prompt users to plug-in USB cable.
    	}
    
    return KErrNone;
    }

//-----------------------------------------------------------------------------
// RPtp::DoConnect()
//-----------------------------------------------------------------------------
//
TInt RPtp::DoConnect()
    {
    TInt ret=KErrNone;
    if(EFalse==iConnected)
        {
        TVersion version(KPtpServerVersionMajor, KPtpServerVersionMinor, 0);
        ret=KErrNotReady;
        ret = CreateSession( KPTPServer, version );
        if (KErrNone==ret)
            {
            iConnected=ETrue;
            }
        }
    return ret; 
    }

//-----------------------------------------------------------------------------
// RPtp::CreatePtpStack()
// Creates session with PTP Server, creates PTP stack and loads transposrt plugin
// Called by PTP Class controller
//-----------------------------------------------------------------------------
//
EXPORT_C TInt RPtp::CreatePtpStack(const TUid /* aTransport */)
    {
    Connect();
    return KErrNone;
    }
    

//-----------------------------------------------------------------------------
// RPtp::IsDpsPrinter()
// Asynchronously request request DPS printer status
//-----------------------------------------------------------------------------
//
EXPORT_C void RPtp::IsDpsPrinter(TRequestStatus& aStatus)
    {
    if(DoConnect()==KErrNone)
        {
        SendReceive(EIsDpsPrinter, aStatus);
        }
    else
        {
        TRequestStatus* statusP=&aStatus;
        User::RequestComplete(statusP, EPrinterNotAvailable);
        }
    }

//-----------------------------------------------------------------------------
// RPtp::CancelIsDpsPrinter()
// Cancel DPS printer status request
//-----------------------------------------------------------------------------
//
EXPORT_C void RPtp::CancelIsDpsPrinter()
    {
    if(DoConnect()==KErrNone)
        {
        if(SendReceive(ECancelIsDpsPrinter)==KErrServerTerminated)
            {
            iConnected=EFalse;
            }
        }
    }
    
//-----------------------------------------------------------------------------
// RPtp::SendObject()
// Request send object to Pictbridge Printer host 
//-----------------------------------------------------------------------------
//
EXPORT_C void RPtp::SendObject(const TDesC& aNameAndPath, 
                               TRequestStatus& aStatus, TBool aTimeout, 
                               TInt aSize, TBool aAdd)
    {   
    if(DoConnect()==KErrNone)
        {
        iFile.Copy(aNameAndPath);
        const TIpcArgs args(&iFile, aAdd, aTimeout, aSize); 
        SendReceive(ESendObject, args, aStatus);
        }
    else
        {
        TRequestStatus* statusP=&aStatus;
        User::RequestComplete(statusP, KErrNotReady);
        }
    }

//-----------------------------------------------------------------------------
// RPtp::CancelSendObject()
// Cancel send object request 
//-----------------------------------------------------------------------------
//
EXPORT_C void RPtp::CancelSendObject()
    {
    if(DoConnect()==KErrNone)
        {
        if(SendReceive(ECancelSendObject)==KErrServerTerminated)
            {
            iConnected=EFalse;    
            }
        }
    }

//-----------------------------------------------------------------------------
// RPtp::GetObjectHandleByName()
// Get Object handle by name
//-----------------------------------------------------------------------------
//
EXPORT_C TInt RPtp::GetObjectHandleByName(const TDesC& aNameAndPath, 
                                          TUint32& aHandle, 
                                          TBool /*aAdd*/)
    {
    TInt ret=KErrNone;
    if((ret=DoConnect())==KErrNone)
        {
        TPckgBuf<TUint32> pckgHandle(aHandle);
        const TIpcArgs args(&aNameAndPath, &pckgHandle, EFalse/*aAdd*/);
        ret = SendReceive(EGetObjectHandleByName, args);
        if (ret == KErrNone)
            {
            aHandle = (TUint32)pckgHandle();
            if(0 == aHandle)
                {
                ret = KErrNotFound;
                }
            }
        else if (ret == KErrServerTerminated)
            {
            iConnected=EFalse;    
            }
        }
    return ret;     
    }

//-----------------------------------------------------------------------------
// GetNameByObjectHandle()
// Get object name and path by object handle 
//-----------------------------------------------------------------------------
//
EXPORT_C TInt RPtp::GetNameByObjectHandle(TDes& aNameAndPath, 
                                          const TUint32 aHandle)
    {
    TInt ret=KErrNone;
    if((ret=DoConnect())==KErrNone)
        {   
        TPckgBuf<TUint32> pckgHandle(aHandle);
        const TIpcArgs args(&aNameAndPath, &pckgHandle);
        ret = SendReceive(EGetNameByObjectHandle, args);
        if (ret==KErrServerTerminated)
            {
            iConnected=EFalse;    
            }
        }
    return ret;
    }

//-----------------------------------------------------------------------------
// RPtp::ObjectReceivedNotify()
// Register for object received notification
//-----------------------------------------------------------------------------
//
EXPORT_C void RPtp::ObjectReceivedNotify( const TDesC& aExt,
                                          TDes& aNameAndPath,
                                          TRequestStatus& aStatus,
                                          TBool aDelete )
    {
    if(DoConnect()==KErrNone)
        {
        iExt.Copy(aExt);
        const TIpcArgs args(&iExt, &aNameAndPath, aDelete);
        SendReceive(EObjectReceivedNotify, args, aStatus);
        }
    else
        {
        TRequestStatus* statusP=&aStatus;
        User::RequestComplete(statusP, KErrNotReady);
        }
    }

//-----------------------------------------------------------------------------
// RPtp::CancelObjectReceivedNotify()
// Cancel for object received notification
//-----------------------------------------------------------------------------
//
EXPORT_C void RPtp::CancelObjectReceivedNotify()
    {
    if(DoConnect()==KErrNone)
        {
        if(SendReceive(ECancelObjectReceivedNotify)==KErrServerTerminated)
            {
            iConnected=EFalse;    
            }
        }
    }

//-----------------------------------------------------------------------------
// RPtp::DestroyPtpStatck()
// Destroy PTP stack @deprecated, only calls close, use Close() instead
//-----------------------------------------------------------------------------
//
EXPORT_C void RPtp::DestroyPtpStatck()
    {
    Close();
    }
 
//-----------------------------------------------------------------------------
// RPtp::Close()
// Override RSessionBase::Close();
//-----------------------------------------------------------------------------
//
EXPORT_C void RPtp::Close()
    {
    RSessionBase::Close();
    iConnected=EFalse;
    }

//-----------------------------------------------------------------------------
// RPtp::PtpFolder()
// returns name and Path of PtpFolder
//-----------------------------------------------------------------------------
//      
EXPORT_C const TDesC& RPtp::PtpFolder()
    {
    if(DoConnect()==KErrNone)
        {
        const TIpcArgs args(&iFile); 
        if(SendReceive(EPtpFolder, args)==KErrServerTerminated)
            {
            iConnected=EFalse;    
            }
        }
    return iFile;
    }