NeckoMessageUtils.h (7663B)
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 6 #ifndef mozilla_net_NeckoMessageUtils_h 7 #define mozilla_net_NeckoMessageUtils_h 8 9 #include "ipc/EnumSerializer.h" 10 #include "ipc/IPCMessageUtils.h" 11 #include "ipc/IPCMessageUtilsSpecializations.h" 12 #include "mozilla/net/ClassOfService.h" 13 #include "mozilla/net/DNS.h" 14 #include "nsExceptionHandler.h" 15 #include "nsICacheInfoChannel.h" 16 #include "nsIDNSService.h" 17 #include "nsIHttpChannel.h" 18 #include "nsITRRSkipReason.h" 19 #include "nsPrintfCString.h" 20 #include "nsString.h" 21 #include "prio.h" 22 #include "mozilla/net/HttpTransactionShell.h" 23 24 namespace IPC { 25 26 // nsIPermissionManager utilities 27 28 struct Permission { 29 nsCString origin, type; 30 uint32_t capability, expireType; 31 int64_t expireTime; 32 33 Permission() : capability(0), expireType(0), expireTime(0) {} 34 35 Permission(const nsCString& aOrigin, const nsACString& aType, 36 const uint32_t aCapability, const uint32_t aExpireType, 37 const int64_t aExpireTime) 38 : origin(aOrigin), 39 type(aType), 40 capability(aCapability), 41 expireType(aExpireType), 42 expireTime(aExpireTime) {} 43 44 bool operator==(const Permission& aOther) const { 45 return aOther.origin == origin && aOther.type == type && 46 aOther.capability == capability && aOther.expireType == expireType && 47 aOther.expireTime == expireTime; 48 } 49 }; 50 51 template <> 52 struct ParamTraits<Permission> { 53 static void Write(MessageWriter* aWriter, const Permission& aParam) { 54 WriteParam(aWriter, aParam.origin); 55 WriteParam(aWriter, aParam.type); 56 WriteParam(aWriter, aParam.capability); 57 WriteParam(aWriter, aParam.expireType); 58 WriteParam(aWriter, aParam.expireTime); 59 } 60 61 static bool Read(MessageReader* aReader, Permission* aResult) { 62 return ReadParam(aReader, &aResult->origin) && 63 ReadParam(aReader, &aResult->type) && 64 ReadParam(aReader, &aResult->capability) && 65 ReadParam(aReader, &aResult->expireType) && 66 ReadParam(aReader, &aResult->expireTime); 67 } 68 }; 69 70 template <> 71 struct ParamTraits<mozilla::net::NetAddr> { 72 static void Write(MessageWriter* aWriter, 73 const mozilla::net::NetAddr& aParam) { 74 WriteParam(aWriter, aParam.raw.family); 75 if (aParam.raw.family == AF_UNSPEC) { 76 aWriter->WriteBytes(aParam.raw.data, sizeof(aParam.raw.data)); 77 } else if (aParam.raw.family == AF_INET) { 78 WriteParam(aWriter, aParam.inet.port); 79 WriteParam(aWriter, aParam.inet.ip); 80 } else if (aParam.raw.family == AF_INET6) { 81 WriteParam(aWriter, aParam.inet6.port); 82 WriteParam(aWriter, aParam.inet6.flowinfo); 83 WriteParam(aWriter, aParam.inet6.ip.u64[0]); 84 WriteParam(aWriter, aParam.inet6.ip.u64[1]); 85 WriteParam(aWriter, aParam.inet6.scope_id); 86 #if defined(XP_UNIX) 87 } else if (aParam.raw.family == AF_LOCAL) { 88 // Train's already off the rails: let's get a stack trace at least... 89 MOZ_CRASH( 90 "Error: please post stack trace to " 91 "https://bugzilla.mozilla.org/show_bug.cgi?id=661158"); 92 aWriter->WriteBytes(aParam.local.path, sizeof(aParam.local.path)); 93 #endif 94 } else { 95 if (XRE_IsParentProcess()) { 96 CrashReporter::RecordAnnotationU32( 97 CrashReporter::Annotation::UnknownNetAddrSocketFamily, 98 aParam.raw.family); 99 } 100 101 MOZ_CRASH("Unknown socket family"); 102 } 103 } 104 105 static bool Read(MessageReader* aReader, mozilla::net::NetAddr* aResult) { 106 if (!ReadParam(aReader, &aResult->raw.family)) return false; 107 108 if (aResult->raw.family == AF_UNSPEC) { 109 return aReader->ReadBytesInto(&aResult->raw.data, 110 sizeof(aResult->raw.data)); 111 } else if (aResult->raw.family == AF_INET) { 112 return ReadParam(aReader, &aResult->inet.port) && 113 ReadParam(aReader, &aResult->inet.ip); 114 } else if (aResult->raw.family == AF_INET6) { 115 return ReadParam(aReader, &aResult->inet6.port) && 116 ReadParam(aReader, &aResult->inet6.flowinfo) && 117 ReadParam(aReader, &aResult->inet6.ip.u64[0]) && 118 ReadParam(aReader, &aResult->inet6.ip.u64[1]) && 119 ReadParam(aReader, &aResult->inet6.scope_id); 120 #if defined(XP_UNIX) 121 } else if (aResult->raw.family == AF_LOCAL) { 122 return aReader->ReadBytesInto(&aResult->local.path, 123 sizeof(aResult->local.path)); 124 #endif 125 } 126 127 /* We've been tricked by some socket family we don't know about! */ 128 return false; 129 } 130 }; 131 132 template <> 133 struct ParamTraits<nsIRequest::TRRMode> 134 : public ContiguousEnumSerializerInclusive<nsIRequest::TRRMode, 135 nsIRequest::TRR_DEFAULT_MODE, 136 nsIRequest::TRR_ONLY_MODE> {}; 137 138 template <> 139 struct ParamTraits<nsITRRSkipReason::value> 140 : public ContiguousEnumSerializerInclusive< 141 nsITRRSkipReason::value, nsITRRSkipReason::value::TRR_UNSET, 142 nsITRRSkipReason::value::eLAST_VALUE> {}; 143 144 template <> 145 struct ParamTraits<nsIDNSService::DNSFlags> 146 : public BitFlagsEnumSerializer< 147 nsIDNSService::DNSFlags, nsIDNSService::DNSFlags::ALL_DNSFLAGS_BITS> { 148 }; 149 150 template <> 151 struct ParamTraits<nsIDNSService::ResolverMode> 152 : public ContiguousEnumSerializerInclusive< 153 nsIDNSService::ResolverMode, 154 nsIDNSService::ResolverMode::MODE_NATIVEONLY, 155 nsIDNSService::ResolverMode::MODE_TRROFF> {}; 156 157 template <> 158 struct ParamTraits<nsIClassOfService::FetchPriority> 159 : public ContiguousEnumSerializerInclusive< 160 nsIClassOfService::FetchPriority, 161 nsIClassOfService::FETCHPRIORITY_UNSET, 162 nsIClassOfService::FETCHPRIORITY_HIGH> {}; 163 164 template <> 165 struct ParamTraits<mozilla::net::ClassOfService> { 166 typedef mozilla::net::ClassOfService paramType; 167 168 static void Write(MessageWriter* aWriter, const paramType& aParam) { 169 WriteParam(aWriter, aParam.mClassFlags); 170 WriteParam(aWriter, aParam.mIncremental); 171 WriteParam(aWriter, aParam.mFetchPriority); 172 } 173 174 static bool Read(MessageReader* aReader, paramType* aResult) { 175 if (!ReadParam(aReader, &aResult->mClassFlags) || 176 !ReadParam(aReader, &aResult->mIncremental) || 177 !ReadParam(aReader, &aResult->mFetchPriority)) 178 return false; 179 180 return true; 181 } 182 }; 183 184 template <> 185 struct ParamTraits<struct mozilla::net::LNAPerms> { 186 typedef struct mozilla::net::LNAPerms paramType; 187 188 static void Write(MessageWriter* aWriter, const paramType& aParam) { 189 WriteParam(aWriter, aParam.mLocalHostPermission); 190 WriteParam(aWriter, aParam.mLocalNetworkPermission); 191 } 192 193 static bool Read(MessageReader* aReader, paramType* aResult) { 194 if (!ReadParam(aReader, &aResult->mLocalHostPermission) || 195 !ReadParam(aReader, &aResult->mLocalNetworkPermission)) 196 return false; 197 198 return true; 199 } 200 }; 201 202 template <> 203 struct ParamTraits<mozilla::net::LNAPermission> 204 : public ContiguousEnumSerializerInclusive< 205 mozilla::net::LNAPermission, mozilla::net::LNAPermission::Granted, 206 mozilla::net::LNAPermission::Pending> {}; 207 208 template <> 209 struct ParamTraits<nsICacheInfoChannel::CacheDisposition> 210 : public ContiguousEnumSerializer< 211 nsICacheInfoChannel::CacheDisposition, 212 nsICacheInfoChannel::kCacheUnresolved, 213 nsICacheInfoChannel::kCacheDispositionEnd> {}; 214 215 } // namespace IPC 216 217 #endif // mozilla_net_NeckoMessageUtils_h