char *id_imap = 0;
nsXPIDLCString id_imap;
static int MimeExternalObject_parse_begin (MimeObject *);static int MimeExternalObject_parse_buffer (char *, PRInt32, MimeObject *);static int MimeExternalObject_parse_line (char *, PRInt32, MimeObject *);static int MimeExternalObject_parse_decoded_buffer (char*, PRInt32, MimeObject*);static PRBool MimeExternalObject_displayable_inline_p (MimeObjectClass *clazz,														MimeHeaders *hdrs);static intMimeExternalObjectClassInitialize(MimeExternalObjectClass *clazz){  MimeObjectClass *oclass = (MimeObjectClass *) clazz;  MimeLeafClass   *lclass = (MimeLeafClass *) clazz;  PR_ASSERT(!oclass->class_initialized);  oclass->initialize   = MimeExternalObject_initialize;  oclass->finalize     = MimeExternalObject_finalize;  oclass->parse_begin  = MimeExternalObject_parse_begin;  oclass->parse_buffer = MimeExternalObject_parse_buffer;  oclass->parse_line   = MimeExternalObject_parse_line;  oclass->displayable_inline_p = MimeExternalObject_displayable_inline_p;  lclass->parse_decoded_buffer = MimeExternalObject_parse_decoded_buffer;  return 0;}static intMimeExternalObject_initialize (MimeObject *object){  return ((MimeObjectClass*)&MIME_SUPERCLASS)->initialize(object);}static voidMimeExternalObject_finalize (MimeObject *object){  ((MimeObjectClass*)&MIME_SUPERCLASS)->finalize(object);}static intMimeExternalObject_parse_begin (MimeObject *obj){  int status;    status = ((MimeObjectClass*)&MIME_SUPERCLASS)->parse_begin(obj);  if (status < 0) return status;    // If we're writing this object, and we're doing it in raw form, then  // now is the time to inform the backend what the type of this data is.  //  if (obj->output_p &&    obj->options &&    !obj->options->write_html_p &&    !obj->options->state->first_data_written_p)  {    status = MimeObject_output_init(obj, 0);    if (status < 0) return status;    PR_ASSERT(obj->options->state->first_data_written_p);  }      //  // If we're writing this object as HTML, do all the work now -- just write  // out a table with a link in it.  (Later calls to the `parse_buffer' method  // will simply discard the data of the object itself.)  //  if (obj->options &&      obj->output_p &&      obj->options->write_html_p &&      obj->options->output_fn)  {    MimeDisplayOptions newopt = *obj->options;  // copy it     char *id = 0;    char *id_url = 0;    char *id_name = 0;    char *id_imap = 0;    PRBool all_headers_p = obj->options->headers == MimeHeadersAll;        id = mime_part_address (obj);    if (obj->options->missing_parts)      id_imap = mime_imap_part_address (obj);    if (! id) return MIME_OUT_OF_MEMORY;        if (obj->options && obj->options->url)    {      const char *url = obj->options->url;      if (id_imap && id)      {        // if this is an IMAP part.         id_url = mime_set_url_imap_part(url, id_imap, id);      }      else      {        // This is just a normal MIME part as usual.         id_url = mime_set_url_part(url, id, PR_TRUE);      }      if (!id_url)      {        PR_Free(id);        return MIME_OUT_OF_MEMORY;      }    }    if (!nsCRT::strcmp (id, "0"))    {      PR_Free(id);      id = MimeGetStringByID(MIME_MSG_ATTACHMENT);    }    else    {      const char *p = "Part ";        char *s = (char *)PR_MALLOC(nsCRT::strlen(p) + nsCRT::strlen(id) + 1);      if (!s)      {        PR_Free(id);        PR_Free(id_url);        return MIME_OUT_OF_MEMORY;      }      // we have a valid id      if (id)        id_name = mime_find_suggested_name_of_part(id, obj);      PL_strcpy(s, p);      PL_strcat(s, id);      PR_Free(id);      id = s;    }        if (all_headers_p &&    // Don't bother showing all headers on this part if it's the only    // part in the message: in that case, we've already shown these    // headers.    obj->options->state &&    obj->options->state->root == obj->parent)    all_headers_p = PR_FALSE;        newopt.fancy_headers_p = PR_TRUE;    newopt.headers = (all_headers_p ? MimeHeadersAll : MimeHeadersSome);        PR_FREEIF(id_name);/******    RICHIE SHERRYGOTTA STILL DO THIS FOR QUOTING!     status = MimeHeaders_write_attachment_box (obj->headers, &newopt,                                                 obj->content_type,                                                 obj->encoding,                                                 id_name? id_name : id, id_url, 0)*****/    // obj->options really owns the storage for this.    newopt.part_to_load = nsnull;    newopt.default_charset = nsnull;    PR_FREEIF(id);    PR_FREEIF(id_url);    PR_FREEIF(id_name);    if (status < 0) return status;  }    return 0;}