--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/connectivitymodules/SeCon/plugins/pcconn/src/sconpcconnplugin.cpp Tue Feb 02 01:11:40 2010 +0200
@@ -0,0 +1,1254 @@
+/*
+* Copyright (c) 2005-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: PC Connectivity Plug-in implementation
+*
+*/
+
+
+// INCLUDE FILES
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <obexconstantsinternal.h>
+#endif
+#include "sconpcconnplugin.h"
+#include "sconftp.h"
+#include "sconpcconnpluginutils.h"
+#include "sconservicetimer.h"
+#include "catalogspcconnectivityplugin.h"
+#include "debug.h"
+
+
+// CONSTANTS
+_LIT(KSConFTPLibName, "sconftp.dll");
+const TInt KSConFTPUidValue = 0x10009D8D;
+const TUid KSConFTPUid = {KSConFTPUidValue};
+
+// Folder listing type from IrObex specification
+_LIT8( KSConFolderListType, "x-obex/folder-listing" );
+// Folder listing type from IrObex specification
+_LIT8( KSConCapabilityObjectType, "x-obex/capability" );
+// PCD types
+_LIT8( KSConPCDObjectType, "application/vnd.nokia.pcd" );
+_LIT8( KSConPCDXMLObjectType, "application/vnd.nokia.conml+xml" );
+_LIT8( KSConPCDWBXMLObjectType, "application/vnd.nokia.conml+wbxml" );
+_LIT8( KSConPCDXMLObjectType2, "application/vnd.nokia.pcd+xml" );
+_LIT8( KSConPCDWBXMLObjectType2, "application/vnd.nokia.pcd+wbxml" );
+_LIT( K_C_ROOT, "C:\\" );
+
+// PCD header commands
+const TInt KSCon_PCD_TAG = 0x003A;
+const TInt KSCon_PCD_CMD_COPY = 0x0037;
+const TInt KSCon_PCD_CMD_MOVE_OR_RENAME = 0x0038;
+const TInt KSCon_PCD_CMD_SET_PERMISSION = 0x0039;
+// PCD header parameters
+const TInt KSCon_PCD_PAR_FULL_PERMISSION = 0x0040;
+const TInt KSCon_PCD_PAR_READ_ONLY_PERMISSION = 0x0041;
+
+
+const TInt KSConBufSize = 262144; // 256KB
+// Time (in milliseconds) for the timer
+const TInt KSConTimeOutValue = 180000000;
+// Flags used to indicate SetPath commands
+const TInt KSConNULLSetPath = 0x00;
+
+const TInt KSConHeaderMaxLength = 256;
+
+// ============================= MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::NewL()
+// Two-phase constructing
+// -----------------------------------------------------------------------------
+//
+CSConPCConnplugin* CSConPCConnplugin::NewL()
+ {
+ TRACE_FUNC_ENTRY;
+ CSConPCConnplugin* self = new ( ELeave ) CSConPCConnplugin();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ TRACE_FUNC_EXIT;
+ return( self );
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::~CSConPCConnplugin()
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CSConPCConnplugin::~CSConPCConnplugin()
+ {
+ TRACE_FUNC_ENTRY;
+
+ // Disconnect from services.
+ Disconnect();
+
+ delete iBuffer;
+ iBuffer = NULL;
+
+ if ( iServiceTimer )
+ {
+ iServiceTimer->Cancel();
+ }
+
+ delete iServiceTimer;
+ iServiceTimer = NULL;
+
+ delete iCatalogs;
+ iCatalogs = NULL;
+ delete iCatalogsMimeType;
+ iCatalogsMimeType = NULL;
+
+ iMimeArray.Reset();
+ iMimeArray.Close();
+
+ delete iShutdownWatcher;
+ iShutdownWatcher = NULL;
+
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::IsOBEXActive()
+// Returns active status of OBEX session
+// -----------------------------------------------------------------------------
+//
+TBool CSConPCConnplugin::IsOBEXActive()
+ {
+ TRACE_FUNC;
+ return iSessionActive;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::NotifyShutdown()
+// System is shutting down
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::NotifyShutdown()
+ {
+ TRACE_FUNC;
+ iShutdownInProgress = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::LoadFTPDllL()
+// Loads sconftp.dll module
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::LoadFTPDllL()
+ {
+ TRACE_FUNC_ENTRY;
+ // Dynamically load DLL
+ User::LeaveIfError( iFTPlib.Load( KSConFTPLibName ) );
+ if ( iFTPlib.Type()[1] != KSConFTPUid )
+ {
+ LOGGER_WRITE( "KSConFTPUidValue incorrect" );
+ iFTPlib.Close();
+ User::Leave( KErrNotFound );
+ }
+ TSConCreateCSConFTPFunc CreateCSConFTPL =
+ (TSConCreateCSConFTPFunc)iFTPlib.Lookup(1);
+ iFTPHandler = (CSConFTP*)CreateCSConFTPL();
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::Disconnect()
+// Closes initialized services
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::Disconnect()
+ {
+ TRACE_FUNC_ENTRY;
+
+ iLinkAdapter.Close();
+ iSocketServer.Close();
+
+ //Disconnect from server
+ iPCConnSession.Close();
+ iPCConnSessionConnected = EFalse;
+
+ if ( iStartTimer != EFalse )
+ {
+ iServiceTimer->Cancel();
+ iServiceTimer->StartTimer();
+ }
+
+ delete iObject;
+ iObject = NULL;
+
+ if ( iFTPHandler )
+ {
+ delete iFTPHandler;
+ iFTPHandler = NULL;
+ iFTPlib.Close();
+ }
+ if ( iFileObject )
+ {
+ delete iFileObject;
+ iFileObject = NULL;
+ }
+ if ( iCatalogsConnected )
+ {
+ iCatalogs->Close();
+ iCatalogsConnected = EFalse;
+ iCatalogsMimeTypesExist = EFalse;
+ }
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::ErrorIndication( TInt aError )
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::ErrorIndication( TInt aError )
+ {
+ TRACE_FUNC_ENTRY;
+ LOGGER_WRITE_1( "aError : %d", aError );
+
+ if ( iFTPHandler )
+ {
+ iFTPHandler->AbortFileTransfer( iObject );
+ }
+
+ if ( iObject )
+ {
+ delete iObject;
+ iObject = NULL;
+ }
+
+ if ( iFileObject )
+ {
+ iFileObject->Reset();
+ delete iFileObject;
+ iFileObject = NULL;
+ }
+
+ if ( iPCConnSessionConnected )
+ {
+ iPCConnSession.ResetServer();
+ }
+
+ // Keep compiler happy
+ (void)aError;
+
+ delete iShutdownWatcher;
+ iShutdownWatcher = NULL;
+
+ if ( iLinkAdapter.IsOpen() )
+ {
+ // Cancel ActivateActiveRequester & allow going to low power mode
+ TInt err = iLinkAdapter.CancelLowPowerModeRequester();
+ LOGGER_WRITE_1( "iLinkAdapter.CancelLowPowerModeRequester() err: %d", err );
+ }
+
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::AbortIndication()
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::AbortIndication()
+ {
+ TRACE_FUNC_ENTRY;
+
+ if ( iFTPHandler )
+ {
+ iFTPHandler->AbortFileTransfer( iObject );
+ }
+
+ if ( iObject )
+ {
+ delete iObject;
+ iObject = NULL;
+ }
+
+ if ( iFileObject )
+ {
+ iFileObject->Reset();
+ delete iFileObject;
+ iFileObject = NULL;
+ }
+
+ if ( iPCConnSessionConnected )
+ {
+ iPCConnSession.ResetServer();
+ }
+
+ delete iShutdownWatcher;
+ iShutdownWatcher = NULL;
+
+ if ( iLinkAdapter.IsOpen() )
+ {
+ // Cancel ActivateActiveRequester & allow going to low power mode
+ TInt err = iLinkAdapter.CancelLowPowerModeRequester();
+ LOGGER_WRITE_1( "iLinkAdapter.CancelLowPowerModeRequester() err: %d", err );
+ }
+
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::TransportUpIndication()
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::TransportUpIndication()
+ {
+ TRACE_FUNC;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::ObexConnectIndication( const TObexConnectInfo&
+// aRemoteInfo, const TDesC8& aInfo )
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+TInt CSConPCConnplugin::ObexConnectIndication( const TObexConnectInfo&
+ /*aRemoteInfo*/, const TDesC8& /*aInfo*/ )
+ {
+ TRACE_FUNC_ENTRY;
+ TInt err( KErrNone );
+ TInt catalogsErr( KErrNone );
+ iStartTimer = ETrue;
+
+ if ( iMediaType == ESrcsMediaBT && iObexServer )
+ {
+ TSockAddr remoteAddr;
+ iObexServer->RemoteAddr( remoteAddr );
+
+ TBTSockAddr btSockAddr( remoteAddr );
+ TBTDevAddr devAddr = btSockAddr.BTAddr();
+
+ err = iSocketServer.Connect();
+ LOGGER_WRITE_1("iSocketServer.Connect err: %d", err );
+ if ( !err )
+ {
+ err = iLinkAdapter.Open( iSocketServer, devAddr );
+ LOGGER_WRITE_1("iLinkAdapter.Open err: %d", err );
+ }
+ // Ignore all BT link errors
+ err = KErrNone;
+ }
+
+ //Connect to server
+ if ( !iPCConnSessionConnected )
+ {
+ LOGGER_WRITE("Try to connect to iPCConnSession");
+ err = iPCConnSession.Connect();
+ LOGGER_WRITE_1( "iPCConnSession.Connect returned : %d", err );
+ if ( err == KErrNone )
+ {
+ iPCConnSessionConnected = ETrue;
+ }
+ }
+
+ if ( err == KErrNone && !iFTPHandler )
+ {
+ TRAP( err, LoadFTPDllL() );
+ LOGGER_WRITE_1( "LoadFTPDllL returned : %d", err );
+ }
+
+ if ( err == KErrNone )
+ {
+ iFTPHandler->SetProfile( EProprietary );
+ LOGGER_WRITE( "iServiceTimer->StopTimer()" );
+ iServiceTimer->Cancel();
+ iServiceTimer->StopTimer();
+ }
+
+ if ( !iCatalogsConnected )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::ObexConnectIndication() before iCatalogs->Connect()" );
+ catalogsErr = iCatalogs->Connect();
+ LOGGER_WRITE_1( "CSConPCConnplugin::ObexConnectIndication() iCatalogs->Connect() err: %d", catalogsErr );
+ if ( catalogsErr == KErrNone )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::ObexConnectIndication() iCatalogs->Connect() success" );
+ iCatalogsConnected = ETrue;
+ TRAPD( ret, iMimeArray = iCatalogs->SupportedMimeTypesL() );
+ if ( ret == KErrNone )
+ {
+ LOGGER_WRITE_1( "iCatalogs->SupportedMimeTypesL count: %d", iMimeArray.Count() );
+ iCatalogsMimeTypesExist = ETrue;
+ }
+ }
+ }
+ TRACE_FUNC_EXIT;
+ return TPCConnpluginUtils::ConvertFTPResponseCode( err );
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::ObexDisconnectIndication( const TDesC8& )
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::ObexDisconnectIndication( const TDesC8& )
+ {
+ TRACE_FUNC_ENTRY;
+ Disconnect();
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::TransportDownIndication()
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::TransportDownIndication()
+ {
+ TRACE_FUNC_ENTRY;
+ Disconnect();
+ if ( iBuffer )
+ {
+ iBuffer->Reset();
+ }
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::PutRequestIndication()
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+CObexBufObject* CSConPCConnplugin::PutRequestIndication()
+ {
+ TRACE_FUNC_ENTRY;
+ TInt ret( KErrNone );
+ TInt err( KErrNone );
+ iPutError = KErrNone;
+
+ if ( iBuffer )
+ {
+ iBuffer->Reset();
+ }
+
+ if ( iObject )
+ {
+ delete iObject;
+ iObject = NULL;
+ }
+
+ TRAP( err, iObject = CObexBufObject::NewL ( iBuffer ) );
+
+ if ( err != KErrNone )
+ {
+ return NULL;
+ }
+
+ if ( !iFTPHandler )
+ {
+ LOGGER_WRITE( "Creating iFTPHandler has failed" );
+ return NULL;
+ }
+
+ TRAP( err, ret = iFTPHandler->PutFileObjectInitL( iObject, iBuffer ) );
+
+ if ( err != KErrNone )
+ {
+ LOGGER_WRITE_1( "iFTPHandler->PutFileObjectInitL() leaves: %d", err );
+ return NULL;
+ }
+ if ( ret != KErrNone )
+ {
+ LOGGER_WRITE_1( "PutFileObjectInitL failed - returning error in next PutPacketIndication : %d", ret );
+ iPutError = ret;
+ }
+ iPutPacketIndicationCalled = EFalse;
+
+ if ( !iShutdownWatcher )
+ {
+ TRAP( err, iShutdownWatcher = CShutdownWatcher::NewL( this ) );
+ if ( err == KErrNone )
+ {
+ iShutdownWatcher->StartShutdownWatcher();
+ }
+ else
+ {
+ LOGGER_WRITE_1( "CShutdownWatcher::NewL leaves: %d", err );
+ }
+ }
+
+ if ( iLinkAdapter.IsOpen() )
+ {
+ // request active BT mode (high power mode)
+ err = iLinkAdapter.ActivateActiveRequester();
+ LOGGER_WRITE_1( "iLinkAdapter.ActivateActiveRequester() err: %d", err );
+ }
+
+ TRACE_FUNC_EXIT;
+ return( iObject );
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::PutPacketIndication()
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+TInt CSConPCConnplugin::PutPacketIndication()
+ {
+ TRACE_FUNC_ENTRY;
+ TInt ret( KErrNone );
+
+ TBool catalogsMime( EFalse );
+ if ( iObject->Type().Length() > KSConHeaderMaxLength )
+ {
+ LOGGER_WRITE("TypeHeader too big, return KErrNotSupported");
+ return TPCConnpluginUtils::ConvertFTPResponseCode( KErrNotSupported );
+ }
+ TBuf8<KSConHeaderMaxLength> typeHeader( iObject->Type() );
+ TrimRightSpaceAndNull( typeHeader );
+
+ if ( iCatalogsConnected && IsCatalogsMimeType( TDataType( typeHeader ) ) )
+ {
+ catalogsMime = ETrue;
+ }
+
+ if ( (TInt)iObject->Length() > 0
+ && typeHeader != KSConPCDWBXMLObjectType
+ && typeHeader != KSConPCDWBXMLObjectType2
+ && !catalogsMime
+ && typeHeader != KSConPCDObjectType )
+ {
+ // normal file transfer
+ if ( !iPutPacketIndicationCalled )
+ {
+ // This is first check, need to check only once
+
+ TFileName path;
+ iFTPHandler->GetPath( path );
+ if ( path.CompareF( K_C_ROOT ) == 0 )
+ {
+ // path forbidden
+ ret = KErrAccessDenied;
+ }
+ else
+ {
+ if ( iPutError != KErrNone )
+ {
+ ret = iPutError;
+ LOGGER_WRITE_1( "CSConPCConnplugin::PutPacketIndication() : PutError : %d", iPutError );
+ }
+ else
+ {
+ // check required free space
+ // if filesize is small ( <65k ) it fits into one package and its already saved to filesystem.
+ // if file is larger, need to check is there enought free space in device.
+
+ const TUint32 filesize = iObject->Length();
+ LOGGER_WRITE_1( "CSConPCConnplugin::PutPacketIndication() filesize %d", filesize );
+ LOGGER_WRITE_1( "CSConPCConnplugin::PutPacketIndication() iObject->BytesReceived() %d", iObject->BytesReceived() );
+ if ( filesize > iObject->BytesReceived() )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::PutPacketIndication() : check freespace" );
+ // file does not fit into one obex packet, check is there enought free space in current drive
+ if ( iFTPHandler->IsCurrentDiskSpaceBelowCritical( filesize ) )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::PutPacketIndication() : returning KErrNoMemory" );
+ ret = KErrNoMemory;
+ }
+ }
+ }
+ }
+ }
+
+ if ( iShutdownInProgress )
+ {
+ LOGGER_WRITE( "ShutdownInProgress, abort" );
+ ret = KErrDisconnected;
+ }
+ }
+
+ if ( !iPutPacketIndicationCalled )
+ {
+ // Need to check only once
+ iPutPacketIndicationCalled = ETrue;
+
+ //Check if filename is too long.
+ TFileName path;
+ iFTPHandler->GetPath( path );
+ if ( ret == KErrNone && path.Length() + iObject->Name().Length() > KMaxFileName )
+ {
+ LOGGER_WRITE_1( "Name length overflow! : %d", path.Length() + iObject->Name().Length() );
+ ret = KErrBadName;
+ }
+ }
+
+ if ( ret != KErrNone )
+ {
+ if ( iFTPHandler )
+ {
+ iFTPHandler->AbortFileTransfer( iObject );
+ }
+
+ delete iObject;
+ iObject = NULL;
+
+ if ( iLinkAdapter.IsOpen() )
+ {
+ // Cancel ActivateActiveRequester & allow going to low power mode
+ TInt err = iLinkAdapter.CancelLowPowerModeRequester();
+ LOGGER_WRITE_1( "iLinkAdapter.CancelLowPowerModeRequester() err: %d", err );
+ }
+ }
+
+ LOGGER_WRITE_1( "CSConPCConnplugin::PutPacketIndication(): ret %d", ret );
+ return TPCConnpluginUtils::ConvertFTPResponseCode( ret );
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::PutCompleteIndication()
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+TInt CSConPCConnplugin::PutCompleteIndication()
+ {
+ TRACE_FUNC_ENTRY;
+ TInt ret( KErrNone );
+ TInt err( KErrNone );
+
+ if ( iLinkAdapter.IsOpen() )
+ {
+ // Cancel ActivateActiveRequester & allow going to low power mode
+ TInt err2 = iLinkAdapter.CancelLowPowerModeRequester();
+ LOGGER_WRITE_1( "iLinkAdapter.CancelLowPowerModeRequester() err: %d", err2 );
+ }
+
+ if ( iObject->Type().Length() > KSConHeaderMaxLength )
+ {
+ LOGGER_WRITE("TypeHeader too big, return KErrNotSupported");
+ delete iObject;
+ iObject = NULL;
+
+ iFTPHandler->DeleteTempFile();
+ return TPCConnpluginUtils::ConvertPCDResponseCode( KErrNotSupported );
+ }
+ if ( iObject->Name().Length() > KSConHeaderMaxLength )
+ {
+ LOGGER_WRITE("NameHeader too big, return KErrNotSupported");
+ delete iObject;
+ iObject = NULL;
+
+ iFTPHandler->DeleteTempFile();
+ return TPCConnpluginUtils::ConvertPCDResponseCode( KErrNotSupported );
+ }
+
+ // check if ConML signal is received
+ TBuf8<KSConHeaderMaxLength> typeHeader( iObject->Type() );
+ TBuf<KSConHeaderMaxLength> nameHeader( iObject->Name() );
+ TrimRightSpaceAndNull( typeHeader );
+ LOGGER_WRITE8_1("type: %S", &typeHeader);
+ LOGGER_WRITE_1("name: %S", &nameHeader);
+ LOGGER_WRITE_1("description: %S", &iObject->Description());
+ TInt size = iObject->BytesReceived();
+ TTime time = iObject->Time();
+
+ // shutdownWatcher is not needed anymore
+ delete iShutdownWatcher;
+ iShutdownWatcher = NULL;
+
+ if ( IsCatalogsMimeType( TDataType( typeHeader ) ) )
+ {
+ if ( iCatalogsConnected )
+ {
+ LOGGER_WRITE( "iCatalogs->PutDataL" );
+ TRAP( err, iCatalogs->PutDataL( typeHeader, *iBuffer ) );
+ LOGGER_WRITE_1( "iCatalogs->PutDataL : %d", err );
+ if ( err == KErrServerTerminated )
+ {
+ err = iCatalogs->Connect();
+ LOGGER_WRITE_1( "CSConPCConnplugin::PutCompleteIndication() iCatalogs->Connect() err: %d", err );
+ if ( err == KErrNone )
+ {
+ LOGGER_WRITE( "iCatalogs->PutDataL" );
+ TRAP( err, iCatalogs->PutDataL( typeHeader, *iBuffer ) );
+ LOGGER_WRITE_1( "iCatalogs->PutDataL : %d", err );
+ }
+ }
+ }
+ else
+ {
+ LOGGER_WRITE( "Catalogs mime type recognised - failing due no connection" );
+ err = KErrNotSupported;
+ }
+
+ delete iObject;
+ iObject = NULL;
+
+ iFTPHandler->DeleteTempFile();
+ return TPCConnpluginUtils::ConvertPCDResponseCode( err );
+ }
+
+ if ( typeHeader == KSConPCDObjectType )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::PutCompleteIndication KSConPCDObjectType" );
+ err = HandlePCDObjectPut( iObject->Description(), iObject->Name() );
+ delete iObject;
+ iObject = NULL;
+
+ iFTPHandler->DeleteTempFile();
+ LOGGER_WRITE_1( "CSConPCConnplugin::PutCompleteIndication() end, err: %d", err );
+ return TPCConnpluginUtils::ConvertObexMoveResponseCode( err );
+ }
+
+ if ( typeHeader != KSConPCDWBXMLObjectType &&
+ typeHeader != KSConPCDWBXMLObjectType2 )
+ {
+ TObexHeaderMask validHdrs = iObject->ValidHeaders();
+ if ( ( validHdrs & KObexHdrBody ) || ( validHdrs & KObexHdrEndOfBody ) )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::PutCompleteIndication() normal filetransfer" );
+ LOGGER_WRITE_1( "Number of received bytes : %d", size );
+ TSConUsedMedia media( ESConNoMedia );
+
+ switch( iMediaType )
+ {
+ case ESrcsMediaBT :
+ media = ESConBTMedia;
+ break;
+ case ESrcsMediaIrDA :
+ media = ESConIRMedia;
+ break;
+ case ESrcsMediaUSB :
+ media = ESConUSBMedia;
+ break;
+ default :
+ media = ESConNoMedia;
+ break;
+ }
+
+ iFTPHandler->SetUsedMedia( media );
+
+ TRAP( ret, err = iFTPHandler->PutFileObjectFinalizeL( iObject ) );
+ LOGGER_WRITE_1( "PutFileObjectL() returned : %d", ret );
+ }
+ else
+ {
+ LOGGER_WRITE( "Delete starts" );
+ TRAP( ret, err = iFTPHandler->DeleteObjectL( iObject->Name() ) );
+ LOGGER_WRITE_1( "DeleteObjectL() returned : %d", ret );
+ }
+ }
+
+ delete iObject;
+ iObject = NULL;
+
+ if ( typeHeader == KSConPCDWBXMLObjectType ||
+ typeHeader == KSConPCDWBXMLObjectType2 )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::PutCompleteIndication() ReadWBXMLDataL" );
+ TRAP( ret, err = iFTPHandler->ReadWBXMLDataL( iBuffer ) );
+
+ if ( err == KErrNone && ret == KErrNone )
+ {
+ TRAP( ret, err = iPCConnSession.PutPacketL( nameHeader,
+ typeHeader, iBuffer ) );
+ LOGGER_WRITE_1( "iPCConnSession.PutPacketL() leaveCode : %d", ret );
+ LOGGER_WRITE_1( "iPCConnSession.PutPacketL() returned : %d", err );
+ }
+
+ iFTPHandler->DeleteTempFile();
+
+ return TPCConnpluginUtils::ConvertPCDResponseCode( err );
+ }
+
+ iFTPHandler->DeleteTempFile();
+
+ TRACE_FUNC_EXIT;
+ if ( ret != KErrNone )
+ {
+ return TPCConnpluginUtils::ConvertFTPResponseCode( ret );
+ }
+ return TPCConnpluginUtils::ConvertFTPResponseCode( err );
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::GetRequestIndication( CObexBaseObject* aRequiredObject )
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+CObexBufObject* CSConPCConnplugin::GetRequestIndication( CObexBaseObject*
+ aRequiredObject )
+ {
+ TRACE_FUNC_ENTRY;
+ CObexBufObject* bufObject(NULL);
+ if ( aRequiredObject->Type().Length() > KSConHeaderMaxLength )
+ {
+ LOGGER_WRITE("TypeHeader too big");
+ return NULL;
+ }
+ if ( aRequiredObject->Name().Length() > KMaxFileName )
+ {
+ LOGGER_WRITE("NameHeader is too long");
+ return NULL;
+ }
+ TInt ret( KErrNone );
+ TInt err( KErrNone );
+ TBuf8<KSConHeaderMaxLength> typeHeader( aRequiredObject->Type() );
+ TrimRightSpaceAndNull( typeHeader );
+ LOGGER_WRITE8_1("type: %S", &typeHeader);
+ LOGGER_WRITE_1("name: %S", &aRequiredObject->Name());
+
+ iBuffer->Reset();
+
+ delete iObject;
+ iObject = NULL;
+
+ TRAP( err, iObject = CObexBufObject::NewL ( iBuffer ) );
+ if ( err != KErrNone )
+ {
+ return NULL;
+ }
+
+ // Client requests folder listing
+ if ( typeHeader == KSConFolderListType )
+ {
+ LOGGER_WRITE( "Client requests folder listning" );
+ if ( !iFTPHandler )
+ {
+ LOGGER_WRITE( "Creating iFTPHandler has failed" );
+ return NULL;
+ }
+
+ TRAP( err, ret = iFTPHandler->GetFolderObjectL( iObject ) );
+ LOGGER_WRITE_1( "iFTPHandler->GetFolderObjectL() returned: %d", ret );
+ if ( err == KErrNone && ret == KErrNone )
+ {
+ bufObject = iObject;
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+ // Client requests capability object or ConML packet
+ else if ( typeHeader == KSConCapabilityObjectType
+ || typeHeader == KSConPCDWBXMLObjectType
+ || typeHeader == KSConPCDWBXMLObjectType2)
+ {
+ LOGGER_WRITE( "Client requests capability object or ConML packet" );
+ // HandleGetPCConnObjectL will set some data to iObject, or leaves if error occurs
+ TRAP( err, HandleGetPCConnObjectL( aRequiredObject->Name(), typeHeader ) );
+
+ if ( err == KErrNone )
+ {
+ bufObject = iObject;
+ }
+ else
+ {
+ LOGGER_WRITE_1("Get PCConn object failed, err: %d", err);
+ return NULL;
+ }
+ }
+ // Client requests file conversion
+ else if ( typeHeader == KSConPCDObjectType )
+ {
+ LOGGER_WRITE("request of KSConPCDObjectType is not supported.")
+ return NULL;
+ }
+ // catalogs
+ else if ( IsCatalogsMimeType( TDataType( typeHeader ) ) )
+ {
+ TRAP( err, HandleGetCatalogsObjectL( typeHeader ) );
+ if ( err == KErrNone )
+ {
+ bufObject = iObject;
+ }
+ else
+ {
+ LOGGER_WRITE_1("Get catalogs object failed, err: %d", err);
+ return NULL;
+ }
+ }
+ // Client requests file
+ else
+ {
+ LOGGER_WRITE( "Client requests file" );
+ TRAP( err, HandleGetFileObjectL( aRequiredObject->Name() ) );
+ if ( err == KErrNone )
+ {
+ bufObject = (CObexBufObject*)iFileObject;
+ }
+ else
+ {
+ LOGGER_WRITE_1("Get file object failed, err: %d", err);
+ return NULL;
+ }
+ }
+ if ( bufObject && iLinkAdapter.IsOpen() )
+ {
+ // request active BT mode (high power mode)
+ err = iLinkAdapter.ActivateActiveRequester();
+ LOGGER_WRITE_1( "iLinkAdapter.ActivateActiveRequester() err: %d", err );
+ }
+ return bufObject;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::GetPacketIndication()
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+TInt CSConPCConnplugin::GetPacketIndication()
+ {
+ TRACE_FUNC;
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::GetCompleteIndication()
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+TInt CSConPCConnplugin::GetCompleteIndication()
+ {
+ TRACE_FUNC_ENTRY;
+ if ( iLinkAdapter.IsOpen() )
+ {
+ // Cancel ActivateActiveRequester & allow going to low power mode
+ TInt err = iLinkAdapter.CancelLowPowerModeRequester();
+ LOGGER_WRITE_1( "iLinkAdapter.CancelLowPowerModeRequester() err: %d", err );
+ }
+
+ TInt ret( KErrNone );
+ if ( iFileObject )
+ {
+ iFileObject->Reset();
+ delete iFileObject;
+ iFileObject = NULL;
+ }
+
+ LOGGER_WRITE_1( "CSConPCConnplugin::GetCompleteIndication() : returned %d", ret );
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::SetPathIndication( const CObex::TSetPathInfo& aPathInfo,
+// const TDesC8& aInfo )
+// MObexServerNotify implementation
+// -----------------------------------------------------------------------------
+//
+TInt CSConPCConnplugin::SetPathIndication( const CObex::TSetPathInfo& aPathInfo,
+ const TDesC8& /*aInfo*/ )
+ {
+ TRACE_FUNC_ENTRY;
+ TInt ret( KErrNone );
+ TInt err( KErrNone );
+
+ if ( !iFTPHandler )
+ {
+ LOGGER_WRITE( "Creating iFTPHandler has failed" );
+ return TPCConnpluginUtils::ConvertFTPResponseCode( KErrNoMemory );
+ }
+
+ if ( aPathInfo.iFlags == KSConNULLSetPath )
+ {
+ TRAP( err, ret = this->iFTPHandler->CreateFolderL( aPathInfo.iName ) );
+ }
+ else
+ {
+ TRAP( err, ret = this->iFTPHandler->SetPathL( aPathInfo.iName,
+ aPathInfo.iFlags ) );
+ }
+
+ if ( err != KErrNone )
+ {
+ LOGGER_WRITE_1( "CSConPCConnplugin::SetPathIndication : returned %d", err );
+ return TPCConnpluginUtils::ConvertFTPResponseCode( err );
+ }
+ LOGGER_WRITE_1( "CSConPCConnplugin::SetPathIndication : returned %d", ret );
+ return TPCConnpluginUtils::ConvertFTPResponseCode( ret );
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::TrimRightSpaceAndNull( TDes8& aDes ) const
+// Removes spaces and nulls from the end of the string
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::TrimRightSpaceAndNull( TDes8& aDes ) const
+ {
+ TRACE_FUNC;
+ aDes.TrimRight();
+ if ( aDes.Length() > 0 )
+ {
+ if ( !aDes[aDes.Length() - 1] )
+ {
+ aDes.SetLength( aDes.Length() - 1 );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::SetMediaType( TSrcsMediaType aMediaType )
+// Current used transfer media (IR,USB,BT)
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::SetMediaType( TSrcsMediaType aMediaType )
+ {
+ TRACE_FUNC;
+ iMediaType = aMediaType;
+ }
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::TBool IsCatalogsMimeType( TDataType aMime )
+// Checks if mime type belogs to Catalogs
+// -----------------------------------------------------------------------------
+//
+TBool CSConPCConnplugin::IsCatalogsMimeType( TDataType aMime )
+ {
+ TRACE_FUNC_ENTRY;
+ TBool result = EFalse;
+
+ if ( !iCatalogsConnected
+ && aMime.Des8() != KSConPCDObjectType
+ && aMime.Des8() != KSConPCDXMLObjectType
+ && aMime.Des8() != KSConPCDWBXMLObjectType
+ && aMime.Des8() != KSConPCDXMLObjectType2
+ && aMime.Des8() != KSConPCDWBXMLObjectType2
+ )
+ {
+ // Catalogs never connected and not secon mime type
+ // Try to connect to catalogs to get catalogstypes
+ TInt catalogsErr = iCatalogs->Connect();
+ LOGGER_WRITE_1( "CSConPCConnplugin::IsCatalogsMimeType() iCatalogs->Connect() err: %d", catalogsErr );
+ if ( catalogsErr == KErrNone )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::IsCatalogsMimeType() iCatalogs->Connect() success" );
+ iCatalogsConnected = ETrue;
+ TRAPD( ret, iMimeArray = iCatalogs->SupportedMimeTypesL() );
+ if ( ret == KErrNone )
+ {
+ LOGGER_WRITE_1( "iCatalogs->SupportedMimeTypesL count: %d", iMimeArray.Count() );
+ iCatalogsMimeTypesExist = ETrue;
+ }
+ }
+ }
+
+ if ( iCatalogsMimeTypesExist )
+ {
+ // Compare to supported values
+ for ( TInt j = 0; j < iMimeArray.Count(); j++ )
+ {
+ if ( (*iMimeArray[j]) == aMime )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::IsCatalogsMimeTypeL returns TRUE" );
+ result = ETrue;
+ break;
+ }
+ }
+ }
+ TRACE_FUNC_EXIT;
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::CSConPCConnplugin()
+// Default constructor
+// -----------------------------------------------------------------------------
+//
+CSConPCConnplugin::CSConPCConnplugin()
+ {
+ TRACE_FUNC;
+ iBuffer = NULL;
+ iObject = NULL;
+ iFileObject = NULL;
+ iSessionActive = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::ConstructL()
+// Initializes member data
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::ConstructL()
+ {
+ TRACE_FUNC_ENTRY;
+ iBuffer = CBufFlat::NewL( KSConBufSize );
+ iObject = CObexBufObject::NewL ( iBuffer );
+ iServiceTimer = new (ELeave) CSConServiceTimer( this, KSConTimeOutValue );
+ iServiceTimer->ConstructL();
+ CActiveScheduler::Add( iServiceTimer );
+
+ // catalogs
+ iCatalogs = CCatalogsPCConnectivityPlugin::NewL();
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::SetObexServer( CObexServer* aObexServer )
+// SetObexServer
+// -----------------------------------------------------------------------------
+//
+TInt CSConPCConnplugin::SetObexServer( CObexServer* aObexServer )
+ {
+ iObexServer = aObexServer;
+ TInt ret = iObexServer->Start(this);
+ LOGGER_WRITE_1( "CSConPCConnplugin::SetObexServer() ret: %d", ret );
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::HandlePCDObjectPut
+// Handles PCD object. Used for advanced file handling.
+// -----------------------------------------------------------------------------
+//
+TInt CSConPCConnplugin::HandlePCDObjectPut( const TDesC& aDescriptionHeader,
+ const TDesC& aNameHeader )
+ {
+ TRACE_FUNC_ENTRY;
+ TInt err( KErrNotSupported);
+ if ( aDescriptionHeader.Length() >= 3 )
+ {
+ TInt commandTag = aDescriptionHeader[0];
+ TInt commandID = aDescriptionHeader[1];
+ TInt commandParam1 = aDescriptionHeader[2];
+
+ TPtrC destination;
+ if ( aDescriptionHeader.Length() >= 3 )
+ {
+ destination.Set( aDescriptionHeader.Mid(3) );
+ }
+ TPtrC source;
+ if ( aNameHeader.Length() >= 1 )
+ {
+ // remove ":" character from beginning
+ source.Set( aNameHeader.Mid(1) );
+ }
+
+ if ( commandTag == KSCon_PCD_TAG )
+ {
+ LOGGER_WRITE( "CSConPCConnplugin::HandlePCDObjectPut KSCon_PCD_TAG found" );
+ switch (commandID)
+ {
+ case KSCon_PCD_CMD_COPY:
+ err = iFTPHandler->CopyFile( source, destination );
+ break;
+
+ case KSCon_PCD_CMD_MOVE_OR_RENAME:
+ err = iFTPHandler->MoveFile( source, destination );
+ break;
+
+ case KSCon_PCD_CMD_SET_PERMISSION:
+ if ( commandParam1 == KSCon_PCD_PAR_FULL_PERMISSION )
+ {
+ err = iFTPHandler->SetReadOnly( source, EFalse );
+ }
+ else if ( commandParam1 == KSCon_PCD_PAR_READ_ONLY_PERMISSION )
+ {
+ err = iFTPHandler->SetReadOnly( source, ETrue );
+ }
+ else
+ {
+ err = KErrNotSupported;
+ }
+ break;
+
+ default:
+ LOGGER_WRITE( "CSConPCConnplugin::HandlePCDObjectPut unknown commandID" );
+ err = KErrNotSupported;
+ break;
+ }
+
+ }
+
+ }
+ TRACE_FUNC_EXIT;
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::HandleGetPCConnObjectL
+// Get Capbility object or ConML message from PCConnServer
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::HandleGetPCConnObjectL( const TDesC& aNameHeader,
+ const TDesC8& aTypeHeader )
+ {
+ TRACE_FUNC_ENTRY;
+ if ( !iPCConnSessionConnected )
+ {
+ LOGGER_WRITE( "ERROR, iPCConnSession was not connected" );
+ User::Leave( KErrNotReady );
+ }
+ TInt err = iPCConnSession.GetPacketL( aNameHeader, aTypeHeader, iBuffer );
+ LOGGER_WRITE_1( "iPCConnSession.GetPacketL() returned: %d", err );
+ User::LeaveIfError( err );
+ iObject->SetDataBufL( iBuffer );
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::HandleGetCatalogsObjectL
+// Get Catalogs object
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::HandleGetCatalogsObjectL( const TDesC8& aTypeHeader )
+ {
+ TRACE_FUNC_ENTRY;
+ TInt err(KErrNone);
+ if ( !iCatalogsConnected )
+ {
+ LOGGER_WRITE( "catalogs mime type recognised - failing due to no connection" );
+ User::Leave( KErrNotReady );
+ }
+ else
+ {
+ LOGGER_WRITE( "iCatalogs->GetDataL" );
+ TDataType mime( aTypeHeader );
+ TRAP( err, iCatalogs->GetDataL( mime, *iBuffer ) );
+ LOGGER_WRITE_1( "iCatalogs->GetDataL : %d", err );
+ if ( err == KErrServerTerminated )
+ {
+ // server was terminated, try to reconnect
+ err = iCatalogs->Connect();
+ LOGGER_WRITE_1( "iCatalogs->Connect() err: %d", err );
+ User::LeaveIfError( err );
+ LOGGER_WRITE( "iCatalogs->GetDataL" );
+ iCatalogs->GetDataL( mime, *iBuffer );
+ }
+ }
+ User::LeaveIfError( err );
+ iObject->SetDataBufL( iBuffer );
+ TRACE_FUNC_EXIT;
+ }
+
+// -----------------------------------------------------------------------------
+// CSConPCConnplugin::HandleGetFileObjectL
+// Get file object
+// -----------------------------------------------------------------------------
+//
+void CSConPCConnplugin::HandleGetFileObjectL( const TDesC& aNameHeader )
+ {
+ TRACE_FUNC_ENTRY;
+ delete iFileObject;
+ iFileObject = NULL;
+ iFileObject = CObexFileObject::NewL();
+
+ iFileObject->Reset();
+ iFileObject->SetNameL( aNameHeader );
+
+ if ( !iFTPHandler )
+ {
+ LOGGER_WRITE( "Creating iFTPHandler has failed" );
+ User::Leave( KErrNotReady );
+ }
+
+ TInt err = iFTPHandler->GetFileObjectL( iFileObject );
+ User::LeaveIfError( err );
+ TRACE_FUNC_EXIT;
+ }
+
+// End of file