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 { |
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 } |