Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Libmapi: повторяющиеся встречи

Если вы когда-либо будете использовать libmapi, для чтения рекуррентных (повторяющихся) встреч, то знайте, что вызов get_RecurrencePattern в текущей (0.8.2) версии читает даже близко не всё, что нужно, а структура RecurrencePattern, которая возвращается этим вызовом, не дописана для большинства типов встреч.

Так что, увы, придётся получать поле PidLidAppointmentRecur (не забудьте, что его ID нуждается в трансляции через mapi_nameid_GetIDsFromNames) и самостоятельно его парсить. Документация от Microsoft есть — документ MS-OXOCAL. Поздравьте, я справился.

Ctrl ←Дванка
Ctrl →Joke exchange
4 комментария
astur (astur.net.ru) 2009

Поздравляю!

Евгений Степанищев (bolknote.ru) 2009

Комментарий для astur.net.ru:

Ага, спасибо! :)

Евгений Степанищев (bolknote.ru) 2009

На всякий случай сгружу сюда более полные структуры для 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),
    ]

Евгений Степанищев (bolknote.ru) 2009

Да, структуры для Python, в формате ctypes.