summaryrefslogtreecommitdiff
path: root/modules/libjar
diff options
context:
space:
mode:
Diffstat (limited to 'modules/libjar')
-rw-r--r--modules/libjar/nsJAR.cpp39
-rw-r--r--modules/libjar/nsZipArchive.cpp15
-rw-r--r--modules/libjar/nsZipArchive.h4
3 files changed, 44 insertions, 14 deletions
diff --git a/modules/libjar/nsJAR.cpp b/modules/libjar/nsJAR.cpp
index 96e18e1d31..a9a696cf75 100644
--- a/modules/libjar/nsJAR.cpp
+++ b/modules/libjar/nsJAR.cpp
@@ -271,11 +271,7 @@ nsJAR::Extract(const nsACString &aEntryName, nsIFile* outFile)
if (NS_FAILED(rv)) return rv;
// ExtractFile also closes the fd handle and resolves the symlink if needed
- nsAutoCString path;
- rv = outFile->GetNativePath(path);
- if (NS_FAILED(rv)) return rv;
-
- rv = mZip->ExtractFile(item, path.get(), fd);
+ rv = mZip->ExtractFile(item, outFile, fd);
}
if (NS_FAILED(rv)) return rv;
@@ -422,7 +418,11 @@ nsJAR::GetJarPath(nsACString& aResult)
{
NS_ENSURE_ARG_POINTER(mZipFile);
+#ifdef XP_WIN
+ return mZipFile->GetPersistentDescriptor(aResult);
+#else
return mZipFile->GetNativePath(aResult);
+#endif
}
nsresult
@@ -1124,7 +1124,11 @@ nsZipReaderCache::IsCached(nsIFile* zipFile, bool* aResult)
MutexAutoLock lock(mLock);
nsAutoCString uri;
+#ifdef XP_WIN
+ rv = zipFile->GetPersistentDescriptor(uri);
+#else
rv = zipFile->GetNativePath(uri);
+#endif
if (NS_FAILED(rv))
return rv;
@@ -1146,8 +1150,14 @@ nsZipReaderCache::GetZip(nsIFile* zipFile, nsIZipReader* *result)
#endif
nsAutoCString uri;
+#ifdef XP_WIN
+ rv = zipFile->GetPersistentDescriptor(uri);
+#else
rv = zipFile->GetNativePath(uri);
- if (NS_FAILED(rv)) return rv;
+#endif
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
uri.Insert(NS_LITERAL_CSTRING("file:"), 0);
@@ -1190,8 +1200,14 @@ nsZipReaderCache::GetInnerZip(nsIFile* zipFile, const nsACString &entry,
#endif
nsAutoCString uri;
+#ifdef XP_WIN
+ rv = zipFile->GetPersistentDescriptor(uri);
+#else
rv = zipFile->GetNativePath(uri);
- if (NS_FAILED(rv)) return rv;
+#endif
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
uri.Insert(NS_LITERAL_CSTRING("jar:"), 0);
uri.AppendLiteral("!/");
@@ -1233,7 +1249,11 @@ nsZipReaderCache::GetFd(nsIFile* zipFile, PRFileDesc** aRetVal)
nsresult rv;
nsAutoCString uri;
+#ifdef XP_WIN
+ rv = zipFile->GetPersistentDescriptor(uri);
+#else
rv = zipFile->GetNativePath(uri);
+#endif
if (NS_FAILED(rv)) {
return rv;
}
@@ -1374,8 +1394,13 @@ nsZipReaderCache::Observe(nsISupports *aSubject,
return NS_OK;
nsAutoCString uri;
+#ifdef XP_WIN
+ if (NS_FAILED(file->GetPersistentDescriptor(uri)))
+ return NS_OK;
+#else
if (NS_FAILED(file->GetNativePath(uri)))
return NS_OK;
+#endif
uri.Insert(NS_LITERAL_CSTRING("file:"), 0);
diff --git a/modules/libjar/nsZipArchive.cpp b/modules/libjar/nsZipArchive.cpp
index b28fddc181..8006ee56c0 100644
--- a/modules/libjar/nsZipArchive.cpp
+++ b/modules/libjar/nsZipArchive.cpp
@@ -486,7 +486,7 @@ MOZ_WIN_MEM_TRY_CATCH(return nullptr)
// On extraction error(s) it removes the file.
// When needed, it also resolves the symlink.
//---------------------------------------------
-nsresult nsZipArchive::ExtractFile(nsZipItem *item, const char *outname,
+nsresult nsZipArchive::ExtractFile(nsZipItem *item, nsIFile* outFile,
PRFileDesc* aFd)
{
if (!item)
@@ -524,11 +524,16 @@ nsresult nsZipArchive::ExtractFile(nsZipItem *item, const char *outname,
//-- delete the file on errors, or resolve symlink if needed
if (aFd) {
PR_Close(aFd);
- if (rv != NS_OK)
- PR_Delete(outname);
+ if (NS_FAILED(rv) && outFile) {
+ outFile->Remove(false);
+ }
#ifdef XP_UNIX
- else if (item->IsSymlink())
- rv = ResolveSymlink(outname);
+ else if (item->IsSymlink()) {
+ nsAutoCString path;
+ rv = outFile->GetNativePath(path);
+ if (NS_FAILED(rv)) return rv;
+ rv = ResolveSymlink(path.get());
+ }
#endif
}
diff --git a/modules/libjar/nsZipArchive.h b/modules/libjar/nsZipArchive.h
index 6b758c9fd8..133a2aa120 100644
--- a/modules/libjar/nsZipArchive.h
+++ b/modules/libjar/nsZipArchive.h
@@ -159,10 +159,10 @@ public:
*
* @param zipEntry Name of file in archive to extract
* @param outFD Filedescriptor to write contents to
- * @param outname Name of file to write to
+ * @param outFile Handle of file to write to
* @return status code
*/
- nsresult ExtractFile(nsZipItem * zipEntry, const char *outname, PRFileDesc * outFD);
+ nsresult ExtractFile(nsZipItem * zipEntry, nsIFile* outFile, PRFileDesc * outFD);
/**
* FindInit