Fix for #7372. Don't use an uninitialized buffer. Some BString replacement of C strings. Replace Mail's ReadAttrString() function with the BNode method. Define a B_MAIL_ATTR_BCC.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41159 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
6f4b593285
commit
1ea9f437ea
|
@ -19,6 +19,7 @@ struct entry_ref;
|
|||
#define B_MAIL_ATTR_PRIORITY "MAIL:priority" // indexed string
|
||||
#define B_MAIL_ATTR_TO "MAIL:to" // indexed string
|
||||
#define B_MAIL_ATTR_CC "MAIL:cc" // indexed string
|
||||
#define B_MAIL_ATTR_BCC "MAIL:bcc" // string
|
||||
#define B_MAIL_ATTR_FROM "MAIL:from" // indexed string
|
||||
#define B_MAIL_ATTR_SUBJECT "MAIL:subject" // indexed string
|
||||
#define B_MAIL_ATTR_REPLY "MAIL:reply" // indexed string
|
||||
|
|
|
@ -548,11 +548,11 @@ THeaderView::InitGroupCompletion()
|
|||
continue;
|
||||
|
||||
BString groups;
|
||||
if (ReadAttrString(&file, "META:group", &groups) < B_OK || groups.Length() == 0)
|
||||
if (file.ReadAttrString("META:group", &groups) < B_OK || groups.Length() == 0)
|
||||
continue;
|
||||
|
||||
BString address;
|
||||
ReadAttrString(&file, "META:email", &address);
|
||||
file.ReadAttrString("META:email", &address);
|
||||
|
||||
// avoid adding an empty address
|
||||
if (address.Length() == 0)
|
||||
|
@ -822,7 +822,7 @@ TTextControl::MessageReceived(BMessage *msg)
|
|||
attr = buffer;
|
||||
|
||||
BString address;
|
||||
ReadAttrString(&node, buffer, &address);
|
||||
node.ReadAttrString(buffer, &address);
|
||||
if (address.Length() <= 0)
|
||||
continue;
|
||||
|
||||
|
@ -846,13 +846,13 @@ TTextControl::MessageReceived(BMessage *msg)
|
|||
}
|
||||
|
||||
BString email;
|
||||
ReadAttrString(&file,attr.String(),&email);
|
||||
file.ReadAttrString(attr.String(), &email);
|
||||
|
||||
// we got something...
|
||||
if (email.Length() > 0) {
|
||||
// see if we can get a username as well
|
||||
BString name;
|
||||
ReadAttrString(&file, "META:name", &name);
|
||||
file.ReadAttrString("META:name", &name);
|
||||
|
||||
BString address;
|
||||
if (name.Length() == 0) {
|
||||
|
@ -912,7 +912,7 @@ TTextControl::MessageReceived(BMessage *msg)
|
|||
|
||||
display = address;
|
||||
|
||||
ReadAttrString(&node, "META:name", &name);
|
||||
node.ReadAttrString("META:name", &name);
|
||||
if (name.Length() > 0) {
|
||||
display = "";
|
||||
display << "\"" << name << "\" <" << address << ">";
|
||||
|
@ -1064,7 +1064,7 @@ QPopupMenu::EntryCreated(const entry_ref &ref, ino_t node)
|
|||
// Does the file have a group attribute? OK to have none.
|
||||
BString groups;
|
||||
const char *kNoGroup = "NoGroup!";
|
||||
ReadAttrString(&file, "META:group", &groups);
|
||||
file.ReadAttrString("META:group", &groups);
|
||||
if (groups.Length() <= 0)
|
||||
groups = kNoGroup;
|
||||
|
||||
|
@ -1142,10 +1142,10 @@ QPopupMenu::EntryCreated(const entry_ref &ref, ino_t node)
|
|||
}
|
||||
|
||||
BString name;
|
||||
ReadAttrString(&file, "META:name", &name);
|
||||
file.ReadAttrString("META:name", &name);
|
||||
|
||||
BString email;
|
||||
ReadAttrString(&file, "META:email", &email);
|
||||
file.ReadAttrString("META:email", &email);
|
||||
|
||||
if (email.Length() != 0 || name.Length() != 0)
|
||||
AddPersonItem(&ref, node, name, email, NULL, groupMenu, superItem);
|
||||
|
@ -1154,7 +1154,7 @@ QPopupMenu::EntryCreated(const entry_ref &ref, ino_t node)
|
|||
for (int16 i = 2; i < 6; i++) {
|
||||
char attr[16];
|
||||
sprintf(attr, "META:email%d", i);
|
||||
if (ReadAttrString(&file, attr, &email) >= B_OK && email.Length() > 0)
|
||||
if (file.ReadAttrString(attr, &email) >= B_OK && email.Length() > 0)
|
||||
AddPersonItem(&ref, node, name, email, attr, groupMenu, superItem);
|
||||
}
|
||||
} while (groups.Length() > 0);
|
||||
|
|
|
@ -253,10 +253,10 @@ TMailApp::MessageReceived(BMessage *msg)
|
|||
{
|
||||
msg->FindRef("ref", &ref);
|
||||
BNode file(&ref);
|
||||
BString string = "";
|
||||
BString string;
|
||||
|
||||
if (file.InitCheck() == B_OK)
|
||||
ReadAttrString(&file, B_MAIL_ATTR_TO, &string);
|
||||
file.ReadAttrString(B_MAIL_ATTR_TO, &string);
|
||||
|
||||
window = NewWindow(&ref, string.String(), true);
|
||||
break;
|
||||
|
@ -1088,10 +1088,10 @@ TMailApp::NewWindow(const entry_ref* ref, const char* to, bool resend,
|
|||
BFile file;
|
||||
if (!resend && ref && file.SetTo(ref, O_RDONLY) == B_OK) {
|
||||
BString name;
|
||||
if (ReadAttrString(&file, B_MAIL_ATTR_NAME, &name) == B_OK) {
|
||||
if (file.ReadAttrString(B_MAIL_ATTR_NAME, &name) == B_OK) {
|
||||
title << name;
|
||||
BString subject;
|
||||
if (ReadAttrString(&file, B_MAIL_ATTR_SUBJECT, &subject) == B_OK)
|
||||
if (file.ReadAttrString(B_MAIL_ATTR_SUBJECT, &subject) == B_OK)
|
||||
title << " -> " << subject;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -150,11 +150,11 @@ add_query_menu_items(BMenu* menu, const char* attribute, uint32 what,
|
|||
|
||||
message->AddString("attribute", value.String());
|
||||
|
||||
char name[256];
|
||||
BString name;
|
||||
if (format != NULL)
|
||||
snprintf(name, sizeof(name), format, value.String());
|
||||
name.SetToFormat(format, value.String());
|
||||
else
|
||||
strlcpy(name, value.String(), sizeof(name));
|
||||
name = value;
|
||||
|
||||
if (index < 9 && !popup)
|
||||
menu->AddItem(new BMenuItem(name, message, '1' + index));
|
||||
|
|
|
@ -47,8 +47,10 @@ of their respective holders. All rights reserved.
|
|||
#include <Clipboard.h>
|
||||
#include <Debug.h>
|
||||
#include <E-mail.h>
|
||||
#include <File.h>
|
||||
#include <InterfaceKit.h>
|
||||
#include <Locale.h>
|
||||
#include <Node.h>
|
||||
#include <PathMonitor.h>
|
||||
#include <Roster.h>
|
||||
#include <Screen.h>
|
||||
|
@ -181,8 +183,6 @@ TMailWindow::TMailWindow(BRect rect, const char* title, TMailApp* app,
|
|||
if (messenger != NULL)
|
||||
fTrackerMessenger = *messenger;
|
||||
|
||||
char str[256];
|
||||
char status[272];
|
||||
float height;
|
||||
BMenu* menu;
|
||||
BMenu* subMenu;
|
||||
|
@ -246,16 +246,18 @@ TMailWindow::TMailWindow(BRect rect, const char* title, TMailApp* app,
|
|||
if (flag == B_UNREAD) {
|
||||
subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Leave as New"),
|
||||
new BMessage(kMsgQuitAndKeepAllStatus), 'W', B_SHIFT_KEY));
|
||||
#if 0
|
||||
subMenu->AddItem(item = new BMenuItem(B_TRANSLATE("Set to Read"),
|
||||
new BMessage(M_CLOSE_READ), 'W'));
|
||||
#endif
|
||||
} else {
|
||||
if (strlen(str))
|
||||
sprintf(status, B_TRANSLATE("Leave as '%s'"), str);
|
||||
BString status;
|
||||
file.ReadAttrString(B_MAIL_ATTR_STATUS, &status);
|
||||
|
||||
BString label;
|
||||
if (status.Length() > 0)
|
||||
label.SetToFormat(B_TRANSLATE("Leave as '%s'"),
|
||||
status.String());
|
||||
else
|
||||
sprintf(status, B_TRANSLATE("Leave same"));
|
||||
subMenu->AddItem(item = new BMenuItem(status,
|
||||
label = B_TRANSLATE("Leave same");
|
||||
|
||||
subMenu->AddItem(item = new BMenuItem(label.String(),
|
||||
new BMessage(B_QUIT_REQUESTED), 'W'));
|
||||
AddShortcut('W', B_COMMAND_KEY | B_SHIFT_KEY,
|
||||
new BMessage(kMsgQuitAndKeepAllStatus));
|
||||
|
@ -1211,7 +1213,7 @@ TMailWindow::MessageReceived(BMessage *msg)
|
|||
BString string = "could not read";
|
||||
BNode node(fRef);
|
||||
if (node.InitCheck() == B_OK)
|
||||
ReadAttrString(&node, B_MAIL_ATTR_STATUS, &string);
|
||||
node.ReadAttrString(B_MAIL_ATTR_STATUS, &string);
|
||||
|
||||
new TStatusWindow(r, this, string.String());
|
||||
}
|
||||
|
@ -2029,15 +2031,15 @@ TMailWindow::CopyMessage(entry_ref *ref, TMailWindow *src)
|
|||
if (file.InitCheck() == B_OK) {
|
||||
BString string;
|
||||
if (fHeaderView->fTo
|
||||
&& ReadAttrString(&file, B_MAIL_ATTR_TO, &string) == B_OK)
|
||||
&& file.ReadAttrString(B_MAIL_ATTR_TO, &string) == B_OK)
|
||||
fHeaderView->fTo->SetText(string.String());
|
||||
|
||||
if (fHeaderView->fSubject
|
||||
&& ReadAttrString(&file, B_MAIL_ATTR_SUBJECT, &string) == B_OK)
|
||||
&& file.ReadAttrString(B_MAIL_ATTR_SUBJECT, &string) == B_OK)
|
||||
fHeaderView->fSubject->SetText(string.String());
|
||||
|
||||
if (fHeaderView->fCc
|
||||
&& ReadAttrString(&file, B_MAIL_ATTR_CC, &string) == B_OK)
|
||||
&& file.ReadAttrString(B_MAIL_ATTR_CC, &string) == B_OK)
|
||||
fHeaderView->fCc->SetText(string.String());
|
||||
}
|
||||
|
||||
|
@ -2544,7 +2546,7 @@ TMailWindow::SaveAsDraft()
|
|||
if (fHeaderView->fCc != NULL)
|
||||
WriteAttrString(&draft, B_MAIL_ATTR_CC, fHeaderView->fCc->Text());
|
||||
if (fHeaderView->fBcc != NULL)
|
||||
WriteAttrString(&draft, "MAIL:bcc", fHeaderView->fBcc->Text());
|
||||
WriteAttrString(&draft, B_MAIL_ATTR_BCC, fHeaderView->fBcc->Text());
|
||||
|
||||
// Add the draft attribute for indexing
|
||||
uint32 draftAttr = true;
|
||||
|
@ -2569,7 +2571,7 @@ TMailWindow::SaveAsDraft()
|
|||
pathStr.Append(path.Path());
|
||||
}
|
||||
if (pathStr.Length())
|
||||
WriteAttrString(&draft, "MAIL:attachments", pathStr.String());
|
||||
draft.WriteAttrString("MAIL:attachments", &pathStr);
|
||||
}
|
||||
|
||||
// Set the MIME Type of the file
|
||||
|
@ -2777,17 +2779,17 @@ TMailWindow::OpenMessage(const entry_ref *ref, uint32 characterSetForDecoding)
|
|||
fContentView->fTextView->SetText(&file, 0, size);
|
||||
|
||||
// Restore Fields from attributes
|
||||
if (ReadAttrString(&node, B_MAIL_ATTR_TO, &string) == B_OK)
|
||||
if (node.ReadAttrString(B_MAIL_ATTR_TO, &string) == B_OK)
|
||||
fHeaderView->fTo->SetText(string.String());
|
||||
if (ReadAttrString(&node, B_MAIL_ATTR_SUBJECT, &string) == B_OK)
|
||||
if (node.ReadAttrString(B_MAIL_ATTR_SUBJECT, &string) == B_OK)
|
||||
fHeaderView->fSubject->SetText(string.String());
|
||||
if (ReadAttrString(&node, B_MAIL_ATTR_CC, &string) == B_OK)
|
||||
if (node.ReadAttrString(B_MAIL_ATTR_CC, &string) == B_OK)
|
||||
fHeaderView->fCc->SetText(string.String());
|
||||
if (ReadAttrString(&node, "MAIL:bcc", &string) == B_OK)
|
||||
if (node.ReadAttrString(B_MAIL_ATTR_BCC, &string) == B_OK)
|
||||
fHeaderView->fBcc->SetText(string.String());
|
||||
|
||||
// Restore attachments
|
||||
if (ReadAttrString(&node, "MAIL:attachments", &string) == B_OK) {
|
||||
if (node.ReadAttrString("MAIL:attachments", &string) == B_OK) {
|
||||
BMessage msg(REFS_RECEIVED);
|
||||
entry_ref enc_ref;
|
||||
|
||||
|
|
|
@ -58,25 +58,6 @@ WriteAttrString(BNode* node, const char* attr, const char* value)
|
|||
}
|
||||
|
||||
|
||||
status_t
|
||||
ReadAttrString(BNode* node, const char* attr, BString* value)
|
||||
{
|
||||
attr_info attrInfo;
|
||||
|
||||
value->SetTo("");
|
||||
status_t status = node->GetAttrInfo(attr, &attrInfo);
|
||||
if (status < B_OK)
|
||||
return status;
|
||||
|
||||
ssize_t size = node->ReadAttr(attr, B_STRING_TYPE, 0,
|
||||
value->LockBuffer(attrInfo.size + 1), attrInfo.size);
|
||||
|
||||
value->UnlockBuffer();
|
||||
|
||||
return size >= 0 ? B_OK : size;
|
||||
}
|
||||
|
||||
|
||||
//====================================================================
|
||||
// case-insensitive version of strcmp
|
||||
//
|
||||
|
|
|
@ -44,7 +44,6 @@ class BString;
|
|||
|
||||
extern status_t WriteAttrString(BNode* node, const char* attr,
|
||||
const char* value);
|
||||
extern status_t ReadAttrString(BNode* node, const char* attr, BString* value);
|
||||
|
||||
|
||||
int32 cistrcmp(const char*, const char*);
|
||||
|
|
Loading…
Reference in New Issue