Libmapi: повторяющиеся встречи
Если вы когда-либо будете использовать libmapi, для чтения рекуррентных (повторяющихся) встреч, то знайте, что вызов get_RecurrencePattern в текущей (0.8.2) версии читает даже близко не всё, что нужно, а структура RecurrencePattern, которая возвращается этим вызовом, не дописана для большинства типов встреч.
Так что, увы, придётся получать поле PidLidAppointmentRecur (не забудьте, что его ID нуждается в трансляции через mapi_nameid_GetIDsFromNames) и самостоятельно его парсить. Документация от Microsoft есть — документ MS-OXOCAL. Поздравьте, я справился.
Поздравляю!
Комментарий для astur.net.ru:
Ага, спасибо! :)
На всякий случай сгружу сюда более полные структуры для get_RecurrencePattern, в них нет только массива для изменённых событий (одни даты), но результат вызова можно кастануть в эту структуру и получить правильные данные для всех типов событий:
class MonthRecurrencePattern(Structure):
_fields_ = [
(’Res1’, c_uint32),
(’Res2’, c_uint32),
(’EveryNDay’, c_uint32),
(’EndType’, c_uint32),
(’OccurrenceCount’, c_uint32),
]
class MonthComplexRecurrencePattern(Structure):
_fields_ = [
(’DayBitMask’, c_uint32),
(’Nth’, c_uint32),
(’EndType’, c_uint32),
(’OccurrenceCount’, c_uint32),
(’FirstDOW’, c_uint8),
]
class DayRecurrencePattern(Structure):
_fields_ = [
(’DayBitMask’, c_uint32),
(’N’, c_uint32),
(’EndType’, c_uint32),
(’OccurrenceCount’, c_uint32),
(’FirstDOW’, c_uint8),
]
class PatternTypeSpecific(Union):
_fields_ = [
(’MonthRecurrencePattern’, MonthRecurrencePattern),
(’MonthComplexRecurrencePattern’,MonthComplexRecurrencePattern),
(’DayRecurrencePattern’, DayRecurrencePattern),
]
class RecurrencePattern(Structure):
_fields_ = [
(’ReaderVersion’, c_uint16),
(’WriterVersion’, c_uint16),
(’RecurFrequency’, c_uint32),
(’PatternType’, c_uint32),
(’CalendarType’, c_uint32),
(’FirstDateTime’, c_uint32),
(’Period’, c_uint32),
(’SlidingFlag’, c_uint32),
(’PatternTypeSpecific’, PatternTypeSpecific),
(’DeletedInstanceCount’, c_uint32),
(’DeletedInstanceDates’, POINTER(c_uint32)),
(’ModifiedInstanceCount’, c_uint32),
(’ModifiedInstanceDates’, POINTER(c_uint32)),
(’StartDate’, c_uint32),
(’EndDate’, c_uint32),
]
Да, структуры для Python, в формате ctypes.