37
39
return SIZE_DFLT_MAPI_RESPONSE;
43
\details Calculate Notify Rop size
45
\return Size of Notify response
47
_PUBLIC_ uint16_t libmapiserver_RopNotify_size(struct EcDoRpc_MAPI_REPL *response)
49
uint16_t size = SIZE_DFLT_ROPNOTIFY;
50
union NotificationData *NotificationData;
52
/* TODO: to be completed... */
54
NotificationData = &response->u.mapi_Notify.NotificationData;
55
printf("Looking for: 0x%x\n", response->u.mapi_Notify.NotificationType);
56
switch (response->u.mapi_Notify.NotificationType) {
58
case 0x3010: /* different forms of folder modifications */
59
size += sizeof (uint32_t);
62
size += sizeof (uint32_t);
63
case 0x0010: /* folder modified */
64
size += sizeof(uint64_t) + sizeof(uint16_t);
65
if (NotificationData->FolderModifiedNotification_10.TagCount != 0xffff) {
66
size += sizeof(enum MAPITAGS) * NotificationData->FolderModifiedNotification_10.TagCount;
70
case 0x0004: /* folder created */
72
case 0x0002: /* newmail */
74
size += sizeof (uint64_t) * 2 + sizeof (uint32_t) + sizeof (uint8_t);
75
if (NotificationData->NewMailNotification.UnicodeFlag == false) {
76
size += strlen(NotificationData->NewMailNotification.MessageClass.lpszA);
78
size += strlen(NotificationData->NewMailNotification.MessageClass.lpszW) * 2 + 2;
81
case 0x8004: /* message created */
82
case 0x8010: /* message modified */
83
size += sizeof(uint16_t);
84
if (NotificationData->MessageCreatedNotification.TagCount != 0xffff) {
85
size += sizeof(enum MAPITAGS) * NotificationData->MessageCreatedNotification.TagCount;
87
case 0x8008: /* message deleted */
88
case 0x0008: /* folder deleted */
89
size += 2 * sizeof(uint64_t);
93
case 0x0100: /* hierarchy table changed */
94
size += sizeof(uint16_t); /* TableEventType */
95
switch (NotificationData->HierarchyTableChange.TableEvent) {
97
size += 2 * sizeof(uint64_t); /* FID and InsertAfterFID */
98
size += sizeof(uint16_t) + NotificationData->HierarchyTableChange.HierarchyTableChangeUnion.HierarchyRowAddedNotification.Columns.length; /* blob length */
100
case TABLE_ROW_DELETED:
101
size += sizeof(uint64_t); /* FID */
103
case TABLE_ROW_MODIFIED:
104
size += 2 * sizeof(uint64_t); /* FID and InsertAfterFID */
105
size += sizeof(uint16_t) + NotificationData->HierarchyTableChange.HierarchyTableChangeUnion.HierarchyRowModifiedNotification.Columns.length; /* blob length */
107
default: /* TABLE_CHANGED and TABLE_RESTRICT_DONE */
111
case 0x8100: /* contents table changed */
112
size += sizeof(uint16_t); /* TableEventType */
113
switch (NotificationData->ContentsTableChange.TableEvent) {
114
case TABLE_ROW_ADDED:
115
size += 2 * (2 * sizeof(uint64_t) + sizeof(uint32_t)); /* FID, MID, Instance, InsertAfterFID, InsertAfterMID, InsertAfterInstance */
116
size += sizeof(uint16_t) + NotificationData->ContentsTableChange.ContentsTableChangeUnion.ContentsRowAddedNotification.Columns.length; /* blob length */
118
case TABLE_ROW_DELETED:
119
size += 2 * sizeof(uint64_t) + sizeof(uint32_t); /* FID, MID, Instance */
121
case TABLE_ROW_MODIFIED:
122
size += 2 * (2 * sizeof(uint64_t) + sizeof(uint32_t)); /* FID, MID, Instance, InsertAfterFID, InsertAfterMID, InsertAfterInstance */
123
size += sizeof(uint16_t) + NotificationData->ContentsTableChange.ContentsTableChangeUnion.ContentsRowModifiedNotification.Columns.length;
125
default: /* TABLE_CHANGED and TABLE_RESTRICT_DONE */
129
case 0xc100: /* search table changed */
130
size += sizeof(uint16_t); /* TableEventType */
131
switch (NotificationData->SearchTableChange.TableEvent) {
132
case TABLE_ROW_ADDED:
133
size += 2 * (2 * sizeof(uint64_t) + sizeof(uint32_t)); /* FID, MID, Instance, InsertAfterFID, InsertAfterMID, InsertAfterInstance */
134
size += sizeof(uint16_t) + NotificationData->SearchTableChange.ContentsTableChangeUnion.ContentsRowAddedNotification.Columns.length; /* blob length */
136
case TABLE_ROW_DELETED:
137
size += 2 * sizeof(uint64_t) + sizeof(uint32_t); /* FID, MID, Instance */
139
case TABLE_ROW_MODIFIED:
140
size += 2 * (2 * sizeof(uint64_t) + sizeof(uint32_t)); /* FID, MID, Instance, InsertAfterFID, InsertAfterMID, InsertAfterInstance */
141
size += sizeof(uint16_t) + NotificationData->SearchTableChange.ContentsTableChangeUnion.ContentsRowModifiedNotification.Columns.length;
143
default: /* TABLE_CHANGED and TABLE_RESTRICT_DONE */
150
/* size += sizeof(struct NewMailNotification); */
151
/* if (response->u.mapi_Notify.NewMailNotification.UnicodeFlag) { */
152
/* size += strlen_m_ext(response->u.mapi_Notify.NewMailNotification.MessageClass.lpszW, CH_UTF8, CH_UTF16BE) * 2 + 2; */
155
/* size += strlen(response->u.mapi_Notify.NewMailNotification.MessageClass.lpszA) + 1; */
160
/* size += sizeof(struct FolderMoveCopyNotification); */
163
/* size += sizeof(struct SearchCompleteNotification); */
166
/* size += sizeof(struct HierarchyTableChange); */
169
/* size += sizeof(struct IcsNotification); */
172
/* size += sizeof(struct FolderModifiedNotification_1010); */
175
/* size += sizeof(struct FolderModifiedNotification_2010); */
178
/* size += sizeof(struct FolderModifiedNotification_3010); */
182
size += sizeof(struct MessageMoveCopyNotification);
186
/* size += sizeof(struct ContentsTableChange); */
189
/* size += sizeof(struct SearchMessageCreatedNotification); */
192
/* size += sizeof(struct SearchMessageRemovedNotification); */
195
/* size += sizeof(struct SearchMessageModifiedNotification); */
198
DEBUG(5, (__location__": unhandled size case %.4x, expect buffer errors soon\n", response->u.mapi_Notify.NotificationType));