From 449efd53a60a0f2830aa9fde29e336dfd7c357a5 Mon Sep 17 00:00:00 2001 From: "valeski%netscape.com" Date: Mon, 24 Jan 2000 15:41:03 +0000 Subject: [PATCH] r=rhp. nsIMIMEInfo and nsIMIMEService have been revamped (there's one more small iteration coming tomorrow). nsIMIMEInfo has been extended and the service has been multi indexed using file extensions *and* the MIME type as keys. --- netwerk/mime/public/nsIMIMEInfo.idl | 62 ++++- netwerk/mime/public/nsIMIMEService.idl | 49 ++-- netwerk/mime/src/Makefile.in | 2 +- netwerk/mime/src/makefile.win | 2 +- netwerk/mime/src/nsMIMEInfoImpl.cpp | 100 ++++---- netwerk/mime/src/nsMIMEInfoImpl.h | 27 ++- netwerk/mime/src/nsMIMEService.cpp | 226 ++++++++---------- netwerk/mime/src/nsMIMEService.h | 16 +- netwerk/mime/src/nsMIMEServiceFactory.cpp | 219 ----------------- ...rviceFactory.h => nsMIMEServiceModule.cpp} | 34 +-- uriloader/exthandler/nsMIMEInfoImpl.cpp | 100 ++++---- uriloader/exthandler/nsMIMEInfoImpl.h | 27 ++- 12 files changed, 355 insertions(+), 509 deletions(-) delete mode 100644 netwerk/mime/src/nsMIMEServiceFactory.cpp rename netwerk/mime/src/{nsMIMEServiceFactory.h => nsMIMEServiceModule.cpp} (58%) diff --git a/netwerk/mime/public/nsIMIMEInfo.idl b/netwerk/mime/public/nsIMIMEInfo.idl index 3238f7d21ba8..8dff5a9cbf23 100644 --- a/netwerk/mime/public/nsIMIMEInfo.idl +++ b/netwerk/mime/public/nsIMIMEInfo.idl @@ -17,25 +17,71 @@ * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * - * Contributor(s): + * Contributor(s): Judson Valeski */ -/* An nsIMIMEInfo gives a user access to mime information +/* An nsIMIMEInfo gives a user access to mime information. + * there is a one-to-many relationship between MIME types + * and file extensions. This means that a MIMEInfo object + * may have multiple file extensions associated with it. + * However, the reverse is not true. * */ #include "nsISupports.idl" +#include "nsIURI.idl" [scriptable, uuid(6A57EAE0-2FE8-11d3-A164-0050041CAF44)] interface nsIMIMEInfo : nsISupports { - // return the file extensions associated with this MIME type set. - attribute string FileExtensions; + /* Gives you an array of file types associated with this type. + * + * @return Number of elements in the array. + * @return Array of extensions. + */ + void GetFileExtensions(out PRInt32 elementCount, + [array, size_is(elementCount)] out string extensions); - // return the MIME types associated with this file extension set. - attribute string MIMEType; + /* Returns whether or not the given extension is + * associated with this MIME info. + * + * @return TRUE if the assocaition exists. + */ - // return the description of this MIME type set. - attribute wstring Description; + boolean ExtensionExists(in string aExtension); + /* Returns the first extension association in + * the internal set of extensions. + * + * @return The first extension. + */ + string FirstExtension(); + + /* The MIME type of this MIMEInfo. + * + * @return String representing the MIME type. + */ + readonly attribute string MIMEType; + + /* A human readable description of the MIME info + * + * @return The description + */ + readonly attribute wstring Description; + + /* Gives you arbitrary data about the MIMEInfo. An example + * of this is a generic image graphically representing + * this MIME info. This image can be used to generically + * and graphically represent the type. + * + * @return A URI representing the data location. + */ + readonly attribute nsIURI DataURI; + + /* Returns whether or not these two MIME infos are logically + * equivelent maintaining the one-to-many relationship between + * MIME types and file extensions. + * + * @returns TRUE if the two are considered equal + */ boolean Equals(in nsIMIMEInfo aMIMEInfo); }; \ No newline at end of file diff --git a/netwerk/mime/public/nsIMIMEService.idl b/netwerk/mime/public/nsIMIMEService.idl index ad809abac44f..42733c609f1c 100644 --- a/netwerk/mime/public/nsIMIMEService.idl +++ b/netwerk/mime/public/nsIMIMEService.idl @@ -17,20 +17,21 @@ * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * - * Contributor(s): + * Contributor(s): Judson Valeski */ /* The MIME service is responsible for mapping file extensions to MIME-types - * (see RFC 2045). + * (see RFC 2045). It also provides access to nsIMIMEInfo interfaces and + * acts as a general convenience wrapper of nsIMIMEInfo interfaces. + * + * @see nsIMIMEInfo */ #include "nsISupports.idl" #include "nsIMIMEInfo.idl" #include "nsIURI.idl" - %{C++ - #define NS_MIMESERVICE_CID \ { /* 03af31da-3109-11d3-8cd0-0060b0fc14a3 */ \ 0x03af31da, \ @@ -38,25 +39,41 @@ 0x11d3, \ {0x8c, 0xd0, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \ } - %} [scriptable, uuid(6C424C90-2FE7-11d3-A164-0050041CAF44)] interface nsIMIMEService : nsISupports { - // return a nsIMIMEInfo for the given file extension. + /* Retrieves a registered nsIMIMEInfo interface associated + * with the given file extension. + * + * @param A file extension (excluding the dot ('.')). + * @return A nsIMIMEInfo interface. + */ nsIMIMEInfo GetFromExtension(in string aFileExt); - // return a string representing the content-type - void GetTypeFromExtension(in string aFileExt, out string aContentType); - - void GetTypeFromURI(in nsIURI aURI, out string aContentType); - - // return a nsIMIMEInfo for the given MIME type. + /* Retrieves a registered nsIMIMEInfo interface associated + * with the given MIME type. + * + * @param A MIME type. + * @return A nsIMIMEInfo interface. + */ nsIMIMEInfo GetFromMIMEType(in string aMIMEType); - // insert a nsIMIMEInfo in the the database. - void AddMIMEInfo(in nsIMIMEInfo aMIMEInfo); + /* Retrieves a string representation of the MIME type + * associated with this file extension. + * + * @param A file extension (excluding the dot ('.')). + * @return The MIME type, if any. + */ + string GetTypeFromExtension(in string aFileExt); - // remove a nsIMIMEInfo from the database. - void RemoveMIMEInfo(in nsIMIMEInfo aMIMEInfo); + /* Retrieves a string representation of the MIME type + * associated with this URI. The association is purely + * file extension to MIME type based. No attempt to determine + * the type via server headers or byte scanning is made. + * + * @param The URI the user wants MIME info on. + * @return The MIME type, if any. + */ + string GetTypeFromURI(in nsIURI aURI); }; diff --git a/netwerk/mime/src/Makefile.in b/netwerk/mime/src/Makefile.in index de14a385bf17..eefe9741b6ed 100644 --- a/netwerk/mime/src/Makefile.in +++ b/netwerk/mime/src/Makefile.in @@ -35,7 +35,7 @@ REQUIRES = xpcom CPPSRCS = \ nsMIMEInfoImpl.cpp \ nsMIMEService.cpp \ - nsMIMEServiceFactory.cpp \ + nsMIMEServiceModule.cpp \ $(NULL) EXTRA_DSO_LDOPTS += $(MOZ_COMPONENT_LIBS) diff --git a/netwerk/mime/src/makefile.win b/netwerk/mime/src/makefile.win index 6fda88088f0c..3f1370411447 100644 --- a/netwerk/mime/src/makefile.win +++ b/netwerk/mime/src/makefile.win @@ -36,7 +36,7 @@ LCFLAGS = -DWIN32_LEAN_AND_MEAN -D_IMPL_NS_NET CPP_OBJS = \ .\$(OBJDIR)\nsMIMEInfoImpl.obj \ .\$(OBJDIR)\nsMIMEService.obj \ - .\$(OBJDIR)\nsMIMEServiceFactory.obj \ + .\$(OBJDIR)\nsMIMEServiceModule.obj \ $(NULL) LOCAL_INCLUDES=-I. diff --git a/netwerk/mime/src/nsMIMEInfoImpl.cpp b/netwerk/mime/src/nsMIMEInfoImpl.cpp index fd3c4bf45acd..b072b2e3199b 100644 --- a/netwerk/mime/src/nsMIMEInfoImpl.cpp +++ b/netwerk/mime/src/nsMIMEInfoImpl.cpp @@ -17,56 +17,72 @@ * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * - * Contributor(s): + * Contributor(s): Judson Valeski */ #include "nsMIMEInfoImpl.h" -#include "nsCRT.h" - +#include "nsXPIDLString.h" // nsISupports methods NS_IMPL_ISUPPORTS(nsMIMEInfoImpl, NS_GET_IID(nsIMIMEInfo)); // nsMIMEInfoImpl methods -nsMIMEInfoImpl::nsMIMEInfoImpl(const char *aMIMEType, const char *aFileExtensions, const char *aDescription) { +nsMIMEInfoImpl::nsMIMEInfoImpl(const char *aMIMEType) { NS_INIT_REFCNT(); - mMIMEType = NS_NewAtom(aMIMEType); - mFileExtensions.SetString(aFileExtensions); - mDescription.SetString(aDescription); + mMIMEType = getter_AddRefs(NS_NewAtom(aMIMEType)); } -nsMIMEInfoImpl::~nsMIMEInfoImpl() { - NS_RELEASE(mMIMEType); -} - -PRBool -nsMIMEInfoImpl::InExtensions(nsIAtom* anIAtom) { - nsAutoString extension; - anIAtom->ToString(extension); - - // XXX this is broken. need to use gessner's tokenizer stuff to delimit the commas - if (mFileExtensions.Find(extension) == -1) - return PR_FALSE; - return PR_TRUE; -} - -// nsIMIMEInfo methods NS_IMETHODIMP -nsMIMEInfoImpl::GetFileExtensions(char * *aFileExtensions) { - if (!aFileExtensions) return NS_ERROR_NULL_POINTER; +nsMIMEInfoImpl::GetFileExtensions(PRInt32 *elementCount, char ***extensions) { + PRUint32 extCount = mExtensions.Count(); + if (extCount < 1) return NS_ERROR_NOT_INITIALIZED; + + char **_retExts = (char**)nsAllocator::Alloc(extCount*2*sizeof(char*)); + if (!_retExts) return NS_ERROR_OUT_OF_MEMORY; + + for (PRUint8 i=0; i < extCount; i++) { + nsString* ext = (nsString*)mExtensions.StringAt(i); + _retExts[i] = ext->ToNewCString(); + if (!_retExts[i]) return NS_ERROR_OUT_OF_MEMORY; + } + + *elementCount = extCount; + *extensions = _retExts; - *aFileExtensions = mFileExtensions.ToNewCString(); - if (!*aFileExtensions) - return NS_ERROR_OUT_OF_MEMORY; return NS_OK; } NS_IMETHODIMP -nsMIMEInfoImpl::SetFileExtensions(const char * aFileExtensions) { - mFileExtensions.SetString(aFileExtensions); +nsMIMEInfoImpl::ExtensionExists(const char *aExtension, PRBool *_retval) { + NS_ASSERTION(aExtension, "no extension"); + PRBool found = PR_FALSE; + PRUint32 extCount = mExtensions.Count(); + if (extCount < 1) return NS_ERROR_NOT_INITIALIZED; + + if (!aExtension) return NS_ERROR_NULL_POINTER; + + for (PRUint8 i=0; i < extCount; i++) { + nsString* ext = (nsString*)mExtensions.StringAt(i); + if (ext->Equals(aExtension)) { + found = PR_TRUE; + break; + } + } + + *_retval = found; return NS_OK; } +NS_IMETHODIMP +nsMIMEInfoImpl::FirstExtension(char **_retval) { + PRUint32 extCount = mExtensions.Count(); + if (extCount < 1) return NS_ERROR_NOT_INITIALIZED; + + *_retval = (mExtensions.StringAt(0))->ToNewCString(); + if (!*_retval) return NS_ERROR_OUT_OF_MEMORY; + return NS_OK; +} + NS_IMETHODIMP nsMIMEInfoImpl::GetMIMEType(char * *aMIMEType) { if (!aMIMEType) return NS_ERROR_NULL_POINTER; @@ -78,14 +94,6 @@ nsMIMEInfoImpl::GetMIMEType(char * *aMIMEType) { return NS_OK; } -NS_IMETHODIMP -nsMIMEInfoImpl::SetMIMEType(const char * aMIMEType) { - NS_RELEASE(mMIMEType); - mMIMEType = NS_NewAtom(aMIMEType); - if (!mMIMEType) return NS_ERROR_OUT_OF_MEMORY; - return NS_OK; -} - NS_IMETHODIMP nsMIMEInfoImpl::GetDescription(PRUnichar * *aDescription) { if (!aDescription) return NS_ERROR_NULL_POINTER; @@ -96,12 +104,20 @@ nsMIMEInfoImpl::GetDescription(PRUnichar * *aDescription) { } NS_IMETHODIMP -nsMIMEInfoImpl::SetDescription(const PRUnichar * aDescription) { - mDescription.SetString(aDescription); - return NS_OK; +nsMIMEInfoImpl::GetDataURI(nsIURI * *aDataURI) { + return mURI->Clone(aDataURI); } NS_IMETHODIMP nsMIMEInfoImpl::Equals(nsIMIMEInfo *aMIMEInfo, PRBool *_retval) { - return NS_ERROR_NOT_IMPLEMENTED; + if (!aMIMEInfo) return NS_ERROR_NULL_POINTER; + + nsXPIDLCString type; + nsresult rv = aMIMEInfo->GetMIMEType(getter_Copies(type)); + if (NS_FAILED(rv)) return rv; + + nsAutoString type1; + mMIMEType->ToString(type1); + *_retval = type1.Equals(type); + return NS_OK; } diff --git a/netwerk/mime/src/nsMIMEInfoImpl.h b/netwerk/mime/src/nsMIMEInfoImpl.h index 584d497ef04c..42391968fa1e 100644 --- a/netwerk/mime/src/nsMIMEInfoImpl.h +++ b/netwerk/mime/src/nsMIMEInfoImpl.h @@ -17,7 +17,7 @@ * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * - * Contributor(s): + * Contributor(s): Judson Valeski */ #ifndef __nsmimeinfoimpl_h___ #define __nsmimeinfoimpl_h___ @@ -25,25 +25,26 @@ #include "nsIMIMEInfo.h" #include "nsIAtom.h" #include "nsString2.h" +#include "nsVoidArray.h" +#include "nsCOMPtr.h" class nsMIMEInfoImpl : public nsIMIMEInfo { - // nsISupports methods NS_DECL_ISUPPORTS - - // nsMIMEInfoImpl methods - nsMIMEInfoImpl(const char *aMIMEType, const char *aFileExtensions, const char *aDescription); - virtual ~nsMIMEInfoImpl(); - - PRBool InExtensions(nsIAtom* anIAtom); - - // nsIMIMEInfo methods NS_DECL_NSIMIMEINFO + // nsMIMEInfoImpl methods + nsMIMEInfoImpl(const char *aMIMEType); + virtual ~nsMIMEInfoImpl() {}; + // member variables - nsIAtom* mMIMEType; - nsString2 mFileExtensions; - nsString2 mDescription; + nsStringArray mExtensions; // array of file extensions associated w/ this MIME obj + nsAutoString mDescription; // human readable description + nsCOMPtr mURI; // URI pointing to data associated w/ this obj + +protected: + nsCOMPtr mMIMEType; + }; #endif //__nsmimeinfoimpl_h___ diff --git a/netwerk/mime/src/nsMIMEService.cpp b/netwerk/mime/src/nsMIMEService.cpp index 24c79971bb33..80083fccf1b2 100644 --- a/netwerk/mime/src/nsMIMEService.cpp +++ b/netwerk/mime/src/nsMIMEService.cpp @@ -17,48 +17,56 @@ * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * - * Contributor(s): + * Contributor(s): Judson Valeski */ #include "nsMIMEService.h" #include "nsVoidArray.h" -#include "nsEnumeratorUtils.h" // for nsArrayEnumerator #include "nsString2.h" #include "nsMIMEInfoImpl.h" -#include "nsIMIMEInfo.h" -#include "nsIFileSpec.h" #include "nsIURL.h" #include "nsCOMPtr.h" +#include "nsXPIDLString.h" +// Hash table helper functions PRBool DeleteEntry(nsHashKey *aKey, void *aData, void* closure) { nsMIMEInfoImpl *entry = (nsMIMEInfoImpl*)aData; - NS_IF_RELEASE(entry); + NS_ASSERTION(entry, "mapping problem"); + NS_RELEASE(entry); return PR_TRUE; }; -PRBool FindMIMEType(nsHashKey *aKey, void *aData, void* closure) { - return PR_FALSE; -} - - // nsISupports methods -NS_IMPL_ISUPPORTS(nsMIMEService, NS_GET_IID(nsIMIMEService)); +NS_IMPL_ISUPPORTS1(nsMIMEService, nsIMIMEService); +NS_METHOD +nsMIMEService::Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult) { + nsMIMEService* service = new nsMIMEService(); + if (!service) return NS_ERROR_OUT_OF_MEMORY; + NS_ADDREF(service); + nsresult rv = service->Init(); + if (NS_FAILED(rv)) return rv; + rv = service->QueryInterface(aIID, aResult); + NS_RELEASE(service); + return rv; +} // nsMIMEService methods nsMIMEService::nsMIMEService() { - NS_INIT_REFCNT(); - - mInfoHashtable = new nsHashtable(); - InitFromHack(); // XXX bogus - //nsresult rv = InitializeMIMEMap(mInfoHashtable); } nsMIMEService::~nsMIMEService() { - mInfoHashtable->Enumerate(DeleteEntry, nsnull); - mInfoHashtable->Reset(); - delete mInfoHashtable; + mInfoObjects->Reset(DeleteEntry, nsnull); + delete mInfoObjects; +} + +nsresult +nsMIMEService::Init() { + mInfoObjects = new nsHashtable(); + if (!mInfoObjects) return NS_ERROR_OUT_OF_MEMORY; + + return InitFromHack(); } /* This bad boy needs to retrieve a url, and parse the data coming back, and @@ -88,21 +96,53 @@ nsMIMEService::InitFromFile(const char *aFileName) { } +// Call this first (perhaps only once) to create the initial nsMIMEInfo object nsresult nsMIMEService::AddMapping(const char* mimeType, const char* extension, - const char* description) + const char* description, + nsIURI* dataURI) { - nsMIMEInfoImpl* anInfo = nsnull; - nsStringKey *extKey = nsnull; - - anInfo = new nsMIMEInfoImpl(mimeType, extension, description); + // setup the new MIMEInfo object. + nsMIMEInfoImpl* anInfo = new nsMIMEInfoImpl(mimeType); if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; + + anInfo->mExtensions.AppendString(extension); + anInfo->mDescription = description; + anInfo->mURI = dataURI; + + // The entry is mapped many-to-one. + + nsStringKey key(mimeType); + nsMIMEInfoImpl* oldInfo = (nsMIMEInfoImpl*)mInfoObjects->Put(&key, anInfo); + NS_IF_RELEASE(oldInfo); NS_ADDREF(anInfo); - extKey = new nsStringKey(extension); - if (!extKey) return NS_ERROR_OUT_OF_MEMORY; - mInfoHashtable->Put(extKey, anInfo); - delete extKey; + + key = extension; + oldInfo = (nsMIMEInfoImpl*)mInfoObjects->Put(&key, anInfo); + NS_IF_RELEASE(oldInfo); + NS_ADDREF(anInfo); + + return NS_OK; +} + +// Call this for subsequent extensions to be mapped to the MIME type. +// You must call AddMapping() for a given MIME type *before* calling this. +nsresult +nsMIMEService::AppendExtension(const char* mimeType, const char* extension) { + nsStringKey key(mimeType); + + nsMIMEInfoImpl* info = (nsMIMEInfoImpl*)mInfoObjects->Get(&key); + NS_ASSERTION(info, "only call AppendExtension *after* a call to AddMapping"); + + info->mExtensions.AppendString(extension); + + // Add another mapping. + key = extension; + nsMIMEInfoImpl* oldInfo = (nsMIMEInfoImpl*)mInfoObjects->Put(&key, info); + NS_IF_RELEASE(oldInfo); + NS_ADDREF(info); + return NS_OK; } @@ -112,97 +152,57 @@ nsMIMEService::InitFromHack() { rv = AddMapping("text/plain", "txt", "Text File"); if (NS_FAILED(rv)) return rv; - rv = AddMapping("text/plain", "text", "Text File"); + rv = AppendExtension("text/plain", "text"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("application/octet-stream", "exe", "Binary Executable"); if (NS_FAILED(rv)) return rv; - rv = AddMapping("application/octet-stream", "bin", "Binary Executable"); + rv = AppendExtension("application/octet-stream", "bin"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("text/html", "htm", "Hyper Text Markup Language"); if (NS_FAILED(rv)) return rv; - rv = AddMapping("text/html", "html", "Hyper Text Markup Language"); + rv = AppendExtension("text/html", "html"); if (NS_FAILED(rv)) return rv; - rv = AddMapping("text/html", "shtml", "Hyper Text Markup Language"); + rv = AppendExtension("text/html", "shtml"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("text/rdf", "rdf", "Resource Description Framework"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("text/xul", "xul", "XML-Based User Interface Language"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("text/xml", "xml", "Extensible Markup Language"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("text/css", "css", "Style Sheet"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("application/x-javascript", "js", "Javascript Source File"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("message/rfc822", "eml", "RFC-822 data"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("image/gif", "gif", "GIF Image"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("image/jpeg", "jpeg", "JPEG Image"); if (NS_FAILED(rv)) return rv; - rv = AddMapping("image/jpeg", "jpg", "JPEG Image"); + rv = AppendExtension("image/jpeg", "jpg"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("image/png", "png", "PNG Image"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("image/x-jg", "art", "ART Image"); if (NS_FAILED(rv)) return rv; + rv = AddMapping("image/tiff", "tiff", "TIFF Image"); if (NS_FAILED(rv)) return rv; - rv = AddMapping("image/tiff", "tif", "TIFF Image"); + rv = AppendExtension("image/tiff", "tif"); if (NS_FAILED(rv)) return rv; -#if 0 - anInfo = new nsMIMEInfoImpl("image/x-cmu-raster", "ras", "CMU Raster Image"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-xbitmap", "xbm", "X Bitmap"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-xpixmap", "xpm", "X Pixmap"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-xwindowdump", "xwd", "X Window Dump Image"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-portable-anymap", "pnm", "PBM Image"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-portable-bitmap", "pbm", "PBM Image"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-portable-graymap", "pgm", "PGM Image"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-portable-pixmap", "ppm", "PPM Image"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-rgb", "rgb", "RGB Image"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-MS-bmp", "bmp", "Windows Bitmap"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/x-photo-cd", "pcd", "PhotoCD Image"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("image/ief", "ief", ""); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); - - anInfo = new nsMIMEInfoImpl("application/fractals", "fif", "Fractal Image Format"); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - mInfoArray->AppendElement(anInfo); -#endif // 0 return NS_OK; } @@ -217,7 +217,7 @@ nsMIMEService::GetFromExtension(const char *aFileExt, nsIMIMEInfo **_retval) { nsStringKey key(fileExt.GetBuffer()); - nsMIMEInfoImpl *entry = (nsMIMEInfoImpl*)mInfoHashtable->Get(&key); + nsMIMEInfoImpl *entry = (nsMIMEInfoImpl*)mInfoObjects->Get(&key); if (!entry) return NS_ERROR_FAILURE; NS_ADDREF(entry); *_retval = NS_STATIC_CAST(nsIMIMEInfo*, entry); @@ -226,13 +226,12 @@ nsMIMEService::GetFromExtension(const char *aFileExt, nsIMIMEInfo **_retval) { NS_IMETHODIMP nsMIMEService::GetTypeFromExtension(const char *aFileExt, char **aContentType) { - nsresult rv; - nsIMIMEInfo *info = nsnull; - rv = GetFromExtension(aFileExt, &info); + nsresult rv = NS_OK;; + nsCOMPtr info; + rv = GetFromExtension(aFileExt, getter_AddRefs(info)); if (NS_FAILED(rv)) return rv; rv = info->GetMIMEType(aContentType); - NS_RELEASE(info); return rv; } @@ -243,21 +242,19 @@ nsMIMEService::GetTypeFromURI(nsIURI *aURI, char **aContentType) { // filename stuff (i.e. query string) nsCOMPtr url = do_QueryInterface(aURI, &rv); if (NS_SUCCEEDED(rv)) { - char *ext = nsnull; - rv = url->GetFileExtension(&ext); + nsXPIDLCString ext; + rv = url->GetFileExtension(getter_Copies(ext)); if (NS_FAILED(rv)) return rv; rv = GetTypeFromExtension(ext, aContentType); - nsAllocator::Free(ext); return rv; } - char *cStrSpec= nsnull; + nsXPIDLCString cStrSpec; // no url, let's give the raw spec a shot - rv = aURI->GetSpec(&cStrSpec); + rv = aURI->GetSpec(getter_Copies(cStrSpec)); if (NS_FAILED(rv)) return rv; nsAutoString specStr(cStrSpec); - nsAllocator::Free(cStrSpec); // find the file extension (if any) nsAutoString extStr; @@ -276,31 +273,14 @@ nsMIMEService::GetTypeFromURI(nsIURI *aURI, char **aContentType) { NS_IMETHODIMP nsMIMEService::GetFromMIMEType(const char *aMIMEType, nsIMIMEInfo **_retval) { + nsCAutoString MIMEType(aMIMEType); + MIMEType.ToLowerCase(); -#if 0 - // hashtable, here's it's a little trickier because we have to enumerate the hashtable + nsStringKey key(MIMEType.GetBuffer()); - nsIAtom* MIMEType = NS_NewAtom(aMIMEType); - if (!MIMEType) return NS_ERROR_OUT_OF_MEMORY; - - PRInt32 count = mInfoArray->Count(); - for (int i = 0; i < count; i++) { - nsMIMEInfoImpl *entry = (nsMIMEInfoImpl*)mInfoArray->ElementAt(i); - if (entry->mMIMEType == MIMEType) { - *_retval = NS_STATIC_CAST(nsIMIMEInfo*, entry); - return NS_OK; - } - } -#endif - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_IMETHODIMP -nsMIMEService::AddMIMEInfo(nsIMIMEInfo *aMIMEInfo) { - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_IMETHODIMP -nsMIMEService::RemoveMIMEInfo(nsIMIMEInfo *aMIMEInfo) { - return NS_ERROR_NOT_IMPLEMENTED; + nsMIMEInfoImpl *entry = (nsMIMEInfoImpl*)mInfoObjects->Get(&key); + if (!entry) return NS_ERROR_FAILURE; + NS_ADDREF(entry); + *_retval = NS_STATIC_CAST(nsIMIMEInfo*, entry); + return NS_OK; } diff --git a/netwerk/mime/src/nsMIMEService.h b/netwerk/mime/src/nsMIMEService.h index 1866e63bc336..20ffebe2d889 100644 --- a/netwerk/mime/src/nsMIMEService.h +++ b/netwerk/mime/src/nsMIMEService.h @@ -17,7 +17,7 @@ * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * - * Contributor(s): + * Contributor(s): Judson Valeski */ /* @@ -35,26 +35,28 @@ class nsMIMEService : public nsIMIMEService { - // nsISupports methods NS_DECL_ISUPPORTS + NS_DECL_NSIMIMESERVICE // nsMIMEService methods nsMIMEService(); virtual ~nsMIMEService(); - - // nsIMIMEService methods - NS_DECL_NSIMIMESERVICE + nsresult Init(); + static NS_METHOD Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult); private: nsresult AddMapping(const char* mimeType, const char* extension, - const char* description); + const char* description, + nsIURI* dataURI = nsnull); + nsresult AppendExtension(const char* mimeType, const char* extension); + nsresult InitFromURI(nsIURI *aUri); nsresult InitFromFile(const char *aFileName); nsresult InitFromHack(); - nsHashtable *mInfoHashtable; + nsHashtable *mInfoObjects; }; #endif // ___nsIMIMEService__h___ diff --git a/netwerk/mime/src/nsMIMEServiceFactory.cpp b/netwerk/mime/src/nsMIMEServiceFactory.cpp deleted file mode 100644 index 9b232d84bbba..000000000000 --- a/netwerk/mime/src/nsMIMEServiceFactory.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * - * The contents of this file are subject to the Netscape Public - * License Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.mozilla.org/NPL/ - * - * Software distributed under the License is distributed on an "AS - * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - * implied. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is Netscape - * Communications Corporation. Portions created by Netscape are - * Copyright (C) 1998 Netscape Communications Corporation. All - * Rights Reserved. - * - * Contributor(s): - */ - - -#if 1 - -#include "nsCOMPtr.h" -#include "nsIModule.h" -#include "nsIGenericFactory.h" -#include "nsIMIMEService.h" -#include "nsMIMEService.h" -#include "nsMIMEServiceFactory.h" -#include "nsIProtocolHandler.h" // for NS_NETWORK_PROTOCOL_PROGID_PREFIX - -NS_GENERIC_FACTORY_CONSTRUCTOR(nsMIMEService); - -// The list of components we register -static nsModuleComponentInfo components[] = -{ - { "MIME type file extensions mapping", - NS_MIMESERVICE_CID, - "component:||netscape|mime", - nsMIMEServiceConstructor - } -}; - -NS_IMPL_NSGETMODULE("nsMIMEServiceModule", components); - - - -#else - - -/* - - The nsHTTPHandlerFactory implementation. This was directly - plagiarized from Chris Waterson the Great. So if you find - a fault here... make sure you notify him as well. - - -Gagan Saksena 03/25/99 - -*/ - -#include "nsCOMPtr.h" -#include "nscore.h" -#include "nsIMIMEService.h" -#include "nsMIMEService.h" -#include "nsMIMEServiceFactory.h" -#include "nsIComponentManager.h" -#include "nsIServiceManager.h" -#include "nsXPComFactory.h" -#include "nsIProtocolHandler.h" // for NS_NETWORK_PROTOCOL_PROGID_PREFIX - -static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); -static NS_DEFINE_CID(kComponentManagerCID, NS_COMPONENTMANAGER_CID); -static NS_DEFINE_CID(kMIMEServiceCID, NS_MIMESERVICE_CID); - -//////////////////////////////////////////////////////////////////////// - -nsMIMEServiceFactory::nsMIMEServiceFactory(const nsCID &aClass, - const char* className, - const char* progID) - : mClassID(aClass), mClassName(className), mProgID(progID) -{ - NS_INIT_REFCNT(); -} - -nsMIMEServiceFactory::~nsMIMEServiceFactory() -{ -} - -NS_IMETHODIMP -nsMIMEServiceFactory::QueryInterface(const nsIID &aIID, void **aResult) -{ - if (! aResult) - return NS_ERROR_NULL_POINTER; - - // Always NULL result, in case of failure - *aResult = nsnull; - - if (aIID.Equals(NS_GET_IID(nsISupports))) { - *aResult = NS_STATIC_CAST(nsISupports*, this); - AddRef(); - return NS_OK; - } else if (aIID.Equals(kIFactoryIID)) { - *aResult = NS_STATIC_CAST(nsIFactory*, this); - AddRef(); - return NS_OK; - } - return NS_NOINTERFACE; -} - -NS_IMPL_ADDREF(nsMIMEServiceFactory); -NS_IMPL_RELEASE(nsMIMEServiceFactory); - -NS_IMETHODIMP -nsMIMEServiceFactory::CreateInstance(nsISupports *aOuter, - const nsIID &aIID, - void **aResult) -{ - if (! aResult) - return NS_ERROR_NULL_POINTER; - - if (aOuter) - return NS_ERROR_NO_AGGREGATION; - - *aResult = nsnull; - - nsresult rv = NS_OK; - - nsISupports *inst = nsnull; - if (mClassID.Equals(kMIMEServiceCID)) { - nsMIMEService *MIMEService = new nsMIMEService(); - if (!MIMEService) return NS_ERROR_OUT_OF_MEMORY; - MIMEService->QueryInterface(NS_GET_IID(nsISupports), (void**)&inst); - } - else { - return NS_ERROR_NO_INTERFACE; - } - - if (!inst) - return NS_ERROR_OUT_OF_MEMORY; - NS_ADDREF(inst); - *aResult = inst; - NS_RELEASE(inst); - return rv; -} - -nsresult nsMIMEServiceFactory::LockFactory(PRBool aLock) -{ - // Not implemented in simplest case. - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////// - - - -// return the proper factory to the caller -extern "C" PR_IMPLEMENT(nsresult) -NSGetFactory(nsISupports* aServMgr, - const nsCID &aClass, - const char *aClassName, - const char *aProgID, - nsIFactory **aFactory) -{ - if (! aFactory) - return NS_ERROR_NULL_POINTER; - - nsMIMEServiceFactory* factory = new nsMIMEServiceFactory(aClass, aClassName, aProgID); - if (factory == nsnull) - return NS_ERROR_OUT_OF_MEMORY; - - NS_ADDREF(factory); - *aFactory = factory; - return NS_OK; -} - - - -extern "C" PR_IMPLEMENT(nsresult) -NSRegisterSelf(nsISupports* aServMgr , const char* aPath) -{ - nsresult rv; - - nsCOMPtr servMgr(do_QueryInterface(aServMgr, &rv)); - if (NS_FAILED(rv)) return rv; - - NS_WITH_SERVICE(nsIComponentManager, compMgr, kComponentManagerCID, &rv); - if (NS_FAILED(rv)) return rv; - - rv = compMgr->RegisterComponent(kMIMEServiceCID, - "MIME type file extensions mapping", - "component:||netscape|mime", - aPath, PR_TRUE, PR_TRUE); - - if (NS_FAILED(rv)) return rv; - - return NS_OK; -} - - -extern "C" PR_IMPLEMENT(nsresult) -NSUnregisterSelf(nsISupports* aServMgr, const char* aPath) -{ - nsresult rv; - - nsCOMPtr servMgr(do_QueryInterface(aServMgr, &rv)); - if (NS_FAILED(rv)) return rv; - - NS_WITH_SERVICE(nsIComponentManager, compMgr, kComponentManagerCID, &rv); - if (NS_FAILED(rv)) return rv; - - rv = compMgr->UnregisterComponent(kMIMEServiceCID, aPath); - if (NS_FAILED(rv)) return rv; - - return NS_OK; -} - -#endif diff --git a/netwerk/mime/src/nsMIMEServiceFactory.h b/netwerk/mime/src/nsMIMEServiceModule.cpp similarity index 58% rename from netwerk/mime/src/nsMIMEServiceFactory.h rename to netwerk/mime/src/nsMIMEServiceModule.cpp index 7e2f3176274c..d8a84c500de4 100644 --- a/netwerk/mime/src/nsMIMEServiceFactory.h +++ b/netwerk/mime/src/nsMIMEServiceModule.cpp @@ -17,32 +17,18 @@ * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * - * Contributor(s): + * Contributor(s): Judson Valeski */ -#include "nsIFactory.h" +#include "nsIGenericFactory.h" +#include "nsMIMEService.h" -class nsMIMEServiceFactory : public nsIFactory -{ -public: - nsMIMEServiceFactory(const nsCID &aClass, const char* className, const char* progID); - - // nsISupports methods - NS_DECL_ISUPPORTS - - // nsIFactory methods - NS_IMETHOD CreateInstance(nsISupports *aOuter, - const nsIID &aIID, - void **aResult); - - NS_IMETHOD LockFactory(PRBool aLock); - -protected: - virtual ~nsMIMEServiceFactory(); - -protected: - nsCID mClassID; - const char* mClassName; - const char* mProgID; +static nsModuleComponentInfo gResComponents[] = { + { "The MIME mapping service", + NS_MIMESERVICE_CID, + "component:||netscape|mime", + nsMIMEService::Create + } }; +NS_IMPL_NSGETMODULE("nsMIMEService", gResComponents) diff --git a/uriloader/exthandler/nsMIMEInfoImpl.cpp b/uriloader/exthandler/nsMIMEInfoImpl.cpp index fd3c4bf45acd..b072b2e3199b 100644 --- a/uriloader/exthandler/nsMIMEInfoImpl.cpp +++ b/uriloader/exthandler/nsMIMEInfoImpl.cpp @@ -17,56 +17,72 @@ * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * - * Contributor(s): + * Contributor(s): Judson Valeski */ #include "nsMIMEInfoImpl.h" -#include "nsCRT.h" - +#include "nsXPIDLString.h" // nsISupports methods NS_IMPL_ISUPPORTS(nsMIMEInfoImpl, NS_GET_IID(nsIMIMEInfo)); // nsMIMEInfoImpl methods -nsMIMEInfoImpl::nsMIMEInfoImpl(const char *aMIMEType, const char *aFileExtensions, const char *aDescription) { +nsMIMEInfoImpl::nsMIMEInfoImpl(const char *aMIMEType) { NS_INIT_REFCNT(); - mMIMEType = NS_NewAtom(aMIMEType); - mFileExtensions.SetString(aFileExtensions); - mDescription.SetString(aDescription); + mMIMEType = getter_AddRefs(NS_NewAtom(aMIMEType)); } -nsMIMEInfoImpl::~nsMIMEInfoImpl() { - NS_RELEASE(mMIMEType); -} - -PRBool -nsMIMEInfoImpl::InExtensions(nsIAtom* anIAtom) { - nsAutoString extension; - anIAtom->ToString(extension); - - // XXX this is broken. need to use gessner's tokenizer stuff to delimit the commas - if (mFileExtensions.Find(extension) == -1) - return PR_FALSE; - return PR_TRUE; -} - -// nsIMIMEInfo methods NS_IMETHODIMP -nsMIMEInfoImpl::GetFileExtensions(char * *aFileExtensions) { - if (!aFileExtensions) return NS_ERROR_NULL_POINTER; +nsMIMEInfoImpl::GetFileExtensions(PRInt32 *elementCount, char ***extensions) { + PRUint32 extCount = mExtensions.Count(); + if (extCount < 1) return NS_ERROR_NOT_INITIALIZED; + + char **_retExts = (char**)nsAllocator::Alloc(extCount*2*sizeof(char*)); + if (!_retExts) return NS_ERROR_OUT_OF_MEMORY; + + for (PRUint8 i=0; i < extCount; i++) { + nsString* ext = (nsString*)mExtensions.StringAt(i); + _retExts[i] = ext->ToNewCString(); + if (!_retExts[i]) return NS_ERROR_OUT_OF_MEMORY; + } + + *elementCount = extCount; + *extensions = _retExts; - *aFileExtensions = mFileExtensions.ToNewCString(); - if (!*aFileExtensions) - return NS_ERROR_OUT_OF_MEMORY; return NS_OK; } NS_IMETHODIMP -nsMIMEInfoImpl::SetFileExtensions(const char * aFileExtensions) { - mFileExtensions.SetString(aFileExtensions); +nsMIMEInfoImpl::ExtensionExists(const char *aExtension, PRBool *_retval) { + NS_ASSERTION(aExtension, "no extension"); + PRBool found = PR_FALSE; + PRUint32 extCount = mExtensions.Count(); + if (extCount < 1) return NS_ERROR_NOT_INITIALIZED; + + if (!aExtension) return NS_ERROR_NULL_POINTER; + + for (PRUint8 i=0; i < extCount; i++) { + nsString* ext = (nsString*)mExtensions.StringAt(i); + if (ext->Equals(aExtension)) { + found = PR_TRUE; + break; + } + } + + *_retval = found; return NS_OK; } +NS_IMETHODIMP +nsMIMEInfoImpl::FirstExtension(char **_retval) { + PRUint32 extCount = mExtensions.Count(); + if (extCount < 1) return NS_ERROR_NOT_INITIALIZED; + + *_retval = (mExtensions.StringAt(0))->ToNewCString(); + if (!*_retval) return NS_ERROR_OUT_OF_MEMORY; + return NS_OK; +} + NS_IMETHODIMP nsMIMEInfoImpl::GetMIMEType(char * *aMIMEType) { if (!aMIMEType) return NS_ERROR_NULL_POINTER; @@ -78,14 +94,6 @@ nsMIMEInfoImpl::GetMIMEType(char * *aMIMEType) { return NS_OK; } -NS_IMETHODIMP -nsMIMEInfoImpl::SetMIMEType(const char * aMIMEType) { - NS_RELEASE(mMIMEType); - mMIMEType = NS_NewAtom(aMIMEType); - if (!mMIMEType) return NS_ERROR_OUT_OF_MEMORY; - return NS_OK; -} - NS_IMETHODIMP nsMIMEInfoImpl::GetDescription(PRUnichar * *aDescription) { if (!aDescription) return NS_ERROR_NULL_POINTER; @@ -96,12 +104,20 @@ nsMIMEInfoImpl::GetDescription(PRUnichar * *aDescription) { } NS_IMETHODIMP -nsMIMEInfoImpl::SetDescription(const PRUnichar * aDescription) { - mDescription.SetString(aDescription); - return NS_OK; +nsMIMEInfoImpl::GetDataURI(nsIURI * *aDataURI) { + return mURI->Clone(aDataURI); } NS_IMETHODIMP nsMIMEInfoImpl::Equals(nsIMIMEInfo *aMIMEInfo, PRBool *_retval) { - return NS_ERROR_NOT_IMPLEMENTED; + if (!aMIMEInfo) return NS_ERROR_NULL_POINTER; + + nsXPIDLCString type; + nsresult rv = aMIMEInfo->GetMIMEType(getter_Copies(type)); + if (NS_FAILED(rv)) return rv; + + nsAutoString type1; + mMIMEType->ToString(type1); + *_retval = type1.Equals(type); + return NS_OK; } diff --git a/uriloader/exthandler/nsMIMEInfoImpl.h b/uriloader/exthandler/nsMIMEInfoImpl.h index 584d497ef04c..42391968fa1e 100644 --- a/uriloader/exthandler/nsMIMEInfoImpl.h +++ b/uriloader/exthandler/nsMIMEInfoImpl.h @@ -17,7 +17,7 @@ * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * - * Contributor(s): + * Contributor(s): Judson Valeski */ #ifndef __nsmimeinfoimpl_h___ #define __nsmimeinfoimpl_h___ @@ -25,25 +25,26 @@ #include "nsIMIMEInfo.h" #include "nsIAtom.h" #include "nsString2.h" +#include "nsVoidArray.h" +#include "nsCOMPtr.h" class nsMIMEInfoImpl : public nsIMIMEInfo { - // nsISupports methods NS_DECL_ISUPPORTS - - // nsMIMEInfoImpl methods - nsMIMEInfoImpl(const char *aMIMEType, const char *aFileExtensions, const char *aDescription); - virtual ~nsMIMEInfoImpl(); - - PRBool InExtensions(nsIAtom* anIAtom); - - // nsIMIMEInfo methods NS_DECL_NSIMIMEINFO + // nsMIMEInfoImpl methods + nsMIMEInfoImpl(const char *aMIMEType); + virtual ~nsMIMEInfoImpl() {}; + // member variables - nsIAtom* mMIMEType; - nsString2 mFileExtensions; - nsString2 mDescription; + nsStringArray mExtensions; // array of file extensions associated w/ this MIME obj + nsAutoString mDescription; // human readable description + nsCOMPtr mURI; // URI pointing to data associated w/ this obj + +protected: + nsCOMPtr mMIMEType; + }; #endif //__nsmimeinfoimpl_h___