diff options
author | Hubert Figuière <hub@figuiere.net> | 2013-05-14 18:21:26 -0400 |
---|---|---|
committer | Hubert Figuière <hub@figuiere.net> | 2013-05-14 18:21:26 -0400 |
commit | 81a4c6bcb1879cb321246590faca595e9746f8e5 (patch) | |
tree | cf92c416eb3e41708149905abd0030680aebadf5 /source/XMPFiles/FormatSupport/ASF_Support.cpp | |
parent | 42dbac60f15e038270d6e0c7285caba8256e86f1 (diff) |
Update to XMP SDK CS6
Diffstat (limited to 'source/XMPFiles/FormatSupport/ASF_Support.cpp')
-rw-r--r-- | source/XMPFiles/FormatSupport/ASF_Support.cpp | 1436 |
1 files changed, 0 insertions, 1436 deletions
diff --git a/source/XMPFiles/FormatSupport/ASF_Support.cpp b/source/XMPFiles/FormatSupport/ASF_Support.cpp deleted file mode 100644 index 1180f9d..0000000 --- a/source/XMPFiles/FormatSupport/ASF_Support.cpp +++ /dev/null @@ -1,1436 +0,0 @@ -// ================================================================================================= -// ADOBE SYSTEMS INCORPORATED -// Copyright 2006 Adobe Systems Incorporated -// All Rights Reserved -// -// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms -// of the Adobe license agreement accompanying it. -// ================================================================================================= - -#include "ASF_Support.hpp" -#include "UnicodeConversions.hpp" - -#if XMP_WinBuild - #define snprintf _snprintf - #pragma warning ( disable : 4996 ) // '...' was declared deprecated - #pragma warning ( disable : 4267 ) // *** conversion (from size_t), possible loss of date (many 64 bit related) -#endif - -// ============================================================================================= - -// Platforms other than Win -#if ! XMP_WinBuild -int IsEqualGUID ( const GUID& guid1, const GUID& guid2 ) -{ - return (memcmp ( &guid1, &guid2, sizeof(GUID) ) == 0); -} -#endif - -ASF_Support::ASF_Support() : legacyManager(0), posFileSizeInfo(0) {} - -ASF_Support::ASF_Support ( ASF_LegacyManager* _legacyManager ) : posFileSizeInfo(0) -{ - legacyManager = _legacyManager; -} - -ASF_Support::~ASF_Support() -{ - legacyManager = 0; -} - -// ============================================================================================= - -long ASF_Support::OpenASF ( LFA_FileRef fileRef, ObjectState & inOutObjectState ) -{ - XMP_Uns64 pos = 0; - XMP_Uns64 len; - - try { - pos = LFA_Seek ( fileRef, 0, SEEK_SET ); - } catch ( ... ) {} - - if ( pos != 0 ) return 0; - - // read first and following chunks - while ( ReadObject ( fileRef, inOutObjectState, &len, pos) ) {} - - return inOutObjectState.objects.size(); - -} - -// ============================================================================================= - -bool ASF_Support::ReadObject ( LFA_FileRef fileRef, ObjectState & inOutObjectState, XMP_Uns64 * objectLength, XMP_Uns64 & inOutPosition ) -{ - - try { - - XMP_Uns64 startPosition = inOutPosition; - long bytesRead; - ASF_ObjectBase objectBase; - - bytesRead = LFA_Read ( fileRef, &objectBase, kASF_ObjectBaseLen, true ); - if ( bytesRead != kASF_ObjectBaseLen ) return false; - - *objectLength = GetUns64LE ( &objectBase.size ); - inOutPosition += *objectLength; - - ObjectData newObject; - - newObject.pos = startPosition; - newObject.len = *objectLength; - newObject.guid = objectBase.guid; - - // xmpIsLastObject indicates, that the XMP-object is the last top-level object - // reset here, if any another object is read - inOutObjectState.xmpIsLastObject = false; - - if ( IsEqualGUID ( ASF_Header_Object, newObject.guid ) ) { - - // header object ? - this->ReadHeaderObject ( fileRef, inOutObjectState, newObject ); - - } else if ( IsEqualGUID ( ASF_XMP_Metadata, newObject.guid ) ) { - - // check object for XMP GUID - inOutObjectState.xmpPos = newObject.pos + kASF_ObjectBaseLen; - inOutObjectState.xmpLen = newObject.len - kASF_ObjectBaseLen; - inOutObjectState.xmpIsLastObject = true; - inOutObjectState.xmpObject = newObject; - newObject.xmp = true; - - } - - inOutObjectState.objects.push_back ( newObject ); - - LFA_Seek ( fileRef, inOutPosition, SEEK_SET ); - - } catch ( ... ) { - - return false; - - } - - return true; - -} - -// ============================================================================================= - -bool ASF_Support::ReadHeaderObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const ObjectData& newObject ) -{ - if ( ! IsEqualGUID ( ASF_Header_Object, newObject.guid) || (! legacyManager ) ) return false; - - std::string buffer; - - legacyManager->SetPadding(0); - - try { - - // read header-object structure - XMP_Uns64 pos = newObject.pos; - XMP_Uns32 bufferSize = kASF_ObjectBaseLen + 6; - - buffer.clear(); - buffer.reserve ( bufferSize ); - buffer.assign ( bufferSize, ' ' ); - LFA_Seek ( fileRef, pos, SEEK_SET ); - LFA_Read ( fileRef, const_cast<char*>(buffer.data()), bufferSize, true ); - - XMP_Uns64 read = bufferSize; - pos += bufferSize; - - // read contained header objects - XMP_Uns32 numberOfHeaders = GetUns32LE ( &buffer[24] ); - ASF_ObjectBase objectBase; - - while ( read < newObject.len ) { - - LFA_Seek ( fileRef, pos, SEEK_SET ); - if ( kASF_ObjectBaseLen != LFA_Read ( fileRef, &objectBase, kASF_ObjectBaseLen, true ) ) break; - - LFA_Seek ( fileRef, pos, SEEK_SET ); - objectBase.size = GetUns64LE ( &objectBase.size ); - - if ( IsEqualGUID ( ASF_File_Properties_Object, objectBase.guid) && (objectBase.size >= 104 ) ) { - - buffer.clear(); - buffer.reserve ( XMP_Uns32( objectBase.size ) ); - buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); - LFA_Read ( fileRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - - // save position of filesize-information - posFileSizeInfo = (pos + 40); - - // creation date - std::string sub ( buffer.substr ( 48, 8 ) ); - legacyManager->SetField ( ASF_LegacyManager::fieldCreationDate, sub ); - - // broadcast flag set ? - XMP_Uns32 flags = GetUns32LE ( &buffer[88] ); - inOutObjectState.broadcast = (flags & 1); - legacyManager->SetBroadcast ( inOutObjectState.broadcast ); - - legacyManager->SetObjectExists ( ASF_LegacyManager::objectFileProperties ); - - } else if ( IsEqualGUID ( ASF_Content_Description_Object, objectBase.guid) && (objectBase.size >= 34 ) ) { - - buffer.clear(); - buffer.reserve ( XMP_Uns32( objectBase.size ) ); - buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); - LFA_Read ( fileRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - - XMP_Uns16 titleLen = GetUns16LE ( &buffer[24] ); - XMP_Uns16 authorLen = GetUns16LE ( &buffer[26] ); - XMP_Uns16 copyrightLen = GetUns16LE ( &buffer[28] ); - XMP_Uns16 descriptionLen = GetUns16LE ( &buffer[30] ); - XMP_Uns16 ratingLen = GetUns16LE ( &buffer[32] ); - - XMP_Uns16 fieldPos = 34; - - std::string titleStr = buffer.substr ( fieldPos, titleLen ); - fieldPos += titleLen; - legacyManager->SetField ( ASF_LegacyManager::fieldTitle, titleStr ); - - std::string authorStr = buffer.substr ( fieldPos, authorLen ); - fieldPos += authorLen; - legacyManager->SetField ( ASF_LegacyManager::fieldAuthor, authorStr ); - - std::string copyrightStr = buffer.substr ( fieldPos, copyrightLen ); - fieldPos += copyrightLen; - legacyManager->SetField ( ASF_LegacyManager::fieldCopyright, copyrightStr ); - - std::string descriptionStr = buffer.substr ( fieldPos, descriptionLen ); - fieldPos += descriptionLen; - legacyManager->SetField ( ASF_LegacyManager::fieldDescription, descriptionStr ); - - /* rating is currently not part of reconciliation - std::string ratingStr = buffer.substr ( fieldPos, ratingLen ); - fieldPos += ratingLen; - legacyData.append ( titleStr ); - */ - - legacyManager->SetObjectExists ( ASF_LegacyManager::objectContentDescription ); - - } else if ( IsEqualGUID ( ASF_Content_Branding_Object, objectBase.guid ) ) { - - buffer.clear(); - buffer.reserve ( XMP_Uns32( objectBase.size ) ); - buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); - LFA_Read ( fileRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - - XMP_Uns32 fieldPos = 28; - - // copyright URL is 3. element with variable size - for ( int i = 1; i <= 3 ; ++i ) { - XMP_Uns32 len = GetUns32LE ( &buffer[fieldPos] ); - if ( i == 3 ) { - std::string copyrightURLStr = buffer.substr ( fieldPos + 4, len ); - legacyManager->SetField ( ASF_LegacyManager::fieldCopyrightURL, copyrightURLStr ); - } - fieldPos += (len + 4); - } - - legacyManager->SetObjectExists ( ASF_LegacyManager::objectContentBranding ); - -#if ! Exclude_LicenseURL_Recon - - } else if ( IsEqualGUID ( ASF_Content_Encryption_Object, objectBase.guid ) ) { - - buffer.clear(); - buffer.reserve ( XMP_Uns32( objectBase.size ) ); - buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); - LFA_Read ( fileRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - - XMP_Uns32 fieldPos = 24; - - // license URL is 4. element with variable size - for ( int i = 1; i <= 4 ; ++i ) { - XMP_Uns32 len = GetUns32LE ( &buffer[fieldPos] ); - if ( i == 4 ) { - std::string licenseURLStr = buffer.substr ( fieldPos + 4, len ); - legacyManager->SetField ( ASF_LegacyManager::fieldLicenseURL, licenseURLStr ); - } - fieldPos += (len + 4); - } - - legacyManager->SetObjectExists ( objectContentEncryption ); - -#endif - - } else if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) ) { - - legacyManager->SetPadding ( legacyManager->GetPadding() + (objectBase.size - 24) ); - - } else if ( IsEqualGUID ( ASF_Header_Extension_Object, objectBase.guid ) ) { - - this->ReadHeaderExtensionObject ( fileRef, inOutObjectState, pos, objectBase ); - - } - - pos += objectBase.size; - read += objectBase.size; - } - - } catch ( ... ) { - - return false; - - } - - legacyManager->ComputeDigest(); - - return true; -} - -// ============================================================================================= - -bool ASF_Support::WriteHeaderObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object, ASF_LegacyManager& _legacyManager, bool usePadding ) -{ - if ( ! IsEqualGUID ( ASF_Header_Object, object.guid ) ) return false; - - bool ret = false; - - std::string buffer; - XMP_Uns16 valueUns16LE; - XMP_Uns32 valueUns32LE; - XMP_Uns64 valueUns64LE; - - try { - - // read header-object structure - XMP_Uns64 pos = object.pos; - XMP_Uns32 bufferSize = kASF_ObjectBaseLen + 6; - - buffer.clear(); - buffer.reserve ( bufferSize ); - buffer.assign ( bufferSize, ' ' ); - LFA_Seek ( sourceRef, pos, SEEK_SET ); - LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), bufferSize, true ); - - XMP_Uns64 read = bufferSize; - pos += bufferSize; - - // read contained header objects - XMP_Uns32 numberOfHeaders = GetUns32LE ( &buffer[24] ); - ASF_ObjectBase objectBase; - - // prepare new header in memory - std::string header; - - int changedObjects = _legacyManager.changedObjects(); - int exportedObjects = 0; - int writtenObjects = 0; - - header.append ( buffer.c_str(), bufferSize ); - - while ( read < object.len ) { - - LFA_Seek ( sourceRef, pos, SEEK_SET ); - if ( kASF_ObjectBaseLen != LFA_Read ( sourceRef, &objectBase, kASF_ObjectBaseLen, true ) ) break; - - LFA_Seek ( sourceRef, pos, SEEK_SET ); - objectBase.size = GetUns64LE ( &objectBase.size ); - - int headerStartPos = header.size(); - - // save position of filesize-information - if ( IsEqualGUID ( ASF_File_Properties_Object, objectBase.guid ) ) { - posFileSizeInfo = (headerStartPos + 40); - } - - // write objects - if ( IsEqualGUID ( ASF_File_Properties_Object, objectBase.guid ) && - (objectBase.size >= 104) && (changedObjects & ASF_LegacyManager::objectFileProperties) ) { - - // copy object and replace creation-date - buffer.reserve ( XMP_Uns32 ( objectBase.size ) ); - buffer.assign ( XMP_Uns32 ( objectBase.size ), ' ' ); - LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - header.append ( buffer, 0, XMP_Uns32( objectBase.size ) ); - - if ( ! _legacyManager.GetBroadcast() ) { - buffer = _legacyManager.GetField ( ASF_LegacyManager::fieldCreationDate ); - ReplaceString ( header, buffer, (headerStartPos + 48), 8 ); - } - - exportedObjects |= ASF_LegacyManager::objectFileProperties; - - } else if ( IsEqualGUID ( ASF_Content_Description_Object, objectBase.guid ) && - (objectBase.size >= 34) && (changedObjects & ASF_LegacyManager::objectContentDescription) ) { - - // re-create object with xmp-data - buffer.reserve ( XMP_Uns32( objectBase.size ) ); - buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); - LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - // write header only - header.append ( buffer, 0, XMP_Uns32( kASF_ObjectBaseLen ) ); - - // write length fields - - XMP_Uns16 titleLen = _legacyManager.GetField ( ASF_LegacyManager::fieldTitle).size( ); - valueUns16LE = MakeUns16LE ( titleLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - XMP_Uns16 authorLen = _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor).size( ); - valueUns16LE = MakeUns16LE ( authorLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - XMP_Uns16 copyrightLen = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright).size( ); - valueUns16LE = MakeUns16LE ( copyrightLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - XMP_Uns16 descriptionLen = _legacyManager.GetField ( ASF_LegacyManager::fieldDescription).size( ); - valueUns16LE = MakeUns16LE ( descriptionLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - // retrieve existing overall length of preceding fields - XMP_Uns16 precedingLen = 0; - precedingLen += GetUns16LE ( &buffer[24] ); // Title - precedingLen += GetUns16LE ( &buffer[26] ); // Author - precedingLen += GetUns16LE ( &buffer[28] ); // Copyright - precedingLen += GetUns16LE ( &buffer[30] ); // Description - // retrieve existing 'Rating' length - XMP_Uns16 ratingLen = GetUns16LE ( &buffer[32] ); // Rating - valueUns16LE = MakeUns16LE ( ratingLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - // write field contents - - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldTitle ) ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor ) ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright ) ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldDescription ) ); - header.append ( buffer, (34 + precedingLen), ratingLen ); - - // update new object size - valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); - std::string newSize ( (const char*)&valueUns64LE, 8 ); - ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); - - exportedObjects |= ASF_LegacyManager::objectContentDescription; - - } else if ( IsEqualGUID ( ASF_Content_Branding_Object, objectBase.guid ) && - (changedObjects & ASF_LegacyManager::objectContentBranding) ) { - - // re-create object with xmp-data - buffer.reserve ( XMP_Uns32( objectBase.size ) ); - buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); - LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - - // calculate size of fields coming before 'Copyright URL' - XMP_Uns32 length = 28; - length += (GetUns32LE ( &buffer[length] ) + 4); // Banner Image Data - length += (GetUns32LE ( &buffer[length] ) + 4); // Banner Image URL - - // write first part of header - header.append ( buffer, 0, length ); - - // copyright URL - length = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL).size( ); - valueUns32LE = MakeUns32LE ( length ); - header.append ( (const char*)&valueUns32LE, 4 ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL ) ); - - // update new object size - valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); - std::string newSize ( (const char*)&valueUns64LE, 8 ); - ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); - - exportedObjects |= ASF_LegacyManager::objectContentBranding; - -#if ! Exclude_LicenseURL_Recon - - } else if ( IsEqualGUID ( ASF_Content_Encryption_Object, objectBase.guid ) && - (changedObjects & ASF_LegacyManager::objectContentEncryption) ) { - - // re-create object with xmp-data - buffer.reserve ( XMP_Uns32( objectBase.size ) ); - buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); - LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - - // calculate size of fields coming before 'License URL' - XMP_Uns32 length = 24; - length += (GetUns32LE ( &buffer[length] ) + 4); // Secret Data - length += (GetUns32LE ( &buffer[length] ) + 4); // Protection Type - length += (GetUns32LE ( &buffer[length] ) + 4); // Key ID - - // write first part of header - header.append ( buffer, 0, length ); - - // License URL - length = _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL).size( ); - valueUns32LE = MakeUns32LE ( length ); - header.append ( (const char*)&valueUns32LE, 4 ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL ) ); - - // update new object size - valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); - std::string newSize ( (const char*)&valueUns64LE, 8 ); - ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); - - exportedObjects |= ASF_LegacyManager::objectContentEncryption; - -#endif - - } else if ( IsEqualGUID ( ASF_Header_Extension_Object, objectBase.guid ) && usePadding ) { - - // re-create object if padding needs to be used - buffer.reserve ( XMP_Uns32( objectBase.size ) ); - buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); - LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - - ASF_Support::WriteHeaderExtensionObject ( buffer, &header, objectBase, 0 ); - - } else if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) && usePadding ) { - - // eliminate padding (will be created as last object) - - } else { - - // simply copy all other objects - buffer.reserve ( XMP_Uns32( objectBase.size ) ); - buffer.assign ( XMP_Uns32( objectBase.size ), ' ' ); - LFA_Read ( sourceRef, const_cast<char*>(buffer.data()), XMP_Int32(objectBase.size), true ); - - header.append ( buffer, 0, XMP_Uns32( objectBase.size ) ); - - } - - pos += objectBase.size; - read += objectBase.size; - - writtenObjects ++; - - } - - // any objects to create ? - int newObjects = (changedObjects ^ exportedObjects); - - if ( newObjects ) { - - // create new objects with xmp-data - int headerStartPos; - ASF_ObjectBase newObjectBase; - XMP_Uns32 length; - - if ( newObjects & ASF_LegacyManager::objectContentDescription ) { - - headerStartPos = header.size(); - newObjectBase.guid = ASF_Content_Description_Object; - newObjectBase.size = 0; - - // write object header - header.append ( (const char*)&newObjectBase, kASF_ObjectBaseLen ); - - XMP_Uns16 titleLen = _legacyManager.GetField ( ASF_LegacyManager::fieldTitle).size( ); - valueUns16LE = MakeUns16LE ( titleLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - XMP_Uns16 authorLen = _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor).size( ); - valueUns16LE = MakeUns16LE ( authorLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - XMP_Uns16 copyrightLen = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright).size( ); - valueUns16LE = MakeUns16LE ( copyrightLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - XMP_Uns16 descriptionLen = _legacyManager.GetField ( ASF_LegacyManager::fieldDescription).size( ); - valueUns16LE = MakeUns16LE ( descriptionLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - XMP_Uns16 ratingLen = 0; - valueUns16LE = MakeUns16LE ( ratingLen ); - header.append ( (const char*)&valueUns16LE, 2 ); - - // write field contents - - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldTitle ) ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldAuthor ) ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyright ) ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldDescription ) ); - - // update new object size - valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); - std::string newSize ( (const char*)&valueUns64LE, 8 ); - ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); - - newObjects &= ~ASF_LegacyManager::objectContentDescription; - - writtenObjects ++; - - } - - if ( newObjects & ASF_LegacyManager::objectContentBranding ) { - - headerStartPos = header.size(); - newObjectBase.guid = ASF_Content_Branding_Object; - newObjectBase.size = 0; - - // write object header - header.append ( (const char*)&newObjectBase, kASF_ObjectBaseLen ); - - // write 'empty' fields - header.append ( 12, '\0' ); - - // copyright URL - length = _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL).size( ); - valueUns32LE = MakeUns32LE ( length ); - header.append ( (const char*)&valueUns32LE, 4 ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldCopyrightURL ) ); - - // update new object size - valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); - std::string newSize ( (const char*)&valueUns64LE, 8 ); - ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); - - newObjects &= ~ASF_LegacyManager::objectContentBranding; - - writtenObjects ++; - - } - -#if ! Exclude_LicenseURL_Recon - - if ( newObjects & ASF_LegacyManager::objectContentEncryption ) { - - headerStartPos = header.size(); - newObjectBase.guid = ASF_Content_Encryption_Object; - newObjectBase.size = 0; - - // write object header - header.append ( (const char*)&newObjectBase, kASF_ObjectBaseLen ); - - // write 'empty' fields - header.append ( 12, '\0' ); - - // License URL - length = _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL).size( ); - valueUns32LE = MakeUns32LE ( length ); - header.append ( (const char*)&valueUns32LE, 4 ); - header.append ( _legacyManager.GetField ( ASF_LegacyManager::fieldLicenseURL ) ); - - // update new object size - valueUns64LE = MakeUns64LE ( header.size() - headerStartPos ); - std::string newSize ( (const char*)&valueUns64LE, 8 ); - ReplaceString ( header, newSize, (headerStartPos + 16), 8 ); - - newObjects &= ~ASF_LegacyManager::objectContentEncryption; - - writtenObjects ++; - - } - -#endif - - } - - // create padding object ? - if ( usePadding && (header.size ( ) < object.len ) ) { - ASF_Support::CreatePaddingObject ( &header, (object.len - header.size()) ); - writtenObjects ++; - } - - // update new header-object size - valueUns64LE = MakeUns64LE ( header.size() ); - std::string newValue ( (const char*)&valueUns64LE, 8 ); - ReplaceString ( header, newValue, 16, 8 ); - - // update new number of Header objects - valueUns32LE = MakeUns32LE ( writtenObjects ); - newValue = std::string ( (const char*)&valueUns32LE, 4 ); - ReplaceString ( header, newValue, 24, 4 ); - - // if we are operating on the same file (in-place update), place pointer before writing - if ( sourceRef == destRef ) LFA_Seek ( destRef, object.pos, SEEK_SET ); - - // write header - LFA_Write ( destRef, header.c_str(), header.size() ); - - } catch ( ... ) { - - ret = false; - - } - - return ret; - -} - -// ============================================================================================= - -bool ASF_Support::UpdateHeaderObject ( LFA_FileRef fileRef, const ObjectData& object, ASF_LegacyManager& _legacyManager ) -{ - return ASF_Support::WriteHeaderObject ( fileRef, fileRef, object, _legacyManager, true ); -} - -// ============================================================================================= - -bool ASF_Support::UpdateFileSize ( LFA_FileRef fileRef ) -{ - if ( fileRef == 0 ) return false; - - XMP_Uns64 posCurrent = LFA_Seek ( fileRef, 0, SEEK_CUR ); - XMP_Uns64 newSizeLE = MakeUns64LE ( LFA_Measure ( fileRef ) ); - - if ( this->posFileSizeInfo != 0 ) { - - LFA_Seek ( fileRef, this->posFileSizeInfo, SEEK_SET ); - - } else { - - // The position of the file size field is not known, find it. - - ASF_ObjectBase objHeader; - - // Read the Header object at the start of the file. - - LFA_Seek ( fileRef, 0, SEEK_SET ); - LFA_Read ( fileRef, &objHeader, kASF_ObjectBaseLen, kLFA_RequireAll ); - if ( ! IsEqualGUID ( ASF_Header_Object, objHeader.guid ) ) return false; - - XMP_Uns32 childCount; - LFA_Read ( fileRef, &childCount, 4, kLFA_RequireAll ); - childCount = GetUns32LE ( &childCount ); - - LFA_Seek ( fileRef, 2, SEEK_CUR ); // Skip the 2 reserved bytes. - - // Look for the File Properties object in the Header's children. - - for ( ; childCount > 0; --childCount ) { - LFA_Read ( fileRef, &objHeader, kASF_ObjectBaseLen, kLFA_RequireAll ); - if ( IsEqualGUID ( ASF_File_Properties_Object, objHeader.guid ) ) break; - XMP_Uns64 dataLen = GetUns64LE ( &objHeader.size ) - 24; - LFA_Seek ( fileRef, dataLen, SEEK_CUR ); // Skip this object's data. - } - if ( childCount == 0 ) return false; - - // Seek to the file size field. - - XMP_Uns64 fpoSize = GetUns64LE ( &objHeader.size ); - if ( fpoSize < (16+8+16+8) ) return false; - LFA_Seek ( fileRef, 16, SEEK_CUR ); // Skip to the file size field. - - } - - LFA_Write ( fileRef, &newSizeLE, 8 ); // Write the new file size. - - LFA_Seek ( fileRef, posCurrent, SEEK_SET ); - return true; - -} - -// ============================================================================================= - -bool ASF_Support::ReadHeaderExtensionObject ( LFA_FileRef fileRef, ObjectState& inOutObjectState, const XMP_Uns64& _pos, const ASF_ObjectBase& _objectBase ) -{ - if ( ! IsEqualGUID ( ASF_Header_Extension_Object, _objectBase.guid) || (! legacyManager ) ) return false; - - try { - - // read extended header-object structure beginning at the data part (offset = 46) - const XMP_Uns64 offset = 46; - XMP_Uns64 read = 0; - XMP_Uns64 data = (_objectBase.size - offset); - XMP_Uns64 pos = (_pos + offset); - - ASF_ObjectBase objectBase; - - while ( read < data ) { - - LFA_Seek ( fileRef, pos, SEEK_SET ); - if ( kASF_ObjectBaseLen != LFA_Read ( fileRef, &objectBase, kASF_ObjectBaseLen, true ) ) break; - - objectBase.size = GetUns64LE ( &objectBase.size ); - - if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) ) { - legacyManager->SetPadding ( legacyManager->GetPadding() + (objectBase.size - 24) ); - } - - pos += objectBase.size; - read += objectBase.size; - - } - - } catch ( ... ) { - - return false; - - } - - return true; - -} - -// ============================================================================================= - -bool ASF_Support::WriteHeaderExtensionObject ( const std::string& buffer, std::string* header, const ASF_ObjectBase& _objectBase, const int /*reservePadding*/ ) -{ - if ( ! IsEqualGUID ( ASF_Header_Extension_Object, _objectBase.guid ) || (! header) || (buffer.size() < 46) ) return false; - - const XMP_Uns64 offset = 46; - int startPos = header->size(); - - // copy header base - header->append ( buffer, 0, offset ); - - // read extended header-object structure beginning at the data part (offset = 46) - XMP_Uns64 read = 0; - XMP_Uns64 data = (_objectBase.size - offset); - XMP_Uns64 pos = offset; - - ASF_ObjectBase objectBase; - - while ( read < data ) { - - memcpy ( &objectBase, &buffer[int(pos)], kASF_ObjectBaseLen ); - objectBase.size = GetUns64LE ( &objectBase.size ); - - if ( IsEqualGUID ( ASF_Padding_Object, objectBase.guid ) ) { - // eliminate - } else { - // copy other objects - header->append ( buffer, XMP_Uns32(pos), XMP_Uns32(objectBase.size) ); - } - - pos += objectBase.size; - read += objectBase.size; - - } - - // update header extension data size - XMP_Uns32 valueUns32LE = MakeUns32LE ( header->size() - startPos - offset ); - std::string newDataSize ( (const char*)&valueUns32LE, 4 ); - ReplaceString ( *header, newDataSize, (startPos + 42), 4 ); - - // update new object size - XMP_Uns64 valueUns64LE = MakeUns64LE ( header->size() - startPos ); - std::string newObjectSize ( (const char*)&valueUns64LE, 8 ); - ReplaceString ( *header, newObjectSize, (startPos + 16), 8 ); - - return true; - -} - -// ============================================================================================= - -bool ASF_Support::CreatePaddingObject ( std::string* header, const XMP_Uns64 size ) -{ - if ( ( ! header) || (size < 24) ) return false; - - ASF_ObjectBase newObjectBase; - - newObjectBase.guid = ASF_Padding_Object; - newObjectBase.size = MakeUns64LE ( size ); - - // write object header - header->append ( (const char*)&newObjectBase, kASF_ObjectBaseLen ); - - // write 'empty' padding - header->append ( XMP_Uns32 ( size - 24 ), '\0' ); - - return true; - -} - -// ============================================================================================= - -bool ASF_Support::WriteXMPObject ( LFA_FileRef fileRef, XMP_Uns32 len, const char* inBuffer ) -{ - bool ret = false; - - ASF_ObjectBase objectBase = { ASF_XMP_Metadata, 0 }; - objectBase.size = MakeUns64LE ( len + kASF_ObjectBaseLen ); - - try { - LFA_Write ( fileRef, &objectBase, kASF_ObjectBaseLen ); - LFA_Write ( fileRef, inBuffer, len ); - ret = true; - } catch ( ... ) {} - - return ret; - -} - -// ============================================================================================= - -bool ASF_Support::UpdateXMPObject ( LFA_FileRef fileRef, const ObjectData& object, XMP_Uns32 len, const char * inBuffer ) -{ - bool ret = false; - - ASF_ObjectBase objectBase = { ASF_XMP_Metadata, 0 }; - objectBase.size = MakeUns64LE ( len + kASF_ObjectBaseLen ); - - try { - LFA_Seek ( fileRef, object.pos, SEEK_SET ); - LFA_Write ( fileRef, &objectBase, kASF_ObjectBaseLen ); - LFA_Write ( fileRef, inBuffer, len ); - ret = true; - } catch ( ... ) {} - - return ret; - -} - -// ============================================================================================= - -bool ASF_Support::CopyObject ( LFA_FileRef sourceRef, LFA_FileRef destRef, const ObjectData& object ) -{ - try { - LFA_Seek ( sourceRef, object.pos, SEEK_SET ); - LFA_Copy ( sourceRef, destRef, object.len ); - } catch ( ... ) { - return false; - } - - return true; - -} - -// ============================================================================================= - -bool ASF_Support::ReadBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns64 len, char * outBuffer ) -{ - try { - - if ( (fileRef == 0) || (outBuffer == 0) ) return false; - - LFA_Seek (fileRef, pos, SEEK_SET ); - long bytesRead = LFA_Read ( fileRef, outBuffer, XMP_Int32(len), true ); - if ( XMP_Uns32 ( bytesRead ) != len ) return false; - - return true; - - } catch ( ... ) {} - - return false; - -} - -// ============================================================================================= - -bool ASF_Support::WriteBuffer ( LFA_FileRef fileRef, XMP_Uns64 & pos, XMP_Uns32 len, const char * inBuffer ) -{ - try { - - if ( (fileRef == 0) || (inBuffer == 0) ) return false; - - LFA_Seek (fileRef, pos, SEEK_SET ); - LFA_Write( fileRef, inBuffer, len ); - - return true; - - } catch ( ... ) {} - - return false; - -} - -// ================================================================================================= - -std::string ASF_Support::ReplaceString ( std::string& operand, std::string& str, int offset, int count ) -{ - std::basic_string<char>::iterator iterF1, iterL1, iterF2, iterL2; - - iterF1 = operand.begin() + offset; - iterL1 = operand.begin() + offset + count; - iterF2 = str.begin(); - iterL2 = str.begin() + count; - - return operand.replace ( iterF1, iterL1, iterF2, iterL2 ); - -} - -// ================================================================================================= - -ASF_LegacyManager::ASF_LegacyManager() : fields(fieldLast), broadcastSet(false), digestComputed(false), - imported(false), objectsExisting(0), objectsToExport(0), legacyDiff(0), padding(0) -{ - // Nothing more to do. -} - -// ================================================================================================= - -ASF_LegacyManager::~ASF_LegacyManager() -{ - // Nothing to do. -} - -// ================================================================================================= - -bool ASF_LegacyManager::SetField ( fieldType field, const std::string& value ) -{ - if ( field >= fieldLast ) return false; - - unsigned int maxSize = this->GetFieldMaxSize ( field ); - - if (value.size ( ) <= maxSize ) { - fields[field] = value; - } else { - fields[field] = value.substr ( 0, maxSize ); - } - - if ( field == fieldCopyrightURL ) NormalizeStringDisplayASCII ( fields[field] ); - - #if ! Exclude_LicenseURL_Recon - if ( field == fieldLicenseURL ) NormalizeStringDisplayASCII ( fields[field] ); - #endif - - return true; - -} - -// ================================================================================================= - -std::string ASF_LegacyManager::GetField ( fieldType field ) -{ - if ( field >= fieldLast ) return std::string(); - return fields[field]; -} - -// ================================================================================================= - -unsigned int ASF_LegacyManager::GetFieldMaxSize ( fieldType field ) -{ - unsigned int maxSize = 0; - - switch ( field ) { - - case fieldCreationDate : - maxSize = 8; - break; - - case fieldTitle : - case fieldAuthor : - case fieldCopyright : - case fieldDescription : - maxSize = 0xFFFF; - break; - - case fieldCopyrightURL : -#if ! Exclude_LicenseURL_Recon - case fieldLicenseURL : -#endif - maxSize = 0xFFFFFFFF; - break; - - default: - break; - - } - - return maxSize; - -} - -// ================================================================================================= - -void ASF_LegacyManager::SetObjectExists ( objectType object ) -{ - objectsExisting |= object; -} - -// ================================================================================================= - -void ASF_LegacyManager::SetBroadcast ( const bool broadcast ) -{ - broadcastSet = broadcast; -} - -// ================================================================================================= - -bool ASF_LegacyManager::GetBroadcast() -{ - return broadcastSet; -} - -// ================================================================================================= - -void ASF_LegacyManager::ComputeDigest() -{ - MD5_CTX context; - MD5_Digest digest; - char buffer[40]; - - MD5Init ( &context ); - digestStr.clear(); - digestStr.reserve ( 160 ); - - for ( int type=0; type < fieldLast; ++type ) { - - if (fields[type].size ( ) > 0 ) { - snprintf ( buffer, sizeof(buffer), "%d,", type ); - digestStr.append ( buffer ); - MD5Update ( &context, (XMP_Uns8*)fields[type].data(), fields[type].size() ); - } - - } - - digestStr[digestStr.size()-1] = ';'; - - MD5Final ( digest, &context ); - - size_t in, out; - for ( in = 0, out = 0; in < 16; in += 1, out += 2 ) { - XMP_Uns8 byte = digest[in]; - buffer[out] = ReconcileUtils::kHexDigits [ byte >> 4 ]; - buffer[out+1] = ReconcileUtils::kHexDigits [ byte & 0xF ]; - } - buffer[32] = 0; - - digestStr.append ( buffer ); - - digestComputed = true; - -} - -// ================================================================================================= - -bool ASF_LegacyManager::CheckDigest ( const SXMPMeta& xmp ) -{ - bool ret = false; - - if ( ! digestComputed ) this->ComputeDigest(); - - std::string oldDigest; - - if ( xmp.GetProperty ( kXMP_NS_ASF, "NativeDigest", &oldDigest, 0 ) ) { - ret = (digestStr == oldDigest); - } - - return ret; - -} - -// ================================================================================================= - -void ASF_LegacyManager::SetDigest ( SXMPMeta* xmp ) -{ - if ( ! digestComputed ) this->ComputeDigest(); - - xmp->SetProperty ( kXMP_NS_ASF, "NativeDigest", digestStr.c_str() ); - -} - -// ================================================================================================= - -void ASF_LegacyManager::ImportLegacy ( SXMPMeta* xmp ) -{ - std::string utf8; - - if ( ! broadcastSet ) { - ConvertMSDateToISODate ( fields[fieldCreationDate], &utf8 ); - if ( ! utf8.empty() ) xmp->SetProperty ( kXMP_NS_XMP, "CreateDate", utf8.c_str(), kXMP_DeleteExisting ); - } - - FromUTF16 ( (UTF16Unit*)fields[fieldTitle].c_str(), (fields[fieldTitle].size() / 2), &utf8, false ); - if ( ! utf8.empty() ) xmp->SetLocalizedText ( kXMP_NS_DC, "title", "", "x-default", utf8.c_str(), kXMP_DeleteExisting ); - - xmp->DeleteProperty ( kXMP_NS_DC, "creator" ); - FromUTF16 ( (UTF16Unit*)fields[fieldAuthor].c_str(), (fields[fieldAuthor].size() / 2), &utf8, false ); - if ( ! utf8.empty() ) SXMPUtils::SeparateArrayItems ( xmp, kXMP_NS_DC, "creator", - (kXMP_PropArrayIsOrdered | kXMPUtil_AllowCommas), utf8.c_str() ); - - FromUTF16 ( (UTF16Unit*)fields[fieldCopyright].c_str(), (fields[fieldCopyright].size() / 2), &utf8, false ); - if ( ! utf8.empty() ) xmp->SetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", utf8.c_str(), kXMP_DeleteExisting ); - - FromUTF16 ( (UTF16Unit*)fields[fieldDescription].c_str(), (fields[fieldDescription].size() / 2), &utf8, false ); - if ( ! utf8.empty() ) xmp->SetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", utf8.c_str(), kXMP_DeleteExisting ); - - if ( ! utf8.empty() ) xmp->SetProperty ( kXMP_NS_XMP_Rights, "WebStatement", fields[fieldCopyrightURL].c_str(), kXMP_DeleteExisting ); - -#if ! Exclude_LicenseURL_Recon - if ( ! fields[fieldLicenseURL].empty() ) xmp->SetProperty ( kXMP_NS_XMP_Rights, "Certificate", fields[fieldLicenseURL].c_str(), kXMP_DeleteExisting ); -#endif - - imported = true; - -} - -// ================================================================================================= - -int ASF_LegacyManager::ExportLegacy ( const SXMPMeta& xmp ) -{ - int changed = 0; - objectsToExport = 0; - legacyDiff = 0; - - std::string utf8; - std::string utf16; - XMP_OptionBits flags; - - if ( ! broadcastSet ) { - if ( xmp.GetProperty ( kXMP_NS_XMP, "CreateDate", &utf8, &flags ) ) { - std::string date; - ConvertISODateToMSDate ( utf8, &date ); - if ( fields[fieldCreationDate] != date ) { - legacyDiff += date.size(); - legacyDiff -= fields[fieldCreationDate].size(); - this->SetField ( fieldCreationDate, date ); - objectsToExport |= objectFileProperties; - changed ++; - } - } - } - - if ( xmp.GetLocalizedText ( kXMP_NS_DC, "title", "", "x-default", 0, &utf8, &flags ) ) { - NormalizeStringTrailingNull ( utf8 ); - ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false ); - if ( fields[fieldTitle] != utf16 ) { - legacyDiff += utf16.size(); - legacyDiff -= fields[fieldTitle].size(); - this->SetField ( fieldTitle, utf16 ); - objectsToExport |= objectContentDescription; - changed ++; - } - } - - utf8.clear(); - SXMPUtils::CatenateArrayItems ( xmp, kXMP_NS_DC, "creator", 0, 0, kXMPUtil_AllowCommas, &utf8 ); - if ( ! utf8.empty() ) { - NormalizeStringTrailingNull ( utf8 ); - ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false ); - if ( fields[fieldAuthor] != utf16 ) { - legacyDiff += utf16.size(); - legacyDiff -= fields[fieldAuthor].size(); - this->SetField ( fieldAuthor, utf16 ); - objectsToExport |= objectContentDescription; - changed ++; - } - } - - if ( xmp.GetLocalizedText ( kXMP_NS_DC, "rights", "", "x-default", 0, &utf8, &flags ) ) { - NormalizeStringTrailingNull ( utf8 ); - ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false ); - if ( fields[fieldCopyright] != utf16 ) { - legacyDiff += utf16.size(); - legacyDiff -= fields[fieldCopyright].size(); - this->SetField ( fieldCopyright, utf16 ); - objectsToExport |= objectContentDescription; - changed ++; - } - } - - if ( xmp.GetLocalizedText ( kXMP_NS_DC, "description", "", "x-default", 0, &utf8, &flags ) ) { - NormalizeStringTrailingNull ( utf8 ); - ToUTF16 ( (const UTF8Unit*)utf8.data(), utf8.size(), &utf16, false ); - if ( fields[fieldDescription] != utf16 ) { - legacyDiff += utf16.size(); - legacyDiff -= fields[fieldDescription].size(); - this->SetField ( fieldDescription, utf16 ); - objectsToExport |= objectContentDescription; - changed ++; - } - } - - if ( xmp.GetProperty ( kXMP_NS_XMP_Rights, "WebStatement", &utf8, &flags ) ) { - NormalizeStringTrailingNull ( utf8 ); - if ( fields[fieldCopyrightURL] != utf8 ) { - legacyDiff += utf8.size(); - legacyDiff -= fields[fieldCopyrightURL].size(); - this->SetField ( fieldCopyrightURL, utf8 ); - objectsToExport |= objectContentBranding; - changed ++; - } - } - -#if ! Exclude_LicenseURL_Recon - if ( xmp.GetProperty ( kXMP_NS_XMP_Rights, "Certificate", &utf8, &flags ) ) { - NormalizeStringTrailingNull ( utf8 ); - if ( fields[fieldLicenseURL] != utf8 ) { - legacyDiff += utf8.size(); - legacyDiff -= fields[fieldLicenseURL].size(); - this->SetField ( fieldLicenseURL, utf8 ); - objectsToExport |= objectContentEncryption; - changed ++; - } - } -#endif - - // find objects, that would need to be created on legacy export - int newObjects = (objectsToExport & !objectsExisting); - - // calculate minimum storage for new objects, that might be created on export - if ( newObjects & objectContentDescription ) - legacyDiff += sizeContentDescription; - if ( newObjects & objectContentBranding ) - legacyDiff += sizeContentBranding; - if ( newObjects & objectContentEncryption ) - legacyDiff += sizeContentEncryption; - - ComputeDigest(); - - return changed; - -} - -// ================================================================================================= - -bool ASF_LegacyManager::hasLegacyChanged() -{ - return (objectsToExport != 0); -} - -// ================================================================================================= - -XMP_Int64 ASF_LegacyManager::getLegacyDiff() -{ - return (this->hasLegacyChanged() ? legacyDiff : 0); -} - -// ================================================================================================= - -int ASF_LegacyManager::changedObjects() -{ - return objectsToExport; -} - -// ================================================================================================= - -void ASF_LegacyManager::SetPadding ( XMP_Int64 _padding ) -{ - padding = _padding; -} - -// ================================================================================================= - -XMP_Int64 ASF_LegacyManager::GetPadding() -{ - return padding; -} - -// ================================================================================================= - -std::string ASF_LegacyManager::NormalizeStringDisplayASCII ( std::string& operand ) -{ - std::basic_string<char>::iterator current = operand.begin(); - std::basic_string<char>::iterator end = operand.end();; - - for ( ; (current != end); ++current ) { - char element = *current; - if ( ( (element < 0x21) && (element != 0x00)) || (element > 0x7e) ) { - *current = '?'; - } - } - - return operand; - -} - -// ================================================================================================= - -std::string ASF_LegacyManager::NormalizeStringTrailingNull ( std::string& operand ) -{ - if ( ( operand.size() > 0) && (operand[operand.size() - 1] != '\0') ) { - operand.append ( 1, '\0' ); - } - - return operand; - -} - -// ================================================================================================= - -int ASF_LegacyManager::DaysInMonth ( XMP_Int32 year, XMP_Int32 month ) -{ - - static short daysInMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec - - int days = daysInMonth [ month ]; - if ( (month == 2) && IsLeapYear ( year ) ) days += 1; - - return days; - -} - -// ================================================================================================= - -bool ASF_LegacyManager::IsLeapYear ( long year ) -{ - - if ( year < 0 ) year = -year + 1; // Fold the negative years, assuming there is a year 0. - - if ( (year % 4) != 0 ) return false; // Not a multiple of 4. - if ( (year % 100) != 0 ) return true; // A multiple of 4 but not a multiple of 100. - if ( (year % 400) == 0 ) return true; // A multiple of 400. - - return false; // A multiple of 100 but not a multiple of 400. - -} - -// ================================================================================================= - -void ASF_LegacyManager::ConvertMSDateToISODate ( std::string& source, std::string* dest ) -{ - - XMP_Int64 creationDate = GetUns64LE ( source.c_str() ); - XMP_Int64 totalSecs = creationDate / (10*1000*1000); - XMP_Int32 nanoSec = ( ( XMP_Int32) (creationDate - (totalSecs * 10*1000*1000)) ) * 100; - - XMP_Int32 days = (XMP_Int32) (totalSecs / 86400); - totalSecs -= ( ( XMP_Int64)days * 86400 ); - - XMP_Int32 hour = (XMP_Int32) (totalSecs / 3600); - totalSecs -= ( ( XMP_Int64)hour * 3600 ); - - XMP_Int32 minute = (XMP_Int32) (totalSecs / 60); - totalSecs -= ( ( XMP_Int64)minute * 60 ); - - XMP_Int32 second = (XMP_Int32)totalSecs; - - // A little more simple code converts this to an XMP date string: - - XMP_DateTime date; - memset ( &date, 0, sizeof ( date ) ); - - date.year = 1601; // The MS date origin. - date.month = 1; - date.day = 1; - - date.day += days; // Add in the delta. - date.hour = hour; - date.minute = minute; - date.second = second; - date.nanoSecond = nanoSec; - - date.hasTimeZone = true; // ! Needed for ConvertToUTCTime to do anything. - SXMPUtils::ConvertToUTCTime ( &date ); // Normalize the date/time. - SXMPUtils::ConvertFromDate ( date, dest ); // Convert to an ISO 8601 string. - -} - -// ================================================================================================= - -void ASF_LegacyManager::ConvertISODateToMSDate ( std::string& source, std::string* dest ) -{ - XMP_DateTime date; - SXMPUtils::ConvertToDate ( source, &date ); - SXMPUtils::ConvertToUTCTime ( &date ); - - XMP_Int64 creationDate; - creationDate = date.nanoSecond / 100; - creationDate += (XMP_Int64 ( date.second) * (10*1000*1000) ); - creationDate += (XMP_Int64 ( date.minute) * 60 * (10*1000*1000) ); - creationDate += (XMP_Int64 ( date.hour) * 3600 * (10*1000*1000) ); - - XMP_Int32 days = (date.day - 1); - - --date.month; - while ( date.month >= 1 ) { - days += DaysInMonth ( date.year, date.month ); - --date.month; - } - - --date.year; - while ( date.year >= 1601 ) { - days += (IsLeapYear ( date.year) ? 366 : 365 ); - --date.year; - } - - creationDate += (XMP_Int64 ( days) * 86400 * (10*1000*1000) ); - - creationDate = GetUns64LE ( &creationDate ); - dest->assign ( (const char*)&creationDate, 8 ); - -} |