diff --git a/chrome/src/nsChromeRegistry.h b/chrome/src/nsChromeRegistry.h index d6a6bbb462d..fe695d667f2 100644 --- a/chrome/src/nsChromeRegistry.h +++ b/chrome/src/nsChromeRegistry.h @@ -62,6 +62,7 @@ #include "nsIXPConnect.h" #include "mozilla/Omnijar.h" +#include "mozilla/FileLocation.h" class nsIDOMWindow; class nsIURL; @@ -139,16 +140,9 @@ public: struct ManifestProcessingContext { - ManifestProcessingContext(NSLocationType aType, nsILocalFile* aFile) + ManifestProcessingContext(NSLocationType aType, mozilla::FileLocation &aFile) : mType(aType) , mFile(aFile) - , mPath(NULL) - { } - - ManifestProcessingContext(NSLocationType aType, nsILocalFile* aFile, const char* aPath) - : mType(aType) - , mFile(aFile) - , mPath(aPath) { } ~ManifestProcessingContext() @@ -160,8 +154,7 @@ public: already_AddRefed ResolveURI(const char* uri); NSLocationType mType; - nsILocalFile* mFile; - const char* mPath; + mozilla::FileLocation mFile; nsCOMPtr mManifestURI; nsCOMPtr mXPConnect; }; diff --git a/chrome/src/nsChromeRegistryChrome.cpp b/chrome/src/nsChromeRegistryChrome.cpp index d2ec6ee4cce..a08834f215d 100644 --- a/chrome/src/nsChromeRegistryChrome.cpp +++ b/chrome/src/nsChromeRegistryChrome.cpp @@ -788,27 +788,9 @@ nsIURI* nsChromeRegistry::ManifestProcessingContext::GetManifestURI() { if (!mManifestURI) { - nsCOMPtr io = mozilla::services::GetIOService(); - if (!io) { - NS_WARNING("No IO service trying to process chrome manifests"); - return NULL; - } - - if (mPath) { - nsCOMPtr fileURI; - io->NewFileURI(mFile, getter_AddRefs(fileURI)); - - nsCAutoString spec; - fileURI->GetSpec(spec); - spec.Insert(NS_LITERAL_CSTRING("jar:"), 0); - spec.AppendLiteral("!/"); - spec.Append(mPath); - - NS_NewURI(getter_AddRefs(mManifestURI), spec, NULL, NULL, io); - } - else { - io->NewFileURI(mFile, getter_AddRefs(mManifestURI)); - } + nsCString uri; + mFile.GetURIString(uri); + NS_NewURI(getter_AddRefs(mManifestURI), uri); } return mManifestURI; } diff --git a/js/xpconnect/loader/mozJSComponentLoader.cpp b/js/xpconnect/loader/mozJSComponentLoader.cpp index 5d8f056fede..28a47c8472b 100644 --- a/js/xpconnect/loader/mozJSComponentLoader.cpp +++ b/js/xpconnect/loader/mozJSComponentLoader.cpp @@ -98,6 +98,7 @@ #include "mozilla/FunctionTimer.h" +using namespace mozilla; using namespace mozilla::scache; static const char kJSRuntimeServiceContractID[] = "@mozilla.org/js/xpc/RuntimeService;1"; @@ -486,56 +487,21 @@ mozJSComponentLoader::ReallyInit() } const mozilla::Module* -mozJSComponentLoader::LoadModule(nsILocalFile* aComponentFile) +mozJSComponentLoader::LoadModule(FileLocation &aFile) { - nsCOMPtr uri; - nsCAutoString spec; - NS_GetURLSpecFromActualFile(aComponentFile, spec); + nsCOMPtr file = aFile.GetBaseFile(); + nsCString spec; + aFile.GetURIString(spec); + + nsCOMPtr uri; nsresult rv = NS_NewURI(getter_AddRefs(uri), spec); if (NS_FAILED(rv)) return NULL; - return LoadModuleImpl(aComponentFile, - spec, - uri); -} - -const mozilla::Module* -mozJSComponentLoader::LoadModuleFromJAR(nsILocalFile *aJarFile, - const nsACString &aComponentPath) -{ - nsresult rv; - - nsCAutoString fullSpec, fileSpec; - NS_GetURLSpecFromActualFile(aJarFile, fileSpec); - fullSpec = "jar:"; - fullSpec += fileSpec; - fullSpec += "!/"; - fullSpec += aComponentPath; - - nsCOMPtr uri; - rv = NS_NewURI(getter_AddRefs(uri), fullSpec); - if (NS_FAILED(rv)) - return NULL; - - return LoadModuleImpl(aJarFile, - fullSpec, - uri); -} - -const mozilla::Module* -mozJSComponentLoader::LoadModuleImpl(nsILocalFile* aSourceFile, - nsACString &aKey, - nsIURI* aComponentURI) -{ - nsresult rv; - #ifdef NS_FUNCTION_TIMER - nsCAutoString spec__("N/A"); - aComponentURI->GetSpec(spec__); NS_TIME_FUNCTION_FMT("%s (line %d) (file: %s)", MOZ_FUNCTION_NAME, - __LINE__, spec__.get()); + __LINE__, spec.get()); #endif if (!mInitialized) { @@ -545,14 +511,14 @@ mozJSComponentLoader::LoadModuleImpl(nsILocalFile* aSourceFile, } ModuleEntry* mod; - if (mModules.Get(aKey, &mod)) + if (mModules.Get(spec, &mod)) return mod; nsAutoPtr entry(new ModuleEntry); if (!entry) return NULL; - rv = GlobalForLocation(aSourceFile, aComponentURI, &entry->global, + rv = GlobalForLocation(file, uri, &entry->global, &entry->location, nsnull); if (NS_FAILED(rv)) { #ifdef DEBUG_shaver @@ -600,7 +566,7 @@ mozJSComponentLoader::LoadModuleImpl(nsILocalFile* aSourceFile, JSObject* file_jsobj; nsCOMPtr file_holder; - rv = xpc->WrapNative(cx, entry->global, aSourceFile, + rv = xpc->WrapNative(cx, entry->global, file, NS_GET_IID(nsIFile), getter_AddRefs(file_holder)); @@ -624,7 +590,7 @@ mozJSComponentLoader::LoadModuleImpl(nsILocalFile* aSourceFile, if (JS_TypeOfValue(cx, NSGetFactory_val) != JSTYPE_FUNCTION) { nsCAutoString spec; - aComponentURI->GetSpec(spec); + uri->GetSpec(spec); JS_ReportError(cx, "%s has NSGetFactory property that is not a function", spec.get()); return NULL; @@ -648,7 +614,7 @@ mozJSComponentLoader::LoadModuleImpl(nsILocalFile* aSourceFile, } // Cache this module for later - if (!mModules.Put(aKey, entry)) + if (!mModules.Put(spec, entry)) return NULL; // The hash owns the ModuleEntry now, forget about it diff --git a/js/xpconnect/loader/mozJSComponentLoader.h b/js/xpconnect/loader/mozJSComponentLoader.h index 3304edb8f68..ec8a46d59df 100644 --- a/js/xpconnect/loader/mozJSComponentLoader.h +++ b/js/xpconnect/loader/mozJSComponentLoader.h @@ -79,9 +79,7 @@ class mozJSComponentLoader : public mozilla::ModuleLoader, virtual ~mozJSComponentLoader(); // ModuleLoader - const mozilla::Module* LoadModule(nsILocalFile* aFile); - const mozilla::Module* LoadModuleFromJAR(nsILocalFile* aJARFile, - const nsACString& aPath); + const mozilla::Module* LoadModule(mozilla::FileLocation &aFile); protected: static mozJSComponentLoader* sSelf; @@ -89,10 +87,6 @@ class mozJSComponentLoader : public mozilla::ModuleLoader, nsresult ReallyInit(); void UnloadModules(); - const mozilla::Module* LoadModuleImpl(nsILocalFile* aSourceFile, - nsACString &aKey, - nsIURI* aComponentURI); - nsresult GlobalForLocation(nsILocalFile* aComponentFile, nsIURI *aComponent, JSObject **aGlobal, diff --git a/xpcom/components/ManifestParser.cpp b/xpcom/components/ManifestParser.cpp index 7cb46f8b576..e1c3eb49f5d 100644 --- a/xpcom/components/ManifestParser.cpp +++ b/xpcom/components/ManifestParser.cpp @@ -174,7 +174,7 @@ void LogMessage(const char* aMsg, ...) console->LogMessage(error); } -void LogMessageWithContext(nsILocalFile* aFile, const char* aPath, +void LogMessageWithContext(FileLocation &aFile, PRUint32 aLineNumber, const char* aMsg, ...) { va_list args; @@ -184,20 +184,15 @@ void LogMessageWithContext(nsILocalFile* aFile, const char* aPath, if (!formatted) return; - nsString file; - aFile->GetPath(file); - if (aPath) { - file.Append(':'); - file.Append(NS_ConvertUTF8toUTF16(aPath)); - } + nsCString file; + aFile.GetURIString(file); nsCOMPtr error = do_CreateInstance(NS_SCRIPTERROR_CONTRACTID); if (!error) { // This can happen early in component registration. Fall back to a // generic console message. - LogMessage("Warning: in file '%s', line %i: %s", - NS_ConvertUTF16toUTF8(file).get(), + LogMessage("Warning: in '%s', line %i: %s", file.get(), aLineNumber, (char*) formatted); return; } @@ -208,7 +203,7 @@ void LogMessageWithContext(nsILocalFile* aFile, const char* aPath, return; nsresult rv = error->Init(NS_ConvertUTF8toUTF16(formatted).get(), - file.get(), NULL, + NS_ConvertUTF8toUTF16(file).get(), NULL, aLineNumber, 0, nsIScriptError::warningFlag, "chrome registration"); if (NS_FAILED(rv)) @@ -423,12 +418,12 @@ struct CachedDirective } // anonymous namespace -static void -ParseManifestCommon(NSLocationType aType, nsILocalFile* aFile, - nsComponentManagerImpl::ManifestProcessingContext& mgrcx, - nsChromeRegistry::ManifestProcessingContext& chromecx, - const char* aPath, char* buf, bool aChromeOnly) + +void +ParseManifest(NSLocationType type, FileLocation &file, char* buf, bool aChromeOnly) { + nsComponentManagerImpl::ManifestProcessingContext mgrcx(type, file, aChromeOnly); + nsChromeRegistry::ManifestProcessingContext chromecx(type, file); nsresult rv; NS_NAMED_LITERAL_STRING(kPlatform, "platform"); @@ -553,21 +548,21 @@ ParseManifestCommon(NSLocationType aType, nsILocalFile* aFile, } if (!directive) { - LogMessageWithContext(aFile, aPath, line, + LogMessageWithContext(file, line, "Ignoring unrecognized chrome manifest directive '%s'.", token); continue; } - if (!directive->allowbootstrap && NS_BOOTSTRAPPED_LOCATION == aType) { - LogMessageWithContext(aFile, aPath, line, + if (!directive->allowbootstrap && NS_BOOTSTRAPPED_LOCATION == type) { + LogMessageWithContext(file, line, "Bootstrapped manifest not allowed to use '%s' directive.", token); continue; } - if (directive->componentonly && NS_SKIN_LOCATION == aType) { - LogMessageWithContext(aFile, aPath, line, + if (directive->componentonly && NS_SKIN_LOCATION == type) { + LogMessageWithContext(file, line, "Skin manifest not allowed to use '%s' directive.", token); continue; @@ -579,7 +574,7 @@ ParseManifestCommon(NSLocationType aType, nsILocalFile* aFile, argv[i] = nsCRT::strtok(whitespace, kWhitespace, &whitespace); if (!argv[directive->argc - 1]) { - LogMessageWithContext(aFile, aPath, line, + LogMessageWithContext(file, line, "Not enough arguments for chrome manifest directive '%s', expected %i.", token, directive->argc); continue; @@ -614,13 +609,13 @@ ParseManifestCommon(NSLocationType aType, nsILocalFile* aFile, bool xpcNativeWrappers = true; // Dummy for CheckFlag. if (CheckFlag(kXPCNativeWrappers, wtoken, xpcNativeWrappers)) { - LogMessageWithContext(aFile, aPath, line, + LogMessageWithContext(file, line, "Warning: Ignoring obsolete chrome registration modifier '%s'.", token); continue; } - LogMessageWithContext(aFile, aPath, line, + LogMessageWithContext(file, line, "Unrecognized chrome manifest modifier '%s'.", token); ok = false; @@ -643,7 +638,7 @@ ParseManifestCommon(NSLocationType aType, nsILocalFile* aFile, nsCOMPtr cr = mozilla::services::GetChromeRegistryService(); if (!nsChromeRegistry::gChromeRegistry) { - LogMessageWithContext(aFile, aPath, line, + LogMessageWithContext(file, line, "Chrome registry isn't available yet."); continue; } @@ -671,22 +666,3 @@ ParseManifestCommon(NSLocationType aType, nsILocalFile* aFile, (mgrcx, d.lineno, d.argv); } } - -void -ParseManifest(NSLocationType type, nsILocalFile* file, - char* buf, bool aChromeOnly) -{ - nsComponentManagerImpl::ManifestProcessingContext mgrcx(type, file, aChromeOnly); - nsChromeRegistry::ManifestProcessingContext chromecx(type, file); - ParseManifestCommon(type, file, mgrcx, chromecx, NULL, buf, aChromeOnly); -} - -void -ParseManifest(NSLocationType type, nsIZipReader* reader, const char* jarPath, - char* buf, bool aChromeOnly) -{ - nsComponentManagerImpl::ManifestProcessingContext mgrcx(type, reader, jarPath, aChromeOnly); - nsChromeRegistry::ManifestProcessingContext chromecx(type, mgrcx.mFile, jarPath); - ParseManifestCommon(type, mgrcx.mFile, mgrcx, chromecx, jarPath, - buf, aChromeOnly); -} diff --git a/xpcom/components/ManifestParser.h b/xpcom/components/ManifestParser.h index 58cfab1f28d..8f32c4020e2 100644 --- a/xpcom/components/ManifestParser.h +++ b/xpcom/components/ManifestParser.h @@ -40,19 +40,16 @@ #include "nsComponentManager.h" #include "nsChromeRegistry.h" +#include "mozilla/FileLocation.h" class nsILocalFile; -class nsIZipReader; -void ParseManifest(NSLocationType type, nsILocalFile* file, +void ParseManifest(NSLocationType type, mozilla::FileLocation &file, char* buf, bool aChromeOnly); -void ParseManifest(NSLocationType type, nsIZipReader* reader, - const char* jarPath, char* buf, bool aChromeOnly); - void LogMessage(const char* aMsg, ...); -void LogMessageWithContext(nsILocalFile* aFile, const char* aPath, +void LogMessageWithContext(mozilla::FileLocation &aFile, PRUint32 aLineNumber, const char* aMsg, ...); #endif // ManifestParser_h diff --git a/xpcom/components/ModuleLoader.h b/xpcom/components/ModuleLoader.h index 0661b63f5e0..7dd8526f590 100644 --- a/xpcom/components/ModuleLoader.h +++ b/xpcom/components/ModuleLoader.h @@ -41,6 +41,7 @@ #include "nsISupports.h" #include "mozilla/Module.h" +#include "mozilla/FileLocation.h" #define MOZILLA_MODULELOADER_PSEUDO_IID \ { 0xD951A8CE, 0x6E9F, 0x464F, \ @@ -66,13 +67,7 @@ public: * to be loaded multiple times. The Module object should either be * statically or permanently allocated; it will not be freed. */ - virtual const Module* LoadModule(nsILocalFile* aFile) = 0; - - /** - * Return the module for a file located within a JAR. - */ - virtual const Module* LoadModuleFromJAR(nsILocalFile* aJARFile, - const nsACString& aPath) = 0; + virtual const Module* LoadModule(mozilla::FileLocation &aFile) = 0; }; NS_DEFINE_STATIC_IID_ACCESSOR(ModuleLoader, MOZILLA_MODULELOADER_PSEUDO_IID) diff --git a/xpcom/components/nsComponentManager.cpp b/xpcom/components/nsComponentManager.cpp index 956b66b814c..3cbf4c05018 100644 --- a/xpcom/components/nsComponentManager.cpp +++ b/xpcom/components/nsComponentManager.cpp @@ -99,13 +99,10 @@ #include "nsArrayEnumerator.h" #include "nsStringEnumerator.h" #include "mozilla/FileUtils.h" -#include "nsURLHelper.h" #include NEW_H // for placement new #include "mozilla/Omnijar.h" -#include "nsJAR.h" -static NS_DEFINE_CID(kZipReaderCID, NS_ZIPREADER_CID); #include "prlog.h" @@ -357,17 +354,17 @@ nsresult nsComponentManagerImpl::Init() InitializeModuleLocations(); ComponentLocation* cl = sModuleLocations->InsertElementAt(0); + nsCOMPtr lf = CloneAndAppend(appDir, NS_LITERAL_CSTRING("chrome.manifest")); cl->type = NS_COMPONENT_LOCATION; - cl->location = CloneAndAppend(appDir, NS_LITERAL_CSTRING("chrome.manifest")); - cl->jar = false; + cl->location.Init(lf); bool equals = false; appDir->Equals(greDir, &equals); if (!equals) { cl = sModuleLocations->InsertElementAt(0); cl->type = NS_COMPONENT_LOCATION; - cl->location = CloneAndAppend(greDir, NS_LITERAL_CSTRING("chrome.manifest")); - cl->jar = false; + lf = CloneAndAppend(greDir, NS_LITERAL_CSTRING("chrome.manifest")); + cl->location.Init(lf); } PR_LOG(nsComponentManagerLog, PR_LOG_DEBUG, @@ -385,19 +382,17 @@ nsresult nsComponentManagerImpl::Init() for (PRUint32 i = 0; i < sStaticModules->Length(); ++i) RegisterModule((*sStaticModules)[i], NULL); - nsCOMPtr appOmnijar = mozilla::Omnijar::GetPath(mozilla::Omnijar::APP); + nsRefPtr appOmnijar = mozilla::Omnijar::GetReader(mozilla::Omnijar::APP); if (appOmnijar) { cl = sModuleLocations->InsertElementAt(1); // Insert after greDir cl->type = NS_COMPONENT_LOCATION; - cl->location = do_QueryInterface(appOmnijar); - cl->jar = true; + cl->location.Init(appOmnijar, "chrome.manifest"); } - nsCOMPtr greOmnijar = mozilla::Omnijar::GetPath(mozilla::Omnijar::GRE); + nsRefPtr greOmnijar = mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE); if (greOmnijar) { cl = sModuleLocations->InsertElementAt(0); cl->type = NS_COMPONENT_LOCATION; - cl->location = do_QueryInterface(greOmnijar); - cl->jar = true; + cl->location.Init(greOmnijar, "chrome.manifest"); } RereadChromeManifests(false); @@ -411,25 +406,23 @@ nsresult nsComponentManagerImpl::Init() void nsComponentManagerImpl::RegisterModule(const mozilla::Module* aModule, - nsILocalFile* aFile) + FileLocation* aFile) { ReentrantMonitorAutoEnter mon(mMon); - KnownModule* m = new KnownModule(aModule, aFile); + KnownModule* m; if (aFile) { - nsCAutoString uri; - nsresult rv = net_GetURLSpecFromActualFile(aFile, uri); - if (NS_FAILED(rv)) { - NS_WARNING("net_GetURLSpecFromActualFile failed"); - return; - } + nsCString uri; + aFile->GetURIString(uri); NS_ASSERTION(!mKnownModules.Get(uri), "Must not register a binary module twice."); + m = new KnownModule(aModule, *aFile); mKnownModules.Put(uri, m); - } - else + } else { + m = new KnownModule(aModule); mKnownStaticModules.AppendElement(m); + } if (aModule->mCIDs) { const mozilla::Module::CIDEntry* entry; @@ -516,242 +509,91 @@ CutExtension(nsCString& path) path.Cut(0, dotPos + 1); } -static nsCString -GetExtension(nsILocalFile* file) -{ - nsCString extension; - file->GetNativePath(extension); - CutExtension(extension); - return extension; -} - -static already_AddRefed -LoadEntry(nsIZipReader* aReader, const char* aName) -{ - if (!aReader) - return NULL; - - nsCOMPtr is; - nsresult rv = aReader->GetInputStream(nsDependentCString(aName), getter_AddRefs(is)); - if (NS_FAILED(rv)) - return NULL; - - return is.forget(); -} - void -nsComponentManagerImpl::RegisterJarManifest(NSLocationType aType, nsIZipReader* aReader, - const char* aPath, bool aChromeOnly) +nsComponentManagerImpl::RegisterManifest(NSLocationType aType, + FileLocation &aFile, + bool aChromeOnly) { - nsCOMPtr is = LoadEntry(aReader, aPath); - if (!is) { - if (NS_BOOTSTRAPPED_LOCATION != aType) - LogMessage("Could not find jar manifest entry '%s'.", aPath); - return; + PRUint32 len; + FileLocation::Data data; + nsAutoArrayPtr buf; + nsresult rv = aFile.GetData(data); + if (NS_SUCCEEDED(rv)) { + rv = data.GetSize(&len); } - - PRUint32 flen; - is->Available(&flen); - - nsAutoArrayPtr whole(new char[flen + 1]); - if (!whole) - return; - - for (PRUint32 totalRead = 0; totalRead < flen; ) { - PRUint32 avail; - PRUint32 read; - - if (NS_FAILED(is->Available(&avail))) - return; - - if (avail > flen) - return; - - if (NS_FAILED(is->Read(whole + totalRead, avail, &read))) - return; - - totalRead += read; + if (NS_SUCCEEDED(rv)) { + buf = new char[len + 1]; + rv = data.Copy(buf, len); } - - whole[flen] = '\0'; - - ParseManifest(aType, aReader, aPath, - whole, aChromeOnly); -} - -void -nsComponentManagerImpl::RegisterManifestFile(NSLocationType aType, - nsILocalFile* aFile, - bool aChromeOnly) -{ - nsresult rv; - - mozilla::AutoFDClose fd; - rv = aFile->OpenNSPRFileDesc(PR_RDONLY, 0444, &fd); - if (NS_FAILED(rv)) { - nsCAutoString path; - aFile->GetNativePath(path); - if (NS_BOOTSTRAPPED_LOCATION != aType) - LogMessage("Could not read chrome manifest file '%s'.", path.get()); - return; + if (NS_SUCCEEDED(rv)) { + buf[len] = '\0'; + ParseManifest(aType, aFile, buf, aChromeOnly); + } else if (NS_BOOTSTRAPPED_LOCATION != aType) { + nsCString uri; + aFile.GetURIString(uri); + LogMessage("Could not read chrome manifest '%s'.", uri.get()); } - - PRFileInfo64 fileInfo; - if (PR_SUCCESS != PR_GetOpenFileInfo64(fd, &fileInfo)) - return; - - if (fileInfo.size > PRInt64(PR_INT32_MAX)) - return; - - nsAutoArrayPtr data(new char[PRInt32(fileInfo.size + 1)]); - - for (PRInt32 totalRead = 0; totalRead < fileInfo.size; ) { - PRInt32 read = PR_Read(fd, data + totalRead, PRInt32(fileInfo.size)); - if (read < 0) - return; - totalRead += read; - } - - data[fileInfo.size] = '\0'; - ParseManifest(aType, aFile, data, aChromeOnly); -} - -#if defined(XP_WIN) || defined(XP_OS2) -#define TRANSLATE_SLASHES -static void -TranslateSlashes(char* path) -{ - for (; *path; ++path) { - if ('/' == *path) - *path = '\\'; - } -} -#endif - -static void -AppendFileToManifestPath(nsCString& path, - const char* file) -{ - PRInt32 i = path.RFindChar('/'); - if (kNotFound == i) - path.Truncate(0); - else - path.Truncate(i + 1); - - path.Append(file); } void nsComponentManagerImpl::ManifestManifest(ManifestProcessingContext& cx, int lineno, char *const * argv) { char* file = argv[0]; - - if (cx.mPath) { - nsCAutoString manifest(cx.mPath); - AppendFileToManifestPath(manifest, file); - - RegisterJarManifest(cx.mType, cx.mReader, manifest.get(), cx.mChromeOnly); - } - else { -#ifdef TRANSLATE_SLASHES - TranslateSlashes(file); -#endif - nsCOMPtr cfile; - cx.mFile->GetParent(getter_AddRefs(cfile)); - nsCOMPtr clfile = do_QueryInterface(cfile); - - nsresult rv = clfile->AppendRelativeNativePath(nsDependentCString(file)); - if (NS_FAILED(rv)) { - NS_WARNING("Couldn't append relative path?"); - return; - } - - RegisterManifestFile(cx.mType, clfile, cx.mChromeOnly); - } + FileLocation f(cx.mFile, file); + RegisterManifest(cx.mType, f, cx.mChromeOnly); } void nsComponentManagerImpl::ManifestBinaryComponent(ManifestProcessingContext& cx, int lineno, char *const * argv) { - if (cx.mPath) { + if (cx.mFile.IsZip()) { NS_WARNING("Cannot load binary components from a jar."); - LogMessageWithContext(cx.mFile, cx.mPath, lineno, + LogMessageWithContext(cx.mFile, lineno, "Cannot load binary components from a jar."); return; } - char* file = argv[0]; + FileLocation f(cx.mFile, argv[0]); + nsCString uri; + f.GetURIString(uri); -#ifdef TRANSLATE_SLASHES - TranslateSlashes(file); -#endif - - nsCOMPtr cfile; - cx.mFile->GetParent(getter_AddRefs(cfile)); - nsCOMPtr clfile = do_QueryInterface(cfile); - - nsresult rv = clfile->AppendRelativeNativePath(nsDependentCString(file)); - if (NS_FAILED(rv)) { - NS_WARNING("Couldn't append relative path?"); - return; - } - - nsCAutoString uri; - rv = net_GetURLSpecFromActualFile(clfile, uri); - if (NS_FAILED(rv)) { - NS_WARNING("net_GetURLSpecFromActualFile failed"); - return; - } if (mKnownModules.Get(uri)) { NS_WARNING("Attempting to register a binary component twice."); - LogMessageWithContext(cx.mFile, cx.mPath, lineno, + LogMessageWithContext(cx.mFile, lineno, "Attempting to register a binary component twice."); return; } - const mozilla::Module* m = mNativeModuleLoader.LoadModule(clfile); + const mozilla::Module* m = mNativeModuleLoader.LoadModule(f); // The native module loader should report an error here, we don't have to if (!m) return; - RegisterModule(m, clfile); + RegisterModule(m, &f); } void nsComponentManagerImpl::ManifestXPT(ManifestProcessingContext& cx, int lineno, char *const * argv) { - char* file = argv[0]; - - if (cx.mPath) { - nsCAutoString manifest(cx.mPath); - AppendFileToManifestPath(manifest, file); - - nsCOMPtr stream = - LoadEntry(cx.mReader, manifest.get()); - if (!stream) { - NS_WARNING("Failed to load XPT file in a jar."); - return; - } - - xptiInterfaceInfoManager::GetSingleton() - ->RegisterInputStream(stream); + FileLocation f(cx.mFile, argv[0]); + PRUint32 len; + FileLocation::Data data; + nsAutoArrayPtr buf; + nsresult rv = f.GetData(data); + if (NS_SUCCEEDED(rv)) { + rv = data.GetSize(&len); } - else { -#ifdef TRANSLATE_SLASHES - TranslateSlashes(file); -#endif - nsCOMPtr cfile; - cx.mFile->GetParent(getter_AddRefs(cfile)); - nsCOMPtr clfile = do_QueryInterface(cfile); - - nsresult rv = clfile->AppendRelativeNativePath(nsDependentCString(file)); - if (NS_FAILED(rv)) { - NS_WARNING("Couldn't append relative path?"); - return; - } - + if (NS_SUCCEEDED(rv)) { + buf = new char[len]; + rv = data.Copy(buf, len); + } + if (NS_SUCCEEDED(rv)) { xptiInterfaceInfoManager::GetSingleton() - ->RegisterFile(clfile); + ->RegisterBuffer(buf, len); + } else { + nsCString uri; + f.GetURIString(uri); + LogMessage("Could not read '%s'.", uri.get()); } } @@ -763,7 +605,7 @@ nsComponentManagerImpl::ManifestComponent(ManifestProcessingContext& cx, int lin nsID cid; if (!cid.Parse(id)) { - LogMessageWithContext(cx.mFile, cx.mPath, lineno, + LogMessageWithContext(cx.mFile, lineno, "Malformed CID: '%s'.", id); return; } @@ -780,7 +622,7 @@ nsComponentManagerImpl::ManifestComponent(ManifestProcessingContext& cx, int lin else existing = ""; - LogMessageWithContext(cx.mFile, cx.mPath, lineno, + LogMessageWithContext(cx.mFile, lineno, "Trying to re-register CID '%s' already registered by %s.", idstr, existing.get()); @@ -788,52 +630,14 @@ nsComponentManagerImpl::ManifestComponent(ManifestProcessingContext& cx, int lin } KnownModule* km; + FileLocation fl(cx.mFile, file); - if (cx.mPath) { - nsCAutoString manifest(cx.mPath); - AppendFileToManifestPath(manifest, file); - - nsCAutoString hash; - nsresult rv = net_GetURLSpecFromActualFile(cx.mFile, hash); - if (NS_FAILED(rv)) { - NS_WARNING("net_GetURLSpecFromActualFile failed"); - return; - } - hash.Insert("jar:", 0); - hash.Append("!/"); - hash.Append(manifest); - - km = mKnownModules.Get(hash); - if (!km) { - km = new KnownModule(cx.mFile, manifest); - mKnownModules.Put(hash, km); - } - } - else { -#ifdef TRANSLATE_SLASHES - TranslateSlashes(file); -#endif - nsCOMPtr cfile; - cx.mFile->GetParent(getter_AddRefs(cfile)); - nsCOMPtr clfile = do_QueryInterface(cfile); - - nsresult rv = clfile->AppendRelativeNativePath(nsDependentCString(file)); - if (NS_FAILED(rv)) { - NS_WARNING("Couldn't append relative path?"); - return; - } - nsCAutoString hash; - rv = net_GetURLSpecFromActualFile(clfile, hash); - if (NS_FAILED(rv)) { - NS_WARNING("net_GetURLSpecFromActualFile failed"); - return; - } - - km = mKnownModules.Get(hash); - if (!km) { - km = new KnownModule(clfile); - mKnownModules.Put(hash, km); - } + nsCString hash; + fl.GetURIString(hash); + km = mKnownModules.Get(hash); + if (!km) { + km = new KnownModule(fl); + mKnownModules.Put(hash, km); } void* place; @@ -858,7 +662,7 @@ nsComponentManagerImpl::ManifestContract(ManifestProcessingContext& cx, int line nsID cid; if (!cid.Parse(id)) { - LogMessageWithContext(cx.mFile, cx.mPath, lineno, + LogMessageWithContext(cx.mFile, lineno, "Malformed CID: '%s'.", id); return; } @@ -866,7 +670,7 @@ nsComponentManagerImpl::ManifestContract(ManifestProcessingContext& cx, int line ReentrantMonitorAutoEnter mon(mMon); nsFactoryEntry* f = mFactories.Get(cid); if (!f) { - LogMessageWithContext(cx.mFile, cx.mPath, lineno, + LogMessageWithContext(cx.mFile, lineno, "Could not map contract ID '%s' to CID %s because no implementation of the CID is registered.", contract, id); return; @@ -891,17 +695,7 @@ nsComponentManagerImpl::RereadChromeManifests(bool aChromeOnly) { for (PRUint32 i = 0; i < sModuleLocations->Length(); ++i) { ComponentLocation& l = sModuleLocations->ElementAt(i); - if (!l.jar) { - RegisterManifestFile(l.type, l.location, aChromeOnly); - continue; - } - - nsresult rv; - nsCOMPtr reader = do_CreateInstance(kZipReaderCID, &rv); - if (NS_SUCCEEDED(rv)) - rv = reader->Open(l.location); - if (NS_SUCCEEDED(rv)) - RegisterJarManifest(l.type, reader, "chrome.manifest", aChromeOnly); + RegisterManifest(l.type, l.location, aChromeOnly); } } @@ -910,14 +704,8 @@ nsComponentManagerImpl::KnownModule::EnsureLoader() { if (!mLoader) { nsCString extension; - if (!mPath.IsEmpty()) { - extension = mPath; - CutExtension(extension); - } - else { - extension = GetExtension(mFile); - } - + mFile.GetURIString(extension); + CutExtension(extension); mLoader = nsComponentManagerImpl::gComponentManager->LoaderForExtension(extension); } return !!mLoader; @@ -932,10 +720,7 @@ nsComponentManagerImpl::KnownModule::Load() if (!EnsureLoader()) return false; - if (!mPath.IsEmpty()) - mModule = mLoader->LoadModuleFromJAR(mFile, mPath); - else - mModule = mLoader->LoadModule(mFile); + mModule = mLoader->LoadModule(mFile); if (!mModule) { mFailed = true; @@ -959,14 +744,8 @@ nsCString nsComponentManagerImpl::KnownModule::Description() const { nsCString s; - if (!mPath.IsEmpty()) { - mFile->GetNativePath(s); - s.Insert(NS_LITERAL_CSTRING("jar:"), 0); - s.AppendLiteral("!/"); - s.Append(mPath); - } - else if (mFile) - mFile->GetNativePath(s); + if (mFile) + mFile.GetURIString(s); else s = ""; return s; @@ -2050,25 +1829,21 @@ nsComponentManagerImpl::RemoveBootstrappedManifestLocation(nsILocalFile* aLocati if (!cr) return NS_ERROR_FAILURE; - bool isJar = false; nsCOMPtr manifest; nsString path; nsresult rv = aLocation->GetPath(path); if (NS_FAILED(rv)) return rv; - if (Substring(path, path.Length() - 4).Equals(NS_LITERAL_STRING(".xpi"))) { - isJar = true; - manifest = aLocation; - } else { - manifest = CloneAndAppend(aLocation, NS_LITERAL_CSTRING("chrome.manifest")); - } + nsComponentManagerImpl::ComponentLocation elem; + elem.type = NS_BOOTSTRAPPED_LOCATION; - nsComponentManagerImpl::ComponentLocation elem = { - NS_BOOTSTRAPPED_LOCATION, - manifest, - isJar - }; + if (Substring(path, path.Length() - 4).Equals(NS_LITERAL_STRING(".xpi"))) { + elem.location.Init(aLocation, "chrome.manifest"); + } else { + nsCOMPtr lf = CloneAndAppend(aLocation, NS_LITERAL_CSTRING("chrome.manifest")); + elem.location.Init(lf); + } // Remove reference. nsComponentManagerImpl::sModuleLocations->RemoveElement(elem, ComponentLocationComparator()); @@ -2084,12 +1859,11 @@ XRE_AddManifestLocation(NSLocationType aType, nsILocalFile* aLocation) nsComponentManagerImpl::ComponentLocation* c = nsComponentManagerImpl::sModuleLocations->AppendElement(); c->type = aType; - c->location = aLocation; - c->jar = false; + c->location.Init(aLocation); if (nsComponentManagerImpl::gComponentManager && nsComponentManagerImpl::NORMAL == nsComponentManagerImpl::gComponentManager->mStatus) - nsComponentManagerImpl::gComponentManager->RegisterManifestFile(aType, aLocation, false); + nsComponentManagerImpl::gComponentManager->RegisterManifest(aType, c->location, false); return NS_OK; } @@ -2100,21 +1874,13 @@ XRE_AddJarManifestLocation(NSLocationType aType, nsILocalFile* aLocation) nsComponentManagerImpl::InitializeModuleLocations(); nsComponentManagerImpl::ComponentLocation* c = nsComponentManagerImpl::sModuleLocations->AppendElement(); + c->type = aType; - c->location = aLocation; - c->jar = true; + c->location.Init(aLocation, "chrome.manifest"); - if (!nsComponentManagerImpl::gComponentManager || - nsComponentManagerImpl::NORMAL != nsComponentManagerImpl::gComponentManager->mStatus) - return NS_OK; - - nsresult rv; - nsCOMPtr reader = do_CreateInstance(kZipReaderCID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - rv = reader->Open(c->location); - if (NS_SUCCEEDED(rv)) - nsComponentManagerImpl::gComponentManager->RegisterJarManifest(aType, reader, "chrome.manifest", false); + if (nsComponentManagerImpl::gComponentManager && + nsComponentManagerImpl::NORMAL == nsComponentManagerImpl::gComponentManager->mStatus) + nsComponentManagerImpl::gComponentManager->RegisterManifest(aType, c->location, false); return NS_OK; } diff --git a/xpcom/components/nsComponentManager.h b/xpcom/components/nsComponentManager.h index 5689c0c18cd..1cbed21204f 100644 --- a/xpcom/components/nsComponentManager.h +++ b/xpcom/components/nsComponentManager.h @@ -67,7 +67,6 @@ #include "nsTArray.h" #include "mozilla/Omnijar.h" -#include "nsIZipReader.h" struct nsFactoryEntry; class nsIServiceManager; @@ -158,8 +157,7 @@ public: struct ComponentLocation { NSLocationType type; - nsCOMPtr location; - bool jar; + mozilla::FileLocation location; }; class ComponentLocationComparator @@ -167,14 +165,7 @@ public: public: bool Equals(const ComponentLocation& a, const ComponentLocation& b) const { - if (a.type == b.type && a.jar == b.jar) { - bool res; - nsresult rv = a.location->Equals(b.location, &res); - NS_ASSERTION(NS_SUCCEEDED(rv), "Error comparing locations"); - return res; - } - - return false; + return (a.type == b.type && a.location.Equals(b.location)); } }; @@ -189,25 +180,22 @@ public: /** * Static or binary module. */ - KnownModule(const mozilla::Module* aModule, nsILocalFile* aFile) + KnownModule(const mozilla::Module* aModule, mozilla::FileLocation &aFile) : mModule(aModule) , mFile(aFile) , mLoaded(false) , mFailed(false) { } - KnownModule(nsILocalFile* aFile) - : mModule(NULL) - , mFile(aFile) - , mLoader(NULL) + KnownModule(const mozilla::Module* aModule) + : mModule(aModule) , mLoaded(false) , mFailed(false) { } - KnownModule(nsILocalFile* aFile, const nsACString& aPath) + KnownModule(mozilla::FileLocation &aFile) : mModule(NULL) , mFile(aFile) - , mPath(aPath) , mLoader(NULL) , mLoaded(false) , mFailed(false) @@ -235,8 +223,7 @@ public: private: const mozilla::Module* mModule; - nsCOMPtr mFile; - nsCString mPath; + mozilla::FileLocation mFile; nsCOMPtr mLoader; bool mLoaded; bool mFailed; @@ -249,44 +236,26 @@ public: nsClassHashtable mKnownModules; void RegisterModule(const mozilla::Module* aModule, - nsILocalFile* aFile); + mozilla::FileLocation* aFile); void RegisterCIDEntry(const mozilla::Module::CIDEntry* aEntry, KnownModule* aModule); void RegisterContractID(const mozilla::Module::ContractIDEntry* aEntry); - void RegisterJarManifest(NSLocationType aType, nsIZipReader* aReader, - const char* aPath, bool aChromeOnly); - - void RegisterManifestFile(NSLocationType aType, nsILocalFile* aFile, - bool aChromeOnly); + void RegisterManifest(NSLocationType aType, mozilla::FileLocation &aFile, + bool aChromeOnly); struct ManifestProcessingContext { - ManifestProcessingContext(NSLocationType aType, nsILocalFile* aFile, bool aChromeOnly) + ManifestProcessingContext(NSLocationType aType, mozilla::FileLocation &aFile, bool aChromeOnly) : mType(aType) , mFile(aFile) - , mPath(NULL) , mChromeOnly(aChromeOnly) { } - ManifestProcessingContext(NSLocationType aType, nsIZipReader* aReader, const char* aPath, bool aChromeOnly) - : mType(aType) - , mReader(aReader) - , mPath(aPath) - , mChromeOnly(aChromeOnly) - { - nsCOMPtr file; - aReader->GetFile(getter_AddRefs(file)); - nsCOMPtr localfile = do_QueryInterface(file); - mFile = localfile; - } - ~ManifestProcessingContext() { } NSLocationType mType; - nsILocalFile* mFile; - nsIZipReader* mReader; - const char* mPath; + mozilla::FileLocation mFile; bool mChromeOnly; }; diff --git a/xpcom/components/nsNativeComponentLoader.cpp b/xpcom/components/nsNativeComponentLoader.cpp index e0d9a9bcd6c..bcda4e5bb58 100644 --- a/xpcom/components/nsNativeComponentLoader.cpp +++ b/xpcom/components/nsNativeComponentLoader.cpp @@ -83,6 +83,8 @@ #define IMPLEMENT_BREAK_AFTER_LOAD #endif +using namespace mozilla; + static PRLogModuleInfo *nsNativeModuleLoaderLog = PR_NewLogModule("nsNativeModuleLoader"); @@ -110,7 +112,7 @@ class LoadModuleMainThreadRunnable : public nsRunnable { public: LoadModuleMainThreadRunnable(nsNativeModuleLoader* loader, - nsILocalFile* file) + FileLocation &file) : mLoader(loader) , mFile(file) , mResult(NULL) @@ -123,13 +125,18 @@ public: } nsRefPtr mLoader; - nsCOMPtr mFile; + FileLocation mFile; const mozilla::Module* mResult; }; const mozilla::Module* -nsNativeModuleLoader::LoadModule(nsILocalFile* aFile) +nsNativeModuleLoader::LoadModule(FileLocation &aFile) { + if (aFile.IsZip()) { + NS_ERROR("Binary components cannot be loaded from JARs"); + return NULL; + } + nsCOMPtr file = aFile.GetBaseFile(); nsresult rv; if (!NS_IsMainThread()) { @@ -140,14 +147,14 @@ nsNativeModuleLoader::LoadModule(nsILocalFile* aFile) return r->mResult; } - nsCOMPtr hashedFile(do_QueryInterface(aFile)); + nsCOMPtr hashedFile(do_QueryInterface(file)); if (!hashedFile) { NS_ERROR("nsIFile is not nsIHashable"); return NULL; } nsCAutoString filePath; - aFile->GetNativePath(filePath); + file->GetNativePath(filePath); NativeLoadData data; @@ -161,7 +168,7 @@ nsNativeModuleLoader::LoadModule(nsILocalFile* aFile) // We haven't loaded this module before - rv = aFile->Load(&data.library); + rv = file->Load(&data.library); if (NS_FAILED(rv)) { char errorMsg[1024] = ""; @@ -177,7 +184,7 @@ nsNativeModuleLoader::LoadModule(nsILocalFile* aFile) #ifdef IMPLEMENT_BREAK_AFTER_LOAD nsCAutoString leafName; - aFile->GetNativeLeafName(leafName); + file->GetNativeLeafName(leafName); char *env = getenv("XPCOM_BREAK_ON_LOAD"); char *blist; @@ -214,13 +221,6 @@ nsNativeModuleLoader::LoadModule(nsILocalFile* aFile) return data.module; } -const mozilla::Module* -nsNativeModuleLoader::LoadModuleFromJAR(nsILocalFile* aJARFile, const nsACString &aPath) -{ - NS_ERROR("Binary components cannot be loaded from JARs"); - return NULL; -} - PLDHashOperator nsNativeModuleLoader::ReleaserFunc(nsIHashable* aHashedFile, NativeLoadData& aLoadData, void*) diff --git a/xpcom/components/nsNativeComponentLoader.h b/xpcom/components/nsNativeComponentLoader.h index 0c14cbd0d59..ba378008988 100644 --- a/xpcom/components/nsNativeComponentLoader.h +++ b/xpcom/components/nsNativeComponentLoader.h @@ -53,9 +53,7 @@ class nsNativeModuleLoader : public mozilla::ModuleLoader nsNativeModuleLoader() {} ~nsNativeModuleLoader() {} - NS_OVERRIDE virtual const mozilla::Module* LoadModule(nsILocalFile* aFile); - NS_OVERRIDE virtual const mozilla::Module* LoadModuleFromJAR(nsILocalFile* aJARFile, - const nsACString& aPath); + NS_OVERRIDE virtual const mozilla::Module* LoadModule(mozilla::FileLocation &aFile); nsresult Init(); diff --git a/xpcom/reflect/xptinfo/src/xptiInterfaceInfoManager.cpp b/xpcom/reflect/xptinfo/src/xptiInterfaceInfoManager.cpp index d1a210ed90e..f22568646c0 100644 --- a/xpcom/reflect/xptinfo/src/xptiInterfaceInfoManager.cpp +++ b/xpcom/reflect/xptinfo/src/xptiInterfaceInfoManager.cpp @@ -97,106 +97,25 @@ xptiInterfaceInfoManager::~xptiInterfaceInfoManager() #endif } -XPTHeader* -xptiInterfaceInfoManager::ReadXPTFile(nsILocalFile* aFile) -{ - mozilla::AutoFDClose fd; - if (NS_FAILED(aFile->OpenNSPRFileDesc(PR_RDONLY, 0444, &fd)) || !fd) - return NULL; - - PRFileInfo64 fileInfo; - if (PR_SUCCESS != PR_GetOpenFileInfo64(fd, &fileInfo)) - return NULL; - - if (fileInfo.size > PRInt64(PR_INT32_MAX)) - return NULL; - - nsAutoArrayPtr whole(new char[PRInt32(fileInfo.size)]); - if (!whole) - return nsnull; - - for (PRInt32 totalRead = 0; totalRead < fileInfo.size; ) { - PRInt32 read = PR_Read(fd, whole + totalRead, PRInt32(fileInfo.size)); - if (read < 0) - return NULL; - totalRead += read; - } - - XPTState* state = XPT_NewXDRState(XPT_DECODE, whole, - PRInt32(fileInfo.size)); - - XPTCursor cursor; - if (!XPT_MakeCursor(state, XPT_HEADER, 0, &cursor)) { - XPT_DestroyXDRState(state); - return NULL; - } - - XPTHeader *header = nsnull; - if (!XPT_DoHeader(gXPTIStructArena, &cursor, &header)) { - XPT_DestroyXDRState(state); - return NULL; - } - - XPT_DestroyXDRState(state); - - return header; -} - -XPTHeader* -xptiInterfaceInfoManager::ReadXPTFileFromInputStream(nsIInputStream *stream) -{ - PRUint32 flen; - stream->Available(&flen); - - nsAutoArrayPtr whole(new char[flen]); - if (!whole) - return nsnull; - - for (PRUint32 totalRead = 0; totalRead < flen; ) { - PRUint32 avail; - PRUint32 read; - - if (NS_FAILED(stream->Available(&avail))) - return NULL; - - if (avail > flen) - return NULL; - - if (NS_FAILED(stream->Read(whole+totalRead, avail, &read))) - return NULL; - - totalRead += read; - } - - XPTState *state = XPT_NewXDRState(XPT_DECODE, whole, flen); - if (!state) - return NULL; - - XPTCursor cursor; - if (!XPT_MakeCursor(state, XPT_HEADER, 0, &cursor)) { - XPT_DestroyXDRState(state); - return NULL; - } - - XPTHeader *header = nsnull; - if (!XPT_DoHeader(gXPTIStructArena, &cursor, &header)) { - XPT_DestroyXDRState(state); - return NULL; - } - - XPT_DestroyXDRState(state); - - return header; -} - void -xptiInterfaceInfoManager::RegisterFile(nsILocalFile* aFile) +xptiInterfaceInfoManager::RegisterBuffer(char *buf, PRUint32 length) { - XPTHeader* header = ReadXPTFile(aFile); - if (!header) + XPTState *state = XPT_NewXDRState(XPT_DECODE, buf, length); + if (!state) return; - RegisterXPTHeader(header); + XPTCursor cursor; + if (!XPT_MakeCursor(state, XPT_HEADER, 0, &cursor)) { + XPT_DestroyXDRState(state); + return; + } + + XPTHeader *header = nsnull; + if (XPT_DoHeader(gXPTIStructArena, &cursor, &header)) { + RegisterXPTHeader(header); + } + + XPT_DestroyXDRState(state); } void @@ -214,14 +133,6 @@ xptiInterfaceInfoManager::RegisterXPTHeader(XPTHeader* aHeader) VerifyAndAddEntryIfNew(aHeader->interface_directory + k, k, typelib); } -void -xptiInterfaceInfoManager::RegisterInputStream(nsIInputStream* aStream) -{ - XPTHeader* header = ReadXPTFileFromInputStream(aStream); - if (header) - RegisterXPTHeader(header); -} - void xptiInterfaceInfoManager::VerifyAndAddEntryIfNew(XPTInterfaceDirectoryEntry* iface, PRUint16 idx, diff --git a/xpcom/reflect/xptinfo/src/xptiprivate.h b/xpcom/reflect/xptinfo/src/xptiprivate.h index 806e2306953..14332b831be 100644 --- a/xpcom/reflect/xptinfo/src/xptiprivate.h +++ b/xpcom/reflect/xptinfo/src/xptiprivate.h @@ -444,8 +444,7 @@ public: static xptiInterfaceInfoManager* GetSingleton(); static void FreeInterfaceInfoManager(); - void RegisterFile(nsILocalFile* aFile); - void RegisterInputStream(nsIInputStream* aStream); + void RegisterBuffer(char *buf, PRUint32 length); xptiWorkingSet* GetWorkingSet() {return &mWorkingSet;} @@ -463,9 +462,6 @@ private: void RegisterXPTHeader(XPTHeader* aHeader); - XPTHeader* ReadXPTFile(nsILocalFile* aFile); - XPTHeader* ReadXPTFileFromInputStream(nsIInputStream *stream); - // idx is the index of this interface in the XPTHeader void VerifyAndAddEntryIfNew(XPTInterfaceDirectoryEntry* iface, PRUint16 idx,