--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingmodules/exiflib/src/ExifModify.cpp Thu Dec 17 09:22:31 2009 +0200
@@ -0,0 +1,1166 @@
+/*
+* Copyright (c) 2003, 2004 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: Exif v2.2 file format modifier API implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include "ExifModifyImpl.h"
+#include "ExifReadImpl.h"
+#include "ExifTagImpl.h"
+#include "ExifCore.h"
+#include "ExifCommon.h"
+
+// ============================ CLASS CExifModify ==============================
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CExifModify::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CExifModify* CExifModify::NewL(
+ const TDesC8& aExifData,
+ CExifModify::TOperationMode aOperationMode )
+ {
+ return CExifModifyImpl::NewL( aExifData, STATIC_CAST( TBool,
+ aOperationMode ), CExifModify::ENoOptions );
+ }
+
+EXPORT_C CExifModify* CExifModify::NewL(
+ const TDesC8& aExifData,
+ CExifModify::TOperationMode aOperationMode,
+ TUint aExifModifyOption )
+ {
+ return CExifModifyImpl::NewL( aExifData, STATIC_CAST( TBool,
+ aOperationMode ), aExifModifyOption );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModify::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CExifModify* CExifModify::NewL()
+ {
+ return CExifModifyImpl::NewL();
+ }
+
+// Destructor
+CExifModify::~CExifModify()
+ {
+ }
+
+
+// ============================ CLASS CExifModifyImpl ==========================
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::CExifModifyImpl
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CExifModifyImpl::CExifModifyImpl()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::ConstructL( const TDesC8& aInData, TBool aCreate, TUint aExifModifyOption )
+ {
+ iExifModifyOption = aExifModifyOption;
+ TUint readOption = CExifRead::ENoOptions;
+ if ( aExifModifyOption & CExifModify::ENoJpegParsing )
+ {
+ readOption |= CExifRead::EFastJpegParsing;
+ }
+ if ( aExifModifyOption & CExifModify::ENoTagChecking )
+ {
+ readOption |= CExifRead::ENoTagChecking;
+ }
+ iExifRead = CExifReadImpl::NewL( aInData, aCreate, readOption );
+ iExifCore = iExifRead->iExifCore;
+
+ if ( !aCreate )
+ {
+ if ( iExifCore->IfdExists( EIfdGps ) )
+ {
+ iExifCore->SetTagDataL( KIdGpsVersion, KGpsVersion );
+ }
+ }
+ iExifCore->SetTagDataL( KIdExifVersion, KExifVersion );
+ iExifCore->SetTagDataL( KIdFlashPixVersion, KFlashPixVersion );
+
+ // Keep some data from the beginning, middle and end for cross-checking.
+ iCrossCheckLength = aInData.Length();
+ iCrossCheckBegin = TExifCommon::Uint32L(
+ CONST_CAST( TUint8*, aInData.Ptr() ) );
+ iCrossCheckMiddle = TExifCommon::Uint32L(
+ CONST_CAST( TUint8*, aInData.Ptr() ) + aInData.Length() / 2 );
+ iCrossCheckEnd = TExifCommon::Uint32L(
+ CONST_CAST( TUint8*, aInData.Ptr() ) + aInData.Length() - 5 );
+
+ User::LeaveIfError( iExifCore->Finalize() );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::ConstructL()
+ {
+ iExifModifyOption = CExifModify::ENoOptions;
+ iExifRead = CExifReadImpl::NewL();
+ iExifCore = iExifRead->iExifCore;
+
+ iExifCore->SetTagDataL( KIdExifVersion, KExifVersion );
+ iExifCore->SetTagDataL( KIdFlashPixVersion, KFlashPixVersion );
+
+ // No cross-checking since there is no input data.
+ iCrossCheckLength = 0;
+
+ User::LeaveIfError( iExifCore->Finalize() );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CExifModifyImpl* CExifModifyImpl::NewL( const TDesC8& aExifData, TBool aCreate, TUint aExifModifyOption )
+ {
+ CExifModifyImpl* self = new( ELeave ) CExifModifyImpl();
+ CleanupStack::PushL( self );
+ self->ConstructL( aExifData, aCreate, aExifModifyOption );
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CExifModifyImpl* CExifModifyImpl::NewL()
+ {
+ CExifModifyImpl* self = new( ELeave ) CExifModifyImpl();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// Destructor
+CExifModifyImpl::~CExifModifyImpl()
+ {
+ if ( iExifRead )
+ {
+ delete iExifRead;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::Reader
+// Returns a constant pointer to a CExifRead instance that can be used to
+// parse the associated Exif image.
+// -----------------------------------------------------------------------------
+//
+const CExifRead* CExifModifyImpl::Reader() const
+ {
+ return iExifRead;
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetTagL
+// Inserts/Updates the given tag in the specified IFD structure of the Exif data
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetTagL(
+ TExifIfdType aIfdType,
+ TExifTagInfo aExifTagInfo,
+ const TDesC8& aTagData )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ // Check if ASCII string terminates with NULL character.
+ // If not add NULL.
+ HBufC8* buffer = NULL;
+ if ( ( aExifTagInfo.iDataType == CExifTag::ETagAscii ) &&
+ ( aTagData.Ptr()[aTagData.Length() - 1] ) )
+ {
+ ++aExifTagInfo.iDataCount;
+ buffer = HBufC8::NewL( aTagData.Length() + 1 );
+ buffer->Des().Copy( aTagData );
+ *( CONST_CAST( TUint8*, buffer->Des().Ptr() ) +
+ aTagData.Length() ) = NULL;
+ buffer->Des().SetLength( aTagData.Length() + 1 );
+ }
+ else
+ {
+ buffer = aTagData.AllocL();
+ }
+ CleanupStack::PushL( buffer );
+ CExifTagImpl* tag = NULL;
+ if ( iExifModifyOption & CExifModify::ENoTagChecking )
+ {
+ tag = CExifTagImpl::NewL( aExifTagInfo, buffer, EFalse );
+ }
+ else
+ {
+ tag = CExifTagImpl::NewL( aExifTagInfo, buffer, ETrue );
+ }
+ CleanupStack::Pop( buffer );
+ CleanupStack::PushL( tag );
+
+ switch ( tag->TagInfo().iId )
+ {
+ case KIdExifIfdPointer:
+ case KIdGpsIfdPointer:
+ case KIdIntOpIfdPointer:
+ case KIdJpegInterchangeFormat:
+ case KIdJpegInterchangeFormatLength:
+ case KIdExifVersion:
+ case KIdGpsVersion:
+ case KIdFlashPixVersion:
+ case KIdCompression:
+ User::Leave( KErrNotSupported );
+ default:
+ break;
+ }
+
+ if ( iExifModifyOption & CExifModify::ENoTagChecking )
+ {
+ iExifCore->InsertTagL( aIfdType, tag, EFalse );
+ }
+ else
+ {
+ iExifCore->InsertTagL( aIfdType, tag, ETrue );
+ }
+ CleanupStack::Pop( tag );
+ if ( aIfdType == EIfdGps )
+ {
+ iExifCore->SetTagDataL( KIdGpsVersion, KGpsVersion );
+ }
+ TInt error = iExifCore->Finalize();
+ if ( error )
+ {
+ iExifCore->DeleteTag( aIfdType, aExifTagInfo.iId );
+ User::Leave( error );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::DeleteTag
+// Removes the tag with the given tag ID from the specified IFD structure in
+// the Exif data.
+// -----------------------------------------------------------------------------
+//
+TInt CExifModifyImpl::DeleteTag( TExifIfdType aIfdType, TUint16 aTagId )
+ {
+ if ( !iExifCore )
+ {
+ return KErrGeneral;
+ }
+
+ switch ( aTagId )
+ {
+ case KIdExifIfdPointer:
+ case KIdGpsIfdPointer:
+ case KIdIntOpIfdPointer:
+ case KIdJpegInterchangeFormat:
+ case KIdJpegInterchangeFormatLength:
+ case KIdExifVersion:
+ case KIdGpsVersion:
+ case KIdFlashPixVersion:
+ case KIdCompression:
+ return KErrNotSupported;
+ default:
+ if ( !TExifCommon::IsValidTagId( aTagId ) )
+ {
+ return KErrNotSupported;
+ }
+ }
+
+ TInt error = iExifCore->DeleteTag( aIfdType, aTagId );
+ if ( error )
+ {
+ return error;
+ }
+ return iExifCore->Finalize();
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::DeleteIfd
+// Removes the specified IFD structure and all its tags from the Exif data.
+// -----------------------------------------------------------------------------
+//
+TInt CExifModifyImpl::DeleteIfd( TExifIfdType aIfdType )
+ {
+ if ( !iExifCore )
+ {
+ return KErrGeneral;
+ }
+
+ if ( ( aIfdType == EIfd0 ) || ( aIfdType == EIfdExif ) )
+ {
+ return KErrArgument;
+ }
+
+ TInt error = iExifCore->DeleteIfd( aIfdType );
+ if ( error )
+ {
+ return error;
+ }
+ return iExifCore->Finalize();
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetThumbnailL
+// Inserts/Updates the given thumbnail Jpeg image data into the 1st IFD
+// structure in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetThumbnailL( const TDesC8& aThumbnailData )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+ TDesC8* data = aThumbnailData.AllocL();
+ CleanupStack::PushL( data );
+ iExifCore->InsertThumbnailL( data );
+ CleanupStack::Pop( data );
+ TInt error = iExifCore->Finalize();
+ if ( error )
+ {
+ iExifCore->RemoveThumbnail();
+ User::Leave( error );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::RemoveThumbnail
+// Removes the thumbnail Jpeg image data from the 1st IFD structure in the Exif
+// data.
+// -----------------------------------------------------------------------------
+//
+TInt CExifModifyImpl::RemoveThumbnail()
+ {
+ if ( !iExifCore )
+ {
+ return KErrGeneral;
+ }
+
+ TInt error = iExifCore->RemoveThumbnail();
+ if ( error )
+ {
+ return error;
+ }
+ return iExifCore->Finalize();
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::WriteDataL
+// Flushes the Exif data into the given data buffer, and releases the internal
+// structures.
+// -----------------------------------------------------------------------------
+//
+HBufC8* CExifModifyImpl::WriteDataL( const TDesC8& aInData )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ // Input Jpeg or Exif data is provided at instantiation (or not)
+ TBool inputProvidedEarly = iCrossCheckLength;
+
+ // Input Jpeg or Exif data is provided for this function (or not)
+ TBool inputProvidedLate = aInData.Length();
+
+ if ( inputProvidedEarly )
+ {
+ if ( inputProvidedLate )
+ {
+ // Cross-check. Check if content of aInData is identical with
+ // the descriptor provided during instantiation.
+ if ( aInData.Length() != iCrossCheckLength )
+ {
+ User::Leave(KErrArgument);
+ }
+ TUint32 crossCheck = TExifCommon::Uint32L(
+ CONST_CAST( TUint8*, aInData.Ptr() ) );
+ if ( crossCheck != iCrossCheckBegin )
+ {
+ User::Leave(KErrArgument);
+ }
+ crossCheck = TExifCommon::Uint32L(
+ CONST_CAST( TUint8*, aInData.Ptr() + aInData.Length() / 2 ) );
+ if ( crossCheck != iCrossCheckMiddle )
+ {
+ User::Leave(KErrArgument);
+ }
+ crossCheck = TExifCommon::Uint32L(
+ CONST_CAST( TUint8*, aInData.Ptr() + aInData.Length() - 5 ) );
+ if ( crossCheck != iCrossCheckEnd )
+ {
+ User::Leave(KErrArgument);
+ }
+ }
+ }
+ else
+ {
+ if ( inputProvidedLate )
+ {
+ iExifRead->ParseJpegDataL( aInData );
+ }
+ }
+
+ User::LeaveIfError( iExifCore->Finalize() );
+
+ if ( !iExifCore->IsValid() )
+ {
+ User::Leave( KErrNotReady );
+ }
+
+ TUint totalSize = 0;
+ if ( inputProvidedLate )
+ {
+ iExifCore->SetDataStartPtr( CONST_CAST( TUint8*, aInData.Ptr() ) );
+ totalSize = iExifCore->TotalSize();
+ }
+ else
+ {
+ totalSize = iExifCore->App1Size() + 2;
+ }
+ // Allocation amount is even for 2-byte alignment
+ HBufC8* exifData = HBufC8::NewLC( totalSize + ( totalSize % 2 ) );
+ exifData->Des().SetLength( totalSize + ( totalSize % 2 ) );
+ TUint pos = 0;
+ if ( inputProvidedLate )
+ {
+ iExifCore->WriteJpegHeaderL( exifData, pos );
+ iExifCore->WriteExifDataL( exifData, pos );
+ TPtr8 ptr( CONST_CAST( TUint8*, exifData->Ptr() ) + pos,
+ iExifCore->JpegSize() );
+ User::LeaveIfError( iExifCore->GetJpegData( ptr ) );
+ }
+ else
+ {
+ iExifCore->WriteExifDataL( exifData, pos );
+ }
+ exifData->Des().SetLength( totalSize );
+ CleanupStack::Pop();
+ return exifData;
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetImageDescriptionL
+// Inserts/Updates given ImageDescription in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetImageDescriptionL( const TDesC8& aImageDescription )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdImageDescription, aImageDescription );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetMakeL
+// Inserts/Updates given Make in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetMakeL( const TDesC8& aMake )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdMake, aMake );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetModelL
+// Inserts/Updates given Model in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetModelL( const TDesC8& aModel )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdModel, aModel );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetOrientationL
+// Inserts/Updates given Orientation in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetOrientationL( TUint16 aOrientation )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdOrientation, aOrientation );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetXResolutionL
+// Inserts/Updates given X Resolution in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetXResolutionL(
+ TUint32 aXResolution1,
+ TUint32 aXResolution2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdXResolution, aXResolution1, aXResolution2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetYResolutionL
+// Inserts/Updates given Y Resolution in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetYResolutionL(
+ TUint32 aYResolution1,
+ TUint32 aYResolution2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdYResolution, aYResolution1, aYResolution2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetResolutionUnitL
+// Inserts/Updates given Resolution Unit in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetResolutionUnitL( TUint16 aResolutionUnit )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdResolutionUnit, aResolutionUnit );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetTransferFunctionL
+// Inserts/Updates given Transfer Function in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetTransferFunctionL( const TDesC8& aTransferFunction )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdTransferFunction, aTransferFunction );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetDateTimeL
+// Inserts/Updates given Date Time in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetDateTimeL( const TDesC8& aDateTime )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdDateTime, aDateTime );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetYCbCrPositioningL
+// Inserts/Updates given YCbCr Positioning in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetYCbCrPositioningL( TUint16 aYCbCrPositioning )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdYCbCrPositioning, aYCbCrPositioning );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetSoftwareL
+// Inserts/Updates given Software in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetSoftwareL( const TDesC8& aSoftware )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdSoftware, aSoftware );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetCopyrightL
+// Inserts/Updates given Copyright in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetCopyrightL( const TDesC8& aCopyright )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdCopyright, aCopyright );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetExposureTimeL
+// Inserts/Updates given Exposure Time in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetExposureTimeL(
+ TUint32 aExposureTime1,
+ TUint32 aExposureTime2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdExposureTime, aExposureTime1, aExposureTime2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetComponentsConfigurationL
+// Inserts/Updates given Components Configuration in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetComponentsConfigurationL(
+ TUint8 aFirstComponent, TUint8 aSecondComponent,
+ TUint8 aThirdComponent, TUint8 aFourthComponent )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ TUint32 componentsConfiguration = ( aFourthComponent << 24 ) +
+ ( aThirdComponent << 16 ) + ( aSecondComponent << 8 ) + aFirstComponent;
+ iExifCore->SetTagDataL( KIdComponentsConfiguration,
+ componentsConfiguration );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetFlashL
+// Inserts/Updates given Flash in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetFlashL( TUint16 aFlash )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdFlash, aFlash );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetColorSpaceL
+// Inserts/Updates given Color Space in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetColorSpaceL( TUint16 aColorSpace )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdColorSpace, aColorSpace );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetPixelXDimensionL
+// Inserts/Updates given Pixel X Dimension in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetPixelXDimensionL( TUint32 aPixelXDimension )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdPixelXDimension, aPixelXDimension );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetPixelYDimensionL
+// Inserts/Updates given Pixel Y Dimension in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetPixelYDimensionL( TUint32 aPixelYDimension )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdPixelYDimension, aPixelYDimension );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetExposureModeL
+// Inserts/Updates given Exposure Mode in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetExposureModeL( TUint16 aExposureMode )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdExposureMode, aExposureMode );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetWhiteBalanceL
+// Inserts/Updates given White Balance in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetWhiteBalanceL( TUint16 aWhiteBalance )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdWhiteBalance, aWhiteBalance );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetSceneCaptureTypeL
+// Inserts/Updates given Scene Capture Type in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetSceneCaptureTypeL( TUint16 aSceneCaptureType )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdSceneCaptureType, aSceneCaptureType );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetExposureProgramL
+// Inserts/Updates given Exposure Program in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetExposureProgramL( TUint16 aExposureProgram )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdExposureProgram, aExposureProgram );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetIsoSpeedRatingsL
+// Inserts/Updates given Iso Speed Ratings in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetIsoSpeedRatingsL( const TDesC8& aIsoSpeedRatings )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdIsoSpeedRatings, aIsoSpeedRatings );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetDateTimeOriginalL
+// Inserts/Updates given Date Time Original in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetDateTimeOriginalL( const TDesC8& aDateTimeOriginal )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdDateTimeOriginal, aDateTimeOriginal );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetDateTimeDigitizedL
+// Inserts/Updates given Date Time Digitized in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetDateTimeDigitizedL( const TDesC8& aDateTimeDigitized )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdDateTimeDigitized, aDateTimeDigitized );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetApertureValueL
+// Inserts/Updates given Aperture Value in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetApertureValueL(
+ TUint32 aApertureValue1,
+ TUint32 aApertureValue2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL(
+ KIdApertureValue, aApertureValue1, aApertureValue2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetExposureBiasValueL
+// Inserts/Updates given Exposure Bias Value in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetExposureBiasValueL(
+ TInt32 aExposureBiasValue1,
+ TInt32 aExposureBiasValue2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdExposureBiasValue,
+ aExposureBiasValue1, aExposureBiasValue2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetMeteringModeL
+// Inserts/Updates given Metering Mode in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetMeteringModeL( TUint16 aMeteringMode )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdMeteringMode, aMeteringMode );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetLightSourceL
+// Inserts/Updates given Light Source in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetLightSourceL( TUint16 aLightSource )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdLightSource, aLightSource );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetMakerNoteL
+// Inserts/Updates given Maker Note in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetMakerNoteL( const TDesC8& aMakerNote )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdMakerNote, aMakerNote );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetUserCommentL
+// Inserts/Updates given User Comment in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetUserCommentL( const TDesC8& aUserComment )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+ iExifCore->SetTagDataL( KIdUserComment, aUserComment );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetRelatedSoundFileL
+// Inserts/Updates given Related Sound File in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetRelatedSoundFileL( const TDesC8& aRelatedSoundFile )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdRelatedSoundFile, aRelatedSoundFile );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetFileSourceL
+// Inserts/Updates given FileSource in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetFileSourceL(TInt8 aFileSource )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdFileSource, aFileSource );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetDigitalZoomRatioL
+// Inserts/Updates given Digital Zoom Ratio in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetDigitalZoomRatioL(
+ TUint32 aDigitalZoomRatio1,
+ TUint32 aDigitalZoomRatio2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdDigitalZoomRatio,
+ aDigitalZoomRatio1, aDigitalZoomRatio2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetContrastL
+// Inserts/Updates given Contrast in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetContrastL( TUint16 aContrast )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdContrast, aContrast );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetSaturationL
+// Inserts/Updates given Saturation in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetSaturationL( TUint16 aSaturation )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdSaturation, aSaturation );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetSharpnessL
+// Inserts/Updates given Sharpness in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetSharpnessL( TUint16 aSharpness )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdSharpness, aSharpness );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetThumbnailXResolutionL
+// Inserts/Updates given Thumbnail X Resolution in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetThumbnailXResolutionL(
+ TUint32 aXResolution1,
+ TUint32 aXResolution2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetThumbnailTagDataL(KIdXResolution,
+ aXResolution1, aXResolution2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetThumbnailYResolutionL
+// Inserts/Updates given Thumbnail Y Resolution in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetThumbnailYResolutionL(
+ TUint32 aYResolution1,
+ TUint32 aYResolution2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetThumbnailTagDataL(KIdYResolution,
+ aYResolution1, aYResolution2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetThumbnailResolutionUnitL
+// Inserts/Updates given Thumbnail Resolution Unit in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetThumbnailResolutionUnitL( TUint16 aResolutionUnit )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetThumbnailTagDataL(KIdResolutionUnit, aResolutionUnit );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetShutterSpeedValueL
+// Inserts/Updates given Shutter Speed Value in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetShutterSpeedValueL(
+ TInt32 aShutterSpeedValue1,
+ TInt32 aShutterSpeedValue2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL(KIdShutterSpeedValue,
+ aShutterSpeedValue1, aShutterSpeedValue2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetBrightnessValueL
+// Inserts/Updates given Brightness Value in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetBrightnessValueL(
+ TInt32 aBrightnessValue1,
+ TInt32 aBrightnessValue2 )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL(KIdBrightnessValue,
+ aBrightnessValue1, aBrightnessValue2 );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetCustomRenderedL
+// Inserts/Updates given Custom Rendered in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetCustomRenderedL( TUint16 aCustomRendered )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdCustomRendered, aCustomRendered );
+ }
+
+// -----------------------------------------------------------------------------
+// CExifModifyImpl::SetGainControlL
+// Inserts/Updates given Gain Control in the Exif data.
+// -----------------------------------------------------------------------------
+//
+void CExifModifyImpl::SetGainControlL( TUint16 aGainControl )
+ {
+ if ( !iExifCore )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iExifCore->SetTagDataL( KIdGainControl, aGainControl );
+ }