/* void Save (); */ NS_IMETHODIMP mozPersonalDictionary::Save() { nsCOMPtr<nsIFile> theFile; nsresult res; if(!mDirty) return NS_OK; //FIXME Deinst -- get dictionary name from prefs; res = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(theFile)); if(NS_FAILED(res)) return res; if(!theFile)return NS_ERROR_FAILURE; res = theFile->Append(NS_LITERAL_STRING(MOZ_PERSONAL_DICT_NAME)); if(NS_FAILED(res)) return res; nsCOMPtr<nsIOutputStream> outStream; NS_NewLocalFileOutputStream(getter_AddRefs(outStream), theFile, PR_CREATE_FILE | PR_WRONLY | PR_TRUNCATE ,0664); // get a buffered output stream 4096 bytes big, to optimize writes nsCOMPtr<nsIOutputStream> bufferedOutputStream; res = NS_NewBufferedOutputStream(getter_AddRefs(bufferedOutputStream), outStream, 4096); if (NS_FAILED(res)) return res; nsTArray<nsString> array(mDictionaryTable.Count()); mDictionaryTable.EnumerateEntries(AddHostToStringArray, &array); PRUint32 bytesWritten; nsCAutoString utf8Key; for (PRUint32 i = 0; i < array.Length(); ++i ) { CopyUTF16toUTF8(array[i], utf8Key); bufferedOutputStream->Write(utf8Key.get(), utf8Key.Length(), &bytesWritten); bufferedOutputStream->Write("\n", 1, &bytesWritten); } return res; }
NS_IMETHODIMP nsZipWriter::Open(nsIFile *aFile, int32_t aIoFlags) { if (mStream) return NS_ERROR_ALREADY_INITIALIZED; NS_ENSURE_ARG_POINTER(aFile); // Need to be able to write to the file if (aIoFlags & PR_RDONLY) return NS_ERROR_FAILURE; nsresult rv = aFile->Clone(getter_AddRefs(mFile)); NS_ENSURE_SUCCESS(rv, rv); bool exists; rv = mFile->Exists(&exists); NS_ENSURE_SUCCESS(rv, rv); if (!exists && !(aIoFlags & PR_CREATE_FILE)) return NS_ERROR_FILE_NOT_FOUND; if (exists && !(aIoFlags & (PR_TRUNCATE | PR_WRONLY))) { rv = ReadFile(mFile); NS_ENSURE_SUCCESS(rv, rv); mCDSDirty = false; } else { mCDSOffset = 0; mCDSDirty = true; mComment.Truncate(); } // Silently drop PR_APPEND aIoFlags &= 0xef; nsCOMPtr<nsIOutputStream> stream; rv = NS_NewLocalFileOutputStream(getter_AddRefs(stream), mFile, aIoFlags); if (NS_FAILED(rv)) { mHeaders.Clear(); mEntryHash.Clear(); return rv; } rv = NS_NewBufferedOutputStream(getter_AddRefs(mStream), stream, 64 * 1024); if (NS_FAILED(rv)) { stream->Close(); mHeaders.Clear(); mEntryHash.Clear(); return rv; } if (mCDSOffset > 0) { rv = SeekCDS(); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; }
NS_IMETHOD Run() override { nsresult res; MOZ_ASSERT(!NS_IsMainThread()); { mozilla::MonitorAutoLock mon(mDict->mMonitorSave); nsCOMPtr<nsIOutputStream> outStream; NS_NewSafeLocalFileOutputStream(getter_AddRefs(outStream), mFile, PR_CREATE_FILE | PR_WRONLY | PR_TRUNCATE, 0664); // Get a buffered output stream 4096 bytes big, to optimize writes. nsCOMPtr<nsIOutputStream> bufferedOutputStream; res = NS_NewBufferedOutputStream(getter_AddRefs(bufferedOutputStream), outStream.forget(), 4096); if (NS_FAILED(res)) { return res; } uint32_t bytesWritten; nsAutoCString utf8Key; for (uint32_t i = 0; i < mDictWords.Length(); ++i) { CopyUTF16toUTF8(mDictWords[i], utf8Key); bufferedOutputStream->Write(utf8Key.get(), utf8Key.Length(), &bytesWritten); bufferedOutputStream->Write("\n", 1, &bytesWritten); } nsCOMPtr<nsISafeOutputStream> safeStream = do_QueryInterface(bufferedOutputStream); NS_ASSERTION(safeStream, "expected a safe output stream!"); if (safeStream) { res = safeStream->Finish(); if (NS_FAILED(res)) { NS_WARNING("failed to save personal dictionary file! possible data loss"); } } // Save is done, reset the state variable and notify those who are waiting. mDict->mSavePending = false; mon.Notify(); // Leaving the block where 'mon' was declared will call the destructor // and unlock. } // Release the dictionary on the main thread. NS_ReleaseOnMainThreadSystemGroup( "mozPersonalDictionarySave::mDict", mDict.forget().downcast<mozIPersonalDictionary>()); return NS_OK; }
NS_IMETHODIMP nsJSON::EncodeToStream(nsIOutputStream *aStream, const char* aCharset, const bool aWriteBOM, const JS::Value& val, JSContext* cx, uint8_t aArgc) { // This function should only be called from JS. NS_ENSURE_ARG(aStream); nsresult rv; rv = CheckCharset(aCharset); NS_ENSURE_SUCCESS(rv, rv); // Check to see if we have a buffered stream nsCOMPtr<nsIOutputStream> bufferedStream; // FIXME: bug 408514. // NS_OutputStreamIsBuffered(aStream) asserts on file streams... //if (!NS_OutputStreamIsBuffered(aStream)) { rv = NS_NewBufferedOutputStream(getter_AddRefs(bufferedStream), aStream, 4096); NS_ENSURE_SUCCESS(rv, rv); // aStream = bufferedStream; //} uint32_t ignored; if (aWriteBOM) { if (strcmp(aCharset, "UTF-8") == 0) rv = aStream->Write(UTF8BOM, 3, &ignored); else if (strcmp(aCharset, "UTF-16LE") == 0) rv = aStream->Write(UTF16LEBOM, 2, &ignored); else if (strcmp(aCharset, "UTF-16BE") == 0) rv = aStream->Write(UTF16BEBOM, 2, &ignored); NS_ENSURE_SUCCESS(rv, rv); } nsJSONWriter writer(bufferedStream); rv = writer.SetCharset(aCharset); NS_ENSURE_SUCCESS(rv, rv); if (aArgc == 0) { return NS_OK; } rv = EncodeInternal(cx, val, &writer); NS_ENSURE_SUCCESS(rv, rv); rv = bufferedStream->Flush(); return rv; }
nsresult nsCertOverrideService::Write() { nsAutoMonitor lock(monitor); if (!mSettingsFile) { return NS_ERROR_NULL_POINTER; } nsresult rv; nsCOMPtr<nsIOutputStream> fileOutputStream; rv = NS_NewSafeLocalFileOutputStream(getter_AddRefs(fileOutputStream), mSettingsFile, -1, 0600); if (NS_FAILED(rv)) { NS_ERROR("failed to open cert_warn_settings.txt for writing"); return rv; } // get a buffered output stream 4096 bytes big, to optimize writes nsCOMPtr<nsIOutputStream> bufferedOutputStream; rv = NS_NewBufferedOutputStream(getter_AddRefs(bufferedOutputStream), fileOutputStream, 4096); if (NS_FAILED(rv)) { return rv; } static const char kHeader[] = "# PSM Certificate Override Settings file" NS_LINEBREAK "# This is a generated file! Do not edit." NS_LINEBREAK; /* see ::Read for file format */ bufferedOutputStream->Write(kHeader, sizeof(kHeader) - 1, &rv); nsIOutputStream *rawStreamPtr = bufferedOutputStream; mSettingsTable.EnumerateEntries(WriteEntryCallback, rawStreamPtr); // All went ok. Maybe except for problems in Write(), but the stream detects // that for us nsCOMPtr<nsISafeOutputStream> safeStream = do_QueryInterface(bufferedOutputStream); NS_ASSERTION(safeStream, "expected a safe output stream!"); if (safeStream) { rv = safeStream->Finish(); if (NS_FAILED(rv)) { NS_WARNING("failed to save cert warn settings file! possible dataloss"); return rv; } } return NS_OK; }
/* void Save (); */ NS_IMETHODIMP mozPersonalDictionary::Save() { nsCOMPtr<nsIFile> theFile; nsresult res; if(!mDirty) return NS_OK; //FIXME Deinst -- get dictionary name from prefs; res = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(theFile)); if(NS_FAILED(res)) return res; if(!theFile)return NS_ERROR_FAILURE; res = theFile->Append(NS_LITERAL_STRING(MOZ_PERSONAL_DICT_NAME)); if(NS_FAILED(res)) return res; nsCOMPtr<nsIOutputStream> outStream; NS_NewSafeLocalFileOutputStream(getter_AddRefs(outStream), theFile, PR_CREATE_FILE | PR_WRONLY | PR_TRUNCATE ,0664); // get a buffered output stream 4096 bytes big, to optimize writes nsCOMPtr<nsIOutputStream> bufferedOutputStream; res = NS_NewBufferedOutputStream(getter_AddRefs(bufferedOutputStream), outStream, 4096); if (NS_FAILED(res)) return res; nsTArray<nsString> array(mDictionaryTable.Count()); mDictionaryTable.EnumerateEntries(AddHostToStringArray, &array); uint32_t bytesWritten; nsAutoCString utf8Key; for (uint32_t i = 0; i < array.Length(); ++i ) { CopyUTF16toUTF8(array[i], utf8Key); bufferedOutputStream->Write(utf8Key.get(), utf8Key.Length(), &bytesWritten); bufferedOutputStream->Write("\n", 1, &bytesWritten); } nsCOMPtr<nsISafeOutputStream> safeStream = do_QueryInterface(bufferedOutputStream); NS_ASSERTION(safeStream, "expected a safe output stream!"); if (safeStream) { res = safeStream->Finish(); if (NS_FAILED(res)) { NS_WARNING("failed to save personal dictionary file! possible data loss"); } } return res; }
nsresult VariableLengthPrefixSet::StoreToFile(nsIFile* aFile) { NS_ENSURE_ARG_POINTER(aFile); MutexAutoLock lock(mLock); nsCOMPtr<nsIOutputStream> localOutFile; nsresult rv = NS_NewLocalFileOutputStream(getter_AddRefs(localOutFile), aFile, PR_WRONLY | PR_TRUNCATE | PR_CREATE_FILE); NS_ENSURE_SUCCESS(rv, rv); uint32_t fileSize = 0; // Preallocate the file storage { nsCOMPtr<nsIFileOutputStream> fos(do_QueryInterface(localOutFile)); Telemetry::AutoTimer<Telemetry::URLCLASSIFIER_VLPS_FALLOCATE_TIME> timer; fileSize += mFixedPrefixSet->CalculatePreallocateSize(); fileSize += CalculatePreallocateSize(); Unused << fos->Preallocate(fileSize); } // Convert to buffered stream nsCOMPtr<nsIOutputStream> out; rv = NS_NewBufferedOutputStream(getter_AddRefs(out), localOutFile.forget(), std::min(fileSize, MAX_BUFFER_SIZE)); NS_ENSURE_SUCCESS(rv, rv); rv = mFixedPrefixSet->WritePrefixes(out); NS_ENSURE_SUCCESS(rv, rv); rv = WritePrefixes(out); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; }
NS_IMETHODIMP nsXULFastLoadFileIO::GetOutputStream(nsIOutputStream** aResult) { if (! mOutputStream) { PRInt32 ioFlags = PR_WRONLY; if (mTruncateOutputFile) ioFlags |= PR_CREATE_FILE | PR_TRUNCATE; nsresult rv; nsCOMPtr<nsIOutputStream> fileOutput; rv = NS_NewLocalFileOutputStream(getter_AddRefs(fileOutput), mFile, ioFlags, 0644); if (NS_FAILED(rv)) return rv; rv = NS_NewBufferedOutputStream(getter_AddRefs(mOutputStream), fileOutput, XUL_SERIALIZATION_BUFFER_SIZE); if (NS_FAILED(rv)) return rv; } NS_ADDREF(*aResult = mOutputStream); return NS_OK; }
NS_IMETHODIMP nsXPCFastLoadIO::GetOutputStream(nsIOutputStream **_retval) { if (! mOutputStream) { PRInt32 ioFlags = PR_WRONLY; if (! mInputStream) { ioFlags |= PR_CREATE_FILE | PR_TRUNCATE; } nsCOMPtr<nsIOutputStream> fileOutput; nsresult rv = NS_NewLocalFileOutputStream(getter_AddRefs(fileOutput), mFile, ioFlags, 0644); NS_ENSURE_SUCCESS(rv, rv); rv = NS_NewBufferedOutputStream(getter_AddRefs(mOutputStream), fileOutput, XPC_SERIALIZATION_BUFFER_SIZE); NS_ENSURE_SUCCESS(rv, rv); } NS_ADDREF(*_retval = mOutputStream); return NS_OK; }
NS_IMETHOD Run() { nsresult rv; PRIntervalTime startTime = PR_IntervalNow(); PRIntervalTime endTime; nsCOMPtr<nsIInputStream> inStr; nsCOMPtr<nsIOutputStream> outStr; PRUint32 copyCount = 0; // Open the input stream: nsCOMPtr<nsIInputStream> fileIn; rv = NS_NewLocalFileInputStream(getter_AddRefs(fileIn), mInPath); if (NS_FAILED(rv)) return rv; rv = NS_NewBufferedInputStream(getter_AddRefs(inStr), fileIn, 65535); if (NS_FAILED(rv)) return rv; // Open the output stream: nsCOMPtr<nsIOutputStream> fileOut; rv = NS_NewLocalFileOutputStream(getter_AddRefs(fileOut), mOutPath, PR_CREATE_FILE | PR_WRONLY | PR_TRUNCATE, 0664); if (NS_FAILED(rv)) return rv; rv = NS_NewBufferedOutputStream(getter_AddRefs(outStr), fileOut, 65535); if (NS_FAILED(rv)) return rv; // Copy from one to the other rv = Copy(inStr, outStr, mBuffer, mBufferSize, ©Count); if (NS_FAILED(rv)) return rv; endTime = PR_IntervalNow(); gTimeSampler.AddTime(endTime - startTime); return rv; }
NS_IMETHODIMP AsyncEncodeAndWriteIcon::Run() { NS_PRECONDITION(!NS_IsMainThread(), "Should not be called on the main thread."); // Get the recommended icon width and height, or if failure to obtain // these settings, fall back to 16x16 ICOs. These values can be different // if the user has a different DPI setting other than 100%. // Windows would scale the 16x16 icon themselves, but it's better // we let our ICO encoder do it. nsCOMPtr<nsIInputStream> iconStream; nsRefPtr<imgIEncoder> encoder = do_CreateInstance("@mozilla.org/image/encoder;2?" "type=image/vnd.microsoft.icon"); NS_ENSURE_TRUE(encoder, NS_ERROR_FAILURE); nsresult rv = encoder->InitFromData(mBuffer, mBufferLength, mWidth, mHeight, mStride, imgIEncoder::INPUT_FORMAT_HOSTARGB, EmptyString()); NS_ENSURE_SUCCESS(rv, rv); CallQueryInterface(encoder.get(), getter_AddRefs(iconStream)); if (!iconStream) { return NS_ERROR_FAILURE; } NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIFile> icoFile = do_CreateInstance("@mozilla.org/file/local;1"); NS_ENSURE_TRUE(icoFile, NS_ERROR_FAILURE); rv = icoFile->InitWithPath(mIconPath); // Setup the output stream for the ICO file on disk nsCOMPtr<nsIOutputStream> outputStream; rv = NS_NewLocalFileOutputStream(getter_AddRefs(outputStream), icoFile); NS_ENSURE_SUCCESS(rv, rv); // Obtain the ICO buffer size from the re-encoded ICO stream uint64_t bufSize64; rv = iconStream->Available(&bufSize64); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(bufSize64 <= UINT32_MAX, NS_ERROR_FILE_TOO_BIG); uint32_t bufSize = (uint32_t)bufSize64; // Setup a buffered output stream from the stream object // so that we can simply use WriteFrom with the stream object nsCOMPtr<nsIOutputStream> bufferedOutputStream; rv = NS_NewBufferedOutputStream(getter_AddRefs(bufferedOutputStream), outputStream, bufSize); NS_ENSURE_SUCCESS(rv, rv); // Write out the icon stream to disk and make sure we wrote everything uint32_t wrote; rv = bufferedOutputStream->WriteFrom(iconStream, bufSize, &wrote); NS_ASSERTION(bufSize == wrote, "Icon wrote size should be equal to requested write size"); // Cleanup bufferedOutputStream->Close(); outputStream->Close(); if (mURLShortcut) { SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0); } return rv; }
NS_IMETHODIMP AsyncWriteIconToDisk::Run() { NS_PRECONDITION(!NS_IsMainThread(), "Should not be called on the main thread."); // Convert the obtained favicon data to an input stream nsCOMPtr<nsIInputStream> stream; nsresult rv = NS_NewByteInputStream(getter_AddRefs(stream), reinterpret_cast<const char*>(mBuffer.get()), mBufferLength, NS_ASSIGNMENT_DEPEND); NS_ENSURE_SUCCESS(rv, rv); // Decode the image from the format it was returned to us in (probably PNG) nsCOMPtr<imgIContainer> container; nsCOMPtr<imgITools> imgtool = do_CreateInstance("@mozilla.org/image/tools;1"); rv = imgtool->DecodeImageData(stream, mMimeTypeOfInputData, getter_AddRefs(container)); NS_ENSURE_SUCCESS(rv, rv); // Get the recommended icon width and height, or if failure to obtain // these settings, fall back to 16x16 ICOs. These values can be different // if the user has a different DPI setting other than 100%. // Windows would scale the 16x16 icon themselves, but it's better // we let our ICO encoder do it. PRInt32 systemIconWidth = GetSystemMetrics(SM_CXSMICON); PRInt32 systemIconHeight = GetSystemMetrics(SM_CYSMICON); if (systemIconWidth == 0 || systemIconHeight == 0) { systemIconWidth = 16; systemIconHeight = 16; } // Scale the image to the needed size and in ICO format mMimeTypeOfInputData.AssignLiteral("image/vnd.microsoft.icon"); nsCOMPtr<nsIInputStream> iconStream; rv = imgtool->EncodeScaledImage(container, mMimeTypeOfInputData, systemIconWidth, systemIconHeight, EmptyString(), getter_AddRefs(iconStream)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsILocalFile> icoFile = do_CreateInstance("@mozilla.org/file/local;1"); NS_ENSURE_TRUE(icoFile, NS_ERROR_FAILURE); rv = icoFile->InitWithPath(mIconPath); // Setup the output stream for the ICO file on disk nsCOMPtr<nsIOutputStream> outputStream; rv = NS_NewLocalFileOutputStream(getter_AddRefs(outputStream), icoFile); NS_ENSURE_SUCCESS(rv, rv); // Obtain the ICO buffer size from the re-encoded ICO stream PRUint32 bufSize; rv = iconStream->Available(&bufSize); NS_ENSURE_SUCCESS(rv, rv); // Setup a buffered output stream from the stream object // so that we can simply use WriteFrom with the stream object nsCOMPtr<nsIOutputStream> bufferedOutputStream; rv = NS_NewBufferedOutputStream(getter_AddRefs(bufferedOutputStream), outputStream, bufSize); NS_ENSURE_SUCCESS(rv, rv); // Write out the icon stream to disk and make sure we wrote everything PRUint32 wrote; rv = bufferedOutputStream->WriteFrom(iconStream, bufSize, &wrote); NS_ASSERTION(bufSize == wrote, "Icon wrote size should be equal to requested write size"); // Cleanup bufferedOutputStream->Close(); outputStream->Close(); return rv; }
NS_IMETHODIMP AsyncWriteIconToDisk::Run() { NS_PRECONDITION(!NS_IsMainThread(), "Should not be called on the main thread."); // Convert the obtained favicon data to an input stream nsCOMPtr<nsIInputStream> stream; nsresult rv = NS_NewByteInputStream(getter_AddRefs(stream), reinterpret_cast<const char*>(mBuffer.get()), mBufferLength, NS_ASSIGNMENT_DEPEND); NS_ENSURE_SUCCESS(rv, rv); // Decode the image from the format it was returned to us in (probably PNG) nsCOMPtr<imgIContainer> container; nsCOMPtr<imgITools> imgtool = do_CreateInstance("@mozilla.org/image/tools;1"); rv = imgtool->DecodeImageData(stream, mMimeTypeOfInputData, getter_AddRefs(container)); NS_ENSURE_SUCCESS(rv, rv); // Get the recommended icon width and height, or if failure to obtain // these settings, fall back to 16x16 ICOs. These values can be different // if the user has a different DPI setting other than 100%. // Windows would scale the 16x16 icon themselves, but it's better // we let our ICO encoder do it. nsCOMPtr<nsIInputStream> iconStream; if (!mURLShortcut) { int32_t systemIconWidth = GetSystemMetrics(SM_CXSMICON); int32_t systemIconHeight = GetSystemMetrics(SM_CYSMICON); if ((systemIconWidth == 0 || systemIconHeight == 0)) { systemIconWidth = 16; systemIconHeight = 16; } // Scale the image to the needed size and in ICO format mMimeTypeOfInputData.AssignLiteral("image/vnd.microsoft.icon"); rv = imgtool->EncodeScaledImage(container, mMimeTypeOfInputData, systemIconWidth, systemIconHeight, EmptyString(), getter_AddRefs(iconStream)); } else { nsRefPtr<gfxASurface> s; rv = container->GetFrame(imgIContainer::FRAME_FIRST, 0, getter_AddRefs(s)); NS_ENSURE_SUCCESS(rv, rv); gfxImageSurface* surface = new gfxImageSurface(gfxIntSize(48, 48), gfxImageSurface::ImageFormatARGB32); gfxContext context(surface); context.SetOperator(gfxContext::OPERATOR_SOURCE); context.SetColor(gfxRGBA(1, 1, 1, 1)); context.Rectangle(gfxRect(0, 0, 48, 48)); context.Fill(); context.Translate(gfxPoint(16, 16)); context.SetOperator(gfxContext::OPERATOR_OVER); context.DrawSurface(s, gfxSize(16, 16)); gfxIntSize size = surface->GetSize(); nsRefPtr<imgIEncoder> encoder = do_CreateInstance("@mozilla.org/image/encoder;2?" "type=image/vnd.microsoft.icon"); NS_ENSURE_TRUE(encoder, NS_ERROR_FAILURE); rv = encoder->InitFromData(surface->Data(), surface->Stride() * size.height, size.width, size.height, surface->Stride(), imgIEncoder::INPUT_FORMAT_HOSTARGB, EmptyString()); NS_ENSURE_SUCCESS(rv, rv); CallQueryInterface(encoder.get(), getter_AddRefs(iconStream)); if (!iconStream) { return NS_ERROR_FAILURE; } } NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIFile> icoFile = do_CreateInstance("@mozilla.org/file/local;1"); NS_ENSURE_TRUE(icoFile, NS_ERROR_FAILURE); rv = icoFile->InitWithPath(mIconPath); // Setup the output stream for the ICO file on disk nsCOMPtr<nsIOutputStream> outputStream; rv = NS_NewLocalFileOutputStream(getter_AddRefs(outputStream), icoFile); NS_ENSURE_SUCCESS(rv, rv); // Obtain the ICO buffer size from the re-encoded ICO stream uint64_t bufSize64; rv = iconStream->Available(&bufSize64); NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_TRUE(bufSize64 <= UINT32_MAX, NS_ERROR_FILE_TOO_BIG); uint32_t bufSize = (uint32_t)bufSize64; // Setup a buffered output stream from the stream object // so that we can simply use WriteFrom with the stream object nsCOMPtr<nsIOutputStream> bufferedOutputStream; rv = NS_NewBufferedOutputStream(getter_AddRefs(bufferedOutputStream), outputStream, bufSize); NS_ENSURE_SUCCESS(rv, rv); // Write out the icon stream to disk and make sure we wrote everything uint32_t wrote; rv = bufferedOutputStream->WriteFrom(iconStream, bufSize, &wrote); NS_ASSERTION(bufSize == wrote, "Icon wrote size should be equal to requested write size"); // Cleanup bufferedOutputStream->Close(); outputStream->Close(); if (mURLShortcut) { SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0); } return rv; }
nsresult CreateFileTask::Work() { class AutoClose { public: explicit AutoClose(nsIOutputStream* aStream) : mStream(aStream) { MOZ_ASSERT(aStream); } ~AutoClose() { mStream->Close(); } private: nsCOMPtr<nsIOutputStream> mStream; }; MOZ_ASSERT(XRE_IsParentProcess(), "Only call from parent process!"); MOZ_ASSERT(!NS_IsMainThread(), "Only call on worker thread!"); if (mFileSystem->IsShutdown()) { return NS_ERROR_FAILURE; } nsCOMPtr<nsIFile> file = mFileSystem->GetLocalFile(mTargetRealPath); if (!file) { return NS_ERROR_DOM_FILESYSTEM_INVALID_PATH_ERR; } if (!mFileSystem->IsSafeFile(file)) { return NS_ERROR_DOM_SECURITY_ERR; } bool exists = false; nsresult rv = file->Exists(&exists); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } if (exists) { bool isFile = false; rv = file->IsFile(&isFile); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } if (!isFile) { return NS_ERROR_DOM_FILESYSTEM_TYPE_MISMATCH_ERR; } if (!mReplace) { return NS_ERROR_DOM_FILESYSTEM_PATH_EXISTS_ERR; } // Remove the old file before creating. rv = file->Remove(false); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } rv = file->Create(nsIFile::NORMAL_FILE_TYPE, 0600); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } nsCOMPtr<nsIOutputStream> outputStream; rv = NS_NewLocalFileOutputStream(getter_AddRefs(outputStream), file); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } AutoClose acOutputStream(outputStream); nsCOMPtr<nsIOutputStream> bufferedOutputStream; rv = NS_NewBufferedOutputStream(getter_AddRefs(bufferedOutputStream), outputStream, sOutputBufferSize); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } AutoClose acBufferedOutputStream(bufferedOutputStream); if (mBlobStream) { // Write the file content from blob data. uint64_t bufSize = 0; rv = mBlobStream->Available(&bufSize); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } while (bufSize && !mFileSystem->IsShutdown()) { uint32_t written = 0; uint32_t writeSize = bufSize < UINT32_MAX ? bufSize : UINT32_MAX; rv = bufferedOutputStream->WriteFrom(mBlobStream, writeSize, &written); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } bufSize -= written; } mBlobStream->Close(); mBlobStream = nullptr; if (mFileSystem->IsShutdown()) { return NS_ERROR_FAILURE; } mTargetBlobImpl = new BlobImplFile(file); return NS_OK; } // Write file content from array data. uint32_t written; rv = bufferedOutputStream->Write( reinterpret_cast<char*>(mArrayData.Elements()), mArrayData.Length(), &written); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } if (mArrayData.Length() != written) { return NS_ERROR_DOM_FILESYSTEM_UNKNOWN_ERR; } mTargetBlobImpl = new BlobImplFile(file); return NS_OK; }
nsresult nsPrefService::WritePrefFile(nsIFile* aFile) { const char outHeader[] = "# Mozilla User Preferences" NS_LINEBREAK NS_LINEBREAK "/* Do not edit this file." NS_LINEBREAK " *" NS_LINEBREAK " * If you make changes to this file while the application is running," NS_LINEBREAK " * the changes will be overwritten when the application exits." NS_LINEBREAK " *" NS_LINEBREAK " * To make a manual change to preferences, you can visit the URL about:config" NS_LINEBREAK " * For more information, see http://www.mozilla.org/unix/customizing.html#prefs" NS_LINEBREAK " */" NS_LINEBREAK NS_LINEBREAK; nsCOMPtr<nsIOutputStream> outStreamSink; nsCOMPtr<nsIOutputStream> outStream; PRUint32 writeAmount; nsresult rv; if (!gHashTable.ops) return NS_ERROR_NOT_INITIALIZED; // execute a "safe" save by saving through a tempfile rv = NS_NewSafeLocalFileOutputStream(getter_AddRefs(outStreamSink), aFile, -1, 0600); if (NS_FAILED(rv)) return rv; rv = NS_NewBufferedOutputStream(getter_AddRefs(outStream), outStreamSink, 4096); if (NS_FAILED(rv)) return rv; char** valueArray = (char **)PR_Calloc(sizeof(char *), gHashTable.entryCount); if (!valueArray) return NS_ERROR_OUT_OF_MEMORY; pref_saveArgs saveArgs; saveArgs.prefArray = valueArray; saveArgs.saveTypes = SAVE_ALL; // get the lines that we're supposed to be writing to the file PL_DHashTableEnumerate(&gHashTable, pref_savePref, &saveArgs); /* Sort the preferences to make a readable file on disk */ NS_QuickSort(valueArray, gHashTable.entryCount, sizeof(char *), pref_CompareStrings, NULL); // write out the file header outStream->Write(outHeader, sizeof(outHeader) - 1, &writeAmount); char** walker = valueArray; for (PRUint32 valueIdx = 0; valueIdx < gHashTable.entryCount; valueIdx++, walker++) { if (*walker) { outStream->Write(*walker, strlen(*walker), &writeAmount); outStream->Write(NS_LINEBREAK, NS_LINEBREAK_LEN, &writeAmount); NS_Free(*walker); } } PR_Free(valueArray); // tell the safe output stream to overwrite the real prefs file // (it'll abort if there were any errors during writing) nsCOMPtr<nsISafeOutputStream> safeStream = do_QueryInterface(outStream); NS_ASSERTION(safeStream, "expected a safe output stream!"); if (safeStream) { rv = safeStream->Finish(); if (NS_FAILED(rv)) { NS_WARNING("failed to save prefs file! possible dataloss"); return rv; } } gDirty = PR_FALSE; return NS_OK; }