xref: /haiku/src/apps/mail/MailSupport.cpp (revision b671e9bbdbd10268a042b4f4cc4317ccd03d105e)
1 /*
2 Open Tracker License
3 
4 Terms and Conditions
5 
6 Copyright (c) 1991-2001, Be Incorporated. All rights reserved.
7 
8 Permission is hereby granted, free of charge, to any person obtaining a copy of
9 this software and associated documentation files (the "Software"), to deal in
10 the Software without restriction, including without limitation the rights to
11 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
12 of the Software, and to permit persons to whom the Software is furnished to do
13 so, subject to the following conditions:
14 
15 The above copyright notice and this permission notice applies to all licensees
16 and shall be included in all copies or substantial portions of the Software.
17 
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF TITLE, MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 BE INCORPORATED BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION
23 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 
25 Except as contained in this notice, the name of Be Incorporated shall not be
26 used in advertising or otherwise to promote the sale, use or other dealings in
27 this Software without prior written authorization from Be Incorporated.
28 
29 BeMail(TM), Tracker(TM), Be(R), BeOS(R), and BeIA(TM) are trademarks or registered trademarks
30 of Be Incorporated in the United States and other countries. Other brand product
31 names are registered trademarks or trademarks of their respective holders.
32 All rights reserved.
33 */
34 
35 
36 #include "MailSupport.h"
37 
38 #include <fcntl.h>
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <string.h>
42 #include <sys/stat.h>
43 #include <sys/utsname.h>
44 #include <unistd.h>
45 
46 #include <Autolock.h>
47 #include <Clipboard.h>
48 #include <Debug.h>
49 #include <E-mail.h>
50 #include <InterfaceKit.h>
51 #include <Roster.h>
52 #include <Screen.h>
53 #include <StorageKit.h>
54 #include <String.h>
55 #include <TextView.h>
56 #include <UTF8.h>
57 
58 #include <fs_index.h>
59 #include <fs_info.h>
60 
61 #include <MailMessage.h>
62 #include <MailSettings.h>
63 #include <MailDaemon.h>
64 #include <mail_util.h>
65 #include <MDRLanguage.h>
66 
67 #include <CharacterSetRoster.h>
68 
69 #include "Utilities.h"
70 
71 
72 using namespace BPrivate ;
73 
74 #ifdef HAIKU_TARGET_PLATFORM_BEOS
75 	#include <netdb.h>
76 #endif
77 
78 
79 #include "Words.h"
80 
81 // global variables
82 Words*	gWords[MAX_DICTIONARIES];
83 Words*	gExactWords[MAX_DICTIONARIES];
84 
85 int32	gUserDict;
86 BFile*	gUserDictFile;
87 int32 	gDictCount = 0;
88 
89 // int32			level = L_BEGINNER;
90 
91 const char* kSpamServerSignature =
92 	"application/x-vnd.agmsmith.spamdbm";
93 const char* kDraftPath = "mail/draft";
94 const char* kDraftType = "text/x-vnd.Be-MailDraft";
95 const char* kMailFolder = "mail";
96 const char* kMailboxSymlink = "Mail/mailbox";
97 	// relative to B_USER_SETTINGS_DIRECTORY
98 
99 
100 int32
101 header_len(BFile *file)
102 {
103 	char	*buffer;
104 	int32	length;
105 	int32	result = 0;
106 	off_t	size;
107 
108 	if (file->ReadAttr(B_MAIL_ATTR_HEADER, B_INT32_TYPE, 0, &result,
109 		sizeof(int32)) != sizeof(int32)) {
110 		file->GetSize(&size);
111 		buffer = (char *)malloc(size);
112 		if (buffer) {
113 			file->Seek(0, 0);
114 			if (file->Read(buffer, size) == size) {
115 				while ((length = linelen(buffer + result, size - result, true)) > 2)
116 					result += length;
117 
118 				result += length;
119 			}
120 			free(buffer);
121 			file->WriteAttr(B_MAIL_ATTR_HEADER, B_INT32_TYPE, 0, &result, sizeof(int32));
122 		}
123 	}
124 	return result;
125 }
126 
127 
128 int32
129 add_query_menu_items(BMenu* menu, const char* attribute, uint32 what,
130 	const char* format, bool popup)
131 {
132 	BVolume	volume;
133 	BVolumeRoster().GetBootVolume(&volume);
134 
135 	BQuery query;
136 	query.SetVolume(&volume);
137 	query.PushAttr(attribute);
138 	query.PushString("*");
139 	query.PushOp(B_EQ);
140 	query.Fetch();
141 
142 	int32 index = 0;
143 	BEntry entry;
144 	while (query.GetNextEntry(&entry) == B_OK) {
145 		BFile file(&entry, B_READ_ONLY);
146 		if (file.InitCheck() == B_OK) {
147 			BMessage* message = new BMessage(what);
148 
149 			entry_ref ref;
150 			entry.GetRef(&ref);
151 			message->AddRef("ref", &ref);
152 
153 			BString value;
154 			if (file.ReadAttrString(attribute, &value) < B_OK)
155 				continue;
156 
157 			message->AddString("attribute", value.String());
158 
159 			char name[256];
160 			if (format != NULL)
161 				snprintf(name, sizeof(name), format, value.String());
162 			else
163 				strlcpy(name, value.String(), sizeof(name));
164 
165 			if (index < 9 && !popup)
166 				menu->AddItem(new BMenuItem(name, message, '1' + index));
167 			else
168 				menu->AddItem(new BMenuItem(name, message));
169 			index++;
170 		}
171 	}
172 
173 	return index;
174 }
175 
176