PaymentActionResponse.cpp (11624B)
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 "PaymentActionResponse.h" 8 9 #include "BasicCardPayment.h" 10 #include "PaymentRequestUtils.h" 11 12 namespace mozilla::dom { 13 14 /* PaymentResponseData */ 15 16 NS_IMPL_ISUPPORTS(PaymentResponseData, nsIPaymentResponseData) 17 18 NS_IMETHODIMP 19 PaymentResponseData::GetType(uint32_t* aType) { 20 NS_ENSURE_ARG_POINTER(aType); 21 *aType = mType; 22 return NS_OK; 23 } 24 25 NS_IMETHODIMP 26 PaymentResponseData::Init(const uint32_t aType) { 27 if (aType != nsIPaymentResponseData::GENERAL_RESPONSE && 28 aType != nsIPaymentResponseData::BASICCARD_RESPONSE) { 29 return NS_ERROR_FAILURE; 30 } 31 mType = aType; 32 return NS_OK; 33 } 34 35 /* GeneralResponseData */ 36 37 NS_IMPL_ISUPPORTS_INHERITED(GeneralResponseData, PaymentResponseData, 38 nsIGeneralResponseData) 39 40 GeneralResponseData::GeneralResponseData() : mData(u"{}"_ns) { 41 Init(nsIPaymentResponseData::GENERAL_RESPONSE); 42 } 43 44 NS_IMETHODIMP 45 GeneralResponseData::GetData(nsAString& aData) { 46 aData = mData; 47 return NS_OK; 48 } 49 50 NS_IMETHODIMP 51 GeneralResponseData::InitData(JS::Handle<JS::Value> aValue, JSContext* aCx) { 52 if (aValue.isNullOrUndefined()) { 53 return NS_ERROR_FAILURE; 54 } 55 nsresult rv = SerializeFromJSVal(aCx, aValue, mData); 56 if (NS_WARN_IF(NS_FAILED(rv))) { 57 return rv; 58 } 59 return NS_OK; 60 } 61 62 /* BasicCardResponseData */ 63 64 NS_IMPL_ISUPPORTS_INHERITED(BasicCardResponseData, PaymentResponseData, 65 nsIBasicCardResponseData) 66 67 BasicCardResponseData::BasicCardResponseData() { 68 Init(nsIPaymentResponseData::BASICCARD_RESPONSE); 69 } 70 71 NS_IMETHODIMP 72 BasicCardResponseData::GetCardholderName(nsAString& aCardholderName) { 73 aCardholderName = mCardholderName; 74 return NS_OK; 75 } 76 77 NS_IMETHODIMP 78 BasicCardResponseData::GetCardNumber(nsAString& aCardNumber) { 79 aCardNumber = mCardNumber; 80 return NS_OK; 81 } 82 83 NS_IMETHODIMP 84 BasicCardResponseData::GetExpiryMonth(nsAString& aExpiryMonth) { 85 aExpiryMonth = mExpiryMonth; 86 return NS_OK; 87 } 88 89 NS_IMETHODIMP 90 BasicCardResponseData::GetExpiryYear(nsAString& aExpiryYear) { 91 aExpiryYear = mExpiryYear; 92 return NS_OK; 93 } 94 95 NS_IMETHODIMP 96 BasicCardResponseData::GetCardSecurityCode(nsAString& aCardSecurityCode) { 97 aCardSecurityCode = mCardSecurityCode; 98 return NS_OK; 99 } 100 101 NS_IMETHODIMP 102 BasicCardResponseData::GetBillingAddress(nsIPaymentAddress** aBillingAddress) { 103 NS_ENSURE_ARG_POINTER(aBillingAddress); 104 nsCOMPtr<nsIPaymentAddress> address; 105 address = mBillingAddress; 106 address.forget(aBillingAddress); 107 return NS_OK; 108 } 109 110 NS_IMETHODIMP 111 BasicCardResponseData::InitData(const nsAString& aCardholderName, 112 const nsAString& aCardNumber, 113 const nsAString& aExpiryMonth, 114 const nsAString& aExpiryYear, 115 const nsAString& aCardSecurityCode, 116 nsIPaymentAddress* aBillingAddress) { 117 // cardNumber is a required attribute, cannot be empty; 118 if (aCardNumber.IsEmpty()) { 119 return NS_ERROR_FAILURE; 120 } 121 122 RefPtr<BasicCardService> service = BasicCardService::GetService(); 123 MOZ_ASSERT(service); 124 125 if (!service->IsValidExpiryMonth(aExpiryMonth)) { 126 return NS_ERROR_FAILURE; 127 } 128 129 if (!service->IsValidExpiryYear(aExpiryYear)) { 130 return NS_ERROR_FAILURE; 131 } 132 133 mCardholderName = aCardholderName; 134 mCardNumber = aCardNumber; 135 mExpiryMonth = aExpiryMonth; 136 mExpiryYear = aExpiryYear; 137 mCardSecurityCode = aCardSecurityCode; 138 mBillingAddress = aBillingAddress; 139 140 return NS_OK; 141 } 142 143 /* PaymentActionResponse */ 144 145 NS_IMPL_ISUPPORTS(PaymentActionResponse, nsIPaymentActionResponse) 146 147 PaymentActionResponse::PaymentActionResponse() 148 : mRequestId(u""_ns), mType(nsIPaymentActionResponse::NO_TYPE) {} 149 150 NS_IMETHODIMP 151 PaymentActionResponse::GetRequestId(nsAString& aRequestId) { 152 aRequestId = mRequestId; 153 return NS_OK; 154 } 155 156 NS_IMETHODIMP 157 PaymentActionResponse::GetType(uint32_t* aType) { 158 NS_ENSURE_ARG_POINTER(aType); 159 *aType = mType; 160 return NS_OK; 161 } 162 163 /* PaymentCanMakeActionResponse */ 164 165 NS_IMPL_ISUPPORTS_INHERITED(PaymentCanMakeActionResponse, PaymentActionResponse, 166 nsIPaymentCanMakeActionResponse) 167 168 PaymentCanMakeActionResponse::PaymentCanMakeActionResponse() : mResult(false) { 169 mType = nsIPaymentActionResponse::CANMAKE_ACTION; 170 } 171 172 NS_IMETHODIMP 173 PaymentCanMakeActionResponse::GetResult(bool* aResult) { 174 NS_ENSURE_ARG_POINTER(aResult); 175 *aResult = mResult; 176 return NS_OK; 177 } 178 179 NS_IMETHODIMP 180 PaymentCanMakeActionResponse::Init(const nsAString& aRequestId, 181 const bool aResult) { 182 mRequestId = aRequestId; 183 mResult = aResult; 184 return NS_OK; 185 } 186 187 /* PaymentShowActionResponse */ 188 189 NS_IMPL_ISUPPORTS_INHERITED(PaymentShowActionResponse, PaymentActionResponse, 190 nsIPaymentShowActionResponse) 191 192 PaymentShowActionResponse::PaymentShowActionResponse() 193 : mAcceptStatus(nsIPaymentActionResponse::PAYMENT_REJECTED) { 194 mType = nsIPaymentActionResponse::SHOW_ACTION; 195 } 196 197 NS_IMETHODIMP 198 PaymentShowActionResponse::GetAcceptStatus(uint32_t* aAcceptStatus) { 199 NS_ENSURE_ARG_POINTER(aAcceptStatus); 200 *aAcceptStatus = mAcceptStatus; 201 return NS_OK; 202 } 203 204 NS_IMETHODIMP 205 PaymentShowActionResponse::GetMethodName(nsAString& aMethodName) { 206 aMethodName = mMethodName; 207 return NS_OK; 208 } 209 210 NS_IMETHODIMP 211 PaymentShowActionResponse::GetData(nsIPaymentResponseData** aData) { 212 NS_ENSURE_ARG_POINTER(aData); 213 nsCOMPtr<nsIPaymentResponseData> data = mData; 214 data.forget(aData); 215 return NS_OK; 216 } 217 218 NS_IMETHODIMP 219 PaymentShowActionResponse::GetPayerName(nsAString& aPayerName) { 220 aPayerName = mPayerName; 221 return NS_OK; 222 } 223 224 NS_IMETHODIMP 225 PaymentShowActionResponse::GetPayerEmail(nsAString& aPayerEmail) { 226 aPayerEmail = mPayerEmail; 227 return NS_OK; 228 } 229 230 NS_IMETHODIMP 231 PaymentShowActionResponse::GetPayerPhone(nsAString& aPayerPhone) { 232 aPayerPhone = mPayerPhone; 233 return NS_OK; 234 } 235 236 NS_IMETHODIMP 237 PaymentShowActionResponse::Init(const nsAString& aRequestId, 238 const uint32_t aAcceptStatus, 239 const nsAString& aMethodName, 240 nsIPaymentResponseData* aData, 241 const nsAString& aPayerName, 242 const nsAString& aPayerEmail, 243 const nsAString& aPayerPhone) { 244 if (aAcceptStatus == nsIPaymentActionResponse::PAYMENT_ACCEPTED) { 245 NS_ENSURE_ARG_POINTER(aData); 246 } 247 248 mRequestId = aRequestId; 249 mAcceptStatus = aAcceptStatus; 250 mMethodName = aMethodName; 251 252 RefPtr<BasicCardService> service = BasicCardService::GetService(); 253 MOZ_ASSERT(service); 254 bool isBasicCardPayment = service->IsBasicCardPayment(mMethodName); 255 256 if (aAcceptStatus == nsIPaymentActionResponse::PAYMENT_ACCEPTED) { 257 uint32_t responseType; 258 NS_ENSURE_SUCCESS(aData->GetType(&responseType), NS_ERROR_FAILURE); 259 switch (responseType) { 260 case nsIPaymentResponseData::GENERAL_RESPONSE: { 261 if (isBasicCardPayment) { 262 return NS_ERROR_FAILURE; 263 } 264 break; 265 } 266 case nsIPaymentResponseData::BASICCARD_RESPONSE: { 267 if (!isBasicCardPayment) { 268 return NS_ERROR_FAILURE; 269 } 270 break; 271 } 272 default: { 273 return NS_ERROR_FAILURE; 274 } 275 } 276 } 277 mData = aData; 278 mPayerName = aPayerName; 279 mPayerEmail = aPayerEmail; 280 mPayerPhone = aPayerPhone; 281 return NS_OK; 282 } 283 284 /* PaymentAbortActionResponse */ 285 286 NS_IMPL_ISUPPORTS_INHERITED(PaymentAbortActionResponse, PaymentActionResponse, 287 nsIPaymentAbortActionResponse) 288 289 PaymentAbortActionResponse::PaymentAbortActionResponse() 290 : mAbortStatus(nsIPaymentActionResponse::ABORT_FAILED) { 291 mType = nsIPaymentActionResponse::ABORT_ACTION; 292 } 293 294 NS_IMETHODIMP 295 PaymentAbortActionResponse::GetAbortStatus(uint32_t* aAbortStatus) { 296 NS_ENSURE_ARG_POINTER(aAbortStatus); 297 *aAbortStatus = mAbortStatus; 298 return NS_OK; 299 } 300 301 NS_IMETHODIMP 302 PaymentAbortActionResponse::Init(const nsAString& aRequestId, 303 const uint32_t aAbortStatus) { 304 mRequestId = aRequestId; 305 mAbortStatus = aAbortStatus; 306 return NS_OK; 307 } 308 309 NS_IMETHODIMP 310 PaymentAbortActionResponse::IsSucceeded(bool* aIsSucceeded) { 311 NS_ENSURE_ARG_POINTER(aIsSucceeded); 312 *aIsSucceeded = (mAbortStatus == nsIPaymentActionResponse::ABORT_SUCCEEDED); 313 return NS_OK; 314 } 315 316 /* PaymentCompleteActionResponse */ 317 318 NS_IMPL_ISUPPORTS_INHERITED(PaymentCompleteActionResponse, 319 PaymentActionResponse, 320 nsIPaymentCompleteActionResponse) 321 322 PaymentCompleteActionResponse::PaymentCompleteActionResponse() 323 : mCompleteStatus(nsIPaymentActionResponse::COMPLETE_FAILED) { 324 mType = nsIPaymentActionResponse::COMPLETE_ACTION; 325 } 326 327 nsresult PaymentCompleteActionResponse::Init(const nsAString& aRequestId, 328 const uint32_t aCompleteStatus) { 329 mRequestId = aRequestId; 330 mCompleteStatus = aCompleteStatus; 331 return NS_OK; 332 } 333 334 nsresult PaymentCompleteActionResponse::GetCompleteStatus( 335 uint32_t* aCompleteStatus) { 336 NS_ENSURE_ARG_POINTER(aCompleteStatus); 337 *aCompleteStatus = mCompleteStatus; 338 return NS_OK; 339 } 340 341 nsresult PaymentCompleteActionResponse::IsCompleted(bool* aIsCompleted) { 342 NS_ENSURE_ARG_POINTER(aIsCompleted); 343 *aIsCompleted = 344 (mCompleteStatus == nsIPaymentActionResponse::COMPLETE_SUCCEEDED); 345 return NS_OK; 346 } 347 348 /* PaymentChangeDetails */ 349 350 NS_IMPL_ISUPPORTS(MethodChangeDetails, nsIMethodChangeDetails) 351 352 NS_IMETHODIMP 353 MethodChangeDetails::GetType(uint32_t* aType) { 354 NS_ENSURE_ARG_POINTER(aType); 355 *aType = mType; 356 return NS_OK; 357 } 358 359 NS_IMETHODIMP 360 MethodChangeDetails::Init(const uint32_t aType) { 361 if (aType != nsIMethodChangeDetails::GENERAL_DETAILS && 362 aType != nsIMethodChangeDetails::BASICCARD_DETAILS) { 363 return NS_ERROR_FAILURE; 364 } 365 mType = aType; 366 return NS_OK; 367 } 368 369 /* GeneralMethodChangeDetails */ 370 371 NS_IMPL_ISUPPORTS_INHERITED(GeneralMethodChangeDetails, MethodChangeDetails, 372 nsIGeneralChangeDetails) 373 374 GeneralMethodChangeDetails::GeneralMethodChangeDetails() : mDetails(u"{}"_ns) { 375 Init(nsIMethodChangeDetails::GENERAL_DETAILS); 376 } 377 378 NS_IMETHODIMP 379 GeneralMethodChangeDetails::GetDetails(nsAString& aDetails) { 380 aDetails = mDetails; 381 return NS_OK; 382 } 383 384 NS_IMETHODIMP 385 GeneralMethodChangeDetails::InitData(JS::Handle<JS::Value> aDetails, 386 JSContext* aCx) { 387 if (aDetails.isNullOrUndefined()) { 388 return NS_ERROR_FAILURE; 389 } 390 nsresult rv = SerializeFromJSVal(aCx, aDetails, mDetails); 391 if (NS_WARN_IF(NS_FAILED(rv))) { 392 return rv; 393 } 394 return NS_OK; 395 } 396 397 /* BasicCardMethodChangeDetails */ 398 399 NS_IMPL_ISUPPORTS_INHERITED(BasicCardMethodChangeDetails, MethodChangeDetails, 400 nsIBasicCardChangeDetails) 401 402 BasicCardMethodChangeDetails::BasicCardMethodChangeDetails() { 403 Init(nsIMethodChangeDetails::BASICCARD_DETAILS); 404 } 405 406 NS_IMETHODIMP 407 BasicCardMethodChangeDetails::GetBillingAddress( 408 nsIPaymentAddress** aBillingAddress) { 409 NS_ENSURE_ARG_POINTER(aBillingAddress); 410 nsCOMPtr<nsIPaymentAddress> address; 411 address = mBillingAddress; 412 address.forget(aBillingAddress); 413 return NS_OK; 414 } 415 416 NS_IMETHODIMP 417 BasicCardMethodChangeDetails::InitData(nsIPaymentAddress* aBillingAddress) { 418 mBillingAddress = aBillingAddress; 419 return NS_OK; 420 } 421 422 } // namespace mozilla::dom