SDBRequest.cpp (3115B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "SDBRequest.h" 8 9 // Local includes 10 #include "SDBConnection.h" 11 12 // Global includes 13 14 #include "mozilla/ErrorNames.h" 15 #include "nsError.h" 16 #include "nsISDBCallbacks.h" 17 #include "nsISupportsUtils.h" 18 #include "nsIVariant.h" 19 #include "nsThreadUtils.h" 20 #include "nscore.h" 21 22 namespace mozilla::dom { 23 24 SDBRequest::SDBRequest(SDBConnection* aConnection) 25 : mConnection(aConnection), 26 mResultCode(NS_OK), 27 mHaveResultOrErrorCode(false) { 28 AssertIsOnOwningThread(); 29 MOZ_ASSERT(aConnection); 30 } 31 32 SDBRequest::~SDBRequest() { AssertIsOnOwningThread(); } 33 34 void SDBRequest::SetResult(nsIVariant* aResult) { 35 AssertIsOnOwningThread(); 36 MOZ_ASSERT(aResult); 37 MOZ_ASSERT(mConnection); 38 MOZ_ASSERT(!mHaveResultOrErrorCode); 39 40 mResult = aResult; 41 mHaveResultOrErrorCode = true; 42 43 FireCallback(); 44 } 45 46 void SDBRequest::SetError(nsresult aRv) { 47 AssertIsOnOwningThread(); 48 MOZ_ASSERT(mConnection); 49 MOZ_ASSERT(mResultCode == NS_OK); 50 MOZ_ASSERT(!mHaveResultOrErrorCode); 51 52 mResultCode = aRv; 53 mHaveResultOrErrorCode = true; 54 55 FireCallback(); 56 } 57 58 void SDBRequest::FireCallback() { 59 AssertIsOnOwningThread(); 60 61 if (mCallback) { 62 nsCOMPtr<nsISDBCallback> callback; 63 callback.swap(mCallback); 64 65 MOZ_ALWAYS_SUCCEEDS( 66 NS_DispatchToCurrentThread(NewRunnableMethod<RefPtr<SDBRequest>>( 67 "nsISDBCallback::OnComplete", callback, &nsISDBCallback::OnComplete, 68 this))); 69 } 70 } 71 72 NS_IMPL_CYCLE_COLLECTING_ADDREF(SDBRequest) 73 NS_IMPL_CYCLE_COLLECTING_RELEASE(SDBRequest) 74 75 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SDBRequest) 76 NS_INTERFACE_MAP_ENTRY(nsISupports) 77 NS_INTERFACE_MAP_ENTRY(nsISDBRequest) 78 NS_INTERFACE_MAP_END 79 80 NS_IMPL_CYCLE_COLLECTION(SDBRequest, mCallback, mResult) 81 82 NS_IMETHODIMP 83 SDBRequest::GetResult(nsIVariant** aResult) { 84 AssertIsOnOwningThread(); 85 MOZ_ASSERT(aResult); 86 87 if (!mHaveResultOrErrorCode) { 88 return NS_ERROR_NOT_AVAILABLE; 89 } 90 91 NS_IF_ADDREF(*aResult = mResult); 92 return NS_OK; 93 } 94 95 NS_IMETHODIMP 96 SDBRequest::GetResultCode(nsresult* aResultCode) { 97 AssertIsOnOwningThread(); 98 MOZ_ASSERT(aResultCode); 99 100 if (!mHaveResultOrErrorCode) { 101 return NS_ERROR_NOT_AVAILABLE; 102 } 103 104 *aResultCode = mResultCode; 105 return NS_OK; 106 } 107 108 NS_IMETHODIMP 109 SDBRequest::GetResultName(nsACString& aResultName) { 110 AssertIsOnOwningThread(); 111 112 if (!mHaveResultOrErrorCode) { 113 return NS_ERROR_NOT_AVAILABLE; 114 } 115 116 mozilla::GetErrorName(mResultCode, aResultName); 117 return NS_OK; 118 } 119 120 NS_IMETHODIMP 121 SDBRequest::GetCallback(nsISDBCallback** aCallback) { 122 AssertIsOnOwningThread(); 123 MOZ_ASSERT(aCallback); 124 125 NS_IF_ADDREF(*aCallback = mCallback); 126 return NS_OK; 127 } 128 129 NS_IMETHODIMP 130 SDBRequest::SetCallback(nsISDBCallback* aCallback) { 131 AssertIsOnOwningThread(); 132 133 mCallback = aCallback; 134 return NS_OK; 135 } 136 137 } // namespace mozilla::dom