diff --git a/ChangeLog b/ChangeLog index c2092be4a..3daeb5160 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-03-12 Wolfgang Sourdeau + + * OpenChange/MAPIStoreTypes.m (MAPICNCompare): new function that + returns an NSComparisonResult for two change numbers (reverse + format). + 2012-03-11 Wolfgang Sourdeau * OpenChange/MAPIStoreCalendarMessage.m diff --git a/OpenChange/MAPIStoreTypes.h b/OpenChange/MAPIStoreTypes.h index 53fb50272..c630b1e15 100644 --- a/OpenChange/MAPIStoreTypes.h +++ b/OpenChange/MAPIStoreTypes.h @@ -42,6 +42,8 @@ id NSObjectFromSPropValue (const struct SPropValue *); id NSObjectFromMAPISPropValue (const struct mapi_SPropValue *); id NSObjectFromValuePointer (enum MAPITAGS, const void *); +NSComparisonResult MAPICNCompare (uint64_t cn1, uint64_t cn2); + static inline NSNumber * MAPIPropertyKey (enum MAPITAGS propTag) { diff --git a/OpenChange/MAPIStoreTypes.m b/OpenChange/MAPIStoreTypes.m index 56665d0fb..01cd461ea 100644 --- a/OpenChange/MAPIStoreTypes.m +++ b/OpenChange/MAPIStoreTypes.m @@ -270,6 +270,34 @@ NSObjectFromValuePointer (enum MAPITAGS propTag, const void *data) return result; } +static uint64_t +_reverseCN (uint64_t cn) +{ + return ((cn & 0x00000000000000ffL) << 56 + | (cn & 0x000000000000ff00L) << 40 + | (cn & 0x0000000000ff0000L) << 24 + | (cn & 0x00000000ff000000L) << 8 + | (cn & 0x000000ff00000000L) >> 8 + | (cn & 0x0000ff0000000000L) >> 24 + | (cn & 0x00ff000000000000L) >> 40 + | (cn & 0xff00000000000000L) >> 56); +} + +NSComparisonResult +MAPICNCompare (uint64_t cn1, uint64_t cn2) +{ + NSComparisonResult result; + + if (cn1 == cn2) + result = NSOrderedSame; + else if (_reverseCN (cn1) < _reverseCN (cn2)) + result = NSOrderedAscending; + else + result = NSOrderedDescending; + + return result; +} + void MAPIStoreDumpMessageProperties (NSDictionary *properties) {