/** Check if we can copy the file to the new location */ TMTPResponseCode CMTPImageDpCopyObject::CanCopyObjectL(const TDesC& aOldName, const TDesC& aNewName) const { OstTraceFunctionEntry0( CMTPIMAGEDPCOPYOBJECT_CANCOPYOBJECTL_ENTRY ); TMTPResponseCode result = EMTPRespCodeOK; TEntry fileEntry; LEAVEIFERROR(iFramework.Fs().Entry(aOldName, fileEntry), OstTraceExt2( TRACE_ERROR, DUP1_CMTPIMAGEDPCOPYOBJECT_CANCOPYOBJECTL, "Gets the entry details for %S failed! error code %d", aOldName, munged_err )); TDriveNumber drive(static_cast<TDriveNumber>(iFramework.StorageMgr().DriveNumber(iStorageId))); LEAVEIFERROR(drive, OstTraceExt2( TRACE_ERROR, DUP2_CMTPIMAGEDPCOPYOBJECT_CANCOPYOBJECTL, "Gets drive for storage %d failed! error code %d", iStorageId, munged_err )); TVolumeInfo volumeInfo; LEAVEIFERROR(iFramework.Fs().Volume(volumeInfo, drive), OstTraceExt2( TRACE_ERROR, DUP3_CMTPIMAGEDPCOPYOBJECT_CANCOPYOBJECTL, "Gets volume information for driver %d failed! error code %d", drive, munged_err )); if(volumeInfo.iFree < fileEntry.FileSize()) { result = EMTPRespCodeStoreFull; } else if (BaflUtils::FileExists(iFramework.Fs(), aNewName)) { result = EMTPRespCodeInvalidParentObject; } OstTrace1( TRACE_NORMAL, CMTPIMAGEDPCOPYOBJECT_CANCOPYOBJECTL, "CanCopyObjectL - Exit with response code 0x%04X", result ); OstTraceFunctionExit0( CMTPIMAGEDPCOPYOBJECT_CANCOPYOBJECTL_EXIT ); return result; }
void QFileSystemMetaData::fillFromTEntry(const TEntry& entry) { entryFlags &= ~(QFileSystemMetaData::SymbianTEntryFlags); knownFlagsMask |= QFileSystemMetaData::SymbianTEntryFlags; //Symbian doesn't have unix type file permissions entryFlags |= QFileSystemMetaData::ReadPermissions; if(!entry.IsReadOnly()) { entryFlags |= QFileSystemMetaData::WritePermissions; } //set the type if(entry.IsDir()) entryFlags |= (QFileSystemMetaData::DirectoryType | QFileSystemMetaData::ExecutePermissions); else entryFlags |= QFileSystemMetaData::FileType; //set the attributes entryFlags |= QFileSystemMetaData::ExistsAttribute; if(entry.IsHidden()) entryFlags |= QFileSystemMetaData::HiddenAttribute; #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API size_ = entry.FileSize(); #else size_ = (TUint)(entry.iSize); #endif modificationTime_ = entry.iModified; }
/** Check if we can move the file to the new location */ TMTPResponseCode CMTPMoveObject::CanMoveObjectL(const TDesC& aOldName, const TDesC& aNewName) const { OstTraceFunctionEntry0( CMTPMOVEOBJECT_CANMOVEOBJECTL_ENTRY ); TMTPResponseCode result = EMTPRespCodeOK; TEntry fileEntry; LEAVEIFERROR(iFramework.Fs().Entry(aOldName, fileEntry), OstTraceExt1( TRACE_ERROR, DUP1_CMTPMOVEOBJECT_CANMOVEOBJECTL, "can't get entry details from %S", aOldName)); TInt drive(iFramework.StorageMgr().DriveNumber(iStorageId)); LEAVEIFERROR(drive, OstTrace1( TRACE_ERROR, DUP2_CMTPMOVEOBJECT_CANMOVEOBJECTL, "can't get driver number for storage %d", iStorageId)); TVolumeInfo volumeInfo; LEAVEIFERROR(iFramework.Fs().Volume(volumeInfo, drive), OstTrace1( TRACE_ERROR, DUP3_CMTPMOVEOBJECT_CANMOVEOBJECTL, "can't get volume info for drive %d", drive)); #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API if(volumeInfo.iFree < fileEntry.FileSize()) #else if(volumeInfo.iFree < fileEntry.iSize) #endif { result = EMTPRespCodeStoreFull; } else if (BaflUtils::FileExists(iFramework.Fs(), aNewName)) { result = EMTPRespCodeInvalidParentObject; } OstTraceFunctionExit0( CMTPMOVEOBJECT_CANMOVEOBJECTL_EXIT ); OstTrace1( TRACE_NORMAL, CMTPMOVEOBJECT_CANMOVEOBJECTL, "response code 0x%04X", result ); return result; }
// ----------------------------------------------------------------------------- // CGetPartialObject::VerifyParametersL // Verify if the parameter of the request (i.e. offset) is good. // ----------------------------------------------------------------------------- // TBool CGetPartialObject::VerifyParametersL() { PRINT( _L( "MM MTP => CGetPartialObject::VerifyParametersL" ) ); __ASSERT_DEBUG( iRequestChecker, Panic( EMmMTPDpRequestCheckNull ) ); TBool result = EFalse; iObjectHandle = Request().Uint32( TMTPTypeRequest::ERequestParameter1 ); iOffset = Request().Uint32( TMTPTypeRequest::ERequestParameter2 ); iPartialDataLength = Request().Uint32( TMTPTypeRequest::ERequestParameter3 ); PRINT3( _L( "MM MTP <> CGetPartialObject::VerifyParametersL iObjectHandle = 0x%x, iOffset = 0x%x, iMaxLength = 0x%x " ), iObjectHandle, iOffset, iPartialDataLength ); //get object info, but do not have the ownship of the object CMTPObjectMetaData* objectInfo = iRequestChecker->GetObjectInfo( iObjectHandle ); __ASSERT_DEBUG( objectInfo, Panic( EMmMTPDpObjectNull ) ); const TDesC& suid( objectInfo->DesC( CMTPObjectMetaData::ESuid ) ); PRINT1( _L( "MM MTP <> CGetPartialObject::VerifyParametersL suid = %S" ), &suid ); TEntry fileEntry; User::LeaveIfError( iFramework.Fs().Entry( suid, fileEntry ) ); if ( iOffset < fileEntry.FileSize() ) { result = ETrue; } PRINT1( _L( "MM MTP <= CGetPartialObject::VerifyParametersL result = %d" ), result ); return result; }
// ----------------------------------------------------------------------------- // CMoveObject::CanMoveObjectL // Check if we can move the file to the new location // ----------------------------------------------------------------------------- // TMTPResponseCode CMoveObject::CanMoveObjectL( const TDesC& aOldName, const TDesC& aNewName ) const { PRINT2( _L( "MM MTP => CMoveObject::CanMoveObjectL aOldName = %S, aNewName = %S" ), &aOldName, &aNewName ); TMTPResponseCode result = EMTPRespCodeOK; TEntry fileEntry; User::LeaveIfError( iFramework.Fs().Entry( aOldName, fileEntry ) ); TInt drive = iFramework.StorageMgr().DriveNumber( iStorageId ); User::LeaveIfError( drive ); TVolumeInfo volumeInfo; User::LeaveIfError( iFramework.Fs().Volume( volumeInfo, drive ) ); if ( volumeInfo.iFree < fileEntry.FileSize() ) { result = EMTPRespCodeStoreFull; } else if ( BaflUtils::FileExists( iFramework.Fs(), aNewName ) ) { #ifdef MMMTPDP_REPLACE_EXIST_FILE // delete the old one and replace TInt delErr = iFramework.Fs().Delete( aNewName ); PRINT1( _L( "MM MTP <> CMoveObject::CanMoveObjectL delErr = %d" ), delErr ); // delete from the metadata DB TRAPD( err, iFramework.ObjectMgr().RemoveObjectL( aNewName ) ); PRINT1( _L( "MM MTP <> CMoveObject::CanMoveObjectL err = %d" ), err ); // delete from video/mpx DB CMTPObjectMetaData* objectInfo = CMTPObjectMetaData::NewLC(); // + objectInfo if ( iFramework.ObjectMgr().ObjectL( aNewName, *objectInfo ) ) { TRAP( err, iDpConfig.GetWrapperL().DeleteObjectL( aNewName, objectInfo->Uint( CMTPObjectMetaData::EFormatCode ) ) ); } CleanupStack::PopAndDestroy( objectInfo ); // - objectInfo if ( err ) { // do nothing } #else result = EMTPRespCodeInvalidParentObject; #endif } PRINT1( _L( "MM MTP <= CMoveObject::CanMoveObjectL result = 0x%x" ), result ); return result; }
/** Check the GetPartialObject reqeust @return EMTPRespCodeOK if the request is good, otherwise, one of the error response codes */ TMTPResponseCode CMTPGetPartialObject::CheckRequestL() { OstTraceFunctionEntry0( CMTPGETPARTIALOBJECT_CHECKREQUESTL_ENTRY ); TMTPResponseCode result = CMTPRequestProcessor::CheckRequestL(); if(result == EMTPRespCodeOK) { TUint32 objectHandle = Request().Uint32(TMTPTypeRequest::ERequestParameter1); iOffset = Request().Uint32(TMTPTypeRequest::ERequestParameter2); iLength = Request().Uint32(TMTPTypeRequest::ERequestParameter3); //does not take ownership iObjectInfo = iRequestChecker->GetObjectInfo(objectHandle); if (!iObjectInfo) { // The object handle has already been checked, so an invalid handle can // only occur if it was invalidated during a context switch between // the validation time and now. result = EMTPRespCodeInvalidObjectHandle; } else { TEntry fileEntry; LEAVEIFERROR(iFramework.Fs().Entry(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), fileEntry), OstTraceExt1(TRACE_ERROR, CMTPGETPARTIALOBJECT_CHECKREQUESTL, "can't get entry details for %S!", iObjectInfo->DesC(CMTPObjectMetaData::ESuid))); if((iOffset >= fileEntry.FileSize())) { result = EMTPRespCodeInvalidParameter; } } } OstTraceFunctionExit0( CMTPGETPARTIALOBJECT_CHECKREQUESTL_EXIT ); return result; }
// ----------------------------------------------------------------------------- // CSendObject::DoHandleResponsePhaseObjectL // SendObject // ----------------------------------------------------------------------------- // TBool CSendObject::DoHandleResponsePhaseObjectL() { PRINT( _L( "MM MTP => CSendObject::DoHandleResponsePhaseObjectL" ) ); TBool result = ETrue; TEntry fileEntry; User::LeaveIfError( iFs.Entry( iFullPath, fileEntry ) ); if ( fileEntry.FileSize() != iObjectSize ) { iFs.Delete( iFullPath ); iObjectMgr.UnreserveObjectHandleL( *iReceivedObjectInfo ); TMTPResponseCode responseCode = EMTPRespCodeObjectTooLarge; if ( fileEntry.FileSize() < iObjectSize ) { responseCode = EMTPRespCodeIncompleteTransfer; } SendResponseL( responseCode ); Rollback(); result = EFalse; } // SendObject is cancelled or connection is dropped. if ( result && iCancelled ) { iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest, iConnection ); SendResponseL( EMTPRespCodeTransactionCancelled ); Rollback(); } else if ( result && !iCancelled ) { if ( iObjectSize > 0 ) // media file { TRAPD( err, AddMediaToStoreL() ); PRINT1( _L( "MM MTP <= CSendObject::DoHandleResponsePhaseObjectL err = %d" ), err ); if ( ( iPreviousOperation == EMTPOpCodeSendObjectPropList ) && ( err == KErrNone ) ) { // Only leave when getting proplist element from data received by fw. // It should not happen after ReceiveDataL in which construction of proplist already succeed. SetObjectPropListL(); } // Commits into MTP data object enumeration store the object handle and // storage space previously reserved for the specified object. iFramework.ObjectMgr().CommitReservedObjectHandleL( *iReceivedObjectInfo ); iRollbackList.Append( &CSendObject::RemoveObjectFromDbL ); } // Commit object to MTP data store iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest, iConnection ); SendResponseL( EMTPRespCodeOK ); } iCancelled = EFalse; PRINT1( _L( "MM MTP <= CSendObject::DoHandleResponsePhaseObjectL result = %d" ), result ); return result; }