diff -r 000000000000 -r 6474c204b198 dom/devicestorage/DeviceStorageRequestChild.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/devicestorage/DeviceStorageRequestChild.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,221 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +#include "DeviceStorageRequestChild.h" +#include "DeviceStorageFileDescriptor.h" +#include "nsDeviceStorage.h" +#include "nsDOMFile.h" +#include "mozilla/dom/ipc/Blob.h" + +namespace mozilla { +namespace dom { +namespace devicestorage { + +DeviceStorageRequestChild::DeviceStorageRequestChild() + : mCallback(nullptr) +{ + MOZ_COUNT_CTOR(DeviceStorageRequestChild); +} + +DeviceStorageRequestChild::DeviceStorageRequestChild(DOMRequest* aRequest, + DeviceStorageFile* aDSFile) + : mRequest(aRequest) + , mDSFile(aDSFile) + , mCallback(nullptr) +{ + MOZ_ASSERT(aRequest); + MOZ_ASSERT(aDSFile); + MOZ_COUNT_CTOR(DeviceStorageRequestChild); +} + +DeviceStorageRequestChild::DeviceStorageRequestChild(DOMRequest* aRequest, + DeviceStorageFile* aDSFile, + DeviceStorageFileDescriptor* aDSFileDescriptor) + : mRequest(aRequest) + , mDSFile(aDSFile) + , mDSFileDescriptor(aDSFileDescriptor) + , mCallback(nullptr) +{ + MOZ_ASSERT(aRequest); + MOZ_ASSERT(aDSFile); + MOZ_ASSERT(aDSFileDescriptor); + MOZ_COUNT_CTOR(DeviceStorageRequestChild); +} + +DeviceStorageRequestChild::~DeviceStorageRequestChild() { + MOZ_COUNT_DTOR(DeviceStorageRequestChild); +} + +bool +DeviceStorageRequestChild:: + Recv__delete__(const DeviceStorageResponseValue& aValue) +{ + if (mCallback) { + mCallback->RequestComplete(); + mCallback = nullptr; + } + + nsCOMPtr window = mRequest->GetOwner(); + if (!window) { + return true; + } + + switch (aValue.type()) { + + case DeviceStorageResponseValue::TErrorResponse: + { + ErrorResponse r = aValue; + mRequest->FireError(r.error()); + break; + } + + case DeviceStorageResponseValue::TSuccessResponse: + { + nsString fullPath; + mDSFile->GetFullPath(fullPath); + AutoJSContext cx; + JS::Rooted result(cx, + StringToJsval(window, fullPath)); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TFileDescriptorResponse: + { + FileDescriptorResponse r = aValue; + + nsString fullPath; + mDSFile->GetFullPath(fullPath); + AutoJSContext cx; + JS::Rooted result(cx, + StringToJsval(window, fullPath)); + + mDSFileDescriptor->mDSFile = mDSFile; + mDSFileDescriptor->mFileDescriptor = r.fileDescriptor(); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TBlobResponse: + { + BlobResponse r = aValue; + BlobChild* actor = static_cast(r.blobChild()); + nsCOMPtr blob = actor->GetBlob(); + + nsCOMPtr file = do_QueryInterface(blob); + AutoJSContext cx; + JS::Rooted result(cx, + InterfaceToJsval(window, file, &NS_GET_IID(nsIDOMFile))); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TFreeSpaceStorageResponse: + { + FreeSpaceStorageResponse r = aValue; + AutoJSContext cx; + JS::Rooted result(cx, JS_NumberValue(double(r.freeBytes()))); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TUsedSpaceStorageResponse: + { + UsedSpaceStorageResponse r = aValue; + AutoJSContext cx; + JS::Rooted result(cx, JS_NumberValue(double(r.usedBytes()))); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TAvailableStorageResponse: + { + AvailableStorageResponse r = aValue; + AutoJSContext cx; + JS::Rooted result( + cx, StringToJsval(window, r.mountState())); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TStorageStatusResponse: + { + StorageStatusResponse r = aValue; + AutoJSContext cx; + JS::Rooted result( + cx, StringToJsval(window, r.storageStatus())); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TFormatStorageResponse: + { + FormatStorageResponse r = aValue; + AutoJSContext cx; + JS::Rooted result( + cx, StringToJsval(window, r.mountState())); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TMountStorageResponse: + { + MountStorageResponse r = aValue; + AutoJSContext cx; + JS::Rooted result( + cx, StringToJsval(window, r.storageStatus())); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TUnmountStorageResponse: + { + UnmountStorageResponse r = aValue; + AutoJSContext cx; + JS::Rooted result( + cx, StringToJsval(window, r.storageStatus())); + mRequest->FireSuccess(result); + break; + } + + case DeviceStorageResponseValue::TEnumerationResponse: + { + EnumerationResponse r = aValue; + nsDOMDeviceStorageCursor* cursor + = static_cast(mRequest.get()); + + uint32_t count = r.paths().Length(); + for (uint32_t i = 0; i < count; i++) { + nsRefPtr dsf + = new DeviceStorageFile(r.type(), r.paths()[i].storageName(), + r.rootdir(), r.paths()[i].name()); + cursor->mFiles.AppendElement(dsf); + } + + nsRefPtr event = new ContinueCursorEvent(cursor); + event->Continue(); + break; + } + + default: + { + NS_RUNTIMEABORT("not reached"); + break; + } + } + return true; +} + +void +DeviceStorageRequestChild:: + SetCallback(DeviceStorageRequestChildCallback *aCallback) +{ + mCallback = aCallback; +} + +} // namespace devicestorage +} // namespace dom +} // namespace mozilla