diff --git a/src/servers/mail/main.cpp b/src/servers/mail/main.cpp index 9b5bc635a1..449909b836 100644 --- a/src/servers/mail/main.cpp +++ b/src/servers/mail/main.cpp @@ -1,7 +1,12 @@ -/* main - the daemon's inner workings -** -** Copyright 2001 Dr. Zoidberg Enterprises. All rights reserved. -*/ +/* + * Copyright 2009, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2001 Dr. Zoidberg Enterprises. All rights reserved. + * + * Distributed under the terms of the MIT License. + */ + + +//! The daemon's inner workings #include @@ -40,17 +45,6 @@ #include -#ifndef HAIKU_TARGET_PLATFORM_BEOS // BONE and later have these, R5 doesn't. - #define BONE_SERIAL_PPP_GET_STATUS 0xbe230501 - #define BSPPP_CONNECTED 4 - typedef struct { - char if_name[32]; - int connection_status; - status_t last_error; - int connect_speed; - } bsppp_status_t; - #include -#endif using std::map; @@ -59,66 +53,70 @@ typedef struct glorbal { BStringList msgs; } snuzzwut; -BMailStatusWindow *status; + +static BMailStatusWindow* sStatus; + class MailDaemonApp : public BApplication { - public: - MailDaemonApp(void); - virtual ~MailDaemonApp(); +public: + MailDaemonApp(); + virtual ~MailDaemonApp(); - virtual void MessageReceived(BMessage *msg); - virtual void RefsReceived(BMessage *a_message); + virtual void MessageReceived(BMessage* message); + virtual void RefsReceived(BMessage* message); - virtual void Pulse(); - virtual bool QuitRequested(); - virtual void ReadyToRun(); + virtual void Pulse(); + virtual bool QuitRequested(); + virtual void ReadyToRun(); - void InstallDeskbarIcon(); - void RemoveDeskbarIcon(); + void InstallDeskbarIcon(); + void RemoveDeskbarIcon(); - void RunChains(BList &list,BMessage *msg); - void SendPendingMessages(BMessage *msg); - void GetNewMessages(BMessage *msg); + void RunChains(BList& list, BMessage* message); + void SendPendingMessages(BMessage* message); + void GetNewMessages(BMessage* message); - private: - void UpdateAutoCheck(bigtime_t interval); +private: + void _UpdateAutoCheck(bigtime_t interval); - BMessageRunner *auto_check; - BMailSettings settings_file; + BMessageRunner* fAutoCheckRunner; + BMailSettings fSettingsFile; - int32 new_messages; - bool central_beep; - // TRUE to do a beep when the status window closes. This happens - // when all mail has been received, so you get one beep for - // everything rather than individual beeps for each mail account. - // Set to TRUE by the 'mcbp' message that the mail Notification - // filter sends us, cleared when the beep is done. - BList fetch_done_respondents; + int32 fNewMessages; + bool fCentralBeep; + // TRUE to do a beep when the status window closes. This happens + // when all mail has been received, so you get one beep for + // everything rather than individual beeps for each mail + // account. + // Set to TRUE by the 'mcbp' message that the mail Notification + // filter sends us, cleared when the beep is done. + BList fFetchDoneRespondents; + BList fQueries; - BList queries; - LEDAnimation *led; + LEDAnimation* fLEDAnimation; - BString alert_string; + BString fAlertString; }; -MailDaemonApp::MailDaemonApp(void) - : BApplication("application/x-vnd.Be-POST") +MailDaemonApp::MailDaemonApp() + : + BApplication("application/x-vnd.Be-POST") { - status = new BMailStatusWindow(BRect(40, 400, 360, 400), "Mail Status", - settings_file.ShowStatusWindow()); - auto_check = NULL; + sStatus = new BMailStatusWindow(BRect(40, 400, 360, 400), "Mail Status", + fSettingsFile.ShowStatusWindow()); + fAutoCheckRunner = NULL; } MailDaemonApp::~MailDaemonApp() { - delete auto_check; + delete fAutoCheckRunner; - for (int32 i = 0; i < queries.CountItems(); i++) - delete ((BQuery *)(queries.ItemAt(i))); + for (int32 i = 0; i < fQueries.CountItems(); i++) + delete (BQuery*)fQueries.ItemAt(i); - delete led; + delete fLEDAnimation; } @@ -127,17 +125,17 @@ MailDaemonApp::ReadyToRun() { InstallDeskbarIcon(); - UpdateAutoCheck(settings_file.AutoCheckInterval()); + _UpdateAutoCheck(fSettingsFile.AutoCheckInterval()); BVolume volume; BVolumeRoster roster; - new_messages = 0; + fNewMessages = 0; while (roster.GetNextVolume(&volume) == B_OK) { //{char name[255];volume.GetName(name);printf("Volume: %s\n",name);} - BQuery *query = new BQuery; + BQuery* query = new BQuery; query->SetTarget(this); query->SetVolume(&volume); @@ -155,38 +153,39 @@ MailDaemonApp::ReadyToRun() query->Fetch(); BEntry entry; - for (; query->GetNextEntry(&entry) == B_OK; new_messages++); + while (query->GetNextEntry(&entry) == B_OK) + fNewMessages++; - queries.AddItem(query); + fQueries.AddItem(query); } BString string; MDR_DIALECT_CHOICE( - if (new_messages > 0) - string << new_messages; + if (fNewMessages > 0) + string << fNewMessages; else string << "No"; - if (new_messages != 1) + if (fNewMessages != 1) string << " new messages."; else string << " new message.";, - if (new_messages > 0) - string << new_messages << " 通の未読メッセージがあります "; + if (fNewMessages > 0) + string << fNewMessages << " 通の未読メッセージがあります "; else string << "未読メッセージはありません"; ); - central_beep = false; - status->SetDefaultMessage(string); + fCentralBeep = false; + sStatus->SetDefaultMessage(string); - led = new LEDAnimation; + fLEDAnimation = new LEDAnimation; SetPulseRate(1000000); } void -MailDaemonApp::RefsReceived(BMessage *message) +MailDaemonApp::RefsReceived(BMessage* message) { - status->Activate(true); + sStatus->Activate(true); entry_ref ref; for (int32 i = 0; message->FindRef("refs", i, &ref) == B_OK; i++) { @@ -203,185 +202,186 @@ MailDaemonApp::RefsReceived(BMessage *message) continue; int32 size; - if (node.ReadAttr("MAIL:fullsize", B_SIZE_T_TYPE, 0, &size, sizeof(size)) < 0) + if (node.ReadAttr("MAIL:fullsize", B_SIZE_T_TYPE, 0, &size, + sizeof(size)) < 0) { size = -1; + } BPath path(&ref); - BMailChainRunner *runner = GetMailChainRunner(id, status); - runner->GetSingleMessage(uid.String(), size, &path); + BMailChainRunner* runner = GetMailChainRunner(id, sStatus); + if (runner != NULL) + runner->GetSingleMessage(uid.String(), size, &path); } } void -MailDaemonApp::UpdateAutoCheck(bigtime_t interval) +MailDaemonApp::_UpdateAutoCheck(bigtime_t interval) { if (interval > 0) { - if (auto_check != NULL) { - auto_check->SetInterval(interval); - auto_check->SetCount(-1); + if (fAutoCheckRunner != NULL) { + fAutoCheckRunner->SetInterval(interval); + fAutoCheckRunner->SetCount(-1); } else - auto_check = new BMessageRunner(be_app_messenger,new BMessage('moto'),interval); + fAutoCheckRunner = new BMessageRunner(be_app_messenger, + new BMessage('moto'), interval); } else { - delete auto_check; - auto_check = NULL; + delete fAutoCheckRunner; + fAutoCheckRunner = NULL; } } void -MailDaemonApp::MessageReceived(BMessage *msg) +MailDaemonApp::MessageReceived(BMessage* msg) { switch (msg->what) { case 'moto': - if (settings_file.CheckOnlyIfPPPUp()) { -#ifndef HAIKU_TARGET_PLATFORM_BEOS - int s = socket(AF_INET, SOCK_DGRAM, 0); - bsppp_status_t status; - - strcpy(status.if_name, "ppp0"); - if (ioctl(s, BONE_SERIAL_PPP_GET_STATUS, &status, sizeof(status)) != 0) { - close(s); - break; - } else { - if (status.connection_status != BSPPP_CONNECTED) { - close(s); - break; - } - } - close (s); -#else - if (find_thread("tty_thread") <= 0) - break; -#endif + if (fSettingsFile.CheckOnlyIfPPPUp()) { + // TODO: check whether internet is up and running! } // supposed to fall through case 'mbth': // check & send messages msg->what = 'msnd'; - PostMessage(msg); //'msnd'); + PostMessage(msg); // supposed to fall trough case 'mnow': // check messages GetNewMessages(msg); break; + case 'msnd': // send messages SendPendingMessages(msg); break; case 'mrrs': - settings_file.Reload(); - UpdateAutoCheck(settings_file.AutoCheckInterval()); - status->SetShowCriterion(settings_file.ShowStatusWindow()); + fSettingsFile.Reload(); + _UpdateAutoCheck(fSettingsFile.AutoCheckInterval()); + sStatus->SetShowCriterion(fSettingsFile.ShowStatusWindow()); break; case 'shst': // when to show the status window { int32 mode; - if (msg->FindInt32("ShowStatusWindow",&mode) == B_OK) - status->SetShowCriterion(mode); + if (msg->FindInt32("ShowStatusWindow", &mode) == B_OK) + sStatus->SetShowCriterion(mode); break; } + case 'lkch': // status window look changed case 'wsch': // workspace changed - status->PostMessage(msg); + sStatus->PostMessage(msg); break; - case 'stwg': //----StaT Window Gone - { - BMessage *msg, reply('mnuc'); - reply.AddInt32("num_new_messages",new_messages); - while((msg = (BMessage *)fetch_done_respondents.RemoveItem(0L))) { + case 'stwg': // Status window gone + { + BMessage reply('mnuc'); + reply.AddInt32("num_new_messages", fNewMessages); + + while ((msg = (BMessage*)fFetchDoneRespondents.RemoveItem(0L))) { msg->SendReply(&reply); delete msg; } - } - if (alert_string != B_EMPTY_STRING) { - alert_string.Truncate(alert_string.Length()-1); - BAlert *alert = new BAlert(MDR_DIALECT_CHOICE ("New Messages","新着メッセージ"), alert_string.String(), "OK", NULL, NULL, B_WIDTH_AS_USUAL); + + if (fAlertString != B_EMPTY_STRING) { + fAlertString.Truncate(fAlertString.Length() - 1); + BAlert* alert = new BAlert(MDR_DIALECT_CHOICE("New Messages", + "新着メッセージ"), fAlertString.String(), "OK", NULL, NULL, + B_WIDTH_AS_USUAL); alert->SetFeel(B_NORMAL_WINDOW_FEEL); alert->Go(NULL); - alert_string = B_EMPTY_STRING; + fAlertString = B_EMPTY_STRING; } - if (central_beep) { + + if (fCentralBeep) { system_beep("New E-mail"); - central_beep = false; + fCentralBeep = false; } break; + } + case 'mcbp': - if (new_messages > 0) { - central_beep = true; - } + if (fNewMessages > 0) + fCentralBeep = true; break; - case 'mnum': //----Number of new messages - { - BMessage reply('mnuc' /* Mail NU message Count */); + + case 'mnum': // Number of new messages + { + BMessage reply('mnuc'); // Mail New message Count if (msg->FindBool("wait_for_fetch_done")) { - fetch_done_respondents.AddItem(DetachCurrentMessage()); + fFetchDoneRespondents.AddItem(DetachCurrentMessage()); break; } - reply.AddInt32("num_new_messages",new_messages); + reply.AddInt32("num_new_messages", fNewMessages); msg->SendReply(&reply); - } break; - case 'mblk': //-----Mail BLinK - if (new_messages > 0) - led->Start(); + } + + case 'mblk': // Mail Blink + if (fNewMessages > 0) + fLEDAnimation->Start(); break; - case 'enda': //-----End Auto Check - delete auto_check; - auto_check = NULL; + + case 'enda': // End Auto Check + delete fAutoCheckRunner; + fAutoCheckRunner = NULL; break; + case 'numg': - { - int32 num_messages = msg->FindInt32("num_messages"); - MDR_DIALECT_CHOICE ( - alert_string << num_messages << " new message"; - if (num_messages > 1) - alert_string << 's'; + { + int32 numMessages = msg->FindInt32("num_messages"); + MDR_DIALECT_CHOICE( + fAlertString << numMessages << " new message"; + if (numMessages > 1) + fAlertString << 's'; - alert_string << " for " << msg->FindString("chain_name") << '\n';, + fAlertString << " for " << msg->FindString("chain_name") + << '\n';, - alert_string << msg->FindString("chain_name") << "より\n" << num_messages - << " 通のメッセージが届きました  "; + fAlertString << msg->FindString("chain_name") << "より\n" + << numMessages << " 通のメッセージが届きました  "; ); - - } break; + } + case B_QUERY_UPDATE: - { + { int32 what; - msg->FindInt32("opcode",&what); + msg->FindInt32("opcode", &what); switch (what) { case B_ENTRY_CREATED: - new_messages++; + fNewMessages++; break; case B_ENTRY_REMOVED: - new_messages--; + fNewMessages--; break; } BString string; - MDR_DIALECT_CHOICE ( - if (new_messages > 0) - string << new_messages; + MDR_DIALECT_CHOICE( + if (fNewMessages > 0) + string << fNewMessages; else string << "No"; - if (new_messages != 1) + if (fNewMessages != 1) string << " new messages."; else string << " new message.";, - if (new_messages > 0) - string << new_messages << " 通の未読メッセージがあります"; + + if (fNewMessages > 0) + string << fNewMessages << " 通の未読メッセージがあります"; else string << "未読メッセージはありません"; ); - status->SetDefaultMessage(string.String()); + sStatus->SetDefaultMessage(string.String()); + break; + } - } + default: + BApplication::MessageReceived(msg); break; } - BApplication::MessageReceived(msg); } @@ -396,7 +396,8 @@ MailDaemonApp::InstallDeskbarIcon() status_t status = roster.FindApp("application/x-vnd.Be-POST", &ref); if (status < B_OK) { - fprintf(stderr, "Can't find application to tell deskbar: %s\n", strerror(status)); + fprintf(stderr, "Can't find application to tell deskbar: %s\n", + strerror(status)); return; } @@ -428,17 +429,17 @@ MailDaemonApp::QuitRequested() void -MailDaemonApp::RunChains(BList &list, BMessage *msg) +MailDaemonApp::RunChains(BList& list, BMessage* msg) { - BMailChain *chain; + BMailChain* chain; int32 index = 0, id; for (; msg->FindInt32("chain", index, &id) == B_OK; index++) { for (int32 i = 0; i < list.CountItems(); i++) { - chain = (BMailChain *)list.ItemAt(i); + chain = (BMailChain*)list.ItemAt(i); if (chain->ID() == (unsigned)id) { - chain->RunChain(status, true, false, true); + chain->RunChain(sStatus, true, false, true); list.RemoveItem(i); // the chain runner deletes the chain break; } @@ -448,20 +449,20 @@ MailDaemonApp::RunChains(BList &list, BMessage *msg) if (index == 0) { // invoke all chains for (int32 i = 0; i < list.CountItems(); i++) { - chain = (BMailChain *)list.ItemAt(i); + chain = (BMailChain*)list.ItemAt(i); - chain->RunChain(status, true, false, true); + chain->RunChain(sStatus, true, false, true); } } else { // delete unused chains for (int32 i = list.CountItems(); i-- > 0;) - delete (BMailChain *)list.RemoveItem(i); + delete (BMailChain*)list.RemoveItem(i); } } void -MailDaemonApp::GetNewMessages(BMessage *msg) +MailDaemonApp::GetNewMessages(BMessage* msg) { BList list; GetInboundMailChains(&list); @@ -471,7 +472,7 @@ MailDaemonApp::GetNewMessages(BMessage *msg) void -MailDaemonApp::SendPendingMessages(BMessage *msg) +MailDaemonApp::SendPendingMessages(BMessage* msg) { BVolumeRoster roster; BVolume volume; @@ -489,32 +490,32 @@ MailDaemonApp::SendPendingMessages(BMessage *msg) query.PushOp(B_OR); - int32 chain_id = -1; + int32 chainID = -1; - if (msg->FindInt32("chain",&chain_id) == B_OK) { + if (msg->FindInt32("chain", &chainID) == B_OK) { query.PushAttr("MAIL:chain"); - query.PushInt32(chain_id); + query.PushInt32(chainID); query.PushOp(B_EQ); query.PushOp(B_AND); - } else { - chain_id = -1; - } + } else + chainID = -1; if (!msg->HasString("message_path")) { - if (chain_id == -1) { - map messages; + if (chainID == -1) { + map messages; query.Fetch(); BEntry entry; BPath path; BNode node; - int32 chain, default_chain(BMailSettings().DefaultOutboundChainID()); + int32 chain; + int32 defaultChain(BMailSettings().DefaultOutboundChainID()); off_t size; while (query.GetNextEntry(&entry) == B_OK) { while (node.SetTo(&entry) == B_BUSY) snooze(100); if (node.ReadAttr("MAIL:chain",B_INT32_TYPE,0,&chain,4) < B_OK) - chain = default_chain; + chain = defaultChain; entry.GetPath(&path); node.GetSize(&size); if (messages[chain] == NULL) { @@ -526,12 +527,15 @@ MailDaemonApp::SendPendingMessages(BMessage *msg) messages[chain]->bytes += size; } - map::iterator iter = messages.begin(); - map::iterator end = messages.end(); + map::iterator iter = messages.begin(); + map::iterator end = messages.end(); while (iter != end) { - if ((iter->first > 0) && (BMailChain(iter->first).ChainDirection() == outbound)) { - BMailChainRunner *runner = GetMailChainRunner(iter->first,status); - runner->GetMessages(&messages[iter->first]->msgs,messages[iter->first]->bytes); + if (iter->first > 0 && BMailChain(iter->first) + .ChainDirection() == outbound) { + BMailChainRunner* runner + = GetMailChainRunner(iter->first, sStatus); + runner->GetMessages(&messages[iter->first]->msgs, + messages[iter->first]->bytes); delete messages[iter->first]; runner->Stop(); } @@ -556,19 +560,25 @@ MailDaemonApp::SendPendingMessages(BMessage *msg) bytes += size; } - BMailChainRunner *runner = GetMailChainRunner(chain_id,status); - runner->GetMessages(&ids,bytes); + BMailChainRunner* runner + = GetMailChainRunner(chainID, sStatus); + runner->GetMessages(&ids, bytes); runner->Stop(); } } else { - const char *path; - msg->FindString("message_path",&path); + const char* path; + if (msg->FindString("message_path", &path) != B_OK) + return; + + off_t size; + if (BNode(path).GetSize(&size) != B_OK) + return; + BStringList ids; ids += path; - off_t size; - BNode(path).GetSize(&size); - BMailChainRunner *runner = GetMailChainRunner(chain_id,status); - runner->GetMessages(&ids,size); + + BMailChainRunner* runner = GetMailChainRunner(chainID, sStatus); + runner->GetMessages(&ids, size); runner->Stop(); } } @@ -579,21 +589,23 @@ void MailDaemonApp::Pulse() { bigtime_t idle = idle_time(); - if (led->IsRunning() && (idle < 100000)) - led->Stop(); + if (fLEDAnimation->IsRunning() && idle < 100000) + fLEDAnimation->Stop(); } + // #pragma mark - void makeIndices() { - const char *stringIndices[] = { B_MAIL_ATTR_ACCOUNT,B_MAIL_ATTR_CC, - B_MAIL_ATTR_FROM,B_MAIL_ATTR_NAME, - B_MAIL_ATTR_PRIORITY,B_MAIL_ATTR_REPLY, - B_MAIL_ATTR_STATUS,B_MAIL_ATTR_SUBJECT, - B_MAIL_ATTR_TO,B_MAIL_ATTR_THREAD, NULL}; + const char* stringIndices[] = { + B_MAIL_ATTR_ACCOUNT, B_MAIL_ATTR_CC, B_MAIL_ATTR_FROM, B_MAIL_ATTR_NAME, + B_MAIL_ATTR_PRIORITY, B_MAIL_ATTR_REPLY, B_MAIL_ATTR_STATUS, + B_MAIL_ATTR_SUBJECT, B_MAIL_ATTR_TO, B_MAIL_ATTR_THREAD, + NULL + }; // add mail indices for all devices capable of querying @@ -601,7 +613,8 @@ makeIndices() dev_t device; while ((device = next_dev(&cookie)) >= B_OK) { fs_info info; - if (fs_stat_dev(device,&info) < 0 || (info.flags & B_FS_HAS_QUERY) == 0) + if (fs_stat_dev(device, &info) < 0 + || (info.flags & B_FS_HAS_QUERY) == 0) continue; // Work-around for misbehaviour of earlier versions - should be @@ -613,28 +626,30 @@ makeIndices() && indexInfo.type == B_STRING_TYPE) fs_remove_index(device, B_MAIL_ATTR_FLAGS); - for (int32 i = 0;stringIndices[i];i++) - fs_create_index(device,stringIndices[i],B_STRING_TYPE,0); + for (int32 i = 0; stringIndices[i]; i++) + fs_create_index(device, stringIndices[i], B_STRING_TYPE, 0); - fs_create_index(device,"MAIL:draft", B_INT32_TYPE, 0); - fs_create_index(device,B_MAIL_ATTR_WHEN,B_INT32_TYPE,0); - fs_create_index(device,B_MAIL_ATTR_FLAGS,B_INT32_TYPE,0); - fs_create_index(device,"MAIL:chain",B_INT32_TYPE,0); - fs_create_index(device,"MAIL:pending_chain",B_INT32_TYPE,0); + fs_create_index(device, "MAIL:draft", B_INT32_TYPE, 0); + fs_create_index(device, B_MAIL_ATTR_WHEN, B_INT32_TYPE, 0); + fs_create_index(device, B_MAIL_ATTR_FLAGS, B_INT32_TYPE, 0); + fs_create_index(device, "MAIL:chain", B_INT32_TYPE, 0); + fs_create_index(device, "MAIL:pending_chain", B_INT32_TYPE, 0); } } void -addAttribute(BMessage &msg,const char *name,const char *publicName,int32 type = B_STRING_TYPE,bool viewable = true,bool editable = false,int32 width = 200) +addAttribute(BMessage& msg, const char* name, const char* publicName, + int32 type = B_STRING_TYPE, bool viewable = true, bool editable = false, + int32 width = 200) { - msg.AddString("attr:name",name); - msg.AddString("attr:public_name",publicName); - msg.AddInt32("attr:type",type); - msg.AddBool("attr:viewable",viewable); - msg.AddBool("attr:editable",editable); - msg.AddInt32("attr:width",width); - msg.AddInt32("attr:alignment",B_ALIGN_LEFT); + msg.AddString("attr:name", name); + msg.AddString("attr:public_name", publicName); + msg.AddInt32("attr:type", type); + msg.AddBool("attr:viewable", viewable); + msg.AddBool("attr:editable", editable); + msg.AddInt32("attr:width", width); + msg.AddInt32("attr:alignment", B_ALIGN_LEFT); } @@ -645,15 +660,15 @@ makeMimeType(bool remakeMIMETypes) // do a full rebuild from nothing, or just add on the new attributes that // we support which the regular BeOS mail daemon didn't have. - const char *types[2] = {"text/x-email","text/x-partial-email"}; + const char* types[2] = {"text/x-email", "text/x-partial-email"}; BMimeType mime; BMessage info; - for (int i = 0; i < 2; i++) { + for (size_t i = 0; i < sizeof(types) / sizeof(types[0]); i++) { info.MakeEmpty(); mime.SetTo(types[i]); if (mime.InitCheck() != B_OK) { - fputs("could not init mime type.\n",stderr); + fputs("could not init mime type.\n", stderr); return; } @@ -664,17 +679,20 @@ makeMimeType(bool remakeMIMETypes) // Set up the list of e-mail related attributes that Tracker will // let you display in columns for e-mail messages. - addAttribute(info,B_MAIL_ATTR_NAME,"Name"); - addAttribute(info,B_MAIL_ATTR_SUBJECT,"Subject"); - addAttribute(info,B_MAIL_ATTR_TO,"To"); - addAttribute(info,B_MAIL_ATTR_CC,"Cc"); - addAttribute(info,B_MAIL_ATTR_FROM,"From"); - addAttribute(info,B_MAIL_ATTR_REPLY,"Reply To"); - addAttribute(info,B_MAIL_ATTR_STATUS,"Status"); - addAttribute(info,B_MAIL_ATTR_PRIORITY,"Priority",B_STRING_TYPE,true,true,40); - addAttribute(info,B_MAIL_ATTR_WHEN,"When",B_TIME_TYPE,true,false,150); - addAttribute(info,B_MAIL_ATTR_THREAD,"Thread"); - addAttribute(info,B_MAIL_ATTR_ACCOUNT,"Account",B_STRING_TYPE,true,false,100); + addAttribute(info, B_MAIL_ATTR_NAME, "Name"); + addAttribute(info, B_MAIL_ATTR_SUBJECT, "Subject"); + addAttribute(info, B_MAIL_ATTR_TO, "To"); + addAttribute(info, B_MAIL_ATTR_CC, "Cc"); + addAttribute(info, B_MAIL_ATTR_FROM, "From"); + addAttribute(info, B_MAIL_ATTR_REPLY, "Reply To"); + addAttribute(info, B_MAIL_ATTR_STATUS, "Status"); + addAttribute(info, B_MAIL_ATTR_PRIORITY, "Priority", B_STRING_TYPE, + true, true, 40); + addAttribute(info, B_MAIL_ATTR_WHEN, "When", B_TIME_TYPE, true, + false, 150); + addAttribute(info, B_MAIL_ATTR_THREAD, "Thread"); + addAttribute(info, B_MAIL_ATTR_ACCOUNT, "Account", B_STRING_TYPE, + true, false, 100); mime.SetAttrInfo(&info); if (i == 0) { @@ -687,26 +705,32 @@ makeMimeType(bool remakeMIMETypes) mime.SetPreferredApp("application/x-vnd.Be-POST"); } } else { - // Just add the e-mail related attribute types we use to the MIME system. + // Just add the e-mail related attribute types we use to the MIME + // system. mime.GetAttrInfo(&info); - bool hasAccount = false, hasThread = false, hasSize = false; - const char *result; - for (int32 index = 0;info.FindString("attr:name",index,&result) == B_OK;index++) { - if (!strcmp(result,B_MAIL_ATTR_ACCOUNT)) + bool hasAccount = false; + bool hasThread = false; + bool hasSize = false; + const char* result; + for (int32 index = 0; info.FindString("attr:name", index, &result) + == B_OK; index++) { + if (!strcmp(result, B_MAIL_ATTR_ACCOUNT)) hasAccount = true; - if (!strcmp(result,B_MAIL_ATTR_THREAD)) + if (!strcmp(result, B_MAIL_ATTR_THREAD)) hasThread = true; - if (!strcmp(result,"MAIL:fullsize")) + if (!strcmp(result, "MAIL:fullsize")) hasSize = true; } - if (!hasAccount) - addAttribute(info,B_MAIL_ATTR_ACCOUNT,"Account",B_STRING_TYPE,true,false,100); + if (!hasAccount) { + addAttribute(info, B_MAIL_ATTR_ACCOUNT, "Account", + B_STRING_TYPE, true, false, 100); + } if (!hasThread) - addAttribute(info,B_MAIL_ATTR_THREAD,"Thread"); + addAttribute(info, B_MAIL_ATTR_THREAD, "Thread"); /*if (!hasSize) addAttribute(info,"MAIL:fullsize","Message Size",B_SIZE_T_TYPE,true,false,100);*/ - //--- Tracker can't display SIZT attributes. What a pain. + // TODO: Tracker can't display SIZT attributes. What a pain. if (!hasAccount || !hasThread/* || !hasSize*/) mime.SetAttrInfo(&info); } @@ -716,7 +740,7 @@ makeMimeType(bool remakeMIMETypes) int -main(int argc, const char **argv) +main(int argc, const char** argv) { bool remakeMIMETypes = false;