bool Gecko_AtomEqualsUTF8IgnoreCase(nsIAtom* aAtom, const char* aString, uint32_t aLength) { // XXXbholley: We should be able to do this without converting, I just can't // find the right thing to call. nsAutoString atomStr; aAtom->ToString(atomStr); NS_ConvertUTF8toUTF16 inStr(nsDependentCSubstring(aString, aLength)); return nsContentUtils::EqualsIgnoreASCIICase(atomStr, inStr); }
void ParseAtCommand(const nsACString& aAtCommand, const int aStart, nsTArray<nsCString>& aRetValues) { int length = aAtCommand.Length(); int begin = aStart; for (int i = aStart; i < length; ++i) { // Use ',' as separator if (aAtCommand[i] == ',') { nsCString tmp(nsDependentCSubstring(aAtCommand, begin, i - begin)); aRetValues.AppendElement(tmp); begin = i + 1; } } nsCString tmp(nsDependentCSubstring(aAtCommand, begin)); aRetValues.AppendElement(tmp); }
static bool HostIgnoredByProxy(const nsACString& aIgnore, const nsACString& aHost) { if (aIgnore.Equals(aHost, nsCaseInsensitiveCStringComparator())) return true; if (aIgnore.First() == '*' && StringEndsWith(aHost, nsDependentCSubstring(aIgnore, 1), nsCaseInsensitiveCStringComparator())) return true; int32_t mask = 128; nsReadingIterator<char> start; nsReadingIterator<char> slash; nsReadingIterator<char> end; aIgnore.BeginReading(start); aIgnore.BeginReading(slash); aIgnore.EndReading(end); if (FindCharInReadable('/', slash, end)) { ++slash; nsDependentCSubstring maskStr(slash, end); nsAutoCString maskStr2(maskStr); nsresult err; mask = maskStr2.ToInteger(&err); if (NS_FAILED(err)) { mask = 128; } --slash; } else { slash = end; } nsDependentCSubstring ignoreStripped(start, slash); PRIPv6Addr ignoreAddr, hostAddr; if (!ConvertToIPV6Addr(ignoreStripped, &ignoreAddr, &mask) || !ConvertToIPV6Addr(aHost, &hostAddr, nullptr)) return false; proxy_MaskIPv6Addr(ignoreAddr, mask); proxy_MaskIPv6Addr(hostAddr, mask); return memcmp(&ignoreAddr, &hostAddr, sizeof(PRIPv6Addr)) == 0; }
static PRBool GConfIgnoreHost(const nsACString& aIgnore, const nsACString& aHost) { if (aIgnore.Equals(aHost, nsCaseInsensitiveCStringComparator())) return PR_TRUE; if (aIgnore.First() == '*' && StringEndsWith(aHost, nsDependentCSubstring(aIgnore, 1), nsCaseInsensitiveCStringComparator())) return PR_TRUE; PRInt32 mask = 128; nsReadingIterator<char> start; nsReadingIterator<char> slash; nsReadingIterator<char> end; aIgnore.BeginReading(start); aIgnore.BeginReading(slash); aIgnore.EndReading(end); if (FindCharInReadable('/', slash, end)) { ++slash; nsDependentCSubstring maskStr(slash, end); nsCAutoString maskStr2(maskStr); PRInt32 err; mask = maskStr2.ToInteger(&err); if (err != 0) { mask = 128; } --slash; } else { slash = end; } PRIPv6Addr ignoreAddr, hostAddr; if (!ConvertToIPV6Addr(aIgnore, &ignoreAddr) || !ConvertToIPV6Addr(aHost, &hostAddr)) return PR_FALSE; proxy_MaskIPv6Addr(ignoreAddr, mask); proxy_MaskIPv6Addr(hostAddr, mask); return memcmp(&ignoreAddr, &hostAddr, sizeof(PRIPv6Addr)) == 0; }
nsIAtom* Gecko_Atomize(const char* aString, uint32_t aLength) { return NS_Atomize(nsDependentCSubstring(aString, aLength)).take(); }
nsresult nsLineBreaker::AppendText(nsIAtom* aLangGroup, const PRUint8* aText, PRUint32 aLength, PRUint32 aFlags, nsILineBreakSink* aSink) { NS_ASSERTION(aLength > 0, "Appending empty text..."); if (aFlags & (BREAK_NEED_CAPITALIZATION | BREAK_USE_AUTO_HYPHENATION)) { // Defer to the Unicode path if capitalization or hyphenation is required nsAutoString str; const char* cp = reinterpret_cast<const char*>(aText); CopyASCIItoUTF16(nsDependentCSubstring(cp, cp + aLength), str); return AppendText(aLangGroup, str.get(), aLength, aFlags, aSink); } PRUint32 offset = 0; // Continue the current word if (mCurrentWord.Length() > 0) { NS_ASSERTION(!mAfterBreakableSpace && !mBreakHere, "These should not be set"); while (offset < aLength && !IsSpace(aText[offset])) { mCurrentWord.AppendElement(aText[offset]); if (!mCurrentWordContainsComplexChar && IsComplexASCIIChar(aText[offset])) { mCurrentWordContainsComplexChar = PR_TRUE; } ++offset; } if (offset > 0) { mTextItems.AppendElement(TextItem(aSink, 0, offset, aFlags)); } if (offset == aLength) { // We did not encounter whitespace so the word hasn't finished yet. return NS_OK; } // We encountered whitespace, so we're done with this word nsresult rv = FlushCurrentWord(); if (NS_FAILED(rv)) return rv; } nsAutoTArray<PRUint8,4000> breakState; if (aSink) { if (!breakState.AppendElements(aLength)) return NS_ERROR_OUT_OF_MEMORY; } PRUint32 start = offset; bool noBreaksNeeded = !aSink || (aFlags == (BREAK_SUPPRESS_INITIAL | BREAK_SUPPRESS_INSIDE | BREAK_SKIP_SETTING_NO_BREAKS) && !mBreakHere && !mAfterBreakableSpace); if (noBreaksNeeded) { // Skip to the space before the last word, since either the break data // here is not needed, or no breaks are set in the sink and there cannot // be any breaks in this chunk; all we need is the context for the next // chunk (if any) offset = aLength; while (offset > start) { --offset; if (IsSpace(aText[offset])) break; } } PRUint32 wordStart = offset; bool wordHasComplexChar = false; for (;;) { PRUint8 ch = aText[offset]; bool isSpace = IsSpace(ch); bool isBreakableSpace = isSpace && !(aFlags & BREAK_SUPPRESS_INSIDE); if (aSink) { breakState[offset] = mBreakHere || (mAfterBreakableSpace && !isBreakableSpace) ? gfxTextRun::CompressedGlyph::FLAG_BREAK_TYPE_NORMAL : gfxTextRun::CompressedGlyph::FLAG_BREAK_TYPE_NONE; } mBreakHere = PR_FALSE; mAfterBreakableSpace = isBreakableSpace; if (isSpace) { if (offset > wordStart && wordHasComplexChar) { if (aSink && !(aFlags & BREAK_SUPPRESS_INSIDE)) { // Save current start-of-word state because GetJISx4051Breaks will // set it to false PRUint8 currentStart = breakState[wordStart]; nsContentUtils::LineBreaker()-> GetJISx4051Breaks(aText + wordStart, offset - wordStart, breakState.Elements() + wordStart); breakState[wordStart] = currentStart; } wordHasComplexChar = PR_FALSE; } ++offset; if (offset >= aLength) break; wordStart = offset; } else { if (!wordHasComplexChar && IsComplexASCIIChar(ch)) { wordHasComplexChar = PR_TRUE; } ++offset; if (offset >= aLength) { // Save this word mCurrentWordContainsComplexChar = wordHasComplexChar; PRUint32 len = offset - wordStart; PRUnichar* elems = mCurrentWord.AppendElements(len); if (!elems) return NS_ERROR_OUT_OF_MEMORY; PRUint32 i; for (i = wordStart; i < offset; ++i) { elems[i - wordStart] = aText[i]; } mTextItems.AppendElement(TextItem(aSink, wordStart, len, aFlags)); // Ensure that the break-before for this word is written out offset = wordStart + 1; break; } } } if (!noBreaksNeeded) { aSink->SetBreaks(start, offset - start, breakState.Elements() + start); } return NS_OK; }
nsresult ProxyAutoConfig::SetupJS() { mJSNeedsSetup = false; NS_ABORT_IF_FALSE(!sRunning, "JIT is running"); delete mJSRuntime; mJSRuntime = nullptr; if (mPACScript.IsEmpty()) return NS_ERROR_FAILURE; mJSRuntime = JSRuntimeWrapper::Create(); if (!mJSRuntime) return NS_ERROR_FAILURE; JSAutoRequest ar(mJSRuntime->Context()); JSAutoCompartment ac(mJSRuntime->Context(), mJSRuntime->Global()); // check if this is a data: uri so that we don't spam the js console with // huge meaningless strings. this is not on the main thread, so it can't // use nsIRUI scheme methods bool isDataURI = nsDependentCSubstring(mPACURI, 0, 5).LowerCaseEqualsASCII("data:", 5); sRunning = this; JS::Rooted<JSObject *> global(mJSRuntime->Context(), mJSRuntime->Global()); JS::CompileOptions options(mJSRuntime->Context()); options.setFileAndLine(mPACURI.get(), 1); JSScript *script = JS_CompileScript(mJSRuntime->Context(), global, mPACScript.get(), mPACScript.Length(), options); if (!script || !JS_ExecuteScript(mJSRuntime->Context(), mJSRuntime->Global(), script, nullptr)) { nsString alertMessage(NS_LITERAL_STRING("PAC file failed to install from ")); if (isDataURI) { alertMessage += NS_LITERAL_STRING("data: URI"); } else { alertMessage += NS_ConvertUTF8toUTF16(mPACURI); } PACLogToConsole(alertMessage); sRunning = nullptr; return NS_ERROR_FAILURE; } sRunning = nullptr; mJSRuntime->SetOK(); nsString alertMessage(NS_LITERAL_STRING("PAC file installed from ")); if (isDataURI) { alertMessage += NS_LITERAL_STRING("data: URI"); } else { alertMessage += NS_ConvertUTF8toUTF16(mPACURI); } PACLogToConsole(alertMessage); // we don't need these now mPACScript.Truncate(); mPACURI.Truncate(); return NS_OK; }
// Called on the worker thread. bool BackgroundFileSaver::CheckCompletion() { nsresult rv; MOZ_ASSERT(!mAsyncCopyContext, "Should not be copying when checking completion conditions."); bool failed = true; { MutexAutoLock lock(mLock); if (mComplete) { return true; } // If an error occurred, we don't need to do the checks in this code block, // and the operation can be completed immediately with a failure code. if (NS_SUCCEEDED(mStatus)) { failed = false; // We did not incur in an error, so we must determine if we can stop now. // If the Finish method has not been called, we can just continue now. if (!mFinishRequested) { return false; } // We can only stop when all the operations requested by the control // thread have been processed. First, we check whether we have processed // the first SetTarget call, if any. Then, we check whether we have // processed any rename requested by subsequent SetTarget calls. if ((mInitialTarget && !mActualTarget) || (mRenamedTarget && mRenamedTarget != mActualTarget)) { return false; } // If we still have data to write to the output file, allow the copy // operation to resume. The Available getter may return an error if one // of the pipe's streams has been already closed. uint64_t available; rv = mPipeInputStream->Available(&available); if (NS_SUCCEEDED(rv) && available != 0) { return false; } } mComplete = true; } // Ensure we notify completion now that the operation finished. // Do a best-effort attempt to remove the file if required. if (failed && mActualTarget && !mActualTargetKeepPartial) { (void)mActualTarget->Remove(false); } // Finish computing the hash if (!failed && mDigestContext) { nsNSSShutDownPreventionLock lock; if (!isAlreadyShutDown()) { Digest d; rv = d.End(SEC_OID_SHA256, mDigestContext); if (NS_SUCCEEDED(rv)) { MutexAutoLock lock(mLock); mSha256 = nsDependentCSubstring(char_ptr_cast(d.get().data), d.get().len); } } } // Compute the signature of the binary. ExtractSignatureInfo doesn't do // anything on non-Windows platforms except return an empty nsIArray. if (!failed && mActualTarget) { nsString filePath; mActualTarget->GetTarget(filePath); nsresult rv = ExtractSignatureInfo(filePath); if (NS_FAILED(rv)) { LOG(("Unable to extract signature information [this = %p].", this)); } else { LOG(("Signature extraction success! [this = %p]", this)); } } // Post an event to notify that the operation completed. if (NS_FAILED(mControlThread->Dispatch(NewRunnableMethod(this, &BackgroundFileSaver::NotifySaveComplete), NS_DISPATCH_NORMAL))) { NS_WARNING("Unable to post completion event to the control thread."); } return true; }
NS_IMETHODIMP nsFolderCompactState::OnDataAvailable(nsIRequest *request, nsISupports *ctxt, nsIInputStream *inStr, PRUint32 sourceOffset, PRUint32 count) { if (!m_fileStream || !inStr) return NS_ERROR_FAILURE; nsresult rv = NS_OK; PRUint32 msgFlags; bool checkForKeyword = m_startOfMsg; bool addKeywordHdr = false; PRUint32 needToGrowKeywords = 0; PRUint32 statusOffset; nsCString msgHdrKeywords; if (m_startOfMsg) { m_statusOffset = 0; m_addedHeaderSize = 0; m_messageUri.Truncate(); // clear the previous message uri if (NS_SUCCEEDED(BuildMessageURI(m_baseMessageUri.get(), m_keyArray->m_keys[m_curIndex], m_messageUri))) { rv = GetMessage(getter_AddRefs(m_curSrcHdr)); NS_ENSURE_SUCCESS(rv, rv); if (m_curSrcHdr) { (void) m_curSrcHdr->GetFlags(&msgFlags); (void) m_curSrcHdr->GetStatusOffset(&statusOffset); if (statusOffset == 0) m_needStatusLine = true; // x-mozilla-status lines should be at the start of the headers, and the code // below assumes everything will fit in m_dataBuffer - if there's not // room, skip the keyword stuff. if (statusOffset > sizeof(m_dataBuffer) - 1024) { checkForKeyword = false; NS_ASSERTION(false, "status offset past end of read buffer size"); } } } m_startOfMsg = false; } PRUint32 maxReadCount, readCount, writeCount; PRUint32 bytesWritten; while (NS_SUCCEEDED(rv) && (PRInt32) count > 0) { maxReadCount = count > sizeof(m_dataBuffer) - 1 ? sizeof(m_dataBuffer) - 1 : count; writeCount = 0; rv = inStr->Read(m_dataBuffer, maxReadCount, &readCount); // if status offset is past the number of bytes we read, it's probably bogus, // and we shouldn't do any of the keyword stuff. if (statusOffset + X_MOZILLA_STATUS_LEN > readCount) checkForKeyword = false; if (NS_SUCCEEDED(rv)) { if (checkForKeyword) { // make sure that status offset really points to x-mozilla-status line if (!strncmp(m_dataBuffer + statusOffset, X_MOZILLA_STATUS, X_MOZILLA_STATUS_LEN)) { const char *keywordHdr = PL_strnrstr(m_dataBuffer, HEADER_X_MOZILLA_KEYWORDS, readCount); if (keywordHdr) m_curSrcHdr->GetUint32Property("growKeywords", &needToGrowKeywords); else addKeywordHdr = true; m_curSrcHdr->GetStringProperty("keywords", getter_Copies(msgHdrKeywords)); } checkForKeyword = false; } PRUint32 blockOffset = 0; if (m_needStatusLine) { m_needStatusLine = false; // we need to parse out the "From " header, write it out, then // write out the x-mozilla-status headers, and set the // status offset of the dest hdr for later use // in OnEndCopy). if (!strncmp(m_dataBuffer, "From ", 5)) { blockOffset = 5; // skip from line MsgAdvanceToNextLine(m_dataBuffer, blockOffset, readCount); char statusLine[50]; m_fileStream->Write(m_dataBuffer, blockOffset, &writeCount); m_statusOffset = blockOffset; PR_snprintf(statusLine, sizeof(statusLine), X_MOZILLA_STATUS_FORMAT MSG_LINEBREAK, msgFlags & 0xFFFF); m_fileStream->Write(statusLine, strlen(statusLine), &m_addedHeaderSize); PR_snprintf(statusLine, sizeof(statusLine), X_MOZILLA_STATUS2_FORMAT MSG_LINEBREAK, msgFlags & 0xFFFF0000); m_fileStream->Write(statusLine, strlen(statusLine), &bytesWritten); m_addedHeaderSize += bytesWritten; } else { NS_ASSERTION(false, "not an envelope"); // try to mark the db as invalid so it will be reparsed. nsCOMPtr <nsIMsgDatabase> srcDB; m_folder->GetMsgDatabase(getter_AddRefs(srcDB)); if (srcDB) { srcDB->SetSummaryValid(false); srcDB->ForceClosed(); } } } #define EXTRA_KEYWORD_HDR " "MSG_LINEBREAK // if status offset isn't in the first block, this code won't work. There's no good reason // for the status offset not to be at the beginning of the message anyway. if (addKeywordHdr) { // if blockOffset is set, we added x-mozilla-status headers so // file pointer is already past them. if (!blockOffset) { blockOffset = statusOffset; // skip x-mozilla-status and status2 lines. MsgAdvanceToNextLine(m_dataBuffer, blockOffset, readCount); MsgAdvanceToNextLine(m_dataBuffer, blockOffset, readCount); // need to rewrite the headers up to and including the x-mozilla-status2 header m_fileStream->Write(m_dataBuffer, blockOffset, &writeCount); } // we should write out the existing keywords from the msg hdr, if any. if (msgHdrKeywords.IsEmpty()) { // no keywords, so write blank header m_fileStream->Write(X_MOZILLA_KEYWORDS, sizeof(X_MOZILLA_KEYWORDS) - 1, &bytesWritten); m_addedHeaderSize += bytesWritten; } else { if (msgHdrKeywords.Length() < sizeof(X_MOZILLA_KEYWORDS) - sizeof(HEADER_X_MOZILLA_KEYWORDS) + 10 /* allow some slop */) { // keywords fit in normal blank header, so replace blanks in keyword hdr with keywords nsCAutoString keywordsHdr(X_MOZILLA_KEYWORDS); keywordsHdr.Replace(sizeof(HEADER_X_MOZILLA_KEYWORDS) + 1, msgHdrKeywords.Length(), msgHdrKeywords); m_fileStream->Write(keywordsHdr.get(), keywordsHdr.Length(), &bytesWritten); m_addedHeaderSize += bytesWritten; } else { // keywords don't fit, so write out keywords on one line and an extra blank line nsCString newKeywordHeader(HEADER_X_MOZILLA_KEYWORDS ": "); newKeywordHeader.Append(msgHdrKeywords); newKeywordHeader.Append(MSG_LINEBREAK EXTRA_KEYWORD_HDR); m_fileStream->Write(newKeywordHeader.get(), newKeywordHeader.Length(), &bytesWritten); m_addedHeaderSize += bytesWritten; } } addKeywordHdr = false; } else if (needToGrowKeywords) { blockOffset = statusOffset; if (!strncmp(m_dataBuffer + blockOffset, X_MOZILLA_STATUS, X_MOZILLA_STATUS_LEN)) MsgAdvanceToNextLine(m_dataBuffer, blockOffset, readCount); // skip x-mozilla-status hdr if (!strncmp(m_dataBuffer + blockOffset, X_MOZILLA_STATUS2, X_MOZILLA_STATUS2_LEN)) MsgAdvanceToNextLine(m_dataBuffer, blockOffset, readCount); // skip x-mozilla-status2 hdr PRUint32 preKeywordBlockOffset = blockOffset; if (!strncmp(m_dataBuffer + blockOffset, HEADER_X_MOZILLA_KEYWORDS, sizeof(HEADER_X_MOZILLA_KEYWORDS) - 1)) { do { // skip x-mozilla-keywords hdr and any existing continuation headers MsgAdvanceToNextLine(m_dataBuffer, blockOffset, readCount); } while (m_dataBuffer[blockOffset] == ' '); } PRInt32 oldKeywordSize = blockOffset - preKeywordBlockOffset; // rewrite the headers up to and including the x-mozilla-status2 header m_fileStream->Write(m_dataBuffer, preKeywordBlockOffset, &writeCount); // let's just rewrite all the keywords on several lines and add a blank line, // instead of worrying about which are missing. bool done = false; nsCAutoString keywordHdr(HEADER_X_MOZILLA_KEYWORDS ": "); PRInt32 nextBlankOffset = 0; PRInt32 curHdrLineStart = 0; PRInt32 newKeywordSize = 0; while (!done) { nextBlankOffset = msgHdrKeywords.FindChar(' ', nextBlankOffset); if (nextBlankOffset == kNotFound) { nextBlankOffset = msgHdrKeywords.Length(); done = true; } if (nextBlankOffset - curHdrLineStart > 90 || done) { keywordHdr.Append(nsDependentCSubstring(msgHdrKeywords, curHdrLineStart, msgHdrKeywords.Length() - curHdrLineStart)); keywordHdr.Append(MSG_LINEBREAK); m_fileStream->Write(keywordHdr.get(), keywordHdr.Length(), &bytesWritten); newKeywordSize += bytesWritten; curHdrLineStart = nextBlankOffset; keywordHdr.Assign(' '); } nextBlankOffset++; } m_fileStream->Write(EXTRA_KEYWORD_HDR, sizeof(EXTRA_KEYWORD_HDR) - 1, &bytesWritten); newKeywordSize += bytesWritten; m_addedHeaderSize += newKeywordSize - oldKeywordSize; m_curSrcHdr->SetUint32Property("growKeywords", 0); needToGrowKeywords = false; writeCount += blockOffset - preKeywordBlockOffset; // fudge writeCount } if (readCount <= blockOffset) { NS_ASSERTION(false, "bad block offset"); // not sure what to do to handle this. } m_fileStream->Write(m_dataBuffer + blockOffset, readCount - blockOffset, &bytesWritten); writeCount += bytesWritten; count -= readCount; if (writeCount != readCount) { m_folder->ThrowAlertMsg("compactFolderWriteFailed", m_window); return NS_MSG_ERROR_WRITING_MAIL_FOLDER; } } } return rv; }
void nsEnigMimeListener::ParseHeader(const char* header, PRUint32 count) { //DEBUG_LOG(("nsEnigMimeListener::ParseHeader: header='%s'\n", header)); if (!header || (count <= 0) ) return; // Create header string nsCAutoString headerStr(header, count); //DEBUG_LOG(("nsEnigMimeListener::ParseHeader: header='%s'\n", headerStr.get())); PRInt32 colonOffset; colonOffset = headerStr.FindChar(':'); if (colonOffset < 0) return; // Null header key not allowed if (colonOffset == 0) return; // Extract header key (not case-sensitive) nsCAutoString headerKey = (nsCString) nsDependentCSubstring (headerStr, 0, colonOffset); ToLowerCase(headerKey); // Extract header value, trimming leading/trailing whitespace nsCAutoString buf = (nsCString) nsDependentCSubstring (headerStr, colonOffset+1, headerStr.Length() - colonOffset); buf.Trim(" ", PR_TRUE, PR_TRUE); //DEBUG_LOG(("nsEnigMimeListener::ParseHeader: '%s': %s\n", headerKey.get(), buf.get())); PRInt32 semicolonOffset = buf.FindChar(';'); nsCString headerValue; if (semicolonOffset < 0) { // No parameters headerValue = ((nsCString)buf).get(); } else { // Extract value to left of parameters headerValue = nsDependentCSubstring (buf, 0, semicolonOffset); } // Trim leading and trailing spaces in header value headerValue.Trim(" ", PR_TRUE, PR_TRUE); if (headerKey.Equals("content-type")) { mContentType = headerValue; DEBUG_LOG(("nsEnigMimeListener::ParseHeader: ContentType=%s\n", mContentType.get())); if (!buf.IsEmpty()) { char *charset = MimeHeaders_get_parameter(buf.get(), HEADER_PARM_CHARSET, NULL, NULL); char *boundary = MimeHeaders_get_parameter(buf.get(), HEADER_PARM_BOUNDARY, NULL, NULL); char *protocol = MimeHeaders_get_parameter(buf.get(), PARAM_PROTOCOL, NULL, NULL); char *micalg = MimeHeaders_get_parameter(buf.get(), PARAM_MICALG, NULL, NULL); if (charset) mContentCharset = charset; if (boundary) mContentBoundary = boundary; if (protocol) mContentProtocol = protocol; if (micalg) mContentMicalg = micalg; PR_FREEIF(charset); PR_FREEIF(boundary); PR_FREEIF(protocol); PR_FREEIF(micalg); DEBUG_LOG(("nsEnigMimeListener::ParseHeader: ContentCharset=%s\n", mContentCharset.get())); DEBUG_LOG(("nsEnigMimeListener::ParseHeader: ContentBoundary=%s\n", mContentBoundary.get())); DEBUG_LOG(("nsEnigMimeListener::ParseHeader: ContentProtocol=%s\n", mContentProtocol.get())); DEBUG_LOG(("nsEnigMimeListener::ParseHeader: ContentMicalg=%s\n", mContentMicalg.get())); } } else if (headerKey.Equals("content-transfer-encoding")) { mContentEncoding = buf; ToLowerCase(mContentEncoding); DEBUG_LOG(("nsEnigMimeListener::ParseHeader: ContentEncoding=%s\n", mContentEncoding.get())); } else if (headerKey.Equals("content-disposition")) { mContentDisposition = buf; DEBUG_LOG(("nsEnigMimeListener::ParseHeader: ContentDisposition=%s\n", mContentDisposition.get())); } else if (headerKey.Equals("content-length")) { nsresult status; PRInt32 value = headerValue.ToInteger(&status); if (NS_SUCCEEDED(status)) mContentLength = value; DEBUG_LOG(("nsEnigMimeListener::ParseHeader: ContenLengtht=%d\n", mContentLength)); } return; }
// Called on the worker thread. bool BackgroundFileSaver::CheckCompletion() { nsresult rv; MOZ_ASSERT(!mAsyncCopyContext, "Should not be copying when checking completion conditions."); bool failed = true; { MutexAutoLock lock(mLock); if (mComplete) { return true; } // If an error occurred, we don't need to do the checks in this code block, // and the operation can be completed immediately with a failure code. if (NS_SUCCEEDED(mStatus)) { failed = false; // On success, if there is a pending rename operation, we must process it // before finishing. Otherwise, we can finish now if requested. if ((mAssignedTarget && mAssignedTarget != mActualTarget) || !mFinishRequested) { return false; } // If completion was requested, but we still have data to write to the // output file, allow the copy operation to resume. The Available getter // may return an error if one of the pipe's streams has been already closed. uint64_t available; rv = mPipeInputStream->Available(&available); if (NS_SUCCEEDED(rv) && available != 0) { return false; } } mComplete = true; } // Ensure we notify completion now that the operation finished. // Do a best-effort attempt to remove the file if required. if (failed && mActualTarget && !mActualTargetKeepPartial) { (void)mActualTarget->Remove(false); } // Finish computing the hash if (!failed && mDigestContext) { nsNSSShutDownPreventionLock lock; if (!isAlreadyShutDown()) { Digest d; rv = d.End(SEC_OID_SHA256, mDigestContext); if (NS_SUCCEEDED(rv)) { MutexAutoLock lock(mLock); mSha256 = nsDependentCSubstring(char_ptr_cast(d.get().data), d.get().len); } } } // Post an event to notify that the operation completed. nsCOMPtr<nsIRunnable> event = NS_NewRunnableMethod(this, &BackgroundFileSaver::NotifySaveComplete); if (!event || NS_FAILED(mControlThread->Dispatch(event, NS_DISPATCH_NORMAL))) { NS_WARNING("Unable to post completion event to the control thread."); } return true; }