mtpfws/mtpfw/dataproviders/dputility/src/cmtpgetformatcapabilities.cpp
changeset 0 d0791faffa3f
child 18 453dfc402455
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mtpfws/mtpfw/dataproviders/dputility/src/cmtpgetformatcapabilities.cpp	Tue Feb 02 01:11:40 2010 +0200
@@ -0,0 +1,294 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <mtp/cmtptypeinterdependentpropdesc.h>
+#include <mtp/cmtptypeobjectpropdesc.h>
+#include <mtp/mtpprotocolconstants.h>
+#include <mtp/mmtpdataproviderframework.h>
+#include <mtp/cmtptypestring.h>
+
+#include "cmtpdataprovidercontroller.h"
+#include "cmtpdataprovider.h"
+#include "mtpframeworkconst.h"
+#include "cmtpgetformatcapabilities.h"
+
+
+
+EXPORT_C MMTPRequestProcessor* CMTPGetFormatCapabilities::NewL(MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection)
+    {
+    CMTPGetFormatCapabilities* self = new (ELeave) CMTPGetFormatCapabilities(aFramework, aConnection);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+    
+EXPORT_C CMTPGetFormatCapabilities::~CMTPGetFormatCapabilities()
+    {
+    //[SP-Format-0x3002]
+    //Make the same behavior betwen 0x3000 and 0x3002.
+	//iSingletons is used to judge whether FileDP supports 0x3002 or not.
+    iSingletons.Close();
+    
+    delete iCapabilityList;
+    }
+
+void CMTPGetFormatCapabilities::ServiceL()
+    {
+    delete iCapabilityList;
+    iCapabilityList = CMTPTypeFormatCapabilityList::NewL();
+    iFormatCode = Request().Uint32(TMTPTypeRequest::ERequestParameter1);
+
+    /**
+     * [SP-Format-0x3002]Special processing for PictBridge DP which own 6 dps file with format 0x3002, 
+     * but it does not really own the format 0x3002.
+     * 
+     * Make the same behavior betwen 0x3000 and 0x3002.
+     */
+    if((EMTPFormatCodeUndefined == iFormatCode) || (EMTPFormatCodeScript == iFormatCode))
+        {
+        BuildFormatAsUndefinedL(iFormatCode);
+        }
+    else if(EMTPFormatCodeAssociation == iFormatCode)
+        {
+        BuildFormatAssociationL();
+        }
+    else
+        {
+        if(iFramework.DataProviderId() == KMTPDeviceDPID)
+           {
+           BuildFormatAssociationL();
+           }
+       else if(iFramework.DataProviderId() == KMTPFileDPID)
+           {
+           BuildFormatAsUndefinedL(EMTPFormatCodeUndefined);
+           
+           //[SP-Format-0x3002]
+           //Make the same behavior betwen 0x3000 and 0x3002.
+           CMTPDataProvider& filedp(iSingletons.DpController().DataProviderL(KMTPFileDPID));
+           if(filedp.SupportedCodes(EObjectCaptureFormats).Find(EMTPFormatCodeScript) != KErrNotFound)
+        	   {
+        	   BuildFormatAsUndefinedL(EMTPFormatCodeScript);
+        	   }
+           }
+        }
+    
+    
+    SendDataL(*iCapabilityList);    
+    }
+    
+void CMTPGetFormatCapabilities::BuildFormatAssociationL()
+    {
+    CMTPTypeInterdependentPropDesc*  interDesc = CMTPTypeInterdependentPropDesc::NewLC();
+    CMTPTypeFormatCapability* frmCap = CMTPTypeFormatCapability::NewLC( EMTPFormatCodeAssociation ,interDesc );
+    
+    //EMTPObjectPropCodeStorageID
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeStorageID) );
+    
+    //EMTPObjectPropCodeObjectFormat
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeObjectFormat) );
+    
+    //EMTPObjectPropCodeProtectionStatus
+    frmCap->AppendL( ServiceProtectionStatusL() );
+    
+    //EMTPObjectPropCodeAssociationType
+    frmCap->AppendL( ServiceAssociationTypeL() );
+    
+    //EMTPObjectPropCodeAssociationDesc
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeAssociationDesc) );
+    
+    //EMTPObjectPropCodeObjectSize
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeObjectSize) );
+    
+    //EMTPObjectPropCodeObjectFileName
+    _LIT(KMtpObjDescObjFileName, "[a-zA-Z!#\\$%&'\\(\\)\\-0-9@\\^_\\`\\{\\}\\~][a-zA-Z!#\\$%&'\\(\\)\\-0-9@\\^_\\`\\{\\}\\~ ]{0, 7}\\.[[a-zA-Z!#\\$%&'\\(\\)\\-0-9@\\^_\\`\\{\\}\\~][a-zA-Z!#\\$%&'\\(\\)\\-0-9@\\^_\\`\\{\\}\\~ ]{0, 2}]?");
+    CMTPTypeString* form = CMTPTypeString::NewLC( KMtpObjDescObjFileName );   
+    frmCap->AppendL(CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeObjectFileName,
+            CMTPTypeObjectPropDesc::ERegularExpressionForm, form));
+    CleanupStack::PopAndDestroy(form );       
+    
+    //EMTPObjectPropCodeDateModified
+    frmCap->AppendL(  CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeDateModified) );
+    
+    //EMTPObjectPropCodeParentObject
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeParentObject) );
+    
+    //EMTPObjectPropCodePersistentUniqueObjectIdentifier
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodePersistentUniqueObjectIdentifier) );
+    
+    //EMTPObjectPropCodeName
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeName)); 
+    
+    //EMTPObjectPropCodeNonConsumable
+    frmCap->AppendL(ServiceNonConsumableL() );
+    
+    iCapabilityList->AppendL(frmCap);
+    CleanupStack::Pop(frmCap);
+    CleanupStack::Pop(interDesc);
+    }
+
+
+void CMTPGetFormatCapabilities::BuildFormatAsUndefinedL( TUint aFormatCode )
+    {
+    CMTPTypeInterdependentPropDesc*  interDesc = CMTPTypeInterdependentPropDesc::NewLC();
+    CMTPTypeFormatCapability* frmCap = CMTPTypeFormatCapability::NewLC( aFormatCode ,interDesc );
+    
+    //EMTPObjectPropCodeStorageID
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeStorageID) );
+    
+    //EMTPObjectPropCodeObjectFormat
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeObjectFormat) );
+    
+    //EMTPObjectPropCodeProtectionStatus
+    frmCap->AppendL( ServiceProtectionStatusL() );
+    
+    //EMTPObjectPropCodeObjectSize
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeObjectSize) );
+    
+    //EMTPObjectPropCodeObjectFileName
+    _LIT(KMtpObjDescObjFileName, "[a-zA-Z!#\\$%&'\\(\\)\\-0-9@\\^_\\`\\{\\}\\~][a-zA-Z!#\\$%&'\\(\\)\\-0-9@\\^_\\`\\{\\}\\~ ]{0, 7}\\.[[a-zA-Z!#\\$%&'\\(\\)\\-0-9@\\^_\\`\\{\\}\\~][a-zA-Z!#\\$%&'\\(\\)\\-0-9@\\^_\\`\\{\\}\\~ ]{0, 2}]?");
+    CMTPTypeString* form = CMTPTypeString::NewLC( KMtpObjDescObjFileName );   
+    frmCap->AppendL(CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeObjectFileName,
+            CMTPTypeObjectPropDesc::ERegularExpressionForm, form));
+    CleanupStack::PopAndDestroy(form );     
+    
+    //EMTPObjectPropCodeDateModified
+    frmCap->AppendL(  CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeDateModified) );
+    
+    //EMTPObjectPropCodeParentObject
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeParentObject) );
+    
+    //EMTPObjectPropCodePersistentUniqueObjectIdentifier
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodePersistentUniqueObjectIdentifier) );
+    
+    //EMTPObjectPropCodeName
+    frmCap->AppendL( CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeName)); 
+    
+    //EMTPObjectPropCodeNonConsumable
+    frmCap->AppendL(ServiceNonConsumableL() );
+    
+    iCapabilityList->AppendL(frmCap);
+    CleanupStack::Pop(frmCap);
+    CleanupStack::Pop(interDesc);
+    }
+    
+CMTPTypeObjectPropDesc* CMTPGetFormatCapabilities::ServiceProtectionStatusL()
+    {
+    CMTPTypeObjectPropDescEnumerationForm* expectedForm = CMTPTypeObjectPropDescEnumerationForm::NewL(EMTPTypeUINT16);
+    CleanupStack::PushL(expectedForm);
+    //Currently, we only support EMTPProtectionNoProtection and EMTPProtectionReadOnly
+//  TUint16 values[] = {EMTPProtectionNoProtection, EMTPProtectionReadOnly, EMTPProtectionReadOnlyData, EMTPProtectionNonTransferable};
+    TUint16 values[] = {EMTPProtectionNoProtection, EMTPProtectionReadOnly};
+    TUint   numValues((sizeof(values) / sizeof(values[0])));
+    for (TUint i = 0; i < numValues; i++)
+        {
+        TMTPTypeUint16 data(values[i]);
+        expectedForm->AppendSupportedValueL(data);
+        }  
+    CMTPTypeObjectPropDesc* ret = CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeProtectionStatus, *expectedForm);          
+    CleanupStack::PopAndDestroy(expectedForm);
+    return ret;
+    }
+
+CMTPTypeObjectPropDesc* CMTPGetFormatCapabilities::ServiceAssociationTypeL()
+    {
+    CMTPTypeObjectPropDescEnumerationForm* expectedForm = CMTPTypeObjectPropDescEnumerationForm::NewL(EMTPTypeUINT16);
+    CleanupStack::PushL(expectedForm);
+    const TUint16 KMtpValues[] = {EMTPAssociationTypeUndefined, EMTPAssociationTypeGenericFolder};
+    const TUint KNumMtpValues(sizeof(KMtpValues) / sizeof(KMtpValues[0])); 
+    const TUint16 KPtpValues[] = {EMTPAssociationTypeUndefined, EMTPAssociationTypeGenericFolder, EMTPAssociationTypeAlbum, EMTPAssociationTypeTimeSequence, EMTPAssociationTypeHorizontalPanoramic, EMTPAssociationTypeVerticalPanoramic, EMTPAssociationType2DPanoramic,EMTPAssociationTypeAncillaryData};
+    const TUint KNumPtpValues(sizeof(KPtpValues) / sizeof(KPtpValues[0]));
+
+    TUint numValues(KNumMtpValues);
+    const TUint16* values = KMtpValues;
+    if (EModeMTP != iFramework.Mode())
+         {
+         numValues = KNumPtpValues;
+         values = KPtpValues;            
+         }
+   
+    for (TUint i = 0; i < numValues; i++)
+        {
+        TMTPTypeUint16 data(values[i]);
+        expectedForm->AppendSupportedValueL(data);
+        }  
+    CMTPTypeObjectPropDesc* ret = CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeAssociationType, *expectedForm);       
+    CleanupStack::PopAndDestroy(expectedForm);
+    return ret;
+    }
+
+CMTPTypeObjectPropDesc* CMTPGetFormatCapabilities::ServiceNonConsumableL()
+    {
+    CMTPTypeObjectPropDescEnumerationForm* expectedForm = CMTPTypeObjectPropDescEnumerationForm::NewL(EMTPTypeUINT8);
+    CleanupStack::PushL(expectedForm);
+    TUint8 values[] = {0,1};
+    TUint   numValues((sizeof(values) / sizeof(values[0])));
+    for (TUint i = 0; i < numValues; i++)
+        {
+        TMTPTypeUint8 data(values[i]);
+        expectedForm->AppendSupportedValueL(data);
+        }   
+    CMTPTypeObjectPropDesc* ret = CMTPTypeObjectPropDesc::NewL(EMTPObjectPropCodeNonConsumable, *expectedForm);     
+    CleanupStack::PopAndDestroy(expectedForm);
+    
+    return ret;
+    }
+
+TMTPResponseCode CMTPGetFormatCapabilities::CheckRequestL()
+    {
+    TMTPResponseCode response = CMTPRequestProcessor::CheckRequestL(); 
+    if( EMTPRespCodeOK != response )
+        return response;
+    
+    TUint32 formatCode = Request().Uint32(TMTPTypeRequest::ERequestParameter1);
+    
+    //[SP-Format-0x3002]
+	//Make the same behavior betwen 0x3000 and 0x3002.
+    if( (formatCode != EMTPFormatCodeUndefined) && (formatCode != EMTPFormatCodeAssociation) && (formatCode != KMTPFormatsAll) && ( EMTPFormatCodeScript != formatCode ))
+        {
+        return EMTPRespCodeInvalidObjectFormatCode;
+        }
+
+    if( (formatCode == EMTPFormatCodeAssociation) && (iFramework.DataProviderId() != KMTPDeviceDPID) )
+        {
+        return EMTPRespCodeInvalidObjectFormatCode;
+        }
+    
+    if( (formatCode == EMTPFormatCodeUndefined) && (iFramework.DataProviderId() != KMTPFileDPID) )
+        {
+        return EMTPRespCodeInvalidObjectFormatCode;
+        }
+    
+    return EMTPRespCodeOK;    
+    }
+    
+
+CMTPGetFormatCapabilities::CMTPGetFormatCapabilities(MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection) :
+    CMTPRequestProcessor(aFramework, aConnection, 0, NULL)
+    {
+    }
+    
+void CMTPGetFormatCapabilities::ConstructL()
+    {
+    //[SP-Format-0x3002]
+    //Make the same behavior betwen 0x3000 and 0x3002.
+	//iSingletons is used to judge whether FileDP supports 0x3002 or not.
+    iSingletons.OpenL();
+    }
+
+
+   
+
+