xpcom/build/nsXPCOMStrings.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

michael@0 1 /* vim:set ts=2 sw=2 et cindent: */
michael@0 2 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 3 * License, v. 2.0. If a copy of the MPL was not distributed with this
michael@0 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 5
michael@0 6 #include "nsString.h"
michael@0 7 #include "nsCharTraits.h"
michael@0 8
michael@0 9 #include "nsXPCOMStrings.h"
michael@0 10 #include "nsNativeCharsetUtils.h"
michael@0 11
michael@0 12 /* ------------------------------------------------------------------------- */
michael@0 13
michael@0 14 XPCOM_API(nsresult)
michael@0 15 NS_StringContainerInit(nsStringContainer &aContainer)
michael@0 16 {
michael@0 17 NS_ASSERTION(sizeof(nsStringContainer_base) >= sizeof(nsString),
michael@0 18 "nsStringContainer is not large enough");
michael@0 19
michael@0 20 // use placement new to avoid heap allocating nsString object
michael@0 21 new (&aContainer) nsString();
michael@0 22
michael@0 23 return NS_OK;
michael@0 24 }
michael@0 25
michael@0 26 XPCOM_API(nsresult)
michael@0 27 NS_StringContainerInit2(nsStringContainer &aContainer,
michael@0 28 const char16_t *aData,
michael@0 29 uint32_t aDataLength,
michael@0 30 uint32_t aFlags)
michael@0 31 {
michael@0 32 NS_ASSERTION(sizeof(nsStringContainer_base) >= sizeof(nsString),
michael@0 33 "nsStringContainer is not large enough");
michael@0 34
michael@0 35 if (!aData)
michael@0 36 {
michael@0 37 new (&aContainer) nsString();
michael@0 38 }
michael@0 39 else
michael@0 40 {
michael@0 41 if (aDataLength == UINT32_MAX)
michael@0 42 {
michael@0 43 if (NS_WARN_IF(aFlags & NS_STRING_CONTAINER_INIT_SUBSTRING))
michael@0 44 return NS_ERROR_INVALID_ARG;
michael@0 45 aDataLength = nsCharTraits<char16_t>::length(aData);
michael@0 46 }
michael@0 47
michael@0 48 if (aFlags & (NS_STRING_CONTAINER_INIT_DEPEND |
michael@0 49 NS_STRING_CONTAINER_INIT_ADOPT))
michael@0 50 {
michael@0 51 uint32_t flags;
michael@0 52 if (aFlags & NS_STRING_CONTAINER_INIT_SUBSTRING)
michael@0 53 flags = nsSubstring::F_NONE;
michael@0 54 else
michael@0 55 flags = nsSubstring::F_TERMINATED;
michael@0 56
michael@0 57 if (aFlags & NS_STRING_CONTAINER_INIT_ADOPT)
michael@0 58 flags |= nsSubstring::F_OWNED;
michael@0 59
michael@0 60 new (&aContainer) nsSubstring(const_cast<char16_t *>(aData),
michael@0 61 aDataLength, flags);
michael@0 62 }
michael@0 63 else
michael@0 64 {
michael@0 65 new (&aContainer) nsString(aData, aDataLength);
michael@0 66 }
michael@0 67 }
michael@0 68
michael@0 69 return NS_OK;
michael@0 70 }
michael@0 71
michael@0 72 XPCOM_API(void)
michael@0 73 NS_StringContainerFinish(nsStringContainer &aContainer)
michael@0 74 {
michael@0 75 // call the nsString dtor
michael@0 76 reinterpret_cast<nsString *>(&aContainer)->~nsString();
michael@0 77 }
michael@0 78
michael@0 79 /* ------------------------------------------------------------------------- */
michael@0 80
michael@0 81 XPCOM_API(uint32_t)
michael@0 82 NS_StringGetData(const nsAString &aStr, const char16_t **aData,
michael@0 83 bool *aTerminated)
michael@0 84 {
michael@0 85 if (aTerminated)
michael@0 86 *aTerminated = aStr.IsTerminated();
michael@0 87
michael@0 88 nsAString::const_iterator begin;
michael@0 89 aStr.BeginReading(begin);
michael@0 90 *aData = begin.get();
michael@0 91 return begin.size_forward();
michael@0 92 }
michael@0 93
michael@0 94 XPCOM_API(uint32_t)
michael@0 95 NS_StringGetMutableData(nsAString &aStr, uint32_t aDataLength,
michael@0 96 char16_t **aData)
michael@0 97 {
michael@0 98 if (aDataLength != UINT32_MAX) {
michael@0 99 aStr.SetLength(aDataLength);
michael@0 100 if (aStr.Length() != aDataLength) {
michael@0 101 *aData = nullptr;
michael@0 102 return 0;
michael@0 103 }
michael@0 104 }
michael@0 105
michael@0 106 nsAString::iterator begin;
michael@0 107 aStr.BeginWriting(begin);
michael@0 108 *aData = begin.get();
michael@0 109 return begin.size_forward();
michael@0 110 }
michael@0 111
michael@0 112 XPCOM_API(char16_t *)
michael@0 113 NS_StringCloneData(const nsAString &aStr)
michael@0 114 {
michael@0 115 return ToNewUnicode(aStr);
michael@0 116 }
michael@0 117
michael@0 118 XPCOM_API(nsresult)
michael@0 119 NS_StringSetData(nsAString &aStr, const char16_t *aData, uint32_t aDataLength)
michael@0 120 {
michael@0 121 aStr.Assign(aData, aDataLength);
michael@0 122 return NS_OK; // XXX report errors
michael@0 123 }
michael@0 124
michael@0 125 XPCOM_API(nsresult)
michael@0 126 NS_StringSetDataRange(nsAString &aStr,
michael@0 127 uint32_t aCutOffset, uint32_t aCutLength,
michael@0 128 const char16_t *aData, uint32_t aDataLength)
michael@0 129 {
michael@0 130 if (aCutOffset == UINT32_MAX)
michael@0 131 {
michael@0 132 // append case
michael@0 133 if (aData)
michael@0 134 aStr.Append(aData, aDataLength);
michael@0 135 return NS_OK; // XXX report errors
michael@0 136 }
michael@0 137
michael@0 138 if (aCutLength == UINT32_MAX)
michael@0 139 aCutLength = aStr.Length() - aCutOffset;
michael@0 140
michael@0 141 if (aData)
michael@0 142 {
michael@0 143 if (aDataLength == UINT32_MAX)
michael@0 144 aStr.Replace(aCutOffset, aCutLength, nsDependentString(aData));
michael@0 145 else
michael@0 146 aStr.Replace(aCutOffset, aCutLength, Substring(aData, aDataLength));
michael@0 147 }
michael@0 148 else
michael@0 149 aStr.Cut(aCutOffset, aCutLength);
michael@0 150
michael@0 151 return NS_OK; // XXX report errors
michael@0 152 }
michael@0 153
michael@0 154 XPCOM_API(nsresult)
michael@0 155 NS_StringCopy(nsAString &aDest, const nsAString &aSrc)
michael@0 156 {
michael@0 157 aDest.Assign(aSrc);
michael@0 158 return NS_OK; // XXX report errors
michael@0 159 }
michael@0 160
michael@0 161 XPCOM_API(void)
michael@0 162 NS_StringSetIsVoid(nsAString &aStr, const bool aIsVoid)
michael@0 163 {
michael@0 164 aStr.SetIsVoid(aIsVoid);
michael@0 165 }
michael@0 166
michael@0 167 XPCOM_API(bool)
michael@0 168 NS_StringGetIsVoid(const nsAString &aStr)
michael@0 169 {
michael@0 170 return aStr.IsVoid();
michael@0 171 }
michael@0 172
michael@0 173 /* ------------------------------------------------------------------------- */
michael@0 174
michael@0 175 XPCOM_API(nsresult)
michael@0 176 NS_CStringContainerInit(nsCStringContainer &aContainer)
michael@0 177 {
michael@0 178 NS_ASSERTION(sizeof(nsStringContainer_base) >= sizeof(nsCString),
michael@0 179 "nsCStringContainer is not large enough");
michael@0 180
michael@0 181 // use placement new to avoid heap allocating nsCString object
michael@0 182 new (&aContainer) nsCString();
michael@0 183
michael@0 184 return NS_OK;
michael@0 185 }
michael@0 186
michael@0 187 XPCOM_API(nsresult)
michael@0 188 NS_CStringContainerInit2(nsCStringContainer &aContainer,
michael@0 189 const char *aData,
michael@0 190 uint32_t aDataLength,
michael@0 191 uint32_t aFlags)
michael@0 192 {
michael@0 193 NS_ASSERTION(sizeof(nsStringContainer_base) >= sizeof(nsCString),
michael@0 194 "nsStringContainer is not large enough");
michael@0 195
michael@0 196 if (!aData)
michael@0 197 {
michael@0 198 new (&aContainer) nsCString();
michael@0 199 }
michael@0 200 else
michael@0 201 {
michael@0 202 if (aDataLength == UINT32_MAX)
michael@0 203 {
michael@0 204 if (NS_WARN_IF(aFlags & NS_CSTRING_CONTAINER_INIT_SUBSTRING))
michael@0 205 return NS_ERROR_INVALID_ARG;
michael@0 206 aDataLength = nsCharTraits<char>::length(aData);
michael@0 207 }
michael@0 208
michael@0 209 if (aFlags & (NS_CSTRING_CONTAINER_INIT_DEPEND |
michael@0 210 NS_CSTRING_CONTAINER_INIT_ADOPT))
michael@0 211 {
michael@0 212 uint32_t flags;
michael@0 213 if (aFlags & NS_CSTRING_CONTAINER_INIT_SUBSTRING)
michael@0 214 flags = nsCSubstring::F_NONE;
michael@0 215 else
michael@0 216 flags = nsCSubstring::F_TERMINATED;
michael@0 217
michael@0 218 if (aFlags & NS_CSTRING_CONTAINER_INIT_ADOPT)
michael@0 219 flags |= nsCSubstring::F_OWNED;
michael@0 220
michael@0 221 new (&aContainer) nsCSubstring(const_cast<char *>(aData),
michael@0 222 aDataLength, flags);
michael@0 223 }
michael@0 224 else
michael@0 225 {
michael@0 226 new (&aContainer) nsCString(aData, aDataLength);
michael@0 227 }
michael@0 228 }
michael@0 229
michael@0 230 return NS_OK;
michael@0 231 }
michael@0 232
michael@0 233 XPCOM_API(void)
michael@0 234 NS_CStringContainerFinish(nsCStringContainer &aContainer)
michael@0 235 {
michael@0 236 // call the nsCString dtor
michael@0 237 reinterpret_cast<nsCString *>(&aContainer)->~nsCString();
michael@0 238 }
michael@0 239
michael@0 240 /* ------------------------------------------------------------------------- */
michael@0 241
michael@0 242 XPCOM_API(uint32_t)
michael@0 243 NS_CStringGetData(const nsACString &aStr, const char **aData,
michael@0 244 bool *aTerminated)
michael@0 245 {
michael@0 246 if (aTerminated)
michael@0 247 *aTerminated = aStr.IsTerminated();
michael@0 248
michael@0 249 nsACString::const_iterator begin;
michael@0 250 aStr.BeginReading(begin);
michael@0 251 *aData = begin.get();
michael@0 252 return begin.size_forward();
michael@0 253 }
michael@0 254
michael@0 255 XPCOM_API(uint32_t)
michael@0 256 NS_CStringGetMutableData(nsACString &aStr, uint32_t aDataLength, char **aData)
michael@0 257 {
michael@0 258 if (aDataLength != UINT32_MAX) {
michael@0 259 aStr.SetLength(aDataLength);
michael@0 260 if (aStr.Length() != aDataLength) {
michael@0 261 *aData = nullptr;
michael@0 262 return 0;
michael@0 263 }
michael@0 264 }
michael@0 265
michael@0 266 nsACString::iterator begin;
michael@0 267 aStr.BeginWriting(begin);
michael@0 268 *aData = begin.get();
michael@0 269 return begin.size_forward();
michael@0 270 }
michael@0 271
michael@0 272 XPCOM_API(char *)
michael@0 273 NS_CStringCloneData(const nsACString &aStr)
michael@0 274 {
michael@0 275 return ToNewCString(aStr);
michael@0 276 }
michael@0 277
michael@0 278 XPCOM_API(nsresult)
michael@0 279 NS_CStringSetData(nsACString &aStr, const char *aData, uint32_t aDataLength)
michael@0 280 {
michael@0 281 aStr.Assign(aData, aDataLength);
michael@0 282 return NS_OK; // XXX report errors
michael@0 283 }
michael@0 284
michael@0 285 XPCOM_API(nsresult)
michael@0 286 NS_CStringSetDataRange(nsACString &aStr,
michael@0 287 uint32_t aCutOffset, uint32_t aCutLength,
michael@0 288 const char *aData, uint32_t aDataLength)
michael@0 289 {
michael@0 290 if (aCutOffset == UINT32_MAX)
michael@0 291 {
michael@0 292 // append case
michael@0 293 if (aData)
michael@0 294 aStr.Append(aData, aDataLength);
michael@0 295 return NS_OK; // XXX report errors
michael@0 296 }
michael@0 297
michael@0 298 if (aCutLength == UINT32_MAX)
michael@0 299 aCutLength = aStr.Length() - aCutOffset;
michael@0 300
michael@0 301 if (aData)
michael@0 302 {
michael@0 303 if (aDataLength == UINT32_MAX)
michael@0 304 aStr.Replace(aCutOffset, aCutLength, nsDependentCString(aData));
michael@0 305 else
michael@0 306 aStr.Replace(aCutOffset, aCutLength, Substring(aData, aDataLength));
michael@0 307 }
michael@0 308 else
michael@0 309 aStr.Cut(aCutOffset, aCutLength);
michael@0 310
michael@0 311 return NS_OK; // XXX report errors
michael@0 312 }
michael@0 313
michael@0 314 XPCOM_API(nsresult)
michael@0 315 NS_CStringCopy(nsACString &aDest, const nsACString &aSrc)
michael@0 316 {
michael@0 317 aDest.Assign(aSrc);
michael@0 318 return NS_OK; // XXX report errors
michael@0 319 }
michael@0 320
michael@0 321 XPCOM_API(void)
michael@0 322 NS_CStringSetIsVoid(nsACString &aStr, const bool aIsVoid)
michael@0 323 {
michael@0 324 aStr.SetIsVoid(aIsVoid);
michael@0 325 }
michael@0 326
michael@0 327 XPCOM_API(bool)
michael@0 328 NS_CStringGetIsVoid(const nsACString &aStr)
michael@0 329 {
michael@0 330 return aStr.IsVoid();
michael@0 331 }
michael@0 332
michael@0 333 /* ------------------------------------------------------------------------- */
michael@0 334
michael@0 335 XPCOM_API(nsresult)
michael@0 336 NS_CStringToUTF16(const nsACString &aSrc,
michael@0 337 nsCStringEncoding aSrcEncoding,
michael@0 338 nsAString &aDest)
michael@0 339 {
michael@0 340 switch (aSrcEncoding)
michael@0 341 {
michael@0 342 case NS_CSTRING_ENCODING_ASCII:
michael@0 343 CopyASCIItoUTF16(aSrc, aDest);
michael@0 344 break;
michael@0 345 case NS_CSTRING_ENCODING_UTF8:
michael@0 346 CopyUTF8toUTF16(aSrc, aDest);
michael@0 347 break;
michael@0 348 case NS_CSTRING_ENCODING_NATIVE_FILESYSTEM:
michael@0 349 NS_CopyNativeToUnicode(aSrc, aDest);
michael@0 350 break;
michael@0 351 default:
michael@0 352 return NS_ERROR_NOT_IMPLEMENTED;
michael@0 353 }
michael@0 354
michael@0 355 return NS_OK; // XXX report errors
michael@0 356 }
michael@0 357
michael@0 358 XPCOM_API(nsresult)
michael@0 359 NS_UTF16ToCString(const nsAString &aSrc,
michael@0 360 nsCStringEncoding aDestEncoding,
michael@0 361 nsACString &aDest)
michael@0 362 {
michael@0 363 switch (aDestEncoding)
michael@0 364 {
michael@0 365 case NS_CSTRING_ENCODING_ASCII:
michael@0 366 LossyCopyUTF16toASCII(aSrc, aDest);
michael@0 367 break;
michael@0 368 case NS_CSTRING_ENCODING_UTF8:
michael@0 369 CopyUTF16toUTF8(aSrc, aDest);
michael@0 370 break;
michael@0 371 case NS_CSTRING_ENCODING_NATIVE_FILESYSTEM:
michael@0 372 NS_CopyUnicodeToNative(aSrc, aDest);
michael@0 373 break;
michael@0 374 default:
michael@0 375 return NS_ERROR_NOT_IMPLEMENTED;
michael@0 376 }
michael@0 377
michael@0 378 return NS_OK; // XXX report errors
michael@0 379 }

mercurial