xref: /haiku/src/add-ons/tracker/mark_as/MarkAsRead.cpp (revision 4bd0c1066b227cec4b79883bdef697c7a27f2e90)
1 /*
2  * Copyright 2009-2013, Axel Dörfler, axeld@pinc-software.de.
3  * Copyright 2006, Ryan Leavengood, leavengood@gmail.com. All rights reserved.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include <E-mail.h>
9 #include <Entry.h>
10 #include <MailDaemon.h>
11 #include <mail_util.h>
12 #include <Message.h>
13 #include <Node.h>
14 #include <String.h>
15 
16 
17 extern "C" void
18 process_refs(entry_ref dir, BMessage* message, void* /*reserved*/)
19 {
20 	entry_ref ref;
21 	for (int i = 0; message->FindRef("refs", i, &ref) == B_OK; i++) {
22 		BNode node(&ref);
23 		BString type;
24 
25 		if (node.InitCheck() == B_OK
26 			&& node.ReadAttrString("BEOS:TYPE", &type) == B_OK
27 			&& (type == B_MAIL_TYPE || type == B_PARTIAL_MAIL_TYPE)) {
28 			BString previousStatus;
29 			BString status("Read");
30 			read_flags previousRead;
31 			// if we're marking it via the add-on, we haven't really read it
32 			// so use B_SEEN instead of B_READ
33 			read_flags read = B_SEEN;
34 
35 			// Update the MAIL:read status to match
36 			// Check both B_SEEN and B_READ
37 			// (so we don't overwrite B_READ with B_SEEN)
38 			if (read_read_attr(node, previousRead) != B_OK
39 				|| (previousRead != B_SEEN && previousRead != B_READ)) {
40 				int32 account;
41 				if (node.ReadAttr(B_MAIL_ATTR_ACCOUNT_ID, B_INT32_TYPE,
42 						0LL, &account, sizeof(account)) == sizeof(account))
43 					BMailDaemon().MarkAsRead(account, ref, read);
44 				else
45 					write_read_attr(node, read);
46 			}
47 
48 			// We want to keep the previous behavior of updating the status
49 			// string, but write_read_attr will only change the status string
50 			// if it's one of "New", "Seen", or "Read" (and not, for example,
51 			// "Replied"), so we change the status string here
52 			// Only update the attribute if there is an actual change
53 			if (node.ReadAttrString(B_MAIL_ATTR_STATUS, &previousStatus) != B_OK
54 				|| previousStatus != status)
55 				node.WriteAttrString(B_MAIL_ATTR_STATUS, &status);
56 		}
57 	}
58 }
59