diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/Host_IO-POSIX.cpp | 2 | ||||
-rw-r--r-- | source/SafeStringAPIs.cpp | 10 | ||||
-rw-r--r-- | source/UnicodeConversions.cpp | 16 | ||||
-rw-r--r-- | source/XMPFiles_IO.cpp | 12 | ||||
-rw-r--r-- | source/XMP_LibUtils.cpp | 39 | ||||
-rw-r--r-- | source/XMP_LibUtils.hpp | 54 | ||||
-rw-r--r-- | source/XMP_ProgressTracker.hpp | 3 |
7 files changed, 72 insertions, 64 deletions
diff --git a/source/Host_IO-POSIX.cpp b/source/Host_IO-POSIX.cpp index 420b468..5f71a28 100644 --- a/source/Host_IO-POSIX.cpp +++ b/source/Host_IO-POSIX.cpp @@ -357,7 +357,7 @@ XMP_Uns32 Host_IO::Read ( Host_IO::FileRef refNum, void * buffer, XMP_Uns32 coun ssize_t bytesRead = read ( refNum, buffer, count ); if ( bytesRead == -1 ) XMP_Throw ( "Host_IO::Read, read failure", kXMPErr_ReadError ); - return bytesRead; + return static_cast<XMP_Uns32>( bytesRead ); } // Host_IO::Read diff --git a/source/SafeStringAPIs.cpp b/source/SafeStringAPIs.cpp index 41f09e4..0e7b224 100644 --- a/source/SafeStringAPIs.cpp +++ b/source/SafeStringAPIs.cpp @@ -407,8 +407,8 @@ CONDITIONAL_STATIC SafeInt32 makepath_safe(char* path, size_t size, const char* static char *reverse_string_safe(char *str, size_t size) { - int head = 0; - int tail = strnlen_safe(str, size) - 1; + size_t head = 0; + size_t tail = strnlen_safe(str, size) - 1; while (head < tail) { char temp = str[head]; @@ -607,15 +607,15 @@ CONDITIONAL_STATIC char * gets_safe(char* buffer, size_t size) char* pointer = buffer; char ch; size_t count = size; - ch = getchar(); - while(ch != EOF && ch != '\n') + ch = (char)getchar(); + while(ch != (char)EOF && ch != '\n') { if(count > 0) { count--; *pointer++ = ch; } - ch = getchar(); + ch = (char)getchar(); } if(count == 0) { diff --git a/source/UnicodeConversions.cpp b/source/UnicodeConversions.cpp index b4de085..39e4413 100644 --- a/source/UnicodeConversions.cpp +++ b/source/UnicodeConversions.cpp @@ -274,7 +274,7 @@ extern void ToUTF16 ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf while ( utf8Len > 0 ) { Converter ( utf8In, utf8Len, u16Buffer, kBufferSize, &readCount, &writeCount ); - if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); + if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadUnicode ); utf16Str->append ( (const char *)u16Buffer, writeCount*2 ); utf8In += readCount; utf8Len -= readCount; @@ -295,7 +295,7 @@ extern void ToUTF16Native ( const UTF8Unit * utf8In, size_t utf8Len, std::string while ( utf8Len > 0 ) { UTF8_to_UTF16Nat ( utf8In, utf8Len, u16Buffer, kBufferSize, &readCount, &writeCount ); - if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); + if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadUnicode ); utf16Str->append ( (const char *)u16Buffer, writeCount*2 ); utf8In += readCount; utf8Len -= readCount; @@ -319,7 +319,7 @@ extern void ToUTF32 ( const UTF8Unit * utf8In, size_t utf8Len, std::string * utf while ( utf8Len > 0 ) { Converter ( utf8In, utf8Len, u32Buffer, kBufferSize, &readCount, &writeCount ); - if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); + if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadUnicode ); utf32Str->append ( (const char *)u32Buffer, writeCount*4 ); utf8In += readCount; utf8Len -= readCount; @@ -340,7 +340,7 @@ extern void ToUTF32Native ( const UTF8Unit * utf8In, size_t utf8Len, std::string while ( utf8Len > 0 ) { UTF8_to_UTF32Nat ( utf8In, utf8Len, u32Buffer, kBufferSize, &readCount, &writeCount ); - if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); + if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadUnicode ); utf32Str->append ( (const char *)u32Buffer, writeCount*4 ); utf8In += readCount; utf8Len -= readCount; @@ -364,7 +364,7 @@ extern void FromUTF16 ( const UTF16Unit * utf16In, size_t utf16Len, std::string while ( utf16Len > 0 ) { Converter ( utf16In, utf16Len, u8Buffer, kBufferSize, &readCount, &writeCount ); - if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); + if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadUnicode ); utf8Str->append ( (const char *)u8Buffer, writeCount ); utf16In += readCount; utf16Len -= readCount; @@ -385,7 +385,7 @@ extern void FromUTF16Native ( const UTF16Unit * utf16In, size_t utf16Len, std::s while ( utf16Len > 0 ) { UTF16Nat_to_UTF8 ( utf16In, utf16Len, u8Buffer, kBufferSize, &readCount, &writeCount ); - if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); + if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadUnicode ); utf8Str->append ( (const char *)u8Buffer, writeCount ); utf16In += readCount; utf16Len -= readCount; @@ -409,7 +409,7 @@ extern void FromUTF32 ( const UTF32Unit * utf32In, size_t utf32Len, std::string while ( utf32Len > 0 ) { Converter ( utf32In, utf32Len, u8Buffer, kBufferSize, &readCount, &writeCount ); - if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); + if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadUnicode ); utf8Str->append ( (const char *)u8Buffer, writeCount ); utf32In += readCount; utf32Len -= readCount; @@ -430,7 +430,7 @@ extern void FromUTF32Native ( const UTF32Unit * utf32In, size_t utf32Len, std::s while ( utf32Len > 0 ) { UTF32Nat_to_UTF8 ( utf32In, utf32Len, u8Buffer, kBufferSize, &readCount, &writeCount ); - if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadXML ); + if ( writeCount == 0 ) UC_Throw ( "Incomplete Unicode at end of string", kXMPErr_BadUnicode ); utf8Str->append ( (const char *)u8Buffer, writeCount ); utf32In += readCount; utf32Len -= readCount; diff --git a/source/XMPFiles_IO.cpp b/source/XMPFiles_IO.cpp index 6de8666..3d3c45e 100644 --- a/source/XMPFiles_IO.cpp +++ b/source/XMPFiles_IO.cpp @@ -1,4 +1,4 @@ -// ================================================================================================= + // ================================================================================================= // ADOBE SYSTEMS INCORPORATED // Copyright 2010 Adobe Systems Incorporated // All Rights Reserved @@ -18,22 +18,22 @@ #define EMPTY_FILE_PATH "" -#define XMP_FILESIO_STATIC_START try { int a; +#define XMP_FILESIO_STATIC_START try { /* int a;*/ #define XMP_FILESIO_STATIC_END1(errorCallbackPtr, filePath, severity) \ - a = 1; \ + /*a = 1;*/ \ } catch ( XMP_Error & error ) { \ if ( (errorCallbackPtr) != NULL ) (errorCallbackPtr)->NotifyClient ( (severity), error, (filePath) ); \ else throw; \ } -#define XMP_FILESIO_START try { int b; +#define XMP_FILESIO_START try { /*int b;*/ #define XMP_FILESIO_END1(severity) \ - b = 1; \ + /*b = 1;*/ \ } catch ( XMP_Error & error ) { \ if ( errorCallback != NULL ) errorCallback->NotifyClient ( (severity), error, filePath.c_str() ); \ else throw; \ } #define XMP_FILESIO_END2(filePath, severity) \ - b = 1; \ + /* b = 1;*/ \ } catch ( XMP_Error & error ) { \ if ( errorCallback != NULL ) errorCallback->NotifyClient ( (severity), error, (filePath) ); \ else throw; \ diff --git a/source/XMP_LibUtils.cpp b/source/XMP_LibUtils.cpp index 8d62e74..e27ea30 100644 --- a/source/XMP_LibUtils.cpp +++ b/source/XMP_LibUtils.cpp @@ -35,45 +35,6 @@ extern "C" void Terminate_LibUtils(){ } // ================================================================================================= -// Error notifications -// ================================================================================================= - -bool GenericErrorCallback::CheckLimitAndSeverity ( XMP_ErrorSeverity severity ) const -{ - - if ( this->limit == 0 ) return true; // Always notify if the limit is zero. - if ( severity < this->topSeverity ) return false; // Don't notify, don't count. - - if ( severity > this->topSeverity ) { - this->topSeverity = severity; - this->notifications = 0; - } - - this->notifications += 1; - return (this->notifications <= this->limit); - -} // GenericErrorCallback::CheckLimitAndSeverity - -// ================================================================================================= - -void GenericErrorCallback::NotifyClient ( XMP_ErrorSeverity severity, XMP_Error & error, XMP_StringPtr filePath /*= 0 */ ) const -{ - bool notifyClient = CanNotify() && !error.IsNotified(); - bool returnAndRecover (severity == kXMPErrSev_Recoverable); - - if ( notifyClient ) { - error.SetNotified(); - notifyClient = CheckLimitAndSeverity ( severity ); - if ( notifyClient ) { - returnAndRecover &= ClientCallbackWrapper( filePath, severity, error.GetID(), error.GetErrMsg() ); - } - } - - if ( ! returnAndRecover ) XMP_Error_Throw ( error ); - -} - -// ================================================================================================= // Thread synchronization locks // ================================================================================================= diff --git a/source/XMP_LibUtils.hpp b/source/XMP_LibUtils.hpp index 38b0279..e4477fa 100644 --- a/source/XMP_LibUtils.hpp +++ b/source/XMP_LibUtils.hpp @@ -72,6 +72,8 @@ extern "C" void Terminate_LibUtils(); #define XMP_Throw_Verbose(msg,e,id) XMP_Throw(msg, id) #endif +#define XMP_Error_Throw(error) { AnnounceThrow (error.GetErrMsg()); throw error; } + class GenericErrorCallback { public: // Abstract base class for XMPCore and XMPFiles internal error notification support. Needed so @@ -88,18 +90,60 @@ public: void Clear() { this->notifications = 0; this->limit = 1; this->topSeverity = kXMPErrSev_Recoverable; }; - bool CheckLimitAndSeverity (XMP_ErrorSeverity severity ) const; + bool CheckLimitAndSeverity (XMP_ErrorSeverity severity ) const + { + + if ( this->limit == 0 ) return true; // Always notify if the limit is zero. + if ( severity < this->topSeverity ) return false; // Don't notify, don't count. + + if ( severity > this->topSeverity ) { + this->topSeverity = severity; + this->notifications = 0; + } + + this->notifications += 1; + return (this->notifications <= this->limit); + + } // GenericErrorCallback::CheckLimitAndSeverity // Const so they can be used with const XMPMeta and XMPFiles objects. - void NotifyClient ( XMP_ErrorSeverity severity, XMP_Error & error, XMP_StringPtr filePath = 0 ) const; + void NotifyClient ( XMP_ErrorSeverity severity, XMP_Error & error, XMP_StringPtr filePath = 0 ) const + { + + bool notifyClient = CanNotify() && !error.IsNotified(); + bool returnAndRecover (severity == kXMPErrSev_Recoverable); + + if ( notifyClient ) { + error.SetNotified(); + notifyClient = CheckLimitAndSeverity ( severity ); + if ( notifyClient ) { + returnAndRecover &= ClientCallbackWrapper( filePath, severity, error.GetID(), error.GetErrMsg() ); + } + } + + if ( ! returnAndRecover ) XMP_Error_Throw ( error ); + + } // GenericErrorCallback::NotifyClient virtual bool CanNotify ( ) const = 0; virtual bool ClientCallbackWrapper ( XMP_StringPtr filePath, XMP_ErrorSeverity severity, XMP_Int32 cause, XMP_StringPtr messsage ) const = 0; }; -#define XMP_Error_Throw(error) { AnnounceThrow (error.GetErrMsg()); throw error; } +// ------------------------------------------------------------------------------------------------- +struct ErrorCallbackBox +{ + XMPFiles_ErrorCallbackWrapper wrapperProc; + XMPFiles_ErrorCallbackProc clientProc; + void * context; + XMP_Uns32 limit; + + ErrorCallbackBox( XMPFiles_ErrorCallbackWrapper wrapperProcedure, + XMPFiles_ErrorCallbackProc clientProcedure, + void * contextPtr, + XMP_Uns32 limit32 ): wrapperProc(wrapperProcedure), clientProc(clientProcedure), context(contextPtr), limit(limit32) { } +}; // ------------------------------------------------------------------------------------------------- @@ -195,8 +239,8 @@ public: #define HaveAtomicIncrDecr 1 typedef int32_t XMP_AtomicCounter; - #define XMP_AtomicIncrement(x) OSAtomicIncrement32 ( &(x) ) - #define XMP_AtomicDecrement(x) OSAtomicDecrement32 ( &(x) ) + #define XMP_AtomicIncrement(x) OSAtomicIncrement32Barrier ( &(x) ) + #define XMP_AtomicDecrement(x) OSAtomicDecrement32Barrier ( &(x) ) typedef pthread_mutex_t XMP_BasicMutex; diff --git a/source/XMP_ProgressTracker.hpp b/source/XMP_ProgressTracker.hpp index b6776fb..14b5d54 100644 --- a/source/XMP_ProgressTracker.hpp +++ b/source/XMP_ProgressTracker.hpp @@ -45,6 +45,9 @@ public: void AddTotalWork ( float workIncrement ); void AddWorkDone ( float workIncrement ); void WorkComplete(); + CallbackInfo * GetCallbackInfo() { + return ( (&cbInfo) ? (&cbInfo) : NULL); + } bool WorkInProgress() { return this->workInProgress; }; |