From c292fd12c122fd117673878d3fc612100eb23753 Mon Sep 17 00:00:00 2001 From: "rhp%netscape.com" Date: Fri, 19 Mar 1999 20:01:55 +0000 Subject: [PATCH] New changes for calendar content type handler --- mailnews/mime/cthandlers/calendar/Makefile.in | 5 +- mailnews/mime/cthandlers/calendar/mimecal.cpp | 168 ++++++++++++++++++ 2 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 mailnews/mime/cthandlers/calendar/mimecal.cpp diff --git a/mailnews/mime/cthandlers/calendar/Makefile.in b/mailnews/mime/cthandlers/calendar/Makefile.in index 753fb7548031..a85204a6df9f 100644 --- a/mailnews/mime/cthandlers/calendar/Makefile.in +++ b/mailnews/mime/cthandlers/calendar/Makefile.in @@ -29,10 +29,7 @@ LIBRARY_NAME=mimect-cal CPPSRCS = \ mimexpcom.cpp \ - $(NULL) - -CSRCS = \ - mimecal.c \ + mimecal.cpp \ $(NULL) include $(topsrcdir)/config/config.mk diff --git a/mailnews/mime/cthandlers/calendar/mimecal.cpp b/mailnews/mime/cthandlers/calendar/mimecal.cpp new file mode 100644 index 000000000000..7f93e7854dad --- /dev/null +++ b/mailnews/mime/cthandlers/calendar/mimecal.cpp @@ -0,0 +1,168 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ +#include "mimecal.h" +#include "xp_core.h" +#include "xp_mem.h" +#include "prmem.h" +#include "plstr.h" +#include "mimexpcom.h" +#include "mimecth.h" +#include "mimeobj.h" + +static int MimeInlineTextCalendar_parse_line (char *, PRInt32, MimeObject *); +static int MimeInlineTextCalendar_parse_eof (MimeObject *, PRBool); +static int MimeInlineTextCalendar_parse_begin (MimeObject *obj); + +extern int MK_OUT_OF_MEMORY; + + +/* + * These functions are the public interface for this content type + * handler and will be called in by the mime component. + */ +#define CAL_CONTENT_TYPE "text/calendar" + + /* This is the object definition. Note: we will set the superclass + to NULL and manually set this on the class creation */ +MimeDefClass(MimeInlineTextCalendar, MimeInlineTextCalendarClass, + mimeInlineTextCalendarClass, NULL); + +PUBLIC char * +MIME_GetContentType(void) +{ + return CAL_CONTENT_TYPE; +} + +PUBLIC MimeObjectClass * +MIME_CreateContentTypeHandlerClass(const char *content_type, + contentTypeHandlerInitStruct *initStruct) +{ + MimeObjectClass *clazz = (MimeObjectClass *)&mimeInlineTextCalendarClass; + /* + * Must set the superclass by hand. + */ + if (!COM_GetmimeInlineTextClass()) + return NULL; + + clazz->superclass = (MimeObjectClass *)COM_GetmimeInlineTextClass(); + initStruct->force_inline_display = PR_FALSE; + return clazz; +} + +static int +MimeInlineTextCalendarClassInitialize(MimeInlineTextCalendarClass *clazz) +{ + MimeObjectClass *oclass = (MimeObjectClass *) clazz; + PR_ASSERT(!oclass->class_initialized); + oclass->parse_begin = MimeInlineTextCalendar_parse_begin; + oclass->parse_line = MimeInlineTextCalendar_parse_line; + oclass->parse_eof = MimeInlineTextCalendar_parse_eof; + + return 0; +} + +int +mime_TranslateCalendar(char* caldata, char** html) +{ + *html = XP_STRDUP("\ +\ +
\ +\ +\ +
This libmime Content Type Handler plugin for the Content-Type text/calendar\ + is functional!
"); + + return 0; +} + +static int +MimeInlineTextCalendar_parse_begin(MimeObject *obj) +{ + MimeInlineTextCalendarClass *clazz; + int status = ((MimeObjectClass*)COM_GetmimeLeafClass())->parse_begin(obj); + + if (status < 0) return status; + + if (!obj->output_p) return 0; + if (!obj->options || !obj->options->write_html_p) return 0; + + /* This is a fine place to write out any HTML before the real meat begins. */ + clazz = ((MimeInlineTextCalendarClass *) obj->clazz); + /* initialize buffered string to empty; */ + + clazz->bufferlen = 0; + clazz->buffermax = 512; + clazz->buffer = (char*) PR_MALLOC(clazz->buffermax); + if (clazz->buffer == NULL) return MK_OUT_OF_MEMORY; + return 0; +} + +static int +MimeInlineTextCalendar_parse_line(char *line, PRInt32 length, MimeObject *obj) +{ + /* + * This routine gets fed each line of data, one at a time. We just buffer + * it all up, to be dealt with all at once at the end. + */ + MimeInlineTextCalendarClass *clazz = ((MimeInlineTextCalendarClass *) obj->clazz); + + if (!obj->output_p) return 0; + if (!obj->options || !obj->options->output_fn) return 0; + if (!obj->options->write_html_p) { + return COM_MimeObject_write(obj, line, length, TRUE); + } + + if (clazz->bufferlen + length >= clazz->buffermax) { + do { + clazz->buffermax += 512; + } while (clazz->bufferlen + length >= clazz->buffermax); + clazz->buffer = (char *)XP_REALLOC(clazz->buffer, clazz->buffermax); + if (clazz->buffer == NULL) return MK_OUT_OF_MEMORY; + } + XP_MEMCPY(clazz->buffer + clazz->bufferlen, line, length); + clazz->bufferlen += length; +} + +static int +MimeInlineTextCalendar_parse_eof (MimeObject *obj, PRBool abort_p) +{ + int status = 0; + MimeInlineTextCalendarClass *clazz = ((MimeInlineTextCalendarClass *) obj->clazz); + char* html = NULL; + + if (obj->closed_p) return 0; + + /* Run parent method first, to flush out any buffered data. */ + status = ((MimeObjectClass*)COM_GetmimeInlineTextClass())->parse_eof(obj, abort_p); + if (status < 0) return status; + + if (!clazz->buffer || clazz->bufferlen == 0) return 0; + + clazz->buffer[clazz->bufferlen] = '\0'; + + status = mime_TranslateCalendar(clazz->buffer, &html); + PR_Free(clazz->buffer); + clazz->buffer = NULL; + if (status < 0) return status; + + status = COM_MimeObject_write(obj, html, PL_strlen(html), TRUE); + PR_Free(html); + if (status < 0) return status; + + return 0; +}