Bug 1305801 - Part 1: Implement variable length PrefixSet class for Safe Browsing v4. r=francois, r=gcp
MozReview-Commit-ID: 49XX1Gu1XqX
This commit is contained in:
@@ -338,10 +338,55 @@ nsUrlClassifierPrefixSet::LoadFromFile(nsIFile* aFile)
|
||||
// Convert to buffered stream
|
||||
nsCOMPtr<nsIInputStream> in = NS_BufferInputStream(localInFile, bufferSize);
|
||||
|
||||
rv = LoadPrefixes(in);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsUrlClassifierPrefixSet::StoreToFile(nsIFile* 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;
|
||||
|
||||
// Preallocate the file storage
|
||||
{
|
||||
nsCOMPtr<nsIFileOutputStream> fos(do_QueryInterface(localOutFile));
|
||||
Telemetry::AutoTimer<Telemetry::URLCLASSIFIER_PS_FALLOCATE_TIME> timer;
|
||||
|
||||
fileSize = CalculatePreallocateSize();
|
||||
|
||||
// Ignore failure, the preallocation is a hint and we write out the entire
|
||||
// file later on
|
||||
Unused << fos->Preallocate(fileSize);
|
||||
}
|
||||
|
||||
// Convert to buffered stream
|
||||
nsCOMPtr<nsIOutputStream> out =
|
||||
NS_BufferOutputStream(localOutFile, std::min(fileSize, MAX_BUFFER_SIZE));
|
||||
|
||||
rv = WritePrefixes(out);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
LOG(("Saving PrefixSet successful\n"));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsUrlClassifierPrefixSet::LoadPrefixes(nsIInputStream* in)
|
||||
{
|
||||
uint32_t magic;
|
||||
uint32_t read;
|
||||
|
||||
rv = in->Read(reinterpret_cast<char*>(&magic), sizeof(uint32_t), &read);
|
||||
nsresult rv = in->Read(reinterpret_cast<char*>(&magic), sizeof(uint32_t), &read);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
NS_ENSURE_TRUE(read == sizeof(uint32_t), NS_ERROR_FAILURE);
|
||||
|
||||
@@ -411,40 +456,23 @@ nsUrlClassifierPrefixSet::LoadFromFile(nsIFile* aFile)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsUrlClassifierPrefixSet::StoreToFile(nsIFile* aFile)
|
||||
uint32_t
|
||||
nsUrlClassifierPrefixSet::CalculatePreallocateSize()
|
||||
{
|
||||
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;
|
||||
|
||||
// Preallocate the file storage
|
||||
{
|
||||
nsCOMPtr<nsIFileOutputStream> fos(do_QueryInterface(localOutFile));
|
||||
Telemetry::AutoTimer<Telemetry::URLCLASSIFIER_PS_FALLOCATE_TIME> timer;
|
||||
fileSize = 4 * sizeof(uint32_t);
|
||||
uint32_t deltas = mTotalPrefixes - mIndexPrefixes.Length();
|
||||
fileSize += 2 * mIndexPrefixes.Length() * sizeof(uint32_t);
|
||||
fileSize += deltas * sizeof(uint16_t);
|
||||
|
||||
// Ignore failure, the preallocation is a hint and we write out the entire
|
||||
// file later on
|
||||
Unused << fos->Preallocate(fileSize);
|
||||
}
|
||||
|
||||
// Convert to buffered stream
|
||||
nsCOMPtr<nsIOutputStream> out =
|
||||
NS_BufferOutputStream(localOutFile, std::min(fileSize, MAX_BUFFER_SIZE));
|
||||
uint32_t fileSize = 4 * sizeof(uint32_t);
|
||||
uint32_t deltas = mTotalPrefixes - mIndexPrefixes.Length();
|
||||
fileSize += 2 * mIndexPrefixes.Length() * sizeof(uint32_t);
|
||||
fileSize += deltas * sizeof(uint16_t);
|
||||
return fileSize;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsUrlClassifierPrefixSet::WritePrefixes(nsIOutputStream* out)
|
||||
{
|
||||
uint32_t written;
|
||||
uint32_t writelen = sizeof(uint32_t);
|
||||
uint32_t magic = PREFIXSET_VERSION_MAGIC;
|
||||
rv = out->Write(reinterpret_cast<char*>(&magic), writelen, &written);
|
||||
nsresult rv = out->Write(reinterpret_cast<char*>(&magic), writelen, &written);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
NS_ENSURE_TRUE(written == writelen, NS_ERROR_FAILURE);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user