From 5fc312c27ff5eb3b279bc973637bcbcfcbb27704 Mon Sep 17 00:00:00 2001 From: "davidm%netscape.com" Date: Wed, 5 Apr 2000 03:03:50 +0000 Subject: [PATCH] 31054 'TEXT' file which contains non ASCII does not open correctly git-svn-id: svn://10.0.0.236/trunk@65311 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/netwerk/base/src/nsFileTransport.cpp | 49 +- mozilla/netwerk/macbuild/netwerkIDL.mcp | Bin 52836 -> 55600 bytes mozilla/netwerk/mime/macbuild/mime.mcp | Bin 74095 -> 74095 bytes mozilla/netwerk/mime/public/Makefile.in | 1 + mozilla/netwerk/mime/public/makefile.win | 1 + mozilla/netwerk/mime/public/nsIMIMEInfo.idl | 29 +- .../netwerk/mime/public/nsIMIMEService.idl | 62 +-- mozilla/netwerk/mime/src/Makefile.in | 1 + mozilla/netwerk/mime/src/makefile.win | 1 + mozilla/netwerk/mime/src/nsMIMEInfoImpl.cpp | 63 ++- mozilla/netwerk/mime/src/nsMIMEInfoImpl.h | 5 +- mozilla/netwerk/mime/src/nsMIMEService.cpp | 417 +++++------------- mozilla/netwerk/mime/src/nsMIMEService.h | 19 +- .../uriloader/exthandler/nsMIMEInfoImpl.cpp | 63 ++- mozilla/uriloader/exthandler/nsMIMEInfoImpl.h | 5 +- 15 files changed, 295 insertions(+), 421 deletions(-) diff --git a/mozilla/netwerk/base/src/nsFileTransport.cpp b/mozilla/netwerk/base/src/nsFileTransport.cpp index 8bacc54d394..c1a50187878 100644 --- a/mozilla/netwerk/base/src/nsFileTransport.cpp +++ b/mozilla/netwerk/base/src/nsFileTransport.cpp @@ -109,41 +109,20 @@ public: *contentLength = -1; } else { - char* fileName; - rv = mFile->GetLeafName(&fileName); - if (NS_FAILED(rv)) return rv; - if (fileName != nsnull) { - PRInt32 len = nsCRT::strlen(fileName); - const char* ext = nsnull; - for (PRInt32 i = len; i >= 0; i--) { - if (fileName[i] == '.') { - ext = &fileName[i + 1]; - break; - } - } - - if (ext) { - NS_WITH_SERVICE(nsIMIMEService, mimeServ, kMIMEServiceCID, &rv); - if (NS_SUCCEEDED(rv)) { - rv = mimeServ->GetTypeFromExtension(ext, contentType); - } - } - else - rv = NS_ERROR_FAILURE; - - nsCRT::free(fileName); - } else { - rv = NS_ERROR_FAILURE; - } - - if (NS_FAILED(rv)) { - // if all else fails treat it as text/html? - *contentType = nsCRT::strdup(DEFAULT_TYPE); - if (*contentType == nsnull) - rv = NS_ERROR_OUT_OF_MEMORY; - else - rv = NS_OK; - } + + NS_WITH_SERVICE(nsIMIMEService, mimeServ, kMIMEServiceCID, &rv); + if (NS_SUCCEEDED(rv)) { + rv = mimeServ->GetTypeFromFile(mFile, contentType); + } + + if (NS_FAILED(rv)) { + // if all else fails treat it as text/html? + *contentType = nsCRT::strdup(DEFAULT_TYPE); + if (*contentType == nsnull) + rv = NS_ERROR_OUT_OF_MEMORY; + else + rv = NS_OK; + } } PR_LOG(gFileTransportLog, PR_LOG_DEBUG, ("nsFileTransport: logically opening %s: type=%s len=%d", diff --git a/mozilla/netwerk/macbuild/netwerkIDL.mcp b/mozilla/netwerk/macbuild/netwerkIDL.mcp index bbe1e0779b8ac2d2e2cf02946c377e562443d3ec..2fc205ce0f12f22d805643f49068087178fb17f5 100644 GIT binary patch delta 780 zcmZuvO=uHQ5PolyV5m*0nx?h+E&1D4K?>H=93(brLZFevdZ^e#Lc2m`(+x=~OnbRuhW?R7DG` zR*qQ^Hup=A@CxXx48f4eZW`#GDJ)Qzd~>EPeq%43UHcqE8YJSME9TyyDUN{Cr}lDH%!T%m;U zKuEwJ+ujh0aaN?a6ZiWjj~k8cdysQ$*>aF_ux}lpBXDRfK*koH^0izY?dWVrK0EON zOWf@Cj7gbgQH;7;kwr$m6gI|qwlS7mhu3Z;Jgw-?oj&w88o2>hto)++kOm4Ln;ao) zgKe%4PCl>YLt(iQ#_c}2$hPde94qiDPA$(KZ9VYTZlz8L@lMJ^b;s6RVtbRrl$AfB z;N1ZV(aru8jqs}pWms41(c`oCPY{pWegt6;| zX#uJ=-LQQN_kA@MPcGw(e|F@AY@e{-HJ##iE!$;)jdhN-ELTJ0Br;vRX%q8)~5j2!)tgb26d_4GINYL>F=uD(FS@Ab5!1tW{$N-hAKtc=OG?H}!`8@va_T zEEJZANGB3$qL*t#uiVGs)1i}Chh1o)i2v8=L*_%^7rRA|@` zDZU-g@=Sg*h$N|m%2`vMGEJSmi-#K{bAq?WBf{d{@%wzIHpn;9^GC^@U8{=zd`?3b z;19$RAFDzP!1kbq=V1xK-;;Iev}&3$g!}~8TM6S3*h$6Y#B)PyjAVuUJkfVOf-%tn zgpcmlO1|5@ImheMVfi*CG~Rr@`p2aG*Q5=TH%~+*H?LkPwc6?s-VNi@`Zsk?u>|bZ Z9pr=1;rE}uj@*&f`-Y|^Tz=HJ6w+mx*35XJYv?xq(%CVnFWZ2fo>i ztY8;x4)9;V%(0dK$2|syY=O-^eL_qV16U{Xhf1-3Rb2G{|C+$fg2BHTCu@g`fdm*B z)D3_FKN&YWMjr15dXQyuDZ8L4vwKiz0LTYGz{*@)lnkU<+&q0;fzA_v(t=Q01WJoe zUd_H=45&aDD!>IXLcHqqgvs046(%|^*!(O17UO1tk4DU!KfmUX+Ahz@2y^%34SovS z*K;uzG6OxR!n|F9kMSfI6T8Or*Ak5ShAV*f3*?p*WCCeWz(WE14j@A#wmf*vIsgefn)lMm;~)-#~9L0QKhp)d5`y100}OY5<9ACfqyA5dIl Kd$<&%1UmpH-hBK3 delta 512 zcmaEVh~@numJQR{CeLP@QqRf2z@WegB!E~1NP+oGKn4(l_`yJ&z`(%rhk=0u$OQ9+ z8Q4Kgpgc$+1A{0?GXraozkdjr4<%UKgF*wKY*yytqGTYO$<5Qp6{uPON;3*h4tly@ z4=5rG72$%?B99dEb5c@^tOANs(^89=RD2E;TluDz6y=vsp24w=1!$Pif{1{jm-!A4VXE$9LcX_VBosCxu;Kv zX<`8DWd2Yo_9Lz<{{KI%zxiVNZ^p^m;bIVhcc*{?KN&YWMjr3pJR$l%F6cqFI4mSEI3 z)BrkDAh)C-6G(#s2@1GC0jH8%l9Lalk;K_Orh7{=_A#*+OusG3sOQHi4-8iZp#B`7 mI!IuHO%VMKq#A(Y#i-)!7C=7CJ|y)#GlAkN+ry<8CD;KOC3oQf diff --git a/mozilla/netwerk/mime/public/Makefile.in b/mozilla/netwerk/mime/public/Makefile.in index 4bcdc5801b8..5e3d5048b63 100644 --- a/mozilla/netwerk/mime/public/Makefile.in +++ b/mozilla/netwerk/mime/public/Makefile.in @@ -32,6 +32,7 @@ XPIDL_MODULE = mimetype XPIDLSRCS = \ nsIMIMEService.idl \ nsIMIMEInfo.idl \ + nsIMIMEDataSource.idl \ $(NULL) EXPORTS = \ diff --git a/mozilla/netwerk/mime/public/makefile.win b/mozilla/netwerk/mime/public/makefile.win index 156e268cb1f..84b8525bc8a 100644 --- a/mozilla/netwerk/mime/public/makefile.win +++ b/mozilla/netwerk/mime/public/makefile.win @@ -29,6 +29,7 @@ XPIDL_MODULE = mimetype XPIDLSRCS = \ .\nsIMIMEInfo.idl \ .\nsIMIMEService.idl \ + .\nsIMIMEDataSource.idl \ $(NULL) EXPORTS = \ diff --git a/mozilla/netwerk/mime/public/nsIMIMEInfo.idl b/mozilla/netwerk/mime/public/nsIMIMEInfo.idl index 8dff5a9cbf2..8a8cddc68f7 100644 --- a/mozilla/netwerk/mime/public/nsIMIMEInfo.idl +++ b/mozilla/netwerk/mime/public/nsIMIMEInfo.idl @@ -31,6 +31,18 @@ #include "nsISupports.idl" #include "nsIURI.idl" +%{C++ +#define NS_MIMEINFO_CID \ +{ /* {95df6583-0001-11d4-a12b-a66ef662f0bc} */ \ + 0x95df6583, \ + 0x0001, \ + 0x11d4, \ + { 0xa1, 0x2b, 0xa6, 0x6e, 0xf6, 0x62, 0xf0, 0xbc } \ +} +#define NS_MIMEINFO_PROGID \ +"component:||netscape|mimeinfo" +%} + [scriptable, uuid(6A57EAE0-2FE8-11d3-A164-0050041CAF44)] interface nsIMIMEInfo : nsISupports { /* Gives you an array of file types associated with this type. @@ -55,18 +67,23 @@ interface nsIMIMEInfo : nsISupports { * @return The first extension. */ string FirstExtension(); + + /* + * Append a given extension to the set of extensions + */ + void AppendExtension(in string aExtension); /* The MIME type of this MIMEInfo. * * @return String representing the MIME type. */ - readonly attribute string MIMEType; + attribute string MIMEType; /* A human readable description of the MIME info * * @return The description */ - readonly attribute wstring Description; + attribute wstring Description; /* Gives you arbitrary data about the MIMEInfo. An example * of this is a generic image graphically representing @@ -76,7 +93,13 @@ interface nsIMIMEInfo : nsISupports { * @return A URI representing the data location. */ readonly attribute nsIURI DataURI; - + + /* + * Mac Type and creator types + */ + attribute PRUint32 MacType; + attribute PRUint32 MacCreator; + /* Returns whether or not these two MIME infos are logically * equivelent maintaining the one-to-many relationship between * MIME types and file extensions. diff --git a/mozilla/netwerk/mime/public/nsIMIMEService.idl b/mozilla/netwerk/mime/public/nsIMIMEService.idl index 8e4ead2fd5a..3f7bea3a57e 100644 --- a/mozilla/netwerk/mime/public/nsIMIMEService.idl +++ b/mozilla/netwerk/mime/public/nsIMIMEService.idl @@ -18,6 +18,7 @@ * Rights Reserved. * * Contributor(s): Judson Valeski + * : David Matiskella */ /* The MIME service is responsible for mapping file extensions to MIME-types @@ -34,7 +35,8 @@ #include "nsISupports.idl" #include "nsIMIMEInfo.idl" #include "nsIURI.idl" -#include "nsISupportsArray.idl" +#include "nsIMIMEDataSource.idl" +#include "nsIFile.idl" %{C++ #define NS_MIMESERVICE_CID \ @@ -81,51 +83,15 @@ interface nsIMIMEService : nsISupports { * @return The MIME type, if any. */ string GetTypeFromURI(in nsIURI aURI); - - /* Adds a MIME mapping to the database. - * - * @param MIME type to be registered. - * @param File extension to be associated. - * @param Description of this MIME type. - * @param Data URI typically used to retrieve an image - * graphically representing the MIME type. - * - */ - void AddMapping(in string aMIMEType, in string aExtension, in string aDesc, in nsIURI aURI); - - /* Removes a MIME mapping from the database. All file extensions - * associated with this mapping are removed as well. - * - * @param MIME type to be removed. - * @return NS_OK - */ - void RemoveMapping(in string aMIMEType); - - /* Maps a file extension (don't include leading dot) to a MIME entry. - * - * @param MIME type to associate this extension with. - * @param File extension to associate with MIME type. - * @return NS_ERROR_FAILURE if the MIME entry doesn't exist, or for - * general fialure. NS_OK otherwise. - */ - void AppendExtension(in string aMIMEType, in string aExtension); - - /* Removes a file extension association with a MIME entry. - * - * @param The file extension to be removed. - * @return NS_ERROR_FAILURE if the MIME entry doesn't exist, or for - * general failure. NS_OK otherwise. - */ - void RemoveExtension(in string aExtension); - - /* Enumerates all the MIME types in the database. Each entry - * is represented as an nsIMIMEInfo interface. - * - * @return All the registered MIME types. - */ - nsIBidirectionalEnumerator EnumerateEntries(); - - /* Makes the current mappings persistent. - */ - void Serialize(); + + // + string GetTypeFromFile ( in nsIFile aFile ); + + + /* + * The data sources + */ + readonly attribute nsIMIMEDataSource XMLDataSource; + readonly attribute nsIMIMEDataSource NativeDataSource; + }; diff --git a/mozilla/netwerk/mime/src/Makefile.in b/mozilla/netwerk/mime/src/Makefile.in index eefe9741b6e..079fd644226 100644 --- a/mozilla/netwerk/mime/src/Makefile.in +++ b/mozilla/netwerk/mime/src/Makefile.in @@ -36,6 +36,7 @@ CPPSRCS = \ nsMIMEInfoImpl.cpp \ nsMIMEService.cpp \ nsMIMEServiceModule.cpp \ + nsXMLMIMEDataSource.cpp \ $(NULL) EXTRA_DSO_LDOPTS += $(MOZ_COMPONENT_LIBS) diff --git a/mozilla/netwerk/mime/src/makefile.win b/mozilla/netwerk/mime/src/makefile.win index 3c547ca7d4b..ba2c052e96c 100644 --- a/mozilla/netwerk/mime/src/makefile.win +++ b/mozilla/netwerk/mime/src/makefile.win @@ -38,6 +38,7 @@ CPP_OBJS = \ .\$(OBJDIR)\nsMIMEInfoImpl.obj \ .\$(OBJDIR)\nsMIMEService.obj \ .\$(OBJDIR)\nsMIMEServiceModule.obj \ + .\$(OBJDIR)\nsXMLMIMEDataSource.obj \ $(NULL) LOCAL_INCLUDES=-I. diff --git a/mozilla/netwerk/mime/src/nsMIMEInfoImpl.cpp b/mozilla/netwerk/mime/src/nsMIMEInfoImpl.cpp index 4bc210bdb00..b80c56e6488 100644 --- a/mozilla/netwerk/mime/src/nsMIMEInfoImpl.cpp +++ b/mozilla/netwerk/mime/src/nsMIMEInfoImpl.cpp @@ -27,9 +27,12 @@ NS_IMPL_THREADSAFE_ISUPPORTS1(nsMIMEInfoImpl, nsIMIMEInfo); // nsMIMEInfoImpl methods -nsMIMEInfoImpl::nsMIMEInfoImpl(const char *aMIMEType) { +nsMIMEInfoImpl::nsMIMEInfoImpl() { + NS_INIT_REFCNT(); +} + +nsMIMEInfoImpl::nsMIMEInfoImpl(const char *aMIMEType): mMIMEType( aMIMEType ) { NS_INIT_REFCNT(); - mMIMEType = getter_AddRefs(NS_NewAtom(aMIMEType)); } PRUint32 @@ -66,7 +69,7 @@ nsMIMEInfoImpl::ExtensionExists(const char *aExtension, PRBool *_retval) { if (!aExtension) return NS_ERROR_NULL_POINTER; for (PRUint8 i=0; i < extCount; i++) { - nsCString* ext = mExtensions.CStringAt(i); + nsCString* ext = (nsCString*)mExtensions.CStringAt(i); if (ext->Equals(aExtension)) { found = PR_TRUE; break; @@ -87,17 +90,29 @@ nsMIMEInfoImpl::FirstExtension(char **_retval) { return NS_OK; } +NS_IMETHODIMP nsMIMEInfoImpl::AppendExtension(const char *aExtension) +{ + mExtensions.AppendCString( aExtension ); + return NS_OK; +} + NS_IMETHODIMP nsMIMEInfoImpl::GetMIMEType(char * *aMIMEType) { if (!aMIMEType) return NS_ERROR_NULL_POINTER; - nsAutoString strMIMEType; - mMIMEType->ToString(strMIMEType); - *aMIMEType = strMIMEType.ToNewCString(); + *aMIMEType = mMIMEType.ToNewCString(); if (!*aMIMEType) return NS_ERROR_OUT_OF_MEMORY; return NS_OK; } +NS_IMETHODIMP +nsMIMEInfoImpl::SetMIMEType(const char* aMIMEType) { + if (!aMIMEType) return NS_ERROR_NULL_POINTER; + + mMIMEType = aMIMEType; + return NS_OK; +} + NS_IMETHODIMP nsMIMEInfoImpl::GetDescription(PRUnichar * *aDescription) { if (!aDescription) return NS_ERROR_NULL_POINTER; @@ -107,6 +122,12 @@ nsMIMEInfoImpl::GetDescription(PRUnichar * *aDescription) { return NS_OK; } +NS_IMETHODIMP nsMIMEInfoImpl::SetDescription(const PRUnichar * aDescription) +{ + mDescription = aDescription; + return NS_OK; +} + NS_IMETHODIMP nsMIMEInfoImpl::GetDataURI(nsIURI * *aDataURI) { return mURI->Clone(aDataURI); @@ -120,9 +141,31 @@ nsMIMEInfoImpl::Equals(nsIMIMEInfo *aMIMEInfo, PRBool *_retval) { nsresult rv = aMIMEInfo->GetMIMEType(getter_Copies(type)); if (NS_FAILED(rv)) return rv; - // STRING USE WARNING: perhaps |type1| should be an |nsCAutoString|? -- scc - nsAutoString type1; - mMIMEType->ToString(type1); - *_retval = type1.EqualsWithConversion(type); + *_retval = mMIMEType.EqualsWithConversion(type); + return NS_OK; } + +NS_IMETHODIMP nsMIMEInfoImpl::GetMacType(PRUint32 *aMacType) +{ + *aMacType = mMacType; + return NS_OK; +} + +NS_IMETHODIMP nsMIMEInfoImpl::SetMacType(PRUint32 aMacType) +{ + mMacType = aMacType; + return NS_OK; +} + +NS_IMETHODIMP nsMIMEInfoImpl::GetMacCreator(PRUint32 *aMacCreator) +{ + *aMacCreator = mMacCreator; + return NS_OK; +} + +NS_IMETHODIMP nsMIMEInfoImpl::SetMacCreator(PRUint32 aMacCreator) +{ + mMacCreator = aMacCreator; + return NS_OK; +} diff --git a/mozilla/netwerk/mime/src/nsMIMEInfoImpl.h b/mozilla/netwerk/mime/src/nsMIMEInfoImpl.h index 2cccc879a7f..85e131711ea 100644 --- a/mozilla/netwerk/mime/src/nsMIMEInfoImpl.h +++ b/mozilla/netwerk/mime/src/nsMIMEInfoImpl.h @@ -34,6 +34,7 @@ class nsMIMEInfoImpl : public nsIMIMEInfo { NS_DECL_NSIMIMEINFO // nsMIMEInfoImpl methods + nsMIMEInfoImpl(); nsMIMEInfoImpl(const char *aMIMEType); virtual ~nsMIMEInfoImpl() {}; PRUint32 GetExtCount(); // returns the number of extensions associated. @@ -42,9 +43,9 @@ class nsMIMEInfoImpl : public nsIMIMEInfo { nsCStringArray 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 - + PRUint32 mMacType, mMacCreator; // Mac file type and creator protected: - nsCOMPtr mMIMEType; + nsString mMIMEType; }; diff --git a/mozilla/netwerk/mime/src/nsMIMEService.cpp b/mozilla/netwerk/mime/src/nsMIMEService.cpp index 7e04bfe3361..defa0ecc49d 100644 --- a/mozilla/netwerk/mime/src/nsMIMEService.cpp +++ b/mozilla/netwerk/mime/src/nsMIMEService.cpp @@ -40,14 +40,13 @@ #include "nsIURL.h" #include "nsCOMPtr.h" #include "nsXPIDLString.h" -#include "nsMimeTypes.h" -PRBool PR_CALLBACK DeleteEntry(nsHashKey *aKey, void *aData, void* closure) { - nsMIMEInfoImpl *entry = (nsMIMEInfoImpl*)aData; - NS_ASSERTION(entry, "mapping problem"); - NS_RELEASE(entry); - return PR_TRUE; -}; + +#ifdef XP_MAC +#include "nsILocalFileMac.h" +#endif + + // nsISupports methods NS_IMPL_THREADSAFE_ISUPPORTS1(nsMIMEService, nsIMIMEService); @@ -70,305 +69,56 @@ nsMIMEService::nsMIMEService() { } nsMIMEService::~nsMIMEService() { - mInfoObjects->Reset(DeleteEntry, nsnull); - delete mInfoObjects; } nsresult nsMIMEService::Init() { nsresult rv = NS_OK; - mInfoObjects = new nsHashtable(); - if (!mInfoObjects) return NS_ERROR_OUT_OF_MEMORY; - - rv = NS_NewISupportsArray(getter_AddRefs(mInfoArray)); - if (NS_FAILED(rv)) return rv; - - return InitFromHack(); -} - - /* This bad boy needs to retrieve a url, and parse the data coming back, and - * add entries into the mInfoArray. - */ -nsresult -nsMIMEService::InitFromURI(nsIURI *aUri) { - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult -nsMIMEService::InitFromFile(const char *aFileName) { -#if 0 - nsFileSpec dirSpec; - nsIFileSpec* spec = NS_LocateFileOrDirectory(nsSpecialFileSpec::App_UserProfileDirectory50); - if (!spec) return NS_ERROR_FAILURE; - spec->GetFileSpec(&dirSpec); - - nsInputFileStream inStream(dirSpec + aFileName); - if (!inStream.is_open()) { - return NS_OK; - } - - // digest the file. -#endif - return NS_ERROR_NOT_IMPLEMENTED; - -} - -NS_IMETHODIMP -nsMIMEService::AddMapping(const char* mimeType, - const char* extension, - const char* description, - nsIURI* dataURI) -{ - nsresult rv = NS_OK; - // setup the new MIMEInfo object. - nsMIMEInfoImpl* anInfo = new nsMIMEInfoImpl(mimeType); - if (!anInfo) return NS_ERROR_OUT_OF_MEMORY; - - anInfo->mExtensions.AppendCString(extension); - anInfo->mDescription.AssignWithConversion(description); - anInfo->mURI = dataURI; - - // The entry is mapped many-to-one and the MIME type is the root mapping. - - // First remove any existing mapping. - rv = RemoveMapping(mimeType); - if (NS_FAILED(rv)) return rv; - - // Next add the new root MIME mapping. - nsStringKey key(mimeType); - nsMIMEInfoImpl* oldInfo = (nsMIMEInfoImpl*)mInfoObjects->Put(&key, anInfo); - NS_ASSERTION(!oldInfo, "we just removed the entry, we shouldn't have one"); - NS_ADDREF(anInfo); - - rv = mInfoArray->AppendElement(anInfo); // update the root array. - if (NS_FAILED(rv)) return rv; - - // Finally add an extension mapping. - key = extension; - oldInfo = (nsMIMEInfoImpl*)mInfoObjects->Put(&key, anInfo); - NS_ASSERTION(!oldInfo, "file extension mappings should have been cleaned up in the RemoveMapping call"); - NS_ADDREF(anInfo); - - return NS_OK; -} - -// used to cleanup any file extension mappings when -// a root MIME entry is removed. -PRBool removeExts(nsCString& aElement, void *aData) { - nsHashtable* infoObjects = (nsHashtable*)aData; - NS_ASSERTION(infoObjects, "hash table botched up"); - - nsStringKey key(aElement); - nsMIMEInfoImpl* info = (nsMIMEInfoImpl*)infoObjects->Remove(&key); - NS_RELEASE(info); - return PR_TRUE; -} - -NS_IMETHODIMP -nsMIMEService::RemoveMapping(const char* aMIMEType) { - nsresult rv = NS_OK; - nsStringKey key(aMIMEType); - - // First remove the root MIME mapping. - nsMIMEInfoImpl* info = (nsMIMEInfoImpl*)mInfoObjects->Remove(&key); - if (!info) return NS_OK; - - rv = mInfoArray->RemoveElement(info); // update the root array. - if (NS_FAILED(rv)) return rv; - - // Next remove any file association mappings. - rv = info->mExtensions.EnumerateForwards(removeExts, mInfoObjects); - NS_RELEASE(info); - if (NS_FAILED(rv)) return rv; - - return NS_OK; -} - -NS_IMETHODIMP -nsMIMEService::AppendExtension(const char* mimeType, const char* extension) { - nsStringKey key(mimeType); - - nsMIMEInfoImpl* info = (nsMIMEInfoImpl*)mInfoObjects->Get(&key); - if (!info) return NS_ERROR_FAILURE; - - info->mExtensions.AppendCString(extension); - - // Add another file extension mapping. - key = extension; - nsMIMEInfoImpl* oldInfo = (nsMIMEInfoImpl*)mInfoObjects->Put(&key, info); - NS_IF_RELEASE(oldInfo); // overwrite any existing mapping. - NS_ADDREF(info); - - return NS_OK; -} - -NS_IMETHODIMP -nsMIMEService::RemoveExtension(const char* aExtension) { - nsresult rv = NS_OK; - nsStringKey key(aExtension); - - // First remove the extension mapping. - nsMIMEInfoImpl* info = (nsMIMEInfoImpl*)mInfoObjects->Remove(&key); - if (!info) return NS_ERROR_FAILURE; - - // Next remove the root MIME mapping from the array and hash - // IFF this was the only file extension mapping left. - - // STRING USE WARNING: this particular use really needs to be examined -- scc - nsCAutoString keyString; - keyString.AssignWithConversion(key.GetString().GetUnicode()); - PRBool removed = info->mExtensions.RemoveCString(keyString); - NS_ASSERTION(removed, "mapping problem"); - - if (info->GetExtCount() == 0) { - // it's empty, remove the root mapping from hash and array. - nsXPIDLCString mimeType; - rv = info->GetMIMEType(getter_Copies(mimeType)); - if (NS_FAILED(rv)) return rv; - - key = (const char*)mimeType; - nsMIMEInfoImpl* rootEntry = (nsMIMEInfoImpl*)mInfoObjects->Remove(&key); - NS_ASSERTION(rootEntry, "mapping miss-hap"); - - rv = mInfoArray->RemoveElement(rootEntry); // update the root array - if (NS_FAILED(rv)) return rv; - - NS_RELEASE(rootEntry); - } - - NS_RELEASE(info); - - return NS_OK; -} - -NS_IMETHODIMP -nsMIMEService::EnumerateEntries(nsIBidirectionalEnumerator* *aEnumerator) { - return NS_NewISupportsArrayEnumerator(mInfoArray, aEnumerator); -} - -NS_IMETHODIMP -nsMIMEService::Serialize() { - return NS_ERROR_NOT_IMPLEMENTED; -} - -nsresult -nsMIMEService::InitFromHack() { - nsresult rv; - - rv = AddMapping(TEXT_PLAIN, "txt", "Text File", nsnull); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(TEXT_PLAIN, "text"); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(APPLICATION_OCTET_STREAM, "exe", "Binary Executable", nsnull); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(APPLICATION_OCTET_STREAM, "bin"); - if (NS_FAILED(rv)) return rv; -#if defined(VMS) - rv = AppendExtension(APPLICATION_OCTET_STREAM, "sav"); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(APPLICATION_OCTET_STREAM, "bck"); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(APPLICATION_OCTET_STREAM, "pcsi"); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(APPLICATION_OCTET_STREAM, "pcsi-dcx_axpexe"); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(APPLICATION_OCTET_STREAM, "pcsi-dcx_vaxexe"); - if (NS_FAILED(rv)) return rv; -#endif - - rv = AddMapping(TEXT_HTML, "htm", "Hyper Text Markup Language", nsnull); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(TEXT_HTML, "html"); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(TEXT_HTML, "shtml"); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(TEXT_HTML, "ehtml"); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(TEXT_RDF, "rdf", "Resource Description Framework", nsnull); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(TEXT_XUL, "xul", "XML-Based User Interface Language", nsnull); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(TEXT_XML, "xml", "Extensible Markup Language", nsnull); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(TEXT_CSS, "css", "Style Sheet", nsnull); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(APPLICATION_JAVASCRIPT, "js", "Javascript Source File", nsnull); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(MESSAGE_RFC822, "eml", "RFC-822 data", nsnull); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(IMAGE_GIF, "gif", "GIF Image", nsnull); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(IMAGE_JPG, "jpeg", "JPEG Image", nsnull); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(IMAGE_JPG, "jpg"); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(IMAGE_PNG, "png", "PNG Image", nsnull); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(IMAGE_ART, "art", "ART Image", nsnull); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(IMAGE_TIFF, "tiff", "TIFF Image", nsnull); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(IMAGE_TIFF, "tif"); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(APPLICATION_POSTSCRIPT, "ps", "Postscript File", nsnull); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(APPLICATION_POSTSCRIPT, "eps"); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(APPLICATION_POSTSCRIPT, "ai"); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(TEXT_RTF, "rtf", "Rich Text Format", nsnull); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(TEXT_RTF, "rtf"); - if (NS_FAILED(rv)) return rv; - - rv = AddMapping(TEXT_CPP, "cpp", "CPP file", nsnull); - if (NS_FAILED(rv)) return rv; - rv = AppendExtension(TEXT_CPP, "cpp"); - if (NS_FAILED(rv)) return rv; - - return NS_OK; + rv = nsComponentManager::CreateInstance(NS_XMLMIMEDATASOURCE_PROGID, nsnull, nsIMIMEDataSource::GetIID(), getter_AddRefs(mXML) ); + + // Create native + nsComponentManager::CreateInstance(NS_NATIVEMIMEDATASOURCE_PROGID, nsnull, nsIMIMEDataSource::GetIID(), getter_AddRefs(mNative) ); + return rv; } // nsIMIMEService methods NS_IMETHODIMP nsMIMEService::GetFromExtension(const char *aFileExt, nsIMIMEInfo **_retval) { - // for now we're assuming file extensions are case insensitive. - nsCAutoString fileExt(aFileExt); - fileExt.ToLowerCase(); - - nsStringKey key(fileExt.GetBuffer()); - - nsMIMEInfoImpl *entry = (nsMIMEInfoImpl*)mInfoObjects->Get(&key); - if (!entry) return NS_ERROR_FAILURE; - NS_ADDREF(entry); - *_retval = NS_STATIC_CAST(nsIMIMEInfo*, entry); - return NS_OK; + nsresult rv; + if( !mXML || NS_FAILED (rv = mXML->GetFromExtension( aFileExt, _retval ) ) ) + { + if ( mNative ) + rv = mNative->GetFromExtension( aFileExt, _retval ); + } + return rv; } + + +NS_IMETHODIMP +nsMIMEService::GetFromMIMEType(const char *aMIMEType, nsIMIMEInfo **_retval) { + nsresult rv =NS_ERROR_FAILURE; + if( !mXML || NS_FAILED (rv = mXML->GetFromMIMEType( aMIMEType, _retval ) ) ) + { + if ( mNative ) + rv = mNative->GetFromMIMEType( aMIMEType, _retval ); + } + return rv; +} + + + +// Helper routines implemented in terms of the above + NS_IMETHODIMP nsMIMEService::GetTypeFromExtension(const char *aFileExt, char **aContentType) { nsresult rv = NS_OK;; nsCOMPtr info; rv = GetFromExtension(aFileExt, getter_AddRefs(info)); if (NS_FAILED(rv)) return rv; + return info->GetMIMEType(aContentType); - rv = info->GetMIMEType(aContentType); - return rv; } NS_IMETHODIMP @@ -377,6 +127,29 @@ nsMIMEService::GetTypeFromURI(nsIURI *aURI, char **aContentType) { // first try to get a url out of the uri so we can skip post // filename stuff (i.e. query string) nsCOMPtr url = do_QueryInterface(aURI, &rv); + + #ifdef XP_MAC + if ( NS_SUCCEEDED( rv ) ) + { + nsXPIDLCString fileExt; + url->GetFileExtension(getter_Copies(fileExt)); + + nsresult rv2; + nsCOMPtr fileurl = do_QueryInterface( url, &rv2 ); + if ( NS_SUCCEEDED ( rv2 ) ) + { + nsCOMPtr file; + rv2 = fileurl->GetFile( getter_AddRefs( file ) ); + if ( NS_SUCCEEDED( rv2 ) ) + { + rv2 = GetTypeFromFile( file, aContentType ); + if( NS_SUCCEEDED ( rv2 ) ) + return rv2; + } + } + } + #endif + if (NS_SUCCEEDED(rv)) { nsXPIDLCString ext; rv = url->GetFileExtension(getter_Copies(ext)); @@ -407,16 +180,66 @@ nsMIMEService::GetTypeFromURI(nsIURI *aURI, char **aContentType) { return rv; } -NS_IMETHODIMP -nsMIMEService::GetFromMIMEType(const char *aMIMEType, nsIMIMEInfo **_retval) { - nsCAutoString MIMEType(aMIMEType); - MIMEType.ToLowerCase(); +NS_IMETHODIMP nsMIMEService::GetTypeFromFile( nsIFile* aFile, char **aContentType ) +{ + nsresult rv; + nsCOMPtr info; + + // Get the Extension + char* fileName; + const char* ext = nsnull; + rv = aFile->GetLeafName(&fileName); + if (NS_FAILED(rv)) return rv; + if (fileName != nsnull) { + PRInt32 len = nsCRT::strlen(fileName); + for (PRInt32 i = len; i >= 0; i--) { + if (fileName[i] == '.') { + ext = &fileName[i + 1]; + break; + } + } + } + nsCString fileExt( ext ); + nsCRT::free(fileName); + // Handle the mac case +#ifdef XP_MAC + nsCOMPtr macFile; + + macFile = do_QueryInterface( aFile, &rv ); + if ( NS_SUCCEEDED( rv ) ) + { + PRUint32 type, creator; + macFile->GetFileTypeAndCreator( (OSType*)&type,(OSType*) &creator ); + if( !mXML || NS_FAILED (rv = mXML->GetFromTypeCreator( type, creator, fileExt, getter_AddRefs(info) ) ) ) + { + if ( mNative ) + rv = mNative->GetFromTypeCreator( type, creator, fileExt, getter_AddRefs(info) ); + } + + if ( NS_SUCCEEDED( rv) ) + { + return info->GetMIMEType(aContentType); + } + } +#endif +// Windows, unix and mac when no type match occured. - nsStringKey key(MIMEType.GetBuffer()); - - nsMIMEInfoImpl *entry = (nsMIMEInfoImpl*)mInfoObjects->Get(&key); - if (!entry) return NS_ERROR_FAILURE; - NS_ADDREF(entry); - *_retval = NS_STATIC_CAST(nsIMIMEInfo*, entry); - return NS_OK; + + return GetTypeFromExtension( fileExt, aContentType ); } + +// get a specific data source +NS_IMETHODIMP +nsMIMEService::GetXMLDataSource(nsIMIMEDataSource * *aXMLDataSource){ + *aXMLDataSource = mXML; + NS_IF_ADDREF( *aXMLDataSource ); + return NS_OK; +} + +NS_IMETHODIMP +nsMIMEService::GetNativeDataSource(nsIMIMEDataSource * *aNativeDataSource) +{ + *aNativeDataSource = mNative; + NS_IF_ADDREF( *aNativeDataSource ); + return NS_OK; +} \ No newline at end of file diff --git a/mozilla/netwerk/mime/src/nsMIMEService.h b/mozilla/netwerk/mime/src/nsMIMEService.h index b067164095b..4572b651df7 100644 --- a/mozilla/netwerk/mime/src/nsMIMEService.h +++ b/mozilla/netwerk/mime/src/nsMIMEService.h @@ -18,6 +18,7 @@ * Rights Reserved. * * Contributor(s): Judson Valeski + * : David Matiskella */ /* @@ -29,11 +30,8 @@ #define ___nsIMIMEService__h___ #include "nsIMIMEService.h" +#include "nsIMIMEDataSource.h" #include "nsCOMPtr.h" -#include "nsIURI.h" -#include "nsHashtable.h" -#include "nsISupportsArray.h" - class nsMIMEService : public nsIMIMEService { @@ -43,19 +41,12 @@ class nsMIMEService : public nsIMIMEService { // nsMIMEService methods nsMIMEService(); virtual ~nsMIMEService(); - nsresult Init(); static NS_METHOD Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult); private: - nsresult InitFromURI(nsIURI *aUri); - nsresult InitFromFile(const char *aFileName); - nsresult InitFromHack(); - - - nsHashtable *mInfoObjects; // used for fast access and - // multi index lookups - - nsCOMPtr mInfoArray; // used for enumeration + nsresult Init(); + nsCOMPtr mXML; + nsCOMPtr mNative; }; #endif // ___nsIMIMEService__h___ diff --git a/mozilla/uriloader/exthandler/nsMIMEInfoImpl.cpp b/mozilla/uriloader/exthandler/nsMIMEInfoImpl.cpp index 4bc210bdb00..b80c56e6488 100644 --- a/mozilla/uriloader/exthandler/nsMIMEInfoImpl.cpp +++ b/mozilla/uriloader/exthandler/nsMIMEInfoImpl.cpp @@ -27,9 +27,12 @@ NS_IMPL_THREADSAFE_ISUPPORTS1(nsMIMEInfoImpl, nsIMIMEInfo); // nsMIMEInfoImpl methods -nsMIMEInfoImpl::nsMIMEInfoImpl(const char *aMIMEType) { +nsMIMEInfoImpl::nsMIMEInfoImpl() { + NS_INIT_REFCNT(); +} + +nsMIMEInfoImpl::nsMIMEInfoImpl(const char *aMIMEType): mMIMEType( aMIMEType ) { NS_INIT_REFCNT(); - mMIMEType = getter_AddRefs(NS_NewAtom(aMIMEType)); } PRUint32 @@ -66,7 +69,7 @@ nsMIMEInfoImpl::ExtensionExists(const char *aExtension, PRBool *_retval) { if (!aExtension) return NS_ERROR_NULL_POINTER; for (PRUint8 i=0; i < extCount; i++) { - nsCString* ext = mExtensions.CStringAt(i); + nsCString* ext = (nsCString*)mExtensions.CStringAt(i); if (ext->Equals(aExtension)) { found = PR_TRUE; break; @@ -87,17 +90,29 @@ nsMIMEInfoImpl::FirstExtension(char **_retval) { return NS_OK; } +NS_IMETHODIMP nsMIMEInfoImpl::AppendExtension(const char *aExtension) +{ + mExtensions.AppendCString( aExtension ); + return NS_OK; +} + NS_IMETHODIMP nsMIMEInfoImpl::GetMIMEType(char * *aMIMEType) { if (!aMIMEType) return NS_ERROR_NULL_POINTER; - nsAutoString strMIMEType; - mMIMEType->ToString(strMIMEType); - *aMIMEType = strMIMEType.ToNewCString(); + *aMIMEType = mMIMEType.ToNewCString(); if (!*aMIMEType) return NS_ERROR_OUT_OF_MEMORY; return NS_OK; } +NS_IMETHODIMP +nsMIMEInfoImpl::SetMIMEType(const char* aMIMEType) { + if (!aMIMEType) return NS_ERROR_NULL_POINTER; + + mMIMEType = aMIMEType; + return NS_OK; +} + NS_IMETHODIMP nsMIMEInfoImpl::GetDescription(PRUnichar * *aDescription) { if (!aDescription) return NS_ERROR_NULL_POINTER; @@ -107,6 +122,12 @@ nsMIMEInfoImpl::GetDescription(PRUnichar * *aDescription) { return NS_OK; } +NS_IMETHODIMP nsMIMEInfoImpl::SetDescription(const PRUnichar * aDescription) +{ + mDescription = aDescription; + return NS_OK; +} + NS_IMETHODIMP nsMIMEInfoImpl::GetDataURI(nsIURI * *aDataURI) { return mURI->Clone(aDataURI); @@ -120,9 +141,31 @@ nsMIMEInfoImpl::Equals(nsIMIMEInfo *aMIMEInfo, PRBool *_retval) { nsresult rv = aMIMEInfo->GetMIMEType(getter_Copies(type)); if (NS_FAILED(rv)) return rv; - // STRING USE WARNING: perhaps |type1| should be an |nsCAutoString|? -- scc - nsAutoString type1; - mMIMEType->ToString(type1); - *_retval = type1.EqualsWithConversion(type); + *_retval = mMIMEType.EqualsWithConversion(type); + return NS_OK; } + +NS_IMETHODIMP nsMIMEInfoImpl::GetMacType(PRUint32 *aMacType) +{ + *aMacType = mMacType; + return NS_OK; +} + +NS_IMETHODIMP nsMIMEInfoImpl::SetMacType(PRUint32 aMacType) +{ + mMacType = aMacType; + return NS_OK; +} + +NS_IMETHODIMP nsMIMEInfoImpl::GetMacCreator(PRUint32 *aMacCreator) +{ + *aMacCreator = mMacCreator; + return NS_OK; +} + +NS_IMETHODIMP nsMIMEInfoImpl::SetMacCreator(PRUint32 aMacCreator) +{ + mMacCreator = aMacCreator; + return NS_OK; +} diff --git a/mozilla/uriloader/exthandler/nsMIMEInfoImpl.h b/mozilla/uriloader/exthandler/nsMIMEInfoImpl.h index 2cccc879a7f..85e131711ea 100644 --- a/mozilla/uriloader/exthandler/nsMIMEInfoImpl.h +++ b/mozilla/uriloader/exthandler/nsMIMEInfoImpl.h @@ -34,6 +34,7 @@ class nsMIMEInfoImpl : public nsIMIMEInfo { NS_DECL_NSIMIMEINFO // nsMIMEInfoImpl methods + nsMIMEInfoImpl(); nsMIMEInfoImpl(const char *aMIMEType); virtual ~nsMIMEInfoImpl() {}; PRUint32 GetExtCount(); // returns the number of extensions associated. @@ -42,9 +43,9 @@ class nsMIMEInfoImpl : public nsIMIMEInfo { nsCStringArray 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 - + PRUint32 mMacType, mMacCreator; // Mac file type and creator protected: - nsCOMPtr mMIMEType; + nsString mMIMEType; };