2 Stand-alone MAPI testsuite
4 OpenChange Project - E-MAIL OBJECT PROTOCOL operations
6 Copyright (C) Julien Kerihuel 2008
7 Copyright (C) Brad Hards <bradh@openchange.org> 2009
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "utils/mapitest/mapitest.h"
24 #include "utils/mapitest/proto.h"
29 \brief Message and Attachment Object Protocol test suite
34 \details Test the CreateMessage (0x6) operation
37 -# Log on the user private mailbox
38 -# Open the Outbox folder
42 \param mt pointer on the top-level mapitest structure
44 \return true on success, otherwise false
46 _PUBLIC_ bool mapitest_oxcmsg_CreateMessage(struct mapitest *mt)
49 mapi_object_t obj_store;
50 mapi_object_t obj_folder;
51 mapi_object_t obj_message;
55 mapi_object_init(&obj_store);
56 OpenMsgStore(mt->session, &obj_store);
57 mapitest_print_retval(mt, "OpenMsgStore");
58 if (GetLastError() != MAPI_E_SUCCESS) {
62 /* Step 2. Open Outbox folder */
63 mapi_object_init(&obj_folder);
64 ret = mapitest_common_folder_open(mt, &obj_store, &obj_folder, olFolderOutbox);
65 if (ret == false) return ret;
67 /* Step 3. Create the message */
68 mapi_object_init(&obj_message);
69 CreateMessage(&obj_folder, &obj_message);
70 mapitest_print_retval(mt, "CreateMessage");
71 if (GetLastError() != MAPI_E_SUCCESS) {
75 /* Step 4. Delete the message */
76 id_msgs[0] = mapi_object_get_id(&obj_message);
77 DeleteMessage(&obj_folder, id_msgs, 1);
78 mapitest_print_retval(mt, "DeleteMessage");
79 if (GetLastError() != MAPI_E_SUCCESS) {
84 mapi_object_release(&obj_message);
85 mapi_object_release(&obj_folder);
86 mapi_object_release(&obj_store);
91 #define OXCMSG_SETREADFLAGS "[OXCMSG] SetMessageReadFlag"
94 \details Test the SetMessageReadFlag (0x11) operation
97 -# Log on the user private mailbox
98 -# Open the Inbox folder
99 -# Create a tmp message
100 -# Play with SetMessageReadFlag
101 -# Delete the message
103 Note: We can test either SetMessageReadFlag was effective by checking its
104 old/new value with GetProps on PR_MESSAGE_FLAGS property.
107 \param mt pointer on the top-level mapitest structure
109 \return true on success, otherwise false
111 _PUBLIC_ bool mapitest_oxcmsg_SetMessageReadFlag(struct mapitest *mt)
114 mapi_object_t obj_store;
115 mapi_object_t obj_folder;
116 mapi_object_t obj_message;
117 struct SPropTagArray *SPropTagArray;
118 struct SPropValue *lpProps;
120 mapi_id_t id_msgs[1];
124 mapi_object_init(&obj_store);
125 OpenMsgStore(mt->session, &obj_store);
126 mapitest_print_retval(mt, "OpenMsgStore");
127 if (GetLastError() != MAPI_E_SUCCESS) {
131 /* Step 2. Open Outbox folder */
132 mapi_object_init(&obj_folder);
133 ret = mapitest_common_folder_open(mt, &obj_store, &obj_folder, olFolderOutbox);
134 if (ret == false) return ret;
136 /* Step 3. Create the tmp message and save it */
137 mapi_object_init(&obj_message);
138 ret = mapitest_common_message_create(mt, &obj_folder, &obj_message, OXCMSG_SETREADFLAGS);
139 if (ret == false) return ret;
141 SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadWrite);
142 mapitest_print_retval(mt, "SaveChangesMessage");
143 if (GetLastError() != MAPI_E_SUCCESS) {
147 /* Step 4. Play with SetMessageReadFlag */
148 SPropTagArray = set_SPropTagArray(mt->mem_ctx, 0x2, PR_MID, PR_MESSAGE_FLAGS);
151 /* 1. Retrieve and Save the original PR_MESSAGE_FLAGS value */
152 GetProps(&obj_message, 0, SPropTagArray, &lpProps, &cValues);
153 if (GetLastError() != MAPI_E_SUCCESS) {
158 status = lpProps[1].value.l;
160 MAPIFreeBuffer(lpProps);
162 /* Set message flags as read */
163 SetMessageReadFlag(&obj_folder, &obj_message, MSGFLAG_READ);
164 mapitest_print_retval_fmt(mt, "SetMessageReadFlag", "(%s)", "MSGFLAG_READ");
166 /* Check if the operation was successful */
167 GetProps(&obj_message, 0, SPropTagArray, &lpProps, &cValues);
168 mapitest_print_retval(mt, "GetProps");
169 if (GetLastError() != MAPI_E_SUCCESS) {
173 if (cValues > 1 && status != lpProps[1].value.l) {
174 mapitest_print(mt, "* %-35s: PR_MESSAGE_FLAGS changed\n", "SetMessageReadFlag");
175 status = lpProps[1].value.l;
177 mapitest_print(mt, "* %-35s: PR_MESSAGE_FLAGS failed\n", "SetMessageReadFlag");
180 MAPIFreeBuffer(lpProps);
182 /* Set the message flags as submitted */
183 SetMessageReadFlag(&obj_folder, &obj_message, MSGFLAG_SUBMIT);
184 mapitest_print_retval_fmt(mt, "SetMessageReadFlag", "(%s)", "MSGFLAG_SUBMIT");
186 /* Check if the operation was successful */
187 GetProps(&obj_message, 0, SPropTagArray, &lpProps, &cValues);
188 if (GetLastError() != MAPI_E_SUCCESS) {
192 if (cValues > 1 && status != lpProps[1].value.l) {
193 mapitest_print(mt, "* %-35s: PR_MESSAGE_FLAGS changed\n", "SetMessageReadFlag");
194 status = lpProps[1].value.l;
196 mapitest_print(mt, "* %-35s: PR_MESSAGE_FLAGS failed\n", "SetMessageReadFlag");
200 /* Step 5. Delete the message */
201 id_msgs[0] = mapi_object_get_id(&obj_message);
202 DeleteMessage(&obj_folder, id_msgs, 1);
203 mapitest_print_retval(mt, "DeleteMessage");
204 if (GetLastError() != MAPI_E_SUCCESS) {
209 mapi_object_release(&obj_message);
210 mapi_object_release(&obj_folder);
211 mapi_object_release(&obj_store);
213 MAPIFreeBuffer(SPropTagArray);
219 \details Test the ModifyRecipients (0xe) operation
222 -# Log on the user private mailbox
223 -# Open the Outbox folder
224 -# Create the message
225 -# Resolve recipients names
226 -# Call ModifyRecipients operation for MAPI_TO, MAPI_CC, MAPI_BCC
227 -# Delete the message
229 \param mt pointer on the top-level mapitest structure
231 \return true on success, otherwise false
233 _PUBLIC_ bool mapitest_oxcmsg_ModifyRecipients(struct mapitest *mt)
235 enum MAPISTATUS retval;
236 mapi_object_t obj_store;
237 mapi_object_t obj_folder;
238 mapi_object_t obj_message;
240 char **username = NULL;
241 struct SPropTagArray *SPropTagArray = NULL;
242 struct PropertyValue_r value;
243 struct PropertyRowSet_r *RowSet = NULL;
244 struct SRowSet *SRowSet = NULL;
245 struct PropertyTagArray_r *flaglist = NULL;
246 mapi_id_t id_msgs[1];
249 mapi_object_init(&obj_store);
250 retval = OpenMsgStore(mt->session, &obj_store);
251 mapitest_print_retval(mt, "OpenMsgStore");
252 if (GetLastError() != MAPI_E_SUCCESS) {
256 /* Step 2. Open Outbox folder */
257 retval = GetDefaultFolder(&obj_store, &id_folder, olFolderOutbox);
258 mapitest_print_retval(mt, "GetDefaultFolder");
259 if (GetLastError() != MAPI_E_SUCCESS) {
263 mapi_object_init(&obj_folder);
264 retval = OpenFolder(&obj_store, id_folder, &obj_folder);
265 mapitest_print_retval(mt, "OpenFolder");
266 if (GetLastError() != MAPI_E_SUCCESS) {
270 /* Step 3. Create the message */
271 mapi_object_init(&obj_message);
272 retval = CreateMessage(&obj_folder, &obj_message);
273 mapitest_print_retval(mt, "CreateMessage");
274 if (GetLastError() != MAPI_E_SUCCESS) {
279 /* Step 4. Resolve the recipients and call ModifyRecipients */
280 SPropTagArray = set_SPropTagArray(mt->mem_ctx, 0xA,
282 PR_DISPLAY_NAME_UNICODE,
285 PR_TRANSMITTABLE_DISPLAY_NAME_UNICODE,
286 PR_EMAIL_ADDRESS_UNICODE,
289 PR_7BIT_DISPLAY_NAME_UNICODE,
290 PR_SMTP_ADDRESS_UNICODE);
292 username = talloc_array(mt->mem_ctx, char *, 2);
293 username[0] = (char *)mt->profile->mailbox;
296 retval = ResolveNames(mapi_object_get_session(&obj_message),
297 (const char **)username, SPropTagArray,
298 &RowSet, &flaglist, MAPI_UNICODE);
299 mapitest_print_retval_clean(mt, "ResolveNames", retval);
300 if (retval != MAPI_E_SUCCESS) {
305 mapitest_print(mt, "Null RowSet\n");
308 if (!RowSet->cRows) {
309 mapitest_print(mt, "No values in RowSet\n");
310 MAPIFreeBuffer(RowSet);
314 value.ulPropTag = PR_SEND_INTERNET_ENCODING;
316 PropertyRowSet_propcpy(mt->mem_ctx, RowSet, value);
318 SRowSet = talloc_zero(RowSet, struct SRowSet);
319 cast_PropertyRowSet_to_SRowSet(SRowSet, RowSet, SRowSet);
321 SetRecipientType(&(SRowSet->aRow[0]), MAPI_TO);
322 mapitest_print_retval(mt, "SetRecipientType");
323 retval = ModifyRecipients(&obj_message, SRowSet);
324 mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_TO");
325 if (retval != MAPI_E_SUCCESS) {
326 MAPIFreeBuffer(RowSet);
327 MAPIFreeBuffer(flaglist);
331 SetRecipientType(&(SRowSet->aRow[0]), MAPI_CC);
332 mapitest_print_retval(mt, "SetRecipientType");
333 retval = ModifyRecipients(&obj_message, SRowSet);
334 mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_CC");
335 if (retval != MAPI_E_SUCCESS) {
336 MAPIFreeBuffer(RowSet);
337 MAPIFreeBuffer(flaglist);
342 SetRecipientType(&(SRowSet->aRow[0]), MAPI_BCC);
343 mapitest_print_retval(mt, "SetRecipientType");
344 retval = ModifyRecipients(&obj_message, SRowSet);
345 mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_BCC");
346 if (retval != MAPI_E_SUCCESS) {
347 MAPIFreeBuffer(RowSet);
348 MAPIFreeBuffer(flaglist);
352 /* Step 5. Delete the message */
353 id_msgs[0] = mapi_object_get_id(&obj_message);
354 retval = DeleteMessage(&obj_folder, id_msgs, 1);
355 mapitest_print_retval(mt, "DeleteMessage");
356 if (retval != MAPI_E_SUCCESS) {
357 MAPIFreeBuffer(RowSet);
358 MAPIFreeBuffer(flaglist);
362 MAPIFreeBuffer(RowSet);
363 MAPIFreeBuffer(flaglist);
364 mapi_object_release(&obj_message);
365 mapi_object_release(&obj_folder);
366 mapi_object_release(&obj_store);
373 \details Test the RemoveAllRecipients (0xd) operation
376 -# Log on the use private mailbox
377 -# Open the Outbox folder
378 -# Create the message, set recipients
380 -# Remove all recipients
381 -# Delete the message
383 \param mt point on the top-level mapitest structure
385 \return true on success, otherwise false
387 _PUBLIC_ bool mapitest_oxcmsg_RemoveAllRecipients(struct mapitest *mt)
389 enum MAPISTATUS retval;
391 mapi_object_t obj_store;
392 mapi_object_t obj_folder;
393 mapi_object_t obj_message;
395 char **username = NULL;
396 struct SPropTagArray *SPropTagArray = NULL;
397 struct PropertyValue_r value;
398 struct PropertyRowSet_r *RowSet = NULL;
399 struct SRowSet *SRowSet = NULL;
400 struct PropertyTagArray_r *flaglist = NULL;
401 mapi_id_t id_msgs[1];
404 mapi_object_init(&obj_store);
405 retval = OpenMsgStore(mt->session, &obj_store);
406 mapitest_print_retval(mt, "OpenMsgStore");
407 if (GetLastError() != MAPI_E_SUCCESS) {
411 /* Step 2. Open Outbox folder */
412 retval = GetDefaultFolder(&obj_store, &id_folder, olFolderInbox);
413 mapitest_print_retval(mt, "GetDefaultFolder");
414 if (GetLastError() != MAPI_E_SUCCESS) {
418 mapi_object_init(&obj_folder);
419 retval = OpenFolder(&obj_store, id_folder, &obj_folder);
420 mapitest_print_retval(mt, "OpenFolder");
421 if (GetLastError() != MAPI_E_SUCCESS) {
425 /* Step 3. Create the message */
426 mapi_object_init(&obj_message);
427 retval = CreateMessage(&obj_folder, &obj_message);
428 mapitest_print_retval(mt, "CreateMessage");
429 if (GetLastError() != MAPI_E_SUCCESS) {
433 SPropTagArray = set_SPropTagArray(mt->mem_ctx, 0xA,
435 PR_DISPLAY_NAME_UNICODE,
438 PR_TRANSMITTABLE_DISPLAY_NAME_UNICODE,
439 PR_EMAIL_ADDRESS_UNICODE,
442 PR_7BIT_DISPLAY_NAME_UNICODE,
443 PR_SMTP_ADDRESS_UNICODE);
445 username = talloc_array(mt->mem_ctx, char *, 2);
446 username[0] = (char *)mt->profile->mailbox;
449 retval = ResolveNames(mapi_object_get_session(&obj_message),
450 (const char **)username, SPropTagArray,
451 &RowSet, &flaglist, MAPI_UNICODE);
452 mapitest_print_retval_clean(mt, "ResolveNames", retval);
453 if (retval != MAPI_E_SUCCESS) {
457 mapitest_print(mt, "Null RowSet\n");
460 if (!RowSet->cRows) {
461 mapitest_print(mt, "No values in RowSet\n");
462 MAPIFreeBuffer(RowSet);
466 value.ulPropTag = PR_SEND_INTERNET_ENCODING;
468 PropertyRowSet_propcpy(mt->mem_ctx, RowSet, value);
470 SRowSet = talloc_zero(RowSet, struct SRowSet);
471 cast_PropertyRowSet_to_SRowSet(SRowSet, RowSet, SRowSet);
473 SetRecipientType(&(SRowSet->aRow[0]), MAPI_TO);
474 retval = ModifyRecipients(&obj_message, SRowSet);
475 mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_TO");
476 if (GetLastError() != MAPI_E_SUCCESS) {
477 MAPIFreeBuffer(RowSet);
478 MAPIFreeBuffer(flaglist);
482 SetRecipientType(&(SRowSet->aRow[0]), MAPI_CC);
483 retval = ModifyRecipients(&obj_message, SRowSet);
484 mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_CC");
485 if (GetLastError() != MAPI_E_SUCCESS) {
486 MAPIFreeBuffer(RowSet);
487 MAPIFreeBuffer(flaglist);
492 SetRecipientType(&(SRowSet->aRow[0]), MAPI_BCC);
493 retval = ModifyRecipients(&obj_message, SRowSet);
494 mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_BCC");
495 if (GetLastError() != MAPI_E_SUCCESS) {
496 MAPIFreeBuffer(RowSet);
497 MAPIFreeBuffer(flaglist);
503 /* Step 4. Remove all recipients */
504 retval = RemoveAllRecipients(&obj_message);
505 mapitest_print_retval(mt, "RemoveAllRecipients");
506 if (GetLastError() != MAPI_E_SUCCESS) {
507 MAPIFreeBuffer(RowSet);
508 MAPIFreeBuffer(flaglist);
512 /* Step 5. Save the message */
513 retval = SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadOnly);
514 mapitest_print_retval(mt, "SaveChangesMessage");
515 if (GetLastError() != MAPI_E_SUCCESS) {
516 MAPIFreeBuffer(RowSet);
517 MAPIFreeBuffer(flaglist);
521 /* Step 6. Delete the message */
523 id_msgs[0] = mapi_object_get_id(&obj_message);
524 retval = DeleteMessage(&obj_folder, id_msgs, 1);
525 mapitest_print_retval(mt, "DeleteMessage");
526 if (GetLastError() != MAPI_E_SUCCESS) {
527 MAPIFreeBuffer(RowSet);
528 MAPIFreeBuffer(flaglist);
533 MAPIFreeBuffer(RowSet);
534 MAPIFreeBuffer(flaglist);
535 mapi_object_release(&obj_message);
536 mapi_object_release(&obj_folder);
537 mapi_object_release(&obj_store);
544 \details Test the ReadRecipients (0xf) operation
547 -# Log on the use private mailbox
548 -# Open the Outbox folder
549 -# Create the message, set recipients
551 -# Read message recipients
552 -# Delete the message
554 \param mt point on the top-level mapitest structure
556 \return true on success, otherwise false
558 _PUBLIC_ bool mapitest_oxcmsg_ReadRecipients(struct mapitest *mt)
560 enum MAPISTATUS retval;
561 mapi_object_t obj_store;
562 mapi_object_t obj_folder;
563 mapi_object_t obj_message;
565 char **username = NULL;
566 struct SPropTagArray *SPropTagArray = NULL;
567 struct PropertyValue_r value;
568 struct PropertyRowSet_r *RowSet = NULL;
569 struct SRowSet *SRowSet = NULL;
570 struct PropertyTagArray_r *flaglist = NULL;
571 struct ReadRecipientRow *RecipientRows;
573 mapi_id_t id_msgs[1];
576 mapi_object_init(&obj_store);
577 retval = OpenMsgStore(mt->session, &obj_store);
578 mapitest_print_retval(mt, "OpenMsgStore");
579 if (GetLastError() != MAPI_E_SUCCESS) {
583 /* Step 2. Open Outbox folder */
584 retval = GetDefaultFolder(&obj_store, &id_folder, olFolderInbox);
585 mapitest_print_retval(mt, "GetDefaultFolder");
586 if (GetLastError() != MAPI_E_SUCCESS) {
590 mapi_object_init(&obj_folder);
591 retval = OpenFolder(&obj_store, id_folder, &obj_folder);
592 mapitest_print_retval(mt, "OpenFolder");
593 if (GetLastError() != MAPI_E_SUCCESS) {
597 /* Step 3. Create the message */
598 mapi_object_init(&obj_message);
599 retval = CreateMessage(&obj_folder, &obj_message);
600 mapitest_print_retval(mt, "CreateMessage");
601 if (GetLastError() != MAPI_E_SUCCESS) {
605 SPropTagArray = set_SPropTagArray(mt->mem_ctx, 0xA,
607 PR_DISPLAY_NAME_UNICODE,
610 PR_TRANSMITTABLE_DISPLAY_NAME_UNICODE,
611 PR_EMAIL_ADDRESS_UNICODE,
614 PR_7BIT_DISPLAY_NAME_UNICODE,
615 PR_SMTP_ADDRESS_UNICODE);
617 username = talloc_array(mt->mem_ctx, char *, 2);
618 username[0] = (char *)mt->profile->mailbox;
621 retval = ResolveNames(mapi_object_get_session(&obj_message),
622 (const char **)username, SPropTagArray,
623 &RowSet, &flaglist, MAPI_UNICODE);
624 mapitest_print_retval_clean(mt, "ResolveNames", retval);
625 if (retval != MAPI_E_SUCCESS) {
629 mapitest_print(mt, "Null RowSet\n");
632 if (!RowSet->cRows) {
633 mapitest_print(mt, "No values in RowSet\n");
634 MAPIFreeBuffer(RowSet);
638 value.ulPropTag = PR_SEND_INTERNET_ENCODING;
640 PropertyRowSet_propcpy(mt->mem_ctx, RowSet, value);
642 SRowSet = talloc_zero(RowSet, struct SRowSet);
643 cast_PropertyRowSet_to_SRowSet(SRowSet, RowSet, SRowSet);
645 retval = SetRecipientType(&(SRowSet->aRow[0]), MAPI_TO);
646 mapitest_print_retval_clean(mt, "SetRecipientType", retval);
647 if (retval != MAPI_E_SUCCESS) {
648 MAPIFreeBuffer(RowSet);
649 MAPIFreeBuffer(flaglist);
652 retval = ModifyRecipients(&obj_message, SRowSet);
653 mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_TO");
654 if (retval != MAPI_E_SUCCESS) {
655 MAPIFreeBuffer(RowSet);
656 MAPIFreeBuffer(flaglist);
660 SetRecipientType(&(SRowSet->aRow[0]), MAPI_CC);
661 mapitest_print_retval(mt, "SetRecipientType");
662 retval = ModifyRecipients(&obj_message, SRowSet);
663 mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_CC");
664 if (retval != MAPI_E_SUCCESS) {
665 MAPIFreeBuffer(RowSet);
666 MAPIFreeBuffer(flaglist);
670 SetRecipientType(&(SRowSet->aRow[0]), MAPI_BCC);
671 mapitest_print_retval(mt, "SetRecipientType");
672 retval = ModifyRecipients(&obj_message, SRowSet);
673 mapitest_print_retval_fmt(mt, "ModifyRecipients", "(%s)", "MAPI_BCC");
674 if (retval != MAPI_E_SUCCESS) {
675 MAPIFreeBuffer(RowSet);
676 MAPIFreeBuffer(flaglist);
680 /* Step 4. Save the message */
681 retval = SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadOnly);
682 mapitest_print_retval(mt, "SaveChangesMessage");
683 if (retval != MAPI_E_SUCCESS) {
684 MAPIFreeBuffer(RowSet);
685 MAPIFreeBuffer(flaglist);
689 /* Step 5. Read recipients */
690 RecipientRows = talloc_zero(mt->mem_ctx, struct ReadRecipientRow);
691 retval = ReadRecipients(&obj_message, 0, &count, &RecipientRows);
692 mapitest_print_retval(mt, "ReadRecipients");
693 MAPIFreeBuffer(RecipientRows);
694 if (retval != MAPI_E_SUCCESS) {
695 MAPIFreeBuffer(RowSet);
696 MAPIFreeBuffer(flaglist);
700 /* Step 6. Delete the message */
702 id_msgs[0] = mapi_object_get_id(&obj_message);
703 retval = DeleteMessage(&obj_folder, id_msgs, 1);
704 mapitest_print_retval(mt, "DeleteMessage");
705 if (retval != MAPI_E_SUCCESS) {
706 MAPIFreeBuffer(RowSet);
707 MAPIFreeBuffer(flaglist);
712 MAPIFreeBuffer(RowSet);
713 MAPIFreeBuffer(flaglist);
714 mapi_object_release(&obj_message);
715 mapi_object_release(&obj_folder);
716 mapi_object_release(&obj_store);
723 \details Test the SaveChangesMessage (0xc) operation
726 -# Log on the user private mailbox
727 -# Open the Outbox folder
728 -# Create the message
730 -# Delete the message
732 \param mt pointer on the top-level mapitest structure
734 \return true on success, otherwise false
736 _PUBLIC_ bool mapitest_oxcmsg_SaveChangesMessage(struct mapitest *mt)
738 mapi_object_t obj_store;
739 mapi_object_t obj_folder;
740 mapi_object_t obj_message;
742 mapi_id_t id_msgs[1];
745 mapi_object_init(&obj_store);
746 OpenMsgStore(mt->session, &obj_store);
747 mapitest_print_retval(mt, "OpenMsgStore");
748 if (GetLastError() != MAPI_E_SUCCESS) {
752 /* Step 2. Open Outbox folder */
753 GetDefaultFolder(&obj_store, &id_folder, olFolderOutbox);
754 mapitest_print_retval(mt, "GetDefaultFolder");
755 if (GetLastError() != MAPI_E_SUCCESS) {
759 mapi_object_init(&obj_folder);
760 OpenFolder(&obj_store, id_folder, &obj_folder);
761 mapitest_print_retval(mt, "OpenFolder");
762 if (GetLastError() != MAPI_E_SUCCESS) {
766 /* Step 3. Create the message */
767 mapi_object_init(&obj_message);
768 CreateMessage(&obj_folder, &obj_message);
769 mapitest_print_retval(mt, "CreateMessage");
770 if (GetLastError() != MAPI_E_SUCCESS) {
774 /* Step 4. Save the message */
775 SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadOnly);
776 mapitest_print_retval(mt, "SaveChangesMessage");
777 if (GetLastError() != MAPI_E_SUCCESS) {
781 /* Step 5. Delete the saved message */
782 id_msgs[0] = mapi_object_get_id(&obj_message);
783 DeleteMessage(&obj_folder, id_msgs, 1);
784 mapitest_print_retval(mt, "DeleteMessage");
785 if (GetLastError() != MAPI_E_SUCCESS) {
790 mapi_object_release(&obj_message);
791 mapi_object_release(&obj_folder);
792 mapi_object_release(&obj_store);
799 \details Test the GetMessageStatus (0x1f) operation
802 -# Log on the user private mailbox
803 -# Open the outbox folder
804 -# Create the message
806 -# Get outbox contents table
807 -# Get messages status
808 -# Delete the message
810 \param mt pointer on the top-level mapitest structure
812 \return true on success, otherwise false
814 _PUBLIC_ bool mapitest_oxcmsg_GetMessageStatus(struct mapitest *mt)
816 enum MAPISTATUS retval;
817 mapi_object_t obj_store;
818 mapi_object_t obj_folder;
819 mapi_object_t obj_message;
820 mapi_object_t obj_ctable;
822 mapi_id_t id_msgs[1];
823 struct SPropTagArray *SPropTagArray;
824 struct SRowSet SRowSet;
830 mapi_object_init(&obj_store);
831 mapi_object_init(&obj_folder);
832 mapi_object_init(&obj_message);
833 mapi_object_init(&obj_ctable);
834 retval = OpenMsgStore(mt->session, &obj_store);
835 mapitest_print_retval_clean(mt, "OpenMsgStore", retval);
836 if (retval != MAPI_E_SUCCESS) {
840 /* Step 2. Open Outbox folder */
841 retval = GetDefaultFolder(&obj_store, &id_folder, olFolderOutbox);
842 mapitest_print_retval_clean(mt, "GetDefaultFolder", retval);
843 if (retval != MAPI_E_SUCCESS) {
847 retval = OpenFolder(&obj_store, id_folder, &obj_folder);
848 mapitest_print_retval_clean(mt, "OpenFolder", retval);
849 if (retval != MAPI_E_SUCCESS) {
853 /* Step 3. Create the message */
854 retval = CreateMessage(&obj_folder, &obj_message);
855 mapitest_print_retval_clean(mt, "CreateMessage", retval);
856 if (retval != MAPI_E_SUCCESS) {
860 /* Step 4. Save the message */
861 retval = SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadOnly);
862 mapitest_print_retval_clean(mt, "SaveChangesMessage", retval);
863 if (retval != MAPI_E_SUCCESS) {
867 /* Step 5. Get outbox contents table */
868 retval = GetContentsTable(&obj_folder, &obj_ctable, 0, &count);
869 mapitest_print_retval_clean(mt, "GetContentsTable", retval);
870 if (retval != MAPI_E_SUCCESS) {
874 SPropTagArray = set_SPropTagArray(mt->mem_ctx, 0x2,
875 PR_MID, PR_MSG_STATUS);
876 retval = SetColumns(&obj_ctable, SPropTagArray);
877 MAPIFreeBuffer(SPropTagArray);
878 mapitest_print_retval_clean(mt, "GetMessageStatus", retval);
879 if (retval != MAPI_E_SUCCESS) {
883 /* Step 6. Get Message Status */
884 while (((retval = QueryRows(&obj_ctable, count, TBL_ADVANCE, &SRowSet)) != MAPI_E_NOT_FOUND) &&
886 count -= SRowSet.cRows;
887 for (i = 0; i < SRowSet.cRows; i++) {
888 retval = GetMessageStatus(&obj_folder, SRowSet.aRow[i].lpProps[0].value.d, &status);
889 mapitest_print_retval_clean(mt, "GetMessageStatus", retval);
890 if (retval != MAPI_E_SUCCESS) {
896 /* Step 7. Delete the saved message */
897 id_msgs[0] = mapi_object_get_id(&obj_message);
898 retval = DeleteMessage(&obj_folder, id_msgs, 1);
899 mapitest_print_retval_clean(mt, "DeleteMessage", retval);
900 if (retval != MAPI_E_SUCCESS) {
905 mapi_object_release(&obj_ctable);
906 mapi_object_release(&obj_message);
907 mapi_object_release(&obj_folder);
908 mapi_object_release(&obj_store);
919 static struct msgstatus msgstatus[] = {
920 {MSGSTATUS_HIDDEN, "MSGSTATUS_HIDDEN"},
921 {MSGSTATUS_HIGHLIGHTED, "MSGSTATUS_HIGHLIGHTED"},
922 {MSGSTATUS_TAGGED, "MSGSTATUS_TAGGED"},
923 {MSGSTATUS_REMOTE_DOWNLOAD, "MSGSTATUS_REMOTE_DOWNLOAD"},
924 {MSGSTATUS_REMOTE_DELETE, "MSGSTATUS_REMOTE_DELETE"},
925 {MSGSTATUS_DELMARKED, "MSGSTATUS_DELMARKED"},
930 \details Test the GetMessageStatus (0x1f) operation
933 -# Log on the user private mailbox
934 -# Open the outbox folder
935 -# Create the message
937 -# Get outbox contents table
938 -# Set different messages status, then get them and compare values
939 -# Delete the message
941 \param mt pointer on the top-level mapitest structure
943 \return true on success, otherwise false
945 _PUBLIC_ bool mapitest_oxcmsg_SetMessageStatus(struct mapitest *mt)
947 enum MAPISTATUS retval;
948 mapi_object_t obj_store;
949 mapi_object_t obj_folder;
950 mapi_object_t obj_message;
951 mapi_object_t obj_ctable;
953 mapi_id_t id_msgs[1];
954 struct SPropTagArray *SPropTagArray;
955 struct SRowSet SRowSet;
958 uint32_t ulOldStatus = 0;
959 uint32_t ulOldStatus2 = 0;
963 mapi_object_init(&obj_store);
964 mapi_object_init(&obj_folder);
965 mapi_object_init(&obj_message);
966 mapi_object_init(&obj_ctable);
967 retval = OpenMsgStore(mt->session, &obj_store);
968 mapitest_print_retval_clean(mt, "OpenMsgStore", retval);
969 if (retval != MAPI_E_SUCCESS) {
974 /* Step 2. Open Outbox folder */
975 retval = GetDefaultFolder(&obj_store, &id_folder, olFolderOutbox);
976 mapitest_print_retval_clean(mt, "GetDefaultFolder", retval);
977 if (retval != MAPI_E_SUCCESS) {
982 retval = OpenFolder(&obj_store, id_folder, &obj_folder);
983 mapitest_print_retval_clean(mt, "OpenFolder", retval);
984 if (retval != MAPI_E_SUCCESS) {
989 /* Step 3. Create the message */
990 retval = CreateMessage(&obj_folder, &obj_message);
991 mapitest_print_retval_clean(mt, "CreateMessage", retval);
992 if (retval != MAPI_E_SUCCESS) {
997 /* Step 4. Save the message */
998 retval = SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadOnly);
999 mapitest_print_retval_clean(mt, "SaveChangesMessage", retval);
1000 if (retval != MAPI_E_SUCCESS) {
1005 /* Step 5. Get outbox contents table */
1006 retval = GetContentsTable(&obj_folder, &obj_ctable, 0, &count);
1007 mapitest_print_retval_clean(mt, "GetContentsTable", retval);
1008 if (retval != MAPI_E_SUCCESS) {
1013 SPropTagArray = set_SPropTagArray(mt->mem_ctx, 0x2,
1014 PR_MID, PR_MSG_STATUS);
1015 retval = SetColumns(&obj_ctable, SPropTagArray);
1016 mapitest_print_retval_clean(mt, "SetColumns", retval);
1017 MAPIFreeBuffer(SPropTagArray);
1018 if (retval != MAPI_E_SUCCESS) {
1023 /* Fetch the first email */
1024 retval = QueryRows(&obj_ctable, 1, TBL_NOADVANCE, &SRowSet);
1025 mapitest_print_retval_clean(mt, "QueryRows", retval);
1026 if (retval != MAPI_E_SUCCESS || SRowSet.cRows == 0) {
1031 /* Step 6. SetMessageStatus + GetMessageStatus + Comparison */
1032 for (i = 0; msgstatus[i].name; i++) {
1033 retval = SetMessageStatus(&obj_folder, SRowSet.aRow[0].lpProps[0].value.d,
1034 msgstatus[i].status, msgstatus[i].status, &ulOldStatus2);
1035 mapitest_print_retval_clean(mt, "SetMessageStatus", retval);
1036 if (retval != MAPI_E_SUCCESS) {
1041 retval = GetMessageStatus(&obj_folder, SRowSet.aRow[0].lpProps[0].value.d, &ulOldStatus);
1042 mapitest_print_retval_clean(mt, "GetMessageStatus", retval);
1043 if (retval != MAPI_E_SUCCESS) {
1048 if ((ulOldStatus != ulOldStatus2) && (ulOldStatus & msgstatus[i].status)) {
1050 mapitest_print(mt, "* %-35s: %s 0x%.8x\n", "Comparison", msgstatus[i].name, GetLastError());
1054 /* Step 7. Delete the saved message */
1055 id_msgs[0] = mapi_object_get_id(&obj_message);
1056 DeleteMessage(&obj_folder, id_msgs, 1);
1057 mapitest_print_retval(mt, "DeleteMessage");
1058 if (GetLastError() != MAPI_E_SUCCESS) {
1064 mapi_object_release(&obj_ctable);
1065 mapi_object_release(&obj_message);
1066 mapi_object_release(&obj_folder);
1067 mapi_object_release(&obj_store);
1073 \details Test the SetReadFlags (0x66) operation
1076 -# Opens the Inbox folder and creates some test content
1077 -# Checks that the PR_MESSAGE_FLAGS property on each message is 0x0
1078 -# Apply SetReadFlags() on every second messages
1079 -# Check the results are as expected
1080 -# Apply SetReadFlags() again
1081 -# Check the results are as expected
1084 \param mt pointer on the top-level mapitest structure
1086 \return true on success, otherwise false
1088 _PUBLIC_ bool mapitest_oxcmsg_SetReadFlags(struct mapitest *mt)
1090 enum MAPISTATUS retval;
1092 mapi_object_t obj_htable;
1093 mapi_object_t obj_test_folder;
1094 struct SPropTagArray *SPropTagArray;
1095 struct SRowSet SRowSet;
1096 struct mt_common_tf_ctx *context;
1098 uint64_t messageIds[5];
1101 if (! mapitest_common_setup(mt, &obj_htable, NULL)) {
1105 /* Fetch the contents table for the test folder */
1107 mapi_object_init(&(obj_test_folder));
1108 retval = GetContentsTable(&(context->obj_test_folder), &(obj_test_folder), 0, NULL);
1109 mapitest_print_retval_clean(mt, "GetContentsTable", retval);
1110 if (retval != MAPI_E_SUCCESS) {
1115 SPropTagArray = set_SPropTagArray(mt->mem_ctx, 0x2, PR_MID, PR_MESSAGE_FLAGS);
1116 retval = SetColumns(&obj_test_folder, SPropTagArray);
1117 mapitest_print_retval_clean(mt, "SetColumns", retval);
1118 MAPIFreeBuffer(SPropTagArray);
1119 if (retval != MAPI_E_SUCCESS) {
1124 retval = QueryRows(&obj_test_folder, 10, TBL_NOADVANCE, &SRowSet);
1125 mapitest_print_retval_clean(mt, "QueryRows", retval);
1126 if (retval != MAPI_E_SUCCESS) {
1130 /* 0x0400 is mfEverRead - the message has been read at least once. We see this on Exchange 2010 */
1131 for (i = 0; i < 10; ++i) {
1132 if ((*(const uint32_t *)get_SPropValue_data(&(SRowSet.aRow[i].lpProps[1])) & ~0x0400) != 0x0) {
1133 mapitest_print(mt, "* %-35s: unexpected flag at %i 0x%x\n", "QueryRows", i,
1134 (*(const uint32_t *)get_SPropValue_data(&(SRowSet.aRow[i].lpProps[1]))));
1140 for (i = 0; i < 5; ++i) {
1141 messageIds[i] = (*(const uint64_t *)get_SPropValue_data(&(SRowSet.aRow[i*2].lpProps[0])));
1144 retval = SetReadFlags(&(context->obj_test_folder), 0x0, 5, messageIds);
1145 mapitest_print_retval_clean(mt, "SetReadFlags", retval);
1146 if (retval != MAPI_E_SUCCESS) {
1151 retval = QueryRows(&obj_test_folder, 10, TBL_NOADVANCE, &SRowSet);
1152 mapitest_print_retval_clean(mt, "QueryRows", retval);
1153 if (retval != MAPI_E_SUCCESS) {
1157 for (i = 0; i < 10; i+=2) {
1158 if ((*(const uint32_t *)get_SPropValue_data(&(SRowSet.aRow[i].lpProps[1])) & ~0x0400) != MSGFLAG_READ) {
1159 mapitest_print(mt, "* %-35s: unexpected flag (0) at %i 0x%x\n", "QueryRows", i,
1160 (*(const uint32_t *)get_SPropValue_data(&(SRowSet.aRow[i].lpProps[1]))));
1164 if ((*(const uint32_t *)get_SPropValue_data(&(SRowSet.aRow[i+1].lpProps[1])) & ~0x0400) != 0x0) {
1165 mapitest_print(mt, "* %-35s: unexpected flag (1) at %i 0x%x\n", "QueryRows", i,
1166 (*(const uint32_t *)get_SPropValue_data(&(SRowSet.aRow[i+1].lpProps[1]))));
1172 SetReadFlags(&(context->obj_test_folder), CLEAR_READ_FLAG, 5, messageIds);
1174 retval = QueryRows(&obj_test_folder, 10, TBL_NOADVANCE, &SRowSet);
1175 mapitest_print_retval_clean(mt, "QueryRows", retval);
1176 if (retval != MAPI_E_SUCCESS) {
1180 for (i = 0; i < 10; ++i) {
1181 if ((*(const uint32_t *)get_SPropValue_data(&(SRowSet.aRow[i].lpProps[1])) & ~0x0400) != 0x0) {
1182 mapitest_print(mt, "* %-35s: unexpected flag (3) at %i 0x%x\n", "QueryRows", i,
1183 (*(const uint32_t *)get_SPropValue_data(&(SRowSet.aRow[i].lpProps[1]))));
1190 /* Cleanup and release */
1191 talloc_free(SRowSet.aRow);
1192 mapi_object_release(&obj_htable);
1193 mapitest_common_cleanup(mt);
1199 \details Test the OpenEmbeddedMessage (0x46) and CreateAttach (0x23) operations
1202 -# Logs on the user private mailbox
1203 -# Open the Inbox folder
1204 -# Create a test message
1205 -# Embed a message in the test message
1206 -# Delete the test message
1208 \param mt pointer to the top-level mapitest structure
1210 \return true on success, otherwise false
1212 _PUBLIC_ bool mapitest_oxcmsg_OpenEmbeddedMessage(struct mapitest *mt)
1214 enum MAPISTATUS retval;
1216 mapi_object_t obj_store;
1217 mapi_object_t obj_folder;
1218 mapi_object_t obj_message;
1219 mapi_object_t obj_attach;
1220 mapi_object_t obj_embeddedmsg;
1221 mapi_id_t id_msgs[1];
1222 struct SPropValue attach[2];
1223 struct SRowSet SRowSet;
1224 struct SPropTagArray SPropTagArray;
1227 mapi_object_init(&obj_store);
1228 retval = OpenMsgStore(mt->session, &obj_store);
1229 if (retval != MAPI_E_SUCCESS) {
1230 mapi_object_release(&obj_store);
1234 /* Step 2. Open Inbox folder */
1235 mapi_object_init(&obj_folder);
1236 ret = mapitest_common_folder_open(mt, &obj_store, &obj_folder, olFolderInbox);
1238 mapi_object_release(&obj_folder);
1239 mapi_object_release(&obj_store);
1243 /* Step 3. Create the tmp message and save it */
1244 mapi_object_init(&obj_message);
1245 ret = mapitest_common_message_create(mt, &obj_folder, &obj_message, OXCMSG_SETREADFLAGS);
1246 if (ret == false) return ret;
1248 retval = SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadWrite);
1249 mapitest_print(mt, "* %-35s: 0x%.8x\n", "SaveChangesMessage", retval);
1250 if (retval != MAPI_E_SUCCESS) {
1251 mapi_object_release(&obj_message);
1252 mapi_object_release(&obj_folder);
1253 mapi_object_release(&obj_store);
1257 /* Step 4. Embed another message in the message */
1258 mapi_object_init(&obj_attach);
1259 retval = CreateAttach(&obj_message, &obj_attach);
1260 mapitest_print(mt, "* %-35s: 0x%.8x\n", "CreateAttach", retval);
1261 if (retval != MAPI_E_SUCCESS) {
1262 mapi_object_release(&obj_attach);
1263 mapi_object_release(&obj_message);
1264 mapi_object_release(&obj_folder);
1265 mapi_object_release(&obj_store);
1269 /* use SetProps() to set the attachment up */
1270 attach[0].ulPropTag = PR_ATTACH_METHOD;
1271 attach[0].value.l = ATTACH_EMBEDDED_MSG;
1272 attach[1].ulPropTag = PR_RENDERING_POSITION;
1273 attach[1].value.l = 0;
1274 retval = SetProps(&obj_attach, 0, attach, 2);
1275 mapitest_print(mt, "* %-35s: 0x%.8x\n", "SetProps", retval);
1276 if (retval != MAPI_E_SUCCESS) {
1277 mapi_object_release(&obj_attach);
1278 mapi_object_release(&obj_message);
1279 mapi_object_release(&obj_folder);
1280 mapi_object_release(&obj_store);
1284 mapi_object_init(&obj_embeddedmsg);
1285 retval = OpenEmbeddedMessage(&obj_attach, &obj_embeddedmsg, MAPI_CREATE);
1286 mapitest_print(mt, "* %-35s: 0x%.8x\n", "OpenEmbeddedMessage", retval);
1287 if (retval != MAPI_E_SUCCESS) {
1288 mapi_object_release(&obj_embeddedmsg);
1289 mapi_object_release(&obj_attach);
1290 mapi_object_release(&obj_message);
1291 mapi_object_release(&obj_folder);
1292 mapi_object_release(&obj_store);
1296 ret = mapitest_common_message_fill(mt, &obj_embeddedmsg, "MT EmbeddedMessage");
1298 mapi_object_release(&obj_embeddedmsg);
1299 mapi_object_release(&obj_attach);
1300 mapi_object_release(&obj_message);
1301 mapi_object_release(&obj_folder);
1302 mapi_object_release(&obj_store);
1306 // Save the changes to the embedded message
1307 retval = SaveChangesMessage(&obj_message, &obj_embeddedmsg, KeepOpenReadOnly);
1308 mapitest_print(mt, "* %-35s: 0x%.8x\n", "SaveChangesMessage", retval);
1309 if (retval != MAPI_E_SUCCESS) {
1310 mapi_object_release(&obj_embeddedmsg);
1311 mapi_object_release(&obj_attach);
1312 mapi_object_release(&obj_message);
1313 mapi_object_release(&obj_folder);
1314 mapi_object_release(&obj_store);
1317 // Save the changes to the attachment and then the message
1318 retval = SaveChangesAttachment(&obj_message, &obj_attach, KeepOpenReadOnly);
1319 mapitest_print(mt, "* %-35s: 0x%.8x\n", "SaveChangesAttachment", retval);
1320 if (retval != MAPI_E_SUCCESS) {
1321 mapi_object_release(&obj_embeddedmsg);
1322 mapi_object_release(&obj_attach);
1323 mapi_object_release(&obj_message);
1324 mapi_object_release(&obj_folder);
1325 mapi_object_release(&obj_store);
1329 retval = SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadOnly);
1330 mapitest_print(mt, "* %-35s: 0x%.8x\n", "SaveChangesMessage", retval);
1331 if (retval != MAPI_E_SUCCESS) {
1332 mapi_object_release(&obj_embeddedmsg);
1333 mapi_object_release(&obj_attach);
1334 mapi_object_release(&obj_message);
1335 mapi_object_release(&obj_folder);
1336 mapi_object_release(&obj_store);
1340 /* Step 5. Open the embedded message */
1341 mapi_object_init(&obj_attach);
1342 retval = OpenAttach(&obj_message, 0, &obj_attach);
1343 mapitest_print(mt, "* %-35s: 0x%.8x\n", "OpenAttach", retval);
1344 if (retval != MAPI_E_SUCCESS) {
1345 mapi_object_release(&obj_embeddedmsg);
1346 mapi_object_release(&obj_attach);
1347 mapi_object_release(&obj_message);
1348 mapi_object_release(&obj_folder);
1349 mapi_object_release(&obj_store);
1352 retval = OpenEmbeddedMessage(&obj_attach, &obj_embeddedmsg, MAPI_READONLY);
1353 mapitest_print(mt, "* %-35s: 0x%.8x\n", "OpenEmbeddedMessage", retval);
1354 if (retval != MAPI_E_SUCCESS) {
1355 mapi_object_release(&obj_embeddedmsg);
1356 mapi_object_release(&obj_attach);
1357 mapi_object_release(&obj_message);
1358 mapi_object_release(&obj_folder);
1359 mapi_object_release(&obj_store);
1363 /* Step 6. Get the recipient table */
1364 retval = GetRecipientTable(&obj_embeddedmsg, &SRowSet, &SPropTagArray);
1365 mapitest_print(mt, "* %-35s: 0x%.8x\n", "GetRecipientTable", retval);
1367 mapitest_print_SRowSet(mt, &SRowSet, "\t * ");
1368 mapi_object_release(&obj_embeddedmsg);
1370 /* Step 7. Delete the message */
1371 id_msgs[0] = mapi_object_get_id(&obj_message);
1372 retval = DeleteMessage(&obj_folder, id_msgs, 1);
1373 mapitest_print(mt, "* %-35s: 0x%.8x\n", "DeleteMessage", GetLastError());
1374 if (GetLastError() != MAPI_E_SUCCESS) {
1375 mapi_object_release(&obj_attach);
1376 mapi_object_release(&obj_message);
1377 mapi_object_release(&obj_folder);
1378 mapi_object_release(&obj_store);
1383 mapi_object_release(&obj_attach);
1384 mapi_object_release(&obj_message);
1385 mapi_object_release(&obj_folder);
1386 mapi_object_release(&obj_store);
1393 \details Test the GetValidAttachments (0x52) and CreateAttach (0x23) operations
1396 -# Logs on the user private mailbox
1397 -# Open the Inbox folder
1398 -# Create a test message
1399 -# Check the number of valid attachments is zero
1400 -# Create two attachments
1401 -# Check the number of valid attachments is two (numbered 0 and 1)
1402 -# Delete the first attachment
1403 -# Check the number of valid attachments is one (numbered 1)
1404 -# Delete the test message
1406 \param mt pointer to the top-level mapitest structure
1408 \return true on success, otherwise false
1410 _PUBLIC_ bool mapitest_oxcmsg_GetValidAttachments(struct mapitest *mt)
1412 enum MAPISTATUS retval;
1414 mapi_object_t obj_store;
1415 mapi_object_t obj_folder;
1416 mapi_object_t obj_message;
1417 mapi_object_t obj_attach0;
1418 mapi_object_t obj_attach1;
1419 mapi_id_t id_msgs[1];
1420 struct SPropValue attach[3];
1422 uint32_t *attachmentIds;
1425 mapi_object_init(&obj_store);
1426 retval = OpenMsgStore(mt->session, &obj_store);
1427 if (retval != MAPI_E_SUCCESS) {
1428 mapi_object_release(&obj_store);
1432 /* Step 2. Open Inbox folder */
1433 mapi_object_init(&obj_folder);
1434 ret = mapitest_common_folder_open(mt, &obj_store, &obj_folder, olFolderInbox);
1436 mapi_object_release(&obj_folder);
1437 mapi_object_release(&obj_store);
1441 /* Step 3. Create the test message and save it */
1442 mapi_object_init(&obj_message);
1443 ret = mapitest_common_message_create(mt, &obj_folder, &obj_message, OXCMSG_SETREADFLAGS);
1444 if (ret == false) return ret;
1446 retval = SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadWrite);
1447 mapitest_print_retval_clean(mt, "SaveChangesMessage", retval);
1448 if (retval != MAPI_E_SUCCESS) {
1449 mapi_object_release(&obj_message);
1450 mapi_object_release(&obj_folder);
1451 mapi_object_release(&obj_store);
1457 /* Step 4. Check the number of valid attachments */
1459 retval = GetValidAttach(&obj_message, &numAttach, &attachmentIds);
1460 mapitest_print_retval_fmt_clean(mt, "GetValidAttach", retval, "%i", numAttach);
1461 if (numAttach != 0) {
1463 goto cleanup_wo_attach;
1465 if (retval != MAPI_E_SUCCESS) {
1467 goto cleanup_wo_attach;
1470 /* Step 5. Create two attachments to the message */
1471 mapi_object_init(&obj_attach0);
1472 mapi_object_init(&obj_attach1);
1473 retval = CreateAttach(&obj_message, &obj_attach0);
1474 mapitest_print_retval_clean(mt, "CreateAttach", retval);
1475 if (retval != MAPI_E_SUCCESS) {
1480 /* use SetProps() to set the attachment up */
1481 attach[0].ulPropTag = PR_ATTACH_METHOD;
1482 attach[0].value.l = ATTACH_BY_VALUE;
1483 attach[1].ulPropTag = PR_RENDERING_POSITION;
1484 attach[1].value.l = 0;
1485 attach[2].ulPropTag = PR_ATTACH_FILENAME;
1486 attach[2].value.lpszA = "Attachment 0";
1487 retval = SetProps(&obj_attach0, 0, attach, 3);
1488 mapitest_print_retval_clean(mt, "SetProps", retval);
1489 if (retval != MAPI_E_SUCCESS) {
1494 /* Save the changes to the attachment and then the message */
1495 retval = SaveChangesAttachment(&obj_message, &obj_attach0, KeepOpenReadOnly);
1496 mapitest_print_retval_clean(mt, "SaveChangesAttachment", retval);
1497 if (retval != MAPI_E_SUCCESS) {
1502 retval = CreateAttach(&obj_message, &obj_attach1);
1503 mapitest_print_retval_clean(mt, "CreateAttach", retval);
1504 if (retval != MAPI_E_SUCCESS) {
1509 /* use SetProps() to set the attachment up */
1510 attach[0].ulPropTag = PR_ATTACH_METHOD;
1511 attach[0].value.l = ATTACH_BY_VALUE;
1512 attach[1].ulPropTag = PR_RENDERING_POSITION;
1513 attach[1].value.l = 0;
1514 attach[2].ulPropTag = PR_ATTACH_FILENAME;
1515 attach[2].value.lpszA = "Attachment 1";
1516 retval = SetProps(&obj_attach1, 0, attach, 3);
1517 mapitest_print_retval_clean(mt, "SetProps", retval);
1518 if (retval != MAPI_E_SUCCESS) {
1523 /* Save the changes to the attachment and then the message */
1524 retval = SaveChangesAttachment(&obj_message, &obj_attach1, KeepOpenReadOnly);
1525 mapitest_print_retval_clean(mt, "SaveChangesAttachment", retval);
1526 if (retval != MAPI_E_SUCCESS) {
1531 retval = SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadWrite);
1532 mapitest_print_retval_clean(mt, "SaveChangesMessage", retval);
1533 if (retval != MAPI_E_SUCCESS) {
1538 /* Step 6. Check the number of valid attachments */
1540 retval = GetValidAttach(&obj_message, &numAttach, &attachmentIds);
1541 mapitest_print_retval_fmt_clean(mt, "GetValidAttach", retval, "%i", numAttach);
1542 if (numAttach != 2) {
1546 mapitest_print(mt, "IDs: %d, %d\n", attachmentIds[0], attachmentIds[1]);
1547 if ( (attachmentIds[0] != 0) || (attachmentIds[1] != 1) ) {
1551 if (retval != MAPI_E_SUCCESS) {
1556 /* Step 7. Delete the first attachment */
1557 retval = DeleteAttach(&obj_message, attachmentIds[0]);
1558 mapitest_print_retval_clean(mt, "DeleteAttach", retval);
1559 if (retval != MAPI_E_SUCCESS) {
1564 /* Step 8. Check the number of valid attachments */
1566 retval = GetValidAttach(&obj_message, &numAttach, &attachmentIds);
1567 mapitest_print_retval_fmt_clean(mt, "GetValidAttach", retval, "%i", numAttach);
1568 if (numAttach != 1) {
1572 mapitest_print(mt, "IDs: %d\n", attachmentIds[0]);
1573 if ( (attachmentIds[0] != 1) ) {
1577 if (retval != MAPI_E_SUCCESS) {
1582 /* Step 9. Delete the message */
1583 id_msgs[0] = mapi_object_get_id(&obj_message);
1584 retval = DeleteMessage(&obj_folder, id_msgs, 1);
1585 mapitest_print_retval_clean(mt, "DeleteMessage", retval);
1586 if (retval != MAPI_E_SUCCESS) {
1593 mapi_object_release(&obj_attach0);
1594 mapi_object_release(&obj_attach1);
1596 mapi_object_release(&obj_message);
1597 mapi_object_release(&obj_folder);
1598 mapi_object_release(&obj_store);
1604 \details Test the ReloadCachedInformation (0x10) operation
1607 -# Logs on to the user private mailbox
1608 -# Open the outbox folder
1609 -# Create the message
1611 -# Reloads the cached message information
1612 -# Delete the message
1614 \param mt pointer to the top-level mapitest structure
1616 \return true on success, otherwise false
1618 _PUBLIC_ bool mapitest_oxcmsg_ReloadCachedInformation(struct mapitest *mt)
1620 enum MAPISTATUS retval;
1621 mapi_object_t obj_store;
1622 mapi_object_t obj_folder;
1623 mapi_object_t obj_message;
1624 mapi_id_t id_folder;
1625 mapi_id_t id_msgs[1];
1630 mapi_object_init(&obj_folder);
1631 mapi_object_init(&obj_message);
1633 mapi_object_init(&obj_store);
1634 retval = OpenMsgStore(mt->session, &obj_store);
1635 mapitest_print_retval(mt, "OpenMsgStore");
1636 if (retval != MAPI_E_SUCCESS) {
1641 /* Step 2. Open Outbox folder */
1642 retval = GetDefaultFolder(&obj_store, &id_folder, olFolderOutbox);
1643 mapitest_print_retval(mt, "GetDefaultFolder");
1644 if (retval != MAPI_E_SUCCESS) {
1649 retval = OpenFolder(&obj_store, id_folder, &obj_folder);
1650 mapitest_print_retval(mt, "OpenFolder");
1651 if (retval != MAPI_E_SUCCESS) {
1656 /* Step 3. Create the message */
1657 retval = CreateMessage(&obj_folder, &obj_message);
1658 mapitest_print_retval(mt, "CreateMessage");
1659 if (retval != MAPI_E_SUCCESS) {
1664 /* Step 4. Save the message */
1665 retval = SaveChangesMessage(&obj_folder, &obj_message, KeepOpenReadOnly);
1666 mapitest_print_retval(mt, "SaveChangesMessage");
1667 if (retval != MAPI_E_SUCCESS) {
1672 /* Step 5. Reload cached information */
1673 retval = ReloadCachedInformation(&obj_message);
1674 mapitest_print_retval(mt, "ReloadCachedInformation");
1675 if (retval != MAPI_E_SUCCESS) {
1680 /* Step 6. Delete the saved message */
1681 id_msgs[0] = mapi_object_get_id(&obj_message);
1682 retval = DeleteMessage(&obj_folder, id_msgs, 1);
1683 mapitest_print_retval(mt, "DeleteMessage");
1684 if (retval != MAPI_E_SUCCESS) {
1691 mapi_object_release(&obj_message);
1692 mapi_object_release(&obj_folder);
1693 mapi_object_release(&obj_store);