--- a/backupandrestore/backupengine/group/connectivity_securebackupengine.iby Fri May 14 16:42:01 2010 +0300
+++ b/backupandrestore/backupengine/group/connectivity_securebackupengine.iby Thu May 27 13:42:43 2010 +0300
@@ -21,7 +21,7 @@
file=ABI_DIR\BUILD_DIR\abclient.dll System\libs\abclient.dll
#ifndef SBEHEAPMAX
-#define SBEHEAPMAX 0x400000
+#define SBEHEAPMAX 0x2000000
#endif
file=ABI_DIR\BUILD_DIR\sbengine.exe System\programs\sbengine.exe heapmax=SBEHEAPMAX
--- a/backupandrestore/backuptest/ABTester/group/abtester.iby Fri May 14 16:42:01 2010 +0300
+++ b/backupandrestore/backuptest/ABTester/group/abtester.iby Thu May 27 13:42:43 2010 +0300
@@ -21,13 +21,13 @@
file=ABI_DIR\BUILD_DIR\abtestclient3.EXE System\programs\abtestclient3.EXE
file=ABI_DIR\BUILD_DIR\abtestclient4.EXE System\programs\abtestclient4.EXE
-data=DATAZ_\private\0AB7E57C\backup_registration.xml private\0AB7E57C\backup_registration.xml
-data=DATAZ_\private\0AB7E57D\backup_registration.xml private\0AB7E57D\backup_registration.xml
-data=DATAZ_\private\0AB7E57E\backup_registration.xml private\0AB7E57E\backup_registration.xml
-data=DATAZ_\private\0AB7E58A\backup_registration.xml private\0AB7E58A\backup_registration.xml
-data=DATAZ_\private\0AB7E58B\backup_registration.xml private\0AB7E58B\backup_registration.xml
-data=DATAZ_\private\0AB7E58C\backup_registration.xml private\0AB7E58C\backup_registration.xml
+data=DATAZ_\private\0ab7e57c\backup_registration.xml private\0ab7e57c\backup_registration.xml
+data=DATAZ_\private\0ab7e57d\backup_registration.xml private\0ab7e57d\backup_registration.xml
+data=DATAZ_\private\0ab7e57e\backup_registration.xml private\0ab7e57e\backup_registration.xml
+data=DATAZ_\private\0ab7e58a\backup_registration.xml private\0ab7e58a\backup_registration.xml
+data=DATAZ_\private\0ab7e58b\backup_registration.xml private\0ab7e58b\backup_registration.xml
+data=DATAZ_\private\0ab7e58c\backup_registration.xml private\0ab7e58c\backup_registration.xml
-data=DATAZ_\private\0FA00001\backup_registration.xml private\0FA00001\backup_registration.xml
+data=DATAZ_\private\0fa00001\backup_registration.xml private\0fa00001\backup_registration.xml
#endif
--- a/backupandrestore/backuptest/ABTester/group/bld.inf Fri May 14 16:42:01 2010 +0300
+++ b/backupandrestore/backuptest/ABTester/group/bld.inf Thu May 27 13:42:43 2010 +0300
@@ -33,10 +33,10 @@
./abtester.oby /epoc32/rom/include/abtester.oby
./abtester.iby /epoc32/rom/include/abtester.iby
- ../data/incremental_active_backup_registration.xml z:/private/0AB7E57C/backup_registration.xml
- ../data/proxy_active_backup_registration.xml z:/private/0AB7E57D/backup_registration.xml
- ../data/base_active_backup_registration.xml z:/private/0AB7E57E/backup_registration.xml
- ../data/base_active_backup_registration2.xml z:/private/0AB7E58A/backup_registration.xml
- ../data/base_active_backup_registration3.xml z:/private/0AB7E58B/backup_registration.xml
- ../data/passive_backup_registration.xml z:/private/0AB7E58C/backup_registration.xml
- ../data/backup_public_files_registration.xml z:/private/0FA00001/backup_registration.xml
+ ../data/incremental_active_backup_registration.xml z:/private/0ab7e57c/backup_registration.xml
+ ../data/proxy_active_backup_registration.xml z:/private/0ab7e57d/backup_registration.xml
+ ../data/base_active_backup_registration.xml z:/private/0ab7e57e/backup_registration.xml
+ ../data/base_active_backup_registration2.xml z:/private/0ab7e58a/backup_registration.xml
+ ../data/base_active_backup_registration3.xml z:/private/0ab7e58b/backup_registration.xml
+ ../data/passive_backup_registration.xml z:/private/0ab7e58c/backup_registration.xml
+ ../data/backup_public_files_registration.xml z:/private/0fa00001/backup_registration.xml
--- a/mtpdataproviders/mtpimagedp/group/bld.inf Fri May 14 16:42:01 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/group/bld.inf Thu May 27 13:42:43 2010 +0300
@@ -30,9 +30,9 @@
PRJ_EXPORTS
// Note: these files are exported for testing and techview only. Not used in a device
-2001FCA2.txt /epoc32/data/z/private/10202be9/2001FCA2.txt
-2001FCA2.txt /epoc32/release/winscw/udeb/z/private/10202be9/2001FCA2.txt
-2001FCA2.txt /epoc32/release/winscw/urel/z/private/10202be9/2001FCA2.txt
+2001fca2.txt /epoc32/data/z/private/10202be9/2001fca2.txt
+2001fca2.txt /epoc32/release/winscw/udeb/z/private/10202be9/2001fca2.txt
+2001fca2.txt /epoc32/release/winscw/urel/z/private/10202be9/2001fca2.txt
../group/mtp_imagedp.iby /epoc32/rom/include/mtp_imagedp.iby
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpdeleteobject.cpp Fri May 14 16:42:01 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpdeleteobject.cpp Thu May 27 13:42:43 2010 +0300
@@ -238,7 +238,10 @@
//add Suid to deleteobjectlist
iDataProvider.AppendDeleteObjectsArrayL(iObjectMeta->DesC(CMTPObjectMetaData::ESuid));
//coverity[unterminated_case]
- case KErrNone:
+ case KErrPathNotFound:
+ //if the file does not exist on device, remove it from objectstore
+ //coverity[fallthrough]
+ case KErrNone:
//add for test
__FLOG(_L8("KErrNone"));
//if the image object is new, we should update new picture count
--- a/mtpdataproviders/mtpimagedp/src/cmtpimagedpobjectpropertymgr.cpp Fri May 14 16:42:01 2010 +0300
+++ b/mtpdataproviders/mtpimagedp/src/cmtpimagedpobjectpropertymgr.cpp Thu May 27 13:42:43 2010 +0300
@@ -403,16 +403,18 @@
aValue = KThumbFormatCode;
break;
case EMTPObjectPropCodeProtectionStatus:
- iFs.Entry(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), entry);
- if (entry.IsReadOnly())
+ {
+ TInt err = iFs.Entry(iObjectInfo->DesC(CMTPObjectMetaData::ESuid), entry);
+ if ( err == KErrNone && entry.IsReadOnly())
{
aValue = EMTPProtectionReadOnly;
}
else
{
aValue = EMTPProtectionNoProtection;
- }
- break;
+ }
+ }
+ break;
default:
aValue = 0;//initialization
//ingore the failure if we can't get properties form MdS
--- a/mtpfws/mtpfw/daemon/server/group/mtpserver.mmp Fri May 14 16:42:01 2010 +0300
+++ b/mtpfws/mtpfw/daemon/server/group/mtpserver.mmp Thu May 27 13:42:43 2010 +0300
@@ -29,6 +29,8 @@
EPOCHEAPSIZE 0x80000 0x800000 // 8MB
#endif
+EPOCSTACKSIZE 0x14000
+
MW_LAYER_SYSTEMINCLUDE_SYMBIAN
USERINCLUDE ../inc/
--- a/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpgetstorageinfo.h Fri May 14 16:42:01 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/devdp/inc/cmtpgetstorageinfo.h Thu May 27 13:42:43 2010 +0300
@@ -30,6 +30,15 @@
//forward declaration
class CMTPTypeStorageInfo;
+//Default drive name used when failed to read drive name from
+//System
+_LIT(KPhoneMemory,"Phone memory");
+_LIT(KMassMemory,"Mass memory");
+_LIT(KMemoryCard,"Memory card");
+_LIT(KNoName,"No name");
+//The last resort for drive name:DriveChar + drive, eg 'A drive'
+_LIT(KDefaultName," drive");
+
/**
Defines device data provider GetStorageInfo request processor
--- a/mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetstorageinfo.cpp Fri May 14 16:42:01 2010 +0300
+++ b/mtpfws/mtpfw/dataproviders/devdp/src/cmtpgetstorageinfo.cpp Thu May 27 13:42:43 2010 +0300
@@ -197,10 +197,22 @@
case EMediaFloppy:
if (iDriveInfo.iDriveAtt & KDriveAttRemovable)
{
- storageType = EMTPStorageRemovableRAM;
+ //E: is set as logically removable after eMMC image updated
+ //So here we need to deal with this case to set it as FixedRam
+ if(iDriveInfo.iDriveAtt & KDriveAttInternal)
+ {
+ __FLOG(_L8("removable but internal drive, set as Fixed RAM"));
+ storageType = EMTPStorageFixedRAM;
+ }
+ else
+ {
+ __FLOG(_L8("non internal,set as removable RAM"));
+ storageType = EMTPStorageRemovableRAM;
+ }
}
else
{
+ __FLOG(_L8("Non removable, set as Fixed RAM"));
storageType = EMTPStorageFixedRAM;
}
break;
@@ -309,30 +321,68 @@
__FLOG(_L8("SetStorageDescriptionL - Entry"));
TUint32 storage(Request().Uint32(TMTPTypeRequest::ERequestParameter1));
TInt driveNumber = iFramework.StorageMgr().DriveNumber(storage);
- RBuf volumeName;
- volumeName.CreateL(KMaxFileName);
- volumeName.CleanupClosePushL();
- RMTPDeviceDpSingletons devSingletons;
- devSingletons.OpenL(iFramework);
- CleanupClosePushL(devSingletons);
- TRAPD(resError, devSingletons.ConfigMgr().GetFriendlyVolumeNameL(driveNumber, volumeName));
- if ((KErrNone == resError) && (0 < volumeName.Length()))
- {
- __FLOG(_L8("Using volume name from resource file"));
- CMTPTypeString* mtpDescription = CMTPTypeString::NewLC(volumeName);
- iStorageInfo->SetL(CMTPTypeStorageInfo::EStorageDescription, *mtpDescription);
- CleanupStack::PopAndDestroy(mtpDescription);
- }
- else if (0 < iVolumeInfo.iName.Length())
- {
- __FLOG(_L8("Using standard volume name"));
- CMTPTypeString* mtpDescription = CMTPTypeString::NewLC(iVolumeInfo.iName);
- iStorageInfo->SetL(CMTPTypeStorageInfo::EStorageDescription, *mtpDescription);
- CleanupStack::PopAndDestroy(mtpDescription);
- }
-
- CleanupStack::PopAndDestroy(&devSingletons);
- CleanupStack::PopAndDestroy(&volumeName);
+ __FLOG_1(_L8("driveNumber:%d"),driveNumber);
+
+ CMTPTypeString* mtpDescription = CMTPTypeString::NewLC();
+
+ //Firstly, read name from VolumeInfo
+ if (0 < iVolumeInfo.iName.Length())
+ {
+ __FLOG_1(_L8("Using standard volume name:%S"),&iVolumeInfo.iName);
+ mtpDescription->SetL(iVolumeInfo.iName);
+ }
+ else //If name not set, set name according to type
+ {
+ TMTPTypeUint16 storageType(EMTPStorageUndefined);
+ iStorageInfo->GetL(CMTPTypeStorageInfo::EStorageType,storageType);
+ __FLOG_1(_L8("Set name according to storage type: %d"),storageType.Value());
+
+ switch (storageType.Value())
+ {
+ case EMTPStorageFixedROM:
+ if (driveNumber == EDriveC)//Phone Memory
+ {
+ __FLOG(_L8("drive c"));
+ mtpDescription->SetL(KPhoneMemory);
+ }
+ break;
+ case EMTPStorageRemovableROM:
+ break;
+ case EMTPStorageFixedRAM: // Mass Memory
+ mtpDescription->SetL(KMassMemory);
+ break;
+ case EMTPStorageRemovableRAM: // Memory Card
+ mtpDescription->SetL(KMemoryCard);
+ break;
+ case EMTPStorageUndefined:
+ default:
+ break;
+ }
+
+ //Finally, it the name still not set, use default value:
+ //eg, 'A drive'
+ if(mtpDescription->NumChars() == 0)
+ {
+ TChar driveChar;
+ TInt err = iFramework.Fs().DriveToChar(driveNumber,driveChar);
+ __FLOG_2(_L8("Use default name,driveNumber:%d err:%d"),driveNumber,err);
+ if (err == KErrNone)
+ {
+ TBuf<sizeof(KDefaultName) + 1> driveName;
+ driveName.Append(driveChar);
+ driveName.Append(KDefaultName);
+ mtpDescription->SetL(driveName);
+ }
+ else
+ {
+ mtpDescription->SetL(KNoName);
+ }
+ }
+ }
+
+ iStorageInfo->SetL(CMTPTypeStorageInfo::EStorageDescription,*mtpDescription);
+ CleanupStack::PopAndDestroy(mtpDescription);
+
__FLOG(_L8("SetStorageDescriptionL - Exit"));
}
--- a/mtpfws/mtpfw/inc/cmtpobjectstore.h Fri May 14 16:42:01 2010 +0300
+++ b/mtpfws/mtpfw/inc/cmtpobjectstore.h Thu May 27 13:42:43 2010 +0300
@@ -27,7 +27,7 @@
#include "mtpframeworkconst.h"
#include "rmtpframework.h"
#include "mtpdebug.h"
-
+#include "cmtpreferencemgr.h"
class CFileStore;
class CMTPHandleAllocator;
class CMTPObjectMetaData;
@@ -155,6 +155,8 @@
}
void DoL(RDbTable& aTable)
{
+ //no need to call GetL already all it in TraverseL
+ iStore.ReferenceMgr().RemoveReferencesL(aTable.ColUint32(EObjectStoreHandleId));
aTable.DeleteL();
iStore.IncTranOpsNumL();
}
@@ -200,6 +202,7 @@
void MarkNonPersistentObjectsL(TUint aDataProviderId, TUint32 aStorageId);
void EstablishDBSnapshotL(TUint32 aStorageId);
void CleanDBSnapshotL(TBool aOnlyRoot = EFalse);
+ void RemoveUndefinedObjectsL();
void ObjectsEnumComplete();
void MarkDPLoadedL(TUint aDataProviderId, TBool aFlag);
@@ -364,6 +367,7 @@
TInt iSnapshotCleanPos;
CSnapshotWorker* iSnapshotWorker;
mutable TFileName iSuidBuf;
+ TBool iCleanUndefined;
/**
FLOGGER debug trace member variable.
*/
--- a/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp Fri May 14 16:42:01 2010 +0300
+++ b/mtpfws/mtpfw/src/cmtpconnectionmgr.cpp Thu May 27 13:42:43 2010 +0300
@@ -40,8 +40,7 @@
CMTPConnectionMgr::~CMTPConnectionMgr()
{
StopTransport( iTransportUid, ETrue );
- iConnections.ResetAndDestroy();
- iSuspendedTransports.Reset();
+ iConnections.ResetAndDestroy();
iSuspendedTransports.Close();
delete iTransportTrigger;
__FLOG_CLOSE;
--- a/mtpfws/mtpfw/src/cmtpdataprovidercontroller.cpp Fri May 14 16:42:01 2010 +0300
+++ b/mtpfws/mtpfw/src/cmtpdataprovidercontroller.cpp Thu May 27 13:42:43 2010 +0300
@@ -372,7 +372,17 @@
*/
EXPORT_C TInt CMTPDataProviderController::DpId(TUint aUid)
{
- return iDataProviders.FindInOrder(TUid::Uid(aUid), CMTPDataProvider::LinearOrderUid);
+ TInt dpId = KErrNotFound;
+ for (TUint index=0; index < iDataProviders.Count(); index++)
+ {
+ if (iDataProviders[index]->ImplementationUid().iUid == aUid)
+ {
+ dpId = iDataProviders[index]->DataProviderId();
+ break;
+ }
+ }
+
+ return dpId;
}
/**
--- a/mtpfws/mtpfw/src/cmtpobjectstore.cpp Fri May 14 16:42:01 2010 +0300
+++ b/mtpfws/mtpfw/src/cmtpobjectstore.cpp Thu May 27 13:42:43 2010 +0300
@@ -25,7 +25,6 @@
#include <mtp/tmtptypeuint32.h>
#include "cmtphandleallocator.h"
#include "cmtpobjectstore.h"
-#include "cmtpreferencemgr.h"
#include "dbutility.h"
#include "cmtpdataprovidercontroller.h"
#include "cmtpdataprovider.h"
@@ -54,6 +53,8 @@
const TInt KMaxLimitCompactInEnumeration = 2048;
const TInt KMaxLimitCompactAfterEnumeration = 1024;
const TInt KSnapshotGranularity = 128;
+const TInt KMaxLimitSnapshotSize = 50000;
+
@@ -768,7 +769,7 @@
}
iCachedSuidHash = 0;
iCachedHandle = 0;
-
+ iReferenceMgr->RemoveReferencesL(aHandle.Value());
iBatched.DeleteL();
__FLOG(_L8("RemoveObjectL From iBacthed"));
IncTranOpsNumL();
@@ -787,6 +788,8 @@
}
iCachedSuidHash = 0;
iCachedHandle = 0;
+ //no need to call GetL already all it in LocateBySuidL
+ iReferenceMgr->RemoveReferencesL(iBatched_SuidHashID.ColUint32(EObjectStoreHandleId));
iBatched_SuidHashID.DeleteL();
IncTranOpsNumL();
}
@@ -837,6 +840,8 @@
void CMTPObjectStore::CleanL()
{
__FLOG(_L8("CleanL - Entry"));
+
+ RemoveUndefinedObjectsL();
Swi::RSisRegistrySession sisSession;
User::LeaveIfError(sisSession.Connect());
CleanupClosePushL(sisSession);
@@ -1375,6 +1380,39 @@
__FLOG(_L8("CleanDBSnapshotL Exit"));
}
+void CMTPObjectStore::RemoveUndefinedObjectsL()
+ {
+ __FLOG(_L8("CompactDBSnapshotL Entry"));
+
+ if (iCleanUndefined)
+ {
+ return;
+ }
+
+ TInt32 count = 0;
+ RDbTable temp;
+ CleanupClosePushL(temp);
+ User::LeaveIfError(temp.Open(iDatabase, KSQLHandleTableName, RDbRowSet::EUpdatable));
+ count = temp.CountL(RDbRowSet::EQuick);
+
+ __FLOG_VA((_L8("Count before deletion %d "), count));
+ CleanupStack::PopAndDestroy(&temp);
+
+ if (count > KMaxLimitSnapshotSize)
+ {
+ // Delete all object with undefined format
+ _LIT(KSQLDeleteObjectText, "DELETE FROM HandleStore WHERE FormatCode = %u");
+ iSqlStatement.Format(KSQLDeleteObjectText, EMTPFormatCodeUndefined);
+ User::LeaveIfError(iDatabase.Execute(iSqlStatement));
+ }
+
+ iCleanUndefined = ETrue;
+
+
+ __FLOG(_L8("CompactDBSnapshotL Exit"));
+ }
+
+
CMTPObjectStore::CEnumertingCacheItem::CEnumertingCacheItem(TUint32 aSuidHash, TUint32 aHandle, TUint32 aParent, TUint32 aFormat, TUint64 aId, TUint8 aDpID)
{
iObjSuiIdHash = aSuidHash;
--- a/mtptransports/mtpusbtransport/usbsic_imp/inc/cmtpusbepbase.h Fri May 14 16:42:01 2010 +0300
+++ b/mtptransports/mtpusbtransport/usbsic_imp/inc/cmtpusbepbase.h Thu May 27 13:42:43 2010 +0300
@@ -53,6 +53,8 @@
void CancelReceiveL(TInt aReason);
void CancelSendL(TInt aReason);
+ void FlushRxDataL();
+
protected:
CMTPUsbEpBase(TUint aId, TPriority aPriority, CMTPUsbConnection& aConnection);
@@ -92,7 +94,6 @@
TBool ValidateUSBHeaderL();
void InitiateFirstChunkReceiveL();
void ProcessFirstReceivedChunkL();
- void FlushRxDataL();
protected: // Owned
@@ -204,7 +205,6 @@
*/
TUint64 iDataLength;
-
private: // Not owned
/**
--- a/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp Fri May 14 16:42:01 2010 +0300
+++ b/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbconnection.cpp Thu May 27 13:42:43 2010 +0300
@@ -131,21 +131,30 @@
__FLOG(_L8("CloseConnection - Exit"));
}
-void CMTPUsbConnection::ReceiveDataL(MMTPType& aData, const TMTPTypeRequest& /*aRequest*/)
+void CMTPUsbConnection::ReceiveDataL(MMTPType& aData, const TMTPTypeRequest& aRequest)
{
__FLOG(_L8("ReceiveDataL - Entry"));
// Update the transaction state.
SetBulkTransactionState(EDataIToRPhase);
- // Setup the bulk container and initiate the bulk data receive sequence.
- iUsbBulkContainer->SetPayloadL(&aData);
-
- //Expected containerType pre-setup here in case we don't receive IToR dataphase at all so
- //Cancel operation can trigger right call inside ReceiveBulkDataCompleteL().
- iUsbBulkContainer->SetUint16L(CMTPUsbContainer::EContainerType, EMTPUsbContainerTypeDataBlock);
-
- static_cast<CMTPUsbEpBulkOut*>(iEndpoints[EMTPUsbEpBulkOut])->ReceiveBulkDataL(*iUsbBulkContainer);
+ if (iIsCancelReceived) //cancel received
+ {
+ __FLOG(_L8("Transaction has been cancelled, just flush trash data and complete"));
+ static_cast<CMTPUsbEpBulkOut*>(iEndpoints[EMTPUsbEpBulkOut])->FlushRxDataL();
+ BoundProtocolLayer().ReceiveDataCompleteL(KErrCancel, aData, iMTPRequest);
+ }
+ else
+ {
+ // Setup the bulk container and initiate the bulk data receive sequence.
+ iUsbBulkContainer->SetPayloadL(&aData);
+
+ //Expected containerType pre-setup here in case we don't receive IToR dataphase at all so
+ //Cancel operation can trigger right call inside ReceiveBulkDataCompleteL().
+ iUsbBulkContainer->SetUint16L(CMTPUsbContainer::EContainerType, EMTPUsbContainerTypeDataBlock);
+
+ static_cast<CMTPUsbEpBulkOut*>(iEndpoints[EMTPUsbEpBulkOut])->ReceiveBulkDataL(*iUsbBulkContainer);
+ }
__FLOG(_L8("ReceiveDataL - Exit"));
}
@@ -472,11 +481,9 @@
#endif
isResponseTransactionCancelledNeeded = true;
- if( BoundProtocolLayer().TransactionPhaseL(iMTPSessionId) > EIdlePhase )
+ TMTPTransactionPhase transPhase = BoundProtocolLayer().TransactionPhaseL(iMTPSessionId);
+ if( transPhase > EIdlePhase && transPhase < ECompletingPhase )
{
-
-
-
iMTPEvent.Reset();
iMTPEvent.SetUint16(TMTPTypeEvent::EEventCode, iUsbControlRequestCancelData.Uint16(TMTPUsbControlRequestCancelData::ECancellationCode));
iMTPEvent.SetUint32(TMTPTypeEvent::EEventSessionID, iMTPSessionId);
@@ -496,45 +503,25 @@
BoundProtocolLayer().ReceivedEventL(iMTPEvent);
}
}
+ else if (transPhase == ECompletingPhase)
+ {
+ __FLOG(_L8("cancel event received at completing phase, flush rx data"));
+
+ //flush rx data.
+ static_cast<CMTPUsbEpBulkOut*>(iEndpoints[EMTPUsbEpBulkOut])->FlushRxDataL();
+ }
else
{
-
- #ifdef _DEBUG
- RDebug::Print(_L("cancel evnet received at idle state, stop data EPs, flush rx data, restart data eps,statusOK\n"));
- #endif
-
+ __FLOG(_L8("cancel event received at idle phase, stop data EPs, flush rx data, restart data eps"));
+
// stop data endpoint
DataEndpointsStop();
- //flush rx data
- TInt nbytes = 0;
- TInt err = iLdd.QueryReceiveBuffer(EndpointNumber(EMTPUsbEpBulkOut), nbytes);
- #ifdef _DEBUG
- RDebug::Print(_L("QueryReceiveBuffer()-----err is %d , nbytes is %d"), err, nbytes);
- #endif
-
- // has data, read it
- if( (err == KErrNone) && (nbytes > 0) )
- {
- // create the read buff
- RBuf8 readBuf;
- readBuf.CreateL(nbytes);
- // synchronously read the data
- TRequestStatus status;
- iLdd.ReadOneOrMore(status, EndpointNumber(EMTPUsbEpBulkOut), readBuf);
- User::WaitForRequest(status);
- if (KErrNone == status.Int())
- {
- #ifdef _DEBUG
- RDebug::Print(_L("%d bytes is flushed"), nbytes);
- #endif
- }
- readBuf.Close();
- }
+ //flush rx data.
+ static_cast<CMTPUsbEpBulkOut*>(iEndpoints[EMTPUsbEpBulkOut])->FlushRxDataL();
+
// initiate bulk request sequence.
- InitiateBulkRequestSequenceL();
-
- SetDeviceStatus(EMTPUsbDeviceStatusOK);
+ InitiateBulkRequestSequenceL();
}
}
@@ -1052,6 +1039,10 @@
CMTPUsbEpControl& ctrl(*static_cast<CMTPUsbEpControl*>(iEndpoints[EMTPUsbEpControl]));
if (!ctrl.Stalled())
{
+ // wait 100 miliseconds before issue control request.
+ // This line is to fix winlogo transport cancel test issue due to that ReadUntilShort never complete sometimes
+ // If USB team fixed the issue, this line could be removed.
+// User::After(1000*100); // 100 Miliseconds
ctrl.ReceiveControlRequestSetupL(iUsbControlRequestSetup);
}
__FLOG(_L8("InitiateControlRequestSequenceL - Exit"));
@@ -1400,6 +1391,7 @@
case KErrUsbDeviceClosing:
case KErrUsbCableDetached:
case KErrUsbDeviceBusReset:
+ case KErrUsbEpNotReady:
// Interface state is changing (@see RunL).
break;
--- a/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbepbase.cpp Fri May 14 16:42:01 2010 +0300
+++ b/mtptransports/mtpusbtransport/usbsic_imp/src/cmtpusbepbase.cpp Thu May 27 13:42:43 2010 +0300
@@ -73,7 +73,7 @@
iReceiveData(NULL, 0),
iSendChunkData(NULL, 0),
iSendData(NULL, 0),
- iIsFirstChunk(EFalse),
+ iIsFirstChunk(EFalse),
iConnection(aConnection)
{
CActiveScheduler::Add(this);
@@ -254,7 +254,6 @@
Cancel();
}
-
__ASSERT_DEBUG(iState == EIdle, Panic(EMTPUsbBadState));
iReceiveDataSink = &aSink;
@@ -528,6 +527,12 @@
TUint16 containerType(Connection().BulkContainer().Uint16L(CMTPUsbContainer::EContainerType));
iDataLength = Connection().BulkContainer().Uint32L(CMTPUsbContainer::EContainerLength);
+#ifdef __FLOG_ACTIVE
+ TUint32 transactionId(Connection().BulkContainer().Uint32L(CMTPUsbContainer::ETransactionID));
+ TUint16 code(Connection().BulkContainer().Uint16L(CMTPUsbContainer::ECode));
+ __FLOG_VA((_L8("ContainerLength = %lu, containerType = 0x%x, code = 0x%x, transactionID = 0x%x"), iDataLength, containerType, code, transactionId));
+#endif
+
//Due to an issue of Windows OS, the value of CMTPUsbContainer::EContainerLength is incorrect if the
//object >= 4G-12. The value should be KMaxTUint32 in this kind of cases, but in current Windows
//implementation it will be a value between 0 and 11.
@@ -540,23 +545,14 @@
__FLOG_VA((_L8("containerType = %u , dataLength = %lu bytes"), containerType, iDataLength));
- if (iDataLength >= KUSBHeaderSize &&
- (containerType == EMTPUsbContainerTypeCommandBlock || containerType == EMTPUsbContainerTypeDataBlock))
- {
- result = ETrue;
- iDataCounter = 0;
-#ifdef _DEBUG
- RDebug::Print(_L("Find the valid usb header------------------------------------------------------\n"));
- TUint16 code(Connection().BulkContainer().Uint16L(CMTPUsbContainer::ECode));
- TUint32 transactionID(Connection().BulkContainer().Uint32L(CMTPUsbContainer::ETransactionID));
- RDebug::Print(_L("ContainerLength = 0x%x, containerType = 0x%x , code = 0x%x , transactionID = 0x%x "), iDataLength, containerType, code, transactionID);
- }
- else
- {
- RDebug::Print(_L("inValid usb Header read..........................................................."));
-#endif
- }
- __FLOG(_L8("CMTPUsbEpBase::ValidateUSBHeader - Exit"));
+ if (iDataLength >= KUSBHeaderSize &&
+ (containerType == EMTPUsbContainerTypeCommandBlock || containerType == EMTPUsbContainerTypeDataBlock))
+ {
+ result = ETrue;
+ iDataCounter = 0;
+ }
+
+ __FLOG_VA((_L8("CMTPUsbEpBase::ValidateUSBHeader - Exit with the result of %d"), result));
return result;
}
@@ -606,15 +602,23 @@
TRequestStatus status;
do
{
- // Keep looking for headers.
- // The case we are trying to catch is when we have 12 garbage bytes followed by 12 good bytes.
- // In this case the ReadOneOrMore is acting on the next packet rather than the current packet.
- // If the garbage data is a multiple of 12 bytes, we should still be able to catch the next good
- // header. Otherwise the ReadOneOrMore will return will <12 bytes and we will fall through
- // to the retry code below.
+ //trash data, continue to flush.
+ iReceiveData.Zero();
+ Connection().Ldd().ReadPacket(status, EndpointNumber(), iReceiveData, KUSBHeaderSize);
+ User::WaitForRequest(status);
+
+ //check the first 12 bytes of next packet to see whether it's an expected USB header
iReceiveData.Zero();
Connection().Ldd().ReadOneOrMore(status, EndpointNumber(), iReceiveData, KUSBHeaderSize);
User::WaitForRequest(status);
+
+#ifdef __FLOG_ACTIVE
+ __FLOG_VA((_L8("Keep looking for headers, length = %d"), iReceiveData.Length()));
+ for (int i=0; i<3&&(i*4+4)<=iReceiveData.Length(); i++)
+ {
+ __FLOG_VA((_L8("0x%x 0x%x 0x%x 0x%x"), iReceiveData[i*4], iReceiveData[i*4+1], iReceiveData[i*4+2], iReceiveData[i*4+3]));
+ }
+#endif
} while (iReceiveData.Length()==KUSBHeaderSize && !ValidateUSBHeaderL());
if(!ValidateUSBHeaderL())
@@ -1034,7 +1038,7 @@
void CMTPUsbEpBase::FlushRxDataL()
{
-
+ __FLOG(_L8("FlushRxDataL - Entry"));
// create the read buff
RBuf8 readBuf;
readBuf.CreateL(KFlushBufferMaxLen);
@@ -1046,27 +1050,42 @@
// get the data size in the receive buffer ready to read
TInt nbytes = 0;
TInt err = Connection().Ldd().QueryReceiveBuffer(EndpointNumber(), nbytes);
-#ifdef _DEBUG
- RDebug::Print(_L("FlushRxDataL()--1---err is %d , nbytes is %d"), err, nbytes);
-#endif
+
+ __FLOG_VA((_L8("FlushRxDataL()--1---err is %d , nbytes is %d"), err, nbytes));
// has data, read it
if( (err == KErrNone) && (nbytes > 0) )
- {
-
+ {
// synchronously read the data
TRequestStatus status;
Connection().Ldd().ReadOneOrMore(status, EndpointNumber(), readBuf);
User::WaitForRequest(status);
if(status.Int() != KErrNone) break;
-
- // whenever some data read, reset the rest wait time .
+
+#ifdef __FLOG_ACTIVE
+ TInt length = readBuf.Length();
+ __FLOG_VA((_L8("The length of trash data is %d"), length));
+
+ __FLOG(_L8("Begining of trash data"));
+ for (int i=0; i<4&&(i*4+4)<=length; i++)
+ {
+ __FLOG_VA((_L8("0x%x 0x%x 0x%x 0x%x"), readBuf[i*4], readBuf[i*4+1], readBuf[i*4+2], readBuf[i*4+3]));
+ }
+
+ __FLOG(_L8("Residual of trash data if any"));
+ TInt residualLength = length%512;
+ for (int i=0; i<4&&(i*4+4)<=residualLength; i++)
+ {
+ TInt beginIndex = length - residualLength;
+ __FLOG_VA((_L8("0x%x 0x%x 0x%x 0x%x"), readBuf[beginIndex + i*4], readBuf[beginIndex + i*4+1], readBuf[beginIndex + i*4+2], readBuf[beginIndex + i*4+3]));
+ }
+#endif
+
+ // whenever some data read, reset the rest wait time.
uRestTimeToWait = INTERVAL_FOR_FLUSH_TRASH_DATA;
-
-#ifdef _DEBUG
- RDebug::Print(_L("FlushRxDataL()---Reset the rest wait time"));
-#endif
+
+ __FLOG(_L8("FlushRxDataL()---Reset the rest wait time"));
}
else
{
@@ -1075,13 +1094,11 @@
// reduce the rest time to wait
uRestTimeToWait -= INTERVAL_FOR_READ_TRASH_DATA ;
}
-
-#ifdef _DEBUG
- RDebug::Print(_L("FlushRxDataL()---uRestTimeToWait is %d"), uRestTimeToWait);
-#endif
+
+ __FLOG_VA((_L8("FlushRxDataL()---uRestTimeToWait is %d"), uRestTimeToWait));
}while( uRestTimeToWait > 0);
readBuf.Close();
-
+ __FLOG(_L8("FlushRxDataL - Exit"));
}