mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp
changeset 25 d881023c13eb
parent 0 a2952bb97e68
child 27 cbb1bfb7ebfb
equal deleted inserted replaced
21:a05c44bc3c61 25:d881023c13eb
    14 * Description:  Implement opeartion SetObjectPropValue
    14 * Description:  Implement opeartion SetObjectPropValue
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 
    18 
    19 #include <mtp/mmtpdataproviderframework.h>
       
    20 #include <mtp/cmtptypestring.h>
    19 #include <mtp/cmtptypestring.h>
    21 #include <mtp/cmtptypearray.h>
    20 #include <mtp/cmtptypearray.h>
    22 #include <mtp/mmtpobjectmgr.h>
    21 #include <mtp/mmtpobjectmgr.h>
    23 
    22 
    24 #include "csetobjectpropvalue.h"
    23 #include "csetobjectpropvalue.h"
    70     CRequestProcessor( aFramework,
    69     CRequestProcessor( aFramework,
    71         aConnection,
    70         aConnection,
    72         sizeof(KMTPSetObjectPropValuePolicy) / sizeof(TMTPRequestElementInfo),
    71         sizeof(KMTPSetObjectPropValuePolicy) / sizeof(TMTPRequestElementInfo),
    73         KMTPSetObjectPropValuePolicy ),
    72         KMTPSetObjectPropValuePolicy ),
    74     iObjectMgr( aFramework.ObjectMgr() ),
    73     iObjectMgr( aFramework.ObjectMgr() ),
    75     iDpConfig( aDpConfig )
    74     iDpConfig( aDpConfig ),
       
    75     iFs( aFramework.Fs() )
    76     {
    76     {
    77     SetPSStatus();
    77     SetPSStatus();
    78     PRINT( _L( "Operation: SetObjectPropValue(0x9804)" ) );
    78     PRINT( _L( "Operation: SetObjectPropValue(0x9804)" ) );
    79     }
    79     }
    80 
    80 
   105         case EMTPObjectPropCodeObjectFormat:
   105         case EMTPObjectPropCodeObjectFormat:
   106         case EMTPObjectPropCodeProtectionStatus:
   106         case EMTPObjectPropCodeProtectionStatus:
   107         case EMTPObjectPropCodeObjectSize:
   107         case EMTPObjectPropCodeObjectSize:
   108         case EMTPObjectPropCodeParentObject:
   108         case EMTPObjectPropCodeParentObject:
   109         case EMTPObjectPropCodePersistentUniqueObjectIdentifier:
   109         case EMTPObjectPropCodePersistentUniqueObjectIdentifier:
   110         case EMTPObjectPropCodeNonConsumable:
       
   111         case EMTPObjectPropCodeDateAdded:
   110         case EMTPObjectPropCodeDateAdded:
   112         case EMTPObjectPropCodeDateCreated:
   111         case EMTPObjectPropCodeDateCreated:
   113         case EMTPObjectPropCodeDateModified:
   112         case EMTPObjectPropCodeDateModified:
   114         //case EMTPObjectPropCodeVideoBitRate:  // move to specific dp
   113         //case EMTPObjectPropCodeVideoBitRate:  // move to specific dp
   115             returnCode = ETrue;
   114             returnCode = ETrue;
   116             break;
   115             break;
       
   116         case EMTPObjectPropCodeNonConsumable:
       
   117             // It's settable, return EFalse here.
       
   118             break;
   117 
   119 
   118         default:
   120         default:
   119             returnCode = IsSpecificPropCodeReadOnly(aPropCode);
   121             returnCode = IsSpecificPropCodeReadOnly(aPropCode);
   120             break;
   122             break;
   121         }
   123         }
   131 EXPORT_C TMTPResponseCode CSetObjectPropValue::CheckRequestL()
   133 EXPORT_C TMTPResponseCode CSetObjectPropValue::CheckRequestL()
   132     {
   134     {
   133     PRINT( _L( "MM MTP => CSetObjectPropValue::CheckRequestL" ) );
   135     PRINT( _L( "MM MTP => CSetObjectPropValue::CheckRequestL" ) );
   134 
   136 
   135     TMTPResponseCode result = CRequestProcessor::CheckRequestL();
   137     TMTPResponseCode result = CRequestProcessor::CheckRequestL();
       
   138     if ( result == EMTPRespCodeObjectWriteProtected )
       
   139         {
       
   140         // Return AccessDenied for P4S pass rate, instead of EMTPRespCodeObjectWriteProtected
       
   141         result = EMTPRespCodeAccessDenied;
       
   142         }
   136 
   143 
   137     // Check if property is supported
   144     // Check if property is supported
   138     if ( result == EMTPRespCodeOK )
   145     if ( result == EMTPRespCodeOK )
   139         {
   146         {
   140         iPropCode = Request().Uint32( TMTPTypeRequest::ERequestParameter2 );
   147         iPropCode = Request().Uint32( TMTPTypeRequest::ERequestParameter2 );
   141         PRINT1( _L( "MM MTP <> CSetObjectPropValue::CheckRequestL iPropCode = 0x%x" ), iPropCode );
   148         PRINT1( _L( "MM MTP <> CSetObjectPropValue::CheckRequestL iPropCode = 0x%x" ), iPropCode );
   142         result = EMTPRespCodeInvalidObjectPropCode;
       
   143 
   149 
   144         TUint32 objectHandle = Request().Uint32( TMTPTypeRequest::ERequestParameter1 );
   150         TUint32 objectHandle = Request().Uint32( TMTPTypeRequest::ERequestParameter1 );
   145         CMTPObjectMetaData* objectInfo = iRequestChecker->GetObjectInfo( objectHandle );
   151         CMTPObjectMetaData* objectInfo = iRequestChecker->GetObjectInfo( objectHandle );
   146 
   152         if ( objectInfo == NULL )
   147         if (!objectInfo)
   153             {
   148             {
   154             PRINT( _L("MM MTP <> CSetObjectPropValue::CheckRequestL, objectInfo is NULL" ) );
   149             PRINT(_L("MM MTP <> CGetObjectPropValue::CheckRequestL, objectInfo is NULL"));
       
   150             return EMTPRespCodeInvalidObjectHandle;
   155             return EMTPRespCodeInvalidObjectHandle;
   151             }
   156             }
   152 
   157 
   153         TFileName fileName = objectInfo->DesC(CMTPObjectMetaData::ESuid);
   158         TFileName fileName = objectInfo->DesC( CMTPObjectMetaData::ESuid );
   154         TUint32 formatCode = objectInfo->Uint(CMTPObjectMetaData::EFormatCode);
   159         TUint32 formatCode = objectInfo->Uint( CMTPObjectMetaData::EFormatCode );
   155 
   160         PRINT3( _L( "MM MTP <> CSetObjectPropValue::CheckRequestL, handle = 0x%x, filename = %S, formatCode = 0x%x" ),
   156         PRINT3( _L( "MM MTP <> CGetObjectPropValue::CheckRequestL, handle = 0x%x, filename = %S, formatCode = 0x%x" ),
   161             objectHandle,
   157                 objectHandle,
   162             &fileName,
   158                 &fileName,
   163             formatCode );
   159                 formatCode );
       
   160         const RArray<TUint>* properties = iDpConfig.GetSupportedPropertiesL( formatCode );
   164         const RArray<TUint>* properties = iDpConfig.GetSupportedPropertiesL( formatCode );
   161         TInt count = properties->Count();
   165         TInt count = properties->Count();
       
   166 
       
   167         result = EMTPRespCodeInvalidObjectPropCode;
   162         for ( TInt i = 0; i < count; i++ )
   168         for ( TInt i = 0; i < count; i++ )
   163             {
   169             {
   164             // Object property code is supported, but can not be set which is read only.
   170             // Object property code is supported, but can not be set which is read only.
   165             if ( (*properties)[i] == iPropCode
   171             if ( ( *properties )[i] == iPropCode && IsPropCodeReadonly( iPropCode ) )
   166                 && IsPropCodeReadonly( iPropCode ) )
       
   167                 {
   172                 {
   168                 result = EMTPRespCodeAccessDenied;
   173                 result = EMTPRespCodeAccessDenied;
   169                 break;
   174                 break;
   170                 }
   175                 }
   171             // Object property code is supported and can be set.
   176             // Object property code is supported and can be set.
   172             else if ( iPropCode == (*properties)[i] )
   177             else if ( iPropCode == ( *properties )[i] )
   173                 {
   178                 {
   174                 result = EMTPRespCodeOK;
   179                 result = EMTPRespCodeOK;
   175                 break;
   180                 break;
   176                 }
   181                 }
   177             } // end of for
   182             } // end of for
   210         case EMTPObjectPropCodeParentObject:
   215         case EMTPObjectPropCodeParentObject:
   211         case EMTPObjectPropCodePersistentUniqueObjectIdentifier:
   216         case EMTPObjectPropCodePersistentUniqueObjectIdentifier:
   212         case EMTPObjectPropCodeDateAdded:       // 0xDC4E
   217         case EMTPObjectPropCodeDateAdded:       // 0xDC4E
   213         case EMTPObjectPropCodeDateCreated:     // Date Created(0xDC08)
   218         case EMTPObjectPropCodeDateCreated:     // Date Created(0xDC08)
   214         case EMTPObjectPropCodeDateModified:    // Modified Date(0xDC09)
   219         case EMTPObjectPropCodeDateModified:    // Modified Date(0xDC09)
       
   220         case EMTPObjectPropCodeVideoBitRate: // 0xDE9C
       
   221             {
       
   222             SendResponseL( EMTPRespCodeAccessDenied );
       
   223             }
       
   224             break;
       
   225 
   215         case EMTPObjectPropCodeNonConsumable:   // Non Consumable(0xDC4F)
   226         case EMTPObjectPropCodeNonConsumable:   // Non Consumable(0xDC4F)
   216         case EMTPObjectPropCodeVideoBitRate: // 0xDE9C
   227             ReceiveDataL( iMTPTypeUint8 );
   217             {
       
   218             SendResponseL( EMTPRespCodeAccessDenied );
       
   219             }
       
   220             break;
   228             break;
   221 
   229 
   222         // Get Data for String objects
   230         // Get Data for String objects
   223         case EMTPObjectPropCodeObjectFileName:  // 0xDC07
   231         case EMTPObjectPropCodeObjectFileName:  // 0xDC07
   224         case EMTPObjectPropCodeName: // 0xDC44
   232         case EMTPObjectPropCodeName: // 0xDC44
       
   233         case EMTPObjectPropCodeAlbumArtist:
   225             {
   234             {
   226             delete iMTPTypeString;
   235             delete iMTPTypeString;
   227             iMTPTypeString = NULL;
   236             iMTPTypeString = NULL;
   228             iMTPTypeString = CMTPTypeString::NewL();
   237             iMTPTypeString = CMTPTypeString::NewL();
   229             ReceiveDataL( *iMTPTypeString );
   238             ReceiveDataL( *iMTPTypeString );
   250     __ASSERT_DEBUG( iObjectInfo, Panic( EMmMTPDpObjectNull ) );
   259     __ASSERT_DEBUG( iObjectInfo, Panic( EMmMTPDpObjectNull ) );
   251     TMTPResponseCode responseCode = EMTPRespCodeOK;
   260     TMTPResponseCode responseCode = EMTPRespCodeOK;
   252 
   261 
   253     switch ( iPropCode )
   262     switch ( iPropCode )
   254         {
   263         {
       
   264         case EMTPObjectPropCodeNonConsumable:
       
   265             iObjectInfo->SetUint( CMTPObjectMetaData::ENonConsumable, iMTPTypeUint8.Value() );
       
   266             iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
       
   267             break;
       
   268 
   255         case EMTPObjectPropCodeObjectFileName:
   269         case EMTPObjectPropCodeObjectFileName:
   256             {
   270             {
   257             TPtrC suid( iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) );
   271             TPtrC suid( iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) );
   258             TBuf<KMaxFileName> newSuid( iMTPTypeString->StringChars() );
   272             TPtrC ptr ( iMTPTypeString->StringChars() );
   259             PRINT2( _L( "MM MTP <> old name = %S, new name = %S" ), &suid, &newSuid );
   273             if ( KMaxFileName < ptr.Length() )
   260             TInt err = KErrNone;
   274                 responseCode = EMTPRespCodeInvalidDataset;
   261             err = MmMtpDpUtility::UpdateObjectFileName( iFramework.Fs(),
   275             else
   262                 suid,
       
   263                 newSuid );
       
   264             PRINT1( _L( "MM MTP <> Update object file name err = %d" ), err );
       
   265             if ( KErrOverflow == err ) // full path name is too long
       
   266                 {
   276                 {
   267                 responseCode = EMTPRespCodeInvalidDataset;
   277                 TFileName newSuid( ptr );
   268                 }
   278                 PRINT2( _L( "MM MTP <> old name = %S, new name = %S" ), &suid, &newSuid );
   269             else if ( ( KErrNone == err ) || ( KErrAlreadyExists == err ) )
   279                 TInt err = KErrNone;
   270                 {
   280                 err = MmMtpDpUtility::UpdateObjectFileName( iFramework.Fs(),
   271                 TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( suid, newSuid ) ); //Update MPX DB
   281                     suid,
   272                 PRINT1( _L( "MM MTP <> Rename MPX object file name err = %d" ), err );
   282                     newSuid );
   273                 // it is ok if file is not found in DB, following S60 solution
   283                 // TODO: if the new name is the same with old name
   274                 if ( KErrNotFound == err )
   284                 PRINT1( _L( "MM MTP <> Update object file name err = %d" ), err );
       
   285                 if ( KErrOverflow == err ) // full path name is too long
   275                     {
   286                     {
   276                     TRAP( err, iDpConfig.GetWrapperL().AddObjectL( newSuid ) );
   287                     responseCode = EMTPRespCodeInvalidDataset;
   277                     PRINT1( _L( "MM MTP <> Add MPX object file name err = %d" ), err );
       
   278                     }
   288                     }
   279 
   289                 else if ( KErrNone == err )
   280                 if ( KErrNone == err )
       
   281                     {
   290                     {
       
   291                     TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( *iObjectInfo, newSuid ) ); //Update MPX DB
       
   292                     PRINT1( _L( "MM MTP <> Rename MPX object file name err = %d" ), err );
       
   293                     // it is ok if file is not found in DB, following S60 solution
       
   294                     if ( KErrNotFound == err )
       
   295                         {
       
   296                         TRAP( err, iDpConfig.GetWrapperL().AddObjectL( *iObjectInfo ) );
       
   297                         PRINT1( _L( "MM MTP <> Add MPX object file name err = %d" ), err );
       
   298                         }
       
   299 
   282                     iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, newSuid );
   300                     iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, newSuid );
   283                     iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
   301                     iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo );
   284                     }
   302                     }
   285                 else
   303                 else
   286                     {
   304                     {
   289                 }
   307                 }
   290             }
   308             }
   291             break;
   309             break;
   292 
   310 
   293         case EMTPObjectPropCodeName: // 0xDC44
   311         case EMTPObjectPropCodeName: // 0xDC44
       
   312         case EMTPObjectPropCodeAlbumArtist:
   294             {
   313             {
   295             responseCode = ServiceMetaDataToWrapperL( iPropCode,
   314             responseCode = ServiceMetaDataToWrapperL( iPropCode,
   296                 *iMTPTypeString,
   315                 *iMTPTypeString,
   297                 *iObjectInfo );
   316                 *iObjectInfo );
   298             }
   317             }
   341         {
   360         {
   342         resCode = EMTPRespCodeAccessDenied;
   361         resCode = EMTPRespCodeAccessDenied;
   343         }
   362         }
   344     else if ( err == KErrNotFound )
   363     else if ( err == KErrNotFound )
   345         {
   364         {
   346 //        TMTPFormatCode formatCode =
       
   347 //            MmMtpDpUtility::FormatFromFilename( aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ) );
       
   348         if( MmMtpDpUtility::HasMetadata( aObjectMetaData.Uint( CMTPObjectMetaData::EFormatCode ) ) )
   365         if( MmMtpDpUtility::HasMetadata( aObjectMetaData.Uint( CMTPObjectMetaData::EFormatCode ) ) )
   349             SendResponseL( EMTPRespCodeAccessDenied );
   366             SendResponseL( EMTPRespCodeAccessDenied );
   350         else
       
   351             SendDataL( aNewData );
       
   352         }
   367         }
   353     else
   368     else
   354         {
   369         {
   355         resCode = EMTPRespCodeGeneralError;
   370         resCode = EMTPRespCodeGeneralError;
   356         }
   371         }