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

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

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

astur (astur.net.ru)
30 марта 2009, 20:51

Поздравляю!

bolk (bolknote.ru)
30 марта 2009, 20:55, ответ предназначен astur (astur.net.ru):

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

bolk (bolknote.ru)
31 марта 2009, 11:00

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

bolk (bolknote.ru)
31 марта 2009, 17:31

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)