# HG changeset patch # User William Roberts # Date 1268572321 0 # Node ID 5851d9e42c5bc3687d342b8ee1c9087ca4c3c57c # Parent bb577720afcd7d1f9d81a03fdb7179bdfaa4dc58# Parent ca4caa9ba68659bd11991d03d52228883b0f9c12 Automatic merge from PDK_3.0.h diff -r bb577720afcd -r 5851d9e42c5b connectivitymodules/SeCon/services/csc/bld/sconcsc.mmp --- a/connectivitymodules/SeCon/services/csc/bld/sconcsc.mmp Mon Mar 08 21:44:10 2010 +0000 +++ b/connectivitymodules/SeCon/services/csc/bld/sconcsc.mmp Sun Mar 14 13:12:01 2010 +0000 @@ -67,7 +67,6 @@ LIBRARY hal.lib LIBRARY platformenv.lib LIBRARY charconv.lib -LIBRARY customapi.lib LIBRARY centralrepository.lib LIBRARY apgrfx.lib LIBRARY apparc.lib diff -r bb577720afcd -r 5851d9e42c5b connectivitymodules/SeCon/services/csc/src/sconversioninfo.cpp --- a/connectivitymodules/SeCon/services/csc/src/sconversioninfo.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/connectivitymodules/SeCon/services/csc/src/sconversioninfo.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -23,8 +23,7 @@ #include // read imsi #include #include -#include -#include +#include #include "caputils.h" #include "debug.h" @@ -200,13 +199,6 @@ iProductCode = info.AllocL(); } - // screen size - TPckgBuf siBuf; - UserSvr::ScreenInfo(siBuf); - TScreenInfoV01& si=siBuf(); - iScreenSize = si.iScreenSize; - - // read DesktopSync key value CRepository* repository(NULL); TRAP( iDesktopSyncError, repository = CRepository::NewL( KCRUidDSDCMOConfig )); @@ -222,7 +214,9 @@ LOGGER_WRITE_1("Could not create CRepository, err: %d", iDesktopSyncError ); } - + // screen size + HAL::Get(HAL::EDisplayXPixels, iScreenSize.iWidth); + HAL::Get(HAL::EDisplayYPixels, iScreenSize.iHeight); iInfoFetched = ETrue; TRACE_FUNC_EXIT; diff -r bb577720afcd -r 5851d9e42c5b connectivitymodules/SeCon/services/pcd/inc/sconpcdconsts.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconpcdconsts.h Mon Mar 08 21:44:10 2010 +0000 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconpcdconsts.h Sun Mar 14 13:12:01 2010 +0000 @@ -42,6 +42,7 @@ // ConML Status code: No memory const TInt KSConCodeNoMemory( 420 ); + // ConML Status codes in installer errorcases const TInt KSConCodeInstErrUserCancel = KSConCodeCancelled; // User cancelled the operation const TInt KSConCodeInstErrFileCorrupted = 600; // File is corrupted @@ -57,6 +58,9 @@ const TInt KSConCodeInstErrAccessDenied = 608; // Target location of package is not accessible const TInt KSConCodeInstUpgradeError = 609; // The package is an invalid upgrade +// ConML Status code: 1001...1050 System wide error code +const TInt KSConCodeFirstSymbianErr( 1000 ); + struct SDeviceInfo { TSConMethodName method; diff -r bb577720afcd -r 5851d9e42c5b connectivitymodules/SeCon/services/pcd/inc/sconvideoparser.h --- a/connectivitymodules/SeCon/services/pcd/inc/sconvideoparser.h Mon Mar 08 21:44:10 2010 +0000 +++ b/connectivitymodules/SeCon/services/pcd/inc/sconvideoparser.h Sun Mar 14 13:12:01 2010 +0000 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -141,9 +141,12 @@ private: // data CVideoPlayerUtility* iVideoUtil; CTNEVideoClipInfo* iVideoClip; - + RWsSession iWsSession; CWsScreenDevice* iScreen; + RWindow* iWindow; + RWindowGroup iRootWindow; + TRequestStatus* iCallerStatus; CActiveSchedulerWait iWait; CSconTimeOut* iTimeOut; diff -r bb577720afcd -r 5851d9e42c5b connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -30,12 +30,10 @@ // CSConBackupRestoreQueue* CSConBackupRestoreQueue::NewL( const TInt aMaxObjectSize, RFs& aFs ) { - TRACE_FUNC_ENTRY; CSConBackupRestoreQueue* self = new (ELeave) CSConBackupRestoreQueue(); CleanupStack::PushL( self ); self->ConstructL( aMaxObjectSize, aFs ); CleanupStack::Pop( self ); - TRACE_FUNC_EXIT; return self; } @@ -56,11 +54,9 @@ // void CSConBackupRestoreQueue::ConstructL( const TInt aMaxObjectSize, RFs& aFs ) { - TRACE_FUNC_ENTRY; iBackupRestore = CSConBackupRestore::NewL( this, aMaxObjectSize, aFs ); CActiveScheduler::Add( iBackupRestore ); User::LeaveIfError( iTimer.CreateLocal() ); - TRACE_FUNC_EXIT; } // ----------------------------------------------------------------------------- @@ -88,7 +84,6 @@ // void CSConBackupRestoreQueue::StartQueue() { - TRACE_FUNC_ENTRY; if( IsActive() ) { Cancel(); @@ -96,7 +91,6 @@ iTimer.After( iStatus, KSConTimerValue ); SetActive(); - TRACE_FUNC_EXIT; } // ----------------------------------------------------------------------------- @@ -106,9 +100,7 @@ // void CSConBackupRestoreQueue::StopQueue() { - TRACE_FUNC_ENTRY; iTimer.Cancel(); - TRACE_FUNC_EXIT; } // ----------------------------------------------------------------------------- @@ -139,7 +131,6 @@ } ret = iQueue.InsertInOrder( aNewTask, CSConTaskQueue::Compare ); - LOGGER_WRITE_1( "CSConBackupRestoreQueue::AddNewTask() : returned %d", ret ); return ret; } @@ -189,7 +180,6 @@ // void CSConBackupRestoreQueue::QueueAddress( CSConInstallerQueue*& aTaskQueue ) { - TRACE_FUNC; iInstQueueAddress = aTaskQueue; } @@ -253,14 +243,11 @@ // void CSConBackupRestoreQueue::RunL() { - TRACE_FUNC_ENTRY; - LOGGER_WRITE_1( "There are still %d tasks in this queue", iQueue.Count() ); if( iQueue.Count() > 0 ) { PollQueue(); StartQueue(); } - TRACE_FUNC_EXIT; } // End of file diff -r bb577720afcd -r 5851d9e42c5b connectivitymodules/SeCon/services/pcd/src/sconpcdutility.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconpcdutility.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/connectivitymodules/SeCon/services/pcd/src/sconpcdutility.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include diff -r bb577720afcd -r 5851d9e42c5b connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -265,7 +265,17 @@ default : iQueue[index]->SetCompleteValue( complete ); - progress = KSConCodeConflict; + if ( aError < KErrNone && aError >= KErrCorruptSurrogateFound ) + { + // aError is always negative + // -> returned errorcode is from KSConCodeFirstSymbianErr...n + progress = KSConCodeFirstSymbianErr - aError; + } + else + { + progress = KSConCodeConflict; + } + break; } diff -r bb577720afcd -r 5851d9e42c5b connectivitymodules/SeCon/services/pcd/src/sconvideoparser.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconvideoparser.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/connectivitymodules/SeCon/services/pcd/src/sconvideoparser.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 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" @@ -57,6 +57,13 @@ iVideoUtil->Close(); } delete iVideoUtil; + + if ( iWindow ) + { + iWindow->Close(); + } + delete iWindow; + iRootWindow.Close(); delete iScreen; iWsSession.Close(); @@ -90,26 +97,16 @@ User::LeaveIfError( iWsSession.Connect() ); iScreen = new(ELeave) CWsScreenDevice( iWsSession ); - iScreen->Construct(); - - RWindowGroup wg( iWsSession ); - User::LeaveIfError( wg.Construct(reinterpret_cast(&wg), EFalse) ); - CleanupClosePushL( wg ); + User::LeaveIfError( iScreen->Construct() ); - CWindowGc* gc; - User::LeaveIfError( iScreen->CreateContext(gc) ); - CleanupStack::PushL(gc); + iRootWindow = RWindowGroup(iWsSession); + User::LeaveIfError( iRootWindow.Construct(reinterpret_cast(&iWsSession), EFalse) ); - RWindow window( iWsSession ); - User::LeaveIfError( window.Construct(wg, reinterpret_cast(&wg) + 1) ); - CleanupClosePushL( window ); + iWindow = new(ELeave) RWindow( iWsSession ); + User::LeaveIfError( iWindow->Construct(iRootWindow, reinterpret_cast(&iRootWindow) + 1) ); TRect temp(0,0,320,240); // dummy parameter - iVideoUtil = CVideoPlayerUtility::NewL(*this, EMdaPriorityNormal, EMdaPriorityPreferenceNone, iWsSession, *(iScreen), window, temp, temp); - - CleanupStack::PopAndDestroy( &window ); - CleanupStack::PopAndDestroy( gc ); - CleanupStack::PopAndDestroy( &wg ); + iVideoUtil = CVideoPlayerUtility::NewL(*this, EMdaPriorityNormal, EMdaPriorityPreferenceNone, iWsSession, *iScreen, *iWindow, temp, temp); iTimeOut = CSconTimeOut::NewL( *this ); diff -r bb577720afcd -r 5851d9e42c5b mtpdataproviders/mtpfileandfolderdp/inc/cmtpfiledp.h --- a/mtpdataproviders/mtpfileandfolderdp/inc/cmtpfiledp.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpdataproviders/mtpfileandfolderdp/inc/cmtpfiledp.h Sun Mar 14 13:12:01 2010 +0000 @@ -27,6 +27,7 @@ #include "mtpdebug.h" #include "rmtpfiledpsingletons.h" #include "rmtpdpsingletons.h" +#include "rmtpframework.h" class CMTPFileDpExclusionMgr; class CMTPFSEnumerator; @@ -117,6 +118,8 @@ TInt iActiveProcessor; TBool iActiveProcessorRemoved; + + RMTPFramework iSingletons; }; diff -r bb577720afcd -r 5851d9e42c5b mtpdataproviders/mtpfileandfolderdp/src/cmtpfiledp.cpp --- a/mtpdataproviders/mtpfileandfolderdp/src/cmtpfiledp.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpdataproviders/mtpfileandfolderdp/src/cmtpfiledp.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -28,6 +28,7 @@ #include "mtpfiledpconst.h" #include "mtpfiledppanic.h" #include "mtpfiledpprocessor.h" +#include "cmtpdataprovidercontroller.h" // Class constants static const TInt KArrayGranularity = 3; @@ -63,6 +64,7 @@ iActiveProcessors.Close(); iDpSingletons.Close(); iFileDPSingletons.Close(); + iSingletons.Close(); delete iFileEnumerator; delete iExclusionMgr; __FLOG(_L8("~CMTPFileDataProvider - Exit")); @@ -135,12 +137,12 @@ { __FLOG(_L8("StartObjectEnumerationL - Entry")); - iExclusionMgr->AppendFormatExclusionListL(); - iDpSingletons.MTPUtility().FormatExtensionMapping(); iPendingEnumerations.AppendL(aStorageId); if (iPendingEnumerations.Count() == 1) { - iFileEnumerator->StartL(iPendingEnumerations[KActiveEnumeration]); + CMTPDataProviderController& dpController(iSingletons.DpController()); + TBool bOnlyScanRoot = ( (dpController.EnumerateState() == CMTPDataProviderController::EEnumeratingFrameworkObjects) && (dpController.NeedEnumeratingPhase2()) ); + iFileEnumerator->StartL(iPendingEnumerations[KActiveEnumeration], bOnlyScanRoot); } __FLOG(_L8("StartObjectEnumerationL - Exit")); } @@ -148,6 +150,8 @@ void CMTPFileDataProvider::StartStorageEnumerationL() { __FLOG(_L8("StartStorageEnumerationL - Entry")); + iExclusionMgr->AppendFormatExclusionListL(); + iDpSingletons.MTPUtility().FormatExtensionMapping(); Framework().StorageEnumerationCompleteL(); __FLOG(_L8("StartStorageEnumerationL - Exit")); } @@ -220,7 +224,9 @@ iPendingEnumerations.Remove(KActiveEnumeration); if (iPendingEnumerations.Count()) { - iFileEnumerator->StartL(iPendingEnumerations[KActiveEnumeration]); + CMTPDataProviderController& dpController(iSingletons.DpController()); + TBool bOnlyScanRoot = ( (dpController.EnumerateState() == CMTPDataProviderController::EEnumeratingFrameworkObjects) && (dpController.NeedEnumeratingPhase2()) ); + iFileEnumerator->StartL(iPendingEnumerations[KActiveEnumeration], bOnlyScanRoot); } __FLOG(_L8("HandleEnumerationCompletedL - Exit")); } @@ -246,6 +252,7 @@ __FLOG(_L8("ConstructL - Entry")); iDpSingletons.OpenL(Framework()); iFileDPSingletons.OpenL(Framework()); + iSingletons.OpenL(); iExclusionMgr = CMTPFileDpExclusionMgr::NewL(Framework()); iDpSingletons.SetExclusionMgrL(*iExclusionMgr); diff -r bb577720afcd -r 5851d9e42c5b mtpdataproviders/mtpimagedp/src/cmtpimagedpdeleteobject.cpp --- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpdeleteobject.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpdeleteobject.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -261,6 +261,15 @@ { __FLOG(_L8(">> CMTPImageDpDeleteObject::StartL")); + if(iCancelled) + { + __FLOG(_L8("Cancell the delete")); + CMTPRequestProcessor::SendResponseL(EMTPRespCodeTransactionCancelled); + iObjectsToDelete.Reset(); + iCancelled = EFalse; + return; + } + TInt numObjectsToDelete = iObjectsToDelete.Count(); if ( numObjectsToDelete > 0 ) diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/daemon/server/src/cmtpshutdown.cpp --- a/mtpfws/mtpfw/daemon/server/src/cmtpshutdown.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/daemon/server/src/cmtpshutdown.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -54,7 +54,7 @@ void CMTPShutdown::RunL() { - if ( iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated ) + if ( iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted ) { Start(); } diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/devdp/inc/cmtpgetnumobjects.h --- a/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpgetnumobjects.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpgetnumobjects.h Sun Mar 14 13:12:01 2010 +0000 @@ -24,9 +24,11 @@ #include "cmtprequestprocessor.h" #include "rmtpframework.h" +#include "rmtpdevicedpsingletons.h" class MMTPObjectMgr; + /** Implements device data provider GetNumObjects request processor @internalComponent @@ -55,6 +57,8 @@ private: RMTPFramework iSingletons; + + RMTPDeviceDpSingletons iDevDpSingletons; }; #endif // CMTPGETNUMOBJECTS_H diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/devdp/inc/cmtpstoragewatcher.h --- a/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpstoragewatcher.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpstoragewatcher.h Sun Mar 14 13:12:01 2010 +0000 @@ -27,9 +27,11 @@ #include "mtpdebug.h" #include "rmtpframework.h" #include "rmtpdpsingletons.h" +#include "rmtpdevicedpsingletons.h" class MMTPDataProviderFramework; + /** Implements the MTP device data provider system storage watcher. @internalComponent @@ -119,6 +121,8 @@ */ RMTPDpSingletons iDpSingletons; + RMTPDeviceDpSingletons iDevDpSingletons; + private: // Not owned. MMTPDataProviderFramework& iFramework; diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/devdp/inc/mtpdevdppanic.h --- a/mtpfws/mtpfw/dataproviders/devdp/inc/mtpdevdppanic.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/devdp/inc/mtpdevdppanic.h Sun Mar 14 13:12:01 2010 +0000 @@ -35,6 +35,7 @@ EMTPDevDpInvalidRequest = 7, EMTPDevDpUnknownDeviceProperty = 8, EMTPDevDpUnknownServiceID = 9, + EMTPDevDpObjectNull = 10, }; diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/devdp/inc/rmtpdevicedpsingletons.h --- a/mtpfws/mtpfw/dataproviders/devdp/inc/rmtpdevicedpsingletons.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/devdp/inc/rmtpdevicedpsingletons.h Sun Mar 14 13:12:01 2010 +0000 @@ -45,6 +45,8 @@ CMTPDeviceDataStore& DeviceDataStore(); CMTPDeviceDpConfigMgr& ConfigMgr(); + RArray& PendingStorages(); + private: /** @@ -79,6 +81,11 @@ The device dp config manager. */ CMTPDeviceDpConfigMgr* iConfigMgr; + + /* + * The pending storageids which is not enumerated. + */ + RArray iPendingStorages; }; private: // Owned diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetnumobjects.cpp --- a/mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetnumobjects.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetnumobjects.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include #include "cmtpdataprovidercontroller.h" #include "cmtpdataprovider.h" @@ -26,6 +27,7 @@ #include "mtpdevicedpconst.h" #include "mtpdevdppanic.h" + /** Verification data for GetNumObjects request */ @@ -57,6 +59,7 @@ */ CMTPGetNumObjects::~CMTPGetNumObjects() { + iDevDpSingletons.Close(); iSingletons.Close(); } /** @@ -74,19 +77,51 @@ void CMTPGetNumObjects::ConstructL() { iSingletons.OpenL(); + iDevDpSingletons.OpenL(iFramework); } TMTPResponseCode CMTPGetNumObjects::CheckRequestL() { TMTPResponseCode responseCode = CMTPRequestProcessor::CheckRequestL(); - if(responseCode == EMTPRespCodeOK) + if(responseCode != EMTPRespCodeOK) + { + return responseCode; + } + + TUint32 formatCode = Request().Uint32(TMTPTypeRequest::ERequestParameter2); + if(formatCode != 0 && !IsSupportedFormatL(formatCode)) + { + return EMTPRespCodeInvalidObjectFormatCode; + } + + if(iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted) { - TUint32 formatCode = Request().Uint32(TMTPTypeRequest::ERequestParameter2); - if(formatCode != 0 && !IsSupportedFormatL(formatCode)) + TUint storageID = Request().Uint32(TMTPTypeRequest::ERequestParameter1); + TUint handle = Request().Uint32(TMTPTypeRequest::ERequestParameter3); + if(iDevDpSingletons.PendingStorages().FindInOrder(storageID) != KErrNotFound) + { + responseCode = EMTPRespCodeDeviceBusy; + } + else if( (handle != KMTPHandleNone) && (handle != KMTPHandleAll) ) { - responseCode = EMTPRespCodeInvalidObjectFormatCode; + CMTPObjectMetaData* meta = iRequestChecker->GetObjectInfo(handle); + __ASSERT_DEBUG(meta, Panic(EMTPDevDpObjectNull)); + + if( meta->Uint(CMTPObjectMetaData::EFormatCode) == EMTPFormatCodeAssociation ) + { + responseCode = EMTPRespCodeDeviceBusy; + } + } + else if(EMTPFormatCodeUndefined == formatCode) + { + responseCode = EMTPRespCodeDeviceBusy; } } + else if(iDevDpSingletons.PendingStorages().Count() > 0) + { + iDevDpSingletons.PendingStorages().Close(); + } + return responseCode; } diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/devdp/src/cmtpopensession.cpp --- a/mtpfws/mtpfw/dataproviders/devdp/src/cmtpopensession.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpopensession.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -83,7 +83,7 @@ void CMTPOpenSession::ServiceL() { iSingletons.DpController().WaitForEnumerationComplete(); - if(iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated) + if(iSingletons.DpController().EnumerateState() < CMTPDataProviderController::EEnumeratingPhaseOneDone) { SendResponseL(EMTPRespCodeDeviceBusy); } diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/devdp/src/cmtpstoragewatcher.cpp --- a/mtpfws/mtpfw/dataproviders/devdp/src/cmtpstoragewatcher.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpstoragewatcher.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -24,7 +24,6 @@ #include "cmtpstoragemgr.h" #include "cmtpobjectmgr.h" #include "cmtpstoragewatcher.h" -#include "rmtpdevicedpsingletons.h" #include "cmtpdevicedpconfigmgr.h" @@ -61,6 +60,7 @@ iDpSingletons.Close(); iDrivesExcluded.Close(); iFrameworkSingletons.Close(); + iDevDpSingletons.Close(); __FLOG(_L8("~CMTPStorageWatcher - Exit")); __FLOG_CLOSE; } @@ -278,13 +278,10 @@ iFrameworkSingletons.OpenL(); iFrameworkSingletons.FrameworkConfig().GetValueL(CMTPFrameworkConfig::ELogicalStorageIdsAllocationEnable, iAllocateLogicalStorages); - RMTPDeviceDpSingletons devSingletons; - devSingletons.OpenL(iFramework); - CleanupClosePushL(devSingletons); - iDpSingletons.OpenL(iFramework); - iFolderExclusionList = devSingletons.ConfigMgr().GetArrayValueL(CMTPDeviceDpConfigMgr::EFolderExclusionList); - CleanupStack::PopAndDestroy(&devSingletons); + iDevDpSingletons.OpenL(iFramework); + iFolderExclusionList = iDevDpSingletons.ConfigMgr().GetArrayValueL(CMTPDeviceDpConfigMgr::EFolderExclusionList); + __FLOG(_L8("ConstructL - Exit")); } @@ -475,6 +472,11 @@ { TMTPNotificationParamsStorageChange params = {physical}; iFrameworkSingletons.DpController().NotifyDataProvidersL(EMTPStorageAdded, static_cast(¶ms)); + + if(iFrameworkSingletons.DpController().EnumerateState() == CMTPDataProviderController::EEnumeratingSubDirFiles) + { + iDevDpSingletons.PendingStorages().InsertInOrder(logical); + } } // Notify any connected Initiator(s). @@ -515,6 +517,12 @@ TMTPNotificationParamsStorageChange params = {physical}; iFrameworkSingletons.DpController().NotifyDataProvidersL(EMTPStorageRemoved, static_cast(¶ms)); + TInt index = iDevDpSingletons.PendingStorages().FindInOrder( logical); + if(KErrNotFound != index) + { + iDevDpSingletons.PendingStorages().Remove(index); + } + // Notify any connected Initiator(s). if (iAllocateLogicalStorages) { diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/devdp/src/rmtpdevicedpsingletons.cpp --- a/mtpfws/mtpfw/dataproviders/devdp/src/rmtpdevicedpsingletons.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/devdp/src/rmtpdevicedpsingletons.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -141,6 +141,7 @@ __FLOG(_L8("CSingletons::~CSingletons - Entry")); delete iConfigMgr; delete iDeviceDataStore; + iPendingStorages.Close(); __FLOG(_L8("CSingletons::~CSingletons - Exit")); __FLOG_CLOSE; } @@ -154,3 +155,11 @@ __FLOG(_L8("CSingletons::ConstructL - Exit")); } +RArray& RMTPDeviceDpSingletons::PendingStorages() + { + __FLOG(_L8("PendingStorages - Entry")); + __ASSERT_DEBUG(iSingletons, User::Invariant()); + __FLOG(_L8("PendingStorages - Exit")); + return iSingletons->iPendingStorages; + } + diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/dputility/inc/cmtpfsenumerator.h --- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpfsenumerator.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpfsenumerator.h Sun Mar 14 13:12:01 2010 +0000 @@ -46,7 +46,7 @@ IMPORT_C static CMTPFSEnumerator* NewL(MMTPDataProviderFramework& aFramework, CMTPFSExclusionMgr& aExclusionMgr, MMTPEnumerationCallback& aCallback, TInt aProcessLimit); IMPORT_C ~CMTPFSEnumerator(); - IMPORT_C void StartL(TUint32 aStorageId); + IMPORT_C void StartL(TUint32 aStorageId, TBool aOnlyRoot = EFalse); private: //from CActive @@ -64,10 +64,11 @@ void ScanNextStorageL(); void ScanNextSubdirL(); void ProcessEntriesL(); - void AddEntryL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry); - void AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry); + void AddEntryL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry, TUint32 aStorageId, TUint32 aParentHandle); + void AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry, TUint32 aStorageId, TUint32 aParentHandle); void NotifyObjectAddToDP(const TUint32 aHandle,const TUint DpId); + private: // Owned MMTPDataProviderFramework& iFramework; @@ -88,6 +89,10 @@ TUint iDpID; RMTPFramework iSingletons; TBool iSkipCurrentStorage; + + TBool iIsFileEnumerator; + TBool iOnlyScanRoot; + TInt iNumOfFoldersAndFiles; /** FLOGGER debug trace member variable. */ diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/dputility/inc/cmtpknowledgehandler.h --- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpknowledgehandler.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtpknowledgehandler.h Sun Mar 14 13:12:01 2010 +0000 @@ -31,6 +31,93 @@ class CMTPTypeFile; class CRepository; +NONSHARABLE_CLASS(CKnowledgeObject) : public CBase + { +public: + static CKnowledgeObject* NewL(CRepository& aRepository); + ~CKnowledgeObject(); + + /** + Get the value from the central repository + @leave One of the system wide error codes, if repository get value fail + */ + void LoadL(); + /** + Set the cached value to the central repository + @leave One of the system wide error codes, if repository set value fail + */ + void CommitL(); + /** + Clear the cached knowledge object property values + */ + void Clear(); + /** + Update cached DateModified to current Device time + */ + void RefreshDateModifed(); + /** + Check if the cached object property values are aligned with repository + */ + TBool IsDirty() {return iDirty;}; + + //Get method for all prop + TUint64 Size(){return iKnowledgeObjectSize;}; + TDesC& DateModified(){return iDateModified;}; + TDesC& Name(){return iName;}; + const TMTPTypeUint128& LastAuthorProxyID() {return iLastAuthorProxyID;}; + + //Set method for all prop + void SetSize(TUint64 aSize); + void SetDateModified(const TDesC& aDateModified); + void SetName(const TDesC& aName); + void SetLastAuthorProxyID(TUint64 aHigh, TUint64 aLow); + +private: + //key of central repository + enum TMTPKnowledgeStoreKeyNum + { + ESize = 0x10001, + EDateModified = 0x10002, + EName = 0x10003, + ELastAuthorProxyID = 0x10004 + }; + + // Bit flag of the property + enum TMTPKnowledgeBitFlag + { + EBitFlagNone = 0x00, + EBitFlagSize = 0x01, + EBitFlagDateModified = 0x02, + EBitFlagName = 0x04, + EBitFlagLastAuthorProxyID = 0x08, + EBitFlagAll = 0x0F + }; + +private: + CKnowledgeObject(CRepository& aRepository); + + void ConstructL(); + + TMTPResponseCode SetColumnType128Value(TMTPKnowledgeStoreKeyNum aColumnNum, TMTPTypeUint128& aNewData); + + CRepository& iRepository; + + // The bit wise value of TMTPKnowledgeBitFlag + // to state which property is not aligned with repository + TUint iDirty; + + TUint64 iKnowledgeObjectSize; + RBuf iDateModified; + RBuf iName; + TMTPTypeUint128 iLastAuthorProxyID; + + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + + }; + /** Controls access to the knowledge object. @internalComponent @@ -68,58 +155,24 @@ void RollBack(); void ReleaseObjectBuffer(); - enum TCacheStatus - { - EOK, - EDirty, - EDeleted - }; - //key of central repository - enum TMTPKnowledgeStoreKeyNum - { - ESize = 0x10001, - EDateModified = 0x10002, - EName = 0x10003, - ELastAuthorProxyID = 0x10004 - }; - TMTPResponseCode SetColumnType128Value(TMTPKnowledgeStoreKeyNum aColumnNum, TMTPTypeUint128& aNewData); - private: CMTPKnowledgeHandler(MMTPDataProviderFramework& aFramework,TUint16 aFormatCode, CRepository& aReposotry, const TDesC& aKwgSuid); void ConstructL(); /** - Get the value from the central repository - @leave One of the system wide error codes, if repository get value fail - */ - void LoadKnowledgeObjPropertiesL(); - /** - Cleanup Item operation for drop all knowledge properties - */ - static void DropCacheWrapper(TAny* aObject); - void DropKnowledgeObjPropertiesCache(); - /** Helper for GetObjectInfo request handling */ void BuildObjectInfoL(CMTPTypeObjectInfo& aObjectInfo) const; - /** - Delete knowledge object properties and content - @leave One of the system wide error codes, if repository set value fail - */ - void DeleteAllObjectPropertiesL(); private: MMTPDataProviderFramework& iFramework; CRepository& iRepository; TUint32 iStorageID; TUint16 iKnowledgeFormatCode; - TUint64 iKnowledgeObjectSize; - HBufC* iDateModified; - HBufC* iName; - TMTPTypeUint128 iLastAuthorProxyID; - TCacheStatus iCacheStatus; - TCacheStatus iCacheStatusFlag; + + CKnowledgeObject* iCachedKnowledgeObject; + TFileName iKnowObjFileName; TFileName iKnowObjSwpFileName; // Knowledge object content file diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/dputility/inc/cmtprequestprocessor.h --- a/mtpfws/mtpfw/dataproviders/dputility/inc/cmtprequestprocessor.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/dputility/inc/cmtprequestprocessor.h Sun Mar 14 13:12:01 2010 +0000 @@ -182,7 +182,7 @@ const TMTPTypeRequest* iRequest; //the pending requst object MMTPConnection& iConnection; //the connection from which the request comes TMTPTypeResponse iResponse; //the response object to send to the initiator - TBool iCancelled; //indicates whether the data phase (send/receive) has been cancelled + TBool iCancelled; //indicates whether this request has been cancelled CMTPRequestChecker* iRequestChecker; //a utility class providing generic request verification service TInt iElementCount; //number of verification elements used for request checker const TMTPRequestElementInfo* iElements; //pointer to an array of verification elements diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/dputility/inc/mtpsvcdpconst.h --- a/mtpfws/mtpfw/dataproviders/dputility/inc/mtpsvcdpconst.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/dputility/inc/mtpsvcdpconst.h Sun Mar 14 13:12:01 2010 +0000 @@ -230,6 +230,7 @@ const TUint32 KMTPServicePropertyAll = 0x00000000; const TUint32 KMTPUnInitialized32 = 0xFFFFFFFF; +const TUint64 KMTPUnInitialized64 = ~0; //MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32); const TUint32 KMaxSUIDLength = 50; const TUint64 KObjectSizeNotAvaiable = ~0; const TUint32 KLongStringMaxLength = 0x1000; diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/dputility/src/cmtpfsenumerator.cpp --- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpfsenumerator.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpfsenumerator.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -27,10 +27,18 @@ #include "mmtpenumerationcallback.h" #include "cmtpdataprovidercontroller.h" #include "cmtpdataprovider.h" +#include "mtpframeworkconst.h" + // Class constants. __FLOG_STMT(_LIT8(KComponent,"FSEnumerator");) +const TUint KMTPMaxFullFileName = 259; +/* + * + */ +#define KMAX_FILECOUNT_ENUMERATINGPHASE1 5000 + /** * the files should not be owned by any dp. */ @@ -86,9 +94,13 @@ Kick off the enumeration on the specified storage @param aStorageId storage to be enumerated */ -EXPORT_C void CMTPFSEnumerator::StartL(TUint32 aStorageId) +EXPORT_C void CMTPFSEnumerator::StartL(TUint32 aStorageId, TBool aOnlyRoot) { __ASSERT_DEBUG(!IsActive(), User::Invariant()); + iNumOfFoldersAndFiles = 0; + iOnlyScanRoot = aOnlyRoot; + __FLOG_VA((_L8("iOnlyScanRoot == %d "), iOnlyScanRoot)); + MMTPStorageMgr& storageMgr(iFramework.StorageMgr()); if (aStorageId == KMTPStorageAll) { @@ -157,6 +169,11 @@ } else { + if((!iIsFileEnumerator) &&(iNumOfFoldersAndFiles > KMAX_FILECOUNT_ENUMERATINGPHASE1)) + { + iSingletons.DpController().SetNeedEnumeratingPhase2(ETrue); + } + iCallback.NotifyEnumerationCompleteL(iStorageId, KErrNone); TMTPTypeEvent event; @@ -248,7 +265,12 @@ { // We are done iStorages.Reset(); + if((!iIsFileEnumerator) &&(iNumOfFoldersAndFiles > KMAX_FILECOUNT_ENUMERATINGPHASE1)) + { + iSingletons.DpController().SetNeedEnumeratingPhase2(ETrue); + } iCallback.NotifyEnumerationCompleteL(iStorageId, KErrNone); + } __FLOG_VA(_L8("ScanNextStorageL - exit")); } @@ -283,7 +305,7 @@ __FLOG_VA(_L8("ScanNextL - entry")); TInt count = iDirStack.Count(); - if (count == 0) + if ((count == 0) || iOnlyScanRoot ) { // No more directories on the stack, try the next storage ScanNextStorageL(); @@ -372,6 +394,7 @@ __FLOG_VA((_L8("RunError - entry with error %d"), aError)); if(!iFramework.StorageMgr().ValidStorageId(iStorages[0])) { + __FLOG_VA((_L8("Invalid StorageID = %d"),iStorages[0] )); if (iStorages.Count()>1) { //Not necessary to process any entry on the storage, since the storage removed. @@ -411,6 +434,7 @@ iDpSingletons.OpenL(iFramework); iObject = CMTPObjectMetaData::NewL(); iDpID = iFramework.DataProviderId(); + iIsFileEnumerator = (KMTPFileDPID == iDpID); } /** @@ -419,8 +443,6 @@ void CMTPFSEnumerator::ProcessEntriesL() { - const TUint KMTPMaxFullFileName = 259; - TBuf path = iPath.DriveAndPath(); // Start looping through entries at where we left off @@ -429,7 +451,11 @@ count = Min(count, iProcessLimit); iFirstUnprocessed += count; - + if(!iIsFileEnumerator) + { + iNumOfFoldersAndFiles +=count; + } + for (TInt i = (iFirstUnprocessed - count); i < iFirstUnprocessed; ++i) { const TEntry& entry = iEntries[i]; @@ -475,14 +501,14 @@ path.Append('\\'); ++len; format = EMTPFormatCodeAssociation; - AddEntryL(path, handle, format, iDpID, entry); + AddEntryL(path, handle, format, iDpID, entry, iStorages[0], iParentHandle); iDirStack.AppendL(entry); } } else if ( iExclusionMgr.IsFileAcceptedL(path,iStorages[0]) ) { format = EMTPFormatCodeUndefined; - AddEntryL(path, handle, format, iDpID, entry); + AddEntryL(path, handle, format, iDpID, entry, iStorages[0], iParentHandle); } else if ( parse.ExtPresent() ) { @@ -492,7 +518,7 @@ if (KMTPHandleNone == iFramework.ObjectMgr().HandleL(path)) { format = EMTPFormatCodeUndefined; - AddEntryL(path, handle, format, iDpID, entry); + AddEntryL(path, handle, format, iDpID, entry, iStorages[0], iParentHandle); } break; @@ -501,7 +527,7 @@ { format = iDpSingletons.MTPUtility().GetFormatByExtension(parse.Ext().Mid(1)); TUint32 DpId = iDpSingletons.MTPUtility().GetDpId(parse.Ext().Mid(1), KNullDesC); - AddFileEntryForOtherDpL(path, handle, format, DpId, entry); + AddFileEntryForOtherDpL(path, handle, format, DpId, entry, iStorages[0], iParentHandle); } break; @@ -509,7 +535,7 @@ { format = iDpSingletons.MTPUtility().GetFormatByExtension(parse.Ext().Mid(1)); TUint32 DpId = iDpSingletons.MTPUtility().GetDpId(parse.Ext().Mid(1), KNullDesC); - AddFileEntryForOtherDpL(path, handle, format, DpId, entry); + AddFileEntryForOtherDpL(path, handle, format, DpId, entry, iStorages[0], iParentHandle); } break; @@ -531,7 +557,7 @@ @param aPath The full path name of the entry @return MTP object handle, or KMTPHandleNone if entry was not accepted */ -void CMTPFSEnumerator::AddEntryL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry) +void CMTPFSEnumerator::AddEntryL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& aEntry, TUint32 aStorageId, TUint32 aParentHandle) { #ifdef __FLOG_ACTIVE TBuf8 tmp; @@ -561,10 +587,10 @@ iObject->SetUint(CMTPObjectMetaData::EDataProviderId, aDPId); iObject->SetUint(CMTPObjectMetaData::EFormatCode, format); - iObject->SetUint(CMTPObjectMetaData::EStorageId, iStorages[0]); + iObject->SetUint(CMTPObjectMetaData::EStorageId, aStorageId); iObject->SetDesCL(CMTPObjectMetaData::ESuid, aPath); iObject->SetUint(CMTPObjectMetaData::EFormatSubCode, assoc); - iObject->SetUint(CMTPObjectMetaData::EParentHandle, iParentHandle); + iObject->SetUint(CMTPObjectMetaData::EParentHandle, aParentHandle); iObject->SetUint(CMTPObjectMetaData::ENonConsumable, EMTPConsumable); iObject->SetDesCL(CMTPObjectMetaData::EName, name); iFramework.ObjectMgr().InsertObjectL(*iObject); @@ -572,7 +598,7 @@ __FLOG_VA(_L8("AddEntryL - exit")); } -void CMTPFSEnumerator::AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& /*aEntry*/) +void CMTPFSEnumerator::AddFileEntryForOtherDpL(const TDesC& aPath, TUint32 &aHandle, TMTPFormatCode format, TUint32 aDPId, const TEntry& /*aEntry*/, TUint32 aStorageId, TUint32 aParentHandle) { #ifdef __FLOG_ACTIVE TBuf8 tmp; @@ -589,10 +615,10 @@ iObject->SetUint(CMTPObjectMetaData::EDataProviderId, aDPId); iObject->SetUint(CMTPObjectMetaData::EFormatCode, format); - iObject->SetUint(CMTPObjectMetaData::EStorageId, iStorages[0]); + iObject->SetUint(CMTPObjectMetaData::EStorageId, aStorageId); iObject->SetDesCL(CMTPObjectMetaData::ESuid, aPath); iObject->SetUint(CMTPObjectMetaData::EFormatSubCode, assoc); - iObject->SetUint(CMTPObjectMetaData::EParentHandle, iParentHandle); + iObject->SetUint(CMTPObjectMetaData::EParentHandle, aParentHandle); iObject->SetUint(CMTPObjectMetaData::ENonConsumable, EMTPConsumable); iObject->SetDesCL(CMTPObjectMetaData::EName, name); iFramework.ObjectMgr().InsertObjectL(*iObject); @@ -604,3 +630,4 @@ iSingletons.DpController().NotifyDataProvidersL(DpId,EMTPObjectAdded,(TAny*)&aHandle); } + diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/dputility/src/cmtpknowledgehandler.cpp --- a/mtpfws/mtpfw/dataproviders/dputility/src/cmtpknowledgehandler.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpknowledgehandler.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -39,6 +39,183 @@ _LIT(KMTPKnowledgeObjFileName, "mtp_knowledgeobj.dat"); _LIT(KMTPKnowledgeObjSwpFileName, "mtp_knowledgeobj.swp"); + +CKnowledgeObject* CKnowledgeObject::NewL(CRepository& aRepository) + { + CKnowledgeObject *self = new (ELeave) CKnowledgeObject(aRepository); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CKnowledgeObject::CKnowledgeObject(CRepository& aRepository) : iRepository(aRepository) + { + + } +CKnowledgeObject::~CKnowledgeObject() + { + __FLOG(_L8("~CKnowledgeObject - Entry")); + iDateModified.Close(); + iName.Close(); + __FLOG(_L8("~CKnowledgeObject - Exit")); + __FLOG_CLOSE; + } +void CKnowledgeObject::ConstructL() + { + __FLOG_OPEN(KMTPSubsystem, KComponent); + __FLOG(_L8("CKnowledgeObject Construct - Entry")); + iKnowledgeObjectSize = KObjectSizeNotAvaiable; + iDateModified.CreateL(KDateTimeMaxLength); + iName.CreateL(KNameMaxLength); + iLastAuthorProxyID.Set(KMTPUnInitialized64, KMTPUnInitialized64); + iDirty = EBitFlagAll; + __FLOG(_L8("CKnowledgeObject Construct - Exit")); + } + +void CKnowledgeObject::LoadL() + { + __FLOG(_L8("CKnowledgeObject LoadL - Entry")); + // Load ObjectSize + TInt objSize; + User::LeaveIfError(iRepository.Get(ESize, objSize)); + iKnowledgeObjectSize = objSize; + + // Load DateModify + iDateModified.Zero(); + User::LeaveIfError(iRepository.Get(EDateModified, iDateModified)); + + // Load Name + iName.Zero(); + User::LeaveIfError(iRepository.Get(EName, iName)); + + // Load LastAuthorProxyID: + TPtr8 writeBuf(NULL, 0); //walkaroud for the TMTPTypeUint128 + iLastAuthorProxyID.FirstWriteChunk(writeBuf); + User::LeaveIfError(iRepository.Get(ELastAuthorProxyID, writeBuf)); + iDirty = EBitFlagNone; + __FLOG(_L8("CKnowledgeObject LoadL - Exit")); + return; + } + + +void CKnowledgeObject::Clear() + { + __FLOG(_L8("CKnowledgeObject Clear - Entry")); + iKnowledgeObjectSize = KObjectSizeNotAvaiable; + iDateModified.Zero(); + iName.Zero(); + iLastAuthorProxyID.Set(KMTPUnInitialized64, KMTPUnInitialized64); + iDirty = EBitFlagAll; + __FLOG(_L8("CKnowledgeObject Clear - Exit")); + } + +void CKnowledgeObject::SetSize(TUint64 aSize) + { + iKnowledgeObjectSize = aSize; + iDirty |= EBitFlagSize; + } + +void CKnowledgeObject::SetDateModified(const TDesC& /*aDateModified*/) + { + /** + * DateModifed will be auto updated when commit. If PC set this prop, it will be ignored. + * If someday PC want to force the DateModifed be saved, the following code piece should + * be opened, and add check in commit when save DateModified. + *iDateModified.Copy(aDateModified); + *iDirty |= EBitFlagDateModified; + **/ + } + +void CKnowledgeObject::SetName(const TDesC& aName) + { + iName.Copy(aName); + iDirty |= EBitFlagName; + } + +void CKnowledgeObject::SetLastAuthorProxyID(TUint64 aHigh, TUint64 aLow) + { + iLastAuthorProxyID.Set(aHigh, aLow); + iDirty |= EBitFlagLastAuthorProxyID; + } + +void CKnowledgeObject::CommitL() + { + __FLOG(_L8("CKnowledgeObject CommitL - Entry")); + if (EBitFlagSize == (iDirty & EBitFlagSize)) + { + // TUint64 -> TInt, some capability is lost, + // anyway, it's enough for knowledge object. + User::LeaveIfError(iRepository.Set(ESize, (TInt)iKnowledgeObjectSize)); + } + + if (EBitFlagName == (iDirty & EBitFlagName)) + { + User::LeaveIfError(iRepository.Set(EName, iName)); + } + + if (EBitFlagLastAuthorProxyID == (iDirty & EBitFlagLastAuthorProxyID)) + { + if (EMTPRespCodeOK != SetColumnType128Value(ELastAuthorProxyID, iLastAuthorProxyID)) + { + User::Leave(KErrGeneral); + } + } + + // update DateModified to be the time of Commit + RefreshDateModifed(); + User::LeaveIfError(iRepository.Set(EDateModified, iDateModified)); + + iDirty = EBitFlagNone; + __FLOG(_L8("CKnowledgeObject KnowledgeObject CommitL - Exit")); + return; + } + +TMTPResponseCode CKnowledgeObject::SetColumnType128Value(TMTPKnowledgeStoreKeyNum aColumnNum, TMTPTypeUint128& aNewData) + { + __FLOG(_L8("CKnowledgeObject SetColumnType128ValueL - Entry")); + TInt ret; + TMTPResponseCode responseCode = EMTPRespCodeOK; + TBuf8 data; + data.FillZ(data.MaxLength()); + TUint64 upperValue = aNewData.UpperValue(); + TUint64 lowerValue = aNewData.LowerValue(); + + /** + Least significant 64-bit buffer offset. + */ + const TInt KMTPTypeUint128OffsetLS = 0; + /** + Most significant 64-bit buffer offset. + */ + const TInt KMTPTypeUint128OffsetMS = 8; + + memcpy(&data[KMTPTypeUint128OffsetMS], &upperValue, sizeof(upperValue)); + memcpy(&data[KMTPTypeUint128OffsetLS], &lowerValue, sizeof(lowerValue)); + + ret = iRepository.Set(aColumnNum, data); + if (KErrNone != ret) + { + responseCode = EMTPRespCodeGeneralError; + } + __FLOG_VA((_L8("CKnowledgeObject SetColumnType128ValueL - Exit with responseCode = 0x%04X"), responseCode)); + return responseCode; + } + + +void CKnowledgeObject::RefreshDateModifed() + { + __FLOG(_L8("CKnowledgeObject RefreshDateModifed - Entry")); + //get current time + TTime now; + now.UniversalTime(); + _LIT(KFormat,"%F%Y%M%DT%H%T%SZ"); + iDateModified.Zero(); + now.FormatL(iDateModified, KFormat); + __FLOG(_L8("CKnowledgeObject RefreshDateModifed - Exit")); + return; + } + EXPORT_C CMTPKnowledgeHandler* CMTPKnowledgeHandler::NewL(MMTPDataProviderFramework& aFramework, TUint16 aFormatCode, CRepository& aReposotry, const TDesC& aKwgSuid) { @@ -52,18 +229,16 @@ EXPORT_C CMTPKnowledgeHandler::~CMTPKnowledgeHandler() { __FLOG(_L8("~CMTPKnowledgeHandler - Entry")); - delete iDateModified; - delete iName; delete iKnowledgeObj; delete iKnowledgeSwpBuffer; + delete iCachedKnowledgeObject; __FLOG(_L8("~CMTPKnowledgeHandler - Exit")); __FLOG_CLOSE; } CMTPKnowledgeHandler::CMTPKnowledgeHandler(MMTPDataProviderFramework& aFramework, TUint16 aFormatCode, CRepository& aReposotry, const TDesC& aKwgSuid) : - iFramework(aFramework), iRepository(aReposotry), iKnowledgeFormatCode(aFormatCode), - iKnowledgeObjectSize(KObjectSizeNotAvaiable), iCacheStatus(EOK), iSuid(aKwgSuid) + iFramework(aFramework), iRepository(aReposotry), iKnowledgeFormatCode(aFormatCode), iSuid(aKwgSuid) { } @@ -93,7 +268,9 @@ User::LeaveIfError(iFramework.Fs().Delete(iKnowObjSwpFileName)); } - LoadKnowledgeObjPropertiesL(); + // create and load knowledge object properties + iCachedKnowledgeObject = CKnowledgeObject::NewL(iRepository); + iCachedKnowledgeObject->LoadL(); __FLOG(_L8("ConstructL - Exit")); } @@ -105,26 +282,11 @@ void CMTPKnowledgeHandler::CommitL() { __FLOG(_L8("CommitL - Entry")); - User::LeaveIfError(iRepository.StartTransaction(CRepository::EReadWriteTransaction)); iRepository.CleanupCancelTransactionPushL(); - if(iKnowledgeObjectSize != KObjectSizeNotAvaiable) - { - User::LeaveIfError(iRepository.Set(ESize, (TInt)iKnowledgeObjectSize)); - } - if(iDateModified) - { - User::LeaveIfError(iRepository.Set(EDateModified, *iDateModified)); - } - if(iName) - { - User::LeaveIfError(iRepository.Set(EName, *iName)); - } - if (EMTPRespCodeOK != SetColumnType128Value(ELastAuthorProxyID, iLastAuthorProxyID)) - { - User::Leave(KErrGeneral); - } + iCachedKnowledgeObject->CommitL(); + // Close all knowledge file and reset pointer. if (iKnowledgeObj) { @@ -144,10 +306,11 @@ User::LeaveIfError(iFramework.Fs().Replace(iKnowObjSwpFileName, iKnowObjFileName)); } // If swp file isn't exsited, that means 0 sized object received, need do nothing. - + TUint32 keyInfo; User::LeaveIfError(iRepository.CommitTransaction(keyInfo)); CleanupStack::Pop(&iRepository); + __FLOG(_L8("CommitL - Exit")); } @@ -160,80 +323,21 @@ void CMTPKnowledgeHandler::RollBack() { __FLOG(_L8("Rollback - Entry")); - TRAP_IGNORE(LoadKnowledgeObjPropertiesL()); + iCachedKnowledgeObject->Clear(); + TRAP_IGNORE(iCachedKnowledgeObject->LoadL()); __FLOG(_L8("Rollback - Exit")); } EXPORT_C void CMTPKnowledgeHandler::GetObjectSuidL(TDes& aSuid) const { __FLOG(_L8("GetObjectSuidL - Entry")); - if(iKnowledgeObjectSize != KObjectSizeNotAvaiable) + if(iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable) { aSuid.Append(iSuid); } __FLOG(_L8("GetObjectSuidL - Exit")); } -void CMTPKnowledgeHandler::LoadKnowledgeObjPropertiesL() - { - __FLOG(_L8("LoadKnowledgeObjPropertiesL - Entry")); - iCacheStatus = EOK; - iCacheStatusFlag = EDirty; - TCleanupItem cacheDroper(DropCacheWrapper, this); - CleanupStack::PushL(cacheDroper); - TInt objSize; - User::LeaveIfError(iRepository.Get(ESize, objSize)); - iKnowledgeObjectSize = objSize; - - // Load DateModify - delete iDateModified; - iDateModified = NULL; - iDateModified = HBufC::NewL(KDateTimeMaxLength); - TPtr ptrDate(iDateModified->Des()); - User::LeaveIfError(iRepository.Get(EDateModified, ptrDate)); - - // Load Name - delete iName; - iName = NULL; - iName = HBufC::NewL(KNameMaxLength); - TPtr ptrName(iName->Des()); - User::LeaveIfError(iRepository.Get(EName, ptrName)); - - // Load LastAuthorProxyID: - TPtr8 writeBuf(NULL, 0); //walkaroud for the TMTPTypeUint128 - iLastAuthorProxyID.FirstWriteChunk(writeBuf); - User::LeaveIfError(iRepository.Get(ELastAuthorProxyID, writeBuf)); - CleanupStack::Pop(this); - // Doesn't load object content to cache beacause it can grow up to 100KB - __FLOG(_L8("LoadKnowledgeObjPropertiesL - Exit")); - } - -void CMTPKnowledgeHandler::DropCacheWrapper(TAny* aObject) - { - reinterpret_cast(aObject)->DropKnowledgeObjPropertiesCache(); - } - -void CMTPKnowledgeHandler::DropKnowledgeObjPropertiesCache() - { - __FLOG(_L8("DropKnowledgeObjPropertiesCache - Entry")); - iCacheStatus = iCacheStatusFlag; - iKnowledgeObjectSize = KObjectSizeNotAvaiable; - - // Load DateModify - delete iDateModified; - iDateModified = NULL; - - // Load Name - delete iName; - iName = NULL; - - // Reset LastAuthorProxyID - TMTPTypeUint128 tmp(MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32), - MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32)); - iLastAuthorProxyID.Set(tmp.UpperValue(), tmp.LowerValue()); - __FLOG(_L8("DropKnowledgeObjPropertiesCache - Exit")); - } - TMTPResponseCode CMTPKnowledgeHandler::SendObjectInfoL(const CMTPTypeObjectInfo& aObjectInfo, TUint32& aParentHandle, TDes& aSuid) { __FLOG(_L("SendObjectInfoL - Entry")); @@ -245,21 +349,22 @@ else { //if there's a read error reread - if(EDirty == iCacheStatus) + if(iCachedKnowledgeObject->IsDirty()) { - LoadKnowledgeObjPropertiesL(); + __FLOG(_L8("Warning: The cached knowledge is dirty")); + iCachedKnowledgeObject->Clear(); + iCachedKnowledgeObject->LoadL(); } //already has a knowledge object - if(iKnowledgeObjectSize != KObjectSizeNotAvaiable) + if(iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable) { responseCode = EMTPRespCodeAccessDenied; } else { - iKnowledgeObjectSize = aObjectInfo.Uint32L(CMTPTypeObjectInfo::EObjectCompressedSize); - delete iDateModified; - iDateModified = NULL; - iDateModified = aObjectInfo.StringCharsL(CMTPTypeObjectInfo::EDateModified).AllocL(); + iCachedKnowledgeObject->Clear(); + iCachedKnowledgeObject->SetSize(aObjectInfo.Uint32L(CMTPTypeObjectInfo::EObjectCompressedSize)); + // DateModified will be updated when commit. aSuid = iSuid; } } @@ -280,18 +385,21 @@ { //if there's a read error reread aParentHandle = KMTPHandleNoParent; - if(EDirty == iCacheStatus) + if(iCachedKnowledgeObject->IsDirty()) { - LoadKnowledgeObjPropertiesL(); + __FLOG(_L8("Warning: The cached knowledge is dirty")); + iCachedKnowledgeObject->Clear(); + iCachedKnowledgeObject->LoadL(); } //already has a knowledge object - if(iKnowledgeObjectSize != KObjectSizeNotAvaiable) + if(iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable) { responseCode = EMTPRespCodeAccessDenied; } else { - iKnowledgeObjectSize = aObjectSize; + iCachedKnowledgeObject->Clear(); + iCachedKnowledgeObject->SetSize(aObjectSize); aSuid = iSuid; } } @@ -307,6 +415,12 @@ CMTPTypeObjectPropListElement* propertyElement = NULL; TUint32 aHandle = aObjectMetaData.Uint(CMTPObjectMetaData::EHandle); + if(iCachedKnowledgeObject->IsDirty()) + { + __FLOG(_L8("Warning: The cached knowledge is dirty")); + iCachedKnowledgeObject->LoadL(); + } + switch (aPropertyCode) { case EMTPGenObjPropCodeParentID: @@ -319,9 +433,9 @@ case EMTPGenObjPropCodeName: { propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode)); - if (iName && iName->Length() > 0) + if (iCachedKnowledgeObject->Name().Length() > 0) { - propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, *iName); + propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, iCachedKnowledgeObject->Name()); } else { @@ -349,10 +463,10 @@ case EMTPGenObjPropCodeObjectSize: { - if (iKnowledgeObjectSize != ~0) + if (iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable) { propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode)); - propertyElement->SetUint64L(CMTPTypeObjectPropListElement::EValue,iKnowledgeObjectSize); + propertyElement->SetUint64L(CMTPTypeObjectPropListElement::EValue, iCachedKnowledgeObject->Size()); } break; } @@ -380,34 +494,24 @@ case EMTPGenObjPropCodeDateModified: { - propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode)); - if(iDateModified && iDateModified->Length() > 0) - { - propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, *iDateModified); - } - else + if(iCachedKnowledgeObject->DateModified().Length() == 0) { - TTime now; - now.UniversalTime(); - const TInt KMaxTimeStringSize = 50; - TBuf dateTimeBuf; - _LIT(KFormat,"%F%Y%M%DT%H%T%S"); - now.FormatL(dateTimeBuf, KFormat); - propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, dateTimeBuf); + iCachedKnowledgeObject->RefreshDateModifed(); } + propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode)); + propertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, iCachedKnowledgeObject->DateModified()); break; } case EMTPSvcObjPropCodeLastAuthorProxyID: { - const TMTPTypeUint128 unInitValue(MAKE_TUINT64(KMTPUnInitialized32, KMTPUnInitialized32), - MAKE_TUINT64(KMTPUnInitialized32, KMTPUnInitialized32)); - if(!unInitValue.Equal(iLastAuthorProxyID)) + if ((iCachedKnowledgeObject->LastAuthorProxyID().UpperValue() != KMTPUnInitialized64) + && (iCachedKnowledgeObject->LastAuthorProxyID().LowerValue() !=KMTPUnInitialized64)) { propertyElement = &(aPropList.ReservePropElemL(aHandle, aPropertyCode)); propertyElement->SetUint128L(CMTPTypeObjectPropListElement::EValue, - iLastAuthorProxyID.UpperValue(), - iLastAuthorProxyID.LowerValue()); + iCachedKnowledgeObject->LastAuthorProxyID().UpperValue(), + iCachedKnowledgeObject->LastAuthorProxyID().LowerValue()); } break; } @@ -437,43 +541,27 @@ switch (propertyCode) { case EMTPGenObjPropCodeObjectSize: - if(aOperationCode == EMTPOpCodeSetObjectPropList) - { - ret = iRepository.Set(ESize, (TInt)aElement.Uint64L(CMTPTypeObjectPropListElement::EValue)); - } - iKnowledgeObjectSize = aElement.Uint64L(CMTPTypeObjectPropListElement::EValue); + { + iCachedKnowledgeObject->SetSize(aElement.Uint64L(CMTPTypeObjectPropListElement::EValue)); break; - + } case EMTPGenObjPropCodeDateModified: - if(aOperationCode == EMTPOpCodeSetObjectPropList) - { - ret = iRepository.Set(EDateModified, aElement.StringL(CMTPTypeObjectPropListElement::EValue)); - } - delete iDateModified; - iDateModified = NULL; - iDateModified = aElement.StringL(CMTPTypeObjectPropListElement::EValue).AllocL(); + { + // DateModified will be updated when Commit + iCachedKnowledgeObject->SetDateModified(aElement.StringL(CMTPTypeObjectPropListElement::EValue)); break; - + } case EMTPGenObjPropCodeName: - if(aOperationCode == EMTPOpCodeSetObjectPropList) - { - ret = iRepository.Set(EName, aElement.StringL(CMTPTypeObjectPropListElement::EValue)); - } - delete iName; - iName = NULL; - iName = aElement.StringL(CMTPTypeObjectPropListElement::EValue).AllocL(); + { + iCachedKnowledgeObject->SetName(aElement.StringL(CMTPTypeObjectPropListElement::EValue)); break; - + } case EMTPSvcObjPropCodeLastAuthorProxyID: { TUint64 high_value = 0; TUint64 low_value = 0; aElement.Uint128L(CMTPTypeObjectPropListElement::EValue, high_value, low_value); - if(aOperationCode == EMTPOpCodeSetObjectPropList) - { - responseCode = SetColumnType128Value(ELastAuthorProxyID, iLastAuthorProxyID); - } - iLastAuthorProxyID.Set(high_value, low_value); + iCachedKnowledgeObject->SetLastAuthorProxyID(high_value, low_value); break; } @@ -494,16 +582,31 @@ TMTPResponseCode CMTPKnowledgeHandler::DeleteObjectL(const CMTPObjectMetaData& /*aObjectMetaData*/) { __FLOG(_L8("DeleteObjectL - Entry")); - iCacheStatusFlag = EDirty; - TCleanupItem cacheDroper(DropCacheWrapper, this); - CleanupStack::PushL(cacheDroper); + + User::LeaveIfError(iRepository.StartTransaction(CRepository::EReadWriteTransaction)); + iRepository.CleanupCancelTransactionPushL(); + // Delete obejct properties in transaction, if leave, mgr will rollback all properties. - DeleteAllObjectPropertiesL(); - CleanupStack::Pop(this); - // Drop all cached properties. - iCacheStatusFlag = EDeleted; - CMTPKnowledgeHandler::DropCacheWrapper(this); - LoadKnowledgeObjPropertiesL(); + iCachedKnowledgeObject->Clear(); + iCachedKnowledgeObject->CommitL(); + + // Reset knowledgeobject pointer and close the file. + if (iKnowledgeObj) + { + delete iKnowledgeObj; + iKnowledgeObj = NULL; + } + + // Keep file delete is atomic. + if (BaflUtils::FileExists(iFramework.Fs(), iKnowObjFileName)) + { + User::LeaveIfError(iFramework.Fs().Delete(iKnowObjFileName)); + } + + TUint32 keyInfo; + User::LeaveIfError(iRepository.CommitTransaction(keyInfo)); + CleanupStack::Pop(&iRepository); + __FLOG(_L8("DeleteObjectL - Exit")); return EMTPRespCodeOK; } @@ -538,19 +641,12 @@ switch (aPropertyCode) { case EMTPGenObjPropCodeDateModified: - delete iDateModified; - iDateModified = NULL; - if (KErrNone != iRepository.Set(EDateModified, KEmptyContent16)) - { - responseCode = EMTPRespCodeGeneralError; - } + // DateModified will be updated when Commit + iCachedKnowledgeObject->SetDateModified(KEmptyContent16); break; case EMTPSvcObjPropCodeLastAuthorProxyID: { - TMTPTypeUint128 tmp(MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32), - MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32)); - iLastAuthorProxyID.Set(tmp.UpperValue(), tmp.LowerValue()); - responseCode = SetColumnType128Value(ELastAuthorProxyID, iLastAuthorProxyID); + iCachedKnowledgeObject->SetLastAuthorProxyID(KMTPUnInitialized64, KMTPUnInitialized64); break; } @@ -594,7 +690,7 @@ aObjectInfo.SetUint16L(CMTPTypeObjectInfo::EObjectFormat, iKnowledgeFormatCode); // Not use aObjectInfo.SetUint16L(CMTPTypeObjectInfo::EProtectionStatus, 0x0000); - aObjectInfo.SetUint32L(CMTPTypeObjectInfo::EObjectCompressedSize, iKnowledgeObjectSize); + aObjectInfo.SetUint32L(CMTPTypeObjectInfo::EObjectCompressedSize, iCachedKnowledgeObject->Size()); aObjectInfo.SetUint16L(CMTPTypeObjectInfo::EThumbFormat, 0); aObjectInfo.SetUint32L(CMTPTypeObjectInfo::EThumbCompressedSize, 0); aObjectInfo.SetUint32L(CMTPTypeObjectInfo::EThumbPixWidth, 0); @@ -615,7 +711,7 @@ TMTPResponseCode CMTPKnowledgeHandler::GetObjectInfoL(const CMTPObjectMetaData& /*aObjectMetaData*/, CMTPTypeObjectInfo& aObjectInfo) { __FLOG(_L8("GetObjectInfoL - Entry")); - if(iKnowledgeObjectSize != KObjectSizeNotAvaiable) + if(iCachedKnowledgeObject->Size() != KObjectSizeNotAvaiable) { BuildObjectInfoL(aObjectInfo); } @@ -624,42 +720,6 @@ } -void CMTPKnowledgeHandler::DeleteAllObjectPropertiesL() - { - __FLOG(_L8("DeleteAllObjectPropertiesL - Entry")); - User::LeaveIfError(iRepository.StartTransaction(CRepository::EReadWriteTransaction)); - iRepository.CleanupCancelTransactionPushL(); - User::LeaveIfError(iRepository.Set(EDateModified, KEmptyContent16)); - User::LeaveIfError(iRepository.Set(EName, KEmptyContent16)); - User::LeaveIfError(iRepository.Set(ESize, static_cast(KObjectSizeNotAvaiable))); - - TMTPTypeUint128 tmp(MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32), - MAKE_TINT64(KMTPUnInitialized32, KMTPUnInitialized32)); - if (EMTPRespCodeOK != SetColumnType128Value(ELastAuthorProxyID, tmp)) - { - User::Leave(KErrGeneral); - } - // Reset knowledgeobject pointer and close the file. - if (iKnowledgeObj) - { - delete iKnowledgeObj; - iKnowledgeObj = NULL; - } - - // Keep file delete is atomic. - if (BaflUtils::FileExists(iFramework.Fs(), iKnowObjFileName)) - { - User::LeaveIfError(iFramework.Fs().Delete(iKnowObjFileName)); - } - - TUint32 keyInfo; - User::LeaveIfError(iRepository.CommitTransaction(keyInfo)); - CleanupStack::Pop(&iRepository); - - __FLOG(_L8("DeleteAllObjectPropertiesL - Exit")); - return; - } - void CMTPKnowledgeHandler::ReleaseObjectBuffer() { __FLOG(_L8("ReleaseObjectBuffer - Entry")); @@ -678,42 +738,11 @@ { return EMTPRespCodeGeneralError; } - aObjectSize = iKnowledgeObjectSize; + aObjectSize = iCachedKnowledgeObject->Size(); __FLOG(_L8("GetObjectSizeL - Exit")); return EMTPRespCodeOK; } -TMTPResponseCode CMTPKnowledgeHandler::SetColumnType128Value(TMTPKnowledgeStoreKeyNum aColumnNum, TMTPTypeUint128& aNewData) - { - __FLOG(_L8("SetColumnType128ValueL - Entry")); - TInt ret; - TMTPResponseCode responseCode = EMTPRespCodeOK; - TBuf8 data; - data.FillZ(data.MaxLength()); - TUint64 upperValue = aNewData.UpperValue(); - TUint64 lowerValue = aNewData.LowerValue(); - - /** - Least significant 64-bit buffer offset. - */ - const TInt KMTPTypeUint128OffsetLS = 0; - /** - Most significant 64-bit buffer offset. - */ - const TInt KMTPTypeUint128OffsetMS = 8; - - memcpy(&data[KMTPTypeUint128OffsetMS], &upperValue, sizeof(upperValue)); - memcpy(&data[KMTPTypeUint128OffsetLS], &lowerValue, sizeof(lowerValue)); - - ret = iRepository.Set(aColumnNum, data); - if (KErrNone != ret) - { - responseCode = EMTPRespCodeGeneralError; - } - __FLOG_VA((_L8("SetColumnType128ValueL - Exit with responseCode = 0x%04X"), responseCode)); - return responseCode; - } - TMTPResponseCode CMTPKnowledgeHandler::GetAllObjectPropCodeByGroupL(TUint32 aGroupId, RArray& aPropCodes) { __FLOG(_L8("GetAllObjectPropCodeByGroupL - Entry")); @@ -749,3 +778,5 @@ __FLOG(_L8("GetAllObjectPropCodeByGroupL - Exit")); return responseCode; } + + diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpdeleteobject.h --- a/mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpdeleteobject.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpdeleteobject.h Sun Mar 14 13:12:01 2010 +0000 @@ -45,7 +45,8 @@ private: // From CMTPRequestProcessor void ServiceL(); - + TMTPResponseCode CheckRequestL(); + private: // From MMTPTransactionProxy void ProxyReceiveDataL(MMTPType& aData, const TMTPTypeRequest& aRequest, MMTPConnection& aConnection, TRequestStatus& aStatus); diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpobjectbrowser.h --- a/mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpobjectbrowser.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/proxydp/inc/cmtpobjectbrowser.h Sun Mar 14 13:12:01 2010 +0000 @@ -58,6 +58,15 @@ void GetRootObjectHandlesL( TUint32 aCurDepth, TUint32 aFormatCode, TUint32 aDepth, const TBrowseCallback& aBrowseCallback ) const; void GetObjectHandlesTreeL( TUint32 aCurDepth, TUint32 aFormatCode, TUint32 aDepth, TUint32 aParentHandle, const TBrowseCallback& aBrowseCallback ) const; + /** + * This function retrives all the object handles with the format code of aFormatCode. + * + * If aFormatCode == KMTPFormatsAll, only Legacy dp's object handles are returned. Object + * Handles of service dp's will not be returned. + * + */ + void GetAllObjectHandlesL( TUint32 aFormatCode,const TBrowseCallback& aBrowseCallback ) const; + private: __FLOG_DECLARATION_MEMBER_MUTABLE; diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/proxydp/src/cmtpdeleteobject.cpp --- a/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpdeleteobject.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpdeleteobject.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -86,6 +86,19 @@ __FLOG( _L8("-ConstructL") ); } +TMTPResponseCode CMTPDeleteObject::CheckRequestL() + { + __FLOG(_L8("CheckRequestL - Entry")); + TMTPResponseCode responseCode = CMTPRequestProcessor::CheckRequestL(); + if ((EMTPRespCodeOK == responseCode) && (iSingletons.DpController().EnumerateState() == CMTPDataProviderController::EEnumeratingSubDirFiles)) + { + responseCode = EMTPRespCodeDeviceBusy; + } + + __FLOG_VA((_L8("CheckRequestL - Exit with responseCode = 0x%04X"), responseCode)); + return responseCode; + } + /** DeleteObject request handler */ @@ -158,11 +171,21 @@ if ( iStatus == KErrNone ) { - NextObjectHandleL(); - if ( iOwnerDp != KInvalidDpId ) + //First check if the operation has been cancelled or not + if(iCancelled) { - CMTPDataProvider& dp = iSingletons.DpController().DataProviderL( iOwnerDp ); - dp.ExecuteProxyRequestL( iCurrentRequest, Connection(), *this ); + __FLOG(_L8("Initiator cancell delete, send response with cancelled code ")); + SendResponseL(EMTPRespCodeTransactionCancelled); + iCancelled = EFalse; + } + else + { + NextObjectHandleL(); + if ( iOwnerDp != KInvalidDpId ) + { + CMTPDataProvider& dp = iSingletons.DpController().DataProviderL( iOwnerDp ); + dp.ExecuteProxyRequestL( iCurrentRequest, Connection(), *this ); + } } } else @@ -209,6 +232,7 @@ iHandles.Reset(); iCurrentHandle = 0; iDeletedObjectsNumber = 0; + MMTPType::CopyL( Request(), iCurrentRequest ); CMTPObjectBrowser::TBrowseCallback callback = { CMTPDeleteObject::OnBrowseObjectL, this }; diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/proxydp/src/cmtpgetobjectproplist.cpp --- a/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpgetobjectproplist.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpgetobjectproplist.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -248,18 +248,7 @@ if ( 0 == iHandles.Count() ) { - if ( handle==KMTPHandleNone && depth==0 ) - { - SendDataL( *iObjectPropList ); - } - else if ( fmtCode != KMTPFormatsAll ) - { - SendResponseL(EMTPRespCodeSpecificationByFormatUnsupported); - } - else if ( handle != KMTPHandleAll ) - { - SendResponseL(EMTPRespCodeInvalidObjectHandle); - } + SendDataL( *iObjectPropList ); } else { diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/dataproviders/proxydp/src/cmtpobjectbrowser.cpp --- a/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpobjectbrowser.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/dataproviders/proxydp/src/cmtpobjectbrowser.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -55,7 +55,16 @@ switch ( aHandle ) { case KMTPHandleAll: - GetObjectHandlesL( 0, KMTPStorageAll, aFormatCode, KMaxTUint, KMTPHandleNoParent, aBrowseCallback ); + //for the format code of serveice dp's, need to check the format + if( (aFormatCode >= EMTPFormatCodeVendorExtStart)&&(aFormatCode <= EMTPFormatCodeVendorExtEnd) ) + { + GetAllObjectHandlesL( aFormatCode,aBrowseCallback ); + } + else + { + GetAllObjectHandlesL( KMTPFormatsAll,aBrowseCallback ); + } + break; case KMTPHandleNone: GetRootObjectHandlesL( 0, aFormatCode, aDepth, aBrowseCallback ); @@ -88,7 +97,16 @@ RMTPObjectMgrQueryContext context; RArray< TUint > handles; - TMTPObjectMgrQueryParams params( aStorageId, aFormatCode, aParentHandle ); + TMTPObjectMgrQueryParams params( aStorageId, KMTPFormatsAll, aParentHandle ); + // if parenthandle = 0, depth >0 and != ffffffff, for service dp, + // 1. there is no tree structure + // 2. KMTPFormatsAll may make the low lever api filter the handls of service dp. + if( (aFormatCode >= EMTPFormatCodeVendorExtStart)&&(aFormatCode <= EMTPFormatCodeVendorExtEnd) ) + { + params.iFormatCode = aFormatCode ; + } + + CleanupClosePushL( context ); CleanupClosePushL( handles ); @@ -107,7 +125,13 @@ { for ( TUint i = 0; i < handleCount; i++ ) { - aBrowseCallback.iCallback( aBrowseCallback.iContext, handles[i], aCurDepth ); + //before insert the handle to th result list , check it's format. + iDpFw.ObjectMgr().ObjectL( handles[i], *iObjMetaCache ); + if ( (KMTPFormatsAll == aFormatCode) || ( aFormatCode == iObjMetaCache->Uint( CMTPObjectMetaData::EFormatCode )) ) + { + aBrowseCallback.iCallback( aBrowseCallback.iContext, handles[i], aCurDepth ); + } + } } } @@ -123,16 +147,18 @@ { __FLOG_VA( ( _L8("+GetFolderObjectHandlesL( %d, 0x%08X, %d, 0x%08X )"), aCurDepth, aFormatCode, aDepth, aParentHandle ) ); - if ( 0 == aDepth ) - { - aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth ); - } - else + if ( aDepth > 0) { GetObjectHandlesL( aCurDepth + 1, KMTPStorageAll, aFormatCode, aDepth - 1, aParentHandle, aBrowseCallback ); - aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth ); } + //before insert the handle to th result list , check it's format. + iDpFw.ObjectMgr().ObjectL( aParentHandle, *iObjMetaCache ); + if ( (KMTPFormatsAll == aFormatCode) || ( aFormatCode == iObjMetaCache->Uint( CMTPObjectMetaData::EFormatCode )) ) + { + aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth ); + } + __FLOG( _L8("-GetFolderObjectHandlesL") ); } @@ -140,19 +166,21 @@ { __FLOG_VA( ( _L8("+GetRootObjectHandlesL( %d, 0x%08X, %d )"), aCurDepth, aFormatCode, aDepth ) ); - switch ( aDepth ) - { - case KMaxTUint: - GetObjectHandlesL( aCurDepth, KMTPStorageAll, aFormatCode, aDepth, KMTPHandleNoParent, aBrowseCallback ); - break; - case 0: - // do nothing - break; - default: - GetObjectHandlesL( aCurDepth, KMTPStorageAll, aFormatCode, aDepth, KMTPHandleNoParent, aBrowseCallback ); - break; + if( aDepth > 0) + { + if (KMaxTUint == aDepth) + { + GetAllObjectHandlesL( aFormatCode,aBrowseCallback ); + } + else + { + // attention: aDepth should be reduced by 1 here + GetObjectHandlesL( aCurDepth, KMTPStorageAll, aFormatCode, aDepth-1, KMTPHandleNoParent, aBrowseCallback ); + } } + // if aDepth == 0, no handles should be returned. + __FLOG( _L8("-GetRootObjectHandlesL") ); } @@ -169,9 +197,13 @@ { GetFolderObjectHandlesL( aCurDepth, aFormatCode, aDepth, aParentHandle, aBrowseCallback ); } + else if ( (KMTPFormatsAll == aFormatCode) || ( aFormatCode == iObjMetaCache->Uint( CMTPObjectMetaData::EFormatCode )) ) + { + aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth ); + } else { - aBrowseCallback.iCallback( aBrowseCallback.iContext, aParentHandle, aCurDepth ); + // format doesn't match, do nothing } #ifdef __FLOG_ACTIVE __FLOG_1( _L8("recursion_depth: %d"), aCurDepth ); @@ -181,4 +213,45 @@ __FLOG( _L8("-GetObjectHandlesTreeL") ); } +/** + * This function retrives all the object handles with the format code of aFormatCode. + * + * If aFormatCode == KMTPFormatsAll, only Legacy dp's object handles are returned. Object + * Handles of service dp's will not be returned. + * + */ +void CMTPObjectBrowser::GetAllObjectHandlesL(TUint32 aFormatCode,const TBrowseCallback& aBrowseCallback ) const + { + __FLOG( _L8("CMTPObjectBrowser::GetAllObjectHandles-----entry") ); + + RMTPObjectMgrQueryContext context; + RArray< TUint > handles; + TMTPObjectMgrQueryParams params( KMTPStorageAll, aFormatCode, KMTPHandleNone ); + + + CleanupClosePushL( context ); + CleanupClosePushL( handles ); + + do + { + iDpFw.ObjectMgr().GetObjectHandlesL( params, context, handles ); + TUint handleCount = handles.Count(); + + for ( TUint i = 0; i < handleCount; i++ ) + { + /* the argument aCurDepth of the callback is set to 0, since the call back never use this argument. + * If aCurDepth is used later, this arugment shoud be changed to the valid value. + */ + aBrowseCallback.iCallback( aBrowseCallback.iContext, handles[i], 0 ); + } + + } + while ( !context.QueryComplete() ); + + CleanupStack::PopAndDestroy( &handles ); + CleanupStack::PopAndDestroy( &context ); + + __FLOG( _L8("CMTPObjectBrowser::GetAllObjectHandles------exit") ); + } + diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/datatypes/interface/cmtptypefile.h --- a/mtpfws/mtpfw/datatypes/interface/cmtptypefile.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/datatypes/interface/cmtptypefile.h Sun Mar 14 13:12:01 2010 +0000 @@ -33,6 +33,43 @@ */ class CMTPTypeFile : public CActive, public MMTPType { + +class CFileWriter : public CActive + { +public: + + static CFileWriter* NewL(RFile& aFile, RBuf8& aWriteBuf); + /* + * Get the buffer for transport to receive data. + */ + void GetWriteBuf(TPtr8& aChunk); + /* + * Get the file write result. + */ + TInt GetResult() const; + /* + * Issue a async request to write aLength Data + * + */ + void Write(TInt aLength); + /* + * Wait until the async write complete. + */ + void WaitForWriteComplete(); + void RunL(); + ~CFileWriter(); + +private: + void DoCancel(); + CFileWriter(RFile& aFile, RBuf8& aBuf); + void ConstructL(); + +private: + TInt iWriteResult; + RFile& iFile; + RBuf8& iBuf; + }; + public: IMPORT_C static CMTPTypeFile* NewL(RFs& aFs, const TDesC& aFileName, TFileMode aFileMode); @@ -167,6 +204,14 @@ TInt64 iOffSet; mutable TInt64 iByteSent; + /* + * Use the writer to controll buffer1 write. + */ + CFileWriter *iFileWriter1; + /* + * Use the writer to controll buffer2 write. + */ + CFileWriter *iFileWriter2; }; diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp --- a/mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -32,6 +32,80 @@ const TUint KUSBHeaderLen = 12; + + +CMTPTypeFile::CFileWriter* CMTPTypeFile::CFileWriter::NewL(RFile& aFile, RBuf8& aWriteBuf) + { + CFileWriter *self = new(ELeave)CFileWriter(aFile, aWriteBuf); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void CMTPTypeFile::CFileWriter::GetWriteBuf(TPtr8& aChunk) + { + WaitForWriteComplete(); + aChunk.Set(&iBuf[0], 0, iBuf.MaxLength()); + } + +TInt CMTPTypeFile::CFileWriter::GetResult() const + { + return iWriteResult; + } + +void CMTPTypeFile::CFileWriter::Write(TInt aLength) + { + iFile.Write(iBuf, aLength, iStatus); + SetActive(); + } + +void CMTPTypeFile::CFileWriter::WaitForWriteComplete() + { + /* + * We didn't want to cancel the file write here. + * But we need to wait until the file write complete. + * The Cancel() function of CActive will do the wait until the file write complete. + * If the Write already complete and the RunL() invoked there's nothing happened in the Cancel(). + */ + Cancel(); + //Have to save the result. + iWriteResult = iStatus.Int(); + } + +void CMTPTypeFile::CFileWriter::RunL() + { + //Have to save the result. + iWriteResult = iStatus.Int(); + } + + +CMTPTypeFile::CFileWriter::~CFileWriter() + { + WaitForWriteComplete(); //make sure all async request complete + if(iWriteResult != KErrNone) + { + iFile.SetSize(0); + } + } + + +void CMTPTypeFile::CFileWriter::DoCancel() + { + //We didn't really want to cancel the file write, so we do nothing here + } + + +CMTPTypeFile::CFileWriter::CFileWriter(RFile& aFile, RBuf8& aBuf):CActive(EPriorityStandard), iWriteResult(KErrNone), iFile(aFile), iBuf(aBuf) + { + } + + +void CMTPTypeFile::CFileWriter::ConstructL() + { + CActiveScheduler::Add(this); + } + /** MTP file object data type factory method. @param aFs The handle of an active file server session. @@ -88,13 +162,9 @@ */ EXPORT_C CMTPTypeFile::~CMTPTypeFile() { - if(iCurrentCommitChunk.Length() != 0) - { - ToggleRdWrBuffer(); - } - + delete iFileWriter1; + delete iFileWriter2; iFile.Close(); - iBuffer1.Close(); iBuffer2.Close(); Cancel(); @@ -133,6 +203,8 @@ User::LeaveIfError(iFile.SetSize(aSize)); iCurrentFileSetSize = aSize; } + iFileWriter1 = CFileWriter::NewL(iFile, iBuffer1); + iFileWriter2 = CFileWriter::NewL(iFile, iBuffer2); } /** @@ -311,19 +383,14 @@ TInt err(iFile.Seek(ESeekStart, pos)); if (err == KErrNone) { - //Because USB HS's transmission rate is several time faster than the rate of writting data into File System. - //If the first packet is a full chunk size packet, then the writting of that data will not start until the full-chunk - //sized packet is received. Here we intentionly reduce the first packet size to 1/4 of the full chunk size, therefore, - //the start of writting data into File system will start only after 1/4 of the full chunk size data is received. - //This can make the writting of data to FS start earlier. - aChunk.Set(&iBuffer1[0], 0, iBuffer1.MaxLength()); + iFileWriter1->GetWriteBuf(aChunk); iWriteSequenceState = EInProgress; //this chunk is going to be used by Transport to write data into it, and when it is full, transport - //will call back CommitChunkL(), at that time, the EFalse means it already contains data in it. + //will call back CommitChunkL(), at that time, the ETrue means it already contains data in it. //it is ready for reading data from it. //This is a initial value for it to trigger the double-buffering mechanism. - iBuffer1AvailForWrite = EFalse; + iBuffer1AvailForWrite = ETrue; } return err; @@ -342,11 +409,11 @@ {//toggle between buffer 1 and buffer 2 here. if(iBuffer1AvailForWrite) { - aChunk.Set(&iBuffer1[0], 0, iBuffer1.MaxLength()); + iFileWriter1->GetWriteBuf(aChunk); } else { - aChunk.Set(&iBuffer2[0], 0, iBuffer2.MaxLength()); + iFileWriter2->GetWriteBuf(aChunk); } } @@ -402,51 +469,43 @@ EXPORT_C MMTPType* CMTPTypeFile::CommitChunkL(TPtr8& aChunk) { - if(iFileRdWrError) - { - return NULL; - } - if(0 == aChunk.Length()) - { - ToggleRdWrBuffer(); - return NULL; - } + if(iFileRdWrError) + { + return NULL; + } iCurrentCommitChunk.Set(aChunk); - if(iRemainingDataSize> iCurrentCommitChunk.Length()) - {//This is NOT the last chunk, we issue an active object to commit it to File system. - iRemainingDataSize -= iCurrentCommitChunk.Length(); - /* - if (!IsActive()) - { - //Since the writting data into file sever will take a long time, will issue a dedicated Active Object to do that. - SetActive(); - TRequestStatus* thisAO = &iStatus; - User::RequestComplete(thisAO, KErrNone); - } - else - { - //This is a very extreme cases, it only occurs when the following assumption is met - //1. USB received buffer1 and already call this CommitChunkL(), therefore, the ActiveObject has completed itself, and USB then use another buffer to - //receive the data. - //2. Somehow, this active object is not scheduled to be running even after the USB already fill out the other buffer. - //3. USB's active object is scheduled to be running prior to the last File active object(this should not happen if ActiveScheduler follow the priority scheduler). - //4. USB call this function again to commit the other data buffer. - //5. Then it find the previous active is not scheduled to run. - //in single-core platform, the code rely on the CActiveScheduler to guarantee the first active call which has higher priority to be running firstly before - //the 2nd USB active. but for multi-core platform, this should be re-evaluated . - iFileRdWrError = ETrue;//if it really discard the incoming recevied file. - //__FLOG(_L8("\nThe program should not arrive here !!!!!\n")); - } - */ + { + iRemainingDataSize -= iCurrentCommitChunk.Length(); } else - {//This is the last chunk, we synchronous commit it + { iRemainingDataSize = 0; - ToggleRdWrBuffer(); - return NULL; + } + //wait until previous write complete + if(iBuffer1AvailForWrite) + { + iFileWriter2->WaitForWriteComplete(); + iFileRdWrError = (iFileWriter2->GetResult() != KErrNone); + } + else + { + iFileWriter1->WaitForWriteComplete(); + iFileRdWrError = (iFileWriter1->GetResult() != KErrNone); } - return this; + ToggleRdWrBuffer(); + if(iRemainingDataSize <= 0) //last chunk need wait the write complete + { + iFileWriter1->WaitForWriteComplete(); + iFileWriter2->WaitForWriteComplete(); + if(iFileWriter1->GetResult() != KErrNone || iFileWriter2->GetResult() != KErrNone) + { + iFile.SetSize(0); + iFileRdWrError = ETrue; + } + } + + return NULL; } //for partial @@ -590,17 +649,20 @@ } else { - err = iFile.Write(iCurrentCommitChunk); - if (err != KErrNone) - {// file Write failed, this means we cannot successfully received this file but however, we cannot disrupt a current DIOR phase according to MTP spec. - // We should continue to receive the data and discard this data, only after the data phase is finished can we send back an error response - //to Initiator. Therefore, we pretend to continue to write this data into file, and let final processor to check the file size and then give back a - //corresponding error code to MTP initiator. - iFileRdWrError = ETrue; - iFile.SetSize(0); + if(iBuffer1AvailForWrite) + { + iFileWriter1->Write(iCurrentCommitChunk.Length()); + } + else + { + iFileWriter2->Write(iCurrentCommitChunk.Length()); } } } + else + { + iFile.SetSize(0); + } iCurrentCommitChunk.Zero(); } else diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/inc/cmtpconnection.h --- a/mtpfws/mtpfw/inc/cmtpconnection.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/inc/cmtpconnection.h Sun Mar 14 13:12:01 2010 +0000 @@ -90,7 +90,7 @@ IMPORT_C void SessionClosedL(TUint32 aSessionMTPId); IMPORT_C void SessionOpenedL(TUint32 aSessionMTPId); IMPORT_C TInt GetDataReceiveResult() const; - void ConnectionSuspended(); + TBool ConnectionSuspended(); void ConnectionResumedL(MMTPTransportConnection& aTransportConnection); void TransactionCompleteL(const TMTPTypeRequest& aRequest); @@ -116,7 +116,7 @@ void SendDataCompleteL(TInt aErr, const MMTPType& aData, const TMTPTypeRequest& aRequest); void SendEventCompleteL(TInt aErr, const TMTPTypeEvent& aEvent); void SendResponseCompleteL(TInt aErr, const TMTPTypeResponse& aResponse, const TMTPTypeRequest& aRequest); - void Unbind(MMTPTransportConnection& aConnection); + void Unbind(MMTPTransportConnection& aConnection); private: @@ -132,6 +132,7 @@ TUint ActiveSessions() const; void CloseAllSessions(); void CloseSession(TUint aIdx); + void CompleteCloseConnection(); CMTPSession& SessionL(const TMTPTypeFlatBase& aDataset, TInt aSessionIdElementNo) const; static TInt SessionOrder(const TUint32* aL, const CMTPSession& aR); diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/inc/cmtpconnectionmgr.h --- a/mtpfws/mtpfw/inc/cmtpconnectionmgr.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/inc/cmtpconnectionmgr.h Sun Mar 14 13:12:01 2010 +0000 @@ -54,6 +54,7 @@ IMPORT_C CMTPConnection& ConnectionL(TUint aConnectionId) const; TUint ConnectionCount() const; CMTPConnection& operator[](TInt aIndex) const; + void ConnectionCloseComplete(const TUint& aConnUid); IMPORT_C void StartTransportL(TUid aTransport); IMPORT_C void StartTransportL(TUid aTransport, const TAny* aParameter); IMPORT_C void QueueTransportL( TUid aTransport, const TAny* aParameter ); @@ -63,13 +64,11 @@ IMPORT_C void StopTransports(); IMPORT_C TInt TransportCount() const; IMPORT_C TUid TransportUid(); - - + private: // From MMTPConnectionMgr - void ConnectionClosed(MMTPTransportConnection& aTransportConnection); + TBool ConnectionClosed(MMTPTransportConnection& aTransportConnection); void ConnectionOpenedL(MMTPTransportConnection& aTransportConnection); - TBool DeleteConnection(TUint aConnectionId); TUid ClientSId(); private: @@ -92,6 +91,7 @@ TUid iTransportUid; TUint iTransportCount; TUid iSecureId; + TBool iIsTransportStopping; /** * Array storing the UIDs of the suspended transport plugins diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/inc/cmtpdataprovidercontroller.h --- a/mtpfws/mtpfw/inc/cmtpdataprovidercontroller.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/inc/cmtpdataprovidercontroller.h Sun Mar 14 13:12:01 2010 +0000 @@ -62,7 +62,9 @@ EEnumeratingDataProviderStorages = 3, EEnumeratingFrameworkObjects = 4, EEnumeratingDataProviderObjects = 5, - EEnumerated = 6, + EEnumeratingPhaseOneDone = 6, + EEnumeratingSubDirFiles = 7, //Only File DP care the status. + EEnumeratedFulllyCompleted = 8, }; public: @@ -90,6 +92,9 @@ IMPORT_C void WaitForEnumerationComplete(); TBool FreeEnumerationWaiter(); + + IMPORT_C void SetNeedEnumeratingPhase2(TBool aNeed); + IMPORT_C TBool NeedEnumeratingPhase2() const; private: // From CActive void DoCancel(); @@ -115,7 +120,7 @@ static void ImplementationsCleanup(TAny* aData); static TInt ImplementationsLinearOrderUid(const TUid* aUid, const CImplementationInformation& aObject); static TInt ImplementationsLinearOrderUid(const CImplementationInformation& aL, const CImplementationInformation& aR); - + private: // Owned /** FLOGGER debug trace member variable. @@ -208,11 +213,12 @@ opensession waiter */ CActiveSchedulerWait *iOpenSessionWaiter; - - /** - Flag for Create DBSnapshot - */ - TUint8 iFlagDb; + + /* + The number of folders and files that will be enumerated. + */ + TBool iNeedEnumeratingPhase2; + TUint32 iNeedEnumeratingPhase2StorageId; }; diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/src/cmtpconnection.cpp --- a/mtpfws/mtpfw/src/cmtpconnection.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/src/cmtpconnection.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -108,14 +108,6 @@ } /** -Unbinds the Transport Connection -*/ -void CMTPConnection::Unbind(MMTPTransportConnection& /*aConnection*/) - { - iTransportConnection = NULL; - } - -/** Initiates MTP transaction data phase processing for initiator-to-responder data flows. This method should only be invoked when the MTP transaction phase state is ERequestPhase. This is an asynchronous method. @@ -351,45 +343,43 @@ * Signals the connection is suspended, the connection state is set to EStateShutdown which * means that all the current transaction will not be able to send/receive any data via the * connection + * @return ETrue - there is an active transaction currently, and Connection will suspend when it finishes + * EFalse - No active transaction, connection suspends immediately. */ -void CMTPConnection::ConnectionSuspended() +TBool CMTPConnection::ConnectionSuspended() { __FLOG(_L8("ConnectionSuspended - Entry")); + TBool ret = EFalse; TUint currentState = State(); - if (currentState!=EStateShutdown && currentState!=EStateErrorShutdown) + if (currentState != EStateShutdown) { - SetState(EStateShutdown); - - if (iTransportConnection != NULL) - { - iTransportConnection->Unbind(*this); - iTransportConnection = NULL; - } - PublishConnState(EDisconnectedFromHost); - - if (ActiveSessions() == 0) + if (ActiveSessions() == 0 || currentState == EStateErrorShutdown) { - CloseAllSessions(); - iSessions.Reset(); - iSingletons.Close(); + CompleteCloseConnection(); + ret = ETrue; } - else - { - //some session may be in data or response phase, complete them and set transaction phase to ECompletingPhase. - const TUint count(iSessions.Count()); - for (TUint i(0); (i < count); i++) - { - if (iSessions[i]->TransactionPhase() & (EDataIToRPhase|EDataRToIPhase|EResponsePhase)) - { - iSessions[i]->SetTransactionPhase(ECompletingPhase); - iSessions[i]->CompletePendingRequest(KErrCancel); - } - } - } + + SetState(EStateShutdown); + PublishConnState(EDisconnectedFromHost); } __FLOG(_L8("ConnectionSuspended - Exit")); + return ret; + } + +void CMTPConnection::CompleteCloseConnection() + { + __FLOG(_L8("CompleteCloseConnection - Entry")); + + CloseAllSessions(); + iSessions.Reset(); + + //notify ConnectionMgr and corresponding transports of completion of connection close + iSingletons.ConnectionMgr().ConnectionCloseComplete(iConnectionId); + iSingletons.Close(); + + __FLOG(_L8("CompleteCloseConnection - Exit")); } /* @@ -439,24 +429,18 @@ if (ValidFrameworkRequest(&session, KValidPhases, NULL)) { session.SetTransactionPhase(EIdlePhase); - if (State() == EStateShutdown) - { - if (ActiveSessions() == 0) - { - CloseAllSessions(); - iSessions.Reset(); - iSingletons.Close(); - - // Move the log here because ShutdownComplete will delete this object. - __FLOG(_L8("TransactionCompleteL - Exit")); - } + + if (State() == EStateShutdown && ActiveSessions() == 0) + { + CompleteCloseConnection(); } - else + + if (iTransportConnection != NULL) { iTransportConnection->TransactionCompleteL(aRequest); - __FLOG(_L8("TransactionCompleteL - Exit")); } } + __FLOG(_L8("TransactionCompleteL - Exit")); } TUint CMTPConnection::ConnectionId() const @@ -700,6 +684,11 @@ __FLOG(_L8("SendResponseCompleteL - Exit")); } +void CMTPConnection::Unbind(MMTPTransportConnection& /*aConnection*/) + { + iTransportConnection = NULL; + } + TMTPTransactionPhase CMTPConnection::TransactionPhaseL(TUint32 aMTPId) const { diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/src/cmtpconnectionmgr.cpp --- a/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -93,6 +93,15 @@ return iTransportUid; } +void CMTPConnectionMgr::ConnectionCloseComplete(const TUint& /*aConnUid*/) + { + if (iIsTransportStopping) + { + iIsTransportStopping = EFalse; + ResumeSuspendedTransport(); + } + } + EXPORT_C void CMTPConnectionMgr::StartTransportL(TUid aTransport) { StartTransportL( aTransport, NULL ); @@ -187,14 +196,14 @@ { TRAP_IGNORE( SuspendTransportL( aTransport ) ); } + iIsTransportStopping = ETrue; iTransport->Stop(*this); delete iTransport; iTransport = NULL; iTransportUid = KNullUid; iTransportCount--; - - } + if ( aByBearer ) { UnsuspendTransport( aTransport ); @@ -227,7 +236,7 @@ return iTransportCount; } -void CMTPConnectionMgr::ConnectionClosed(MMTPTransportConnection& aTransportConnection) +TBool CMTPConnectionMgr::ConnectionClosed(MMTPTransportConnection& aTransportConnection) { __FLOG(_L8("ConnectionClosed - Entry")); @@ -236,11 +245,9 @@ __ASSERT_DEBUG((idx != KErrNotFound), User::Invariant()); CMTPConnection* connection(iConnections[idx]); - connection->ConnectionSuspended(); - - ResumeSuspendedTransport(); __FLOG(_L8("ConnectionClosed - Exit")); + return connection->ConnectionSuspended(); } void CMTPConnectionMgr::ConnectionOpenedL(MMTPTransportConnection& aTransportConnection) @@ -267,26 +274,6 @@ __FLOG(_L8("ConnectionOpenedL - Exit")); } -TBool CMTPConnectionMgr::DeleteConnection(TUint aConnectionId) - { - __FLOG(_L8("DeleteConnection - Entry")); - - TBool ret = EFalse; - TInt idx = ConnectionFind(aConnectionId); - - if (idx != KErrNotFound) - { - CMTPConnection* connection(iConnections[idx]); - iConnections.Remove(idx); - delete connection; - ret = ETrue; - } - - __FLOG(_L8("DeleteConnection - Entry")); - - return ret; - } - EXPORT_C TUid CMTPConnectionMgr::ClientSId() { return iSecureId; @@ -297,7 +284,8 @@ CMTPConnectionMgr::CMTPConnectionMgr() : iConnectionOrder(ConnectionOrderCompare), iShutdownConnectionIdx(KErrNotFound), - iTransportUid(KNullUid) + iTransportUid(KNullUid), + iIsTransportStopping(EFalse) { __FLOG_OPEN(KMTPSubsystem, KComponent); } diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/src/cmtpdataprovider.cpp --- a/mtpfws/mtpfw/src/cmtpdataprovider.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/src/cmtpdataprovider.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -558,7 +558,7 @@ } } - else if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated) + else if (iSingletons.DpController().EnumerateState() < CMTPDataProviderController::EEnumeratingPhaseOneDone) { __FLOG(_L8("DP Enumeration is not complete")); diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/src/cmtpdataprovidercontroller.cpp --- a/mtpfws/mtpfw/src/cmtpdataprovidercontroller.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/src/cmtpdataprovidercontroller.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -236,7 +236,7 @@ iEnumeratingStorages.AppendL(params->iStorageId); // Only schedule the operation start if there is not one currently underway. - if (iEnumerationState == EEnumerated) + if (iEnumerationState == EEnumeratedFulllyCompleted) { iNextDpId = iDpIdDeviceDp; iEnumerationState = EEnumeratingFrameworkObjects; @@ -385,7 +385,7 @@ */ EXPORT_C void CMTPDataProviderController::WaitForEnumerationComplete() { - if(EnumerateState() != CMTPDataProviderController::EEnumerated) + if(EnumerateState() < CMTPDataProviderController::EEnumeratingPhaseOneDone) { iOpenSessionWaiter->Start(); } @@ -406,6 +406,7 @@ void CMTPDataProviderController::EnumerationStateChangedL(const CMTPDataProvider& aDp) { __FLOG(_L8("EnumerationStateChangedL - Entry")); + __FLOG_VA((_L8("Entry iEnumerationState: 0x%x iNextDpId: %d"), iEnumerationState, iNextDpId)); switch (iEnumerationState) { case EEnumeratingFrameworkStorages: @@ -463,27 +464,42 @@ break; case KMTPImplementationUidFileDp: - iSingletons.ObjectMgr().RemoveNonPersistentObjectsL(aDp.DataProviderId()); - // No other data providers - iNextDpId = 0; - iEnumeratingStorages.Remove(0); - if (iEnumeratingStorages.Count() == 0) - { - // No queued enumerations. - iSingletons.ObjectMgr().ObjectStore().CleanDBSnapshotL(); - iEnumerationState = EEnumerated; - Cancel(); - if(iOpenSessionWaiter->IsStarted()) - { - iOpenSessionWaiter->AsyncStop(); - } - } - else - { - // Queued enumerations. - iNextDpId = iDpIdDeviceDp; - Schedule(); - } + // No other data providers + if(NeedEnumeratingPhase2()) + { + iEnumerationState = EEnumeratingSubDirFiles; + if(iOpenSessionWaiter->IsStarted()) + { + iOpenSessionWaiter->AsyncStop(); + } + //Schedule FildDP to enumerate the files in sub-dir + iNextDpId = iDpIdFileDp; + Schedule(); + } + else + { + iNextDpId = 0; + iEnumeratingStorages.Remove(0); + if (iEnumeratingStorages.Count() == 0) + { + iSingletons.ObjectMgr().RemoveNonPersistentObjectsL(aDp.DataProviderId()); + iEnumerationState = EEnumeratedFulllyCompleted; + iSingletons.ObjectMgr().ObjectStore().CleanDBSnapshotL(); + + Cancel(); + if(iOpenSessionWaiter->IsStarted()) + { + iOpenSessionWaiter->AsyncStop(); + } + } + else + { + // Queued enumerations. + iNextDpId = iDpIdDeviceDp; + Schedule(); + } + } + } break; @@ -496,9 +512,23 @@ if ((iEnumeratingDps.Count() == 0) && iDpIdArrayIndex >= iDataProviderIds.Count()) { // Enumeration complete. - iNextDpId = 0; iNextDpId = iDpIdFileDp; iEnumerationState = EEnumeratingFrameworkObjects; + + if ( ( iEnumeratingStorages.Count() > 1 ) &&(KErrNotFound != iEnumeratingStorages.Find(KMTPStorageAll)) ) + { + const TUint storageid = iEnumeratingStorages[0]; + iEnumeratingStorages.Remove(0); + if(KMTPStorageAll == storageid) + { + iEnumeratingStorages.Append(KMTPStorageAll); + } + + if(iEnumeratingStorages[0] != KMTPStorageAll) + { + iNextDpId = iDpIdDeviceDp; + } + } } else { @@ -511,13 +541,39 @@ Schedule(); break; + case EEnumeratingSubDirFiles: + { + if(aDp.ImplementationUid().iUid == KMTPImplementationUidFileDp) + { + iSingletons.ObjectMgr().RemoveNonPersistentObjectsL(aDp.DataProviderId()); + iNextDpId = 0; + iEnumeratingStorages.Remove(0); + if(iEnumeratingStorages.Count() == 0) + { + iSingletons.DpController().SetNeedEnumeratingPhase2(EFalse); + iEnumerationState = EEnumeratedFulllyCompleted; + iSingletons.ObjectMgr().ObjectStore().CleanDBSnapshotL(); + } + else //removable card plug in + { + iNextDpId = iDpIdDeviceDp; + iEnumerationState = EEnumeratingFrameworkObjects; + Schedule(); + } + } + } + break; + + case EEnumeratedFulllyCompleted: case EUnenumerated: case EEnumerationStarting: - case EEnumerated: + case EEnumeratingPhaseOneDone: default: __DEBUG_ONLY(User::Invariant()); break; } + + __FLOG_VA((_L8("Exit iEnumerationState: 0x%x, iNextDpId: %d, UID=0x%x"), iEnumerationState, iNextDpId, aDp.ImplementationUid().iUid)); __FLOG(_L8("EnumerationStateChangedL - Exit")); } @@ -556,8 +612,6 @@ iNextDpId = iDpIdDeviceDp; iEnumerationState = EEnumeratingFrameworkObjects; - - Schedule(); } break; @@ -573,7 +627,7 @@ iEnumeratingStorages.Remove(0); if (iEnumeratingStorages.Count() == 0) { - iEnumerationState = EEnumerated; + iEnumerationState = EEnumeratedFulllyCompleted; } else { @@ -591,21 +645,22 @@ { iSingletons.ObjectMgr().ObjectStore().EstablishDBSnapshotL(storageId); } - else + else { - const CMTPStorageMetaData& storage(iSingletons.StorageMgr().StorageL(storageId)); - if(storage.Uint(CMTPStorageMetaData::EStorageSystemType) == CMTPStorageMetaData::ESystemTypeDefaultFileSystem) - { - const RArray& logicalIds(storage.UintArray(CMTPStorageMetaData::EStorageLogicalIds)); - const TUint KCountLogicalIds(logicalIds.Count()); - for (TUint i(0); (i < KCountLogicalIds); i++) - { - __FLOG_VA((_L8("Establish snapshot for storage: 0x%x"), storageId)); - iSingletons.ObjectMgr().ObjectStore().EstablishDBSnapshotL(storageId); - } - } + const CMTPStorageMetaData& storage(iSingletons.StorageMgr().StorageL(storageId)); + if(storage.Uint(CMTPStorageMetaData::EStorageSystemType) == CMTPStorageMetaData::ESystemTypeDefaultFileSystem) + { + const RArray& logicalIds(storage.UintArray(CMTPStorageMetaData::EStorageLogicalIds)); + const TUint KCountLogicalIds(logicalIds.Count()); + for (TUint i(0); (i < KCountLogicalIds); i++) + { + __FLOG_VA((_L8("Establish snapshot for storage: 0x%x"), logicalIds[i])); + iSingletons.ObjectMgr().ObjectStore().EstablishDBSnapshotL(logicalIds[i]); + } + } } } + EnumerateDataProviderObjectsL(iNextDpId); } } @@ -624,11 +679,19 @@ iEnumeratingDps.InsertInOrderL(currentDp); EnumerateDataProviderObjectsL(currentDp); } + + __FLOG_VA((_L8("iDpIdArrayIndex = %d, KLoadedDps = %d"), iDpIdArrayIndex, KLoadedDps)); } break; + case EEnumeratingSubDirFiles: + { + EnumerateDataProviderObjectsL(iNextDpId); + } + break; + case EEnumeratedFulllyCompleted: case EUnenumerated: - case EEnumerated: + case EEnumeratingPhaseOneDone: default: __DEBUG_ONLY(User::Invariant()); break; @@ -666,7 +729,7 @@ break; case EUnenumerated: - case EEnumerated: + case EEnumeratingPhaseOneDone: default: User::Invariant(); break; @@ -709,7 +772,7 @@ iMode = (TMTPOperationalMode)tMTPMode; CreateRegistrySessionAndEntryL(); - iFlagDb = 0; + SetNeedEnumeratingPhase2(EFalse); iOpenSessionWaiter = new(ELeave) CActiveSchedulerWait(); __FLOG(_L8("ConstructL - Exit")); @@ -1148,3 +1211,18 @@ iSisSession.Close(); } +EXPORT_C void CMTPDataProviderController::SetNeedEnumeratingPhase2(TBool aNeed) + { + __FLOG(_L8("SetNeedEnumeratingPhase2 - Entry")); + __FLOG_VA((_L8("Need = %d"), aNeed)); + + iNeedEnumeratingPhase2 = aNeed; + + __FLOG(_L8("SetNeedEnumeratingPhase2 - Exit")); + } + +EXPORT_C TBool CMTPDataProviderController::NeedEnumeratingPhase2() const + { + return iNeedEnumeratingPhase2; + } + diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/src/cmtpobjectstore.cpp --- a/mtpfws/mtpfw/src/cmtpobjectstore.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/src/cmtpobjectstore.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -385,6 +385,7 @@ TBool needToInsert = EFalse; TBool needUpdateOwner = EFalse; TUint dpId(aObject.Uint(CMTPObjectMetaData::EDataProviderId)); + TFileName suid; suid.CopyLC(aObject.DesC(CMTPObjectMetaData::ESuid)); TUint32 suidHash = DefaultHash::Des16(suid); @@ -392,7 +393,7 @@ TUint32 handle = KMTPHandleNone, handleInDB = KMTPHandleAll; TInt64 id = 0; // Check if the dp is enumerating - if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated && iCacheExist) + if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted && iCacheExist) { //it is in the object enumeration phase. // if it's see if we have an object with the same SUID @@ -438,7 +439,8 @@ } else { - User::Leave(KErrAlreadyExists); + //while enumerating, we ignore the repeatedly INSERT operations. + //User::Leave(KErrAlreadyExists); } } } @@ -686,7 +688,7 @@ { if (LocateByHandleL(aHandle.Value())) { - if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated && + if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted && IsMediaFormat(iBatched.ColUint16(EObjectStoreFormatCode))) { iMtpDeltaDataMgr->UpdateDeltaDataTableL(iBatched.ColInt64(EObjectStorePOUID), CMtpDeltaDataMgr::EDeleted); @@ -702,7 +704,7 @@ { if(LocateBySuidL(aSuid)) { - if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumerated && + if (iSingletons.DpController().EnumerateState() != CMTPDataProviderController::EEnumeratedFulllyCompleted && IsMediaFormat(iBatched_SuidHashID.ColUint16(EObjectStoreFormatCode))) { iMtpDeltaDataMgr->UpdateDeltaDataTableL(iBatched_SuidHashID.ColInt64(EObjectStorePOUID), CMtpDeltaDataMgr::EDeleted); diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpfw/transports/transportapi/inc/mmtpconnectionmgr.h --- a/mtpfws/mtpfw/transports/transportapi/inc/mmtpconnectionmgr.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtpfws/mtpfw/transports/transportapi/inc/mmtpconnectionmgr.h Sun Mar 14 13:12:01 2010 +0000 @@ -39,8 +39,13 @@ Signals that an MTP transport layer connection has become unavailable. @param aTransportConnection Interface handle of the MTP transport layer connection instance. + @return ETrue means MTP framework successfully cleanup ts env and can accept + another ConnectionOpendedL call. EFalse means there is a transaction alive currently, + ConnectionOpenedL must not be called until MMTPTransportConnection::TransactionCompleteL is called. + @see MMTPConnectionMgr::ConnectionOpenedL() + @see MMTPTransportConnection::TransactionCompleteL() */ - virtual void ConnectionClosed(MMTPTransportConnection& aTransportConnection) = 0; + virtual TBool ConnectionClosed(MMTPTransportConnection& aTransportConnection) = 0; /** Signals that an MTP transport layer connection has become available. @@ -56,4 +61,4 @@ virtual TUid ClientSId()=0; }; -#endif // MMTPCONNECTIONMGR_H \ No newline at end of file +#endif // MMTPCONNECTIONMGR_H diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/CMAppGroupView.H --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/CMAppGroupView.H Sun Mar 14 13:12:01 2010 +0000 @@ -0,0 +1,48 @@ +// Copyright (c) 1997-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: +// + +/** + @file + @internalComponent + @test +*/ +#if !defined(__CMAPPGroupVIEW_H__) +#define __CMAPPGroupVIEW_H__ + +#include "CMLSTVW.H" + + +class CContactsManAppGroupView : public CContactsManListView + { +public: + static CContactsManAppGroupView* NewL(CCoeControl& aContainer,CContactsAppModel& aModel); + TInt CurrentItemIndex(); + TInt NumberOfItems(); +private: + CContactsManAppGroupView(CContactsAppModel& aModel,TContactsListViewPrefs* aPreferences); + void NewGroupL(); +// from CContactsManViewBase + virtual void HandleModelChangeL(TBool aCountChanged); + virtual TBool HandleCommandL(TInt aCommand); + virtual TUid ViewUid() const; +//from MCoeView + virtual void ViewActivatedL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage); + virtual void ViewDeactivated(); +// from CCoeControl + virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType); + void ConstructL(CCoeControl& aContainer); + }; + +#endif // __CMAPPGroupVIEW_H__ diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/CtransportInitiator.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/CtransportInitiator.h Sun Mar 14 13:12:01 2010 +0000 @@ -0,0 +1,53 @@ +// This material, including documentation and any related computer +// programs, is protected by copyright controlled by Nokia. All +// rights are reserved. Copying, including reproducing, storing +// adapting or translating, any or all of this material requires the +// prior written consent of Nokia. This material also contains +// confidential information which may not be disclosed to others +// without the prior written consent of Nokia. + + + +/** + @file CtransportInitiator.h +*/ + #ifndef __CTRANSPORTINITIATOR_H__ + #define __CTRANSPORTINITIATOR_H__ + #include + #include + #include + #include + + + _LIT(KCMTPTest, "c:\\mtptest\\"); +_LIT(KZMTPTest, "z:\\mtptest\\"); +/** + class CtransportInitiator + Descibes creation of subset drives + Running and stopping the transport as wished by the user +*/ + class CtransportInitiator: public CBase + { + public : + static CtransportInitiator* NewL(); + ~CtransportInitiator(); + + private: + void ConstructL(); + CtransportInitiator(); + + public : + void SetModeL(TMTPOperationalMode aMode); + void RunMtpL(); + TInt DeleteMTPTestStorages(); + TInt CreateMTPTestStoragesL(); + }; + +#endif + + + + + + + diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/MtpModeSelector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/MtpModeSelector.h Sun Mar 14 13:12:01 2010 +0000 @@ -0,0 +1,122 @@ +// This material, including documentation and any related computer +// programs, is protected by copyright controlled by Nokia. All +// rights are reserved. Copying, including reproducing, storing +// adapting or translating, any or all of this material requires the +// prior written consent of Nokia. This material also contains +// confidential information which may not be disclosed to others +// without the prior written consent of Nokia. + + + +/** + @file + @internalComponent + @test +*/ +#ifndef __MTPMODESELECTOR_H__ +#define __MTPMODESELECTOR_H__ + +#include +#include +#include "CtransportInitiator.h" + + +class CMtpModeSelectorDlg : public CEikDialog + { +public: + static CMtpModeSelectorDlg* NewL(); + CMtpModeSelectorDlg(); + +private: + void ConstructL(); + ~CMtpModeSelectorDlg(); + // from CEikDialog + TBool OkToExitL(TInt aButtonId); + void PreLayoutDynInitL(); +public : + CtransportInitiator* iTransportInitiator; + + }; + + + +/** + * CModeSelectorAppView for creating a window and to draw the text + * + */ +class CModeSelectorAppView : public CCoeControl + { +public: + // creates a CModeSelectorAppView object + static CModeSelectorAppView* NewL(const TRect& aRect); + ~CModeSelectorAppView(); +private: + CModeSelectorAppView(); + void ConstructL(const TRect& aRect); + //Draws the text on the screen + void Draw(const TRect& /*aRect*/) const; + +private: + //contains the text needs to be drawn + HBufC* iExampleText; + }; + + +/** + * CModeSelectorAppUi handles the system events and menu events + * + */ +class CModeSelectorAppUi : public CEikAppUi + { +public: + void ConstructL(); + ~CModeSelectorAppUi(); + +private: + // Inherirted from class CEikAppUi for handling menu events + void HandleCommandL(TInt aCommand); + + // From CCoeAppUi to handle system events + void HandleSystemEventL(const TWsEvent& aEvent); + +private: + CCoeControl* iAppView; + }; + + +/** + * CExampleDocument for creating the application UI + * + */ +class CModeSelectorDocument : public CEikDocument + { +public: + // creates a CExampleDocument object + static CModeSelectorDocument* NewL(CEikApplication& aApp); + CModeSelectorDocument(CEikApplication& aApp); + void ConstructL(); +private: + // Inherited from CEikDocument for creating the AppUI + CEikAppUi* CreateAppUiL(); + }; + + + +/** + * CExampleApplication creates a new instance of the document + * associated with this application + * + */ +class CModeSelectorApplication : public CEikApplication + { +private: + // Inherited from class CApaApplication to create a new instance of the document + CApaDocument* CreateDocumentL(); + //gets teh Application's UID + TUid AppDllUid() const; + }; + +#endif + + + diff -r bb577720afcd -r 5851d9e42c5b mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/mtpstarter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpfws/mtpintegrationtest/integration/mtpmodeselector/inc/mtpstarter.h Sun Mar 14 13:12:01 2010 +0000 @@ -0,0 +1,18 @@ +// This material, including documentation and any related computer +// programs, is protected by copyright controlled by Nokia. All +// rights are reserved. Copying, including reproducing, storing +// adapting or translating, any or all of this material requires the +// prior written consent of Nokia. This material also contains +// confidential information which may not be disclosed to others +// without the prior written consent of Nokia. + + + +#ifndef __MTPSTARTER_H__ +#define __MTPSTARTER_H__ + + +TInt StartMTP(); +TInt StopMTP(); + +#endif // MTPSTARTER_H diff -r bb577720afcd -r 5851d9e42c5b mtptransports/mtpptpiptransport/ptpipplugin/src/cptpipconnection.cpp --- a/mtptransports/mtpptpiptransport/ptpipplugin/src/cptpipconnection.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtptransports/mtpptpiptransport/ptpipplugin/src/cptpipconnection.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -68,6 +68,11 @@ delete iPTPIPCommandContainer; delete iPTPIPDataContainer; delete iPTPIPEventContainer; + + if (iProtocolLayer != NULL) + { + iProtocolLayer->Unbind(*this); + } iNullBuffer.Close(); diff -r bb577720afcd -r 5851d9e42c5b mtptransports/mtpusbtransport/usbsic_imp/inc/cmtpusbconnection.h --- a/mtptransports/mtpusbtransport/usbsic_imp/inc/cmtpusbconnection.h Mon Mar 08 21:44:10 2010 +0000 +++ b/mtptransports/mtpusbtransport/usbsic_imp/inc/cmtpusbconnection.h Sun Mar 14 13:12:01 2010 +0000 @@ -150,7 +150,7 @@ void ResumeConnectionL(); void StartConnectionL(); - void StopConnection(); + TBool StopConnection(); void SuspendConnectionL(); void StartUsbL(); @@ -418,6 +418,12 @@ TBool iIsCancelReceived; /** + A flag to reflect if a Host initiated cancel transaction + is triggered. + */ + TBool iIsResetRequestSignaled; + + /** FLOGGER debug trace member variable. */ __FLOG_DECLARATION_MEMBER_MUTABLE; diff -r bb577720afcd -r 5851d9e42c5b mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp --- a/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp Mon Mar 08 21:44:10 2010 +0000 +++ b/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp Sun Mar 14 13:12:01 2010 +0000 @@ -78,7 +78,7 @@ CMTPUsbConnection::~CMTPUsbConnection() { __FLOG(_L8("~CMTPUsbConnection - Entry")); - + // Terminate all endpoint data transfer activity. StopConnection(); @@ -91,11 +91,13 @@ StopUsb(); iNullBuffer.Close(); - if (iProtocolLayer) - { - iProtocolLayer->Unbind(*this); - } + if (iProtocolLayer != NULL) + { + BoundProtocolLayer().Unbind(*this); + } + iProtocolLayer = NULL; + __FLOG(_L8("~CMTPUsbConnection - Exit")); __FLOG_CLOSE; } @@ -331,21 +333,27 @@ __FLOG(_L8("TransactionCompleteL - Entry")); __FLOG_VA((_L8("DeviceState: 0x%x TransactionState: 0x%x"), iDeviceStatusCode, iBulkTransactionState)); - - if (iBulkTransactionState != ERequestPhase) - { - // Update the transaction state. - SetBulkTransactionState(EIdlePhase); - - // Update the device status - SetDeviceStatus(EMTPUsbDeviceStatusOK); - - // Clear the cancel flag. - iIsCancelReceived = EFalse; - - // Initiate the next request phase bulk data receive sequence. - InitiateBulkRequestSequenceL(); - } + + if (iBulkTransactionState != ERequestPhase) + { + // Update the transaction state. + SetBulkTransactionState(EIdlePhase); + // Update the device status + SetDeviceStatus(EMTPUsbDeviceStatusOK); + // Clear the cancel flag. + iIsCancelReceived = EFalse; + + if (ConnectionOpen()) + { + // Initiate the next request phase bulk data receive sequence. + InitiateBulkRequestSequenceL(); + } + else if (iIsResetRequestSignaled) + { + iIsResetRequestSignaled = EFalse; + StartConnectionL(); + } + } __FLOG(_L8("TransactionCompleteL - Exit")); } @@ -587,8 +595,7 @@ { TUint16 containerType(iUsbBulkContainer->Uint16L(CMTPUsbContainer::EContainerType)); -#ifdef _DEBUG - +#ifdef _DEBUG TUint16 transactionID(iUsbBulkContainer->Uint32L(CMTPUsbContainer::ETransactionID)); RDebug::Print(_L("Time Stamp is :%d"), User::TickCount()); RDebug::Print(_L("the container Type is 0x%x, the transaction ID is 0x%x\n"), containerType,transactionID); @@ -906,6 +913,8 @@ CMTPUsbConnection::CMTPUsbConnection(MMTPConnectionMgr& aConnectionMgr) : CActive(EPriorityStandard), iEndpointInfo(KEndpointMetaData, EMTPUsbEpNumEndpoints), + iIsCancelReceived(EFalse), + iIsResetRequestSignaled(EFalse), iConnectionMgr(&aConnectionMgr) { CActiveScheduler::Add(this); @@ -1233,7 +1242,7 @@ void CMTPUsbConnection::ProcessControlRequestDeviceResetL(const TMTPUsbControlRequestSetup& /*aRequest*/) { __FLOG(_L8("ProcessControlRequestDeviceResetL - Entry")); - + // Clear stalled endpoints and re-open connection BulkEndpointsStallClearL(); StartConnectionL(); @@ -1243,9 +1252,18 @@ sequence and initiate the next control request sequence. */ static_cast(iEndpoints[EMTPUsbEpControl])->SendControlRequestStatus(); - StopConnection(); + TBool connIsStopped = StopConnection(); InitiateControlRequestSequenceL(); - StartConnectionL(); + + if (connIsStopped) + { + StartConnectionL(); + } + else + { + iIsResetRequestSignaled = ETrue; + } + __FLOG(_L8("ProcessControlRequestDeviceResetL - Exit")); } @@ -1261,8 +1279,7 @@ TUint offset = 0; for(TUint i(EMTPUsbEpControl); iConnectionOpenedL(*this); + iConnectionMgr->ConnectionOpenedL(*this); SetConnectionState(EOpen); + SetDeviceStatus(EMTPUsbDeviceStatusOK); InitiateBulkRequestSequenceL(); } __FLOG(_L8("StartConnectionL - Exit")); @@ -1661,10 +1664,11 @@ /** Halts USB MTP device class processing. */ -void CMTPUsbConnection::StopConnection() +TBool CMTPUsbConnection::StopConnection() { __FLOG(_L8("StopConnection - Entry")); + TBool ret = ETrue; // Stop all data transfer activity. DataEndpointsStop(); @@ -1672,13 +1676,16 @@ if (ConnectionOpen()) { __FLOG(_L8("Notifying protocol layer connection closed")); - iConnectionMgr->ConnectionClosed(*this); + ret = iConnectionMgr->ConnectionClosed(*this); SetBulkTransactionState(EUndefined); SetConnectionState(EIdle); SetSuspendState(ENotSuspended); + SetDeviceStatus(EMTPUsbDeviceStatusBusy); } __FLOG(_L8("StopConnection - Exit")); + + return ret; } /** @@ -1706,7 +1713,7 @@ */ void CMTPUsbConnection::StartUsbL() { - __FLOG(_L8("StartUsbL - Exit")); + __FLOG(_L8("StartUsbL - Entry")); // Open the USB device interface. User::LeaveIfError(iLdd.Open(KDefaultUsbClientController)); diff -r bb577720afcd -r 5851d9e42c5b obex/obexprotocol/obex/public/obexbase.h --- a/obex/obexprotocol/obex/public/obexbase.h Mon Mar 08 21:44:10 2010 +0000 +++ b/obex/obexprotocol/obex/public/obexbase.h Sun Mar 14 13:12:01 2010 +0000 @@ -164,10 +164,17 @@ IMPORT_C TBool IsConnected() const; IMPORT_C TBool IsStrictPeer() const; IMPORT_C const TObexConnectInfo& LocalInfo() const; - IMPORT_C TInt SetLocalWho(const TDesC8& aInfo); - IMPORT_C const TObexConnectInfo& RemoteInfo() const; - IMPORT_C void SuppressAuthenticationHeaderElements(TObexSuppressedAuthElements aSuppressedObexAuthElements); + IMPORT_C TInt SetLocalWho(const TDesC8& aInfo); + IMPORT_C const TObexConnectInfo& RemoteInfo() const; + IMPORT_C void SuppressAuthenticationHeaderElements(TObexSuppressedAuthElements aSuppressedObexAuthElements); +public: // Implementation of MObexNotify Interface (No longer used) + virtual void Process(CObexPacket& aPacket); + virtual void Error(TInt aError); + virtual void TransportUp(); + virtual void TransportDown(TBool aForceTransportDeletion); + +public: virtual void UserPasswordL( const TDesC& aPassword) = 0; IMPORT_C void RemoteAddr(TSockAddr& anAddr); @@ -181,12 +188,6 @@ void NotifyTransportUp(); void NotifyTransportDown(TBool); -public: // Implementation of MObexNotify Interface (No longer used) - virtual void Process(CObexPacket& aPacket); - virtual void Error(TInt aError) ; - virtual void TransportUp(); - virtual void TransportDown(TBool aForceTransportDeletion); - protected: CObex(); virtual void ConstructL(TObexTransportInfo& aObexTransportInfo);