PermissionMessageUtils.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #include "mozilla/dom/PermissionMessageUtils.h"
  6. #include "nsISerializable.h"
  7. #include "nsSerializationHelper.h"
  8. namespace IPC {
  9. void
  10. ParamTraits<Principal>::Write(Message* aMsg, const paramType& aParam) {
  11. bool isNull = !aParam.mPrincipal;
  12. WriteParam(aMsg, isNull);
  13. if (isNull) {
  14. return;
  15. }
  16. bool isSerialized = false;
  17. nsCString principalString;
  18. nsCOMPtr<nsISerializable> serializable = do_QueryInterface(aParam.mPrincipal);
  19. if (serializable) {
  20. nsresult rv = NS_SerializeToString(serializable, principalString);
  21. if (NS_SUCCEEDED(rv)) {
  22. isSerialized = true;
  23. }
  24. }
  25. if (!isSerialized) {
  26. NS_RUNTIMEABORT("Unable to serialize principal.");
  27. return;
  28. }
  29. WriteParam(aMsg, principalString);
  30. }
  31. bool
  32. ParamTraits<Principal>::Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
  33. {
  34. bool isNull;
  35. if (!ReadParam(aMsg, aIter, &isNull)) {
  36. return false;
  37. }
  38. if (isNull) {
  39. aResult->mPrincipal = nullptr;
  40. return true;
  41. }
  42. nsCString principalString;
  43. if (!ReadParam(aMsg, aIter, &principalString)) {
  44. return false;
  45. }
  46. nsCOMPtr<nsISupports> iSupports;
  47. nsresult rv = NS_DeserializeObject(principalString, getter_AddRefs(iSupports));
  48. NS_ENSURE_SUCCESS(rv, false);
  49. nsCOMPtr<nsIPrincipal> principal = do_QueryInterface(iSupports);
  50. NS_ENSURE_TRUE(principal, false);
  51. principal.swap(aResult->mPrincipal);
  52. return true;
  53. }
  54. } // namespace IPC