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 = \