/* void onStopRequest (in nsIRequest aRequest, in nsISupports aContext, * in nsresult aStatusCode); */ NS_IMETHODIMP nsZipWriter::OnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode) { if (NS_FAILED(aStatusCode)) { FinishQueue(aStatusCode); Cleanup(); } nsresult rv = mStream->Flush(); if (NS_FAILED(rv)) { FinishQueue(rv); Cleanup(); return rv; } rv = SeekCDS(); if (NS_FAILED(rv)) { FinishQueue(rv); return rv; } BeginProcessingNextItem(); return NS_OK; }
/* * Called when writing a file to the zip is complete. */ nsresult nsZipWriter::EntryCompleteCallback(nsZipHeader* aHeader, nsresult aStatus) { if (NS_SUCCEEDED(aStatus)) { if (!mEntryHash.Put(aHeader->mName, mHeaders.Count())) { SeekCDS(); return NS_ERROR_OUT_OF_MEMORY; } if (!mHeaders.AppendObject(aHeader)) { mEntryHash.Remove(aHeader->mName); SeekCDS(); return NS_ERROR_OUT_OF_MEMORY; } mCDSDirty = PR_TRUE; mCDSOffset += aHeader->mCSize + aHeader->GetFileHeaderLength(); if (mInQueue) BeginProcessingNextItem(); return NS_OK; } nsresult rv = SeekCDS(); if (mInQueue) FinishQueue(aStatus); return rv; }
/* * Starts processing on the next item in the queue. */ void nsZipWriter::BeginProcessingNextItem() { while (!mQueue.IsEmpty()) { nsZipQueueItem next = mQueue[0]; mQueue.RemoveElementAt(0); if (next.mOperation == OPERATION_REMOVE) { int32_t pos = -1; if (mEntryHash.Get(next.mZipEntry, &pos)) { if (pos < mHeaders.Count() - 1) { nsresult rv = BeginProcessingRemoval(pos); if (NS_FAILED(rv)) FinishQueue(rv); return; } mCDSOffset = mHeaders[pos]->mOffset; nsresult rv = SeekCDS(); if (NS_FAILED(rv)) { FinishQueue(rv); return; } mEntryHash.Remove(mHeaders[pos]->mName); mHeaders.RemoveObjectAt(pos); } else { FinishQueue(NS_ERROR_FILE_NOT_FOUND); return; } } else if (next.mOperation == OPERATION_ADD) { if (mEntryHash.Get(next.mZipEntry, nullptr)) { FinishQueue(NS_ERROR_FILE_ALREADY_EXISTS); return; } bool complete = false; nsresult rv = BeginProcessingAddition(&next, &complete); if (NS_FAILED(rv)) { SeekCDS(); FinishQueue(rv); return; } if (!complete) return; } } FinishQueue(NS_OK); }