From d4ce33c83dc15fd35a25a1f79a250a0893c0fc46 Mon Sep 17 00:00:00 2001 From: "rhp%netscape.com" Date: Fri, 2 Apr 1999 02:41:06 +0000 Subject: [PATCH] Adding files for new encoding interface --- mailnews/mime/src/nsMimeConverter.cpp | 207 ++++++++++++++++++++++++++ mailnews/mime/src/nsMimeConverter.h | 77 ++++++++++ mailnews/mime/src/nsMimeFactory.cpp | 12 +- 3 files changed, 290 insertions(+), 6 deletions(-) create mode 100644 mailnews/mime/src/nsMimeConverter.cpp create mode 100644 mailnews/mime/src/nsMimeConverter.h diff --git a/mailnews/mime/src/nsMimeConverter.cpp b/mailnews/mime/src/nsMimeConverter.cpp new file mode 100644 index 000000000000..1d679c808a8e --- /dev/null +++ b/mailnews/mime/src/nsMimeConverter.cpp @@ -0,0 +1,207 @@ +/* -*- Mode: C++; tab-width: 2; 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 "stdio.h" +#include "mimecom.h" +#include "modmimee.h" +#include "nscore.h" +#include "nsIFactory.h" +#include "nsISupports.h" +#include "nsMimeConverter.h" +#include "comi18n.h" +#include "prmem.h" +#include "plstr.h" + +/* + * This function will be used by the factory to generate an + * mime object class object.... + */ +nsresult NS_NewMimeConverter(nsIMimeConverter ** aInstancePtrResult) +{ + /* note this new macro for assertions...they can take + a string describing the assertion */ + nsresult result = NS_OK; + NS_PRECONDITION(nsnull != aInstancePtrResult, "nsnull ptr"); + if (nsnull != aInstancePtrResult) + { + nsMimeConverter *obj = new nsMimeConverter(); + if (obj) + return obj->QueryInterface(nsIMimeConverter::GetIID(), (void**) aInstancePtrResult); + else + return NS_ERROR_OUT_OF_MEMORY; /* we couldn't allocate the object */ + } + else + return NS_ERROR_NULL_POINTER; /* aInstancePtrResult was NULL....*/ +} + +/* + * The following macros actually implement addref, release and + * query interface for our component. + */ +NS_IMPL_ADDREF(nsMimeConverter) +NS_IMPL_RELEASE(nsMimeConverter) +NS_IMPL_QUERY_INTERFACE(nsMimeConverter, nsIMimeConverter::GetIID()); /* we need to pass in the interface ID of this interface */ + +/* + * nsMimeConverter definitions.... + */ + +/* + * Inherited methods for nsMimeConverter + */ +nsMimeConverter::nsMimeConverter() +{ + /* the following macro is used to initialize the ref counting data */ + NS_INIT_REFCNT(); +} + +nsMimeConverter::~nsMimeConverter() +{ +} + +nsresult +nsMimeConverter::DecodeMimePartIIStr(const nsString& header, + nsString& charset, + nsString& decodedString) +{ + char charsetCstr[kMAX_CSNAME]; + char *encodedCstr; + char *decodedCstr; + nsresult res = NS_OK; + + encodedCstr = header.ToNewCString(); + if (nsnull != encodedCstr) { + // apply MIME decode. + decodedCstr = MIME_DecodeMimePartIIStr((const char *) encodedCstr, charsetCstr); + delete [] encodedCstr; + if (nsnull == decodedCstr) { + // no decode needed, set an input string + charset.SetString(""); + decodedString.SetString(header); + } + else { + // convert to unicode + PRUnichar *unichars; + PRInt32 unicharLength; + res = MIME_ConvertToUnicode(charsetCstr, (const char *) decodedCstr, + (void **) &unichars, &unicharLength); + if (NS_SUCCEEDED(res)) { + charset.SetString(charsetCstr); + decodedString.SetString(unichars, unicharLength); + PR_Free(unichars); + } + PR_Free(decodedCstr); + } + } + return res; +} + +nsresult +nsMimeConverter::DecodeMimePartIIStr(const char *header, + char *charset, + char **decodedString) +{ + char *retString = MIME_DecodeMimePartIIStr(header, charset); + if (retString == NULL) + return NS_ERROR_FAILURE; + else + { + *decodedString = retString; + return NS_OK; + } +} + +nsresult +nsMimeConverter::EncodeMimePartIIStr(const char *header, + const char *mailCharset, + const PRInt32 encodedWordSize, + char **encodedString) +{ + char *retString = MIME_EncodeMimePartIIStr(header, mailCharset, encodedWordSize); + if (retString == NULL) + return NS_ERROR_FAILURE; + else + { + *encodedString = retString; + return NS_OK; + } +} + +nsresult +nsMimeConverter::B64EncoderInit(int (*output_fn) (const char *buf, PRInt32 size, void *closure), void *closure, + MimeEncoderData **returnEncoderData) +{ +MimeEncoderData *ptr; + + ptr = MimeB64EncoderInit(output_fn, closure); + if (ptr) + { + *returnEncoderData = ptr; + return NS_OK; + } + else + return NS_ERROR_OUT_OF_MEMORY; +} + +nsresult +nsMimeConverter::QPEncoderInit (int (*output_fn) (const char *buf, + PRInt32 size, void *closure), void *closure, MimeEncoderData ** returnEncoderData) +{ +MimeEncoderData *ptr; + + ptr = MimeQPEncoderInit(output_fn, closure); + if (ptr) + { + *returnEncoderData = ptr; + return NS_OK; + } + else + return NS_ERROR_OUT_OF_MEMORY; +} + +nsresult +nsMimeConverter::UUEncoderInit (char *filename, int (*output_fn) + (const char *buf, PRInt32 size, void *closure), void *closure, + MimeEncoderData ** returnEncoderData) +{ +MimeEncoderData *ptr; + + ptr = MimeUUEncoderInit(filename, output_fn, closure); + if (ptr) + { + *returnEncoderData = ptr; + return NS_OK; + } + else + return NS_ERROR_OUT_OF_MEMORY; +} + +nsresult +nsMimeConverter::EncoderDestroy(MimeEncoderData *data, PRBool abort_p) +{ + MimeEncoderDestroy(data, abort_p); + return NS_OK; +} + +nsresult +nsMimeConverter::EncoderWrite (MimeEncoderData *data, const char *buffer, PRInt32 size, PRInt32 *written) +{ + PRInt32 writeCount; + writeCount = MimeEncoderWrite(data, buffer, size); + *written = writeCount; + return NS_OK; +} diff --git a/mailnews/mime/src/nsMimeConverter.h b/mailnews/mime/src/nsMimeConverter.h new file mode 100644 index 000000000000..4fac4bf783f0 --- /dev/null +++ b/mailnews/mime/src/nsMimeConverter.h @@ -0,0 +1,77 @@ +/* -*- 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. + */ + +/* + * This interface is implemented by libmime. This interface is used by + * a Content-Type handler "Plug In" (i.e. vCard) for accessing various + * internal information about the object class system of libmime. When + * libmime progresses to a C++ object class, this would probably change. + */ +#ifndef nsMimeConverter_h_ +#define nsMimeConverter_h_ + +#include "prtypes.h" +#include "nsIMimeConverter.h" + +class nsMimeConverter : public nsIMimeConverter { +public: + nsMimeConverter(); + virtual ~nsMimeConverter(); + + /* this macro defines QueryInterface, AddRef and Release for this class */ + NS_DECL_ISUPPORTS + + // These methods are all implemented by libmime to be used by + // content type handler plugins for processing stream data. + + // Decode routine + NS_IMETHOD DecodeMimePartIIStr(const char *header, + char *charset, + char **decodedString); + + // Decode routine (also converts output to unicode) + NS_IMETHOD DecodeMimePartIIStr(const nsString& header, + nsString& charset, + nsString& decodedString); + // Encode routine + NS_IMETHOD EncodeMimePartIIStr(const char *header, + const char *mailCharset, + const PRInt32 encodedWordSize, + char **encodedString); + + NS_IMETHOD B64EncoderInit(int (*output_fn) (const char *buf, PRInt32 size, void *closure), + void *closure, MimeEncoderData **returnEncoderData); + + NS_IMETHOD QPEncoderInit (int (*output_fn) (const char *buf, + PRInt32 size, void *closure), void *closure, + MimeEncoderData ** returnEncoderData); + + NS_IMETHOD UUEncoderInit (char *filename, int (*output_fn) + (const char *buf, PRInt32 size, void *closure), void *closure, + MimeEncoderData ** returnEncoderData); + + NS_IMETHOD EncoderDestroy(MimeEncoderData *data, PRBool abort_p); + + NS_IMETHOD EncoderWrite (MimeEncoderData *data, const char *buffer, PRInt32 size, PRInt32 *written); + +}; + +/* this function will be used by the factory to generate an class access object....*/ +extern nsresult NS_NewMimeConverter(nsIMimeConverter **aInstancePtrResult); + +#endif /* nsMimeConverter_h_ */ diff --git a/mailnews/mime/src/nsMimeFactory.cpp b/mailnews/mime/src/nsMimeFactory.cpp index 5c530d85301d..a889a69caf04 100644 --- a/mailnews/mime/src/nsMimeFactory.cpp +++ b/mailnews/mime/src/nsMimeFactory.cpp @@ -41,8 +41,8 @@ static NS_DEFINE_CID(kComponentManagerCID, NS_COMPONENTMANAGER_CID); #include "nsMimeObjectClassAccess.h" static NS_DEFINE_CID(kCMimeMimeObjectClassAccessCID, NS_MIME_OBJECT_CLASS_ACCESS_CID); -#include "nsMimeHeaderConverter.h" -static NS_DEFINE_CID(kCMimeHeaderConverterCID, NS_MIME_HEADER_CONVERTER_CID); +#include "nsMimeConverter.h" +static NS_DEFINE_CID(kCMimeConverterCID, NS_MIME_CONVERTER_CID); // These are necessary for the new stream converter/plugin interface... static NS_DEFINE_IID(kINetPluginIID, NS_INET_PLUGIN_IID); @@ -138,9 +138,9 @@ nsresult nsMimeFactory::CreateInstance(nsISupports *aOuter, const nsIID &aIID, v if (res != NS_OK) // was there a problem creating the object ? return res; } - else if (mClassID.Equals(kCMimeHeaderConverterCID)) + else if (mClassID.Equals(kCMimeConverterCID)) { - res = NS_NewMimeHeaderConverter((nsIMimeHeaderConverter **) &inst); + res = NS_NewMimeConverter((nsIMimeConverter **) &inst); if (res != NS_OK) // was there a problem creating the object ? return res; } @@ -225,7 +225,7 @@ extern "C" NS_EXPORT nsresult NSRegisterSelf(nsISupports* aServMgr, const char * if (NS_FAILED(rv)) goto done; // I18N Header Conversion routines - rv = compMgr->RegisterComponent(kCMimeHeaderConverterCID, NULL, NULL, path, + rv = compMgr->RegisterComponent(kCMimeConverterCID, NULL, NULL, path, PR_TRUE, PR_TRUE); if (NS_FAILED(rv)) goto done; @@ -258,7 +258,7 @@ extern "C" NS_EXPORT nsresult NSUnregisterSelf(nsISupports* aServMgr, const char rv = compMgr->UnregisterComponent(kCMimeMimeObjectClassAccessCID, path); if (NS_FAILED(rv)) goto done; if (NS_FAILED(rv)) goto done; - rv = compMgr->UnregisterComponent(kCMimeHeaderConverterCID, path); + rv = compMgr->UnregisterComponent(kCMimeConverterCID, path); if (NS_FAILED(rv)) goto done; rv = compMgr->UnregisterComponent(kINetPluginMIMECID, path); if (NS_FAILED(rv)) goto done;