diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_mmfdes_8cpp-source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/_mmfdes_8cpp-source.html Tue Mar 30 11:56:28 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,404 +0,0 @@ - -
-00001 // mmfdes.cpp -00002 // -00003 // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). -00004 // All rights reserved. -00005 // This component and the accompanying materials are made available -00006 // under the terms of "Eclipse Public License v1.0" -00007 // which accompanies this distribution, and is available -00008 // at the URL "http://www.eclipse.org/legal/epl-v10.html". -00009 // -00010 // Initial Contributors: -00011 // Nokia Corporation - initial contribution. -00012 // -00013 // Contributors: -00014 // -00015 // Description: -00016 // -00017 -00018 -00019 -00020 #include <f32file.h> -00021 #include <e32std.h> -00022 #include <mmfdatabuffer.h> -00023 -00024 #include "mmfexdes.h" -00025 #include "MmfExSinkSourceUIDs.hrh" -00026 -00027 // Panic function -00028 void Panic(TMMFExDescriptorPanicCode aPanicCode) -00029 { -00030 _LIT(KMMFExDescriptorPanicCategory, "MMFExDescriptor"); -00031 User::Panic(KMMFExDescriptorPanicCategory, aPanicCode); -00032 } -00033 -00034 // -00035 // CMMFExDescriptor -00036 // -00037 -00038 // Plugin implementation UIDs -00039 const TUid KDescriptorSourceUIDObject = {KDescriptorSourceUID}; -00040 const TUid KDescriptorSinkUIDObject = {KDescriptorSinkUID}; -00041 -00042 // Constructor -00043 CMMFExDescriptor::CMMFExDescriptor( ) : CMMFClip( TUid(KDescriptorSourceUIDObject), TUid(KDescriptorSinkUIDObject )) -00044 { -00045 iOffset = 0 ; -00046 } -00047 -00048 // Destructor -00049 CMMFExDescriptor::~CMMFExDescriptor() -00050 { -00051 iDesThread.Close() ; -00052 } -00053 -00054 // Factory function for source plug-in -00055 MDataSource* CMMFExDescriptor::NewSourceL( ) -00056 { -00057 CMMFExDescriptor* self = new (ELeave) CMMFExDescriptor( ) ; -00058 return STATIC_CAST( MDataSource*, self ) ; -00059 } -00060 -00061 // Factory function for sink plug-in -00062 MDataSink* CMMFExDescriptor::NewSinkL( ) -00063 { -00064 CMMFExDescriptor* self = new (ELeave) CMMFExDescriptor( ) ; -00065 return STATIC_CAST( MDataSink*, self ) ; -00066 } -00067 -00068 // MDataSource factory -00069 // aInitData is a packaged TMMFExDescriptorParams -00070 void CMMFExDescriptor::ConstructSourceL( const TDesC8& aInitData ) -00071 { -00072 ConstructL( aInitData ) ; -00073 } -00074 -00075 // MDataSink factory -00076 // aInitData is a packaged TMMFExDescriptorParams -00077 void CMMFExDescriptor::ConstructSinkL( const TDesC8& aInitData ) -00078 { -00079 ConstructL( aInitData ) ; -00080 } -00081 -00082 // Construction helper -00083 // aInitData is a packaged TMMFExDescriptorParams -00084 void CMMFExDescriptor::ConstructL( const TDesC8& aInitData ) -00085 { -00086 // get descriptor to which to read/write, and the thread -00087 // to which it belongs -00088 TMMFExDescriptorParams params; -00089 TPckgC<TMMFExDescriptorParams> config(params); -00090 config.Set(aInitData); -00091 iDes = STATIC_CAST( TDes8*, config().iDes); -00092 User::LeaveIfError( iDesThread.Open( config().iDesThreadId ) ); -00093 } -00094 -00095 -00096 // From MDataSource -00097 -00098 TFourCC CMMFExDescriptor::SourceDataTypeCode(TMediaId /*aMediaId*/) -00099 { -00100 return iSourceFourCC ; -00101 } -00102 -00103 // Fills a buffer from the source descriptor -00104 void CMMFExDescriptor::FillBufferL( CMMFBuffer* aBuffer, MDataSink* aConsumer, TMediaId /*aMediaId*/ ) -00105 { -00106 // Current position in Descriptor is iOffset. -00107 -00108 // Read from iDes in iDesThread into Des in aBuffer. -00109 -00110 // Assume that the amount to be read is the size of the buffer descriptor -00111 // Should check that there is sufficient data in the source buffer -00112 // If there is not enough to fill the target then copy what there is -00113 -00114 // Use of a single iOffset will preclude use by more than one client (use ReadBufferL()) -00115 if ( aBuffer->Type() == KUidMmfDataBuffer ) -00116 { -00117 TDes8& bufferDes = STATIC_CAST(CMMFDataBuffer*, aBuffer)->Data(); -00118 TInt targetMaxLength = bufferDes.MaxLength(); -00119 TInt sourceLength = iDes->Length(); -00120 -00121 if ( ( sourceLength - iOffset - targetMaxLength ) > 0 ) -00122 { -00123 bufferDes = iDes->Mid(iOffset,targetMaxLength); -00124 iOffset += targetMaxLength; -00125 } -00126 else -00127 bufferDes.SetLength(0); -00128 -00129 // Check if the buffer is the last buffer and if so set the last buffer flag on the CMMFDataBuffer -00130 TInt requestSize = aBuffer->RequestSize(); -00131 if (requestSize) -00132 { // The buffer has a request size - so assume last buffer if length is less than the request size -00133 if (bufferDes.Length() < requestSize) -00134 aBuffer->SetLastBuffer(ETrue); -00135 } -00136 else -00137 { // There is no request size so assume last buffer if length is less than the max length -00138 if (bufferDes.Length() < bufferDes.MaxLength()) -00139 aBuffer->SetLastBuffer(ETrue); -00140 } -00141 -00142 aConsumer->BufferFilledL( aBuffer ) ; -00143 } -00144 else -00145 User::Leave(KErrNotSupported); -00146 } -00147 -00148 // called by MDataSink to pass back emptied buffer to the source -00149 void CMMFExDescriptor::BufferEmptiedL( CMMFBuffer* /*aBuffer*/ ) -00150 { -00151 // not supported in this plug-in -00152 __ASSERT_DEBUG(EFalse, Panic(EMMFDescriptorPanicBufferEmptiedLNotSupported)); -00153 } -00154 -00155 // tests if the plug-in can create a source buffer -00156 TBool CMMFExDescriptor::CanCreateSourceBuffer() -00157 { -00158 // this can't: it needs a descriptor from another thread -00159 return EFalse ; -00160 } -00161 -00162 // creates a source buffer -00163 CMMFBuffer* CMMFExDescriptor::CreateSourceBufferL( TMediaId /*aMediaId*/, TBool& /*aReference*/ ) -00164 { -00165 // is not supported in this plug-in -00166 User::Leave(KErrNotSupported); -00167 return NULL; -00168 } -00169 -00170 -00171 // from MDataSink -00172 -00173 // gets sink codec type -00174 TFourCC CMMFExDescriptor::SinkDataTypeCode(TMediaId /*aMediaId*/) -00175 { -00176 return iSinkFourCC ; -00177 } -00178 -00179 // Empties supplied buffer into the sink descriptor -00180 void CMMFExDescriptor::EmptyBufferL( CMMFBuffer* aBuffer, MDataSource* aSupplier, TMediaId /*aMediaId*/ ) -00181 { -00182 // Current position in Descriptor is iOffset. -00183 -00184 // Assume that the amount to be read is the size of the buffer descriptor -00185 // Should check that there is sufficient data in the source buffer -00186 // If there is not enough to fill the target then copy what there is -00187 -00188 // Use of a single iOffset will preclude use by more than one client (use ReadBufferL()) -00189 -00190 if ( aBuffer->Type() == KUidMmfDataBuffer ) -00191 { -00192 TDes8& bufferDes = STATIC_CAST(CMMFDataBuffer*, aBuffer)->Data(); -00193 -00194 TInt sourceLength = bufferDes.Length() ; -00195 TInt targetLength = iDes->MaxLength() - iOffset; -00196 if ( targetLength>0 ) -00197 { -00198 if (sourceLength>targetLength) -00199 { -00200 sourceLength = targetLength; -00201 bufferDes.SetLength(targetLength); -00202 } -00203 -00204 iDes->Append(bufferDes) ; -00205 -00206 iOffset += sourceLength ; -00207 } -00208 else -00209 bufferDes.SetLength(0); -00210 -00211 aSupplier->BufferEmptiedL( aBuffer ) ; -00212 } -00213 } -00214 -00215 // called by MDataSource to pass back full buffer to the sink -00216 void CMMFExDescriptor::BufferFilledL( CMMFBuffer* /*aBuffer*/ ) -00217 { -00218 // not supported in this plug-in -00219 __ASSERT_DEBUG(EFalse, Panic(EMMFDescriptorPanicBufferFilledLNotSupported)); -00220 } -00221 -00222 // tests if the plug-in can create a sink buffer -00223 TBool CMMFExDescriptor::CanCreateSinkBuffer() -00224 { -00225 // this can't: it needs a descriptor from another thread -00226 return EFalse ; -00227 } -00228 -00229 // creates a sink buffer -00230 CMMFBuffer* CMMFExDescriptor::CreateSinkBufferL( TMediaId /*aMediaId*/ , TBool& /*aReference*/) -00231 { -00232 // not supported in this plug-in -00233 User::Leave(KErrNotSupported); -00234 return NULL; -00235 } -00236 -00237 // from CMMFClip -00238 -00239 // Loads aBuffer with specified amount of data from a specified point in the source descriptor -00240 void CMMFExDescriptor::ReadBufferL(TInt aLength, CMMFBuffer* aBuffer, TInt aPosition, MDataSink* aConsumer) -00241 { -00242 if (aBuffer->Type() == KUidMmfDataBuffer) -00243 { -00244 TDes8& bufferDes = STATIC_CAST(CMMFDataBuffer*, aBuffer)->Data(); -00245 -00246 if (aLength>bufferDes.MaxLength()) -00247 User::Leave(KErrOverflow); -00248 -00249 if ((aLength<0) || (aPosition<0)) -00250 User::Leave(KErrArgument); -00251 -00252 ReadBufferL(aBuffer, aPosition, aConsumer); -00253 } -00254 else -00255 User::Leave(KErrNotSupported); -00256 } -00257 -00258 // Loads aBuffer from a specified point in the source descriptor -00259 void CMMFExDescriptor::ReadBufferL(CMMFBuffer* aBuffer, TInt aPosition, MDataSink* aConsumer) -00260 { -00261 if (aBuffer->Type() == KUidMmfDataBuffer) -00262 { -00263 TDes8& bufferDes = STATIC_CAST(CMMFDataBuffer*, aBuffer)->Data(); -00264 -00265 TInt sourceLength = iDes->Length() ; -00266 TInt destinationMaxLength = bufferDes.MaxLength(); -00267 TInt len = sourceLength - aPosition; -00268 if (len > destinationMaxLength) -00269 len = destinationMaxLength; -00270 -00271 if (len>0) -00272 { -00273 TPtrC8 srcPtr(iDes->Mid(aPosition,len)); -00274 bufferDes.Copy(srcPtr); -00275 } -00276 else -00277 bufferDes.SetLength(0); -00278 -00279 // Check if the buffer is the last buffer and if so set the last buffer flag on the CMMFDataBuffer -00280 TInt requestSize = aBuffer->RequestSize(); -00281 if (requestSize) -00282 { // The buffer has a request size - so assume last buffer if length is less than the request size -00283 if (bufferDes.Length() < requestSize) -00284 aBuffer->SetLastBuffer(ETrue); -00285 } -00286 else -00287 { // There is no request size so assume last buffer if length is less than the max length -00288 if (bufferDes.Length() < bufferDes.MaxLength()) -00289 aBuffer->SetLastBuffer(ETrue); -00290 } -00291 -00292 if (aConsumer) -00293 aConsumer->BufferFilledL(aBuffer); -00294 } -00295 else -00296 User::Leave(KErrNotSupported); -00297 } -00298 -00299 // Loads aBuffer from a specified point in the source descriptor -00300 // This is intended for synchronous usage -00301 void CMMFExDescriptor::ReadBufferL(CMMFBuffer* aBuffer, TInt aPosition) -00302 { -00303 ReadBufferL(aBuffer, aPosition, NULL); -00304 } -00305 -00306 // Writes aBuffer at specified location into the sink descriptor -00307 void CMMFExDescriptor::WriteBufferL(CMMFBuffer* aBuffer, TInt aPosition, MDataSource* aSupplier) -00308 { -00309 if (aBuffer->Type() == KUidMmfDataBuffer) -00310 { -00311 TDes8& bufferDes = STATIC_CAST(CMMFDataBuffer*, aBuffer)->Data(); -00312 -00313 WriteBufferL(bufferDes.Length(), aBuffer, aPosition, aSupplier); -00314 } -00315 else -00316 User::Leave(KErrNotSupported); -00317 } -00318 -00319 // Writes specified length of aBuffer at specified location into the sink descriptor -00320 void CMMFExDescriptor::WriteBufferL(TInt aLength, CMMFBuffer* aBuffer, TInt aPosition, MDataSource* aSupplier) -00321 { -00322 if (aBuffer->Type() == KUidMmfDataBuffer) -00323 { -00324 TDes8& bufferDes = STATIC_CAST(CMMFDataBuffer*, aBuffer)->Data(); -00325 -00326 if (aLength>bufferDes.Length() || (aLength<0) || (aPosition<0)) -00327 User::Leave(KErrArgument); -00328 -00329 TInt sourceLength = aLength; -00330 TPtr8 bufferPtr(((sourceLength) ? &bufferDes[0] : NULL), sourceLength, sourceLength); -00331 TInt targetLength = iDes->MaxLength() - aPosition; -00332 if (targetLength>0 && sourceLength > 0) -00333 { -00334 if (sourceLength>targetLength) -00335 User::Leave(KErrOverflow); -00336 -00337 if ((iDes->Length() - aPosition) > 0) -00338 { -00339 TInt bytesToReplace = iDes->Length() - aPosition; -00340 if (sourceLength > bytesToReplace) -00341 { -00342 TPtrC8 replaceBuf = bufferPtr.Left(bytesToReplace); -00343 TPtrC8 appendBuf = bufferPtr.Right(sourceLength-bytesToReplace); -00344 iDes->Replace(aPosition, bytesToReplace, replaceBuf); -00345 iDes->Append(appendBuf); -00346 } -00347 else -00348 iDes->Replace(aPosition, sourceLength, bufferPtr); -00349 -00350 } -00351 else if (aPosition == iDes->Length()) -00352 iDes->Append(bufferPtr.Ptr(),sourceLength); -00353 else -00354 { -00355 iDes->AppendFill(0,aPosition - iDes->Length()); -00356 iDes->Append(bufferPtr.Ptr(),sourceLength); -00357 } -00358 } -00359 else if (targetLength<0) -00360 User::Leave(KErrArgument); -00361 else if (aLength != 0) -00362 User::Leave(KErrOverflow); -00363 -00364 if (aSupplier) -00365 aSupplier->BufferEmptiedL(aBuffer); -00366 } -00367 else -00368 User::Leave(KErrNotSupported); -00369 } -00370 -00371 // Writes aBuffer at specified location into the sink descriptor -00372 void CMMFExDescriptor::WriteBufferL( CMMFBuffer* aBuffer, TInt aPosition) -00373 { -00374 WriteBufferL( aBuffer, aPosition, NULL ); -00375 } -00376 -00377 // Gets the space available in the clip -00378 TInt64 CMMFExDescriptor::BytesFree() -00379 { -00380 // get difference between length and maxlength -00381 TInt64 length = iDes->Length() ; -00382 TInt64 maxLength = iDes->MaxLength() ; -00383 return( maxLength - length ) ; -00384 } -00385 -00386 // Gets the size of the clip -00387 TInt CMMFExDescriptor::Size() -00388 { -00389 // Length (not max length) of descriptor -00390 TInt length = iDes->Length(); -00391 return(length); -00392 } -