diff --git a/mozilla/modules/libjar/macbuild/libjar.xml b/mozilla/modules/libjar/macbuild/libjar.xml
index 8b4f0de3527..9211a6ea549 100644
--- a/mozilla/modules/libjar/macbuild/libjar.xml
+++ b/mozilla/modules/libjar/macbuild/libjar.xml
@@ -994,6 +994,13 @@
Text
Debug
+
+ Name
+ nsXPTZipLoader.cpp
+ MacOS
+ Text
+ Debug
+
@@ -1056,6 +1063,11 @@
nsJARInputStream.cpp
MacOS
+
+ Name
+ nsXPTZipLoader.cpp
+ MacOS
+
@@ -1999,6 +2011,13 @@
Text
Debug
+
+ Name
+ nsXPTZipLoader.cpp
+ MacOS
+ Text
+ Debug
+
@@ -2061,6 +2080,11 @@
nsJARInputStream.cpp
MacOS
+
+ Name
+ nsXPTZipLoader.cpp
+ MacOS
+
@@ -2961,6 +2985,13 @@
Library
+
+ Name
+ nsXPTZipLoader.cpp
+ MacOS
+ Text
+ Debug
+
@@ -2978,6 +3009,11 @@
zlibDebug.Lib
MacOS
+
+ Name
+ nsXPTZipLoader.cpp
+ MacOS
+
@@ -3878,6 +3914,13 @@
Library
Debug
+
+ Name
+ nsXPTZipLoader.cpp
+ MacOS
+ Text
+ Debug
+
@@ -3895,6 +3938,11 @@
MSL_C_PPC.Lib
MacOS
+
+ Name
+ nsXPTZipLoader.cpp
+ MacOS
+
@@ -3938,6 +3986,12 @@
nsJARFactory.cpp
MacOS
+
+ libjarDebug.shlb
+ Name
+ nsXPTZipLoader.cpp
+ MacOS
+
NS Libraries
Optimized
diff --git a/mozilla/modules/libjar/makefile.win b/mozilla/modules/libjar/makefile.win
index 92f7d829236..880cea05a46 100644
--- a/mozilla/modules/libjar/makefile.win
+++ b/mozilla/modules/libjar/makefile.win
@@ -52,6 +52,7 @@ OBJS=.\$(OBJDIR)\nsZipArchive.obj \
.\$(OBJDIR)\nsJARFactory.obj \
.\$(OBJDIR)\nsJARInputStream.obj \
.\$(OBJDIR)\nsWildCard.obj \
+ .\$(OBJDIR)\nsXPTZipReader.obj \
$(NULL)
LCFLAGS=-DZLIB_DLL=1
diff --git a/mozilla/modules/libjar/nsJARFactory.cpp b/mozilla/modules/libjar/nsJARFactory.cpp
index d375303a3d9..339aef4ee00 100644
--- a/mozilla/modules/libjar/nsJARFactory.cpp
+++ b/mozilla/modules/libjar/nsJARFactory.cpp
@@ -1,4 +1,4 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* -*- 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
@@ -39,11 +39,20 @@
#include "nsJAR.h"
#include "nsIJARFactory.h"
#include "nsRecyclingAllocator.h"
+#include "nsXPTZipLoader.h"
+
extern nsRecyclingAllocator *gZlibAllocator;
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsXPTZipLoader)
+
// The list of components we register
static const nsModuleComponentInfo components[] =
{
+ { "XPT Zip Reader",
+ NS_XPTZIPREADER_CID,
+ NS_XPTLOADER_CONTRACTID_PREFIX "zip",
+ nsXPTZipLoaderConstructor
+ },
{ "Zip Reader",
NS_ZIPREADER_CID,
"@mozilla.org/libjar/zip-reader;1",
diff --git a/mozilla/modules/libjar/nsXPTZipLoader.cpp b/mozilla/modules/libjar/nsXPTZipLoader.cpp
new file mode 100644
index 00000000000..b476f2a756d
--- /dev/null
+++ b/mozilla/modules/libjar/nsXPTZipLoader.cpp
@@ -0,0 +1,121 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla 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/MPL/
+ *
+ * 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 the XPT zip reader.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corp.
+ * Portions created by the Initial Developer are Copyright (C) 2002
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * John Bandhauer
+ * Alec Flett
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+
+#include "nsXPTZipLoader.h"
+#include "nsIZipReader.h"
+#include "nsXPIDLString.h"
+#include "nsISimpleEnumerator.h"
+
+static const char gCacheContractID[] =
+ "@mozilla.org/libjar/zip-reader-cache;1";
+static const PRUint32 gCacheSize = 1;
+
+nsXPTZipLoader::nsXPTZipLoader() {
+ NS_INIT_ISUPPORTS();
+}
+
+NS_IMPL_ISUPPORTS1(nsXPTZipLoader, nsIXPTLoader)
+
+nsresult
+nsXPTZipLoader::LoadEntry(nsILocalFile* aFile,
+ const char* aName,
+ nsIInputStream** aResult)
+{
+ nsCOMPtr zip = dont_AddRef(GetZipReader(aFile));
+
+ if (!zip)
+ return NS_OK;
+
+ return zip->GetInputStream(aName, aResult);
+}
+
+nsresult
+nsXPTZipLoader::EnumerateEntries(nsILocalFile* aFile,
+ nsIXPTLoaderSink* aSink)
+{
+ nsCOMPtr zip = dont_AddRef(GetZipReader(aFile));
+
+ if (!zip) {
+ NS_WARNING("Could not get Zip Reader");
+ return NS_OK;
+ }
+
+ nsCOMPtr entries;
+ if (NS_FAILED(zip->FindEntries("*.xpt", getter_AddRefs(entries))) ||
+ !entries) {
+ // no problem, just no .xpt files in this archive
+ return NS_OK;
+ }
+
+
+ PRBool hasMore;
+ while (NS_SUCCEEDED(entries->HasMoreElements(&hasMore)) && hasMore) {
+ int index=0;
+
+ nsCOMPtr sup;
+ if (NS_FAILED(entries->GetNext(getter_AddRefs(sup))) || !sup)
+ return NS_ERROR_UNEXPECTED;
+
+ nsCOMPtr entry = do_QueryInterface(sup);
+ if (!entry)
+ return NS_ERROR_UNEXPECTED;
+
+ nsXPIDLCString itemName;
+ if (NS_FAILED(entry->GetName(getter_Copies(itemName))))
+ return NS_ERROR_UNEXPECTED;
+
+ nsCOMPtr stream;
+ if (NS_FAILED(zip->GetInputStream(itemName, getter_AddRefs(stream))))
+ return NS_ERROR_FAILURE;
+
+ // ignore the result
+ aSink->FoundEntry(itemName, index++, stream);
+ }
+
+ return NS_OK;
+}
+
+nsIZipReader*
+nsXPTZipLoader::GetZipReader(nsILocalFile* file)
+{
+ NS_ASSERTION(file, "bad file");
+
+ if(!mCache)
+ {
+ mCache = do_CreateInstance(gCacheContractID);
+ if(!mCache || NS_FAILED(mCache->Init(gCacheSize)))
+ return nsnull;
+ }
+
+ nsIZipReader* reader = nsnull;
+
+ if(NS_FAILED(mCache->GetZip(file, &reader)))
+ return nsnull;
+
+ return reader;
+}
diff --git a/mozilla/modules/libjar/nsXPTZipLoader.h b/mozilla/modules/libjar/nsXPTZipLoader.h
new file mode 100644
index 00000000000..aa709563c83
--- /dev/null
+++ b/mozilla/modules/libjar/nsXPTZipLoader.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla 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/MPL/
+ *
+ * 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 the XPT zip reader.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corp.
+ * Portions created by the Initial Developer are Copyright (C) 2002
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * John Bandhauer
+ * Alec Flett
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsISupports.h"
+#include "nsIXPTLoader.h"
+
+#include "nsIZipReader.h"
+
+// {0320E073-79C7-4dae-8055-81BED8B8DB96}
+#define NS_XPTZIPREADER_CID \
+ { 0x320e073, 0x79c7, 0x4dae, \
+ { 0x80, 0x55, 0x81, 0xbe, 0xd8, 0xb8, 0xdb, 0x96 } }
+
+
+class nsXPTZipLoader : public nsIXPTLoader
+{
+ public:
+ nsXPTZipLoader();
+ virtual ~nsXPTZipLoader() {};
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIXPTLOADER
+
+ private:
+ nsIZipReader* GetZipReader(nsILocalFile* aFile);
+ nsCOMPtr mCache;
+};
+
diff --git a/mozilla/modules/libjar/objs.mk b/mozilla/modules/libjar/objs.mk
index c52f498e5fb..294fb924f56 100644
--- a/mozilla/modules/libjar/objs.mk
+++ b/mozilla/modules/libjar/objs.mk
@@ -25,6 +25,7 @@ MODULES_LIBJAR_LCPPSRCS = \
nsJAR.cpp \
nsJARFactory.cpp \
nsWildCard.cpp \
+ nsXPTZipLoader.cpp \
$(NULL)
MODULES_LIBJAR_LEXPORTS = \