1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/devicestorage/DeviceStorageRequestParent.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1001 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.7 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "DeviceStorageRequestParent.h" 1.10 +#include "nsDOMFile.h" 1.11 +#include "nsIMIMEService.h" 1.12 +#include "nsCExternalHandlerService.h" 1.13 +#include "mozilla/unused.h" 1.14 +#include "mozilla/dom/ipc/Blob.h" 1.15 +#include "ContentParent.h" 1.16 +#include "nsProxyRelease.h" 1.17 +#include "AppProcessChecker.h" 1.18 +#include "mozilla/Preferences.h" 1.19 +#include "nsNetCID.h" 1.20 + 1.21 +namespace mozilla { 1.22 +namespace dom { 1.23 +namespace devicestorage { 1.24 + 1.25 +DeviceStorageRequestParent::DeviceStorageRequestParent( 1.26 + const DeviceStorageParams& aParams) 1.27 + : mParams(aParams) 1.28 + , mMutex("DeviceStorageRequestParent::mMutex") 1.29 + , mActorDestoryed(false) 1.30 +{ 1.31 + MOZ_COUNT_CTOR(DeviceStorageRequestParent); 1.32 + 1.33 + DebugOnly<DeviceStorageUsedSpaceCache*> usedSpaceCache 1.34 + = DeviceStorageUsedSpaceCache::CreateOrGet(); 1.35 + MOZ_ASSERT(usedSpaceCache); 1.36 +} 1.37 + 1.38 +void 1.39 +DeviceStorageRequestParent::Dispatch() 1.40 +{ 1.41 + switch (mParams.type()) { 1.42 + case DeviceStorageParams::TDeviceStorageAddParams: 1.43 + { 1.44 + DeviceStorageAddParams p = mParams; 1.45 + 1.46 + nsRefPtr<DeviceStorageFile> dsf = 1.47 + new DeviceStorageFile(p.type(), p.storageName(), p.relpath()); 1.48 + 1.49 + BlobParent* bp = static_cast<BlobParent*>(p.blobParent()); 1.50 + nsCOMPtr<nsIDOMBlob> blob = bp->GetBlob(); 1.51 + 1.52 + nsCOMPtr<nsIInputStream> stream; 1.53 + blob->GetInternalStream(getter_AddRefs(stream)); 1.54 + 1.55 + nsRefPtr<CancelableRunnable> r = new WriteFileEvent(this, dsf, stream); 1.56 + 1.57 + nsCOMPtr<nsIEventTarget> target 1.58 + = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); 1.59 + MOZ_ASSERT(target); 1.60 + target->Dispatch(r, NS_DISPATCH_NORMAL); 1.61 + break; 1.62 + } 1.63 + 1.64 + case DeviceStorageParams::TDeviceStorageCreateFdParams: 1.65 + { 1.66 + DeviceStorageCreateFdParams p = mParams; 1.67 + 1.68 + nsRefPtr<DeviceStorageFile> dsf = 1.69 + new DeviceStorageFile(p.type(), p.storageName(), p.relpath()); 1.70 + 1.71 + nsRefPtr<CancelableRunnable> r = new CreateFdEvent(this, dsf); 1.72 + 1.73 + nsCOMPtr<nsIEventTarget> target 1.74 + = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); 1.75 + MOZ_ASSERT(target); 1.76 + target->Dispatch(r, NS_DISPATCH_NORMAL); 1.77 + break; 1.78 + } 1.79 + 1.80 + case DeviceStorageParams::TDeviceStorageGetParams: 1.81 + { 1.82 + DeviceStorageGetParams p = mParams; 1.83 + nsRefPtr<DeviceStorageFile> dsf = 1.84 + new DeviceStorageFile(p.type(), p.storageName(), 1.85 + p.rootDir(), p.relpath()); 1.86 + nsRefPtr<CancelableRunnable> r = new ReadFileEvent(this, dsf); 1.87 + 1.88 + nsCOMPtr<nsIEventTarget> target 1.89 + = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); 1.90 + MOZ_ASSERT(target); 1.91 + target->Dispatch(r, NS_DISPATCH_NORMAL); 1.92 + break; 1.93 + } 1.94 + 1.95 + case DeviceStorageParams::TDeviceStorageDeleteParams: 1.96 + { 1.97 + DeviceStorageDeleteParams p = mParams; 1.98 + 1.99 + nsRefPtr<DeviceStorageFile> dsf = 1.100 + new DeviceStorageFile(p.type(), p.storageName(), p.relpath()); 1.101 + nsRefPtr<CancelableRunnable> r = new DeleteFileEvent(this, dsf); 1.102 + 1.103 + nsCOMPtr<nsIEventTarget> target 1.104 + = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); 1.105 + MOZ_ASSERT(target); 1.106 + target->Dispatch(r, NS_DISPATCH_NORMAL); 1.107 + break; 1.108 + } 1.109 + 1.110 + case DeviceStorageParams::TDeviceStorageFreeSpaceParams: 1.111 + { 1.112 + DeviceStorageFreeSpaceParams p = mParams; 1.113 + 1.114 + nsRefPtr<DeviceStorageFile> dsf = 1.115 + new DeviceStorageFile(p.type(), p.storageName()); 1.116 + nsRefPtr<FreeSpaceFileEvent> r = new FreeSpaceFileEvent(this, dsf); 1.117 + 1.118 + nsCOMPtr<nsIEventTarget> target 1.119 + = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); 1.120 + MOZ_ASSERT(target); 1.121 + target->Dispatch(r, NS_DISPATCH_NORMAL); 1.122 + break; 1.123 + } 1.124 + 1.125 + case DeviceStorageParams::TDeviceStorageUsedSpaceParams: 1.126 + { 1.127 + DeviceStorageUsedSpaceCache* usedSpaceCache 1.128 + = DeviceStorageUsedSpaceCache::CreateOrGet(); 1.129 + MOZ_ASSERT(usedSpaceCache); 1.130 + 1.131 + DeviceStorageUsedSpaceParams p = mParams; 1.132 + 1.133 + nsRefPtr<DeviceStorageFile> dsf = 1.134 + new DeviceStorageFile(p.type(), p.storageName()); 1.135 + nsRefPtr<UsedSpaceFileEvent> r = new UsedSpaceFileEvent(this, dsf); 1.136 + 1.137 + usedSpaceCache->Dispatch(r); 1.138 + break; 1.139 + } 1.140 + 1.141 + case DeviceStorageParams::TDeviceStorageAvailableParams: 1.142 + { 1.143 + DeviceStorageAvailableParams p = mParams; 1.144 + 1.145 + nsRefPtr<DeviceStorageFile> dsf = 1.146 + new DeviceStorageFile(p.type(), p.storageName()); 1.147 + nsRefPtr<PostAvailableResultEvent> r 1.148 + = new PostAvailableResultEvent(this, dsf); 1.149 + DebugOnly<nsresult> rv = NS_DispatchToMainThread(r); 1.150 + MOZ_ASSERT(NS_SUCCEEDED(rv)); 1.151 + break; 1.152 + } 1.153 + 1.154 + case DeviceStorageParams::TDeviceStorageStatusParams: 1.155 + { 1.156 + DeviceStorageStatusParams p = mParams; 1.157 + 1.158 + nsRefPtr<DeviceStorageFile> dsf = 1.159 + new DeviceStorageFile(p.type(), p.storageName()); 1.160 + nsRefPtr<PostStatusResultEvent> r 1.161 + = new PostStatusResultEvent(this, dsf); 1.162 + DebugOnly<nsresult> rv = NS_DispatchToMainThread(r); 1.163 + MOZ_ASSERT(NS_SUCCEEDED(rv)); 1.164 + break; 1.165 + } 1.166 + 1.167 + case DeviceStorageParams::TDeviceStorageFormatParams: 1.168 + { 1.169 + DeviceStorageFormatParams p = mParams; 1.170 + 1.171 + nsRefPtr<DeviceStorageFile> dsf = 1.172 + new DeviceStorageFile(p.type(), p.storageName()); 1.173 + nsRefPtr<PostFormatResultEvent> r 1.174 + = new PostFormatResultEvent(this, dsf); 1.175 + DebugOnly<nsresult> rv = NS_DispatchToMainThread(r); 1.176 + MOZ_ASSERT(NS_SUCCEEDED(rv)); 1.177 + break; 1.178 + } 1.179 + 1.180 + case DeviceStorageParams::TDeviceStorageMountParams: 1.181 + { 1.182 + DeviceStorageMountParams p = mParams; 1.183 + 1.184 + nsRefPtr<DeviceStorageFile> dsf = 1.185 + new DeviceStorageFile(p.type(), p.storageName()); 1.186 + nsRefPtr<PostMountResultEvent> r 1.187 + = new PostMountResultEvent(this, dsf); 1.188 + DebugOnly<nsresult> rv = NS_DispatchToMainThread(r); 1.189 + MOZ_ASSERT(NS_SUCCEEDED(rv)); 1.190 + break; 1.191 + } 1.192 + 1.193 + case DeviceStorageParams::TDeviceStorageUnmountParams: 1.194 + { 1.195 + DeviceStorageUnmountParams p = mParams; 1.196 + 1.197 + nsRefPtr<DeviceStorageFile> dsf = 1.198 + new DeviceStorageFile(p.type(), p.storageName()); 1.199 + nsRefPtr<PostUnmountResultEvent> r 1.200 + = new PostUnmountResultEvent(this, dsf); 1.201 + DebugOnly<nsresult> rv = NS_DispatchToMainThread(r); 1.202 + MOZ_ASSERT(NS_SUCCEEDED(rv)); 1.203 + break; 1.204 + } 1.205 + 1.206 + case DeviceStorageParams::TDeviceStorageEnumerationParams: 1.207 + { 1.208 + DeviceStorageEnumerationParams p = mParams; 1.209 + nsRefPtr<DeviceStorageFile> dsf 1.210 + = new DeviceStorageFile(p.type(), p.storageName(), 1.211 + p.rootdir(), NS_LITERAL_STRING("")); 1.212 + nsRefPtr<CancelableRunnable> r 1.213 + = new EnumerateFileEvent(this, dsf, p.since()); 1.214 + 1.215 + nsCOMPtr<nsIEventTarget> target 1.216 + = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID); 1.217 + MOZ_ASSERT(target); 1.218 + target->Dispatch(r, NS_DISPATCH_NORMAL); 1.219 + break; 1.220 + } 1.221 + default: 1.222 + { 1.223 + NS_RUNTIMEABORT("not reached"); 1.224 + break; 1.225 + } 1.226 + } 1.227 +} 1.228 + 1.229 +bool 1.230 +DeviceStorageRequestParent::EnsureRequiredPermissions( 1.231 + mozilla::dom::ContentParent* aParent) 1.232 +{ 1.233 + if (mozilla::Preferences::GetBool("device.storage.testing", false)) { 1.234 + return true; 1.235 + } 1.236 + 1.237 + nsString type; 1.238 + DeviceStorageRequestType requestType; 1.239 + 1.240 + switch (mParams.type()) 1.241 + { 1.242 + case DeviceStorageParams::TDeviceStorageAddParams: 1.243 + { 1.244 + DeviceStorageAddParams p = mParams; 1.245 + type = p.type(); 1.246 + requestType = DEVICE_STORAGE_REQUEST_CREATE; 1.247 + break; 1.248 + } 1.249 + 1.250 + case DeviceStorageParams::TDeviceStorageCreateFdParams: 1.251 + { 1.252 + DeviceStorageCreateFdParams p = mParams; 1.253 + type = p.type(); 1.254 + requestType = DEVICE_STORAGE_REQUEST_CREATEFD; 1.255 + break; 1.256 + } 1.257 + 1.258 + case DeviceStorageParams::TDeviceStorageGetParams: 1.259 + { 1.260 + DeviceStorageGetParams p = mParams; 1.261 + type = p.type(); 1.262 + requestType = DEVICE_STORAGE_REQUEST_READ; 1.263 + break; 1.264 + } 1.265 + 1.266 + case DeviceStorageParams::TDeviceStorageDeleteParams: 1.267 + { 1.268 + DeviceStorageDeleteParams p = mParams; 1.269 + type = p.type(); 1.270 + requestType = DEVICE_STORAGE_REQUEST_DELETE; 1.271 + break; 1.272 + } 1.273 + 1.274 + case DeviceStorageParams::TDeviceStorageFreeSpaceParams: 1.275 + { 1.276 + DeviceStorageFreeSpaceParams p = mParams; 1.277 + type = p.type(); 1.278 + requestType = DEVICE_STORAGE_REQUEST_FREE_SPACE; 1.279 + break; 1.280 + } 1.281 + 1.282 + case DeviceStorageParams::TDeviceStorageUsedSpaceParams: 1.283 + { 1.284 + DeviceStorageUsedSpaceParams p = mParams; 1.285 + type = p.type(); 1.286 + requestType = DEVICE_STORAGE_REQUEST_FREE_SPACE; 1.287 + break; 1.288 + } 1.289 + 1.290 + case DeviceStorageParams::TDeviceStorageAvailableParams: 1.291 + { 1.292 + DeviceStorageAvailableParams p = mParams; 1.293 + type = p.type(); 1.294 + requestType = DEVICE_STORAGE_REQUEST_AVAILABLE; 1.295 + break; 1.296 + } 1.297 + 1.298 + case DeviceStorageParams::TDeviceStorageStatusParams: 1.299 + { 1.300 + DeviceStorageStatusParams p = mParams; 1.301 + type = p.type(); 1.302 + requestType = DEVICE_STORAGE_REQUEST_STATUS; 1.303 + break; 1.304 + } 1.305 + 1.306 + case DeviceStorageParams::TDeviceStorageFormatParams: 1.307 + { 1.308 + DeviceStorageFormatParams p = mParams; 1.309 + type = p.type(); 1.310 + requestType = DEVICE_STORAGE_REQUEST_FORMAT; 1.311 + break; 1.312 + } 1.313 + 1.314 + case DeviceStorageParams::TDeviceStorageMountParams: 1.315 + { 1.316 + DeviceStorageMountParams p = mParams; 1.317 + type = p.type(); 1.318 + requestType = DEVICE_STORAGE_REQUEST_MOUNT; 1.319 + break; 1.320 + } 1.321 + 1.322 + case DeviceStorageParams::TDeviceStorageUnmountParams: 1.323 + { 1.324 + DeviceStorageUnmountParams p = mParams; 1.325 + type = p.type(); 1.326 + requestType = DEVICE_STORAGE_REQUEST_UNMOUNT; 1.327 + break; 1.328 + } 1.329 + 1.330 + case DeviceStorageParams::TDeviceStorageEnumerationParams: 1.331 + { 1.332 + DeviceStorageEnumerationParams p = mParams; 1.333 + type = p.type(); 1.334 + requestType = DEVICE_STORAGE_REQUEST_READ; 1.335 + break; 1.336 + } 1.337 + 1.338 + default: 1.339 + { 1.340 + return false; 1.341 + } 1.342 + } 1.343 + 1.344 + // The 'apps' type is special. We only want this exposed 1.345 + // if the caller has the "webapps-manage" permission. 1.346 + if (type.EqualsLiteral("apps")) { 1.347 + if (!AssertAppProcessPermission(aParent, "webapps-manage")) { 1.348 + return false; 1.349 + } 1.350 + } 1.351 + 1.352 + nsAutoCString permissionName; 1.353 + nsresult rv = DeviceStorageTypeChecker::GetPermissionForType(type, 1.354 + permissionName); 1.355 + if (NS_FAILED(rv)) { 1.356 + return false; 1.357 + } 1.358 + 1.359 + nsCString access; 1.360 + rv = DeviceStorageTypeChecker::GetAccessForRequest(requestType, access); 1.361 + if (NS_FAILED(rv)) { 1.362 + return false; 1.363 + } 1.364 + 1.365 + permissionName.AppendLiteral("-"); 1.366 + permissionName.Append(access); 1.367 + 1.368 + if (!AssertAppProcessPermission(aParent, permissionName.get())) { 1.369 + return false; 1.370 + } 1.371 + 1.372 + return true; 1.373 +} 1.374 + 1.375 +DeviceStorageRequestParent::~DeviceStorageRequestParent() 1.376 +{ 1.377 + MOZ_COUNT_DTOR(DeviceStorageRequestParent); 1.378 +} 1.379 + 1.380 +NS_IMPL_ADDREF(DeviceStorageRequestParent) 1.381 +NS_IMPL_RELEASE(DeviceStorageRequestParent) 1.382 + 1.383 +void 1.384 +DeviceStorageRequestParent::ActorDestroy(ActorDestroyReason) 1.385 +{ 1.386 + MutexAutoLock lock(mMutex); 1.387 + mActorDestoryed = true; 1.388 + int32_t count = mRunnables.Length(); 1.389 + for (int32_t index = 0; index < count; index++) { 1.390 + mRunnables[index]->Cancel(); 1.391 + } 1.392 +} 1.393 + 1.394 +DeviceStorageRequestParent::PostFreeSpaceResultEvent::PostFreeSpaceResultEvent( 1.395 + DeviceStorageRequestParent* aParent, 1.396 + uint64_t aFreeSpace) 1.397 + : CancelableRunnable(aParent) 1.398 + , mFreeSpace(aFreeSpace) 1.399 +{ 1.400 +} 1.401 + 1.402 +DeviceStorageRequestParent::PostFreeSpaceResultEvent:: 1.403 + ~PostFreeSpaceResultEvent() {} 1.404 + 1.405 +nsresult 1.406 +DeviceStorageRequestParent::PostFreeSpaceResultEvent::CancelableRun() { 1.407 + MOZ_ASSERT(NS_IsMainThread()); 1.408 + 1.409 + FreeSpaceStorageResponse response(mFreeSpace); 1.410 + unused << mParent->Send__delete__(mParent, response); 1.411 + return NS_OK; 1.412 +} 1.413 + 1.414 +DeviceStorageRequestParent::PostUsedSpaceResultEvent:: 1.415 + PostUsedSpaceResultEvent(DeviceStorageRequestParent* aParent, 1.416 + const nsAString& aType, 1.417 + uint64_t aUsedSpace) 1.418 + : CancelableRunnable(aParent) 1.419 + , mType(aType) 1.420 + , mUsedSpace(aUsedSpace) 1.421 +{ 1.422 +} 1.423 + 1.424 +DeviceStorageRequestParent::PostUsedSpaceResultEvent:: 1.425 + ~PostUsedSpaceResultEvent() {} 1.426 + 1.427 +nsresult 1.428 +DeviceStorageRequestParent::PostUsedSpaceResultEvent::CancelableRun() { 1.429 + MOZ_ASSERT(NS_IsMainThread()); 1.430 + 1.431 + UsedSpaceStorageResponse response(mUsedSpace); 1.432 + unused << mParent->Send__delete__(mParent, response); 1.433 + return NS_OK; 1.434 +} 1.435 + 1.436 +DeviceStorageRequestParent::PostErrorEvent:: 1.437 + PostErrorEvent(DeviceStorageRequestParent* aParent, const char* aError) 1.438 + : CancelableRunnable(aParent) 1.439 +{ 1.440 + CopyASCIItoUTF16(aError, mError); 1.441 +} 1.442 + 1.443 +DeviceStorageRequestParent::PostErrorEvent::~PostErrorEvent() {} 1.444 + 1.445 +nsresult 1.446 +DeviceStorageRequestParent::PostErrorEvent::CancelableRun() { 1.447 + MOZ_ASSERT(NS_IsMainThread()); 1.448 + 1.449 + ErrorResponse response(mError); 1.450 + unused << mParent->Send__delete__(mParent, response); 1.451 + return NS_OK; 1.452 +} 1.453 + 1.454 +DeviceStorageRequestParent::PostSuccessEvent:: 1.455 + PostSuccessEvent(DeviceStorageRequestParent* aParent) 1.456 + : CancelableRunnable(aParent) 1.457 +{ 1.458 +} 1.459 + 1.460 +DeviceStorageRequestParent::PostSuccessEvent::~PostSuccessEvent() {} 1.461 + 1.462 +nsresult 1.463 +DeviceStorageRequestParent::PostSuccessEvent::CancelableRun() { 1.464 + MOZ_ASSERT(NS_IsMainThread()); 1.465 + 1.466 + SuccessResponse response; 1.467 + unused << mParent->Send__delete__(mParent, response); 1.468 + return NS_OK; 1.469 +} 1.470 + 1.471 +DeviceStorageRequestParent::PostBlobSuccessEvent:: 1.472 + PostBlobSuccessEvent(DeviceStorageRequestParent* aParent, 1.473 + DeviceStorageFile* aFile, 1.474 + uint32_t aLength, 1.475 + nsACString& aMimeType, 1.476 + uint64_t aLastModifiedDate) 1.477 + : CancelableRunnable(aParent) 1.478 + , mLength(aLength) 1.479 + , mLastModificationDate(aLastModifiedDate) 1.480 + , mFile(aFile) 1.481 + , mMimeType(aMimeType) 1.482 +{ 1.483 +} 1.484 + 1.485 +DeviceStorageRequestParent::PostBlobSuccessEvent::~PostBlobSuccessEvent() {} 1.486 + 1.487 +nsresult 1.488 +DeviceStorageRequestParent::PostBlobSuccessEvent::CancelableRun() { 1.489 + MOZ_ASSERT(NS_IsMainThread()); 1.490 + 1.491 + nsString mime; 1.492 + CopyASCIItoUTF16(mMimeType, mime); 1.493 + 1.494 + nsString fullPath; 1.495 + mFile->GetFullPath(fullPath); 1.496 + nsCOMPtr<nsIDOMBlob> blob = new nsDOMFileFile(fullPath, mime, mLength, 1.497 + mFile->mFile, 1.498 + mLastModificationDate); 1.499 + 1.500 + ContentParent* cp = static_cast<ContentParent*>(mParent->Manager()); 1.501 + BlobParent* actor = cp->GetOrCreateActorForBlob(blob); 1.502 + if (!actor) { 1.503 + ErrorResponse response(NS_LITERAL_STRING(POST_ERROR_EVENT_UNKNOWN)); 1.504 + unused << mParent->Send__delete__(mParent, response); 1.505 + return NS_OK; 1.506 + } 1.507 + 1.508 + BlobResponse response; 1.509 + response.blobParent() = actor; 1.510 + 1.511 + unused << mParent->Send__delete__(mParent, response); 1.512 + return NS_OK; 1.513 +} 1.514 + 1.515 +DeviceStorageRequestParent::PostEnumerationSuccessEvent:: 1.516 + PostEnumerationSuccessEvent(DeviceStorageRequestParent* aParent, 1.517 + const nsAString& aStorageType, 1.518 + const nsAString& aRelPath, 1.519 + InfallibleTArray<DeviceStorageFileValue>& aPaths) 1.520 + : CancelableRunnable(aParent) 1.521 + , mStorageType(aStorageType) 1.522 + , mRelPath(aRelPath) 1.523 + , mPaths(aPaths) 1.524 +{ 1.525 +} 1.526 + 1.527 +DeviceStorageRequestParent::PostEnumerationSuccessEvent:: 1.528 + ~PostEnumerationSuccessEvent() {} 1.529 + 1.530 +nsresult 1.531 +DeviceStorageRequestParent::PostEnumerationSuccessEvent::CancelableRun() { 1.532 + MOZ_ASSERT(NS_IsMainThread()); 1.533 + 1.534 + EnumerationResponse response(mStorageType, mRelPath, mPaths); 1.535 + unused << mParent->Send__delete__(mParent, response); 1.536 + return NS_OK; 1.537 +} 1.538 + 1.539 +DeviceStorageRequestParent::CreateFdEvent:: 1.540 + CreateFdEvent(DeviceStorageRequestParent* aParent, 1.541 + DeviceStorageFile* aFile) 1.542 + : CancelableRunnable(aParent) 1.543 + , mFile(aFile) 1.544 +{ 1.545 +} 1.546 + 1.547 +DeviceStorageRequestParent::CreateFdEvent::~CreateFdEvent() 1.548 +{ 1.549 +} 1.550 + 1.551 +nsresult 1.552 +DeviceStorageRequestParent::CreateFdEvent::CancelableRun() 1.553 +{ 1.554 + MOZ_ASSERT(!NS_IsMainThread()); 1.555 + 1.556 + nsCOMPtr<nsIRunnable> r; 1.557 + 1.558 + bool check = false; 1.559 + mFile->mFile->Exists(&check); 1.560 + if (check) { 1.561 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_FILE_EXISTS); 1.562 + return NS_DispatchToMainThread(r); 1.563 + } 1.564 + 1.565 + FileDescriptor fileDescriptor; 1.566 + nsresult rv = mFile->CreateFileDescriptor(fileDescriptor); 1.567 + if (NS_FAILED(rv)) { 1.568 + NS_WARNING("CreateFileDescriptor failed"); 1.569 + mFile->Dump("CreateFileDescriptor failed"); 1.570 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_UNKNOWN); 1.571 + } 1.572 + else { 1.573 + r = new PostFileDescriptorResultEvent(mParent, fileDescriptor); 1.574 + } 1.575 + 1.576 + return NS_DispatchToMainThread(r); 1.577 +} 1.578 + 1.579 +DeviceStorageRequestParent::WriteFileEvent:: 1.580 + WriteFileEvent(DeviceStorageRequestParent* aParent, 1.581 + DeviceStorageFile* aFile, 1.582 + nsIInputStream* aInputStream) 1.583 + : CancelableRunnable(aParent) 1.584 + , mFile(aFile) 1.585 + , mInputStream(aInputStream) 1.586 +{ 1.587 +} 1.588 + 1.589 +DeviceStorageRequestParent::WriteFileEvent::~WriteFileEvent() 1.590 +{ 1.591 +} 1.592 + 1.593 +nsresult 1.594 +DeviceStorageRequestParent::WriteFileEvent::CancelableRun() 1.595 +{ 1.596 + MOZ_ASSERT(!NS_IsMainThread()); 1.597 + 1.598 + nsCOMPtr<nsIRunnable> r; 1.599 + 1.600 + if (!mInputStream) { 1.601 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_UNKNOWN); 1.602 + return NS_DispatchToMainThread(r); 1.603 + } 1.604 + 1.605 + bool check = false; 1.606 + mFile->mFile->Exists(&check); 1.607 + if (check) { 1.608 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_FILE_EXISTS); 1.609 + return NS_DispatchToMainThread(r); 1.610 + } 1.611 + 1.612 + nsresult rv = mFile->Write(mInputStream); 1.613 + 1.614 + if (NS_FAILED(rv)) { 1.615 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_UNKNOWN); 1.616 + } 1.617 + else { 1.618 + r = new PostPathResultEvent(mParent, mFile->mPath); 1.619 + } 1.620 + 1.621 + return NS_DispatchToMainThread(r); 1.622 +} 1.623 + 1.624 +DeviceStorageRequestParent::DeleteFileEvent:: 1.625 + DeleteFileEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile) 1.626 + : CancelableRunnable(aParent) 1.627 + , mFile(aFile) 1.628 +{ 1.629 +} 1.630 + 1.631 +DeviceStorageRequestParent::DeleteFileEvent::~DeleteFileEvent() 1.632 +{ 1.633 +} 1.634 + 1.635 +nsresult 1.636 +DeviceStorageRequestParent::DeleteFileEvent::CancelableRun() 1.637 +{ 1.638 + MOZ_ASSERT(!NS_IsMainThread()); 1.639 + 1.640 + mFile->Remove(); 1.641 + 1.642 + nsCOMPtr<nsIRunnable> r; 1.643 + 1.644 + bool check = false; 1.645 + mFile->mFile->Exists(&check); 1.646 + if (check) { 1.647 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_UNKNOWN); 1.648 + } 1.649 + else { 1.650 + r = new PostPathResultEvent(mParent, mFile->mPath); 1.651 + } 1.652 + 1.653 + return NS_DispatchToMainThread(r); 1.654 +} 1.655 + 1.656 +DeviceStorageRequestParent::FreeSpaceFileEvent:: 1.657 + FreeSpaceFileEvent(DeviceStorageRequestParent* aParent, 1.658 + DeviceStorageFile* aFile) 1.659 + : CancelableRunnable(aParent) 1.660 + , mFile(aFile) 1.661 +{ 1.662 +} 1.663 + 1.664 +DeviceStorageRequestParent::FreeSpaceFileEvent::~FreeSpaceFileEvent() 1.665 +{ 1.666 +} 1.667 + 1.668 +nsresult 1.669 +DeviceStorageRequestParent::FreeSpaceFileEvent::CancelableRun() 1.670 +{ 1.671 + MOZ_ASSERT(!NS_IsMainThread()); 1.672 + 1.673 + int64_t freeSpace = 0; 1.674 + if (mFile) { 1.675 + mFile->GetDiskFreeSpace(&freeSpace); 1.676 + } 1.677 + 1.678 + nsCOMPtr<nsIRunnable> r; 1.679 + r = new PostFreeSpaceResultEvent(mParent, static_cast<uint64_t>(freeSpace)); 1.680 + return NS_DispatchToMainThread(r); 1.681 +} 1.682 + 1.683 +DeviceStorageRequestParent::UsedSpaceFileEvent:: 1.684 + UsedSpaceFileEvent(DeviceStorageRequestParent* aParent, 1.685 + DeviceStorageFile* aFile) 1.686 + : CancelableRunnable(aParent) 1.687 + , mFile(aFile) 1.688 +{ 1.689 +} 1.690 + 1.691 +DeviceStorageRequestParent::UsedSpaceFileEvent::~UsedSpaceFileEvent() 1.692 +{ 1.693 +} 1.694 + 1.695 +nsresult 1.696 +DeviceStorageRequestParent::UsedSpaceFileEvent::CancelableRun() 1.697 +{ 1.698 + MOZ_ASSERT(!NS_IsMainThread()); 1.699 + 1.700 + uint64_t picturesUsage = 0, videosUsage = 0, musicUsage = 0, totalUsage = 0; 1.701 + mFile->AccumDiskUsage(&picturesUsage, &videosUsage, 1.702 + &musicUsage, &totalUsage); 1.703 + nsCOMPtr<nsIRunnable> r; 1.704 + if (mFile->mStorageType.EqualsLiteral(DEVICESTORAGE_PICTURES)) { 1.705 + r = new PostUsedSpaceResultEvent(mParent, mFile->mStorageType, 1.706 + picturesUsage); 1.707 + } 1.708 + else if (mFile->mStorageType.EqualsLiteral(DEVICESTORAGE_VIDEOS)) { 1.709 + r = new PostUsedSpaceResultEvent(mParent, mFile->mStorageType, videosUsage); 1.710 + } 1.711 + else if (mFile->mStorageType.EqualsLiteral(DEVICESTORAGE_MUSIC)) { 1.712 + r = new PostUsedSpaceResultEvent(mParent, mFile->mStorageType, musicUsage); 1.713 + } else { 1.714 + r = new PostUsedSpaceResultEvent(mParent, mFile->mStorageType, totalUsage); 1.715 + } 1.716 + return NS_DispatchToMainThread(r); 1.717 +} 1.718 + 1.719 +DeviceStorageRequestParent::ReadFileEvent:: 1.720 + ReadFileEvent(DeviceStorageRequestParent* aParent, DeviceStorageFile* aFile) 1.721 + : CancelableRunnable(aParent) 1.722 + , mFile(aFile) 1.723 +{ 1.724 + nsCOMPtr<nsIMIMEService> mimeService 1.725 + = do_GetService(NS_MIMESERVICE_CONTRACTID); 1.726 + if (mimeService) { 1.727 + nsresult rv = mimeService->GetTypeFromFile(mFile->mFile, mMimeType); 1.728 + if (NS_FAILED(rv)) { 1.729 + mMimeType.Truncate(); 1.730 + } 1.731 + } 1.732 +} 1.733 + 1.734 +DeviceStorageRequestParent::ReadFileEvent::~ReadFileEvent() 1.735 +{ 1.736 +} 1.737 + 1.738 +nsresult 1.739 +DeviceStorageRequestParent::ReadFileEvent::CancelableRun() 1.740 +{ 1.741 + MOZ_ASSERT(!NS_IsMainThread()); 1.742 + 1.743 + nsCOMPtr<nsIRunnable> r; 1.744 + bool check = false; 1.745 + mFile->mFile->Exists(&check); 1.746 + 1.747 + if (!check) { 1.748 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_FILE_DOES_NOT_EXIST); 1.749 + return NS_DispatchToMainThread(r); 1.750 + } 1.751 + 1.752 + int64_t fileSize; 1.753 + nsresult rv = mFile->mFile->GetFileSize(&fileSize); 1.754 + if (NS_FAILED(rv)) { 1.755 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_UNKNOWN); 1.756 + return NS_DispatchToMainThread(r); 1.757 + } 1.758 + 1.759 + PRTime modDate; 1.760 + rv = mFile->mFile->GetLastModifiedTime(&modDate); 1.761 + if (NS_FAILED(rv)) { 1.762 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_UNKNOWN); 1.763 + return NS_DispatchToMainThread(r); 1.764 + } 1.765 + 1.766 + r = new PostBlobSuccessEvent(mParent, mFile, static_cast<uint64_t>(fileSize), 1.767 + mMimeType, modDate); 1.768 + return NS_DispatchToMainThread(r); 1.769 +} 1.770 + 1.771 +DeviceStorageRequestParent::EnumerateFileEvent:: 1.772 + EnumerateFileEvent(DeviceStorageRequestParent* aParent, 1.773 + DeviceStorageFile* aFile, 1.774 + uint64_t aSince) 1.775 + : CancelableRunnable(aParent) 1.776 + , mFile(aFile) 1.777 + , mSince(aSince) 1.778 +{ 1.779 +} 1.780 + 1.781 +DeviceStorageRequestParent::EnumerateFileEvent::~EnumerateFileEvent() 1.782 +{ 1.783 +} 1.784 + 1.785 +nsresult 1.786 +DeviceStorageRequestParent::EnumerateFileEvent::CancelableRun() 1.787 +{ 1.788 + MOZ_ASSERT(!NS_IsMainThread()); 1.789 + 1.790 + nsCOMPtr<nsIRunnable> r; 1.791 + if (mFile->mFile) { 1.792 + bool check = false; 1.793 + mFile->mFile->Exists(&check); 1.794 + if (!check) { 1.795 + r = new PostErrorEvent(mParent, POST_ERROR_EVENT_FILE_DOES_NOT_EXIST); 1.796 + return NS_DispatchToMainThread(r); 1.797 + } 1.798 + } 1.799 + 1.800 + nsTArray<nsRefPtr<DeviceStorageFile> > files; 1.801 + mFile->CollectFiles(files, mSince); 1.802 + 1.803 + InfallibleTArray<DeviceStorageFileValue> values; 1.804 + 1.805 + uint32_t count = files.Length(); 1.806 + for (uint32_t i = 0; i < count; i++) { 1.807 + DeviceStorageFileValue dsvf(files[i]->mStorageName, files[i]->mPath); 1.808 + values.AppendElement(dsvf); 1.809 + } 1.810 + 1.811 + r = new PostEnumerationSuccessEvent(mParent, mFile->mStorageType, 1.812 + mFile->mRootDir, values); 1.813 + return NS_DispatchToMainThread(r); 1.814 +} 1.815 + 1.816 + 1.817 +DeviceStorageRequestParent::PostPathResultEvent:: 1.818 + PostPathResultEvent(DeviceStorageRequestParent* aParent, 1.819 + const nsAString& aPath) 1.820 + : CancelableRunnable(aParent) 1.821 + , mPath(aPath) 1.822 +{ 1.823 +} 1.824 + 1.825 +DeviceStorageRequestParent::PostPathResultEvent::~PostPathResultEvent() 1.826 +{ 1.827 +} 1.828 + 1.829 +nsresult 1.830 +DeviceStorageRequestParent::PostPathResultEvent::CancelableRun() 1.831 +{ 1.832 + MOZ_ASSERT(NS_IsMainThread()); 1.833 + 1.834 + SuccessResponse response; 1.835 + unused << mParent->Send__delete__(mParent, response); 1.836 + return NS_OK; 1.837 +} 1.838 + 1.839 +DeviceStorageRequestParent::PostFileDescriptorResultEvent:: 1.840 + PostFileDescriptorResultEvent(DeviceStorageRequestParent* aParent, 1.841 + const FileDescriptor& aFileDescriptor) 1.842 + : CancelableRunnable(aParent) 1.843 + , mFileDescriptor(aFileDescriptor) 1.844 +{ 1.845 +} 1.846 + 1.847 +DeviceStorageRequestParent::PostFileDescriptorResultEvent:: 1.848 + ~PostFileDescriptorResultEvent() 1.849 +{ 1.850 +} 1.851 + 1.852 +nsresult 1.853 +DeviceStorageRequestParent::PostFileDescriptorResultEvent::CancelableRun() 1.854 +{ 1.855 + MOZ_ASSERT(NS_IsMainThread()); 1.856 + 1.857 + FileDescriptorResponse response(mFileDescriptor); 1.858 + unused << mParent->Send__delete__(mParent, response); 1.859 + return NS_OK; 1.860 +} 1.861 + 1.862 +DeviceStorageRequestParent::PostAvailableResultEvent:: 1.863 + PostAvailableResultEvent(DeviceStorageRequestParent* aParent, 1.864 + DeviceStorageFile* aFile) 1.865 + : CancelableRunnable(aParent) 1.866 + , mFile(aFile) 1.867 +{ 1.868 +} 1.869 + 1.870 +DeviceStorageRequestParent::PostAvailableResultEvent:: 1.871 + ~PostAvailableResultEvent() 1.872 +{ 1.873 +} 1.874 + 1.875 +nsresult 1.876 +DeviceStorageRequestParent::PostAvailableResultEvent::CancelableRun() 1.877 +{ 1.878 + MOZ_ASSERT(NS_IsMainThread()); 1.879 + 1.880 + nsString state = NS_LITERAL_STRING("unavailable"); 1.881 + if (mFile) { 1.882 + mFile->GetStatus(state); 1.883 + } 1.884 + 1.885 + AvailableStorageResponse response(state); 1.886 + unused << mParent->Send__delete__(mParent, response); 1.887 + return NS_OK; 1.888 +} 1.889 + 1.890 +DeviceStorageRequestParent::PostStatusResultEvent:: 1.891 + PostStatusResultEvent(DeviceStorageRequestParent* aParent, 1.892 + DeviceStorageFile* aFile) 1.893 + : CancelableRunnable(aParent) 1.894 + , mFile(aFile) 1.895 +{ 1.896 +} 1.897 + 1.898 +DeviceStorageRequestParent::PostStatusResultEvent:: 1.899 + ~PostStatusResultEvent() 1.900 +{ 1.901 +} 1.902 + 1.903 +nsresult 1.904 +DeviceStorageRequestParent::PostStatusResultEvent::CancelableRun() 1.905 +{ 1.906 + MOZ_ASSERT(NS_IsMainThread()); 1.907 + 1.908 + nsString state = NS_LITERAL_STRING("undefined"); 1.909 + if (mFile) { 1.910 + mFile->GetStorageStatus(state); 1.911 + } 1.912 + 1.913 + StorageStatusResponse response(state); 1.914 + unused << mParent->Send__delete__(mParent, response); 1.915 + return NS_OK; 1.916 +} 1.917 + 1.918 +DeviceStorageRequestParent::PostFormatResultEvent:: 1.919 + PostFormatResultEvent(DeviceStorageRequestParent* aParent, 1.920 + DeviceStorageFile* aFile) 1.921 + : CancelableRunnable(aParent) 1.922 + , mFile(aFile) 1.923 +{ 1.924 +} 1.925 + 1.926 +DeviceStorageRequestParent::PostFormatResultEvent:: 1.927 + ~PostFormatResultEvent() 1.928 +{ 1.929 +} 1.930 + 1.931 +nsresult 1.932 +DeviceStorageRequestParent::PostFormatResultEvent::CancelableRun() 1.933 +{ 1.934 + MOZ_ASSERT(NS_IsMainThread()); 1.935 + 1.936 + nsString state = NS_LITERAL_STRING("unavailable"); 1.937 + if (mFile) { 1.938 + mFile->DoFormat(state); 1.939 + } 1.940 + 1.941 + FormatStorageResponse response(state); 1.942 + unused << mParent->Send__delete__(mParent, response); 1.943 + return NS_OK; 1.944 +} 1.945 + 1.946 +DeviceStorageRequestParent::PostMountResultEvent:: 1.947 + PostMountResultEvent(DeviceStorageRequestParent* aParent, 1.948 + DeviceStorageFile* aFile) 1.949 + : CancelableRunnable(aParent) 1.950 + , mFile(aFile) 1.951 +{ 1.952 +} 1.953 + 1.954 +DeviceStorageRequestParent::PostMountResultEvent:: 1.955 + ~PostMountResultEvent() 1.956 +{ 1.957 +} 1.958 + 1.959 +nsresult 1.960 +DeviceStorageRequestParent::PostMountResultEvent::CancelableRun() 1.961 +{ 1.962 + MOZ_ASSERT(NS_IsMainThread()); 1.963 + 1.964 + nsString state = NS_LITERAL_STRING("unavailable"); 1.965 + if (mFile) { 1.966 + mFile->DoMount(state); 1.967 + } 1.968 + 1.969 + MountStorageResponse response(state); 1.970 + unused << mParent->Send__delete__(mParent, response); 1.971 + return NS_OK; 1.972 +} 1.973 + 1.974 +DeviceStorageRequestParent::PostUnmountResultEvent:: 1.975 + PostUnmountResultEvent(DeviceStorageRequestParent* aParent, 1.976 + DeviceStorageFile* aFile) 1.977 + : CancelableRunnable(aParent) 1.978 + , mFile(aFile) 1.979 +{ 1.980 +} 1.981 + 1.982 +DeviceStorageRequestParent::PostUnmountResultEvent:: 1.983 + ~PostUnmountResultEvent() 1.984 +{ 1.985 +} 1.986 + 1.987 +nsresult 1.988 +DeviceStorageRequestParent::PostUnmountResultEvent::CancelableRun() 1.989 +{ 1.990 + MOZ_ASSERT(NS_IsMainThread()); 1.991 + 1.992 + nsString state = NS_LITERAL_STRING("unavailable"); 1.993 + if (mFile) { 1.994 + mFile->DoUnmount(state); 1.995 + } 1.996 + 1.997 + UnmountStorageResponse response(state); 1.998 + unused << mParent->Send__delete__(mParent, response); 1.999 + return NS_OK; 1.1000 +} 1.1001 + 1.1002 +} // namespace devicestorage 1.1003 +} // namespace dom 1.1004 +} // namespace mozilla