1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/file/MetadataHelper.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,96 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim: set ts=2 et sw=2 tw=80: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.8 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "MetadataHelper.h" 1.11 + 1.12 +#include "LockedFile.h" 1.13 + 1.14 +USING_FILE_NAMESPACE 1.15 + 1.16 +nsresult 1.17 +MetadataHelper::DoAsyncRun(nsISupports* aStream) 1.18 +{ 1.19 + bool readWrite = mLockedFile->mMode == FileMode::Readwrite; 1.20 + 1.21 + nsRefPtr<AsyncMetadataGetter> getter = 1.22 + new AsyncMetadataGetter(aStream, mParams, readWrite); 1.23 + 1.24 + nsresult rv = getter->AsyncWork(this, nullptr); 1.25 + NS_ENSURE_SUCCESS(rv, rv); 1.26 + 1.27 + return NS_OK; 1.28 +} 1.29 + 1.30 +nsresult 1.31 +MetadataHelper::GetSuccessResult(JSContext* aCx, 1.32 + JS::MutableHandle<JS::Value> aVal) 1.33 +{ 1.34 + JS::Rooted<JSObject*> obj(aCx, JS_NewObject(aCx, nullptr, JS::NullPtr(), 1.35 + JS::NullPtr())); 1.36 + NS_ENSURE_TRUE(obj, NS_ERROR_OUT_OF_MEMORY); 1.37 + 1.38 + if (mParams->SizeRequested()) { 1.39 + JS::Rooted<JS::Value> val(aCx, JS_NumberValue(mParams->Size())); 1.40 + 1.41 + if (!JS_DefineProperty(aCx, obj, "size", val, JSPROP_ENUMERATE)) { 1.42 + return NS_ERROR_FAILURE; 1.43 + } 1.44 + } 1.45 + 1.46 + if (mParams->LastModifiedRequested()) { 1.47 + double msec = mParams->LastModified(); 1.48 + JSObject *date = JS_NewDateObjectMsec(aCx, msec); 1.49 + NS_ENSURE_TRUE(date, NS_ERROR_OUT_OF_MEMORY); 1.50 + 1.51 + JS::Rooted<JS::Value> dateRoot(aCx, JS::ObjectValue(*date)); 1.52 + if (!JS_DefineProperty(aCx, obj, "lastModified", dateRoot, 1.53 + JSPROP_ENUMERATE)) { 1.54 + return NS_ERROR_FAILURE; 1.55 + } 1.56 + } 1.57 + 1.58 + aVal.setObject(*obj); 1.59 + return NS_OK; 1.60 +} 1.61 + 1.62 +nsresult 1.63 +MetadataHelper::AsyncMetadataGetter::DoStreamWork(nsISupports* aStream) 1.64 +{ 1.65 + nsresult rv; 1.66 + 1.67 + if (mReadWrite) { 1.68 + // Force a flush (so all pending writes are flushed to the disk and file 1.69 + // metadata is updated too). 1.70 + 1.71 + nsCOMPtr<nsIOutputStream> ostream = do_QueryInterface(aStream); 1.72 + NS_ASSERTION(ostream, "This should always succeed!"); 1.73 + 1.74 + rv = ostream->Flush(); 1.75 + NS_ENSURE_SUCCESS(rv, rv); 1.76 + } 1.77 + 1.78 + nsCOMPtr<nsIFileMetadata> metadata = do_QueryInterface(aStream); 1.79 + 1.80 + if (mParams->SizeRequested()) { 1.81 + int64_t size; 1.82 + rv = metadata->GetSize(&size); 1.83 + NS_ENSURE_SUCCESS(rv, rv); 1.84 + 1.85 + NS_ENSURE_TRUE(size >= 0, NS_ERROR_FAILURE); 1.86 + 1.87 + mParams->mSize = uint64_t(size); 1.88 + } 1.89 + 1.90 + if (mParams->LastModifiedRequested()) { 1.91 + int64_t lastModified; 1.92 + rv = metadata->GetLastModified(&lastModified); 1.93 + NS_ENSURE_SUCCESS(rv, rv); 1.94 + 1.95 + mParams->mLastModified = lastModified; 1.96 + } 1.97 + 1.98 + return NS_OK; 1.99 +}