186 TUint16 protectionStatus = EMTPProtectionNoProtection; |
186 TUint16 protectionStatus = EMTPProtectionNoProtection; |
187 protectionStatus = MmMtpDpUtility::GetProtectionStatusL( iFs, object->DesC( CMTPObjectMetaData::ESuid ) ); |
187 protectionStatus = MmMtpDpUtility::GetProtectionStatusL( iFs, object->DesC( CMTPObjectMetaData::ESuid ) ); |
188 if ( protectionStatus != EMTPProtectionNoProtection ) |
188 if ( protectionStatus != EMTPProtectionNoProtection ) |
189 { |
189 { |
190 // NOTE: P4S expects AccessDenied response instead of ObjectWriteProtected |
190 // NOTE: P4S expects AccessDenied response instead of ObjectWriteProtected |
191 return EMTPRespCodeAccessDenied; // EMTPRespCodeObjectWriteProtected; |
191 responseCode = EMTPRespCodeAccessDenied; // EMTPRespCodeObjectWriteProtected; |
192 } |
192 } |
193 |
193 else |
194 switch ( propertyCode ) |
|
195 { |
194 { |
196 case EMTPObjectPropCodeStorageID: |
195 switch ( propertyCode ) |
197 case EMTPObjectPropCodeObjectFormat: |
|
198 case EMTPObjectPropCodeProtectionStatus: |
|
199 case EMTPObjectPropCodeObjectSize: |
|
200 case EMTPObjectPropCodeParentObject: |
|
201 case EMTPObjectPropCodePersistentUniqueObjectIdentifier: |
|
202 case EMTPObjectPropCodeDateAdded: |
|
203 case EMTPObjectPropCodeDateCreated: |
|
204 case EMTPObjectPropCodeDateModified: |
|
205 { |
196 { |
206 responseCode = EMTPRespCodeAccessDenied; |
197 case EMTPObjectPropCodeStorageID: |
207 } |
198 case EMTPObjectPropCodeObjectFormat: |
208 break; |
199 case EMTPObjectPropCodeProtectionStatus: |
209 |
200 case EMTPObjectPropCodeObjectSize: |
210 case EMTPObjectPropCodeNonConsumable: |
201 case EMTPObjectPropCodeParentObject: |
211 object->SetUint( CMTPObjectMetaData::ENonConsumable, |
202 case EMTPObjectPropCodePersistentUniqueObjectIdentifier: |
212 aPropListElement.Uint8L( CMTPTypeObjectPropListElement::EValue ) ); |
203 case EMTPObjectPropCodeDateAdded: |
213 // TODO: need to reconsider, |
204 case EMTPObjectPropCodeDateCreated: |
214 // if propList comprise both non-consumable and objectFileName, |
205 case EMTPObjectPropCodeDateModified: |
215 // ModifyObjectL would be called twice, need to investigate if it won't affect |
|
216 // performance |
|
217 iFramework.ObjectMgr().ModifyObjectL( *object ); |
|
218 break; |
|
219 |
|
220 case EMTPObjectPropCodeObjectFileName: |
|
221 { |
|
222 TPtrC suid( object->DesC( CMTPObjectMetaData::ESuid ) ); |
|
223 TPtrC ptr( aPropListElement.StringL( CMTPTypeObjectPropListElement::EValue ) ); |
|
224 if ( KMaxFileName < ptr.Length() ) |
|
225 responseCode = EMTPRespCodeInvalidDataset; |
|
226 else |
|
227 { |
206 { |
228 TFileName newSuid( ptr ); |
207 responseCode = EMTPRespCodeAccessDenied; |
229 TInt err = MmMtpDpUtility::UpdateObjectFileName( iFramework.Fs(), suid, newSuid ); |
208 } |
230 PRINT1( _L( "MM MTP <> Update object file name err = %d" ), err ); |
209 break; |
231 if ( KErrOverflow == err ) // full path name is too long |
210 |
232 { |
211 case EMTPObjectPropCodeNonConsumable: |
|
212 object->SetUint( CMTPObjectMetaData::ENonConsumable, |
|
213 aPropListElement.Uint8L( CMTPTypeObjectPropListElement::EValue ) ); |
|
214 // TODO: need to reconsider, |
|
215 // if propList comprise both non-consumable and objectFileName, |
|
216 // ModifyObjectL would be called twice, need to investigate if it won't affect |
|
217 // performance |
|
218 iFramework.ObjectMgr().ModifyObjectL( *object ); |
|
219 break; |
|
220 |
|
221 case EMTPObjectPropCodeObjectFileName: |
|
222 { |
|
223 TPtrC suid( object->DesC( CMTPObjectMetaData::ESuid ) ); |
|
224 TPtrC ptr( aPropListElement.StringL( CMTPTypeObjectPropListElement::EValue ) ); |
|
225 if ( KMaxFileName < ptr.Length() ) |
233 responseCode = EMTPRespCodeInvalidDataset; |
226 responseCode = EMTPRespCodeInvalidDataset; |
234 } |
|
235 else if ( KErrNone == err ) // TODO: ( KErrAlreadyExists == err ) |
|
236 { |
|
237 TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( *object, newSuid ) ); //Update MPX DB |
|
238 |
|
239 PRINT1( _L( "MM MTP <> Rename MPX object file name err = %d" ), err ); |
|
240 // it is ok if file is not found in DB, following S60 solution |
|
241 if ( KErrNotFound == err ) |
|
242 { |
|
243 TRAP( err, iDpConfig.GetWrapperL().AddObjectL( *object ) ); |
|
244 PRINT1( _L( "MM MTP <> Add MPX object file name err = %d" ), err ); |
|
245 } |
|
246 |
|
247 object->SetDesCL( CMTPObjectMetaData::ESuid, newSuid ); |
|
248 iFramework.ObjectMgr().ModifyObjectL( *object ); |
|
249 } |
|
250 else if ( KErrInUse == err ) // object file is being used by other program |
|
251 { |
|
252 responseCode = EMTPRespCodeDeviceBusy; |
|
253 } |
|
254 else |
227 else |
255 { |
228 { |
256 responseCode = EMTPRespCodeGeneralError; |
229 TFileName newSuid( ptr ); |
|
230 TInt err = MmMtpDpUtility::UpdateObjectFileName( iFramework.Fs(), suid, newSuid ); |
|
231 PRINT1( _L( "MM MTP <> Update object file name err = %d" ), err ); |
|
232 if ( KErrOverflow == err ) // full path name is too long |
|
233 { |
|
234 responseCode = EMTPRespCodeInvalidDataset; |
|
235 } |
|
236 else if ( KErrNone == err ) // TODO: ( KErrAlreadyExists == err ) |
|
237 { |
|
238 TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( *object, newSuid ) ); //Update MPX DB |
|
239 |
|
240 PRINT1( _L( "MM MTP <> Rename MPX object file name err = %d" ), err ); |
|
241 // it is ok if file is not found in DB, following S60 solution |
|
242 if ( KErrNotFound == err ) |
|
243 { |
|
244 TRAP( err, iDpConfig.GetWrapperL().AddObjectL( *object ) ); |
|
245 PRINT1( _L( "MM MTP <> Add MPX object file name err = %d" ), err ); |
|
246 } |
|
247 |
|
248 object->SetDesCL( CMTPObjectMetaData::ESuid, newSuid ); |
|
249 iFramework.ObjectMgr().ModifyObjectL( *object ); |
|
250 } |
|
251 else if ( KErrInUse == err ) // object file is being used by other program |
|
252 { |
|
253 responseCode = EMTPRespCodeDeviceBusy; |
|
254 } |
|
255 else |
|
256 { |
|
257 responseCode = EMTPRespCodeGeneralError; |
|
258 } |
257 } |
259 } |
258 } |
260 } |
|
261 break; |
|
262 |
|
263 case EMTPObjectPropCodeName: |
|
264 case EMTPObjectPropCodeAlbumArtist: |
|
265 { |
|
266 CMTPTypeString* stringData = CMTPTypeString::NewLC( |
|
267 aPropListElement.StringL( CMTPTypeObjectPropListElement::EValue ) );// + stringData |
|
268 |
|
269 responseCode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapper( iDpConfig, |
|
270 propertyCode, |
|
271 *stringData, |
|
272 *object ); |
|
273 |
|
274 CleanupStack::PopAndDestroy( stringData );// - stringData |
|
275 } |
|
276 break; |
|
277 |
|
278 default: |
|
279 { |
|
280 responseCode = iDpConfig.PropSettingUtility()->SetSpecificObjectPropertyL( iDpConfig, |
|
281 propertyCode, |
|
282 *object, |
|
283 aPropListElement ); |
|
284 } |
|
285 break; |
259 } |
286 } |
260 break; |
287 |
261 |
288 CleanupStack::PopAndDestroy( object ); // - object |
262 case EMTPObjectPropCodeName: |
|
263 case EMTPObjectPropCodeAlbumArtist: |
|
264 { |
|
265 CMTPTypeString* stringData = CMTPTypeString::NewLC( |
|
266 aPropListElement.StringL( CMTPTypeObjectPropListElement::EValue ) );// + stringData |
|
267 |
|
268 responseCode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapper( iDpConfig, |
|
269 propertyCode, |
|
270 *stringData, |
|
271 *object ); |
|
272 |
|
273 CleanupStack::PopAndDestroy( stringData );// - stringData |
|
274 } |
|
275 break; |
|
276 |
|
277 default: |
|
278 { |
|
279 responseCode = iDpConfig.PropSettingUtility()->SetSpecificObjectPropertyL( iDpConfig, |
|
280 propertyCode, |
|
281 *object, |
|
282 aPropListElement ); |
|
283 } |
|
284 break; |
|
285 } |
289 } |
286 |
|
287 CleanupStack::PopAndDestroy( object ); // - object |
|
288 } |
290 } |
289 |
291 |
290 PRINT1( _L( "MM MTP <= CSetObjectPropList::SetObjectPropListL responseCode = 0x%x" ), responseCode ); |
292 PRINT1( _L( "MM MTP <= CSetObjectPropList::SetObjectPropListL responseCode = 0x%x" ), responseCode ); |
291 return responseCode; |
293 return responseCode; |
292 } |
294 } |