BEmailMessage * BEmailMessage::ForwardMessage(bool accountFromMail, bool includeAttachments) { BString header = "------ Forwarded Message: ------\n"; header << "To: " << To() << '\n'; header << "From: " << From() << '\n'; if (CC() != NULL) { // Can use CC rather than "Cc" since display only. header << "CC: " << CC() << '\n'; } header << "Subject: " << Subject() << '\n'; header << "Date: " << Date() << "\n\n"; if (_text_body != NULL) header << _text_body->Text() << '\n'; BEmailMessage *message = new BEmailMessage(); message->SetBodyTextTo(header.String()); // set the subject BString subject = Subject(); if (subject.IFindFirst("fwd") == B_ERROR && subject.IFindFirst("forward") == B_ERROR && subject.FindFirst("FW") == B_ERROR) subject << " (fwd)"; message->SetSubject(subject.String()); if (includeAttachments) { for (int32 i = 0; i < CountComponents(); i++) { BMailComponent *cmpt = GetComponent(i); if (cmpt == _text_body || cmpt == NULL) continue; //---I am ashamed to have the written the code between here and the next comment // ... and you still managed to get it wrong ;-)), axeld. // we should really move this stuff into copy constructors // or something like that BMallocIO io; cmpt->RenderToRFC822(&io); BMailComponent *clone = cmpt->WhatIsThis(); io.Seek(0, SEEK_SET); clone->SetToRFC822(&io, io.BufferLength(), true); message->AddComponent(clone); } } if (accountFromMail) message->SendViaAccountFrom(this); return message; }
BMailComponent *BMIMEMultipartMailContainer::GetComponent(int32 index, bool parse_now) { if (index >= CountComponents()) return NULL; if (BMailComponent *component = (BMailComponent *)_components_in_code.ItemAt(index)) return component; //--- Handle easy case message_part *part = (message_part *)(_components_in_raw.ItemAt(index)); if (part == NULL) return NULL; _io_data->Seek(part->start,SEEK_SET); BMailComponent component (_charSetForTextDecoding); if (component.SetToRFC822(_io_data,part->end - part->start) < B_OK) return NULL; BMailComponent *piece = component.WhatIsThis(); /* Debug code _io_data->Seek(part->start,SEEK_SET); char *data = new char[part->end - part->start + 1]; _io_data->Read(data,part->end - part->start); data[part->end - part->start] = 0; puts((char *)(data)); printf("Instantiating from %d to %d (%d octets)\n",part->start, part->end, part->end - part->start); */ _io_data->Seek(part->start,SEEK_SET); if (piece->SetToRFC822(_io_data,part->end - part->start, parse_now) < B_OK) { delete piece; return NULL; } _components_in_code.ReplaceItem(index,piece); return piece; }