From 9a87f6a0e586e2dce82a26cd6c6f57d7c0b6abe3 Mon Sep 17 00:00:00 2001 From: Tim Taubert Date: Tue, 28 Apr 2015 09:13:16 +0200 Subject: [PATCH 001/151] Bug 1050175 - Add raw import/export for EC public keys to the WebCrypto API r=rbarnes,smaug --- dom/crypto/CryptoKey.cpp | 113 +++++++++++++++++----- dom/crypto/CryptoKey.h | 7 ++ dom/crypto/WebCryptoTask.cpp | 47 ++++++++- dom/crypto/test/test-vectors.js | 38 +++++++- dom/crypto/test/test_WebCrypto_ECDH.html | 108 +++++++++++++++++++++ dom/crypto/test/test_WebCrypto_ECDSA.html | 34 +++++++ dom/webidl/SubtleCrypto.webidl | 4 + 7 files changed, 321 insertions(+), 30 deletions(-) diff --git a/dom/crypto/CryptoKey.cpp b/dom/crypto/CryptoKey.cpp index 0ac5bf56380c8..be87903d07660 100644 --- a/dom/crypto/CryptoKey.cpp +++ b/dom/crypto/CryptoKey.cpp @@ -951,6 +951,41 @@ CryptoKey::PrivateKeyToJwk(SECKEYPrivateKey* aPrivKey, } } +SECKEYPublicKey* +CreateECPublicKey(const SECItem* aKeyData, const nsString& aNamedCurve) +{ + ScopedPLArenaPool arena(PORT_NewArena(DER_DEFAULT_CHUNKSIZE)); + if (!arena) { + return nullptr; + } + + SECKEYPublicKey* key = PORT_ArenaZNew(arena, SECKEYPublicKey); + if (!key) { + return nullptr; + } + + key->keyType = ecKey; + key->pkcs11Slot = nullptr; + key->pkcs11ID = CK_INVALID_HANDLE; + + // Create curve parameters. + SECItem* params = CreateECParamsForCurve(aNamedCurve, arena); + if (!params) { + return nullptr; + } + key->u.ec.DEREncodedParams = *params; + + // Set public point. + key->u.ec.publicValue = *aKeyData; + + // Ensure the given point is on the curve. + if (!CryptoKey::PublicKeyValid(key)) { + return nullptr; + } + + return SECKEY_CopyPublicKey(key); +} + SECKEYPublicKey* CryptoKey::PublicKeyFromJwk(const JsonWebKey& aJwk, const nsNSSShutDownPreventionLock& /*proofOfLock*/) @@ -1002,39 +1037,18 @@ CryptoKey::PublicKeyFromJwk(const JsonWebKey& aJwk, return nullptr; } - SECKEYPublicKey* key = PORT_ArenaZNew(arena, SECKEYPublicKey); - if (!key) { - return nullptr; - } - - key->keyType = ecKey; - key->pkcs11Slot = nullptr; - key->pkcs11ID = CK_INVALID_HANDLE; - - nsString namedCurve; - if (!NormalizeToken(aJwk.mCrv.Value(), namedCurve)) { - return nullptr; - } - - // Create parameters. - SECItem* params = CreateECParamsForCurve(namedCurve, arena.get()); - if (!params) { - return nullptr; - } - key->u.ec.DEREncodedParams = *params; - // Create point. SECItem* point = CreateECPointForCoordinates(x, y, arena.get()); if (!point) { return nullptr; } - key->u.ec.publicValue = *point; - if (!PublicKeyValid(key)) { + nsString namedCurve; + if (!NormalizeToken(aJwk.mCrv.Value(), namedCurve)) { return nullptr; } - return SECKEY_CopyPublicKey(key); + return CreateECPublicKey(point, namedCurve); } return nullptr; @@ -1115,6 +1129,57 @@ CryptoKey::PublicDhKeyToRaw(SECKEYPublicKey* aPubKey, return NS_OK; } +SECKEYPublicKey* +CryptoKey::PublicECKeyFromRaw(CryptoBuffer& aKeyData, + const nsString& aNamedCurve, + const nsNSSShutDownPreventionLock& /*proofOfLock*/) +{ + ScopedPLArenaPool arena(PORT_NewArena(DER_DEFAULT_CHUNKSIZE)); + if (!arena) { + return nullptr; + } + + SECItem rawItem = { siBuffer, nullptr, 0 }; + if (!aKeyData.ToSECItem(arena, &rawItem)) { + return nullptr; + } + + uint32_t flen; + if (aNamedCurve.EqualsLiteral(WEBCRYPTO_NAMED_CURVE_P256)) { + flen = 32; // bytes + } else if (aNamedCurve.EqualsLiteral(WEBCRYPTO_NAMED_CURVE_P384)) { + flen = 48; // bytes + } else if (aNamedCurve.EqualsLiteral(WEBCRYPTO_NAMED_CURVE_P521)) { + flen = 66; // bytes + } else { + return nullptr; + } + + // Check length of uncompressed point coordinates. There are 2 field elements + // and a leading point form octet (which must EC_POINT_FORM_UNCOMPRESSED). + if (rawItem.len != (2 * flen + 1)) { + return nullptr; + } + + // No support for compressed points. + if (rawItem.data[0] != EC_POINT_FORM_UNCOMPRESSED) { + return nullptr; + } + + return CreateECPublicKey(&rawItem, aNamedCurve); +} + +nsresult +CryptoKey::PublicECKeyToRaw(SECKEYPublicKey* aPubKey, + CryptoBuffer& aRetVal, + const nsNSSShutDownPreventionLock& /*proofOfLock*/) +{ + if (!aRetVal.Assign(&aPubKey->u.ec.publicValue)) { + return NS_ERROR_DOM_OPERATION_ERR; + } + return NS_OK; +} + bool CryptoKey::PublicKeyValid(SECKEYPublicKey* aPubKey) { diff --git a/dom/crypto/CryptoKey.h b/dom/crypto/CryptoKey.h index e0401edf1b240..e34edcdd4bd22 100644 --- a/dom/crypto/CryptoKey.h +++ b/dom/crypto/CryptoKey.h @@ -180,6 +180,13 @@ class CryptoKey final : public nsISupports, CryptoBuffer& aRetVal, const nsNSSShutDownPreventionLock& /*proofOfLock*/); + static SECKEYPublicKey* PublicECKeyFromRaw(CryptoBuffer& aKeyData, + const nsString& aNamedCurve, + const nsNSSShutDownPreventionLock& /*proofOfLock*/); + static nsresult PublicECKeyToRaw(SECKEYPublicKey* aPubKey, + CryptoBuffer& aRetVal, + const nsNSSShutDownPreventionLock& /*proofOfLock*/); + static bool PublicKeyValid(SECKEYPublicKey* aPubKey); // Structured clone methods use these to clone keys diff --git a/dom/crypto/WebCryptoTask.cpp b/dom/crypto/WebCryptoTask.cpp index fd81d244af3fb..ac260f3b1836e 100644 --- a/dom/crypto/WebCryptoTask.cpp +++ b/dom/crypto/WebCryptoTask.cpp @@ -1644,7 +1644,7 @@ class ImportEcKeyTask : public ImportKeyTask const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - ImportKeyTask::Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); } ImportEcKeyTask(JSContext* aCx, const nsAString& aFormat, @@ -1652,7 +1652,7 @@ class ImportEcKeyTask : public ImportKeyTask const ObjectOrString& aAlgorithm, bool aExtractable, const Sequence& aKeyUsages) { - ImportKeyTask::Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); if (NS_FAILED(mEarlyRv)) { return; } @@ -1661,6 +1661,30 @@ class ImportEcKeyTask : public ImportKeyTask NS_ENSURE_SUCCESS_VOID(mEarlyRv); } + void Init(JSContext* aCx, const nsAString& aFormat, + const ObjectOrString& aAlgorithm, bool aExtractable, + const Sequence& aKeyUsages) + { + ImportKeyTask::Init(aCx, aFormat, aAlgorithm, aExtractable, aKeyUsages); + if (NS_FAILED(mEarlyRv)) { + return; + } + + if (mFormat.EqualsLiteral(WEBCRYPTO_KEY_FORMAT_RAW)) { + RootedDictionary params(aCx); + mEarlyRv = Coerce(aCx, params, aAlgorithm); + if (NS_FAILED(mEarlyRv) || !params.mNamedCurve.WasPassed()) { + mEarlyRv = NS_ERROR_DOM_SYNTAX_ERR; + return; + } + + if (!NormalizeToken(params.mNamedCurve.Value(), mNamedCurve)) { + mEarlyRv = NS_ERROR_DOM_NOT_SUPPORTED_ERR; + return; + } + } + } + private: nsString mNamedCurve; @@ -1680,14 +1704,19 @@ class ImportEcKeyTask : public ImportKeyTask mKey->SetPrivateKey(privKey.get()); mKey->SetType(CryptoKey::PRIVATE); - } else if (mFormat.EqualsLiteral(WEBCRYPTO_KEY_FORMAT_SPKI) || + } else if (mFormat.EqualsLiteral(WEBCRYPTO_KEY_FORMAT_RAW) || + mFormat.EqualsLiteral(WEBCRYPTO_KEY_FORMAT_SPKI) || (mFormat.EqualsLiteral(WEBCRYPTO_KEY_FORMAT_JWK) && !mJwk.mD.WasPassed())) { // Public key import - if (mFormat.EqualsLiteral(WEBCRYPTO_KEY_FORMAT_SPKI)) { + if (mFormat.EqualsLiteral(WEBCRYPTO_KEY_FORMAT_RAW)) { + pubKey = CryptoKey::PublicECKeyFromRaw(mKeyData, mNamedCurve, locker); + } else if (mFormat.EqualsLiteral(WEBCRYPTO_KEY_FORMAT_SPKI)) { pubKey = CryptoKey::PublicKeyFromSpki(mKeyData, locker); - } else { + } else if (mFormat.EqualsLiteral(WEBCRYPTO_KEY_FORMAT_JWK)) { pubKey = CryptoKey::PublicKeyFromJwk(mJwk, locker); + } else { + MOZ_ASSERT(false); } if (!pubKey) { @@ -1901,6 +1930,14 @@ class ExportKeyTask : public WebCryptoTask return NS_OK; } + if (mPublicKey && mPublicKey->keyType == ecKey) { + nsresult rv = CryptoKey::PublicECKeyToRaw(mPublicKey, mResult, locker); + if (NS_FAILED(rv)) { + return NS_ERROR_DOM_OPERATION_ERR; + } + return NS_OK; + } + mResult = mSymKey; if (mResult.Length() == 0) { return NS_ERROR_DOM_NOT_SUPPORTED_ERR; diff --git a/dom/crypto/test/test-vectors.js b/dom/crypto/test/test-vectors.js index ef192c946c13a..d6f822b7373cc 100644 --- a/dom/crypto/test/test-vectors.js +++ b/dom/crypto/test/test-vectors.js @@ -518,6 +518,11 @@ tv = { "405dd1f1adeb090107edcfb2b4963739d87679e3056cb0557d0adf" ), + raw: util.hex2abv( + "045ce7b86e3b32660403e63712ef0998deae1027faec3c1be9f76f934dfeb58e" + + "98f4cf075b39405dd1f1adeb090107edcfb2b4963739d87679e3056cb0557d0adf" + ), + secret: util.hex2abv( "35669cd5c244ba6c1ea89b8802c3d1db815cd769979072e6556eb98548c65f7d" ) @@ -606,7 +611,31 @@ tv = { kty: "EC", crv: "P-256", x: "XOe4bjsyZgQD5jcS7wmY3q4QJ_rsPBvp92-TTf61jpg", - } + }, + + // Public point with Y not on the curve. + raw_bad: util.hex2abv( + "045ce7b86e3b32660403e63712ef0998deae1027faec3c1be9f76f934dfeb58e" + + "98f4cf075b39405dd1f1adeb090106edcfb2b4963739d87679e3056cb0557d0adf" + ), + + // Public point with Y a little too short. + raw_short: util.hex2abv( + "045ce7b86e3b32660403e63712ef0998deae1027faec3c1be9f76f934dfeb58e" + + "98f4cf075b39405dd1f1adeb090107edcfb2b4963739d87679e3056cb0557d0a" + ), + + // Public point with Y a little too long. + raw_long: util.hex2abv( + "045ce7b86e3b32660403e63712ef0998deae1027faec3c1be9f76f934dfeb58e" + + "98f4cf075b39405dd1f1adeb090107edcfb2b4963739d87679e3056cb0557d0adfff" + ), + + // Public point with EC_POINT_FORM_COMPRESSED_Y0. + raw_compressed: util.hex2abv( + "025ce7b86e3b32660403e63712ef0998deae1027faec3c1be9f76f934dfeb58e" + + "98f4cf075b39405dd1f1adeb090107edcfb2b4963739d87679e3056cb0557d0adf" + ) }, // NIST ECDSA test vectors @@ -626,6 +655,13 @@ tv = { "9Y33NGQ1_wQ0GZWDyXxmWpfxL3BvI1faS0Aoje-Ijlnm", }, + raw: util.hex2abv( + "040061387fd6b95914e885f912edfbb5fb274655027f216c4091ca83e19336740fd" + + "81aedfe047f51b42bdf68161121013e0d55b117a14e4303f926c8debb77a7fdaad1" + + "00e7d0c75c38626e895ca21526b9f9fdf84dcecb93f2b233390550d2b1463b7ee3f" + + "58df7346435ff0434199583c97c665a97f12f706f2357da4b40288def888e59e6" + ), + "data": util.hex2abv( "9ecd500c60e701404922e58ab20cc002651fdee7cbc9336adda33e4c1088fab1" + "964ecb7904dc6856865d6c8e15041ccf2d5ac302e99d346ff2f686531d255216" + diff --git a/dom/crypto/test/test_WebCrypto_ECDH.html b/dom/crypto/test/test_WebCrypto_ECDH.html index 4aa2a00e9579b..856e60ba38c67 100644 --- a/dom/crypto/test/test_WebCrypto_ECDH.html +++ b/dom/crypto/test/test_WebCrypto_ECDH.html @@ -438,6 +438,114 @@ .then(memcmp_complete(that, tv.ecdh_p256.secret), error(that)); } ); + +// ----------------------------------------------------------------------------- +TestArray.addTest( + "Raw import/export of a public ECDH key (P-256)", + function () { + var that = this; + var alg = { name: "ECDH", namedCurve: "P-256" }; + + function doExport(x) { + return crypto.subtle.exportKey("raw", x); + } + + crypto.subtle.importKey("raw", tv.ecdh_p256.raw, alg, true, ["deriveBits"]) + .then(doExport) + .then(memcmp_complete(that, tv.ecdh_p256.raw), error(that)); + } +); + +// ----------------------------------------------------------------------------- +TestArray.addTest( + "Test that importing bad raw ECDH keys fails", + function () { + var that = this; + var alg = { name: "ECDH", namedCurve: "P-256" }; + var tvs = tv.ecdh_p256_negative.raw_bad; + + crypto.subtle.importKey("raw", tv, alg, false, ["deriveBits"]) + .then(error(that), complete(that)); + } +); + +// ----------------------------------------------------------------------------- +TestArray.addTest( + "Test that importing ECDH keys with an unknown format fails", + function () { + var that = this; + var alg = { name: "ECDH", namedCurve: "P-256" }; + var tvs = tv.ecdh_p256.raw; + + crypto.subtle.importKey("unknown", tv, alg, false, ["deriveBits"]) + .then(error(that), complete(that)); + } +); + +// ----------------------------------------------------------------------------- +TestArray.addTest( + "Test that importing too short raw ECDH keys fails", + function () { + var that = this; + var alg = { name: "ECDH", namedCurve: "P-256" }; + var tvs = tv.ecdh_p256_negative.raw_short; + + crypto.subtle.importKey("raw", tv, alg, false, ["deriveBits"]) + .then(error(that), complete(that)); + } +); + +// ----------------------------------------------------------------------------- +TestArray.addTest( + "Test that importing too long raw ECDH keys fails", + function () { + var that = this; + var alg = { name: "ECDH", namedCurve: "P-256" }; + var tvs = tv.ecdh_p256_negative.raw_long; + + crypto.subtle.importKey("raw", tv, alg, false, ["deriveBits"]) + .then(error(that), complete(that)); + } +); + +// ----------------------------------------------------------------------------- +TestArray.addTest( + "Test that importing compressed raw ECDH keys fails", + function () { + var that = this; + var alg = { name: "ECDH", namedCurve: "P-256" }; + var tvs = tv.ecdh_p256_negative.raw_compressed; + + crypto.subtle.importKey("raw", tv, alg, false, ["deriveBits"]) + .then(error(that), complete(that)); + } +); + +// ----------------------------------------------------------------------------- +TestArray.addTest( + "RAW/JWK import ECDH keys (P-256) and derive a known secret", + function () { + var that = this; + var alg = { name: "ECDH", namedCurve: "P-256" }; + + var pubKey, privKey; + function setPub(x) { pubKey = x; } + function setPriv(x) { privKey = x; } + + function doDerive() { + var alg = { name: "ECDH", public: pubKey }; + return crypto.subtle.deriveBits(alg, privKey, tv.ecdh_p256.secret.byteLength * 8); + } + + Promise.all([ + crypto.subtle.importKey("raw", tv.ecdh_p256.raw, alg, false, ["deriveBits"]) + .then(setPub), + crypto.subtle.importKey("jwk", tv.ecdh_p256.jwk_priv, alg, false, ["deriveBits"]) + .then(setPriv) + ]).then(doDerive) + .then(memcmp_complete(that, tv.ecdh_p256.secret), error(that)); + } +); /*]]>*/ diff --git a/dom/crypto/test/test_WebCrypto_ECDSA.html b/dom/crypto/test/test_WebCrypto_ECDSA.html index 409928fcc7ed8..3ada61b2d5c05 100644 --- a/dom/crypto/test/test_WebCrypto_ECDSA.html +++ b/dom/crypto/test/test_WebCrypto_ECDSA.html @@ -144,6 +144,40 @@ } ); +// ----------------------------------------------------------------------------- +TestArray.addTest( + "Raw import/export of a public ECDSA key (P-521)", + function () { + var that = this; + var alg = { name: "ECDSA", namedCurve: "P-521", hash: "SHA-512" }; + + function doExport(x) { + return crypto.subtle.exportKey("raw", x); + } + + crypto.subtle.importKey("raw", tv.ecdsa_verify.raw, alg, true, ["verify"]) + .then(doExport) + .then(memcmp_complete(that, tv.ecdsa_verify.raw), error(that)); + } +); + +// ----------------------------------------------------------------------------- +TestArray.addTest( + "ECDSA raw import and verify a known-good signature", + function() { + var that = this; + var alg = { name: "ECDSA", namedCurve: "P-521", hash: "SHA-512" }; + + function doVerify(x) { + return crypto.subtle.verify(alg, x, tv.ecdsa_verify.sig, tv.ecdsa_verify.data); + } + + crypto.subtle.importKey("raw", tv.ecdsa_verify.raw, alg, true, ["verify"]) + .then(doVerify) + .then(complete(that), error(that)) + } +); + /*]]>*/ diff --git a/dom/webidl/SubtleCrypto.webidl b/dom/webidl/SubtleCrypto.webidl index 25f5a4d93d872..9bb530e08c8bc 100644 --- a/dom/webidl/SubtleCrypto.webidl +++ b/dom/webidl/SubtleCrypto.webidl @@ -100,6 +100,10 @@ dictionary EcdsaParams : Algorithm { required AlgorithmIdentifier hash; }; +dictionary EcKeyImportParams : Algorithm { + NamedCurve namedCurve; +}; + /***** JWK *****/ dictionary RsaOtherPrimesInfo { From 58f7625db18b47675527ac0b5e3123de49d64370 Mon Sep 17 00:00:00 2001 From: Michael Layzell Date: Mon, 25 May 2015 13:43:00 +0200 Subject: [PATCH 002/151] Bug 1012662 - Part 1 - Allow document.execCommand('copy'/'cut') in user-generated event handlers. r=ehsan --HG-- extra : rebase_source : fc3525f8a9494cc1f9b01abb00f4d042e8062160 --- dom/html/nsHTMLDocument.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/dom/html/nsHTMLDocument.cpp b/dom/html/nsHTMLDocument.cpp index 3cc31eb2992ee..0986f6f37c916 100644 --- a/dom/html/nsHTMLDocument.cpp +++ b/dom/html/nsHTMLDocument.cpp @@ -3251,8 +3251,11 @@ nsHTMLDocument::ExecCommand(const nsAString& commandID, return false; } + bool isCutCopy = (commandID.LowerCaseEqualsLiteral("cut") || + commandID.LowerCaseEqualsLiteral("copy")); + // if editing is not on, bail - if (!IsEditingOnAfterFlush()) { + if (!isCutCopy && !IsEditingOnAfterFlush()) { rv.Throw(NS_ERROR_FAILURE); return false; } @@ -3262,14 +3265,33 @@ nsHTMLDocument::ExecCommand(const nsAString& commandID, return false; } + // special case for cut & copy + // cut & copy are allowed in non editable documents + if (isCutCopy) { + if (!nsContentUtils::IsCutCopyAllowed()) { + return false; + } + + // For cut & copy commands, we need the behaviour from nsWindowRoot::GetControllers + // which is to look at the focused element, and defer to a focused textbox's controller + // The code past taken by other commands in ExecCommand always uses the window directly, + // rather than deferring to the textbox, which is desireable for most editor commands, + // but not 'cut' and 'copy' (as those should allow copying out of embedded editors). + // This behaviour is invoked if we call DoCommand directly on the docShell. + nsCOMPtr docShell(mDocumentContainer); + if (docShell) { + nsresult res = docShell->DoCommand(cmdToDispatch.get()); + return NS_SUCCEEDED(res); + } + return false; + } + if (commandID.LowerCaseEqualsLiteral("gethtml")) { rv.Throw(NS_ERROR_FAILURE); return false; } - bool restricted = commandID.LowerCaseEqualsLiteral("cut") || - commandID.LowerCaseEqualsLiteral("copy")|| - commandID.LowerCaseEqualsLiteral("paste"); + bool restricted = commandID.LowerCaseEqualsLiteral("paste"); if (restricted && !nsContentUtils::IsCallerChrome()) { rv = NS_ERROR_DOM_SECURITY_ERR; return false; From eb959a2cdfb5fb3b3a69f9410821b0ec9f4524b4 Mon Sep 17 00:00:00 2001 From: Michael Layzell Date: Wed, 13 May 2015 08:51:00 +0200 Subject: [PATCH 003/151] Bug 1012662 - Part 2 - Updates to clipboard command controllers to match cut/copy action spec. r=ehsan --HG-- extra : rebase_source : 1e7a8ff1ae6e243d8ac7a6a5a8efe2ef86a83dc3 --- dom/base/nsCopySupport.cpp | 72 +++++++++++++------ dom/base/nsCopySupport.h | 6 +- dom/base/nsGlobalWindowCommands.cpp | 16 ++++- .../general/test_clipboard_events.html | 2 +- editor/libeditor/nsPlaintextEditor.cpp | 18 +++-- editor/libeditor/nsPlaintextEditor.h | 2 +- 6 files changed, 80 insertions(+), 36 deletions(-) diff --git a/dom/base/nsCopySupport.cpp b/dom/base/nsCopySupport.cpp index 892287077cda1..bde0e70b9172f 100644 --- a/dom/base/nsCopySupport.cpp +++ b/dom/base/nsCopySupport.cpp @@ -620,8 +620,13 @@ IsSelectionInsideRuby(nsISelection* aSelection) } bool -nsCopySupport::FireClipboardEvent(int32_t aType, int32_t aClipboardType, nsIPresShell* aPresShell, nsISelection* aSelection) +nsCopySupport::FireClipboardEvent(int32_t aType, int32_t aClipboardType, nsIPresShell* aPresShell, + nsISelection* aSelection, bool* aActionTaken) { + if (aActionTaken) { + *aActionTaken = false; + } + NS_ASSERTION(aType == NS_CUT || aType == NS_COPY || aType == NS_PASTE, "Invalid clipboard event type"); @@ -646,14 +651,6 @@ nsCopySupport::FireClipboardEvent(int32_t aType, int32_t aClipboardType, nsIPres // retrieve the event target node from the start of the selection nsresult rv; if (sel) { - // Only cut or copy when there is an uncollapsed selection - if (aType == NS_CUT || aType == NS_COPY) { - bool isCollapsed; - sel->GetIsCollapsed(&isCollapsed); - if (isCollapsed) - return false; - } - nsCOMPtr range; rv = sel->GetRangeAt(0, getter_AddRefs(range)); if (NS_SUCCEEDED(rv) && range) { @@ -696,7 +693,7 @@ nsCopySupport::FireClipboardEvent(int32_t aType, int32_t aClipboardType, nsIPres // If the event was cancelled, don't do the clipboard operation doDefault = (status != nsEventStatus_eConsumeNoDefault); } - + // No need to do anything special during a paste. Either an event listener // took care of it and cancelled the event, or the caller will handle it. // Return true to indicate that the event wasn't cancelled. @@ -708,6 +705,9 @@ nsCopySupport::FireClipboardEvent(int32_t aType, int32_t aClipboardType, nsIPres clipboardData->SetReadOnly(); } + if (aActionTaken) { + *aActionTaken = true; + } return doDefault; } @@ -721,20 +721,43 @@ nsCopySupport::FireClipboardEvent(int32_t aType, int32_t aClipboardType, nsIPres // use the data added to the data transfer and copy that instead. uint32_t count = 0; if (doDefault) { - // get the data from the selection if any - bool isCollapsed; - sel->GetIsCollapsed(&isCollapsed); - if (isCollapsed) { - return false; + // find the focused node + nsCOMPtr srcNode = content; + if (content->IsInNativeAnonymousSubtree()) { + srcNode = content->FindFirstNonChromeOnlyAccessContent(); } - // XXX Code which decides whether we should copy text with ruby - // annotation is currenct depending on whether each range of the - // selection is inside a same ruby container. But we really should - // expose the full functionality in browser. See bug 1130891. - bool withRubyAnnotation = IsSelectionInsideRuby(sel); - // call the copy code - rv = HTMLCopy(sel, doc, aClipboardType, withRubyAnnotation); - if (NS_FAILED(rv)) { + + // check if we are looking at a password input + nsCOMPtr formControl = do_QueryInterface(srcNode); + if (formControl) { + if (formControl->GetType() == NS_FORM_INPUT_PASSWORD) { + return false; + } + } + + // when cutting non-editable content, do nothing + // XXX this is probably the wrong editable flag to check + if (aType != NS_CUT || content->IsEditable()) { + // get the data from the selection if any + bool isCollapsed; + sel->GetIsCollapsed(&isCollapsed); + if (isCollapsed) { + if (aActionTaken) { + *aActionTaken = true; + } + return false; + } + // XXX Code which decides whether we should copy text with ruby + // annotation is currenct depending on whether each range of the + // selection is inside a same ruby container. But we really should + // expose the full functionality in browser. See bug 1130891. + bool withRubyAnnotation = IsSelectionInsideRuby(sel); + // call the copy code + rv = HTMLCopy(sel, doc, aClipboardType, withRubyAnnotation); + if (NS_FAILED(rv)) { + return false; + } + } else { return false; } } else if (clipboardData) { @@ -763,5 +786,8 @@ nsCopySupport::FireClipboardEvent(int32_t aType, int32_t aClipboardType, nsIPres piWindow->UpdateCommands(NS_LITERAL_STRING("clipboard"), nullptr, 0); } + if (aActionTaken) { + *aActionTaken = true; + } return doDefault; } diff --git a/dom/base/nsCopySupport.h b/dom/base/nsCopySupport.h index 15670a52198d8..222134c259347 100644 --- a/dom/base/nsCopySupport.h +++ b/dom/base/nsCopySupport.h @@ -83,12 +83,16 @@ class nsCopySupport * * aClipboardType specifies which clipboard to use, from nsIClipboard. * + * If aActionTaken is non-NULL, it will be set to true if an action was + * taken, whether it be the default action or the default being prevented. + * * If the event is cancelled or an error occurs, false will be returned. */ static bool FireClipboardEvent(int32_t aType, int32_t aClipboardType, nsIPresShell* aPresShell, - nsISelection* aSelection); + nsISelection* aSelection, + bool* aActionTaken = nullptr); }; #endif diff --git a/dom/base/nsGlobalWindowCommands.cpp b/dom/base/nsGlobalWindowCommands.cpp index a1f2fac33960a..738d228f6c911 100644 --- a/dom/base/nsGlobalWindowCommands.cpp +++ b/dom/base/nsGlobalWindowCommands.cpp @@ -500,7 +500,8 @@ nsClipboardCommand::IsCommandEnabled(const char* aCommandName, nsISupports *aCon nsresult nsClipboardCommand::DoCommand(const char *aCommandName, nsISupports *aContext) { - if (strcmp(aCommandName, "cmd_copy") && + if (strcmp(aCommandName, "cmd_cut") && + strcmp(aCommandName, "cmd_copy") && strcmp(aCommandName, "cmd_copyAndCollapseToEnd")) return NS_OK; @@ -513,7 +514,13 @@ nsClipboardCommand::DoCommand(const char *aCommandName, nsISupports *aContext) nsCOMPtr presShell = docShell->GetPresShell(); NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE); - nsCopySupport::FireClipboardEvent(NS_COPY, nsIClipboard::kGlobalClipboard, presShell, nullptr); + int32_t eventType = NS_COPY; + if (strcmp(aCommandName, "cmd_cut") == 0) { + eventType = NS_CUT; + } + + bool actionTaken = false; + nsCopySupport::FireClipboardEvent(eventType, nsIClipboard::kGlobalClipboard, presShell, nullptr, &actionTaken); if (!strcmp(aCommandName, "cmd_copyAndCollapseToEnd")) { dom::Selection *sel = @@ -522,7 +529,10 @@ nsClipboardCommand::DoCommand(const char *aCommandName, nsISupports *aContext) sel->CollapseToEnd(); } - return NS_OK; + if (actionTaken) { + return NS_OK; + } + return NS_ERROR_FAILURE; } NS_IMETHODIMP diff --git a/dom/tests/mochitest/general/test_clipboard_events.html b/dom/tests/mochitest/general/test_clipboard_events.html index 5daa0d4f2a3ea..eeae382cd5475 100644 --- a/dom/tests/mochitest/general/test_clipboard_events.html +++ b/dom/tests/mochitest/general/test_clipboard_events.html @@ -150,7 +150,7 @@ content.oncut = function() { oncut_fired = true; }; try { synthesizeKey("x", {accelKey: 1}); - ok(!oncut_fired, "cut event firing on DOM element") + ok(oncut_fired, "cut event firing on DOM element") is(getClipboardText(), clipboardInitialValue, "cut on DOM element did not modify clipboard"); } finally { diff --git a/editor/libeditor/nsPlaintextEditor.cpp b/editor/libeditor/nsPlaintextEditor.cpp index 7533eb3cca644..7a05f13215f6f 100644 --- a/editor/libeditor/nsPlaintextEditor.cpp +++ b/editor/libeditor/nsPlaintextEditor.cpp @@ -1168,7 +1168,7 @@ nsPlaintextEditor::CanCutOrCopy(PasswordFieldAllowed aPasswordFieldAllowed) } bool -nsPlaintextEditor::FireClipboardEvent(int32_t aType, int32_t aSelectionType) +nsPlaintextEditor::FireClipboardEvent(int32_t aType, int32_t aSelectionType, bool* aActionTaken) { if (aType == NS_PASTE) ForceCompositionEnd(); @@ -1181,7 +1181,7 @@ nsPlaintextEditor::FireClipboardEvent(int32_t aType, int32_t aSelectionType) return false; } - if (!nsCopySupport::FireClipboardEvent(aType, aSelectionType, presShell, selection)) + if (!nsCopySupport::FireClipboardEvent(aType, aSelectionType, presShell, selection, aActionTaken)) return false; // If the event handler caused the editor to be destroyed, return false. @@ -1191,9 +1191,11 @@ nsPlaintextEditor::FireClipboardEvent(int32_t aType, int32_t aSelectionType) NS_IMETHODIMP nsPlaintextEditor::Cut() { - if (FireClipboardEvent(NS_CUT, nsIClipboard::kGlobalClipboard)) - return DeleteSelection(eNone, eStrip); - return NS_OK; + bool actionTaken = false; + if (FireClipboardEvent(NS_CUT, nsIClipboard::kGlobalClipboard, &actionTaken)) { + DeleteSelection(eNone, eStrip); + } + return actionTaken ? NS_OK : NS_ERROR_FAILURE; } NS_IMETHODIMP nsPlaintextEditor::CanCut(bool *aCanCut) @@ -1205,8 +1207,10 @@ NS_IMETHODIMP nsPlaintextEditor::CanCut(bool *aCanCut) NS_IMETHODIMP nsPlaintextEditor::Copy() { - FireClipboardEvent(NS_COPY, nsIClipboard::kGlobalClipboard); - return NS_OK; + bool actionTaken = false; + FireClipboardEvent(NS_COPY, nsIClipboard::kGlobalClipboard, &actionTaken); + + return actionTaken ? NS_OK : NS_ERROR_FAILURE; } NS_IMETHODIMP nsPlaintextEditor::CanCopy(bool *aCanCopy) diff --git a/editor/libeditor/nsPlaintextEditor.h b/editor/libeditor/nsPlaintextEditor.h index cf32364be9962..79b5bd7b41e47 100644 --- a/editor/libeditor/nsPlaintextEditor.h +++ b/editor/libeditor/nsPlaintextEditor.h @@ -207,7 +207,7 @@ class nsPlaintextEditor : public nsEditor, ePasswordFieldNotAllowed }; bool CanCutOrCopy(PasswordFieldAllowed aPasswordFieldAllowed); - bool FireClipboardEvent(int32_t aType, int32_t aSelectionType); + bool FireClipboardEvent(int32_t aType, int32_t aSelectionType, bool* aActionTaken = nullptr); bool UpdateMetaCharset(nsIDOMDocument* aDocument, const nsACString& aCharacterSet); From 827fee71cd16880c964d263ad9e1bf6d2abd48bc Mon Sep 17 00:00:00 2001 From: Michael Layzell Date: Wed, 27 May 2015 06:54:00 +0200 Subject: [PATCH 004/151] Bug 1012662 - Part 3 - Tests for new Cut/Copy behaviour. r=ehsan --HG-- extra : rebase_source : e087d44fad03beb9754fc07d9776048f8ad6b8f7 --- dom/tests/mochitest/general/mochitest.ini | 3 + .../general/test_bug1012662_common.js | 341 ++++++++++++++++++ .../general/test_bug1012662_editor.html | 29 ++ .../general/test_bug1012662_noeditor.html | 28 ++ .../mochitest/tests/SimpleTest/SimpleTest.js | 45 ++- 5 files changed, 436 insertions(+), 10 deletions(-) create mode 100644 dom/tests/mochitest/general/test_bug1012662_common.js create mode 100644 dom/tests/mochitest/general/test_bug1012662_editor.html create mode 100644 dom/tests/mochitest/general/test_bug1012662_noeditor.html diff --git a/dom/tests/mochitest/general/mochitest.ini b/dom/tests/mochitest/general/mochitest.ini index d1368823c9641..021d1978f1ce5 100644 --- a/dom/tests/mochitest/general/mochitest.ini +++ b/dom/tests/mochitest/general/mochitest.ini @@ -36,6 +36,7 @@ support-files = res8.resource^headers^ resource_timing.js navigation_timing.html + test_bug1012662_common.js [test_497898.html] skip-if = ((buildapp == 'mulet' || buildapp == 'b2g') && toolkit != 'gonk') || toolkit == 'android' #Bug 931116, b2g desktop specific, initial triage @@ -100,4 +101,6 @@ skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop spec skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage [test_navigation_timing.html] skip-if = buildapp == 'b2g' || buildapp == 'mulet' +[test_bug1012662_editor.html] +[test_bug1012662_noeditor.html] [test_bug1161721.html] diff --git a/dom/tests/mochitest/general/test_bug1012662_common.js b/dom/tests/mochitest/general/test_bug1012662_common.js new file mode 100644 index 0000000000000..0d1ba29631a57 --- /dev/null +++ b/dom/tests/mochitest/general/test_bug1012662_common.js @@ -0,0 +1,341 @@ +/** Test for Bug 1012662 **/ +// This test is called from both test_bug1012662_editor.html and test_bug1012662_noeditor.html +// This is to test that the code works both in the presence of a contentEditable node, and in the absense of one +var WATCH_TIMEOUT = 300; + +// Some global variables to make the debug messages easier to track down +var gTestN0 = 0, gTestN1 = 0, gTestN2 = 0; +function testLoc() { return " " + gTestN0 + " - " + gTestN1 + " - " + gTestN2; } + +// Listen for cut & copy events +var gCopyCount = 0, gCutCount = 0; +document.addEventListener('copy', function() { + gCopyCount++; +}); +document.addEventListener('cut', function() { + gCutCount++; +}); + + +// Helper methods +function selectNode(aSelector, aCb) { + var dn = document.querySelector(aSelector); + var range = document.createRange(); + range.selectNodeContents(dn); + window.getSelection().removeAllRanges(); + window.getSelection().addRange(range); + if (aCb) { + aCb(); + } +} + +function selectInputNode(aSelector, aCb) { + var dn = document.querySelector(aSelector); + synthesizeMouse(dn, 10, 10, {}); + SimpleTest.executeSoon(function() { + synthesizeKey("A", {accelKey: true}); + SimpleTest.executeSoon(aCb); + }); +} + +// Callback functions for attaching to the button +function execCut(aShouldSucceed) { + var cb = function(e) { + e.preventDefault(); + document.removeEventListener('keydown', cb); + + is(aShouldSucceed, document.execCommand('cut'), "Keydown caused cut invocation" + testLoc()); + }; + return cb; +} +function execCopy(aShouldSucceed) { + var cb = function(e) { + e.preventDefault(); + document.removeEventListener('keydown', cb); + + is(aShouldSucceed, document.execCommand('copy'), "Keydown caused copy invocation" + testLoc()); + }; + return cb; +} + +// The basic test set. Tries to cut/copy everything +function cutCopyAll(aDoCut, aDoCopy, aDone, aNegate, aClipOverride, aJustClipboardNegate) { + var execCommandAlwaysSucceed = !!(aClipOverride || aJustClipboardNegate); + + function waitForClipboard(aCond, aSetup, aNext, aNegateOne) { + if (aClipOverride) { + aCond = aClipOverride; + aNegateOne = false; + } + if (aNegate || aNegateOne || aJustClipboardNegate) { + SimpleTest.waitForClipboard(null, aSetup, aNext, aNext, "text/unicode", WATCH_TIMEOUT, true); + } else { + SimpleTest.waitForClipboard(aCond, aSetup, aNext, aNext); + } + } + + function validateCutCopy(aExpectedCut, aExpectedCopy) { + if (aNegate) { + aExpectedCut = aExpectedCopy = 0; + } // When we are negating - we always expect callbacks not to be run + + is(aExpectedCut, gCutCount, + (aExpectedCut > 0 ? "Expect cut callback to run" : "Expect cut callback not to run") + testLoc()); + is(aExpectedCopy, gCopyCount, + (aExpectedCopy > 0 ? "Expect copy callback to run" : "Expect copy callback not to run") + testLoc()); + gCutCount = gCopyCount = 0; + } + + function step(n) { + function nextStep() { step(n + 1); } + + document.querySelector('span').textContent = 'span text'; + document.querySelector('input[type=text]').value = 'text text'; + document.querySelector('input[type=password]').value = 'password text'; + document.querySelector('textarea').value = 'textarea text'; + + var contentEditableNode = document.querySelector('div[contentEditable=true]'); + if (contentEditableNode) { + contentEditableNode.textContent = 'contenteditable text'; + } + + gTestN2 = n; + switch (n) { + case 0: + // copy on readonly selection + selectNode('span'); + waitForClipboard("span text", function() { + aDoCopy(true); + }, nextStep); + return; + + case 1: + validateCutCopy(0, 1); + + // cut on readonly selection + selectNode('span'); + + waitForClipboard("span text", function() { + aDoCut(execCommandAlwaysSucceed); + }, nextStep, true); + return; + + case 2: + validateCutCopy(1, 0); + + // copy on textbox selection + selectInputNode('input[type=text]', nextStep); + return; + + case 3: + waitForClipboard("text text", function() { + selectInputNode('input[type=text]', function() { aDoCopy(true); }); + }, nextStep); + return; + + case 4: + validateCutCopy(0, 1); + + // cut on textbox selection + selectInputNode('input[type=text]', nextStep); + return; + + case 5: + waitForClipboard("text text", function() { + aDoCut(true); + }, nextStep); + return; + + case 6: + validateCutCopy(1, 0); + + // copy on password selection + selectInputNode('input[type=password]', nextStep); + return; + + case 7: + waitForClipboard(null, function() { + aDoCopy(execCommandAlwaysSucceed); + }, nextStep, true); + return; + + case 8: + validateCutCopy(0, 1); + + // cut on password selection + selectInputNode('input[type=password]', nextStep); + return; + + case 9: + waitForClipboard(null, function() { + aDoCut(execCommandAlwaysSucceed); + }, nextStep, true); + return; + + case 10: + validateCutCopy(1, 0); + + // copy on textarea selection + selectInputNode('textarea', nextStep); + return; + + case 11: + waitForClipboard("textarea text", function() { + aDoCopy(true); + }, nextStep); + return; + + case 12: + validateCutCopy(0, 1); + + // cut on password selection + selectInputNode('textarea', nextStep); + return; + + case 13: + waitForClipboard("textarea text", function() { + aDoCut(true); + }, nextStep); + return; + + case 14: + validateCutCopy(1, 0); + + // copy on no selection + document.querySelector('textarea').blur(); + + waitForClipboard(null, function() { + aDoCopy(true); + }, nextStep, true); + return; + + case 15: + validateCutCopy(0, 1); + + // cut on no selection + waitForClipboard(null, function() { + aDoCut(execCommandAlwaysSucceed); + }, nextStep, true); + return; + + case 16: + validateCutCopy(1, 0); + + if (!document.querySelector('div[contentEditable=true]')) { + // We're done! (no contentEditable node!) + step(-1); + return; + } + break; + + case 17: + // copy on contenteditable selection + waitForClipboard("contenteditable text", function() { + selectNode('div[contentEditable=true]', function() { + aDoCopy(true); + }); + }, nextStep); + return; + + case 18: + validateCutCopy(0, 1); + break; + + case 19: + // cut on contenteditable selection + waitForClipboard("contenteditable text", function() { + selectNode('div[contentEditable=true]', function() { + aDoCut(true); + }); + }, nextStep); + return; + + case 20: + validateCutCopy(1, 0); + break; + + default: + aDone(); + return; + } + + SimpleTest.executeSoon(function() { step(n + 1); }); + } + + step(0); +} + +function allMechanisms(aCb, aClipOverride, aNegateAll) { + function testStep(n) { + gTestN1 = n; + switch (n) { + case 0: + // Keyboard issued + cutCopyAll(function docut(aSucc) { + synthesizeKey("X", {accelKey: true}); + }, function docopy(aSucc) { + synthesizeKey("C", {accelKey: true}); + }, function done() { testStep(n + 1); }, false, aClipOverride, aNegateAll); + return; + + case 1: + // Button issued + cutCopyAll(function docut(aSucc) { + document.addEventListener('keydown', execCut(aSucc)); + synthesizeKey("Q", {}); + }, function docopy(aSucc) { + document.addEventListener('keydown', execCopy(aSucc)); + synthesizeKey("Q", {}); + }, function done() { testStep(n + 1); }, false, aClipOverride, aNegateAll); + return; + + case 2: + // Button issued + cutCopyAll(function doCut(aSucc) { + is(false, document.execCommand('cut'), "Can't directly execCommand not in a user callback"); + }, function doCopy(aSucc) { + is(false, document.execCommand('copy'), "Can't directly execCommand not in a user callback"); + }, function done() { testStep(n + 1); }, true, aClipOverride, aNegateAll); + return; + + default: + aCb(); + return; + } + + SimpleTest.executeSoon(function() { testStep(n + 1); }); + } + testStep(0); +} + +// Run the tests +SimpleTest.waitForExplicitFinish(); +SimpleTest.requestLongerTimeout(5); // On the emulator - this times out occasionally +SimpleTest.waitForFocus(function() { + function justCancel(aEvent) { + aEvent.preventDefault(); + } + + function override(aEvent) { + aEvent.clipboardData.setData('text/plain', 'overridden'); + aEvent.preventDefault(); + } + + allMechanisms(function() { + gTestN0 = 1; + document.addEventListener('cut', override); + document.addEventListener('copy', override); + + allMechanisms(function() { + gTestN0 = 2; + document.removeEventListener('cut', override); + document.removeEventListener('copy', override); + document.addEventListener('cut', justCancel); + document.addEventListener('copy', justCancel); + + allMechanisms(function() { + SimpleTest.finish(); + }, null, true); + }, 'overridden'); + }); +}); diff --git a/dom/tests/mochitest/general/test_bug1012662_editor.html b/dom/tests/mochitest/general/test_bug1012662_editor.html new file mode 100644 index 0000000000000..c77adcfc749c2 --- /dev/null +++ b/dom/tests/mochitest/general/test_bug1012662_editor.html @@ -0,0 +1,29 @@ + + + + + Test for Bug 1012662 + + + + + + +Mozilla Bug 1012662 +

+ +
+ span text + + + +
contenteditable text
+
+ +
+
+
+ + diff --git a/dom/tests/mochitest/general/test_bug1012662_noeditor.html b/dom/tests/mochitest/general/test_bug1012662_noeditor.html new file mode 100644 index 0000000000000..a3c2be71e18e4 --- /dev/null +++ b/dom/tests/mochitest/general/test_bug1012662_noeditor.html @@ -0,0 +1,28 @@ + + + + + Test for Bug 1012662 + + + + + + +Mozilla Bug 1012662 +

+ +
+ span text + + + +
+ +
+
+
+ + diff --git a/testing/mochitest/tests/SimpleTest/SimpleTest.js b/testing/mochitest/tests/SimpleTest/SimpleTest.js index 1a752c222d2bc..20df877fbdb05 100644 --- a/testing/mochitest/tests/SimpleTest/SimpleTest.js +++ b/testing/mochitest/tests/SimpleTest/SimpleTest.js @@ -896,19 +896,45 @@ SimpleTest.waitForClipboard_polls = 0; * A function called if the expected value isn't found on the clipboard * within 5s. It can also be called if the known value can't be found. * @param aFlavor [optional] The flavor to look for. Defaults to "text/unicode". + * @param aTimeout [optional] + * The timeout (in milliseconds) to wait for a clipboard change. + * Defaults to 5000. + * @param aExpectFailure [optional] + * If true, fail if the clipboard contents are modified within the timeout + * interval defined by aTimeout. When aExpectFailure is true, the argument + * aExpectedStringOrValidatorFn must be null, as it won't be used. + * Defaults to false. */ SimpleTest.__waitForClipboardMonotonicCounter = 0; SimpleTest.__defineGetter__("_waitForClipboardMonotonicCounter", function () { return SimpleTest.__waitForClipboardMonotonicCounter++; }); SimpleTest.waitForClipboard = function(aExpectedStringOrValidatorFn, aSetupFn, - aSuccessFn, aFailureFn, aFlavor) { + aSuccessFn, aFailureFn, aFlavor, aTimeout, aExpectFailure) { var requestedFlavor = aFlavor || "text/unicode"; - // Build a default validator function for common string input. - var inputValidatorFn = typeof(aExpectedStringOrValidatorFn) == "string" - ? function(aData) { return aData == aExpectedStringOrValidatorFn; } - : aExpectedStringOrValidatorFn; + // The known value we put on the clipboard before running aSetupFn + var initialVal = SimpleTest._waitForClipboardMonotonicCounter + + "-waitForClipboard-known-value"; + + var inputValidatorFn; + if (aExpectFailure) { + // If we expect failure, the aExpectedStringOrValidatorFn should be null + if (aExpectedStringOrValidatorFn !== null) { + SimpleTest.ok(false, "When expecting failure, aExpectedStringOrValidatorFn must be null"); + } + + inputValidatorFn = function(aData) { + return aData != initialVal; + }; + } else { + // Build a default validator function for common string input. + inputValidatorFn = typeof(aExpectedStringOrValidatorFn) == "string" + ? function(aData) { return aData == aExpectedStringOrValidatorFn; } + : aExpectedStringOrValidatorFn; + } + + var maxPolls = aTimeout ? aTimeout / 100 : 50; // reset for the next use function reset() { @@ -916,9 +942,9 @@ SimpleTest.waitForClipboard = function(aExpectedStringOrValidatorFn, aSetupFn, } function wait(validatorFn, successFn, failureFn, flavor) { - if (++SimpleTest.waitForClipboard_polls > 50) { + if (++SimpleTest.waitForClipboard_polls > maxPolls) { // Log the failure. - SimpleTest.ok(false, "Timed out while polling clipboard for pasted data."); + SimpleTest.ok(aExpectFailure, "Timed out while polling clipboard for pasted data"); reset(); failureFn(); return; @@ -931,7 +957,7 @@ SimpleTest.waitForClipboard = function(aExpectedStringOrValidatorFn, aSetupFn, if (preExpectedVal) preExpectedVal = null; else - SimpleTest.ok(true, "Clipboard has the correct value"); + SimpleTest.ok(!aExpectFailure, "Clipboard has the given value"); reset(); successFn(); } else { @@ -940,8 +966,7 @@ SimpleTest.waitForClipboard = function(aExpectedStringOrValidatorFn, aSetupFn, } // First we wait for a known value different from the expected one. - var preExpectedVal = SimpleTest._waitForClipboardMonotonicCounter + - "-waitForClipboard-known-value"; + var preExpectedVal = initialVal; SpecialPowers.clipboardCopyString(preExpectedVal); wait(function(aData) { return aData == preExpectedVal; }, function() { From adddf68b3c854975e751437fcd9818f8acdaeedb Mon Sep 17 00:00:00 2001 From: Honza Bambas Date: Mon, 13 Apr 2015 16:58:00 +0200 Subject: [PATCH 005/151] Bug 1122420 - Improve after-shutdown dispatch assertion on CacheIOThread. r=michal --HG-- extra : rebase_source : f4e438e004b4e18e81ce35db5659a6c9cef18ce1 --- netwerk/cache2/CacheIOThread.cpp | 6 +++++- netwerk/cache2/CacheIOThread.h | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/netwerk/cache2/CacheIOThread.cpp b/netwerk/cache2/CacheIOThread.cpp index 8a2737c023c53..9eee735cb9abe 100644 --- a/netwerk/cache2/CacheIOThread.cpp +++ b/netwerk/cache2/CacheIOThread.cpp @@ -27,6 +27,7 @@ CacheIOThread::CacheIOThread() , mHasXPCOMEvents(false) , mRerunCurrentEvent(false) , mShutdown(false) +, mInsideLoop(true) { sSelf = this; } @@ -237,6 +238,9 @@ void CacheIOThread::ThreadFunc() } while (true); MOZ_ASSERT(!EventsPending()); + + // This is for correct assertion on XPCOM events dispatch. + mInsideLoop = false; } // lock if (threadInternal) @@ -313,7 +317,7 @@ NS_IMETHODIMP CacheIOThread::OnDispatchedEvent(nsIThreadInternal *thread) { MonitorAutoLock lock(mMonitor); mHasXPCOMEvents = true; - MOZ_ASSERT(!mShutdown || (PR_GetCurrentThread() == mThread)); + MOZ_ASSERT(mInsideLoop); lock.Notify(); return NS_OK; } diff --git a/netwerk/cache2/CacheIOThread.h b/netwerk/cache2/CacheIOThread.h index b84b27ae7230b..c276546f69c2c 100644 --- a/netwerk/cache2/CacheIOThread.h +++ b/netwerk/cache2/CacheIOThread.h @@ -11,6 +11,7 @@ #include "nsTArray.h" #include "nsAutoPtr.h" #include "mozilla/Monitor.h" +#include "mozilla/DebugOnly.h" class nsIRunnable; @@ -94,6 +95,7 @@ class CacheIOThread : public nsIThreadObserver bool mHasXPCOMEvents; bool mRerunCurrentEvent; bool mShutdown; + DebugOnly mInsideLoop; }; } // net From aa913043f6128f0306828bdaaf0c47cd9bf3699a Mon Sep 17 00:00:00 2001 From: Andrew McCreight Date: Wed, 27 May 2015 07:53:00 +0200 Subject: [PATCH 006/151] Bug 1157308 - part 1 - Reduce the leak threshold for content processes more. r=erahm --- layout/tools/reftest/runreftest.py | 2 +- testing/mochitest/mochitest_options.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/layout/tools/reftest/runreftest.py b/layout/tools/reftest/runreftest.py index fda6b857b2577..5a1cd3fd89d9b 100644 --- a/layout/tools/reftest/runreftest.py +++ b/layout/tools/reftest/runreftest.py @@ -820,7 +820,7 @@ def verifyCommonOptions(self, options, reftest): options.leakThresholds = { "default": options.defaultLeakThreshold, - "tab": 25000, # See dependencies of bug 1051230. + "tab": 5000, # See dependencies of bug 1051230. } return options diff --git a/testing/mochitest/mochitest_options.py b/testing/mochitest/mochitest_options.py index 2453f69336600..51fec77fa9bed 100644 --- a/testing/mochitest/mochitest_options.py +++ b/testing/mochitest/mochitest_options.py @@ -718,7 +718,7 @@ def validate(self, parser, options, context): options.leakThresholds = { "default": options.defaultLeakThreshold, - "tab": 25000, # See dependencies of bug 1051230. + "tab": 10000, # See dependencies of bug 1051230. # GMP rarely gets a log, but when it does, it leaks a little. "geckomediaplugin": 20000, } From 95802bd4a7383d3f9e72d3ad4e592aee67da5e66 Mon Sep 17 00:00:00 2001 From: Andrew McCreight Date: Wed, 27 May 2015 09:33:00 +0200 Subject: [PATCH 007/151] Bug 1157308 - part 2 - Reduce the content process leak limit on OS X. r=erahm The intermittent media leak seems to have been fixed. --- testing/mochitest/mochitest_options.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/testing/mochitest/mochitest_options.py b/testing/mochitest/mochitest_options.py index 51fec77fa9bed..0e9487a23d1a4 100644 --- a/testing/mochitest/mochitest_options.py +++ b/testing/mochitest/mochitest_options.py @@ -728,10 +728,6 @@ def validate(self, parser, options, context): if mozinfo.isWin: options.ignoreMissingLeaks.append("tab") - # Bug 1121539 - OSX-only intermittent tab process leak in test_ipc.html - if mozinfo.isMac: - options.leakThresholds["tab"] = 100000 - return options From 1ea1d4d58773b7171bd85b2a8e80e4a154c7409a Mon Sep 17 00:00:00 2001 From: Nicholas Hurley Date: Wed, 27 May 2015 09:49:00 +0200 Subject: [PATCH 008/151] Bug 1159747 - delete h2 static compression table in such a way to avoid crashes after network changes. r=mcmanus --- netwerk/build/nsNetModule.cpp | 5 +++++ netwerk/protocol/http/Http2Compression.cpp | 4 ++++ netwerk/protocol/http/nsHttpConnectionMgr.cpp | 2 -- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/netwerk/build/nsNetModule.cpp b/netwerk/build/nsNetModule.cpp index 63ee99de43da3..568d5152288d2 100644 --- a/netwerk/build/nsNetModule.cpp +++ b/netwerk/build/nsNetModule.cpp @@ -225,6 +225,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsFtpProtocolHandler, Init) #ifdef NECKO_PROTOCOL_http // http/https #include "nsHttpHandler.h" +#include "Http2Compression.h" #undef LOG #undef LOG_ENABLED #include "nsHttpAuthManager.h" @@ -655,6 +656,10 @@ static void nsNetShutdown() mozilla::net::WebSocketChannel::Shutdown(); #endif // NECKO_PROTOCOL_websocket +#ifdef NECKO_PROTOCOL_http + mozilla::net::Http2CompressionCleanup(); +#endif // NECKO_PROTOCOL_http + delete gNetSniffers; gNetSniffers = nullptr; delete gDataSniffers; diff --git a/netwerk/protocol/http/Http2Compression.cpp b/netwerk/protocol/http/Http2Compression.cpp index 854a02889bcc3..cf649612eae27 100644 --- a/netwerk/protocol/http/Http2Compression.cpp +++ b/netwerk/protocol/http/Http2Compression.cpp @@ -228,6 +228,10 @@ Http2BaseCompressor::MakeRoom(uint32_t amount, const char *direction) void Http2BaseCompressor::DumpState() { + if (!LOG_ENABLED()) { + return; + } + LOG(("Header Table")); uint32_t i; uint32_t length = mHeaderTable.Length(); diff --git a/netwerk/protocol/http/nsHttpConnectionMgr.cpp b/netwerk/protocol/http/nsHttpConnectionMgr.cpp index 9e711d5b130a1..5b80813fbd02e 100644 --- a/netwerk/protocol/http/nsHttpConnectionMgr.cpp +++ b/netwerk/protocol/http/nsHttpConnectionMgr.cpp @@ -30,7 +30,6 @@ #include "nsITransport.h" #include "nsISocketTransportService.h" #include -#include "Http2Compression.h" #include "mozilla/ChaosMode.h" #include "mozilla/unused.h" @@ -177,7 +176,6 @@ nsHttpConnectionMgr::Shutdown() // wait for shutdown event to complete while (!shutdown) NS_ProcessNextEvent(NS_GetCurrentThread()); - Http2CompressionCleanup(); return NS_OK; } From 682368e16791e3dd4a0dce3fa491ec57d9eb536b Mon Sep 17 00:00:00 2001 From: Boris Chiou Date: Wed, 27 May 2015 03:18:00 +0200 Subject: [PATCH 009/151] Bug 1161372 - Add EventRegions on LayerScope. r=dglastonbury --- gfx/layers/Layers.cpp | 19 ++ gfx/layers/protobuf/LayerScopePacket.pb.cc | 202 +++++++++++++++++- gfx/layers/protobuf/LayerScopePacket.pb.h | 232 +++++++++++++++++++-- gfx/layers/protobuf/LayerScopePacket.proto | 5 + 4 files changed, 436 insertions(+), 22 deletions(-) diff --git a/gfx/layers/Layers.cpp b/gfx/layers/Layers.cpp index 1552bb906c850..a658640559078 100644 --- a/gfx/layers/Layers.cpp +++ b/gfx/layers/Layers.cpp @@ -1716,6 +1716,25 @@ Layer::DumpPacket(layerscope::LayersPacket* aPacket, const void* aParent) if (!mVisibleRegion.IsEmpty()) { DumpRegion(layer->mutable_vregion(), mVisibleRegion); } + // EventRegions + if (!mEventRegions.IsEmpty()) { + const EventRegions &e = mEventRegions; + if (!e.mHitRegion.IsEmpty()) { + DumpRegion(layer->mutable_hitregion(), e.mHitRegion); + } + if (!e.mDispatchToContentHitRegion.IsEmpty()) { + DumpRegion(layer->mutable_dispatchregion(), e.mDispatchToContentHitRegion); + } + if (!e.mNoActionRegion.IsEmpty()) { + DumpRegion(layer->mutable_noactionregion(), e.mNoActionRegion); + } + if (!e.mHorizontalPanRegion.IsEmpty()) { + DumpRegion(layer->mutable_hpanregion(), e.mHorizontalPanRegion); + } + if (!e.mVerticalPanRegion.IsEmpty()) { + DumpRegion(layer->mutable_vpanregion(), e.mVerticalPanRegion); + } + } // Opacity layer->set_opacity(mOpacity); // Content opaque diff --git a/gfx/layers/protobuf/LayerScopePacket.pb.cc b/gfx/layers/protobuf/LayerScopePacket.pb.cc index ed9445d529a91..6fd63805763df 100644 --- a/gfx/layers/protobuf/LayerScopePacket.pb.cc +++ b/gfx/layers/protobuf/LayerScopePacket.pb.cc @@ -2115,6 +2115,11 @@ const int LayersPacket_Layer::kCAlphaFieldNumber; const int LayersPacket_Layer::kDirectFieldNumber; const int LayersPacket_Layer::kBarIDFieldNumber; const int LayersPacket_Layer::kMaskFieldNumber; +const int LayersPacket_Layer::kHitRegionFieldNumber; +const int LayersPacket_Layer::kDispatchRegionFieldNumber; +const int LayersPacket_Layer::kNoActionRegionFieldNumber; +const int LayersPacket_Layer::kHPanRegionFieldNumber; +const int LayersPacket_Layer::kVPanRegionFieldNumber; const int LayersPacket_Layer::kValidFieldNumber; const int LayersPacket_Layer::kColorFieldNumber; const int LayersPacket_Layer::kFilterFieldNumber; @@ -2132,6 +2137,11 @@ void LayersPacket_Layer::InitAsDefaultInstance() { transform_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Matrix::default_instance()); vregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); shadow_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Shadow::default_instance()); + hitregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); + dispatchregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); + noactionregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); + hpanregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); + vpanregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); valid_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); size_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Size*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Size::default_instance()); } @@ -2157,6 +2167,11 @@ void LayersPacket_Layer::SharedCtor() { direct_ = 1; barid_ = GOOGLE_ULONGLONG(0); mask_ = GOOGLE_ULONGLONG(0); + hitregion_ = NULL; + dispatchregion_ = NULL; + noactionregion_ = NULL; + hpanregion_ = NULL; + vpanregion_ = NULL; valid_ = NULL; color_ = 0u; filter_ = 0; @@ -2175,6 +2190,11 @@ void LayersPacket_Layer::SharedDtor() { delete transform_; delete vregion_; delete shadow_; + delete hitregion_; + delete dispatchregion_; + delete noactionregion_; + delete hpanregion_; + delete vpanregion_; delete valid_; delete size_; } @@ -2220,13 +2240,28 @@ void LayersPacket_Layer::Clear() { direct_ = 1; barid_ = GOOGLE_ULONGLONG(0); mask_ = GOOGLE_ULONGLONG(0); + if (has_hitregion()) { + if (hitregion_ != NULL) hitregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + } + if (has_dispatchregion()) { + if (dispatchregion_ != NULL) dispatchregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + } + if (has_noactionregion()) { + if (noactionregion_ != NULL) noactionregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + } + } + if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { + if (has_hpanregion()) { + if (hpanregion_ != NULL) hpanregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + } + if (has_vpanregion()) { + if (vpanregion_ != NULL) vpanregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + } if (has_valid()) { if (valid_ != NULL) valid_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); } color_ = 0u; filter_ = 0; - } - if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { refid_ = GOOGLE_ULONGLONG(0); if (has_size()) { if (size_ != NULL) size_->::mozilla::layers::layerscope::LayersPacket_Layer_Size::Clear(); @@ -2442,6 +2477,76 @@ bool LayersPacket_Layer::MergePartialFromCodedStream( } else { goto handle_uninterpreted; } + if (input->ExpectTag(162)) goto parse_hitRegion; + break; + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; + case 20: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_hitRegion: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_hitregion())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(170)) goto parse_dispatchRegion; + break; + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; + case 21: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_dispatchRegion: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_dispatchregion())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(178)) goto parse_noActionRegion; + break; + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; + case 22: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_noActionRegion: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_noactionregion())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(186)) goto parse_hPanRegion; + break; + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; + case 23: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_hPanRegion: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_hpanregion())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(194)) goto parse_vPanRegion; + break; + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; + case 24: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_vPanRegion: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_vpanregion())); + } else { + goto handle_uninterpreted; + } if (input->ExpectTag(802)) goto parse_valid; break; } @@ -2613,6 +2718,36 @@ void LayersPacket_Layer::SerializeWithCachedSizes( ::google::protobuf::internal::WireFormatLite::WriteUInt64(19, this->mask(), output); } + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; + if (has_hitregion()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 20, this->hitregion(), output); + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; + if (has_dispatchregion()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 21, this->dispatchregion(), output); + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; + if (has_noactionregion()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 22, this->noactionregion(), output); + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; + if (has_hpanregion()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 23, this->hpanregion(), output); + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; + if (has_vpanregion()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 24, this->vpanregion(), output); + } + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region valid = 100; if (has_valid()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( @@ -2732,6 +2867,43 @@ int LayersPacket_Layer::ByteSize() const { this->mask()); } + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; + if (has_hitregion()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->hitregion()); + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; + if (has_dispatchregion()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->dispatchregion()); + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; + if (has_noactionregion()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->noactionregion()); + } + + } + if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; + if (has_hpanregion()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->hpanregion()); + } + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; + if (has_vpanregion()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->vpanregion()); + } + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region valid = 100; if (has_valid()) { total_size += 2 + @@ -2752,8 +2924,6 @@ int LayersPacket_Layer::ByteSize() const { ::google::protobuf::internal::WireFormatLite::EnumSize(this->filter()); } - } - if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { // optional uint64 refID = 103; if (has_refid()) { total_size += 2 + @@ -2824,6 +2994,23 @@ void LayersPacket_Layer::MergeFrom(const LayersPacket_Layer& from) { if (from.has_mask()) { set_mask(from.mask()); } + if (from.has_hitregion()) { + mutable_hitregion()->::mozilla::layers::layerscope::LayersPacket_Layer_Region::MergeFrom(from.hitregion()); + } + if (from.has_dispatchregion()) { + mutable_dispatchregion()->::mozilla::layers::layerscope::LayersPacket_Layer_Region::MergeFrom(from.dispatchregion()); + } + if (from.has_noactionregion()) { + mutable_noactionregion()->::mozilla::layers::layerscope::LayersPacket_Layer_Region::MergeFrom(from.noactionregion()); + } + } + if (from._has_bits_[16 / 32] & (0xffu << (16 % 32))) { + if (from.has_hpanregion()) { + mutable_hpanregion()->::mozilla::layers::layerscope::LayersPacket_Layer_Region::MergeFrom(from.hpanregion()); + } + if (from.has_vpanregion()) { + mutable_vpanregion()->::mozilla::layers::layerscope::LayersPacket_Layer_Region::MergeFrom(from.vpanregion()); + } if (from.has_valid()) { mutable_valid()->::mozilla::layers::layerscope::LayersPacket_Layer_Region::MergeFrom(from.valid()); } @@ -2833,8 +3020,6 @@ void LayersPacket_Layer::MergeFrom(const LayersPacket_Layer& from) { if (from.has_filter()) { set_filter(from.filter()); } - } - if (from._has_bits_[16 / 32] & (0xffu << (16 % 32))) { if (from.has_refid()) { set_refid(from.refid()); } @@ -2871,6 +3056,11 @@ void LayersPacket_Layer::Swap(LayersPacket_Layer* other) { std::swap(direct_, other->direct_); std::swap(barid_, other->barid_); std::swap(mask_, other->mask_); + std::swap(hitregion_, other->hitregion_); + std::swap(dispatchregion_, other->dispatchregion_); + std::swap(noactionregion_, other->noactionregion_); + std::swap(hpanregion_, other->hpanregion_); + std::swap(vpanregion_, other->vpanregion_); std::swap(valid_, other->valid_); std::swap(color_, other->color_); std::swap(filter_, other->filter_); diff --git a/gfx/layers/protobuf/LayerScopePacket.pb.h b/gfx/layers/protobuf/LayerScopePacket.pb.h index ac84d4a375ec2..8c1d4dc9d3272 100644 --- a/gfx/layers/protobuf/LayerScopePacket.pb.h +++ b/gfx/layers/protobuf/LayerScopePacket.pb.h @@ -1064,6 +1064,46 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline ::google::protobuf::uint64 mask() const; inline void set_mask(::google::protobuf::uint64 value); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; + inline bool has_hitregion() const; + inline void clear_hitregion(); + static const int kHitRegionFieldNumber = 20; + inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& hitregion() const; + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_hitregion(); + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_hitregion(); + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; + inline bool has_dispatchregion() const; + inline void clear_dispatchregion(); + static const int kDispatchRegionFieldNumber = 21; + inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& dispatchregion() const; + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_dispatchregion(); + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_dispatchregion(); + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; + inline bool has_noactionregion() const; + inline void clear_noactionregion(); + static const int kNoActionRegionFieldNumber = 22; + inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& noactionregion() const; + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_noactionregion(); + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_noactionregion(); + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; + inline bool has_hpanregion() const; + inline void clear_hpanregion(); + static const int kHPanRegionFieldNumber = 23; + inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& hpanregion() const; + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_hpanregion(); + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_hpanregion(); + + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; + inline bool has_vpanregion() const; + inline void clear_vpanregion(); + static const int kVPanRegionFieldNumber = 24; + inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& vpanregion() const; + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_vpanregion(); + inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_vpanregion(); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region valid = 100; inline bool has_valid() const; inline void clear_valid(); @@ -1129,6 +1169,16 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline void clear_has_barid(); inline void set_has_mask(); inline void clear_has_mask(); + inline void set_has_hitregion(); + inline void clear_has_hitregion(); + inline void set_has_dispatchregion(); + inline void clear_has_dispatchregion(); + inline void set_has_noactionregion(); + inline void clear_has_noactionregion(); + inline void set_has_hpanregion(); + inline void clear_has_hpanregion(); + inline void set_has_vpanregion(); + inline void clear_has_vpanregion(); inline void set_has_valid(); inline void clear_has_valid(); inline void set_has_color(); @@ -1153,6 +1203,11 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { int direct_; ::google::protobuf::uint64 barid_; ::google::protobuf::uint64 mask_; + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* hitregion_; + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* dispatchregion_; + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* noactionregion_; + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* hpanregion_; + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* vpanregion_; ::mozilla::layers::layerscope::LayersPacket_Layer_Region* valid_; ::google::protobuf::uint32 color_; int filter_; @@ -1160,7 +1215,7 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { ::mozilla::layers::layerscope::LayersPacket_Layer_Size* size_; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(18 + 31) / 32]; + ::google::protobuf::uint32 _has_bits_[(23 + 31) / 32]; friend void protobuf_AddDesc_LayerScopePacket_2eproto(); friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); @@ -2796,15 +2851,160 @@ inline void LayersPacket_Layer::set_mask(::google::protobuf::uint64 value) { mask_ = value; } +// optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; +inline bool LayersPacket_Layer::has_hitregion() const { + return (_has_bits_[0] & 0x00002000u) != 0; +} +inline void LayersPacket_Layer::set_has_hitregion() { + _has_bits_[0] |= 0x00002000u; +} +inline void LayersPacket_Layer::clear_has_hitregion() { + _has_bits_[0] &= ~0x00002000u; +} +inline void LayersPacket_Layer::clear_hitregion() { + if (hitregion_ != NULL) hitregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + clear_has_hitregion(); +} +inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::hitregion() const { + return hitregion_ != NULL ? *hitregion_ : *default_instance_->hitregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_hitregion() { + set_has_hitregion(); + if (hitregion_ == NULL) hitregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + return hitregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_hitregion() { + clear_has_hitregion(); + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* temp = hitregion_; + hitregion_ = NULL; + return temp; +} + +// optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; +inline bool LayersPacket_Layer::has_dispatchregion() const { + return (_has_bits_[0] & 0x00004000u) != 0; +} +inline void LayersPacket_Layer::set_has_dispatchregion() { + _has_bits_[0] |= 0x00004000u; +} +inline void LayersPacket_Layer::clear_has_dispatchregion() { + _has_bits_[0] &= ~0x00004000u; +} +inline void LayersPacket_Layer::clear_dispatchregion() { + if (dispatchregion_ != NULL) dispatchregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + clear_has_dispatchregion(); +} +inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::dispatchregion() const { + return dispatchregion_ != NULL ? *dispatchregion_ : *default_instance_->dispatchregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_dispatchregion() { + set_has_dispatchregion(); + if (dispatchregion_ == NULL) dispatchregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + return dispatchregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_dispatchregion() { + clear_has_dispatchregion(); + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* temp = dispatchregion_; + dispatchregion_ = NULL; + return temp; +} + +// optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; +inline bool LayersPacket_Layer::has_noactionregion() const { + return (_has_bits_[0] & 0x00008000u) != 0; +} +inline void LayersPacket_Layer::set_has_noactionregion() { + _has_bits_[0] |= 0x00008000u; +} +inline void LayersPacket_Layer::clear_has_noactionregion() { + _has_bits_[0] &= ~0x00008000u; +} +inline void LayersPacket_Layer::clear_noactionregion() { + if (noactionregion_ != NULL) noactionregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + clear_has_noactionregion(); +} +inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::noactionregion() const { + return noactionregion_ != NULL ? *noactionregion_ : *default_instance_->noactionregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_noactionregion() { + set_has_noactionregion(); + if (noactionregion_ == NULL) noactionregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + return noactionregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_noactionregion() { + clear_has_noactionregion(); + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* temp = noactionregion_; + noactionregion_ = NULL; + return temp; +} + +// optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; +inline bool LayersPacket_Layer::has_hpanregion() const { + return (_has_bits_[0] & 0x00010000u) != 0; +} +inline void LayersPacket_Layer::set_has_hpanregion() { + _has_bits_[0] |= 0x00010000u; +} +inline void LayersPacket_Layer::clear_has_hpanregion() { + _has_bits_[0] &= ~0x00010000u; +} +inline void LayersPacket_Layer::clear_hpanregion() { + if (hpanregion_ != NULL) hpanregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + clear_has_hpanregion(); +} +inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::hpanregion() const { + return hpanregion_ != NULL ? *hpanregion_ : *default_instance_->hpanregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_hpanregion() { + set_has_hpanregion(); + if (hpanregion_ == NULL) hpanregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + return hpanregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_hpanregion() { + clear_has_hpanregion(); + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* temp = hpanregion_; + hpanregion_ = NULL; + return temp; +} + +// optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; +inline bool LayersPacket_Layer::has_vpanregion() const { + return (_has_bits_[0] & 0x00020000u) != 0; +} +inline void LayersPacket_Layer::set_has_vpanregion() { + _has_bits_[0] |= 0x00020000u; +} +inline void LayersPacket_Layer::clear_has_vpanregion() { + _has_bits_[0] &= ~0x00020000u; +} +inline void LayersPacket_Layer::clear_vpanregion() { + if (vpanregion_ != NULL) vpanregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); + clear_has_vpanregion(); +} +inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::vpanregion() const { + return vpanregion_ != NULL ? *vpanregion_ : *default_instance_->vpanregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_vpanregion() { + set_has_vpanregion(); + if (vpanregion_ == NULL) vpanregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + return vpanregion_; +} +inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_vpanregion() { + clear_has_vpanregion(); + ::mozilla::layers::layerscope::LayersPacket_Layer_Region* temp = vpanregion_; + vpanregion_ = NULL; + return temp; +} + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region valid = 100; inline bool LayersPacket_Layer::has_valid() const { - return (_has_bits_[0] & 0x00002000u) != 0; + return (_has_bits_[0] & 0x00040000u) != 0; } inline void LayersPacket_Layer::set_has_valid() { - _has_bits_[0] |= 0x00002000u; + _has_bits_[0] |= 0x00040000u; } inline void LayersPacket_Layer::clear_has_valid() { - _has_bits_[0] &= ~0x00002000u; + _has_bits_[0] &= ~0x00040000u; } inline void LayersPacket_Layer::clear_valid() { if (valid_ != NULL) valid_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); @@ -2827,13 +3027,13 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_La // optional uint32 color = 101; inline bool LayersPacket_Layer::has_color() const { - return (_has_bits_[0] & 0x00004000u) != 0; + return (_has_bits_[0] & 0x00080000u) != 0; } inline void LayersPacket_Layer::set_has_color() { - _has_bits_[0] |= 0x00004000u; + _has_bits_[0] |= 0x00080000u; } inline void LayersPacket_Layer::clear_has_color() { - _has_bits_[0] &= ~0x00004000u; + _has_bits_[0] &= ~0x00080000u; } inline void LayersPacket_Layer::clear_color() { color_ = 0u; @@ -2849,13 +3049,13 @@ inline void LayersPacket_Layer::set_color(::google::protobuf::uint32 value) { // optional .mozilla.layers.layerscope.LayersPacket.Layer.Filter filter = 102; inline bool LayersPacket_Layer::has_filter() const { - return (_has_bits_[0] & 0x00008000u) != 0; + return (_has_bits_[0] & 0x00100000u) != 0; } inline void LayersPacket_Layer::set_has_filter() { - _has_bits_[0] |= 0x00008000u; + _has_bits_[0] |= 0x00100000u; } inline void LayersPacket_Layer::clear_has_filter() { - _has_bits_[0] &= ~0x00008000u; + _has_bits_[0] &= ~0x00100000u; } inline void LayersPacket_Layer::clear_filter() { filter_ = 0; @@ -2872,13 +3072,13 @@ inline void LayersPacket_Layer::set_filter(::mozilla::layers::layerscope::Layers // optional uint64 refID = 103; inline bool LayersPacket_Layer::has_refid() const { - return (_has_bits_[0] & 0x00010000u) != 0; + return (_has_bits_[0] & 0x00200000u) != 0; } inline void LayersPacket_Layer::set_has_refid() { - _has_bits_[0] |= 0x00010000u; + _has_bits_[0] |= 0x00200000u; } inline void LayersPacket_Layer::clear_has_refid() { - _has_bits_[0] &= ~0x00010000u; + _has_bits_[0] &= ~0x00200000u; } inline void LayersPacket_Layer::clear_refid() { refid_ = GOOGLE_ULONGLONG(0); @@ -2894,13 +3094,13 @@ inline void LayersPacket_Layer::set_refid(::google::protobuf::uint64 value) { // optional .mozilla.layers.layerscope.LayersPacket.Layer.Size size = 104; inline bool LayersPacket_Layer::has_size() const { - return (_has_bits_[0] & 0x00020000u) != 0; + return (_has_bits_[0] & 0x00400000u) != 0; } inline void LayersPacket_Layer::set_has_size() { - _has_bits_[0] |= 0x00020000u; + _has_bits_[0] |= 0x00400000u; } inline void LayersPacket_Layer::clear_has_size() { - _has_bits_[0] &= ~0x00020000u; + _has_bits_[0] &= ~0x00400000u; } inline void LayersPacket_Layer::clear_size() { if (size_ != NULL) size_->::mozilla::layers::layerscope::LayersPacket_Layer_Size::Clear(); diff --git a/gfx/layers/protobuf/LayerScopePacket.proto b/gfx/layers/protobuf/LayerScopePacket.proto index 724f7801ab24c..9beaafc81bff6 100644 --- a/gfx/layers/protobuf/LayerScopePacket.proto +++ b/gfx/layers/protobuf/LayerScopePacket.proto @@ -97,6 +97,11 @@ message LayersPacket { optional ScrollingDirect direct = 17; optional uint64 barID = 18; optional uint64 mask = 19; // mask layer + optional Region hitRegion = 20; + optional Region dispatchRegion = 21; + optional Region noActionRegion = 22; + optional Region hPanRegion = 23; + optional Region vPanRegion = 24; // Specific info (100 to max) // Painted Layer From 93dcf227cd10b645dd6221270562a375c6c7aef7 Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Thu, 21 May 2015 12:16:00 +0200 Subject: [PATCH 010/151] Bug 1166867 - Support -moz-os-version: windows-win10. r=jimm --- layout/style/nsMediaFeatures.cpp | 1 + widget/LookAndFeel.h | 9 +++++---- widget/windows/nsLookAndFeel.cpp | 8 +++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/layout/style/nsMediaFeatures.cpp b/layout/style/nsMediaFeatures.cpp index 30cbbb28b8844..d3a15e7480025 100644 --- a/layout/style/nsMediaFeatures.cpp +++ b/layout/style/nsMediaFeatures.cpp @@ -61,6 +61,7 @@ const OperatingSystemVersionInfo osVersionStrings[] = { { LookAndFeel::eOperatingSystemVersion_WindowsVista, L"windows-vista" }, { LookAndFeel::eOperatingSystemVersion_Windows7, L"windows-win7" }, { LookAndFeel::eOperatingSystemVersion_Windows8, L"windows-win8" }, + { LookAndFeel::eOperatingSystemVersion_Windows10, L"windows-win10" } }; #endif diff --git a/widget/LookAndFeel.h b/widget/LookAndFeel.h index df3fa4a52f1f0..98816b2d3ea2d 100644 --- a/widget/LookAndFeel.h +++ b/widget/LookAndFeel.h @@ -165,7 +165,7 @@ class LookAndFeel // Hyperlink color extracted from the system, not affected by the // browser.anchor_color user pref. - // There is no OS-specified safe background color for this text, + // There is no OS-specified safe background color for this text, // but it is used regularly within Windows and the Gnome DE on Dialog and // Window colors. eColorID__moz_nativehyperlinktext, @@ -393,13 +393,13 @@ class LookAndFeel * is shown. */ eIntID_PhysicalHomeButton, - + /* * Controls whether overlay scrollbars display when the user moves * the mouse in a scrollable frame. */ eIntID_ScrollbarDisplayOnMouseMove, - + /* * Overlay scrollbar animation constants. */ @@ -430,6 +430,7 @@ class LookAndFeel eOperatingSystemVersion_WindowsVista, eOperatingSystemVersion_Windows7, eOperatingSystemVersion_Windows8, + eOperatingSystemVersion_Windows10, eOperatingSystemVersion_Unknown }; @@ -444,7 +445,7 @@ class LookAndFeel enum { // single arrow at each end eScrollArrowStyle_Single = - eScrollArrow_StartBackward | eScrollArrow_EndForward, + eScrollArrow_StartBackward | eScrollArrow_EndForward, // both arrows at bottom/right, none at top/left eScrollArrowStyle_BothAtBottom = eScrollArrow_EndBackward | eScrollArrow_EndForward, diff --git a/widget/windows/nsLookAndFeel.cpp b/widget/windows/nsLookAndFeel.cpp index 7058ef31f03fa..e4177d57bfd58 100644 --- a/widget/windows/nsLookAndFeel.cpp +++ b/widget/windows/nsLookAndFeel.cpp @@ -28,7 +28,9 @@ nsLookAndFeel::GetOperatingSystemVersion() return version; } - if (IsWin8OrLater()) { + if (IsWin10OrLater()) { + version = eOperatingSystemVersion_Windows10; + } else if (IsWin8OrLater()) { version = eOperatingSystemVersion_Windows8; } else if (IsWin7OrLater()) { version = eOperatingSystemVersion_Windows7; @@ -59,7 +61,7 @@ static nsresult GetColorFromTheme(nsUXThemeClass cls, static int32_t GetSystemParam(long flag, int32_t def) { - DWORD value; + DWORD value; return ::SystemParametersInfo(flag, 0, &value, 0) ? value : def; } @@ -354,7 +356,7 @@ nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult) aResult = ::GetSystemMetrics(SM_CYDRAG) - 1; break; case eIntID_UseAccessibilityTheme: - // High contrast is a misnomer under Win32 -- any theme can be used with it, + // High contrast is a misnomer under Win32 -- any theme can be used with it, // e.g. normal contrast with large fonts, low contrast, etc. // The high contrast flag really means -- use this theme and don't override it. aResult = nsUXThemeData::IsHighContrastOn(); From f222d23c4eba5ee066150073bead83aec14810a1 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Wed, 27 May 2015 19:06:33 -0700 Subject: [PATCH 011/151] Bug 1169088 - Remove unused nsBidiPresUtils methods. r=dbaron These were used only in nsSVGGlyphFrame which was removed in bug 889736. --- layout/base/nsBidiPresUtils.cpp | 119 -------------------------------- layout/base/nsBidiPresUtils.h | 28 -------- 2 files changed, 147 deletions(-) diff --git a/layout/base/nsBidiPresUtils.cpp b/layout/base/nsBidiPresUtils.cpp index 3a82eeb60c688..489d390ad1699 100644 --- a/layout/base/nsBidiPresUtils.cpp +++ b/layout/base/nsBidiPresUtils.cpp @@ -2250,125 +2250,6 @@ nsresult nsBidiPresUtils::ProcessTextForRenderingContext(const char16_t* a aMode, aPosResolve, aPosResolveCount, aWidth, &bidiEngine); } -/* static */ -void nsBidiPresUtils::WriteReverse(const char16_t* aSrc, - uint32_t aSrcLength, - char16_t* aDest) -{ - char16_t* dest = aDest + aSrcLength; - mozilla::unicode::ClusterIterator iter(aSrc, aSrcLength); - - while (!iter.AtEnd()) { - iter.Next(); - for (const char16_t *cp = iter; cp > aSrc; ) { - // Here we rely on the fact that there are no non-BMP mirrored pairs - // currently in Unicode, so we don't need to look for surrogates - *--dest = mozilla::unicode::GetMirroredChar(*--cp); - } - aSrc = iter; - } - - NS_ASSERTION(dest == aDest, "Whole string not copied"); -} - -/* static */ -bool nsBidiPresUtils::WriteLogicalToVisual(const char16_t* aSrc, - uint32_t aSrcLength, - char16_t* aDest, - nsBidiLevel aBaseDirection, - nsBidi* aBidiEngine) -{ - const char16_t* src = aSrc; - nsresult rv = aBidiEngine->SetPara(src, aSrcLength, aBaseDirection, nullptr); - if (NS_FAILED(rv)) { - return false; - } - - nsBidiDirection dir; - rv = aBidiEngine->GetDirection(&dir); - // NSBIDI_LTR returned from GetDirection means the whole text is LTR - if (NS_FAILED(rv) || dir == NSBIDI_LTR) { - return false; - } - - int32_t runCount; - rv = aBidiEngine->CountRuns(&runCount); - if (NS_FAILED(rv)) { - return false; - } - - int32_t runIndex, start, length; - char16_t* dest = aDest; - - for (runIndex = 0; runIndex < runCount; ++runIndex) { - rv = aBidiEngine->GetVisualRun(runIndex, &start, &length, &dir); - if (NS_FAILED(rv)) { - return false; - } - - src = aSrc + start; - - if (dir == NSBIDI_RTL) { - WriteReverse(src, length, dest); - dest += length; - } else { - do { - NS_ASSERTION(src >= aSrc && src < aSrc + aSrcLength, - "logical index out of range"); - NS_ASSERTION(dest < aDest + aSrcLength, "visual index out of range"); - *(dest++) = *(src++); - } while (--length); - } - } - - NS_ASSERTION(static_cast(dest - aDest) == aSrcLength, - "whole string not copied"); - return true; -} - -void nsBidiPresUtils::CopyLogicalToVisual(const nsAString& aSource, - nsAString& aDest, - nsBidiLevel aBaseDirection, - bool aOverride) -{ - aDest.SetLength(0); - uint32_t srcLength = aSource.Length(); - if (srcLength == 0) - return; - if (!aDest.SetLength(srcLength, fallible)) { - return; - } - nsAString::const_iterator fromBegin, fromEnd; - nsAString::iterator toBegin; - aSource.BeginReading(fromBegin); - aSource.EndReading(fromEnd); - aDest.BeginWriting(toBegin); - - if (aOverride) { - if (aBaseDirection == NSBIDI_RTL) { - // no need to use the converter -- just copy the string in reverse order - WriteReverse(fromBegin.get(), srcLength, toBegin.get()); - } else { - // if aOverride && aBaseDirection == NSBIDI_LTR, fall through to the - // simple copy - aDest.SetLength(0); - } - } else { - nsBidi bidiEngine; - if (!WriteLogicalToVisual(fromBegin.get(), srcLength, toBegin.get(), - aBaseDirection, &bidiEngine)) { - aDest.SetLength(0); - } - } - - if (aDest.IsEmpty()) { - // Either there was an error or the source is unidirectional - // left-to-right. In either case, just copy source to dest. - CopyUnicodeTo(aSource.BeginReading(fromBegin), aSource.EndReading(fromEnd), - aDest); - } -} - /* static */ nsBidiLevel nsBidiPresUtils::BidiLevelFromStyle(nsStyleContext* aStyleContext) diff --git a/layout/base/nsBidiPresUtils.h b/layout/base/nsBidiPresUtils.h index b6db05ea7d197..c7a60f8a5b0b5 100644 --- a/layout/base/nsBidiPresUtils.h +++ b/layout/base/nsBidiPresUtils.h @@ -354,24 +354,6 @@ class nsBidiPresUtils { nscoord* aWidth, nsBidi* aBidiEngine); - /** - * Make a copy of a string, converting from logical to visual order - * - * @param aSource the source string - * @param aDest the destination string - * @param aBaseDirection the base direction of the string - * (NSBIDI_LTR or NSBIDI_RTL to force the base direction; - * NSBIDI_DEFAULT_LTR or NSBIDI_DEFAULT_RTL to let the bidi engine - * determine the direction from rules P2 and P3 of the bidi algorithm. - * @see nsBidi::GetPara - * @param aOverride if TRUE, the text has a bidi override, according to - * the direction in aDir - */ - static void CopyLogicalToVisual(const nsAString& aSource, - nsAString& aDest, - nsBidiLevel aBaseDirection, - bool aOverride); - /** * Use style attributes to determine the base paragraph level to pass to the * bidi algorithm. @@ -557,16 +539,6 @@ class nsBidiPresUtils { static void StripBidiControlCharacters(char16_t* aText, int32_t& aTextLength); - - static bool WriteLogicalToVisual(const char16_t* aSrc, - uint32_t aSrcLength, - char16_t* aDest, - nsBidiLevel aBaseDirection, - nsBidi* aBidiEngine); - - static void WriteReverse(const char16_t* aSrc, - uint32_t aSrcLength, - char16_t* aDest); }; #endif /* nsBidiPresUtils_h___ */ From b215dd5f0e999d4755a2191ed1872cd7efda72c8 Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Thu, 28 May 2015 09:57:57 +0100 Subject: [PATCH 012/151] Bug 1154391 - Update import declarations to current ES6 spec r=shu --- js/src/frontend/ParseNode.h | 2 + js/src/frontend/Parser.cpp | 178 ++++++++++++------ js/src/frontend/Parser.h | 2 + .../tests/modules/import-declaration.js | 152 +++++++++++++++ js/src/js.msg | 5 +- js/src/jsreflect.cpp | 1 + js/src/vm/CommonPropertyNames.h | 1 + js/src/vm/Xdr.h | 4 +- 8 files changed, 282 insertions(+), 63 deletions(-) diff --git a/js/src/frontend/ParseNode.h b/js/src/frontend/ParseNode.h index 498be8ac456b2..f611588352ebb 100644 --- a/js/src/frontend/ParseNode.h +++ b/js/src/frontend/ParseNode.h @@ -332,6 +332,8 @@ enum ParseNodeKind * in original source, not introduced via * constant folding or other tree rewriting * PNK_LABEL name pn_atom: label, pn_expr: labeled statement + * PNK_IMPORT binary pn_left: PNK_IMPORT_SPEC_LIST import specifiers + * pn_right: PNK_STRING module specifier * * * All left-associated binary trees of the same type are optimized into lists diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 1b342a6d7a872..acc44768b5aaf 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -4177,6 +4177,105 @@ Parser::letDeclarationOrBlock(YieldHandling yieldHandling) return SyntaxParseHandler::NodeFailure; } +template<> +bool +Parser::namedImportsOrNamespaceImport(TokenKind tt, Node importSpecSet) +{ + if (tt == TOK_LC) { + while (true) { + // Handle the forms |import {} from 'a'| and + // |import { ..., } from 'a'| (where ... is non empty), by + // escaping the loop early if the next token is }. + if (!tokenStream.peekToken(&tt, TokenStream::KeywordIsName)) + return false; + + if (tt == TOK_RC) + break; + + // If the next token is a keyword, the previous call to + // peekToken matched it as a TOK_NAME, and put it in the + // lookahead buffer, so this call will match keywords as well. + MUST_MATCH_TOKEN(TOK_NAME, JSMSG_NO_IMPORT_NAME); + Node importName = newName(tokenStream.currentName()); + if (!importName) + return false; + + if (!tokenStream.getToken(&tt)) + return false; + + if (tt == TOK_NAME && tokenStream.currentName() == context->names().as) { + MUST_MATCH_TOKEN(TOK_NAME, JSMSG_NO_BINDING_NAME); + } else { + // Keywords cannot be bound to themselves, so an import name + // that is a keyword is a syntax error if it is not followed + // by the keyword 'as'. + // See the ImportSpecifier production in ES6 section 15.2.2. + if (IsKeyword(importName->name())) { + JSAutoByteString bytes; + if (!AtomToPrintableString(context, importName->name(), &bytes)) + return false; + report(ParseError, false, null(), JSMSG_AS_AFTER_RESERVED_WORD, bytes.ptr()); + return false; + } + tokenStream.ungetToken(); + } + Node bindingName = newName(tokenStream.currentName()); + if (!bindingName) + return false; + + Node importSpec = handler.newBinary(PNK_IMPORT_SPEC, importName, bindingName); + if (!importSpec) + return false; + + handler.addList(importSpecSet, importSpec); + + bool matched; + if (!tokenStream.matchToken(&matched, TOK_COMMA)) + return false; + + if (!matched) + break; + } + + MUST_MATCH_TOKEN(TOK_RC, JSMSG_RC_AFTER_IMPORT_SPEC_LIST); + } else { + MOZ_ASSERT(tt == TOK_MUL); + if (!tokenStream.getToken(&tt)) + return false; + + if (tt != TOK_NAME || tokenStream.currentName() != context->names().as) { + report(ParseError, false, null(), JSMSG_AS_AFTER_IMPORT_STAR); + return false; + } + + MUST_MATCH_TOKEN(TOK_NAME, JSMSG_NO_BINDING_NAME); + + Node importName = newName(context->names().star); + if (!importName) + return null(); + + Node bindingName = newName(tokenStream.currentName()); + if (!bindingName) + return false; + + Node importSpec = handler.newBinary(PNK_IMPORT_SPEC, importName, bindingName); + if (!importSpec) + return false; + + handler.addList(importSpecSet, importSpec); + } + + return true; +} + +template<> +bool +Parser::namedImportsOrNamespaceImport(TokenKind tt, Node importSpecSet) +{ + MOZ_ALWAYS_FALSE(abortIfSyntaxParser()); + return false; +} + template typename ParseHandler::Node Parser::importDeclaration() @@ -4197,7 +4296,7 @@ Parser::importDeclaration() if (!importSpecSet) return null(); - if (tt == TOK_NAME || tt == TOK_LC) { + if (tt == TOK_NAME || tt == TOK_LC || tt == TOK_MUL) { if (tt == TOK_NAME) { // Handle the form |import a from 'b'|, by adding a single import // specifier to the list, with 'default' as the import name and @@ -4216,83 +4315,43 @@ Parser::importDeclaration() return null(); handler.addList(importSpecSet, importSpec); - } else { - while (true) { - // Handle the forms |import {} from 'a'| and - // |import { ..., } from 'a'| (where ... is non empty), by - // escaping the loop early if the next token is }. - if (!tokenStream.peekToken(&tt, TokenStream::KeywordIsName)) - return null(); - if (tt == TOK_RC) - break; - // If the next token is a keyword, the previous call to - // peekToken matched it as a TOK_NAME, and put it in the - // lookahead buffer, so this call will match keywords as well. - MUST_MATCH_TOKEN(TOK_NAME, JSMSG_NO_IMPORT_NAME); - Node importName = newName(tokenStream.currentName()); - if (!importName) - return null(); + if (!tokenStream.peekToken(&tt)) + return null(); - if (!tokenStream.getToken(&tt)) - return null(); - if (tt == TOK_NAME && tokenStream.currentName() == context->names().as) { - if (!tokenStream.getToken(&tt)) - return null(); - if (tt != TOK_NAME) { - report(ParseError, false, null(), JSMSG_NO_BINDING_NAME); - return null(); - } - } else { - // Keywords cannot be bound to themselves, so an import name - // that is a keyword is a syntax error if it is not followed - // by the keyword 'as'. - if (IsKeyword(importName->name())) { - JSAutoByteString bytes; - if (!AtomToPrintableString(context, importName->name(), &bytes)) - return null(); - report(ParseError, false, null(), JSMSG_AS_AFTER_RESERVED_WORD, bytes.ptr()); - return null(); - } - tokenStream.ungetToken(); - } - Node bindingName = newName(tokenStream.currentName()); - if (!bindingName) + if (tt == TOK_COMMA) { + if (!tokenStream.getToken(&tt) || !tokenStream.getToken(&tt)) return null(); - Node importSpec = handler.newBinary(PNK_IMPORT_SPEC, importName, bindingName); - if (!importSpec) + if (tt != TOK_LC && tt != TOK_MUL) { + report(ParseError, false, null(), JSMSG_NAMED_IMPORTS_OR_NAMESPACE_IMPORT); return null(); + } - handler.addList(importSpecSet, importSpec); - - bool matched; - if (!tokenStream.matchToken(&matched, TOK_COMMA)) + if (!namedImportsOrNamespaceImport(tt, importSpecSet)) return null(); - if (!matched) - break; } - - MUST_MATCH_TOKEN(TOK_RC, JSMSG_RC_AFTER_IMPORT_SPEC_LIST); + } else { + if (!namedImportsOrNamespaceImport(tt, importSpecSet)) + return null(); } if (!tokenStream.getToken(&tt)) return null(); + if (tt != TOK_NAME || tokenStream.currentName() != context->names().from) { - report(ParseError, false, null(), JSMSG_FROM_AFTER_IMPORT_SPEC_SET); + report(ParseError, false, null(), JSMSG_FROM_AFTER_IMPORT_CLAUSE); return null(); } MUST_MATCH_TOKEN(TOK_STRING, JSMSG_MODULE_SPEC_AFTER_FROM); - } else { - if (tt != TOK_STRING) { - report(ParseError, false, null(), JSMSG_DECLARATION_AFTER_IMPORT); - return null(); - } - + } else if (tt == TOK_STRING) { // Handle the form |import 'a'| by leaving the list empty. This is // equivalent to |import {} from 'a'|. importSpecSet->pn_pos.end = importSpecSet->pn_pos.begin; + } else { + report(ParseError, false, null(), JSMSG_DECLARATION_AFTER_IMPORT); + return null(); } Node moduleSpec = stringLiteral(); @@ -4302,8 +4361,7 @@ Parser::importDeclaration() if (!MatchOrInsertSemicolon(tokenStream)) return null(); - return handler.newImportDeclaration(importSpecSet, moduleSpec, - TokenPos(begin, pos().end)); + return handler.newImportDeclaration(importSpecSet, moduleSpec, TokenPos(begin, pos().end)); } template<> diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index 2b247f2066dd2..e443655e47fd8 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -635,6 +635,8 @@ class Parser : private JS::AutoGCRooter, public StrictModeGetter Node destructuringExprWithoutYield(YieldHandling yieldHandling, BindData* data, TokenKind tt, unsigned msg); + bool namedImportsOrNamespaceImport(TokenKind tt, Node importSpecSet); + enum ClassContext { ClassStatement, ClassExpression }; Node classDefinition(YieldHandling yieldHandling, ClassContext classContext); diff --git a/js/src/jit-test/tests/modules/import-declaration.js b/js/src/jit-test/tests/modules/import-declaration.js index 54596359a92af..cf5468c3f08e7 100644 --- a/js/src/jit-test/tests/modules/import-declaration.js +++ b/js/src/jit-test/tests/modules/import-declaration.js @@ -38,6 +38,18 @@ program([ ) ]).assert(Reflect.parse("import a from 'b'")); +program([ + importDeclaration( + [ + importSpecifier( + ident("*"), + ident("a") + ) + ], + lit("b") + ) +]).assert(Reflect.parse("import * as a from 'b'")); + program([ importDeclaration( [], @@ -93,6 +105,106 @@ program([ ) ]).assert(Reflect.parse("import { as as as } from 'a'")); +program([ + importDeclaration( + [ + importSpecifier( + ident("default"), + ident("a") + ), + importSpecifier( + ident("*"), + ident("b") + ) + ], + lit("c") + ) +]).assert(Reflect.parse("import a, * as b from 'c'")); + +program([ + importDeclaration( + [ + importSpecifier( + ident("default"), + ident("d") + ) + ], + lit("a") + ) +]).assert(Reflect.parse("import d, {} from 'a'")); + +program([ + importDeclaration( + [ + importSpecifier( + ident("default"), + ident("d") + ), + importSpecifier( + ident("a"), + ident("a") + ) + ], + lit("b") + ) +]).assert(Reflect.parse("import d, { a } from 'b'")); + +program([ + importDeclaration( + [ + importSpecifier( + ident("default"), + ident("d") + ), + importSpecifier( + ident("a"), + ident("b") + ) + ], + lit("c") + ) +]).assert(Reflect.parse("import d, { a as b } from 'c'")); + +program([ + importDeclaration( + [ + importSpecifier( + ident("default"), + ident("d") + ), + importSpecifier( + ident("a"), + ident("a") + ), + importSpecifier( + ident("b"), + ident("b") + ), + ], + lit("c") + ) +]).assert(Reflect.parse("import d, { a, b } from 'c'")); + +program([ + importDeclaration( + [ + importSpecifier( + ident("default"), + ident("d") + ), + importSpecifier( + ident("a"), + ident("b") + ), + importSpecifier( + ident("c"), + ident("d") + ), + ], + lit("e") + ) +]).assert(Reflect.parse("import d, { a as b, c as d } from 'e'")); + program([ importDeclaration( [ @@ -184,3 +296,43 @@ assertThrowsInstanceOf(function() { assertThrowsInstanceOf(function() { Reflect.parse("import { true } from 'a'"); }, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import a,"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import a, b from 'a'"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import * as a,"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import * as a, {} from 'a'"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import as a from 'a'"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import * a from 'a'"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import * as from 'a'"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import , {} from 'a'"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import d, from 'a'"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("import * as true from 'b'"); +}, SyntaxError); diff --git a/js/src/js.msg b/js/src/js.msg index 3c5ab3cf3ea80..dc48d53274a02 100644 --- a/js/src/js.msg +++ b/js/src/js.msg @@ -182,6 +182,7 @@ MSG_DEF(JSMSG_ACCESSOR_WRONG_ARGS, 3, JSEXN_SYNTAXERR, "{0} functions must h MSG_DEF(JSMSG_ARGUMENTS_AND_REST, 0, JSEXN_SYNTAXERR, "'arguments' object may not be used in conjunction with a rest parameter") MSG_DEF(JSMSG_ARRAY_COMP_LEFTSIDE, 0, JSEXN_SYNTAXERR, "invalid array comprehension left-hand side") MSG_DEF(JSMSG_ARRAY_INIT_TOO_BIG, 0, JSEXN_INTERNALERR, "array initialiser too large") +MSG_DEF(JSMSG_AS_AFTER_IMPORT_STAR, 0, JSEXN_SYNTAXERR, "missing keyword 'as' after import *") MSG_DEF(JSMSG_AS_AFTER_RESERVED_WORD, 1, JSEXN_SYNTAXERR, "missing keyword 'as' after reserved word '{0}'") MSG_DEF(JSMSG_BAD_ANON_GENERATOR_RETURN, 0, JSEXN_TYPEERR, "anonymous generator function returns a value") MSG_DEF(JSMSG_BAD_ARROW_ARGS, 0, JSEXN_SYNTAXERR, "invalid arrow-function arguments (parentheses around the arrow-function may help)") @@ -249,7 +250,7 @@ MSG_DEF(JSMSG_EMPTY_CONSEQUENT, 0, JSEXN_SYNTAXERR, "mistyped ; after con MSG_DEF(JSMSG_EQUAL_AS_ASSIGN, 0, JSEXN_SYNTAXERR, "test for equality (==) mistyped as assignment (=)?") MSG_DEF(JSMSG_EXPORT_DECL_AT_TOP_LEVEL,0, JSEXN_SYNTAXERR, "export declarations may only appear at top level") MSG_DEF(JSMSG_FINALLY_WITHOUT_TRY, 0, JSEXN_SYNTAXERR, "finally without try") -MSG_DEF(JSMSG_FROM_AFTER_IMPORT_SPEC_SET, 0, JSEXN_SYNTAXERR, "missing keyword 'from' after import specifier set") +MSG_DEF(JSMSG_FROM_AFTER_IMPORT_CLAUSE, 0, JSEXN_SYNTAXERR, "missing keyword 'from' after import clause") MSG_DEF(JSMSG_GARBAGE_AFTER_INPUT, 2, JSEXN_SYNTAXERR, "unexpected garbage after {0}, starting with {1}") MSG_DEF(JSMSG_IDSTART_AFTER_NUMBER, 0, JSEXN_SYNTAXERR, "identifier starts immediately after numeric literal") MSG_DEF(JSMSG_ILLEGAL_CHARACTER, 0, JSEXN_SYNTAXERR, "illegal character") @@ -271,6 +272,8 @@ MSG_DEF(JSMSG_MISSING_OCTAL_DIGITS, 0, JSEXN_SYNTAXERR, "missing octal digits MSG_DEF(JSMSG_MODULES_NOT_IMPLEMENTED, 0, JSEXN_SYNTAXERR, "modules are not implemented yet") MSG_DEF(JSMSG_MODULE_SPEC_AFTER_FROM, 0, JSEXN_SYNTAXERR, "missing module specifier after 'from' keyword") MSG_DEF(JSMSG_NAME_AFTER_DOT, 0, JSEXN_SYNTAXERR, "missing name after . operator") +MSG_DEF(JSMSG_NAME_AFTER_IMPORT_STAR_AS, 0, JSEXN_SYNTAXERR, "missing name after import * as") +MSG_DEF(JSMSG_NAMED_IMPORTS_OR_NAMESPACE_IMPORT, 0, JSEXN_SYNTAXERR, "expected named imports or namespace import after comma") MSG_DEF(JSMSG_NONDEFAULT_FORMAL_AFTER_DEFAULT, 0, JSEXN_SYNTAXERR, "parameter(s) with default followed by parameter without default") MSG_DEF(JSMSG_NO_BINDING_NAME, 0, JSEXN_SYNTAXERR, "missing binding name") MSG_DEF(JSMSG_NO_CLASS_CONSTRUCTOR, 0, JSEXN_TYPEERR, "class default constructors not yet implemented") diff --git a/js/src/jsreflect.cpp b/js/src/jsreflect.cpp index 9807333bcf66f..25adf62b1ad31 100644 --- a/js/src/jsreflect.cpp +++ b/js/src/jsreflect.cpp @@ -2156,6 +2156,7 @@ bool ASTSerializer::importDeclaration(ParseNode* pn, MutableHandleValue dst) { MOZ_ASSERT(pn->isKind(PNK_IMPORT)); + MOZ_ASSERT(pn->isArity(PN_BINARY)); MOZ_ASSERT(pn->pn_left->isKind(PNK_IMPORT_SPEC_LIST)); MOZ_ASSERT(pn->pn_right->isKind(PNK_STRING)); diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index a2bf63fed0505..9d4d1b8cee286 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -187,6 +187,7 @@ macro(signMask, signMask, "signMask") \ macro(source, source, "source") \ macro(stack, stack, "stack") \ + macro(star, star, "*") \ macro(startTimestamp, startTimestamp, "startTimestamp") \ macro(static, static_, "static") \ macro(sticky, sticky, "sticky") \ diff --git a/js/src/vm/Xdr.h b/js/src/vm/Xdr.h index 2bfe458f540ff..28f39537e198d 100644 --- a/js/src/vm/Xdr.h +++ b/js/src/vm/Xdr.h @@ -29,11 +29,11 @@ namespace js { * * https://developer.mozilla.org/en-US/docs/SpiderMonkey/Internals/Bytecode */ -static const uint32_t XDR_BYTECODE_VERSION_SUBTRAHEND = 285; +static const uint32_t XDR_BYTECODE_VERSION_SUBTRAHEND = 286; static const uint32_t XDR_BYTECODE_VERSION = uint32_t(0xb973c0de - XDR_BYTECODE_VERSION_SUBTRAHEND); -static_assert(JSErr_Limit == 394, +static_assert(JSErr_Limit == 397, "GREETINGS, POTENTIAL SUBTRAHEND INCREMENTER! If you added or " "removed MSG_DEFs from js.msg, you should increment " "XDR_BYTECODE_VERSION_SUBTRAHEND and update this assertion's " From c9b6da8d6f972e52d4e45364d1ca9ceb384b1a9b Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Thu, 28 May 2015 09:57:57 +0100 Subject: [PATCH 013/151] Bug 1154391 - Update parsing of export declarations to match current ES6 spec r=shu --- js/src/frontend/FoldConstants.cpp | 1 + js/src/frontend/FullParseHandler.h | 4 + js/src/frontend/NameFunctions.cpp | 1 + js/src/frontend/ParseNode.cpp | 1 + js/src/frontend/ParseNode.h | 5 + js/src/frontend/Parser.cpp | 80 ++++++++-- js/src/frontend/Parser.h | 5 +- .../tests/modules/export-declaration.js | 140 +++++++++++++++--- js/src/js.msg | 1 + js/src/jsreflect.cpp | 30 +++- js/src/vm/CommonPropertyNames.h | 1 + js/src/vm/Xdr.h | 4 +- 12 files changed, 227 insertions(+), 46 deletions(-) diff --git a/js/src/frontend/FoldConstants.cpp b/js/src/frontend/FoldConstants.cpp index 9d167d04dcd6f..3f450dd96eeef 100644 --- a/js/src/frontend/FoldConstants.cpp +++ b/js/src/frontend/FoldConstants.cpp @@ -128,6 +128,7 @@ ContainsHoistedDeclaration(ExclusiveContext* cx, ParseNode* node, bool* result) case PNK_IMPORT_SPEC_LIST: case PNK_IMPORT_SPEC: case PNK_EXPORT_FROM: + case PNK_EXPORT_DEFAULT: case PNK_EXPORT_SPEC_LIST: case PNK_EXPORT_SPEC: case PNK_EXPORT: diff --git a/js/src/frontend/FullParseHandler.h b/js/src/frontend/FullParseHandler.h index 51ff365e5f62a..6d96779ef93b3 100644 --- a/js/src/frontend/FullParseHandler.h +++ b/js/src/frontend/FullParseHandler.h @@ -464,6 +464,10 @@ class FullParseHandler return pn; } + ParseNode* newExportDefaultDeclaration(ParseNode* kid, const TokenPos& pos) { + return new_(PNK_EXPORT_DEFAULT, JSOP_NOP, pos, kid); + } + ParseNode* newExprStatement(ParseNode* expr, uint32_t end) { MOZ_ASSERT(expr->pn_pos.end <= end); return new_(PNK_SEMI, JSOP_NOP, TokenPos(expr->pn_pos.begin, end), expr); diff --git a/js/src/frontend/NameFunctions.cpp b/js/src/frontend/NameFunctions.cpp index cb764d9d9555f..8e4d85d6ca6d6 100644 --- a/js/src/frontend/NameFunctions.cpp +++ b/js/src/frontend/NameFunctions.cpp @@ -396,6 +396,7 @@ class NameResolver case PNK_MUTATEPROTO: case PNK_SUPERELEM: case PNK_EXPORT: + case PNK_EXPORT_DEFAULT: MOZ_ASSERT(cur->isArity(PN_UNARY)); if (!resolve(cur->pn_kid, prefix)) return false; diff --git a/js/src/frontend/ParseNode.cpp b/js/src/frontend/ParseNode.cpp index 8e994c8b96784..13fe7947fa87a 100644 --- a/js/src/frontend/ParseNode.cpp +++ b/js/src/frontend/ParseNode.cpp @@ -238,6 +238,7 @@ PushNodeChildren(ParseNode* pn, NodeStack* stack) case PNK_SPREAD: case PNK_MUTATEPROTO: case PNK_EXPORT: + case PNK_EXPORT_DEFAULT: case PNK_SUPERELEM: return PushUnaryNodeChild(pn, stack); diff --git a/js/src/frontend/ParseNode.h b/js/src/frontend/ParseNode.h index f611588352ebb..add179638a7d8 100644 --- a/js/src/frontend/ParseNode.h +++ b/js/src/frontend/ParseNode.h @@ -138,6 +138,7 @@ class UpvarCookie F(IMPORT_SPEC) \ F(EXPORT) \ F(EXPORT_FROM) \ + F(EXPORT_DEFAULT) \ F(EXPORT_SPEC_LIST) \ F(EXPORT_SPEC) \ F(EXPORT_BATCH_SPEC) \ @@ -334,6 +335,10 @@ enum ParseNodeKind * PNK_LABEL name pn_atom: label, pn_expr: labeled statement * PNK_IMPORT binary pn_left: PNK_IMPORT_SPEC_LIST import specifiers * pn_right: PNK_STRING module specifier + * PNK_EXPORT unary pn_kid: declaration expression + * PNK_EXPORT_FROM binary pn_left: PNK_EXPORT_SPEC_LIST export specifiers + * pn_right: PNK_STRING module specifier + * PNK_EXPORT_DEFAULT unary pn_kid: export default declaration or expression * * * All left-associated binary trees of the same type are optimized into lists diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index acc44768b5aaf..7b3f7769c1f3f 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -2598,7 +2598,7 @@ Parser::checkYieldNameValidity() template typename ParseHandler::Node -Parser::functionStmt(YieldHandling yieldHandling) +Parser::functionStmt(YieldHandling yieldHandling, DefaultHandling defaultHandling) { MOZ_ASSERT(tokenStream.isCurrentTokenType(TOK_FUNCTION)); @@ -2620,6 +2620,9 @@ Parser::functionStmt(YieldHandling yieldHandling) if (!checkYieldNameValidity()) return null(); name = tokenStream.currentName(); + } else if (defaultHandling == AllowDefaultName) { + name = context->names().starDefaultStar; + tokenStream.ungetToken(); } else { /* Unnamed function expressions are forbidden in statement context. */ report(ParseError, false, null(), JSMSG_UNNAMED_FUNCTION_STMT); @@ -4372,9 +4375,15 @@ Parser::importDeclaration() return SyntaxParseHandler::NodeFailure; } -template -typename ParseHandler::Node -Parser::exportDeclaration() +template <> +ParseNode* +Parser::classDefinition(YieldHandling yieldHandling, + ClassContext classContext, + DefaultHandling defaultHandling); + +template<> +ParseNode* +Parser::exportDeclaration() { MOZ_ASSERT(tokenStream.currentToken().type == TOK_EXPORT); @@ -4389,6 +4398,7 @@ Parser::exportDeclaration() TokenKind tt; if (!tokenStream.getToken(&tt)) return null(); + bool isExportStar = tt == TOK_MUL; switch (tt) { case TOK_LC: case TOK_MUL: @@ -4445,7 +4455,7 @@ Parser::exportDeclaration() // Handle the form |export *| by adding a special export batch // specifier to the list. Node exportSpec = handler.newNullary(PNK_EXPORT_BATCH_SPEC, JSOP_NOP, pos()); - if (!kid) + if (!exportSpec) return null(); handler.addList(kid, exportSpec); @@ -4463,17 +4473,25 @@ Parser::exportDeclaration() return null(); return handler.newExportFromDeclaration(begin, kid, moduleSpec); + } else if (isExportStar) { + report(ParseError, false, null(), JSMSG_FROM_AFTER_EXPORT_STAR); + return null(); } else { tokenStream.ungetToken(); } - kid = MatchOrInsertSemicolon(tokenStream) ? kid : nullptr; - if (!kid) + if (!MatchOrInsertSemicolon(tokenStream)) return null(); break; case TOK_FUNCTION: - kid = functionStmt(YieldIsKeyword); + kid = functionStmt(YieldIsKeyword, NameRequired); + if (!kid) + return null(); + break; + + case TOK_CLASS: + kid = classDefinition(YieldIsKeyword, ClassStatement, NameRequired); if (!kid) return null(); break; @@ -4488,6 +4506,28 @@ Parser::exportDeclaration() return null(); break; + case TOK_DEFAULT: { + if (!tokenStream.getToken(&tt)) + return null(); + + switch (tt) { + case TOK_FUNCTION: + kid = functionStmt(YieldIsKeyword, AllowDefaultName); + break; + case TOK_CLASS: + kid = classDefinition(YieldIsKeyword, ClassStatement, AllowDefaultName); + break; + default: + tokenStream.ungetToken(); + kid = assignExpr(InAllowed, YieldIsKeyword); + break; + } + if (!kid) + return null(); + + return handler.newExportDefaultDeclaration(kid, TokenPos(begin, pos().end)); + } + case TOK_NAME: // Handle the form |export a| in the same way as |export let a|, by // acting as if we've just seen the let keyword. Simply unget the token @@ -5900,7 +5940,8 @@ Parser::debuggerStatement() template <> ParseNode* Parser::classDefinition(YieldHandling yieldHandling, - ClassContext classContext) + ClassContext classContext, + DefaultHandling defaultHandling) { MOZ_ASSERT(tokenStream.isCurrentTokenType(TOK_CLASS)); @@ -5919,9 +5960,14 @@ Parser::classDefinition(YieldHandling yieldHandling, MOZ_ASSERT(yieldHandling != YieldIsKeyword); name = tokenStream.currentName(); } else if (classContext == ClassStatement) { - // Class statements must have a bound name - report(ParseError, false, null(), JSMSG_UNNAMED_CLASS_STMT); - return null(); + if (defaultHandling == AllowDefaultName) { + name = context->names().starDefaultStar; + tokenStream.ungetToken(); + } else { + // Class statements must have a bound name + report(ParseError, false, null(), JSMSG_UNNAMED_CLASS_STMT); + return null(); + } } else { // Make sure to put it back, whatever it was tokenStream.ungetToken(); @@ -5995,7 +6041,9 @@ Parser::classDefinition(YieldHandling yieldHandling, template <> SyntaxParseHandler::Node -Parser::classDefinition(YieldHandling yieldHandling, ClassContext classContext) +Parser::classDefinition(YieldHandling yieldHandling, + ClassContext classContext, + DefaultHandling defaultHandling) { MOZ_ALWAYS_FALSE(abortIfSyntaxParser()); return SyntaxParseHandler::NodeFailure; @@ -6140,13 +6188,13 @@ Parser::statement(YieldHandling yieldHandling, bool canHaveDirecti // HoistableDeclaration[?Yield] case TOK_FUNCTION: - return functionStmt(yieldHandling); + return functionStmt(yieldHandling, NameRequired); // ClassDeclaration[?Yield] case TOK_CLASS: if (!abortIfSyntaxParser()) return null(); - return classDefinition(yieldHandling, ClassStatement); + return classDefinition(yieldHandling, ClassStatement, NameRequired); // LexicalDeclaration[In, ?Yield] case TOK_LET: @@ -8575,7 +8623,7 @@ Parser::primaryExpr(YieldHandling yieldHandling, TokenKind tt, return functionExpr(invoked); case TOK_CLASS: - return classDefinition(yieldHandling, ClassExpression); + return classDefinition(yieldHandling, ClassExpression, NameRequired); case TOK_LB: return arrayInitializer(yieldHandling); diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index e443655e47fd8..918db51bd72da 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -335,6 +335,7 @@ enum PropListType { ObjectLiteral, ClassBody }; // parameter everywhere. enum YieldHandling { YieldIsName, YieldIsKeyword }; enum InHandling { InAllowed, InProhibited }; +enum DefaultHandling { NameRequired, AllowDefaultName }; template class Parser : private JS::AutoGCRooter, public StrictModeGetter @@ -543,7 +544,7 @@ class Parser : private JS::AutoGCRooter, public StrictModeGetter * Some parsers have two versions: an always-inlined version (with an 'i' * suffix) and a never-inlined version (with an 'n' suffix). */ - Node functionStmt(YieldHandling yieldHandling); + Node functionStmt(YieldHandling yieldHandling, DefaultHandling defaultHandling); Node functionExpr(InvokedPrediction invoked = PredictUninvoked); Node statements(YieldHandling yieldHandling); @@ -638,7 +639,7 @@ class Parser : private JS::AutoGCRooter, public StrictModeGetter bool namedImportsOrNamespaceImport(TokenKind tt, Node importSpecSet); enum ClassContext { ClassStatement, ClassExpression }; - Node classDefinition(YieldHandling yieldHandling, ClassContext classContext); + Node classDefinition(YieldHandling yieldHandling, ClassContext classContext, DefaultHandling defaultHandling); Node identifierName(YieldHandling yieldHandling); diff --git a/js/src/jit-test/tests/modules/export-declaration.js b/js/src/jit-test/tests/modules/export-declaration.js index b03d227e2fd87..9d3245aa58bf0 100644 --- a/js/src/jit-test/tests/modules/export-declaration.js +++ b/js/src/jit-test/tests/modules/export-declaration.js @@ -7,11 +7,12 @@ program = (elts) => Pattern({ type: "Program", body: elts }) -exportDeclaration = (declaration, specifiers, source) => Pattern({ +exportDeclaration = (declaration, specifiers, source, isDefault) => Pattern({ type: "ExportDeclaration", declaration: declaration, specifiers: specifiers, - source: source + source: source, + isDefault: isDefault }); exportSpecifier = (id, name) => Pattern({ type: "ExportSpecifier", @@ -34,6 +35,10 @@ functionDeclaration = (id, params, body) => Pattern({ rest: null, generator: false }); +classDeclaration = (name) => Pattern({ + type: "ClassStatement", + name: name +}); variableDeclaration = (decls) => Pattern({ type: "VariableDeclaration", kind: "var", @@ -62,7 +67,8 @@ program([ exportDeclaration( null, [], - null + null, + false ) ]).assert(Reflect.parse("export {}")); @@ -75,7 +81,8 @@ program([ ident("a") ) ], - null + null, + false ) ]).assert(Reflect.parse("export { a }")); @@ -88,7 +95,8 @@ program([ ident("b") ) ], - null + null, + false ) ]).assert(Reflect.parse("export { a as b }")); @@ -101,7 +109,8 @@ program([ ident("as") ) ], - null + null, + false ) ]).assert(Reflect.parse("export { as as as }")); @@ -114,7 +123,8 @@ program([ ident("true") ) ], - null + null, + false ) ]).assert(Reflect.parse("export { a as true }")); @@ -131,7 +141,8 @@ program([ ident("b") ), ], - null + null, + false ) ]).assert(Reflect.parse("export { a, b }")); @@ -148,7 +159,8 @@ program([ ident("d") ), ], - null + null, + false ) ]).assert(Reflect.parse("export { a as b, c as d }")); @@ -156,11 +168,15 @@ program([ exportDeclaration( null, [ - exportBatchSpecifier() + exportSpecifier( + ident("a"), + ident("a") + ) ], - null + lit("b"), + false ) -]).assert(Reflect.parse("export *")); +]).assert(Reflect.parse("export { a } from 'b'")); program([ exportDeclaration( @@ -168,7 +184,8 @@ program([ [ exportBatchSpecifier() ], - lit("a") + lit("a"), + false ) ]).assert(Reflect.parse("export * from 'a'")); @@ -180,10 +197,22 @@ program([ blockStatement([]) ), null, - null + null, + false ) ]).assert(Reflect.parse("export function f() {}")); +program([ + exportDeclaration( + classDeclaration( + ident("Foo") + ), + null, + null, + false + ) +]).assert(Reflect.parse("export class Foo { constructor() {} }")); + program([ exportDeclaration( variableDeclaration([ @@ -196,7 +225,8 @@ program([ } ]), null, - null + null, + false ) ]).assert(Reflect.parse("export var a = 1, b = 2;")); @@ -212,12 +242,13 @@ program([ } ]), null, - null + null, + false ) ]).assert(Reflect.parse("export const a = 1, b = 2;")); // FIXME: In scripts, top level lets are converted back to vars. Fix this when -// we implement compiling scripts as modules. +// we implement compiling scripts as modules (bug 589199). program([ exportDeclaration( variableDeclaration([ @@ -230,7 +261,8 @@ program([ } ]), null, - null + null, + false ) ]).assert(Reflect.parse("export let a = 1, b = 2;")); @@ -248,10 +280,68 @@ program([ } ]), null, - null + null, + false ) ]).assert(Reflect.parse("export a = 1, b = 2;")); +program([ + exportDeclaration( + functionDeclaration( + ident("*default*"), + [], + blockStatement([]) + ), + null, + null, + true + ) +]).assert(Reflect.parse("export default function() {}")); + +program([ + exportDeclaration( + functionDeclaration( + ident("foo"), + [], + blockStatement([]) + ), + null, + null, + true + ) +]).assert(Reflect.parse("export default function foo() {}")); + +program([ + exportDeclaration( + classDeclaration( + ident("*default*") + ), + null, + null, + true + ) +]).assert(Reflect.parse("export default class { constructor() {} }")); + +program([ + exportDeclaration( + classDeclaration( + ident("Foo") + ), + null, + null, + true + ) +]).assert(Reflect.parse("export default class Foo { constructor() {} }")); + +program([ + exportDeclaration( + lit(1234), + null, + null, + true + ) +]).assert(Reflect.parse("export default 1234")); + var loc = Reflect.parse("export { a as b } from 'c'", { loc: true }).body[0].loc; @@ -289,6 +379,10 @@ assertThrowsInstanceOf(function () { Reflect.parse("export { a } from 'b' f();"); }, SyntaxError); +assertThrowsInstanceOf(function () { + Reflect.parse("export *"); +}, SyntaxError); + assertThrowsInstanceOf(function () { Reflect.parse("export * from 'b' f();"); }, SyntaxError); @@ -296,3 +390,11 @@ assertThrowsInstanceOf(function () { assertThrowsInstanceOf(function() { Reflect.parse("export {}\nfrom ()"); }, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("function() {}"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("class() { constructor() {} }"); +}, SyntaxError); diff --git a/js/src/js.msg b/js/src/js.msg index dc48d53274a02..4d84c8f4738c6 100644 --- a/js/src/js.msg +++ b/js/src/js.msg @@ -251,6 +251,7 @@ MSG_DEF(JSMSG_EQUAL_AS_ASSIGN, 0, JSEXN_SYNTAXERR, "test for equality (= MSG_DEF(JSMSG_EXPORT_DECL_AT_TOP_LEVEL,0, JSEXN_SYNTAXERR, "export declarations may only appear at top level") MSG_DEF(JSMSG_FINALLY_WITHOUT_TRY, 0, JSEXN_SYNTAXERR, "finally without try") MSG_DEF(JSMSG_FROM_AFTER_IMPORT_CLAUSE, 0, JSEXN_SYNTAXERR, "missing keyword 'from' after import clause") +MSG_DEF(JSMSG_FROM_AFTER_EXPORT_STAR, 0, JSEXN_SYNTAXERR, "missing keyword 'from' after export *") MSG_DEF(JSMSG_GARBAGE_AFTER_INPUT, 2, JSEXN_SYNTAXERR, "unexpected garbage after {0}, starting with {1}") MSG_DEF(JSMSG_IDSTART_AFTER_NUMBER, 0, JSEXN_SYNTAXERR, "identifier starts immediately after numeric literal") MSG_DEF(JSMSG_ILLEGAL_CHARACTER, 0, JSEXN_SYNTAXERR, "illegal character") diff --git a/js/src/jsreflect.cpp b/js/src/jsreflect.cpp index 25adf62b1ad31..5752e8d750070 100644 --- a/js/src/jsreflect.cpp +++ b/js/src/jsreflect.cpp @@ -610,7 +610,8 @@ class NodeBuilder bool importSpecifier(HandleValue importName, HandleValue bindingName, TokenPos* pos, MutableHandleValue dst); - bool exportDeclaration(HandleValue decl, NodeVector& elts, HandleValue moduleSpec, TokenPos* pos, MutableHandleValue dst); + bool exportDeclaration(HandleValue decl, NodeVector& elts, HandleValue moduleSpec, + HandleValue isDefault, TokenPos* pos, MutableHandleValue dst); bool exportSpecifier(HandleValue bindingName, HandleValue exportName, TokenPos* pos, MutableHandleValue dst); @@ -1524,13 +1525,13 @@ NodeBuilder::importSpecifier(HandleValue importName, HandleValue bindingName, To bool NodeBuilder::exportDeclaration(HandleValue decl, NodeVector& elts, HandleValue moduleSpec, - TokenPos* pos, MutableHandleValue dst) + HandleValue isDefault, TokenPos* pos, MutableHandleValue dst) { RootedValue array(cx, NullValue()); if (decl.isNull() && !newArray(elts, &array)) return false; - RootedValue cb(cx, callbacks[AST_IMPORT_DECL]); + RootedValue cb(cx, callbacks[AST_EXPORT_DECL]); if (!cb.isNull()) return callback(cb, decl, array, moduleSpec, pos, dst); @@ -1539,6 +1540,7 @@ NodeBuilder::exportDeclaration(HandleValue decl, NodeVector& elts, HandleValue m "declaration", decl, "specifiers", array, "source", moduleSpec, + "isDefault", isDefault, dst); } @@ -2191,13 +2193,15 @@ ASTSerializer::importSpecifier(ParseNode* pn, MutableHandleValue dst) bool ASTSerializer::exportDeclaration(ParseNode* pn, MutableHandleValue dst) { - MOZ_ASSERT(pn->isKind(PNK_EXPORT) || pn->isKind(PNK_EXPORT_FROM)); + MOZ_ASSERT(pn->isKind(PNK_EXPORT) || + pn->isKind(PNK_EXPORT_FROM) || + pn->isKind(PNK_EXPORT_DEFAULT)); MOZ_ASSERT_IF(pn->isKind(PNK_EXPORT_FROM), pn->pn_right->isKind(PNK_STRING)); RootedValue decl(cx, NullValue()); NodeVector elts(cx); - ParseNode* kid = pn->isKind(PNK_EXPORT) ? pn->pn_kid : pn->pn_left; + ParseNode* kid = pn->isKind(PNK_EXPORT_FROM) ? pn->pn_left: pn->pn_kid; switch (ParseNodeKind kind = kid->getKind()) { case PNK_EXPORT_SPEC_LIST: if (!elts.reserve(pn->pn_left->pn_count)) @@ -2221,6 +2225,11 @@ ASTSerializer::exportDeclaration(ParseNode* pn, MutableHandleValue dst) return false; break; + case PNK_CLASS: + if (!classDefinition(kid, false, &decl)) + return false; + break; + case PNK_VAR: case PNK_CONST: case PNK_GLOBALCONST: @@ -2230,14 +2239,20 @@ ASTSerializer::exportDeclaration(ParseNode* pn, MutableHandleValue dst) break; default: - LOCAL_NOT_REACHED("unexpected statement type"); + if (!expression(kid, &decl)) + return false; + break; } RootedValue moduleSpec(cx, NullValue()); if (pn->isKind(PNK_EXPORT_FROM) && !literal(pn->pn_right, &moduleSpec)) return false; - return builder.exportDeclaration(decl, elts, moduleSpec, &pn->pn_pos, dst); + RootedValue isDefault(cx, BooleanValue(false)); + if (pn->isKind(PNK_EXPORT_DEFAULT)) + isDefault.setBoolean(true); + + return builder.exportDeclaration(decl, elts, moduleSpec, isDefault, &pn->pn_pos, dst); } bool @@ -2430,6 +2445,7 @@ ASTSerializer::statement(ParseNode* pn, MutableHandleValue dst) return importDeclaration(pn, dst); case PNK_EXPORT: + case PNK_EXPORT_DEFAULT: case PNK_EXPORT_FROM: return exportDeclaration(pn, dst); diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index 9d4d1b8cee286..ebbbd43c3566f 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -188,6 +188,7 @@ macro(source, source, "source") \ macro(stack, stack, "stack") \ macro(star, star, "*") \ + macro(starDefaultStar, starDefaultStar, "*default*") \ macro(startTimestamp, startTimestamp, "startTimestamp") \ macro(static, static_, "static") \ macro(sticky, sticky, "sticky") \ diff --git a/js/src/vm/Xdr.h b/js/src/vm/Xdr.h index 28f39537e198d..1121294af792b 100644 --- a/js/src/vm/Xdr.h +++ b/js/src/vm/Xdr.h @@ -29,11 +29,11 @@ namespace js { * * https://developer.mozilla.org/en-US/docs/SpiderMonkey/Internals/Bytecode */ -static const uint32_t XDR_BYTECODE_VERSION_SUBTRAHEND = 286; +static const uint32_t XDR_BYTECODE_VERSION_SUBTRAHEND = 287; static const uint32_t XDR_BYTECODE_VERSION = uint32_t(0xb973c0de - XDR_BYTECODE_VERSION_SUBTRAHEND); -static_assert(JSErr_Limit == 397, +static_assert(JSErr_Limit == 398, "GREETINGS, POTENTIAL SUBTRAHEND INCREMENTER! If you added or " "removed MSG_DEFs from js.msg, you should increment " "XDR_BYTECODE_VERSION_SUBTRAHEND and update this assertion's " From 8e863f2bce6b0ecca2df8e47f5ac6b8b1512d52a Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Thu, 28 May 2015 09:57:57 +0100 Subject: [PATCH 014/151] Bug 1154391 - Remove export syntax that's not present in ES6 r=shu --- js/src/frontend/Parser.cpp | 7 -- .../basic/syntax-error-illegal-character.js | 76 +++++++++++++++++-- .../tests/modules/export-declaration.js | 27 ++----- 3 files changed, 79 insertions(+), 31 deletions(-) diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 7b3f7769c1f3f..5b965abc45207 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -4528,13 +4528,6 @@ Parser::exportDeclaration() return handler.newExportDefaultDeclaration(kid, TokenPos(begin, pos().end)); } - case TOK_NAME: - // Handle the form |export a| in the same way as |export let a|, by - // acting as if we've just seen the let keyword. Simply unget the token - // and fall through. - // - // XXX This |export foo = 5| syntax is *not* in ES6! Remove it! - tokenStream.ungetToken(); case TOK_LET: case TOK_CONST: kid = lexicalDeclaration(YieldIsName, tt == TOK_CONST); diff --git a/js/src/jit-test/tests/basic/syntax-error-illegal-character.js b/js/src/jit-test/tests/basic/syntax-error-illegal-character.js index 18fede5850a25..1a8551bafa703 100644 --- a/js/src/jit-test/tests/basic/syntax-error-illegal-character.js +++ b/js/src/jit-test/tests/basic/syntax-error-illegal-character.js @@ -414,11 +414,6 @@ test("debugger; @"); // export test_no_fun_no_eval("export @"); -test_no_fun_no_eval("export x @"); -test_no_fun_no_eval("export x, @"); -test_no_fun_no_eval("export x, y @"); -test_no_fun_no_eval("export x, y; @"); - test_no_fun_no_eval("export { @"); test_no_fun_no_eval("export { x @"); test_no_fun_no_eval("export { x, @"); @@ -473,6 +468,54 @@ test_no_fun_no_eval("export const a = 1, b = @"); test_no_fun_no_eval("export const a = 1, b = 2 @"); test_no_fun_no_eval("export const a = 1, b = 2; @"); +test_no_fun_no_eval("export class @"); +test_no_fun_no_eval("export class Foo @"); +test_no_fun_no_eval("export class Foo { @"); +test_no_fun_no_eval("export class Foo { constructor @"); +test_no_fun_no_eval("export class Foo { constructor( @"); +test_no_fun_no_eval("export class Foo { constructor() @"); +test_no_fun_no_eval("export class Foo { constructor() { @"); +test_no_fun_no_eval("export class Foo { constructor() {} @"); +test_no_fun_no_eval("export class Foo { constructor() {} } @"); +test_no_fun_no_eval("export class Foo { constructor() {} }; @"); + +test_no_fun_no_eval("export default @"); +test_no_fun_no_eval("export default 1 @"); +test_no_fun_no_eval("export default 1; @"); + +test_no_fun_no_eval("export default function @"); +test_no_fun_no_eval("export default function() @"); +test_no_fun_no_eval("export default function() { @"); +test_no_fun_no_eval("export default function() {} @"); +test_no_fun_no_eval("export default function() {}; @"); + +test_no_fun_no_eval("export default function foo @"); +test_no_fun_no_eval("export default function foo( @"); +test_no_fun_no_eval("export default function foo() @"); +test_no_fun_no_eval("export default function foo() { @"); +test_no_fun_no_eval("export default function foo() {} @"); +test_no_fun_no_eval("export default function foo() {}; @"); + +test_no_fun_no_eval("export default class @"); +test_no_fun_no_eval("export default class { @"); +test_no_fun_no_eval("export default class { constructor @"); +test_no_fun_no_eval("export default class { constructor( @"); +test_no_fun_no_eval("export default class { constructor() @"); +test_no_fun_no_eval("export default class { constructor() { @"); +test_no_fun_no_eval("export default class { constructor() {} @"); +test_no_fun_no_eval("export default class { constructor() {} } @"); +test_no_fun_no_eval("export default class { constructor() {} }; @"); + +test_no_fun_no_eval("export default class Foo @"); +test_no_fun_no_eval("export default class Foo { @"); +test_no_fun_no_eval("export default class Foo { constructor @"); +test_no_fun_no_eval("export default class Foo { constructor( @"); +test_no_fun_no_eval("export default class Foo { constructor() @"); +test_no_fun_no_eval("export default class Foo { constructor() { @"); +test_no_fun_no_eval("export default class Foo { constructor() {} @"); +test_no_fun_no_eval("export default class Foo { constructor() {} } @"); +test_no_fun_no_eval("export default class Foo { constructor() {} }; @"); + // import test_no_fun_no_eval("import @"); @@ -500,6 +543,29 @@ test_no_fun_no_eval("import { x as y } from 'a'; @"); test_no_fun_no_eval("import 'a' @"); test_no_fun_no_eval("import 'a'; @"); +test_no_fun_no_eval("import * @"); +test_no_fun_no_eval("import * as @"); +test_no_fun_no_eval("import * as a @"); +test_no_fun_no_eval("import * as a from @"); +test_no_fun_no_eval("import * as a from 'a' @"); +test_no_fun_no_eval("import * as a from 'a'; @"); + +test_no_fun_no_eval("import a @"); +test_no_fun_no_eval("import a, @"); +test_no_fun_no_eval("import a, * @"); +test_no_fun_no_eval("import a, * as @"); +test_no_fun_no_eval("import a, * as b @"); +test_no_fun_no_eval("import a, * as b from @"); +test_no_fun_no_eval("import a, * as b from 'c' @"); +test_no_fun_no_eval("import a, * as b from 'c'; @"); + +test_no_fun_no_eval("import a, { @"); +test_no_fun_no_eval("import a, { b @"); +test_no_fun_no_eval("import a, { b } @"); +test_no_fun_no_eval("import a, { b } from @"); +test_no_fun_no_eval("import a, { b } from 'c' @"); +test_no_fun_no_eval("import a, { b } from 'c'; @"); + // label test("a @"); diff --git a/js/src/jit-test/tests/modules/export-declaration.js b/js/src/jit-test/tests/modules/export-declaration.js index 9d3245aa58bf0..e65ae49f710ed 100644 --- a/js/src/jit-test/tests/modules/export-declaration.js +++ b/js/src/jit-test/tests/modules/export-declaration.js @@ -266,25 +266,6 @@ program([ ) ]).assert(Reflect.parse("export let a = 1, b = 2;")); -// NOTE: binding lists are treated as if they were let declarations by esprima, -// so we follow that convention. -program([ - exportDeclaration( - variableDeclaration([ - { - id: ident("a"), - init: lit(1) - }, { - id: ident("b"), - init: lit(2) - } - ]), - null, - null, - false - ) -]).assert(Reflect.parse("export a = 1, b = 2;")); - program([ exportDeclaration( functionDeclaration( @@ -398,3 +379,11 @@ assertThrowsInstanceOf(function() { assertThrowsInstanceOf(function() { Reflect.parse("class() { constructor() {} }"); }, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("export x"); +}, SyntaxError); + +assertThrowsInstanceOf(function() { + Reflect.parse("export foo = 5"); +}, SyntaxError); From 657c062d2a8d3d771075df9973a441d31fb99357 Mon Sep 17 00:00:00 2001 From: Franziskus Kiefer Date: Wed, 27 May 2015 13:29:00 -0700 Subject: [PATCH 015/151] Bug 1165501 - using most recent referrer policy found in the document. r=sstamm --HG-- extra : rebase_source : 1513da5ff6a896ab4987323354458004b5ddb787 --- dom/base/nsDocument.cpp | 29 +++++---------- dom/base/test/bug704320.sjs | 35 ++++++++++++++---- dom/base/test/mochitest.ini | 2 ++ dom/base/test/test_bug1165501.html | 51 +++++++++++++++++++++++++++ parser/html/nsHtml5TreeOpExecutor.cpp | 19 +++------- parser/html/nsHtml5TreeOpExecutor.h | 3 +- 6 files changed, 94 insertions(+), 45 deletions(-) create mode 100644 dom/base/test/test_bug1165501.html diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 66e1c05686517..d2f23772cb547 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -2976,19 +2976,10 @@ nsDocument::InitCSP(nsIChannel* aChannel) rv = csp->GetReferrerPolicy(&referrerPolicy, &hasReferrerPolicy); NS_ENSURE_SUCCESS(rv, rv); if (hasReferrerPolicy) { - // Referrer policy spec (section 6.1) says that once the referrer policy - // is set, any future attempts to change it result in No-Referrer. - if (!mReferrerPolicySet) { - mReferrerPolicy = static_cast(referrerPolicy); - mReferrerPolicySet = true; - } else if (mReferrerPolicy != referrerPolicy) { - mReferrerPolicy = mozilla::net::RP_No_Referrer; - { - MOZ_LOG(gCspPRLog, PR_LOG_DEBUG, ("%s %s", - "CSP wants to set referrer, but nsDocument" - "already has it set. No referrers will be sent")); - } - } + // Referrer policy spec (section 6.1) says that we always use the newest + // referrer policy we find + mReferrerPolicy = static_cast(referrerPolicy); + mReferrerPolicySet = true; // Referrer Policy is set separately for the speculative parser in // nsHTMLDocument::StartDocumentLoad() so there's nothing to do here for @@ -3776,14 +3767,10 @@ nsDocument::SetHeaderData(nsIAtom* aHeaderField, const nsAString& aData) if (aHeaderField == nsGkAtoms::referrer && !aData.IsEmpty()) { ReferrerPolicy policy = mozilla::net::ReferrerPolicyFromString(aData); - // Referrer policy spec (section 6.1) says that once the referrer policy - // is set, any future attempts to change it result in No-Referrer. - if (!mReferrerPolicySet) { - mReferrerPolicy = policy; - mReferrerPolicySet = true; - } else if (mReferrerPolicy != policy) { - mReferrerPolicy = mozilla::net::RP_No_Referrer; - } + // Referrer policy spec (section 6.1) says that we always use the newest + // referrer policy we find + mReferrerPolicy = policy; + mReferrerPolicySet = true; } } diff --git a/dom/base/test/bug704320.sjs b/dom/base/test/bug704320.sjs index b154475d05b21..bdcbbb4bd1834 100644 --- a/dom/base/test/bug704320.sjs +++ b/dom/base/test/bug704320.sjs @@ -44,17 +44,23 @@ function create2ndLevelIframeUrl(schemeFrom, schemeTo, policy, type) { // loaded. The click triggers a redirection to file_bug704320_redirect.html, // which in turn notifies the main window that it's time to check the test // results. -function createTest(schemeFrom, schemeTo, policy) { +function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) { var _createTestUrl = createTestUrl.bind( null, schemeFrom, schemeTo, policy, 'test'); var _create2ndLevelIframeUrl = create2ndLevelIframeUrl.bind( null, schemeFrom, schemeTo, policy); + var metaReferrerPolicyString = ''; + if (optionalEarlierPolicy && optionalEarlierPolicy != '') { + metaReferrerPolicyString += '\n'; + } + metaReferrerPolicyString += ''; + return '\n\ \n\ \n\ - \n\ + '+metaReferrerPolicyString+'\n\ \n\ @@ -44,10 +39,5 @@
content-box 20px
-
padding-box 20px
-
padding-box 50px
-
padding-box 20px
- - diff --git a/layout/reftests/box-sizing/computed-size-reporting-ref.html b/layout/reftests/box-sizing/computed-size-reporting-ref.html index 0784b309e0fe9..f910417e596c9 100644 --- a/layout/reftests/box-sizing/computed-size-reporting-ref.html +++ b/layout/reftests/box-sizing/computed-size-reporting-ref.html @@ -9,26 +9,14 @@ box-sizing:border-box; } - #paddingBox { - background:gold; - height:100px; - box-sizing:padding-box; - } -

-
-

diff --git a/layout/reftests/box-sizing/computed-size-reporting.html b/layout/reftests/box-sizing/computed-size-reporting.html index fbcd62577a1f2..227ea2cfbd26c 100644 --- a/layout/reftests/box-sizing/computed-size-reporting.html +++ b/layout/reftests/box-sizing/computed-size-reporting.html @@ -10,27 +10,14 @@ border: 20px solid gold; } - #paddingBox { - background:gold; - height:100px; - box-sizing:padding-box; - padding: 20px; - } -

-
-

diff --git a/layout/reftests/box-sizing/intrinsic-1a.html b/layout/reftests/box-sizing/intrinsic-1a.html index b2e7ebf46c6a9..2a678176dd1e3 100644 --- a/layout/reftests/box-sizing/intrinsic-1a.html +++ b/layout/reftests/box-sizing/intrinsic-1a.html @@ -4,6 +4,6 @@ + box-sizing: border-box;"> diff --git a/layout/reftests/box-sizing/intrinsic-1b.html b/layout/reftests/box-sizing/intrinsic-1b.html index 398b2e37a8db6..0bb5af75f3103 100644 --- a/layout/reftests/box-sizing/intrinsic-1b.html +++ b/layout/reftests/box-sizing/intrinsic-1b.html @@ -4,6 +4,6 @@ + box-sizing: border-box;"> diff --git a/layout/reftests/box-sizing/intrinsic-1d.html b/layout/reftests/box-sizing/intrinsic-1d.html index 6865d0b499c3a..08a982ff0ca16 100644 --- a/layout/reftests/box-sizing/intrinsic-1d.html +++ b/layout/reftests/box-sizing/intrinsic-1d.html @@ -4,6 +4,6 @@ + box-sizing: border-box;"> diff --git a/layout/reftests/box-sizing/intrinsic-1e.html b/layout/reftests/box-sizing/intrinsic-1e.html index 3b35b67544d59..c27cab66a1d32 100644 --- a/layout/reftests/box-sizing/intrinsic-1e.html +++ b/layout/reftests/box-sizing/intrinsic-1e.html @@ -4,6 +4,6 @@ + box-sizing: border-box;"> diff --git a/layout/reftests/box-sizing/intrinsic-1f.html b/layout/reftests/box-sizing/intrinsic-1f.html index 6301127267ae5..a273761ab5dea 100644 --- a/layout/reftests/box-sizing/intrinsic-1f.html +++ b/layout/reftests/box-sizing/intrinsic-1f.html @@ -4,6 +4,6 @@ + box-sizing: border-box;"> diff --git a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-001-ref.xht b/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-001-ref.xht deleted file mode 100644 index d9a1f41e4cc4e..0000000000000 --- a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-001-ref.xht +++ /dev/null @@ -1,40 +0,0 @@ - - - - CSS Reference: Box Sizing - Padding-Box with specified width/height - - - - - The two divs should be side-by-side, not one on top of another. No red should be visible. -
-
-
LEFT HALF
-
RIGHT HALF
-
- - diff --git a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-001.xht b/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-001.xht deleted file mode 100644 index 17f81850c3939..0000000000000 --- a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-001.xht +++ /dev/null @@ -1,43 +0,0 @@ - - - - CSS Test: Box Sizing - Padding-Box with specified width/height - - - - - - - The two divs should be side-by-side, not one on top of another. No red should be visible. -
-
-
LEFT HALF
-
RIGHT HALF
-
- - diff --git a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-002-ref.xht b/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-002-ref.xht deleted file mode 100644 index 06260223d31dd..0000000000000 --- a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-002-ref.xht +++ /dev/null @@ -1,42 +0,0 @@ - - - - CSS Reference: Box Sizing - Padding-Box with specified width/height - - - - - The two divs should be side-by-side, not one on top of another. No red should be visible. -
-
-
LEFT HALF
-
RIGHT HALF
-
- - diff --git a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-002.xht b/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-002.xht deleted file mode 100644 index 282e2be72b1cc..0000000000000 --- a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-002.xht +++ /dev/null @@ -1,45 +0,0 @@ - - - - CSS Test: Box Sizing - Padding-Box with specified width/height - - - - - - - The two divs should be side-by-side, not one on top of another. No red should be visible. -
-
-
LEFT HALF
-
RIGHT HALF
-
- - diff --git a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-003-ref.xht b/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-003-ref.xht deleted file mode 100644 index d3ba96f37e4f3..0000000000000 --- a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-003-ref.xht +++ /dev/null @@ -1,42 +0,0 @@ - - - - CSS Reference: Box Sizing - Padding-Box with min/max width/height - - - - - The two divs should be side-by-side, not one on top of another. No red should be visible. -
-
-
LEFT HALF
-
RIGHT HALF
-
- - diff --git a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-003.xht b/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-003.xht deleted file mode 100644 index 79d7e3add9cf1..0000000000000 --- a/layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-003.xht +++ /dev/null @@ -1,49 +0,0 @@ - - - - CSS Test: Box Sizing - Padding-Box with min/max width/height - - - - - - - The two divs should be side-by-side, not one on top of another. No red should be visible. -
-
-
LEFT HALF
-
RIGHT HALF
-
- - diff --git a/layout/reftests/w3c-css/submitted/ui3/box-sizing-replaced-001.xht b/layout/reftests/w3c-css/submitted/ui3/box-sizing-replaced-001.xht index 3dd9dee390f94..ad0e5086e171c 100644 --- a/layout/reftests/w3c-css/submitted/ui3/box-sizing-replaced-001.xht +++ b/layout/reftests/w3c-css/submitted/ui3/box-sizing-replaced-001.xht @@ -21,7 +21,7 @@ .with-padding { padding: 5px 5px; - box-sizing: padding-box; + box-sizing: border-box; } #img1 { diff --git a/layout/reftests/w3c-css/submitted/ui3/reftest.list b/layout/reftests/w3c-css/submitted/ui3/reftest.list index 40bc226869351..ccf2b9fb4fe21 100644 --- a/layout/reftests/w3c-css/submitted/ui3/reftest.list +++ b/layout/reftests/w3c-css/submitted/ui3/reftest.list @@ -5,9 +5,6 @@ == box-sizing-content-box-001.xht box-sizing-content-box-001-ref.xht == box-sizing-content-box-002.xht box-sizing-content-box-002-ref.xht == box-sizing-content-box-003.xht box-sizing-content-box-003-ref.xht -== box-sizing-padding-box-001.xht box-sizing-padding-box-001-ref.xht -== box-sizing-padding-box-002.xht box-sizing-padding-box-002-ref.xht -== box-sizing-padding-box-003.xht box-sizing-padding-box-003-ref.xht random-if(Android) skip-if((B2G&&browserIsRemote)||Mulet) == box-sizing-replaced-001.xht box-sizing-replaced-001-ref.xht #bug 982547 # Initial mulet triage: parity with B2G/B2G Desktop fuzzy-if(Android,27,874) random-if((B2G&&browserIsRemote)||Mulet) == box-sizing-replaced-002.xht box-sizing-replaced-002-ref.xht # Bug 1128229 # Initial mulet triage: parity with B2G/B2G Desktop fuzzy-if(Android,14,869) random-if((B2G&&browserIsRemote)||Mulet) == box-sizing-replaced-003.xht box-sizing-replaced-003-ref.xht # Bug 1128229 # Initial mulet triage: parity with B2G/B2G Desktop diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp index 5e97f82bea9a8..23d2ca93817eb 100644 --- a/layout/style/nsCSSProps.cpp +++ b/layout/style/nsCSSProps.cpp @@ -888,7 +888,6 @@ const KTableValue nsCSSProps::kBoxShadowTypeKTable[] = { const KTableValue nsCSSProps::kBoxSizingKTable[] = { eCSSKeyword_content_box, NS_STYLE_BOX_SIZING_CONTENT, eCSSKeyword_border_box, NS_STYLE_BOX_SIZING_BORDER, - eCSSKeyword_padding_box, NS_STYLE_BOX_SIZING_PADDING, eCSSKeyword_UNKNOWN,-1 }; diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 4829f464b5144..7352cfc823a09 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -517,13 +517,8 @@ nsComputedDOMStyle::GetAdjustedValuesForBoxSizing() const nsStylePosition* stylePos = StylePosition(); nsMargin adjustment; - switch(stylePos->mBoxSizing) { - case NS_STYLE_BOX_SIZING_BORDER: - adjustment += mInnerFrame->GetUsedBorder(); - // fall through - - case NS_STYLE_BOX_SIZING_PADDING: - adjustment += mInnerFrame->GetUsedPadding(); + if (stylePos->mBoxSizing == NS_STYLE_BOX_SIZING_BORDER) { + adjustment += mInnerFrame->GetUsedBorderAndPadding(); } return adjustment; diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index a9f326ce1f25d..1e769ccf398f7 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -58,8 +58,7 @@ static inline mozilla::css::Side operator++(mozilla::css::Side& side, int) { // box-sizing #define NS_STYLE_BOX_SIZING_CONTENT 0 -#define NS_STYLE_BOX_SIZING_PADDING 1 -#define NS_STYLE_BOX_SIZING_BORDER 2 +#define NS_STYLE_BOX_SIZING_BORDER 1 // clip-path sizing #define NS_STYLE_CLIP_SHAPE_SIZING_NOBOX 0 diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index 2fe81023882f1..6a8645a9068dd 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -1045,8 +1045,8 @@ var gCSSProperties = { inherited: false, type: CSS_TYPE_LONGHAND, initial_values: [ "content-box" ], - other_values: [ "border-box", "padding-box" ], - invalid_values: [ "margin-box", "content", "padding", "border", "margin" ] + other_values: [ "border-box" ], + invalid_values: [ "margin-box", "content", "padding", "border", "margin", "padding-box" ] }, "-moz-box-sizing": { domProp: "MozBoxSizing", @@ -1055,8 +1055,8 @@ var gCSSProperties = { alias_for: "box-sizing", subproperties: [ "box-sizing" ], initial_values: [ "content-box" ], - other_values: [ "border-box", "padding-box" ], - invalid_values: [ "margin-box", "content", "padding", "border", "margin" ] + other_values: [ "border-box" ], + invalid_values: [ "margin-box", "content", "padding", "border", "margin", "padding-box" ] }, "-moz-columns": { domProp: "MozColumns", diff --git a/layout/tables/BasicTableLayoutStrategy.cpp b/layout/tables/BasicTableLayoutStrategy.cpp index bd808034efbb0..fac125eaeb08b 100644 --- a/layout/tables/BasicTableLayoutStrategy.cpp +++ b/layout/tables/BasicTableLayoutStrategy.cpp @@ -113,25 +113,13 @@ GetWidthInfo(nsRenderingContext *aRenderingContext, // for height). // For this reason, we also do not use box-sizing for just one of // them, as this may be confusing. - if (isQuirks) { + if (isQuirks || stylePos->mBoxSizing == NS_STYLE_BOX_SIZING_CONTENT) { boxSizingToBorderEdge = offsets.hPadding + offsets.hBorder; } else { - switch (stylePos->mBoxSizing) { - case NS_STYLE_BOX_SIZING_CONTENT: - boxSizingToBorderEdge = offsets.hPadding + offsets.hBorder; - break; - case NS_STYLE_BOX_SIZING_PADDING: - minCoord += offsets.hPadding; - prefCoord += offsets.hPadding; - boxSizingToBorderEdge = offsets.hBorder; - break; - default: - // NS_STYLE_BOX_SIZING_BORDER - minCoord += offsets.hPadding + offsets.hBorder; - prefCoord += offsets.hPadding + offsets.hBorder; - break; - } + // NS_STYLE_BOX_SIZING_BORDER and standards-mode + minCoord += offsets.hPadding + offsets.hBorder; + prefCoord += offsets.hPadding + offsets.hBorder; } } else { minCoord = 0; diff --git a/layout/tables/FixedTableLayoutStrategy.cpp b/layout/tables/FixedTableLayoutStrategy.cpp index 8a929fc3356c2..e0dc4db7bd932 100644 --- a/layout/tables/FixedTableLayoutStrategy.cpp +++ b/layout/tables/FixedTableLayoutStrategy.cpp @@ -252,19 +252,9 @@ FixedTableLayoutStrategy::ComputeColumnISizes(const nsHTMLReflowState& aReflowSt float pct = styleWidth->GetPercentValue(); colWidth = NSToCoordFloor(pct * float(tableWidth)); - nscoord boxSizingAdjust = 0; - switch (cellFrame->StylePosition()->mBoxSizing) { - case NS_STYLE_BOX_SIZING_CONTENT: - boxSizingAdjust += offsets.hPadding; - // Fall through - case NS_STYLE_BOX_SIZING_PADDING: - boxSizingAdjust += offsets.hBorder; - // Fall through - case NS_STYLE_BOX_SIZING_BORDER: - // Don't add anything - break; + if (cellFrame->StylePosition()->mBoxSizing == NS_STYLE_BOX_SIZING_CONTENT) { + colWidth += offsets.hPadding + offsets.hBorder; } - colWidth += boxSizingAdjust; pct /= float(colSpan); colFrame->AddPrefPercent(pct); diff --git a/layout/tables/nsTableRowFrame.cpp b/layout/tables/nsTableRowFrame.cpp index 2f8dc8eabb5cf..60a480f2f6d7d 100644 --- a/layout/tables/nsTableRowFrame.cpp +++ b/layout/tables/nsTableRowFrame.cpp @@ -629,16 +629,8 @@ nsTableRowFrame::CalculateCellActualHeight(nsTableCellFrame* aCellFrame, // (since we can't specify one value of box-sizing for width and another // for height) if (PresContext()->CompatibilityMode() != eCompatibility_NavQuirks) { - switch (position->mBoxSizing) { - case NS_STYLE_BOX_SIZING_CONTENT: - outsideBoxSizing = aCellFrame->GetUsedBorderAndPadding().TopBottom(); - break; - case NS_STYLE_BOX_SIZING_PADDING: - outsideBoxSizing = aCellFrame->GetUsedBorder().TopBottom(); - break; - default: - // NS_STYLE_BOX_SIZING_BORDER - break; + if (position->mBoxSizing == NS_STYLE_BOX_SIZING_CONTENT) { + outsideBoxSizing = aCellFrame->GetUsedBorderAndPadding().TopBottom(); } } diff --git a/layout/xul/nsResizerFrame.cpp b/layout/xul/nsResizerFrame.cpp index ea353a7be0f03..c77c30139ea3c 100644 --- a/layout/xul/nsResizerFrame.cpp +++ b/layout/xul/nsResizerFrame.cpp @@ -80,13 +80,8 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext, // GetScreenRectInAppUnits returns the border box rectangle, so // adjust to get the desired content rectangle. nsRect rect = frameToResize->GetScreenRectInAppUnits(); - switch (frameToResize->StylePosition()->mBoxSizing) { - case NS_STYLE_BOX_SIZING_CONTENT: - rect.Deflate(frameToResize->GetUsedPadding()); - case NS_STYLE_BOX_SIZING_PADDING: - rect.Deflate(frameToResize->GetUsedBorder()); - default: - break; + if (frameToResize->StylePosition()->mBoxSizing == NS_STYLE_BOX_SIZING_CONTENT) { + rect.Deflate(frameToResize->GetUsedBorderAndPadding()); } mMouseDownRect = diff --git a/toolkit/themes/shared/in-content/info-pages.inc.css b/toolkit/themes/shared/in-content/info-pages.inc.css index 727b975c0795b..a4c7929493ef9 100644 --- a/toolkit/themes/shared/in-content/info-pages.inc.css +++ b/toolkit/themes/shared/in-content/info-pages.inc.css @@ -3,7 +3,7 @@ body { display: flex; flex-direction: column; - box-sizing: padding-box; + box-sizing: border-box; min-height: 100vh; padding-top: 0; padding-bottom: 0; From 34537c60ae2327abd08bc1b7695e1b401d78c747 Mon Sep 17 00:00:00 2001 From: Milan Sreckovic Date: Fri, 15 May 2015 13:43:38 -0400 Subject: [PATCH 038/151] Bug 1141783 - Correct user message for mismatched drivers. Don't mismatch if the DLLs are missing. r=jrmuizelaar --HG-- extra : rebase_source : 31475a7405a58dc211c1057c9e8c4b33abd3b70a extra : histedit_source : c8b0dd8cea9f1b36a48f6597bcf4bc90faf7517b --- .../chrome/global/aboutSupport.properties | 3 +++ toolkit/modules/Troubleshoot.jsm | 3 +++ widget/GfxInfoBase.cpp | 4 +++- widget/nsIGfxInfo.idl | 6 +++-- widget/windows/GfxInfo.cpp | 24 ++++++++++++------- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/toolkit/locales/en-US/chrome/global/aboutSupport.properties b/toolkit/locales/en-US/chrome/global/aboutSupport.properties index 546d4f05645eb..f07763dadaac6 100644 --- a/toolkit/locales/en-US/chrome/global/aboutSupport.properties +++ b/toolkit/locales/en-US/chrome/global/aboutSupport.properties @@ -59,6 +59,9 @@ blockedGfxCard = Blocked for your graphics card because of unresolved driver iss # LOCALIZATION NOTE The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers". blockedOSVersion = Blocked for your operating system version. +# LOCALIZATION NOTE The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers". +blockedMismatchedVersion = Blocked for your graphics driver version mismatch between registry and DLL. + direct2DEnabled = Direct2D Enabled directWriteEnabled = DirectWrite Enabled clearTypeParameters = ClearType Parameters diff --git a/toolkit/modules/Troubleshoot.jsm b/toolkit/modules/Troubleshoot.jsm index 27f1cfd1cd4ec..2b4294dfbc88e 100644 --- a/toolkit/modules/Troubleshoot.jsm +++ b/toolkit/modules/Troubleshoot.jsm @@ -284,6 +284,9 @@ let dataProviders = { ["tryNewerDriver", suggestedDriverVersion] : ["blockedDriver"]; break; + case Ci.nsIGfxInfo.FEATURE_BLOCKED_MISMATCHED_VERSION: + msg = ["blockedMismatchedVersion"]; + break; } return msg; } diff --git a/widget/GfxInfoBase.cpp b/widget/GfxInfoBase.cpp index 5dc42bb7170b4..6faa85b99796d 100644 --- a/widget/GfxInfoBase.cpp +++ b/widget/GfxInfoBase.cpp @@ -361,7 +361,8 @@ BlacklistFeatureStatusToGfxFeatureStatus(const nsAString& aStatus) else if (aStatus.EqualsLiteral("BLOCKED_OS_VERSION")) return nsIGfxInfo::FEATURE_BLOCKED_OS_VERSION; - // Do not allow it to set STATUS_UNKNOWN. + // Do not allow it to set STATUS_UNKNOWN. Also, we are not + // expecting the "mismatch" status showing up here. return nsIGfxInfo::FEATURE_STATUS_OK; } @@ -986,6 +987,7 @@ GfxInfoBase::EvaluateDownloadedBlacklist(nsTArray& aDriverInfo) } // FALLTHROUGH + case nsIGfxInfo::FEATURE_BLOCKED_MISMATCHED_VERSION: case nsIGfxInfo::FEATURE_BLOCKED_DEVICE: case nsIGfxInfo::FEATURE_DISCOURAGED: case nsIGfxInfo::FEATURE_BLOCKED_OS_VERSION: diff --git a/widget/nsIGfxInfo.idl b/widget/nsIGfxInfo.idl index ab26b370524bf..fde9e6b27ff52 100644 --- a/widget/nsIGfxInfo.idl +++ b/widget/nsIGfxInfo.idl @@ -8,7 +8,7 @@ /* NOTE: this interface is completely undesigned, not stable and likely to change */ -[scriptable, uuid(74fdaac3-e5ce-4944-becc-c08c168f673c)] +[scriptable, uuid(b0cd9d34-8dba-4b1d-8126-ca21826dbf35)] interface nsIGfxInfo : nsISupports { /* @@ -96,7 +96,7 @@ interface nsIGfxInfo : nsISupports * A set of return values from GetFeatureStatus */ - /* The driver is save to the best of our knowledge */ + /* The driver is safe to the best of our knowledge */ const long FEATURE_STATUS_OK = 1; /* We don't know the status of the feature yet. The analysis probably hasn't finished yet. */ const long FEATURE_STATUS_UNKNOWN = 2; @@ -110,6 +110,8 @@ interface nsIGfxInfo : nsISupports const long FEATURE_DISCOURAGED = 5; /* This feature is blocked on this OS version. */ const long FEATURE_BLOCKED_OS_VERSION = 6; + /* This feature is blocked because of mismatched driver versions. */ + const long FEATURE_BLOCKED_MISMATCHED_VERSION = 7; /** * Ask about a feature, and return the status of that feature diff --git a/widget/windows/GfxInfo.cpp b/widget/windows/GfxInfo.cpp index 954968a78b0f8..1558afa599f0b 100644 --- a/widget/windows/GfxInfo.cpp +++ b/widget/windows/GfxInfo.cpp @@ -15,6 +15,7 @@ #include "prprf.h" #include "GfxDriverInfo.h" #include "mozilla/Preferences.h" +#include "mozilla/gfx/Logging.h" #include "nsPrintfCString.h" #if defined(MOZ_CRASHREPORTER) @@ -523,18 +524,25 @@ GfxInfo::Init() driverNumericVersion = 0, knownSafeMismatchVersion = 0; ParseDriverVersion(dllVersion, &dllNumericVersion); ParseDriverVersion(dllVersion2, &dllNumericVersion2); + ParseDriverVersion(mDriverVersion, &driverNumericVersion); ParseDriverVersion(NS_LITERAL_STRING("9.17.10.0"), &knownSafeMismatchVersion); // If there's a driver version mismatch, consider this harmful only when // the driver version is less than knownSafeMismatchVersion. See the - // above comment about crashes with old mismatches. If the GetDllVersion - // call fails, then they return 0, so that will be considered a mismatch. - if (dllNumericVersion != driverNumericVersion && - dllNumericVersion2 != driverNumericVersion && - (driverNumericVersion < knownSafeMismatchVersion || - std::max(dllNumericVersion, dllNumericVersion2) < knownSafeMismatchVersion)) { - mHasDriverVersionMismatch = true; + // above comment about crashes with old mismatches. If the GetDllVersion + // call fails, we are not calling it a mismatch. + if ((dllNumericVersion != 0 && dllNumericVersion != driverNumericVersion) || + (dllNumericVersion2 != 0 && dllNumericVersion2 != driverNumericVersion)) { + if (driverNumericVersion < knownSafeMismatchVersion || + std::max(dllNumericVersion, dllNumericVersion2) < knownSafeMismatchVersion) { + mHasDriverVersionMismatch = true; + gfxWarningOnce() << "Mismatched driver versions between the registry " << mDriverVersion.get() << " and DLL(s) " << NS_ConvertUTF16toUTF8(dllVersion).get() << ", " << NS_ConvertUTF16toUTF8(dllVersion2).get() << " reported."; + } + } else if (dllNumericVersion == 0 && dllNumericVersion2 == 0) { + // Leave it as an asserting error for now, to see if we can find + // a system that exhibits this kind of a problem internally. + gfxCriticalErrorOnce() << "Potential driver version mismatch ignored due to missing DLLs"; } } @@ -1200,7 +1208,7 @@ GfxInfo::GetFeatureStatusImpl(int32_t aFeature, os = DRIVER_OS_WINDOWS_XP; if (mHasDriverVersionMismatch) { - *aStatus = nsIGfxInfo::FEATURE_BLOCKED_DRIVER_VERSION; + *aStatus = nsIGfxInfo::FEATURE_BLOCKED_MISMATCHED_VERSION; return NS_OK; } } From ea94c6332233b6f9803b24c390131f256443cb7e Mon Sep 17 00:00:00 2001 From: CJKu Date: Thu, 28 May 2015 02:30:00 -0400 Subject: [PATCH 039/151] Bug 1168015 - Dump source image from graphic buffer directly on B2G. r=kamidphish, r=hshih --HG-- extra : rebase_source : e511b3caa7c904e0e0bd274f8dcf0e54274f66e8 extra : histedit_source : 81d22bf1ccbbabfe4868f9e889e3ce82b7d86107 --- gfx/layers/Effects.h | 17 +- gfx/layers/LayerScope.cpp | 204 ++++++++++++++++++---- gfx/layers/composite/ContentHost.cpp | 6 +- gfx/layers/composite/ImageHost.cpp | 6 +- gfx/layers/composite/TiledContentHost.cpp | 7 +- 5 files changed, 199 insertions(+), 41 deletions(-) diff --git a/gfx/layers/Effects.h b/gfx/layers/Effects.h index d5cae98a29e49..04c7882a7f279 100644 --- a/gfx/layers/Effects.h +++ b/gfx/layers/Effects.h @@ -74,6 +74,7 @@ struct TexturedEffect : public Effect TextureSource* mTexture; bool mPremultiplied; gfx::Filter mFilter; + LayerRenderState mState; }; // Support an alpha mask. @@ -248,7 +249,8 @@ inline TemporaryRef CreateTexturedEffect(gfx::SurfaceFormat aFormat, TextureSource* aSource, const gfx::Filter& aFilter, - bool isAlphaPremultiplied) + bool isAlphaPremultiplied, + const LayerRenderState &state = LayerRenderState()) { MOZ_ASSERT(aSource); RefPtr result; @@ -268,6 +270,8 @@ CreateTexturedEffect(gfx::SurfaceFormat aFormat, break; } + result->mState = state; + return result.forget(); } @@ -281,7 +285,8 @@ inline TemporaryRef CreateTexturedEffect(TextureSource* aSource, TextureSource* aSourceOnWhite, const gfx::Filter& aFilter, - bool isAlphaPremultiplied) + bool isAlphaPremultiplied, + const LayerRenderState &state = LayerRenderState()) { MOZ_ASSERT(aSource); if (aSourceOnWhite) { @@ -294,7 +299,8 @@ CreateTexturedEffect(TextureSource* aSource, return CreateTexturedEffect(aSource->GetFormat(), aSource, aFilter, - isAlphaPremultiplied); + isAlphaPremultiplied, + state); } /** @@ -304,9 +310,10 @@ CreateTexturedEffect(TextureSource* aSource, */ inline TemporaryRef CreateTexturedEffect(TextureSource *aTexture, - const gfx::Filter& aFilter) + const gfx::Filter& aFilter, + const LayerRenderState &state = LayerRenderState()) { - return CreateTexturedEffect(aTexture, nullptr, aFilter, true); + return CreateTexturedEffect(aTexture, nullptr, aFilter, true, state); } diff --git a/gfx/layers/LayerScope.cpp b/gfx/layers/LayerScope.cpp index 40f2d8ead92ec..4df84cf7d3717 100644 --- a/gfx/layers/LayerScope.cpp +++ b/gfx/layers/LayerScope.cpp @@ -270,6 +270,87 @@ class DebugGLFrameStatusData final: public DebugGLData int64_t mFrameStamp; }; +#ifdef MOZ_WIDGET_GONK +// B2G optimization. +class DebugGLGraphicBuffer final: public DebugGLData { +public: + DebugGLGraphicBuffer(void *layerRef, + GLenum target, + GLuint name, + const LayerRenderState &aState) + : DebugGLData(Packet::TEXTURE), + mLayerRef(reinterpret_cast(layerRef)), + mTarget(target), + mName(name), + mState(aState) + { + } + + virtual bool Write() override { + return WriteToStream(mPacket); + } + + bool TryPack() { + android::sp buffer = mState.mSurface; + MOZ_ASSERT(buffer.get()); + + mPacket.set_type(mDataType); + TexturePacket* tp = mPacket.mutable_texture(); + tp->set_layerref(mLayerRef); + tp->set_name(mName); + tp->set_target(mTarget); + + int format = buffer->getPixelFormat(); + if (HAL_PIXEL_FORMAT_RGBA_8888 != format && + HAL_PIXEL_FORMAT_RGBX_8888 != format) { + return false; + } + + uint8_t* grallocData; + if (BAD_VALUE == buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | + GRALLOC_USAGE_SW_WRITE_NEVER, + reinterpret_cast(&grallocData))) { + return false; + } + + int32_t stride = buffer->getStride() * 4; + int32_t height = buffer->getHeight(); + int32_t width = buffer->getWidth(); + int32_t sourceSize = stride * height; + bool ret = false; + + if (sourceSize > 0) { + auto compressedData = MakeUnique(LZ4::maxCompressedSize(sourceSize)); + int compressedSize = LZ4::compress((char*)grallocData, + sourceSize, + compressedData.get()); + + if (compressedSize > 0) { + uint32_t format = mState.FormatRBSwapped() ? + LOCAL_GL_BGRA : LOCAL_GL_RGBA; + tp->set_dataformat(format); + tp->set_dataformat((1 << 16 | tp->dataformat())); + tp->set_width(width); + tp->set_height(height); + tp->set_stride(stride); + tp->set_data(compressedData.get(), compressedSize); + ret = true; + } + } + + buffer->unlock(); + return ret; + } + +private: + uint64_t mLayerRef; + GLenum mTarget; + GLuint mName; + const LayerRenderState &mState; + Packet mPacket; +}; +#endif + class DebugGLTextureData final: public DebugGLData { public: DebugGLTextureData(GLContext* cx, @@ -608,7 +689,6 @@ class SenderHelper static void ClearTextureIdList(); - static bool IsTextureIdContainsInList(GLuint aTextureId); // Sender private functions private: @@ -619,14 +699,23 @@ class SenderHelper static void SendTextureSource(GLContext* aGLContext, void* aLayerRef, TextureSourceOGL* aSource, + GLuint aTexID, bool aFlipY); +#ifdef MOZ_WIDGET_GONK + static bool SendGraphicBuffer(void* aLayerRef, + TextureSourceOGL* aSource, + GLuint aTexID, + const TexturedEffect* aEffect); +#endif static void SendTexturedEffect(GLContext* aGLContext, void* aLayerRef, const TexturedEffect* aEffect); static void SendYCbCrEffect(GLContext* aGLContext, void* aLayerRef, const EffectYCbCr* aEffect); - + static GLuint GetTextureID(GLContext* aGLContext, + TextureSourceOGL* aSource); + static bool IsTextureIdContainsInList(GLuint aTextureId); // Data fields private: static bool sLayersTreeSendable; @@ -714,10 +803,31 @@ SenderHelper::SendColor(void* aLayerRef, new DebugGLColorData(aLayerRef, aColor, aWidth, aHeight)); } +GLuint +SenderHelper::GetTextureID(GLContext* aGLContext, + TextureSourceOGL* aSource) { + GLenum textureTarget = aSource->GetTextureTarget(); + aSource->BindTexture(LOCAL_GL_TEXTURE0, gfx::Filter::LINEAR); + + GLuint texID = 0; + // This is horrid hack. It assumes that aGLContext matches the context + // aSource has bound to. + if (textureTarget == LOCAL_GL_TEXTURE_2D) { + aGLContext->GetUIntegerv(LOCAL_GL_TEXTURE_BINDING_2D, &texID); + } else if (textureTarget == LOCAL_GL_TEXTURE_EXTERNAL) { + aGLContext->GetUIntegerv(LOCAL_GL_TEXTURE_BINDING_EXTERNAL, &texID); + } else if (textureTarget == LOCAL_GL_TEXTURE_RECTANGLE) { + aGLContext->GetUIntegerv(LOCAL_GL_TEXTURE_BINDING_RECTANGLE, &texID); + } + + return texID; +} + void SenderHelper::SendTextureSource(GLContext* aGLContext, void* aLayerRef, TextureSourceOGL* aSource, + GLuint aTexID, bool aFlipY) { MOZ_ASSERT(aGLContext); @@ -730,34 +840,45 @@ SenderHelper::SendTextureSource(GLContext* aGLContext, aSource->GetFormat()); int shaderConfig = config.mFeatures; - aSource->BindTexture(LOCAL_GL_TEXTURE0, gfx::Filter::LINEAR); + gfx::IntSize size = aSource->GetSize(); - GLuint textureId = 0; - // This is horrid hack. It assumes that aGLContext matches the context - // aSource has bound to. - if (textureTarget == LOCAL_GL_TEXTURE_2D) { - aGLContext->GetUIntegerv(LOCAL_GL_TEXTURE_BINDING_2D, &textureId); - } else if (textureTarget == LOCAL_GL_TEXTURE_EXTERNAL) { - aGLContext->GetUIntegerv(LOCAL_GL_TEXTURE_BINDING_EXTERNAL, &textureId); - } else if (textureTarget == LOCAL_GL_TEXTURE_RECTANGLE) { - aGLContext->GetUIntegerv(LOCAL_GL_TEXTURE_BINDING_RECTANGLE, &textureId); + // By sending 0 to ReadTextureImage rely upon aSource->BindTexture binding + // texture correctly. texID is used for tracking in DebugGLTextureData. + RefPtr img = + aGLContext->ReadTexImageHelper()->ReadTexImage(0, textureTarget, + size, + shaderConfig, aFlipY); + WebSocketHelper::GetSocketManager()->AppendDebugData( + new DebugGLTextureData(aGLContext, aLayerRef, textureTarget, + aTexID, img)); + + sTextureIdList.push_back(aTexID); +} + +#ifdef MOZ_WIDGET_GONK +bool +SenderHelper::SendGraphicBuffer(void* aLayerRef, + TextureSourceOGL* aSource, + GLuint aTexID, + const TexturedEffect* aEffect) { + if (!aEffect->mState.mSurface.get()) { + return false; } - if (!IsTextureIdContainsInList(textureId)) { - gfx::IntSize size = aSource->GetSize(); + GLenum target = aSource->GetTextureTarget(); + mozilla::UniquePtr package = + MakeUnique(aLayerRef, target, aTexID, aEffect->mState); - // By sending 0 to ReadTextureImage rely upon aSource->BindTexture binding - // texture correctly. textureId is used for tracking in DebugGLTextureData. - RefPtr img = - aGLContext->ReadTexImageHelper()->ReadTexImage(0, textureTarget, - size, - shaderConfig, aFlipY); - sTextureIdList.push_back(textureId); - WebSocketHelper::GetSocketManager()->AppendDebugData( - new DebugGLTextureData(aGLContext, aLayerRef, textureTarget, - textureId, img)); + if (!package->TryPack()) { + return false; } + + // Transfer ownership to SocketManager. + WebSocketHelper::GetSocketManager()->AppendDebugData(package.release()); + sTextureIdList.push_back(aTexID); + return true; } +#endif void SenderHelper::SendTexturedEffect(GLContext* aGLContext, @@ -765,11 +886,22 @@ SenderHelper::SendTexturedEffect(GLContext* aGLContext, const TexturedEffect* aEffect) { TextureSourceOGL* source = aEffect->mTexture->AsSourceOGL(); - if (!source) + if (!source) { return; + } - bool flipY = false; - SendTextureSource(aGLContext, aLayerRef, source, flipY); + GLuint texID = GetTextureID(aGLContext, source); + if (IsTextureIdContainsInList(texID)) { + return; + } + +#ifdef MOZ_WIDGET_GONK + if (SendGraphicBuffer(aLayerRef, source, texID, aEffect)) { + return; + } +#endif + // Render to texture and read pixels back. + SendTextureSource(aGLContext, aLayerRef, source, texID, false); } void @@ -786,10 +918,20 @@ SenderHelper::SendYCbCrEffect(GLContext* aGLContext, TextureSourceOGL* sourceCb = sourceYCbCr->GetSubSource(Cb)->AsSourceOGL(); TextureSourceOGL* sourceCr = sourceYCbCr->GetSubSource(Cr)->AsSourceOGL(); - bool flipY = false; - SendTextureSource(aGLContext, aLayerRef, sourceY, flipY); - SendTextureSource(aGLContext, aLayerRef, sourceCb, flipY); - SendTextureSource(aGLContext, aLayerRef, sourceCr, flipY); + GLuint texID = GetTextureID(aGLContext, sourceY); + if (!IsTextureIdContainsInList(texID)) { + SendTextureSource(aGLContext, aLayerRef, sourceY, texID, false); + } + + texID = GetTextureID(aGLContext, sourceCb); + if (!IsTextureIdContainsInList(texID)) { + SendTextureSource(aGLContext, aLayerRef, sourceCb, texID, false); + } + + texID = GetTextureID(aGLContext, sourceCr); + if (!IsTextureIdContainsInList(texID)) { + SendTextureSource(aGLContext, aLayerRef, sourceCr, texID, false); + } } void diff --git a/gfx/layers/composite/ContentHost.cpp b/gfx/layers/composite/ContentHost.cpp index 9fe1cf60c3ee6..b27214753f0fc 100644 --- a/gfx/layers/composite/ContentHost.cpp +++ b/gfx/layers/composite/ContentHost.cpp @@ -63,7 +63,8 @@ ContentHostTexture::Composite(EffectChain& aEffectChain, RefPtr effect = CreateTexturedEffect(mTextureSource.get(), mTextureSourceOnWhite.get(), - aFilter, true); + aFilter, true, + GetRenderState()); if (!effect) { return; } @@ -460,7 +461,8 @@ ContentHostTexture::GenEffect(const gfx::Filter& aFilter) } return CreateTexturedEffect(mTextureSource.get(), mTextureSourceOnWhite.get(), - aFilter, true); + aFilter, true, + GetRenderState()); } TemporaryRef diff --git a/gfx/layers/composite/ImageHost.cpp b/gfx/layers/composite/ImageHost.cpp index 5142122e46480..9c0ebe34d692a 100644 --- a/gfx/layers/composite/ImageHost.cpp +++ b/gfx/layers/composite/ImageHost.cpp @@ -106,7 +106,8 @@ ImageHost::Composite(EffectChain& aEffectChain, RefPtr effect = CreateTexturedEffect(mFrontBuffer->GetFormat(), mTextureSource.get(), aFilter, - isAlphaPremultiplied); + isAlphaPremultiplied, + GetRenderState()); if (!effect) { return; } @@ -298,7 +299,8 @@ ImageHost::GenEffect(const gfx::Filter& aFilter) return CreateTexturedEffect(mFrontBuffer->GetFormat(), mTextureSource, aFilter, - isAlphaPremultiplied); + isAlphaPremultiplied, + GetRenderState()); } #ifdef MOZ_WIDGET_GONK diff --git a/gfx/layers/composite/TiledContentHost.cpp b/gfx/layers/composite/TiledContentHost.cpp index bf28b7d029e1c..5dfdc47a1ecfb 100644 --- a/gfx/layers/composite/TiledContentHost.cpp +++ b/gfx/layers/composite/TiledContentHost.cpp @@ -468,7 +468,12 @@ TiledContentHost::RenderTile(TileHost& aTile, return; } - RefPtr effect = CreateTexturedEffect(aTile.mTextureSource, aTile.mTextureSourceOnWhite, aFilter, true); + RefPtr effect = + CreateTexturedEffect(aTile.mTextureSource, + aTile.mTextureSourceOnWhite, + aFilter, + true, + aTile.mTextureHost->GetRenderState()); if (!effect) { return; } From a3f2147e6dd2cfd242c5565c72bcca6eb7a9aa55 Mon Sep 17 00:00:00 2001 From: Sotaro Ikeda Date: Thu, 28 May 2015 07:23:57 -0700 Subject: [PATCH 040/151] Bug 1168531 - Fix MediaCodecReader video playback problem r=bwu --- dom/media/omx/MediaCodecProxy.cpp | 14 ++++++ dom/media/omx/MediaCodecProxy.h | 4 ++ dom/media/omx/MediaCodecReader.cpp | 78 ++++++++++++++++++++++++++---- dom/media/omx/MediaCodecReader.h | 30 ++++++++++++ 4 files changed, 116 insertions(+), 10 deletions(-) diff --git a/dom/media/omx/MediaCodecProxy.cpp b/dom/media/omx/MediaCodecProxy.cpp index 1e357265fc345..8ac3bb65d2110 100644 --- a/dom/media/omx/MediaCodecProxy.cpp +++ b/dom/media/omx/MediaCodecProxy.cpp @@ -138,6 +138,20 @@ MediaCodecProxy::AskMediaCodecAndWait() return true; } +bool +MediaCodecProxy::AsyncAskMediaCodec() +{ + if ((strncasecmp(mCodecMime.get(), "video/", 6) != 0) || + (mResourceHandler == nullptr)) { + return false; + } + // request video codec + mResourceHandler->requestResource(mCodecEncoder + ? IMediaResourceManagerService::HW_VIDEO_ENCODER + : IMediaResourceManagerService::HW_VIDEO_DECODER); + return true; +} + void MediaCodecProxy::SetMediaCodecFree() { diff --git a/dom/media/omx/MediaCodecProxy.h b/dom/media/omx/MediaCodecProxy.h index 93ab40fb39084..a17190fd2ceb0 100644 --- a/dom/media/omx/MediaCodecProxy.h +++ b/dom/media/omx/MediaCodecProxy.h @@ -139,6 +139,10 @@ class MediaCodecProxy : public MediaResourceHandler::ResourceListener // allocated. bool AskMediaCodecAndWait(); + // It asks for the OMX codec asynchronously. + // Only video codec is supported. + bool AsyncAskMediaCodec(); + // Free the OMX codec so others can allocate it. void SetMediaCodecFree(); diff --git a/dom/media/omx/MediaCodecReader.cpp b/dom/media/omx/MediaCodecReader.cpp index 9fd8048bad2b9..c3197db47793a 100644 --- a/dom/media/omx/MediaCodecReader.cpp +++ b/dom/media/omx/MediaCodecReader.cpp @@ -67,6 +67,33 @@ IsValidTimestampUs(int64_t aTimestamp) return aTimestamp >= INT64_C(0); } +MediaCodecReader::VideoResourceListener::VideoResourceListener( + MediaCodecReader* aReader) + : mReader(aReader) +{ +} + +MediaCodecReader::VideoResourceListener::~VideoResourceListener() +{ + mReader = nullptr; +} + +void +MediaCodecReader::VideoResourceListener::codecReserved() +{ + if (mReader) { + mReader->VideoCodecReserved(); + } +} + +void +MediaCodecReader::VideoResourceListener::codecCanceled() +{ + if (mReader) { + mReader->VideoCodecCanceled(); + } +} + MediaCodecReader::TrackInputCopier::~TrackInputCopier() { } @@ -249,6 +276,7 @@ MediaCodecReader::MediaCodecReader(AbstractMediaDecoder* aDecoder) , mNextParserPosition(INT64_C(0)) , mParsedDataLength(INT64_C(0)) { + mVideoListener = new VideoResourceListener(this); } MediaCodecReader::~MediaCodecReader() @@ -648,6 +676,14 @@ MediaCodecReader::ReadMetadata(MediaInfo* aInfo, return NS_OK; } + // Configure video codec after the codecReserved. + if (mVideoTrack.mSource != nullptr) { + if (!ConfigureMediaCodec(mVideoTrack)) { + DestroyMediaCodec(mVideoTrack); + return NS_ERROR_FAILURE; + } + } + // TODO: start streaming if (!UpdateDuration()) { @@ -1259,8 +1295,8 @@ MediaCodecReader::CreateTaskQueues() bool MediaCodecReader::CreateMediaCodecs() { - if (CreateMediaCodec(mLooper, mAudioTrack, nullptr) && - CreateMediaCodec(mLooper, mVideoTrack, nullptr)) { + if (CreateMediaCodec(mLooper, mAudioTrack, false, nullptr) && + CreateMediaCodec(mLooper, mVideoTrack, true, mVideoListener)) { return true; } @@ -1270,6 +1306,7 @@ MediaCodecReader::CreateMediaCodecs() bool MediaCodecReader::CreateMediaCodec(sp& aLooper, Track& aTrack, + bool aAsync, wp aListener) { if (aTrack.mSource != nullptr && aTrack.mCodec == nullptr) { @@ -1284,10 +1321,6 @@ MediaCodecReader::CreateMediaCodec(sp& aLooper, NS_WARNING("Couldn't create MediaCodecProxy"); return false; } - if (!aTrack.mCodec->AskMediaCodecAndWait()) { - NS_WARNING("AskMediaCodecAndWait fail"); - return false; - } if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) { aTrack.mInputCopier = new VorbisInputCopier; @@ -1310,8 +1343,16 @@ MediaCodecReader::CreateMediaCodec(sp& aLooper, #endif } - if (!aTrack.mCodec->allocated() || !ConfigureMediaCodec(aTrack)) { - NS_WARNING("Couldn't create and configure MediaCodec synchronously"); + if (!aAsync && aTrack.mCodec->AskMediaCodecAndWait()) { + // Pending configure() and start() to codecReserved() if the creation + // should be asynchronous. + if (!aTrack.mCodec->allocated() || !ConfigureMediaCodec(aTrack)){ + NS_WARNING("Couldn't create and configure MediaCodec synchronously"); + DestroyMediaCodec(aTrack); + return false; + } + } else if (aAsync && !aTrack.mCodec->AsyncAskMediaCodec()) { + NS_WARNING("Couldn't request MediaCodec asynchronously"); DestroyMediaCodec(aTrack); return false; } @@ -1843,8 +1884,7 @@ MediaCodecReader::EnsureCodecFormatParsed(Track& aTrack) NS_WARNING("Couldn't get output buffers from MediaCodec"); return false; } - } else if (status != -EAGAIN && status != INVALID_OPERATION) { - // FIXME: let INVALID_OPERATION pass? + } else if (status != -EAGAIN) { return false; // something wrong!!! } FillCodecInputData(aTrack); @@ -1875,4 +1915,22 @@ MediaCodecReader::ClearColorConverterBuffer() mColorConverterBufferSize = 0; } +// Called on Binder thread. +void +MediaCodecReader::VideoCodecReserved() +{ + mDecoder->NotifyWaitingForResourcesStatusChanged(); +} + +// Called on Binder thread. +void +MediaCodecReader::VideoCodecCanceled() +{ + if (mVideoTrack.mTaskQueue) { + RefPtr task = + NS_NewRunnableMethod(this, &MediaCodecReader::ReleaseCriticalResources); + mVideoTrack.mTaskQueue->Dispatch(task.forget()); + } +} + } // namespace mozilla diff --git a/dom/media/omx/MediaCodecReader.h b/dom/media/omx/MediaCodecReader.h index 5d4a86de21017..8e4b99822168c 100644 --- a/dom/media/omx/MediaCodecReader.h +++ b/dom/media/omx/MediaCodecReader.h @@ -177,6 +177,11 @@ class MediaCodecReader : public MediaOmxCommonReader // Called on MediaCodecReader::mLooper thread. void onMessageReceived(const android::sp& aMessage); + // Receive a notify from ResourceListener. + // Called on Binder thread. + virtual void VideoCodecReserved(); + virtual void VideoCodecCanceled(); + virtual bool CreateExtractor(); // Check the underlying HW resource is available and store the result in @@ -189,6 +194,28 @@ class MediaCodecReader : public MediaOmxCommonReader bool mIsWaitingResources; private: + + // An intermediary class that can be managed by android::sp. + // Redirect codecReserved() and codecCanceled() to MediaCodecReader. + class VideoResourceListener : public android::MediaCodecProxy::CodecResourceListener + { + public: + VideoResourceListener(MediaCodecReader* aReader); + ~VideoResourceListener(); + + virtual void codecReserved(); + virtual void codecCanceled(); + + private: + // Forbidden + VideoResourceListener() = delete; + VideoResourceListener(const VideoResourceListener& rhs) = delete; + const VideoResourceListener& operator=(const VideoResourceListener& rhs) = delete; + + MediaCodecReader* mReader; + }; + friend class VideoResourceListener; + class VorbisInputCopier : public TrackInputCopier { virtual bool Copy(android::MediaBuffer* aSourceBuffer, @@ -327,6 +354,7 @@ class MediaCodecReader : public MediaOmxCommonReader bool CreateMediaCodecs(); static bool CreateMediaCodec(android::sp& aLooper, Track& aTrack, + bool aAsync, android::wp aListener); static bool ConfigureMediaCodec(Track& aTrack); void DestroyMediaCodecs(); @@ -387,6 +415,8 @@ class MediaCodecReader : public MediaOmxCommonReader void ReleaseAllTextureClients(); + android::sp mVideoListener; + android::sp mLooper; android::sp mMetaData; From 6a49c0ff961e3ce258b07fa87adec2dfef080c54 Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Thu, 28 May 2015 16:29:16 +0200 Subject: [PATCH 041/151] Bug 1168864 - Use mayResolve hook for addprop stubs. r=bhackett --- js/src/jit/BaselineIC.cpp | 22 ++++++++++++++-------- js/src/jit/IonCaches.cpp | 16 ++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/js/src/jit/BaselineIC.cpp b/js/src/jit/BaselineIC.cpp index 8913aef58add7..a8d490e549cfb 100644 --- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -3367,9 +3367,11 @@ CheckHasNoSuchProperty(JSContext* cx, HandleObject obj, HandlePropertyName name, while (curObj) { if (curObj->isNative()) { // Don't handle proto chains with resolve hooks. - if (curObj->getClass()->resolve) + if (ClassMayResolveId(cx->names(), curObj->getClass(), NameToId(name), curObj) || + curObj->getClass()->addProperty) + { return false; - + } if (curObj->as().contains(cx, NameToId(name))) return false; } else if (curObj != obj) { @@ -3541,9 +3543,12 @@ IsCacheableSetPropAddSlot(JSContext* cx, JSObject* obj, Shape* oldShape, return false; } - // If object has a resolve hook, don't inline - if (obj->getClass()->resolve) + // Watch out for resolve or addProperty hooks. + if (ClassMayResolveId(cx->names(), obj->getClass(), id, obj) || + obj->getClass()->addProperty) + { return false; + } size_t chainDepth = 0; // Walk up the object prototype chain and ensure that all prototypes are @@ -3559,10 +3564,11 @@ IsCacheableSetPropAddSlot(JSContext* cx, JSObject* obj, Shape* oldShape, if (protoShape && !protoShape->hasDefaultSetter()) return false; - // Otherise, if there's no such property, watch out for a resolve hook that would need - // to be invoked and thus prevent inlining of property addition. - if (proto->getClass()->resolve) - return false; + // Otherwise, if there's no such property, watch out for a resolve hook + // that would need to be invoked and thus prevent inlining of property + // addition. + if (ClassMayResolveId(cx->names(), proto->getClass(), id, proto)) + return false; } // Only add a IC entry if the dynamic slots didn't change when the shapes diff --git a/js/src/jit/IonCaches.cpp b/js/src/jit/IonCaches.cpp index 17ce273ecdf28..4b007a3b0cc95 100644 --- a/js/src/jit/IonCaches.cpp +++ b/js/src/jit/IonCaches.cpp @@ -2948,7 +2948,7 @@ IsPropertySetInlineable(NativeObject* obj, HandleId id, MutableHandleShape pshap } static bool -PrototypeChainShadowsPropertyAdd(JSObject* obj, jsid id) +PrototypeChainShadowsPropertyAdd(JSContext* cx, JSObject* obj, jsid id) { // Walk up the object prototype chain and ensure that all prototypes // are native, and that all prototypes have no getter or setter @@ -2966,7 +2966,7 @@ PrototypeChainShadowsPropertyAdd(JSObject* obj, jsid id) // Otherwise, if there's no such property, watch out for a resolve // hook that would need to be invoked and thus prevent inlining of // property addition. - if (proto->getClass()->resolve) + if (ClassMayResolveId(cx->names(), proto->getClass(), id, proto)) return true; } @@ -2974,7 +2974,7 @@ PrototypeChainShadowsPropertyAdd(JSObject* obj, jsid id) } static bool -IsPropertyAddInlineable(NativeObject* obj, HandleId id, ConstantOrRegister val, +IsPropertyAddInlineable(JSContext* cx, NativeObject* obj, HandleId id, ConstantOrRegister val, HandleShape oldShape, bool needsTypeBarrier, bool* checkTypeset) { // If the shape of the object did not change, then this was not an add. @@ -2989,8 +2989,8 @@ IsPropertyAddInlineable(NativeObject* obj, HandleId id, ConstantOrRegister val, // the shape must be the one we just added. MOZ_ASSERT(shape == obj->lastProperty()); - // If object has a resolve hook, don't inline - if (obj->getClass()->resolve) + // Watch out for resolve hooks. + if (ClassMayResolveId(cx->names(), obj->getClass(), id, obj)) return false; // Likewise for an addProperty hook, since we'll need to invoke it. @@ -3000,7 +3000,7 @@ IsPropertyAddInlineable(NativeObject* obj, HandleId id, ConstantOrRegister val, if (!obj->nonProxyIsExtensible() || !shape->writable()) return false; - if (PrototypeChainShadowsPropertyAdd(obj, id)) + if (PrototypeChainShadowsPropertyAdd(cx, obj, id)) return false; // Don't attach if we are adding a property to an object which the new @@ -3174,7 +3174,7 @@ CanAttachAddUnboxedExpando(JSContext* cx, HandleObject obj, HandleShape oldShape MOZ_ASSERT(newShape->hasDefaultSetter() && newShape->hasSlot() && newShape->writable()); - if (PrototypeChainShadowsPropertyAdd(obj, id)) + if (PrototypeChainShadowsPropertyAdd(cx, obj, id)) return false; if (needsTypeBarrier && !CanInlineSetPropTypeCheck(obj, id, val, checkTypeset)) @@ -3292,7 +3292,7 @@ SetPropertyIC::update(JSContext* cx, HandleScript outerScript, size_t cacheIndex // The property did not exist before, now we can try to inline the property add. bool checkTypeset; if (!addedSetterStub && canCache == MaybeCanAttachAddSlot && - IsPropertyAddInlineable(&obj->as(), id, cache.value(), oldShape, + IsPropertyAddInlineable(cx, &obj->as(), id, cache.value(), oldShape, cache.needsTypeBarrier(), &checkTypeset)) { if (!cache.attachAddSlot(cx, outerScript, ion, obj, oldShape, oldGroup, checkTypeset)) From 1f67f5535346699b34ae1f538d72bb92d99772ea Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:42 -0700 Subject: [PATCH 042/151] Bug 1149397 - JS::ubi::Node::edges should return a mozilla::UniquePtr; r=jimb --- js/public/UbiNode.h | 33 +++++++++++++++++++++------------ js/public/UbiNodeTraverse.h | 2 +- js/src/vm/UbiNode.cpp | 24 ++++++++++++++---------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/js/public/UbiNode.h b/js/public/UbiNode.h index 93f4565939409..b92af4e82c397 100644 --- a/js/public/UbiNode.h +++ b/js/public/UbiNode.h @@ -93,7 +93,7 @@ // represented by a "rope", a structure that points to the two original // strings. // - +// // We intend to use ubi::Node to write tools that report memory usage, so it's // important that ubi::Node accurately portray how much memory nodes consume. // Thus, for example, when data that apparently belongs to multiple nodes is @@ -142,12 +142,23 @@ namespace JS { namespace ubi { -using mozilla::Maybe; -using mozilla::UniquePtr; - class Edge; class EdgeRange; +} +} + +namespace mozilla { +template<> +class DefaultDelete : public JS::DeletePolicy { }; +} + +namespace JS { +namespace ubi { + +using mozilla::Maybe; +using mozilla::UniquePtr; + // The base class implemented by each ubi::Node referent type. Subclasses must // not add data members to this class. class Base { @@ -190,13 +201,11 @@ class Base { virtual size_t size(mozilla::MallocSizeOf mallocSizeof) const { return 0; } // Return an EdgeRange that initially contains all the referent's outgoing - // edges. The EdgeRange should be freed with 'js_delete'. (You could use - // ScopedDJSeletePtr to manage it.) On OOM, report an exception - // on |cx| and return nullptr. + // edges. The caller takes ownership of the EdgeRange. // // If wantNames is true, compute names for edges. Doing so can be expensive // in time and memory. - virtual EdgeRange* edges(JSContext* cx, bool wantNames) const = 0; + virtual UniquePtr edges(JSContext* cx, bool wantNames) const = 0; // Return the Zone to which this node's referent belongs, or nullptr if the // referent is not of a type allocated in SpiderMonkey Zones. @@ -363,7 +372,7 @@ class Node { return base()->size(mallocSizeof); } - EdgeRange* edges(JSContext* cx, bool wantNames = true) const { + UniquePtr edges(JSContext* cx, bool wantNames = true) const { return base()->edges(cx, wantNames); } @@ -543,7 +552,7 @@ class MOZ_STACK_CLASS RootList { template<> struct Concrete : public Base { - EdgeRange* edges(JSContext* cx, bool wantNames) const override; + UniquePtr edges(JSContext* cx, bool wantNames) const override; const char16_t* typeName() const override { return concreteTypeName; } protected: @@ -560,7 +569,7 @@ struct Concrete : public Base { template class TracerConcrete : public Base { const char16_t* typeName() const override { return concreteTypeName; } - EdgeRange* edges(JSContext*, bool wantNames) const override; + UniquePtr edges(JSContext*, bool wantNames) const override; JS::Zone* zone() const override; protected: @@ -625,7 +634,7 @@ template<> class Concrete : public Base { const char16_t* typeName() const override; size_t size(mozilla::MallocSizeOf mallocSizeOf) const override; - EdgeRange* edges(JSContext* cx, bool wantNames) const override; + UniquePtr edges(JSContext* cx, bool wantNames) const override; JS::Zone* zone() const override; JSCompartment* compartment() const override; diff --git a/js/public/UbiNodeTraverse.h b/js/public/UbiNodeTraverse.h index 363a7f6b0b89a..159de27e7d5c2 100644 --- a/js/public/UbiNodeTraverse.h +++ b/js/public/UbiNodeTraverse.h @@ -126,7 +126,7 @@ struct BreadthFirst { pending.popFront(); // Get a range containing all origin's outgoing edges. - js::ScopedJSDeletePtr range(origin.edges(cx, wantNames)); + auto range = origin.edges(cx, wantNames); if (!range) return false; diff --git a/js/src/vm/UbiNode.cpp b/js/src/vm/UbiNode.cpp index b6a5facdcc3d1..78476eee1e9ce 100644 --- a/js/src/vm/UbiNode.cpp +++ b/js/src/vm/UbiNode.cpp @@ -10,7 +10,6 @@ #include "mozilla/Attributes.h" #include "mozilla/Range.h" #include "mozilla/Scoped.h" -#include "mozilla/UniquePtr.h" #include "jscntxt.h" #include "jsobj.h" @@ -48,10 +47,14 @@ using JS::ubi::TracerConcreteWithCompartment; // All operations on null ubi::Nodes crash. const char16_t* Concrete::typeName() const { MOZ_CRASH("null ubi::Node"); } -EdgeRange* Concrete::edges(JSContext*, bool) const { MOZ_CRASH("null ubi::Node"); } JS::Zone* Concrete::zone() const { MOZ_CRASH("null ubi::Node"); } JSCompartment* Concrete::compartment() const { MOZ_CRASH("null ubi::Node"); } +UniquePtr +Concrete::edges(JSContext*, bool) const { + MOZ_CRASH("null ubi::Node"); +} + size_t Concrete::size(mozilla::MallocSizeOf mallocSizeof) const { @@ -191,16 +194,17 @@ TracerConcrete::zone() const } template -EdgeRange* +UniquePtr TracerConcrete::edges(JSContext* cx, bool wantNames) const { - js::ScopedJSDeletePtr r(js_new(cx)); - if (!r) + UniquePtr> range( + cx->new_(cx)); + if (!range) return nullptr; - if (!r->init(cx, ptr, ::js::gc::MapTypeToTraceKind::kind, wantNames)) + if (!range->init(cx, ptr, ::js::gc::MapTypeToTraceKind::kind, wantNames)) return nullptr; - return r.forget(); + return UniquePtr(range.release()); } template @@ -357,7 +361,7 @@ RootList::addRoot(Node node, const char16_t* edgeName) MOZ_ASSERT(noGC.isSome()); MOZ_ASSERT_IF(wantNames, edgeName); - mozilla::UniquePtr name; + UniquePtr name; if (edgeName) { name = DuplicateString(cx, edgeName); if (!name) @@ -389,10 +393,10 @@ class PreComputedEdgeRange : public EdgeRange { const char16_t Concrete::concreteTypeName[] = MOZ_UTF16("RootList"); -EdgeRange* +UniquePtr Concrete::edges(JSContext* cx, bool wantNames) const { MOZ_ASSERT_IF(wantNames, get().wantNames); - return js_new(cx, get().edges); + return UniquePtr(cx->new_(cx, get().edges)); } } // namespace ubi From 3a7487a7d05e7eb02206a9db85a1dc3a944fb334 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:42 -0700 Subject: [PATCH 043/151] Bug 1024774 - Part 0: Upgrade the protobuf library. r=mmc,glandium --HG-- rename : toolkit/components/protobuf/google/protobuf/extension_set.cc => toolkit/components/protobuf/src/google/protobuf/extension_set.cc rename : toolkit/components/protobuf/google/protobuf/extension_set.h => toolkit/components/protobuf/src/google/protobuf/extension_set.h rename : toolkit/components/protobuf/google/protobuf/generated_message_util.cc => toolkit/components/protobuf/src/google/protobuf/generated_message_util.cc rename : toolkit/components/protobuf/google/protobuf/generated_message_util.h => toolkit/components/protobuf/src/google/protobuf/generated_message_util.h rename : toolkit/components/protobuf/google/protobuf/io/coded_stream.cc => toolkit/components/protobuf/src/google/protobuf/io/coded_stream.cc rename : toolkit/components/protobuf/google/protobuf/io/coded_stream.h => toolkit/components/protobuf/src/google/protobuf/io/coded_stream.h rename : toolkit/components/protobuf/google/protobuf/io/coded_stream_inl.h => toolkit/components/protobuf/src/google/protobuf/io/coded_stream_inl.h rename : toolkit/components/protobuf/google/protobuf/io/package_info.h => toolkit/components/protobuf/src/google/protobuf/io/package_info.h rename : toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.cc => toolkit/components/protobuf/src/google/protobuf/io/strtod.h rename : toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.cc => toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream.cc rename : toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.h => toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream.h rename : toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl.h => toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h rename : toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.cc => toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc rename : toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.h => toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h rename : toolkit/components/protobuf/google/protobuf/message_lite.cc => toolkit/components/protobuf/src/google/protobuf/message_lite.cc rename : toolkit/components/protobuf/google/protobuf/message_lite.h => toolkit/components/protobuf/src/google/protobuf/message_lite.h rename : toolkit/components/protobuf/google/protobuf/package_info.h => toolkit/components/protobuf/src/google/protobuf/package_info.h rename : toolkit/components/protobuf/google/protobuf/generated_message_util.h => toolkit/components/protobuf/src/google/protobuf/reflection_ops.h rename : toolkit/components/protobuf/google/protobuf/repeated_field.cc => toolkit/components/protobuf/src/google/protobuf/repeated_field.cc rename : toolkit/components/protobuf/google/protobuf/repeated_field.h => toolkit/components/protobuf/src/google/protobuf/repeated_field.h rename : toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.cc => toolkit/components/protobuf/src/google/protobuf/service.cc rename : toolkit/components/protobuf/google/protobuf/generated_message_util.cc => toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h rename : toolkit/components/protobuf/google/protobuf/stubs/common.cc => toolkit/components/protobuf/src/google/protobuf/stubs/common.cc rename : toolkit/components/protobuf/google/protobuf/stubs/common.h => toolkit/components/protobuf/src/google/protobuf/stubs/common.h rename : toolkit/components/protobuf/google/protobuf/stubs/hash.h => toolkit/components/protobuf/src/google/protobuf/stubs/hash.h rename : toolkit/components/protobuf/google/protobuf/stubs/once.cc => toolkit/components/protobuf/src/google/protobuf/stubs/once.cc rename : toolkit/components/protobuf/google/protobuf/stubs/once.h => toolkit/components/protobuf/src/google/protobuf/stubs/once.h rename : toolkit/components/protobuf/google/protobuf/stubs/stl_util-inl.h => toolkit/components/protobuf/src/google/protobuf/stubs/stl_util.h rename : toolkit/components/protobuf/google/protobuf/generated_message_util.h => toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.h rename : toolkit/components/protobuf/google/protobuf/wire_format_lite.cc => toolkit/components/protobuf/src/google/protobuf/wire_format_lite.cc rename : toolkit/components/protobuf/google/protobuf/wire_format_lite.h => toolkit/components/protobuf/src/google/protobuf/wire_format_lite.h rename : toolkit/components/protobuf/google/protobuf/wire_format_lite_inl.h => toolkit/components/protobuf/src/google/protobuf/wire_format_lite_inl.h --- configure.in | 1 + gfx/layers/protobuf/LayerScopePacket.pb.cc | 2000 ++- gfx/layers/protobuf/LayerScopePacket.pb.h | 1501 +- toolkit/components/downloads/csd.pb.cc | 12344 ++++++++++++-- toolkit/components/downloads/csd.pb.h | 13520 +++++++++++++--- toolkit/components/downloads/csd.proto | 487 + toolkit/components/downloads/generate_csd.sh | 21 +- toolkit/components/downloads/moz.build | 1 + toolkit/components/protobuf/README.txt | 30 +- .../protobuf/google/protobuf/stubs/map-util.h | 119 - toolkit/components/protobuf/m-c-changes.patch | 365 + toolkit/components/protobuf/moz.build | 129 +- toolkit/components/protobuf/r512.patch | 13 - .../src/google/protobuf/descriptor.cc | 5420 +++++++ .../protobuf/src/google/protobuf/descriptor.h | 1691 ++ .../src/google/protobuf/descriptor.pb.cc | 9135 +++++++++++ .../src/google/protobuf/descriptor.pb.h | 6761 ++++++++ .../src/google/protobuf/descriptor.proto | 687 + .../google/protobuf/descriptor_database.cc | 543 + .../src/google/protobuf/descriptor_database.h | 369 + .../src/google/protobuf/dynamic_message.cc | 764 + .../src/google/protobuf/dynamic_message.h | 148 + .../google/protobuf/extension_set.cc | 637 +- .../{ => src}/google/protobuf/extension_set.h | 484 +- .../google/protobuf/extension_set_heavy.cc | 734 + .../protobuf/generated_enum_reflection.h | 91 + .../protobuf/generated_message_reflection.cc | 1683 ++ .../protobuf/generated_message_reflection.h | 504 + .../google/protobuf/generated_message_util.cc | 14 +- .../google/protobuf/generated_message_util.h | 113 + .../google/protobuf/io/coded_stream.cc | 153 +- .../google/protobuf/io/coded_stream.h | 156 +- .../google/protobuf/io/coded_stream_inl.h | 13 +- .../src/google/protobuf/io/gzip_stream.cc | 325 + .../src/google/protobuf/io/gzip_stream.h | 209 + .../google/protobuf/io/package_info.h | 2 +- .../src/google/protobuf/io/printer.cc | 198 + .../protobuf/src/google/protobuf/io/printer.h | 136 + .../protobuf/src/google/protobuf/io/strtod.cc | 113 + .../protobuf/src/google/protobuf/io/strtod.h | 50 + .../src/google/protobuf/io/tokenizer.cc | 1127 ++ .../src/google/protobuf/io/tokenizer.h | 402 + .../google/protobuf/io/zero_copy_stream.cc | 11 +- .../google/protobuf/io/zero_copy_stream.h | 12 +- .../protobuf/io/zero_copy_stream_impl.cc | 473 + .../protobuf/io/zero_copy_stream_impl.h | 3 +- .../protobuf/io/zero_copy_stream_impl_lite.cc | 24 +- .../protobuf/io/zero_copy_stream_impl_lite.h | 16 +- .../protobuf/src/google/protobuf/message.cc | 358 + .../protobuf/src/google/protobuf/message.h | 866 + .../{ => src}/google/protobuf/message_lite.cc | 7 +- .../{ => src}/google/protobuf/message_lite.h | 14 +- .../{ => src}/google/protobuf/package_info.h | 2 +- .../src/google/protobuf/reflection_ops.cc | 269 + .../src/google/protobuf/reflection_ops.h | 81 + .../google/protobuf/repeated_field.cc | 23 +- .../google/protobuf/repeated_field.h | 474 +- .../google/protobuf/service.cc} | 46 +- .../protobuf/src/google/protobuf/service.h | 291 + .../src/google/protobuf/stubs/atomicops.h | 227 + .../stubs/atomicops_internals_arm64_gcc.h | 325 + .../stubs/atomicops_internals_arm_gcc.h | 151 + .../stubs/atomicops_internals_arm_qnx.h | 146 + .../atomicops_internals_atomicword_compat.h | 122 + .../stubs/atomicops_internals_generic_gcc.h | 137 + .../stubs/atomicops_internals_macosx.h | 225 + .../stubs/atomicops_internals_mips_gcc.h | 313 + .../stubs/atomicops_internals_pnacl.h | 73 + .../stubs/atomicops_internals_solaris.h | 188 + .../protobuf/stubs/atomicops_internals_tsan.h | 219 + .../stubs/atomicops_internals_x86_gcc.cc | 137 + .../stubs/atomicops_internals_x86_gcc.h | 293 + .../stubs/atomicops_internals_x86_msvc.cc | 112 + .../stubs/atomicops_internals_x86_msvc.h | 150 + .../{ => src}/google/protobuf/stubs/common.cc | 47 +- .../{ => src}/google/protobuf/stubs/common.h | 121 +- .../{ => src}/google/protobuf/stubs/hash.h | 14 +- .../src/google/protobuf/stubs/map_util.h | 771 + .../{ => src}/google/protobuf/stubs/once.cc | 81 +- .../{ => src}/google/protobuf/stubs/once.h | 103 +- .../google/protobuf/stubs/platform_macros.h | 103 + .../src/google/protobuf/stubs/shared_ptr.h | 470 + .../google/protobuf/stubs/stl_util.h} | 10 +- .../src/google/protobuf/stubs/stringprintf.cc | 174 + .../src/google/protobuf/stubs/stringprintf.h | 76 + .../protobuf/stubs/structurally_valid.cc | 536 + .../src/google/protobuf/stubs/strutil.cc | 1280 ++ .../src/google/protobuf/stubs/strutil.h | 563 + .../src/google/protobuf/stubs/substitute.cc | 134 + .../src/google/protobuf/stubs/substitute.h | 170 + .../src/google/protobuf/stubs/template_util.h | 138 + .../src/google/protobuf/stubs/type_traits.h | 334 + .../src/google/protobuf/text_format.cc | 1746 ++ .../src/google/protobuf/text_format.h | 473 + .../src/google/protobuf/unknown_field_set.cc | 265 + .../src/google/protobuf/unknown_field_set.h | 318 + .../src/google/protobuf/wire_format.cc | 1106 ++ .../src/google/protobuf/wire_format.h | 336 + .../google/protobuf/wire_format_lite.cc | 126 +- .../google/protobuf/wire_format_lite.h | 58 +- .../google/protobuf/wire_format_lite_inl.h | 131 +- toolkit/components/protobuf/update.sh | 2 - .../components/protobuf/upgrade_protobuf.sh | 71 + toolkit/components/protobuf/vs2013.patch | 21 - 104 files changed, 73345 insertions(+), 5414 deletions(-) create mode 100644 toolkit/components/downloads/csd.proto delete mode 100644 toolkit/components/protobuf/google/protobuf/stubs/map-util.h create mode 100644 toolkit/components/protobuf/m-c-changes.patch delete mode 100644 toolkit/components/protobuf/r512.patch create mode 100644 toolkit/components/protobuf/src/google/protobuf/descriptor.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/descriptor.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/descriptor.pb.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/descriptor.pb.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/descriptor.proto create mode 100644 toolkit/components/protobuf/src/google/protobuf/descriptor_database.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/descriptor_database.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/dynamic_message.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/dynamic_message.h rename toolkit/components/protobuf/{ => src}/google/protobuf/extension_set.cc (76%) rename toolkit/components/protobuf/{ => src}/google/protobuf/extension_set.h (63%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/extension_set_heavy.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/generated_enum_reflection.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/generated_message_reflection.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/generated_message_reflection.h rename toolkit/components/protobuf/{ => src}/google/protobuf/generated_message_util.cc (87%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/generated_message_util.h rename toolkit/components/protobuf/{ => src}/google/protobuf/io/coded_stream.cc (85%) rename toolkit/components/protobuf/{ => src}/google/protobuf/io/coded_stream.h (87%) rename toolkit/components/protobuf/{ => src}/google/protobuf/io/coded_stream_inl.h (85%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.h rename toolkit/components/protobuf/{ => src}/google/protobuf/io/package_info.h (97%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/io/printer.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/io/printer.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/io/strtod.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/io/strtod.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/io/tokenizer.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/io/tokenizer.h rename toolkit/components/protobuf/{ => src}/google/protobuf/io/zero_copy_stream.cc (82%) rename toolkit/components/protobuf/{ => src}/google/protobuf/io/zero_copy_stream.h (93%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc rename toolkit/components/protobuf/{ => src}/google/protobuf/io/zero_copy_stream_impl.h (99%) rename toolkit/components/protobuf/{ => src}/google/protobuf/io/zero_copy_stream_impl_lite.cc (93%) rename toolkit/components/protobuf/{ => src}/google/protobuf/io/zero_copy_stream_impl_lite.h (95%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/message.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/message.h rename toolkit/components/protobuf/{ => src}/google/protobuf/message_lite.cc (98%) rename toolkit/components/protobuf/{ => src}/google/protobuf/message_lite.h (97%) rename toolkit/components/protobuf/{ => src}/google/protobuf/package_info.h (98%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/reflection_ops.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/reflection_ops.h rename toolkit/components/protobuf/{ => src}/google/protobuf/repeated_field.cc (79%) rename toolkit/components/protobuf/{ => src}/google/protobuf/repeated_field.h (74%) rename toolkit/components/protobuf/{google/protobuf/generated_message_util.h => src/google/protobuf/service.cc} (60%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/service.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h rename toolkit/components/protobuf/{ => src}/google/protobuf/stubs/common.cc (90%) rename toolkit/components/protobuf/{ => src}/google/protobuf/stubs/common.h (93%) rename toolkit/components/protobuf/{ => src}/google/protobuf/stubs/hash.h (96%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/map_util.h rename toolkit/components/protobuf/{ => src}/google/protobuf/stubs/once.cc (56%) rename toolkit/components/protobuf/{ => src}/google/protobuf/stubs/once.h (61%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/platform_macros.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/shared_ptr.h rename toolkit/components/protobuf/{google/protobuf/stubs/stl_util-inl.h => src/google/protobuf/stubs/stl_util.h} (95%) create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/structurally_valid.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/strutil.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/strutil.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/substitute.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/substitute.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/template_util.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/stubs/type_traits.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/text_format.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/text_format.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/unknown_field_set.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/unknown_field_set.h create mode 100644 toolkit/components/protobuf/src/google/protobuf/wire_format.cc create mode 100644 toolkit/components/protobuf/src/google/protobuf/wire_format.h rename toolkit/components/protobuf/{ => src}/google/protobuf/wire_format_lite.cc (76%) rename toolkit/components/protobuf/{ => src}/google/protobuf/wire_format_lite.h (92%) rename toolkit/components/protobuf/{ => src}/google/protobuf/wire_format_lite_inl.h (86%) delete mode 100644 toolkit/components/protobuf/update.sh create mode 100755 toolkit/components/protobuf/upgrade_protobuf.sh delete mode 100644 toolkit/components/protobuf/vs2013.patch diff --git a/configure.in b/configure.in index bbe89917f80d7..e4752d6569058 100644 --- a/configure.in +++ b/configure.in @@ -3034,6 +3034,7 @@ then esac LDFLAGS="${_PTHREAD_LDFLAGS} ${LDFLAGS}" AC_SUBST(MOZ_USE_PTHREADS) + MOZ_CHECK_HEADERS(pthread.h) fi diff --git a/gfx/layers/protobuf/LayerScopePacket.pb.cc b/gfx/layers/protobuf/LayerScopePacket.pb.cc index 6fd63805763df..0bc11b1c9e28e 100644 --- a/gfx/layers/protobuf/LayerScopePacket.pb.cc +++ b/gfx/layers/protobuf/LayerScopePacket.pb.cc @@ -1,13 +1,16 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! +// source: LayerScopePacket.proto #define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION #include "LayerScopePacket.pb.h" #include +#include #include #include #include +#include // @@protoc_insertion_point(includes) namespace mozilla { @@ -32,12 +35,18 @@ void protobuf_ShutdownFile_LayerScopePacket_2eproto() { delete CommandPacket::default_instance_; } +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER +void protobuf_AddDesc_LayerScopePacket_2eproto_impl() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + +#else void protobuf_AddDesc_LayerScopePacket_2eproto() { static bool already_here = false; if (already_here) return; already_here = true; GOOGLE_PROTOBUF_VERIFY_VERSION; +#endif FramePacket::default_instance_ = new FramePacket(); ColorPacket::default_instance_ = new ColorPacket(); TexturePacket::default_instance_ = new TexturePacket(); @@ -71,13 +80,20 @@ void protobuf_AddDesc_LayerScopePacket_2eproto() { ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_LayerScopePacket_2eproto); } +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AddDesc_LayerScopePacket_2eproto_once_); +void protobuf_AddDesc_LayerScopePacket_2eproto() { + ::google::protobuf::GoogleOnceInit(&protobuf_AddDesc_LayerScopePacket_2eproto_once_, + &protobuf_AddDesc_LayerScopePacket_2eproto_impl); +} +#else // Force AddDescriptors() to be called at static initialization time. struct StaticDescriptorInitializer_LayerScopePacket_2eproto { StaticDescriptorInitializer_LayerScopePacket_2eproto() { protobuf_AddDesc_LayerScopePacket_2eproto(); } } static_descriptor_initializer_LayerScopePacket_2eproto_; - +#endif // =================================================================== @@ -88,6 +104,7 @@ const int FramePacket::kValueFieldNumber; FramePacket::FramePacket() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.FramePacket) } void FramePacket::InitAsDefaultInstance() { @@ -97,6 +114,7 @@ FramePacket::FramePacket(const FramePacket& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.FramePacket) } void FramePacket::SharedCtor() { @@ -106,11 +124,16 @@ void FramePacket::SharedCtor() { } FramePacket::~FramePacket() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.FramePacket) SharedDtor(); } void FramePacket::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -120,7 +143,12 @@ void FramePacket::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const FramePacket& FramePacket::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } FramePacket* FramePacket::default_instance_ = NULL; @@ -130,60 +158,77 @@ FramePacket* FramePacket::New() const { } void FramePacket::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - value_ = GOOGLE_ULONGLONG(0); - } + value_ = GOOGLE_ULONGLONG(0); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool FramePacket::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.FramePacket) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional uint64 value = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &value_))); set_has_value(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.FramePacket) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.FramePacket) + return false; #undef DO_ } void FramePacket::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.FramePacket) // optional uint64 value = 1; if (has_value()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->value(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.FramePacket) } int FramePacket::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // optional uint64 value = 1; if (has_value()) { @@ -191,8 +236,10 @@ int FramePacket::ByteSize() const { ::google::protobuf::internal::WireFormatLite::UInt64Size( this->value()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -211,6 +258,7 @@ void FramePacket::MergeFrom(const FramePacket& from) { set_value(from.value()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void FramePacket::CopyFrom(const FramePacket& from) { @@ -220,7 +268,7 @@ void FramePacket::CopyFrom(const FramePacket& from) { } bool FramePacket::IsInitialized() const { - + return true; } @@ -228,6 +276,7 @@ void FramePacket::Swap(FramePacket* other) { if (other != this) { std::swap(value_, other->value_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -249,6 +298,7 @@ const int ColorPacket::kColorFieldNumber; ColorPacket::ColorPacket() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.ColorPacket) } void ColorPacket::InitAsDefaultInstance() { @@ -258,6 +308,7 @@ ColorPacket::ColorPacket(const ColorPacket& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.ColorPacket) } void ColorPacket::SharedCtor() { @@ -270,11 +321,16 @@ void ColorPacket::SharedCtor() { } ColorPacket::~ColorPacket() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.ColorPacket) SharedDtor(); } void ColorPacket::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -284,7 +340,12 @@ void ColorPacket::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ColorPacket& ColorPacket::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } ColorPacket* ColorPacket::default_instance_ = NULL; @@ -294,126 +355,151 @@ ColorPacket* ColorPacket::New() const { } void ColorPacket::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - layerref_ = GOOGLE_ULONGLONG(0); - width_ = 0u; - height_ = 0u; - color_ = 0u; - } +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(layerref_, color_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool ColorPacket::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.ColorPacket) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // required uint64 layerref = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &layerref_))); set_has_layerref(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(16)) goto parse_width; break; } - + // optional uint32 width = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 16) { parse_width: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &width_))); set_has_width(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(24)) goto parse_height; break; } - + // optional uint32 height = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 24) { parse_height: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &height_))); set_has_height(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(32)) goto parse_color; break; } - + // optional uint32 color = 4; case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 32) { parse_color: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &color_))); set_has_color(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.ColorPacket) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.ColorPacket) + return false; #undef DO_ } void ColorPacket::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.ColorPacket) // required uint64 layerref = 1; if (has_layerref()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->layerref(), output); } - + // optional uint32 width = 2; if (has_width()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->width(), output); } - + // optional uint32 height = 3; if (has_height()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(3, this->height(), output); } - + // optional uint32 color = 4; if (has_color()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(4, this->color(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.ColorPacket) } int ColorPacket::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // required uint64 layerref = 1; if (has_layerref()) { @@ -421,29 +507,31 @@ int ColorPacket::ByteSize() const { ::google::protobuf::internal::WireFormatLite::UInt64Size( this->layerref()); } - + // optional uint32 width = 2; if (has_width()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->width()); } - + // optional uint32 height = 3; if (has_height()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->height()); } - + // optional uint32 color = 4; if (has_color()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->color()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -471,6 +559,7 @@ void ColorPacket::MergeFrom(const ColorPacket& from) { set_color(from.color()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void ColorPacket::CopyFrom(const ColorPacket& from) { @@ -481,7 +570,7 @@ void ColorPacket::CopyFrom(const ColorPacket& from) { bool ColorPacket::IsInitialized() const { if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; - + return true; } @@ -492,6 +581,7 @@ void ColorPacket::Swap(ColorPacket* other) { std::swap(height_, other->height_); std::swap(color_, other->color_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -518,6 +608,7 @@ const int TexturePacket::kDataFieldNumber; TexturePacket::TexturePacket() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.TexturePacket) } void TexturePacket::InitAsDefaultInstance() { @@ -527,9 +618,11 @@ TexturePacket::TexturePacket(const TexturePacket& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.TexturePacket) } void TexturePacket::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; layerref_ = GOOGLE_ULONGLONG(0); width_ = 0u; @@ -539,19 +632,24 @@ void TexturePacket::SharedCtor() { target_ = 0u; dataformat_ = 0u; glcontext_ = GOOGLE_ULONGLONG(0); - data_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + data_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(_has_bits_, 0, sizeof(_has_bits_)); } TexturePacket::~TexturePacket() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.TexturePacket) SharedDtor(); } void TexturePacket::SharedDtor() { - if (data_ != &::google::protobuf::internal::kEmptyString) { + if (data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { delete data_; } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -561,7 +659,12 @@ void TexturePacket::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const TexturePacket& TexturePacket::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } TexturePacket* TexturePacket::default_instance_ = NULL; @@ -571,241 +674,257 @@ TexturePacket* TexturePacket::New() const { } void TexturePacket::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - layerref_ = GOOGLE_ULONGLONG(0); - width_ = 0u; - height_ = 0u; - stride_ = 0u; - name_ = 0u; - target_ = 0u; - dataformat_ = 0u; - glcontext_ = GOOGLE_ULONGLONG(0); +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + if (_has_bits_[0 / 32] & 255) { + ZR_(layerref_, glcontext_); } - if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { - if (has_data()) { - if (data_ != &::google::protobuf::internal::kEmptyString) { - data_->clear(); - } + if (has_data()) { + if (data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + data_->clear(); } } + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool TexturePacket::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.TexturePacket) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // required uint64 layerref = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &layerref_))); set_has_layerref(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(16)) goto parse_width; break; } - + // optional uint32 width = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 16) { parse_width: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &width_))); set_has_width(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(24)) goto parse_height; break; } - + // optional uint32 height = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 24) { parse_height: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &height_))); set_has_height(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(32)) goto parse_stride; break; } - + // optional uint32 stride = 4; case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 32) { parse_stride: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &stride_))); set_has_stride(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(40)) goto parse_name; break; } - + // optional uint32 name = 5; case 5: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 40) { parse_name: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &name_))); set_has_name(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(48)) goto parse_target; break; } - + // optional uint32 target = 6; case 6: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 48) { parse_target: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &target_))); set_has_target(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(56)) goto parse_dataformat; break; } - + // optional uint32 dataformat = 7; case 7: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 56) { parse_dataformat: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &dataformat_))); set_has_dataformat(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(64)) goto parse_glcontext; break; } - + // optional uint64 glcontext = 8; case 8: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 64) { parse_glcontext: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &glcontext_))); set_has_glcontext(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(74)) goto parse_data; break; } - + // optional bytes data = 9; case 9: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 74) { parse_data: DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( input, this->mutable_data())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.TexturePacket) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.TexturePacket) + return false; #undef DO_ } void TexturePacket::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.TexturePacket) // required uint64 layerref = 1; if (has_layerref()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->layerref(), output); } - + // optional uint32 width = 2; if (has_width()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->width(), output); } - + // optional uint32 height = 3; if (has_height()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(3, this->height(), output); } - + // optional uint32 stride = 4; if (has_stride()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(4, this->stride(), output); } - + // optional uint32 name = 5; if (has_name()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(5, this->name(), output); } - + // optional uint32 target = 6; if (has_target()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(6, this->target(), output); } - + // optional uint32 dataformat = 7; if (has_dataformat()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(7, this->dataformat(), output); } - + // optional uint64 glcontext = 8; if (has_glcontext()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(8, this->glcontext(), output); } - + // optional bytes data = 9; if (has_data()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( 9, this->data(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.TexturePacket) } int TexturePacket::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // required uint64 layerref = 1; if (has_layerref()) { @@ -813,56 +932,56 @@ int TexturePacket::ByteSize() const { ::google::protobuf::internal::WireFormatLite::UInt64Size( this->layerref()); } - + // optional uint32 width = 2; if (has_width()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->width()); } - + // optional uint32 height = 3; if (has_height()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->height()); } - + // optional uint32 stride = 4; if (has_stride()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->stride()); } - + // optional uint32 name = 5; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->name()); } - + // optional uint32 target = 6; if (has_target()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->target()); } - + // optional uint32 dataformat = 7; if (has_dataformat()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->dataformat()); } - + // optional uint64 glcontext = 8; if (has_glcontext()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt64Size( this->glcontext()); } - + } if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { // optional bytes data = 9; @@ -871,8 +990,10 @@ int TexturePacket::ByteSize() const { ::google::protobuf::internal::WireFormatLite::BytesSize( this->data()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -917,6 +1038,7 @@ void TexturePacket::MergeFrom(const TexturePacket& from) { set_data(from.data()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void TexturePacket::CopyFrom(const TexturePacket& from) { @@ -927,7 +1049,7 @@ void TexturePacket::CopyFrom(const TexturePacket& from) { bool TexturePacket::IsInitialized() const { if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; - + return true; } @@ -943,6 +1065,7 @@ void TexturePacket::Swap(TexturePacket* other) { std::swap(glcontext_, other->glcontext_); std::swap(data_, other->data_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -1037,6 +1160,7 @@ const int LayersPacket_Layer_Size::kHFieldNumber; LayersPacket_Layer_Size::LayersPacket_Layer_Size() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.LayersPacket.Layer.Size) } void LayersPacket_Layer_Size::InitAsDefaultInstance() { @@ -1046,6 +1170,7 @@ LayersPacket_Layer_Size::LayersPacket_Layer_Size(const LayersPacket_Layer_Size& : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.LayersPacket.Layer.Size) } void LayersPacket_Layer_Size::SharedCtor() { @@ -1056,11 +1181,16 @@ void LayersPacket_Layer_Size::SharedCtor() { } LayersPacket_Layer_Size::~LayersPacket_Layer_Size() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.LayersPacket.Layer.Size) SharedDtor(); } void LayersPacket_Layer_Size::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -1070,7 +1200,12 @@ void LayersPacket_Layer_Size::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const LayersPacket_Layer_Size& LayersPacket_Layer_Size::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } LayersPacket_Layer_Size* LayersPacket_Layer_Size::default_instance_ = NULL; @@ -1080,82 +1215,111 @@ LayersPacket_Layer_Size* LayersPacket_Layer_Size::New() const { } void LayersPacket_Layer_Size::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - w_ = 0; - h_ = 0; - } +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(w_, h_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool LayersPacket_Layer_Size::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.LayersPacket.Layer.Size) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional int32 w = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &w_))); set_has_w(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(16)) goto parse_h; break; } - + // optional int32 h = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 16) { parse_h: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &h_))); set_has_h(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.LayersPacket.Layer.Size) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.LayersPacket.Layer.Size) + return false; #undef DO_ } void LayersPacket_Layer_Size::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.LayersPacket.Layer.Size) // optional int32 w = 1; if (has_w()) { ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->w(), output); } - + // optional int32 h = 2; if (has_h()) { ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->h(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.LayersPacket.Layer.Size) } int LayersPacket_Layer_Size::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // optional int32 w = 1; if (has_w()) { @@ -1163,15 +1327,17 @@ int LayersPacket_Layer_Size::ByteSize() const { ::google::protobuf::internal::WireFormatLite::Int32Size( this->w()); } - + // optional int32 h = 2; if (has_h()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->h()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -1193,6 +1359,7 @@ void LayersPacket_Layer_Size::MergeFrom(const LayersPacket_Layer_Size& from) { set_h(from.h()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void LayersPacket_Layer_Size::CopyFrom(const LayersPacket_Layer_Size& from) { @@ -1202,7 +1369,7 @@ void LayersPacket_Layer_Size::CopyFrom(const LayersPacket_Layer_Size& from) { } bool LayersPacket_Layer_Size::IsInitialized() const { - + return true; } @@ -1211,6 +1378,7 @@ void LayersPacket_Layer_Size::Swap(LayersPacket_Layer_Size* other) { std::swap(w_, other->w_); std::swap(h_, other->h_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -1232,6 +1400,7 @@ const int LayersPacket_Layer_Rect::kHFieldNumber; LayersPacket_Layer_Rect::LayersPacket_Layer_Rect() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.LayersPacket.Layer.Rect) } void LayersPacket_Layer_Rect::InitAsDefaultInstance() { @@ -1241,6 +1410,7 @@ LayersPacket_Layer_Rect::LayersPacket_Layer_Rect(const LayersPacket_Layer_Rect& : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.LayersPacket.Layer.Rect) } void LayersPacket_Layer_Rect::SharedCtor() { @@ -1253,11 +1423,16 @@ void LayersPacket_Layer_Rect::SharedCtor() { } LayersPacket_Layer_Rect::~LayersPacket_Layer_Rect() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.LayersPacket.Layer.Rect) SharedDtor(); } void LayersPacket_Layer_Rect::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -1267,7 +1442,12 @@ void LayersPacket_Layer_Rect::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const LayersPacket_Layer_Rect& LayersPacket_Layer_Rect::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } LayersPacket_Layer_Rect* LayersPacket_Layer_Rect::default_instance_ = NULL; @@ -1277,126 +1457,151 @@ LayersPacket_Layer_Rect* LayersPacket_Layer_Rect::New() const { } void LayersPacket_Layer_Rect::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - x_ = 0; - y_ = 0; - w_ = 0; - h_ = 0; - } +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(x_, h_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool LayersPacket_Layer_Rect::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.LayersPacket.Layer.Rect) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional int32 x = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &x_))); set_has_x(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(16)) goto parse_y; break; } - + // optional int32 y = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 16) { parse_y: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &y_))); set_has_y(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(24)) goto parse_w; break; } - + // optional int32 w = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 24) { parse_w: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &w_))); set_has_w(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(32)) goto parse_h; break; } - + // optional int32 h = 4; case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 32) { parse_h: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &h_))); set_has_h(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.LayersPacket.Layer.Rect) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.LayersPacket.Layer.Rect) + return false; #undef DO_ } void LayersPacket_Layer_Rect::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.LayersPacket.Layer.Rect) // optional int32 x = 1; if (has_x()) { ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->x(), output); } - + // optional int32 y = 2; if (has_y()) { ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->y(), output); } - + // optional int32 w = 3; if (has_w()) { ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->w(), output); } - + // optional int32 h = 4; if (has_h()) { ::google::protobuf::internal::WireFormatLite::WriteInt32(4, this->h(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.LayersPacket.Layer.Rect) } int LayersPacket_Layer_Rect::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // optional int32 x = 1; if (has_x()) { @@ -1404,29 +1609,31 @@ int LayersPacket_Layer_Rect::ByteSize() const { ::google::protobuf::internal::WireFormatLite::Int32Size( this->x()); } - + // optional int32 y = 2; if (has_y()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->y()); } - + // optional int32 w = 3; if (has_w()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->w()); } - + // optional int32 h = 4; if (has_h()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->h()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -1454,6 +1661,7 @@ void LayersPacket_Layer_Rect::MergeFrom(const LayersPacket_Layer_Rect& from) { set_h(from.h()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void LayersPacket_Layer_Rect::CopyFrom(const LayersPacket_Layer_Rect& from) { @@ -1463,7 +1671,7 @@ void LayersPacket_Layer_Rect::CopyFrom(const LayersPacket_Layer_Rect& from) { } bool LayersPacket_Layer_Rect::IsInitialized() const { - + return true; } @@ -1474,6 +1682,7 @@ void LayersPacket_Layer_Rect::Swap(LayersPacket_Layer_Rect* other) { std::swap(w_, other->w_); std::swap(h_, other->h_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -1492,6 +1701,7 @@ const int LayersPacket_Layer_Region::kRFieldNumber; LayersPacket_Layer_Region::LayersPacket_Layer_Region() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.LayersPacket.Layer.Region) } void LayersPacket_Layer_Region::InitAsDefaultInstance() { @@ -1501,6 +1711,7 @@ LayersPacket_Layer_Region::LayersPacket_Layer_Region(const LayersPacket_Layer_Re : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.LayersPacket.Layer.Region) } void LayersPacket_Layer_Region::SharedCtor() { @@ -1509,11 +1720,16 @@ void LayersPacket_Layer_Region::SharedCtor() { } LayersPacket_Layer_Region::~LayersPacket_Layer_Region() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.LayersPacket.Layer.Region) SharedDtor(); } void LayersPacket_Layer_Region::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -1523,7 +1739,12 @@ void LayersPacket_Layer_Region::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const LayersPacket_Layer_Region& LayersPacket_Layer_Region::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } LayersPacket_Layer_Region* LayersPacket_Layer_Region::default_instance_ = NULL; @@ -1535,57 +1756,76 @@ LayersPacket_Layer_Region* LayersPacket_Layer_Region::New() const { void LayersPacket_Layer_Region::Clear() { r_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool LayersPacket_Layer_Region::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.LayersPacket.Layer.Region) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated .mozilla.layers.layerscope.LayersPacket.Layer.Rect r = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 10) { parse_r: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, add_r())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(10)) goto parse_r; - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.LayersPacket.Layer.Region) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.LayersPacket.Layer.Region) + return false; #undef DO_ } void LayersPacket_Layer_Region::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.LayersPacket.Layer.Region) // repeated .mozilla.layers.layerscope.LayersPacket.Layer.Rect r = 1; for (int i = 0; i < this->r_size(); i++) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 1, this->r(i), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.LayersPacket.Layer.Region) } int LayersPacket_Layer_Region::ByteSize() const { int total_size = 0; - + // repeated .mozilla.layers.layerscope.LayersPacket.Layer.Rect r = 1; total_size += 1 * this->r_size(); for (int i = 0; i < this->r_size(); i++) { @@ -1593,7 +1833,9 @@ int LayersPacket_Layer_Region::ByteSize() const { ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->r(i)); } - + + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -1608,6 +1850,7 @@ void LayersPacket_Layer_Region::CheckTypeAndMergeFrom( void LayersPacket_Layer_Region::MergeFrom(const LayersPacket_Layer_Region& from) { GOOGLE_CHECK_NE(&from, this); r_.MergeFrom(from.r_); + mutable_unknown_fields()->append(from.unknown_fields()); } void LayersPacket_Layer_Region::CopyFrom(const LayersPacket_Layer_Region& from) { @@ -1617,7 +1860,7 @@ void LayersPacket_Layer_Region::CopyFrom(const LayersPacket_Layer_Region& from) } bool LayersPacket_Layer_Region::IsInitialized() const { - + return true; } @@ -1625,6 +1868,7 @@ void LayersPacket_Layer_Region::Swap(LayersPacket_Layer_Region* other) { if (other != this) { r_.Swap(&other->r_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -1645,6 +1889,7 @@ const int LayersPacket_Layer_Matrix::kMFieldNumber; LayersPacket_Layer_Matrix::LayersPacket_Layer_Matrix() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.LayersPacket.Layer.Matrix) } void LayersPacket_Layer_Matrix::InitAsDefaultInstance() { @@ -1654,6 +1899,7 @@ LayersPacket_Layer_Matrix::LayersPacket_Layer_Matrix(const LayersPacket_Layer_Ma : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.LayersPacket.Layer.Matrix) } void LayersPacket_Layer_Matrix::SharedCtor() { @@ -1664,11 +1910,16 @@ void LayersPacket_Layer_Matrix::SharedCtor() { } LayersPacket_Layer_Matrix::~LayersPacket_Layer_Matrix() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.LayersPacket.Layer.Matrix) SharedDtor(); } void LayersPacket_Layer_Matrix::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -1678,7 +1929,12 @@ void LayersPacket_Layer_Matrix::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const LayersPacket_Layer_Matrix& LayersPacket_Layer_Matrix::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } LayersPacket_Layer_Matrix* LayersPacket_Layer_Matrix::default_instance_ = NULL; @@ -1688,122 +1944,148 @@ LayersPacket_Layer_Matrix* LayersPacket_Layer_Matrix::New() const { } void LayersPacket_Layer_Matrix::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - is2d_ = false; - isid_ = false; - } +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(is2d_, isid_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + m_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool LayersPacket_Layer_Matrix::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.LayersPacket.Layer.Matrix) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional bool is2D = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &is2d_))); set_has_is2d(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(16)) goto parse_isId; break; } - + // optional bool isId = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 16) { parse_isId: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &isid_))); set_has_isid(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(29)) goto parse_m; break; } - + // repeated float m = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) { + if (tag == 29) { parse_m: DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( 1, 29, input, this->mutable_m()))); - } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) - == ::google::protobuf::internal::WireFormatLite:: - WIRETYPE_LENGTH_DELIMITED) { + } else if (tag == 26) { DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( input, this->mutable_m()))); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(29)) goto parse_m; - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.LayersPacket.Layer.Matrix) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.LayersPacket.Layer.Matrix) + return false; #undef DO_ } void LayersPacket_Layer_Matrix::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.LayersPacket.Layer.Matrix) // optional bool is2D = 1; if (has_is2d()) { ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->is2d(), output); } - + // optional bool isId = 2; if (has_isid()) { ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->isid(), output); } - + // repeated float m = 3; for (int i = 0; i < this->m_size(); i++) { ::google::protobuf::internal::WireFormatLite::WriteFloat( 3, this->m(i), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.LayersPacket.Layer.Matrix) } int LayersPacket_Layer_Matrix::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // optional bool is2D = 1; if (has_is2d()) { total_size += 1 + 1; } - + // optional bool isId = 2; if (has_isid()) { total_size += 1 + 1; } - + } // repeated float m = 3; { @@ -1811,7 +2093,9 @@ int LayersPacket_Layer_Matrix::ByteSize() const { data_size = 4 * this->m_size(); total_size += 1 * this->m_size() + data_size; } - + + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -1834,6 +2118,7 @@ void LayersPacket_Layer_Matrix::MergeFrom(const LayersPacket_Layer_Matrix& from) set_isid(from.isid()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void LayersPacket_Layer_Matrix::CopyFrom(const LayersPacket_Layer_Matrix& from) { @@ -1843,7 +2128,7 @@ void LayersPacket_Layer_Matrix::CopyFrom(const LayersPacket_Layer_Matrix& from) } bool LayersPacket_Layer_Matrix::IsInitialized() const { - + return true; } @@ -1853,6 +2138,7 @@ void LayersPacket_Layer_Matrix::Swap(LayersPacket_Layer_Matrix* other) { std::swap(isid_, other->isid_); m_.Swap(&other->m_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -1873,18 +2159,35 @@ const int LayersPacket_Layer_Shadow::kVRegionFieldNumber; LayersPacket_Layer_Shadow::LayersPacket_Layer_Shadow() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.LayersPacket.Layer.Shadow) } void LayersPacket_Layer_Shadow::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + clip_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Rect*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Rect::internal_default_instance()); +#else clip_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Rect*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Rect::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + transform_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix::internal_default_instance()); +#else transform_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Matrix::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + vregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Region::internal_default_instance()); +#else vregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); +#endif } LayersPacket_Layer_Shadow::LayersPacket_Layer_Shadow(const LayersPacket_Layer_Shadow& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.LayersPacket.Layer.Shadow) } void LayersPacket_Layer_Shadow::SharedCtor() { @@ -1896,11 +2199,16 @@ void LayersPacket_Layer_Shadow::SharedCtor() { } LayersPacket_Layer_Shadow::~LayersPacket_Layer_Shadow() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.LayersPacket.Layer.Shadow) SharedDtor(); } void LayersPacket_Layer_Shadow::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif delete clip_; delete transform_; delete vregion_; @@ -1913,7 +2221,12 @@ void LayersPacket_Layer_Shadow::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const LayersPacket_Layer_Shadow& LayersPacket_Layer_Shadow::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } LayersPacket_Layer_Shadow* LayersPacket_Layer_Shadow::default_instance_ = NULL; @@ -1923,7 +2236,7 @@ LayersPacket_Layer_Shadow* LayersPacket_Layer_Shadow::New() const { } void LayersPacket_Layer_Shadow::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (_has_bits_[0 / 32] & 7) { if (has_clip()) { if (clip_ != NULL) clip_->::mozilla::layers::layerscope::LayersPacket_Layer_Rect::Clear(); } @@ -1935,95 +2248,112 @@ void LayersPacket_Layer_Shadow::Clear() { } } ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool LayersPacket_Layer_Shadow::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.LayersPacket.Layer.Shadow) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional .mozilla.layers.layerscope.LayersPacket.Layer.Rect clip = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 10) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_clip())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(18)) goto parse_transform; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 18) { parse_transform: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_transform())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(26)) goto parse_vRegion; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 26) { parse_vRegion: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_vregion())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.LayersPacket.Layer.Shadow) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.LayersPacket.Layer.Shadow) + return false; #undef DO_ } void LayersPacket_Layer_Shadow::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.LayersPacket.Layer.Shadow) // optional .mozilla.layers.layerscope.LayersPacket.Layer.Rect clip = 1; if (has_clip()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 1, this->clip(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 2; if (has_transform()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 2, this->transform(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 3; if (has_vregion()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 3, this->vregion(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.LayersPacket.Layer.Shadow) } int LayersPacket_Layer_Shadow::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // optional .mozilla.layers.layerscope.LayersPacket.Layer.Rect clip = 1; if (has_clip()) { @@ -2031,22 +2361,24 @@ int LayersPacket_Layer_Shadow::ByteSize() const { ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->clip()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 2; if (has_transform()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->transform()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 3; if (has_vregion()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->vregion()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -2071,6 +2403,7 @@ void LayersPacket_Layer_Shadow::MergeFrom(const LayersPacket_Layer_Shadow& from) mutable_vregion()->::mozilla::layers::layerscope::LayersPacket_Layer_Region::MergeFrom(from.vregion()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void LayersPacket_Layer_Shadow::CopyFrom(const LayersPacket_Layer_Shadow& from) { @@ -2080,7 +2413,7 @@ void LayersPacket_Layer_Shadow::CopyFrom(const LayersPacket_Layer_Shadow& from) } bool LayersPacket_Layer_Shadow::IsInitialized() const { - + return true; } @@ -2090,6 +2423,7 @@ void LayersPacket_Layer_Shadow::Swap(LayersPacket_Layer_Shadow* other) { std::swap(transform_, other->transform_); std::swap(vregion_, other->vregion_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -2130,26 +2464,83 @@ const int LayersPacket_Layer::kSizeFieldNumber; LayersPacket_Layer::LayersPacket_Layer() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.LayersPacket.Layer) } void LayersPacket_Layer::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + clip_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Rect*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Rect::internal_default_instance()); +#else clip_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Rect*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Rect::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + transform_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix::internal_default_instance()); +#else transform_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Matrix::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + vregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Region::internal_default_instance()); +#else vregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + shadow_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow::internal_default_instance()); +#else shadow_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Shadow::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + hitregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Region::internal_default_instance()); +#else hitregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + dispatchregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Region::internal_default_instance()); +#else dispatchregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + noactionregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Region::internal_default_instance()); +#else noactionregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + hpanregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Region::internal_default_instance()); +#else hpanregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + vpanregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Region::internal_default_instance()); +#else vpanregion_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + valid_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Region::internal_default_instance()); +#else valid_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Region*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Region::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + size_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Size*>( + ::mozilla::layers::layerscope::LayersPacket_Layer_Size::internal_default_instance()); +#else size_ = const_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Size*>(&::mozilla::layers::layerscope::LayersPacket_Layer_Size::default_instance()); +#endif } LayersPacket_Layer::LayersPacket_Layer(const LayersPacket_Layer& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.LayersPacket.Layer) } void LayersPacket_Layer::SharedCtor() { @@ -2181,11 +2572,16 @@ void LayersPacket_Layer::SharedCtor() { } LayersPacket_Layer::~LayersPacket_Layer() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.LayersPacket.Layer) SharedDtor(); } void LayersPacket_Layer::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif delete clip_; delete transform_; delete vregion_; @@ -2206,7 +2602,12 @@ void LayersPacket_Layer::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const LayersPacket_Layer& LayersPacket_Layer::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } LayersPacket_Layer* LayersPacket_Layer::default_instance_ = NULL; @@ -2216,10 +2617,19 @@ LayersPacket_Layer* LayersPacket_Layer::New() const { } void LayersPacket_Layer::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - type_ = 0; - ptr_ = GOOGLE_ULONGLONG(0); - parentptr_ = GOOGLE_ULONGLONG(0); +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + if (_has_bits_[0 / 32] & 255) { + ZR_(ptr_, parentptr_); + ZR_(type_, opacity_); if (has_clip()) { if (clip_ != NULL) clip_->::mozilla::layers::layerscope::LayersPacket_Layer_Rect::Clear(); } @@ -2232,14 +2642,11 @@ void LayersPacket_Layer::Clear() { if (has_shadow()) { if (shadow_ != NULL) shadow_->::mozilla::layers::layerscope::LayersPacket_Layer_Shadow::Clear(); } - opacity_ = 0; } - if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { - copaque_ = false; - calpha_ = false; + if (_has_bits_[8 / 32] & 65280) { + ZR_(copaque_, calpha_); + ZR_(barid_, mask_); direct_ = 1; - barid_ = GOOGLE_ULONGLONG(0); - mask_ = GOOGLE_ULONGLONG(0); if (has_hitregion()) { if (hitregion_ != NULL) hitregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); } @@ -2250,7 +2657,8 @@ void LayersPacket_Layer::Clear() { if (noactionregion_ != NULL) noactionregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); } } - if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { + if (_has_bits_[16 / 32] & 8323072) { + ZR_(color_, refid_); if (has_hpanregion()) { if (hpanregion_ != NULL) hpanregion_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); } @@ -2260,180 +2668,182 @@ void LayersPacket_Layer::Clear() { if (has_valid()) { if (valid_ != NULL) valid_->::mozilla::layers::layerscope::LayersPacket_Layer_Region::Clear(); } - color_ = 0u; - filter_ = 0; - refid_ = GOOGLE_ULONGLONG(0); if (has_size()) { if (size_ != NULL) size_->::mozilla::layers::layerscope::LayersPacket_Layer_Size::Clear(); } } + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool LayersPacket_Layer::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.LayersPacket.Layer) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // required .mozilla.layers.layerscope.LayersPacket.Layer.LayerType type = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); if (::mozilla::layers::layerscope::LayersPacket_Layer_LayerType_IsValid(value)) { set_type(static_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_LayerType >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); } } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(16)) goto parse_ptr; break; } - + // required uint64 ptr = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 16) { parse_ptr: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &ptr_))); set_has_ptr(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(24)) goto parse_parentPtr; break; } - + // required uint64 parentPtr = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 24) { parse_parentPtr: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &parentptr_))); set_has_parentptr(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(82)) goto parse_clip; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Rect clip = 10; case 10: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 82) { parse_clip: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_clip())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(90)) goto parse_transform; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 11; case 11: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 90) { parse_transform: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_transform())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(98)) goto parse_vRegion; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 12; case 12: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 98) { parse_vRegion: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_vregion())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(106)) goto parse_shadow; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Shadow shadow = 13; case 13: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 106) { parse_shadow: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_shadow())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(117)) goto parse_opacity; break; } - + // optional float opacity = 14; case 14: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) { + if (tag == 117) { parse_opacity: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( input, &opacity_))); set_has_opacity(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(120)) goto parse_cOpaque; break; } - + // optional bool cOpaque = 15; case 15: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 120) { parse_cOpaque: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &copaque_))); set_has_copaque(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(128)) goto parse_cAlpha; break; } - + // optional bool cAlpha = 16; case 16: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 128) { parse_cAlpha: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &calpha_))); set_has_calpha(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(136)) goto parse_direct; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.ScrollingDirect direct = 17; case 17: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 136) { parse_direct: int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< @@ -2441,150 +2851,143 @@ bool LayersPacket_Layer::MergePartialFromCodedStream( input, &value))); if (::mozilla::layers::layerscope::LayersPacket_Layer_ScrollingDirect_IsValid(value)) { set_direct(static_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_ScrollingDirect >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); } } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(144)) goto parse_barID; break; } - + // optional uint64 barID = 18; case 18: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 144) { parse_barID: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &barid_))); set_has_barid(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(152)) goto parse_mask; break; } - + // optional uint64 mask = 19; case 19: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 152) { parse_mask: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &mask_))); set_has_mask(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(162)) goto parse_hitRegion; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; case 20: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 162) { parse_hitRegion: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_hitregion())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(170)) goto parse_dispatchRegion; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; case 21: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 170) { parse_dispatchRegion: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_dispatchregion())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(178)) goto parse_noActionRegion; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; case 22: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 178) { parse_noActionRegion: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_noactionregion())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(186)) goto parse_hPanRegion; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; case 23: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 186) { parse_hPanRegion: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_hpanregion())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(194)) goto parse_vPanRegion; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; case 24: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 194) { parse_vPanRegion: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_vpanregion())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(802)) goto parse_valid; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region valid = 100; case 100: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 802) { parse_valid: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_valid())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(808)) goto parse_color; break; } - + // optional uint32 color = 101; case 101: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 808) { parse_color: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &color_))); set_has_color(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(816)) goto parse_filter; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Filter filter = 102; case 102: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 816) { parse_filter: int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< @@ -2592,302 +2995,314 @@ bool LayersPacket_Layer::MergePartialFromCodedStream( input, &value))); if (::mozilla::layers::layerscope::LayersPacket_Layer_Filter_IsValid(value)) { set_filter(static_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Filter >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); } } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(824)) goto parse_refID; break; } - + // optional uint64 refID = 103; case 103: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 824) { parse_refID: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &refid_))); set_has_refid(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(834)) goto parse_size; break; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Size size = 104; case 104: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 834) { parse_size: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_size())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.LayersPacket.Layer) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.LayersPacket.Layer) + return false; #undef DO_ } void LayersPacket_Layer::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.LayersPacket.Layer) // required .mozilla.layers.layerscope.LayersPacket.Layer.LayerType type = 1; if (has_type()) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 1, this->type(), output); } - + // required uint64 ptr = 2; if (has_ptr()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(2, this->ptr(), output); } - + // required uint64 parentPtr = 3; if (has_parentptr()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(3, this->parentptr(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Rect clip = 10; if (has_clip()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 10, this->clip(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 11; if (has_transform()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 11, this->transform(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 12; if (has_vregion()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 12, this->vregion(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Shadow shadow = 13; if (has_shadow()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 13, this->shadow(), output); } - + // optional float opacity = 14; if (has_opacity()) { ::google::protobuf::internal::WireFormatLite::WriteFloat(14, this->opacity(), output); } - + // optional bool cOpaque = 15; if (has_copaque()) { ::google::protobuf::internal::WireFormatLite::WriteBool(15, this->copaque(), output); } - + // optional bool cAlpha = 16; if (has_calpha()) { ::google::protobuf::internal::WireFormatLite::WriteBool(16, this->calpha(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.ScrollingDirect direct = 17; if (has_direct()) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 17, this->direct(), output); } - + // optional uint64 barID = 18; if (has_barid()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(18, this->barid(), output); } - + // optional uint64 mask = 19; if (has_mask()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(19, this->mask(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; if (has_hitregion()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 20, this->hitregion(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; if (has_dispatchregion()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 21, this->dispatchregion(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; if (has_noactionregion()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 22, this->noactionregion(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; if (has_hpanregion()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 23, this->hpanregion(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; if (has_vpanregion()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 24, this->vpanregion(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region valid = 100; if (has_valid()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 100, this->valid(), output); } - + // optional uint32 color = 101; if (has_color()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(101, this->color(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Filter filter = 102; if (has_filter()) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 102, this->filter(), output); } - + // optional uint64 refID = 103; if (has_refid()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(103, this->refid(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Size size = 104; if (has_size()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 104, this->size(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.LayersPacket.Layer) } int LayersPacket_Layer::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // required .mozilla.layers.layerscope.LayersPacket.Layer.LayerType type = 1; if (has_type()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); } - + // required uint64 ptr = 2; if (has_ptr()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt64Size( this->ptr()); } - + // required uint64 parentPtr = 3; if (has_parentptr()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt64Size( this->parentptr()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Rect clip = 10; if (has_clip()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->clip()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 11; if (has_transform()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->transform()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 12; if (has_vregion()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->vregion()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Shadow shadow = 13; if (has_shadow()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->shadow()); } - + // optional float opacity = 14; if (has_opacity()) { total_size += 1 + 4; } - + } if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { // optional bool cOpaque = 15; if (has_copaque()) { total_size += 1 + 1; } - + // optional bool cAlpha = 16; if (has_calpha()) { total_size += 2 + 1; } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.ScrollingDirect direct = 17; if (has_direct()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->direct()); } - + // optional uint64 barID = 18; if (has_barid()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::UInt64Size( this->barid()); } - + // optional uint64 mask = 19; if (has_mask()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::UInt64Size( this->mask()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; if (has_hitregion()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->hitregion()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; if (has_dispatchregion()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->dispatchregion()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; if (has_noactionregion()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->noactionregion()); } - + } if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) { // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; @@ -2896,49 +3311,51 @@ int LayersPacket_Layer::ByteSize() const { ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->hpanregion()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; if (has_vpanregion()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->vpanregion()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region valid = 100; if (has_valid()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->valid()); } - + // optional uint32 color = 101; if (has_color()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->color()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Filter filter = 102; if (has_filter()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->filter()); } - + // optional uint64 refID = 103; if (has_refid()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::UInt64Size( this->refid()); } - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Size size = 104; if (has_size()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->size()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -3027,6 +3444,7 @@ void LayersPacket_Layer::MergeFrom(const LayersPacket_Layer& from) { mutable_size()->::mozilla::layers::layerscope::LayersPacket_Layer_Size::MergeFrom(from.size()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void LayersPacket_Layer::CopyFrom(const LayersPacket_Layer& from) { @@ -3037,7 +3455,7 @@ void LayersPacket_Layer::CopyFrom(const LayersPacket_Layer& from) { bool LayersPacket_Layer::IsInitialized() const { if ((_has_bits_[0] & 0x00000007) != 0x00000007) return false; - + return true; } @@ -3067,6 +3485,7 @@ void LayersPacket_Layer::Swap(LayersPacket_Layer* other) { std::swap(refid_, other->refid_); std::swap(size_, other->size_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -3085,6 +3504,7 @@ const int LayersPacket::kLayerFieldNumber; LayersPacket::LayersPacket() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.LayersPacket) } void LayersPacket::InitAsDefaultInstance() { @@ -3094,6 +3514,7 @@ LayersPacket::LayersPacket(const LayersPacket& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.LayersPacket) } void LayersPacket::SharedCtor() { @@ -3102,11 +3523,16 @@ void LayersPacket::SharedCtor() { } LayersPacket::~LayersPacket() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.LayersPacket) SharedDtor(); } void LayersPacket::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -3116,7 +3542,12 @@ void LayersPacket::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const LayersPacket& LayersPacket::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } LayersPacket* LayersPacket::default_instance_ = NULL; @@ -3128,57 +3559,76 @@ LayersPacket* LayersPacket::New() const { void LayersPacket::Clear() { layer_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool LayersPacket::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.LayersPacket) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated .mozilla.layers.layerscope.LayersPacket.Layer layer = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 10) { parse_layer: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, add_layer())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(10)) goto parse_layer; - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.LayersPacket) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.LayersPacket) + return false; #undef DO_ } void LayersPacket::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.LayersPacket) // repeated .mozilla.layers.layerscope.LayersPacket.Layer layer = 1; for (int i = 0; i < this->layer_size(); i++) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 1, this->layer(i), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.LayersPacket) } int LayersPacket::ByteSize() const { int total_size = 0; - + // repeated .mozilla.layers.layerscope.LayersPacket.Layer layer = 1; total_size += 1 * this->layer_size(); for (int i = 0; i < this->layer_size(); i++) { @@ -3186,7 +3636,9 @@ int LayersPacket::ByteSize() const { ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->layer(i)); } - + + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -3201,6 +3653,7 @@ void LayersPacket::CheckTypeAndMergeFrom( void LayersPacket::MergeFrom(const LayersPacket& from) { GOOGLE_CHECK_NE(&from, this); layer_.MergeFrom(from.layer_); + mutable_unknown_fields()->append(from.unknown_fields()); } void LayersPacket::CopyFrom(const LayersPacket& from) { @@ -3210,10 +3663,8 @@ void LayersPacket::CopyFrom(const LayersPacket& from) { } bool LayersPacket::IsInitialized() const { - - for (int i = 0; i < layer_size(); i++) { - if (!this->layer(i).IsInitialized()) return false; - } + + if (!::google::protobuf::internal::AllAreInitialized(this->layer())) return false; return true; } @@ -3221,6 +3672,7 @@ void LayersPacket::Swap(LayersPacket* other) { if (other != this) { layer_.Swap(&other->layer_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -3239,6 +3691,7 @@ const int MetaPacket::kComposedByHwcFieldNumber; MetaPacket::MetaPacket() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.MetaPacket) } void MetaPacket::InitAsDefaultInstance() { @@ -3248,6 +3701,7 @@ MetaPacket::MetaPacket(const MetaPacket& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.MetaPacket) } void MetaPacket::SharedCtor() { @@ -3257,11 +3711,16 @@ void MetaPacket::SharedCtor() { } MetaPacket::~MetaPacket() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.MetaPacket) SharedDtor(); } void MetaPacket::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -3271,7 +3730,12 @@ void MetaPacket::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const MetaPacket& MetaPacket::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } MetaPacket* MetaPacket::default_instance_ = NULL; @@ -3281,67 +3745,86 @@ MetaPacket* MetaPacket::New() const { } void MetaPacket::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - composedbyhwc_ = false; - } + composedbyhwc_ = false; ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool MetaPacket::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.MetaPacket) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional bool composedByHwc = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &composedbyhwc_))); set_has_composedbyhwc(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.MetaPacket) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.MetaPacket) + return false; #undef DO_ } void MetaPacket::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.MetaPacket) // optional bool composedByHwc = 1; if (has_composedbyhwc()) { ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->composedbyhwc(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.MetaPacket) } int MetaPacket::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // optional bool composedByHwc = 1; if (has_composedbyhwc()) { total_size += 1 + 1; } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -3360,6 +3843,7 @@ void MetaPacket::MergeFrom(const MetaPacket& from) { set_composedbyhwc(from.composedbyhwc()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void MetaPacket::CopyFrom(const MetaPacket& from) { @@ -3369,7 +3853,7 @@ void MetaPacket::CopyFrom(const MetaPacket& from) { } bool MetaPacket::IsInitialized() const { - + return true; } @@ -3377,6 +3861,7 @@ void MetaPacket::Swap(MetaPacket* other) { if (other != this) { std::swap(composedbyhwc_, other->composedbyhwc_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -3398,6 +3883,7 @@ const int DrawPacket_Rect::kHFieldNumber; DrawPacket_Rect::DrawPacket_Rect() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.DrawPacket.Rect) } void DrawPacket_Rect::InitAsDefaultInstance() { @@ -3407,6 +3893,7 @@ DrawPacket_Rect::DrawPacket_Rect(const DrawPacket_Rect& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.DrawPacket.Rect) } void DrawPacket_Rect::SharedCtor() { @@ -3419,11 +3906,16 @@ void DrawPacket_Rect::SharedCtor() { } DrawPacket_Rect::~DrawPacket_Rect() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.DrawPacket.Rect) SharedDtor(); } void DrawPacket_Rect::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -3433,7 +3925,12 @@ void DrawPacket_Rect::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const DrawPacket_Rect& DrawPacket_Rect::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } DrawPacket_Rect* DrawPacket_Rect::default_instance_ = NULL; @@ -3443,148 +3940,175 @@ DrawPacket_Rect* DrawPacket_Rect::New() const { } void DrawPacket_Rect::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - x_ = 0; - y_ = 0; - w_ = 0; - h_ = 0; - } +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(x_, h_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool DrawPacket_Rect::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.DrawPacket.Rect) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // required float x = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) { + if (tag == 13) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( input, &x_))); set_has_x(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(21)) goto parse_y; break; } - + // required float y = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) { + if (tag == 21) { parse_y: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( input, &y_))); set_has_y(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(29)) goto parse_w; break; } - + // required float w = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) { + if (tag == 29) { parse_w: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( input, &w_))); set_has_w(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(37)) goto parse_h; break; } - + // required float h = 4; case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) { + if (tag == 37) { parse_h: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( input, &h_))); set_has_h(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.DrawPacket.Rect) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.DrawPacket.Rect) + return false; #undef DO_ } void DrawPacket_Rect::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.DrawPacket.Rect) // required float x = 1; if (has_x()) { ::google::protobuf::internal::WireFormatLite::WriteFloat(1, this->x(), output); } - + // required float y = 2; if (has_y()) { ::google::protobuf::internal::WireFormatLite::WriteFloat(2, this->y(), output); } - + // required float w = 3; if (has_w()) { ::google::protobuf::internal::WireFormatLite::WriteFloat(3, this->w(), output); } - + // required float h = 4; if (has_h()) { ::google::protobuf::internal::WireFormatLite::WriteFloat(4, this->h(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.DrawPacket.Rect) } int DrawPacket_Rect::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // required float x = 1; if (has_x()) { total_size += 1 + 4; } - + // required float y = 2; if (has_y()) { total_size += 1 + 4; } - + // required float w = 3; if (has_w()) { total_size += 1 + 4; } - + // required float h = 4; if (has_h()) { total_size += 1 + 4; } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -3612,6 +4136,7 @@ void DrawPacket_Rect::MergeFrom(const DrawPacket_Rect& from) { set_h(from.h()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void DrawPacket_Rect::CopyFrom(const DrawPacket_Rect& from) { @@ -3622,7 +4147,7 @@ void DrawPacket_Rect::CopyFrom(const DrawPacket_Rect& from) { bool DrawPacket_Rect::IsInitialized() const { if ((_has_bits_[0] & 0x0000000f) != 0x0000000f) return false; - + return true; } @@ -3633,6 +4158,7 @@ void DrawPacket_Rect::Swap(DrawPacket_Rect* other) { std::swap(w_, other->w_); std::swap(h_, other->h_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -3656,6 +4182,7 @@ const int DrawPacket::kLayerrefFieldNumber; DrawPacket::DrawPacket() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.DrawPacket) } void DrawPacket::InitAsDefaultInstance() { @@ -3665,6 +4192,7 @@ DrawPacket::DrawPacket(const DrawPacket& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.DrawPacket) } void DrawPacket::SharedCtor() { @@ -3677,11 +4205,16 @@ void DrawPacket::SharedCtor() { } DrawPacket::~DrawPacket() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.DrawPacket) SharedDtor(); } void DrawPacket::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -3691,7 +4224,12 @@ void DrawPacket::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const DrawPacket& DrawPacket::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } DrawPacket* DrawPacket::default_instance_ = NULL; @@ -3701,202 +4239,224 @@ DrawPacket* DrawPacket::New() const { } void DrawPacket::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - offsetx_ = 0; - offsety_ = 0; - totalrects_ = 0u; - layerref_ = GOOGLE_ULONGLONG(0); - } +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(offsetx_, offsety_); + ZR_(layerref_, totalrects_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + mvmatrix_.Clear(); layerrect_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool DrawPacket::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.DrawPacket) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // required float offsetX = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) { + if (tag == 13) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( input, &offsetx_))); set_has_offsetx(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(21)) goto parse_offsetY; break; } - + // required float offsetY = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) { + if (tag == 21) { parse_offsetY: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( input, &offsety_))); set_has_offsety(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(29)) goto parse_mvMatrix; break; } - + // repeated float mvMatrix = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED32) { + if (tag == 29) { parse_mvMatrix: DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( 1, 29, input, this->mutable_mvmatrix()))); - } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) - == ::google::protobuf::internal::WireFormatLite:: - WIRETYPE_LENGTH_DELIMITED) { + } else if (tag == 26) { DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline< float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( input, this->mutable_mvmatrix()))); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(29)) goto parse_mvMatrix; if (input->ExpectTag(32)) goto parse_totalRects; break; } - + // required uint32 totalRects = 4; case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 32) { parse_totalRects: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( input, &totalrects_))); set_has_totalrects(); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(42)) goto parse_layerRect; break; } - + // repeated .mozilla.layers.layerscope.DrawPacket.Rect layerRect = 5; case 5: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 42) { parse_layerRect: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, add_layerrect())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(42)) goto parse_layerRect; if (input->ExpectTag(48)) goto parse_layerref; break; } - + // required uint64 layerref = 6; case 6: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 48) { parse_layerref: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &layerref_))); set_has_layerref(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.DrawPacket) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.DrawPacket) + return false; #undef DO_ } void DrawPacket::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.DrawPacket) // required float offsetX = 1; if (has_offsetx()) { ::google::protobuf::internal::WireFormatLite::WriteFloat(1, this->offsetx(), output); } - + // required float offsetY = 2; if (has_offsety()) { ::google::protobuf::internal::WireFormatLite::WriteFloat(2, this->offsety(), output); } - + // repeated float mvMatrix = 3; for (int i = 0; i < this->mvmatrix_size(); i++) { ::google::protobuf::internal::WireFormatLite::WriteFloat( 3, this->mvmatrix(i), output); } - + // required uint32 totalRects = 4; if (has_totalrects()) { ::google::protobuf::internal::WireFormatLite::WriteUInt32(4, this->totalrects(), output); } - + // repeated .mozilla.layers.layerscope.DrawPacket.Rect layerRect = 5; for (int i = 0; i < this->layerrect_size(); i++) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 5, this->layerrect(i), output); } - + // required uint64 layerref = 6; if (has_layerref()) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(6, this->layerref(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.DrawPacket) } int DrawPacket::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // required float offsetX = 1; if (has_offsetx()) { total_size += 1 + 4; } - + // required float offsetY = 2; if (has_offsety()) { total_size += 1 + 4; } - + // required uint32 totalRects = 4; if (has_totalrects()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt32Size( this->totalrects()); } - + // required uint64 layerref = 6; if (has_layerref()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt64Size( this->layerref()); } - + } // repeated float mvMatrix = 3; { @@ -3904,7 +4464,7 @@ int DrawPacket::ByteSize() const { data_size = 4 * this->mvmatrix_size(); total_size += 1 * this->mvmatrix_size() + data_size; } - + // repeated .mozilla.layers.layerscope.DrawPacket.Rect layerRect = 5; total_size += 1 * this->layerrect_size(); for (int i = 0; i < this->layerrect_size(); i++) { @@ -3912,7 +4472,9 @@ int DrawPacket::ByteSize() const { ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->layerrect(i)); } - + + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -3942,6 +4504,7 @@ void DrawPacket::MergeFrom(const DrawPacket& from) { set_layerref(from.layerref()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void DrawPacket::CopyFrom(const DrawPacket& from) { @@ -3952,10 +4515,8 @@ void DrawPacket::CopyFrom(const DrawPacket& from) { bool DrawPacket::IsInitialized() const { if ((_has_bits_[0] & 0x0000002b) != 0x0000002b) return false; - - for (int i = 0; i < layerrect_size(); i++) { - if (!this->layerrect(i).IsInitialized()) return false; - } + + if (!::google::protobuf::internal::AllAreInitialized(this->layerrect())) return false; return true; } @@ -3968,6 +4529,7 @@ void DrawPacket::Swap(DrawPacket* other) { layerrect_.Swap(&other->layerrect_); std::swap(layerref_, other->layerref_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -4019,21 +4581,53 @@ const int Packet::kDrawFieldNumber; Packet::Packet() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.Packet) } void Packet::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + frame_ = const_cast< ::mozilla::layers::layerscope::FramePacket*>( + ::mozilla::layers::layerscope::FramePacket::internal_default_instance()); +#else frame_ = const_cast< ::mozilla::layers::layerscope::FramePacket*>(&::mozilla::layers::layerscope::FramePacket::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + color_ = const_cast< ::mozilla::layers::layerscope::ColorPacket*>( + ::mozilla::layers::layerscope::ColorPacket::internal_default_instance()); +#else color_ = const_cast< ::mozilla::layers::layerscope::ColorPacket*>(&::mozilla::layers::layerscope::ColorPacket::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + texture_ = const_cast< ::mozilla::layers::layerscope::TexturePacket*>( + ::mozilla::layers::layerscope::TexturePacket::internal_default_instance()); +#else texture_ = const_cast< ::mozilla::layers::layerscope::TexturePacket*>(&::mozilla::layers::layerscope::TexturePacket::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + layers_ = const_cast< ::mozilla::layers::layerscope::LayersPacket*>( + ::mozilla::layers::layerscope::LayersPacket::internal_default_instance()); +#else layers_ = const_cast< ::mozilla::layers::layerscope::LayersPacket*>(&::mozilla::layers::layerscope::LayersPacket::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + meta_ = const_cast< ::mozilla::layers::layerscope::MetaPacket*>( + ::mozilla::layers::layerscope::MetaPacket::internal_default_instance()); +#else meta_ = const_cast< ::mozilla::layers::layerscope::MetaPacket*>(&::mozilla::layers::layerscope::MetaPacket::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + draw_ = const_cast< ::mozilla::layers::layerscope::DrawPacket*>( + ::mozilla::layers::layerscope::DrawPacket::internal_default_instance()); +#else draw_ = const_cast< ::mozilla::layers::layerscope::DrawPacket*>(&::mozilla::layers::layerscope::DrawPacket::default_instance()); +#endif } Packet::Packet(const Packet& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.Packet) } void Packet::SharedCtor() { @@ -4049,11 +4643,16 @@ void Packet::SharedCtor() { } Packet::~Packet() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.Packet) SharedDtor(); } void Packet::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif delete frame_; delete color_; delete texture_; @@ -4069,7 +4668,12 @@ void Packet::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const Packet& Packet::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } Packet* Packet::default_instance_ = NULL; @@ -4079,7 +4683,7 @@ Packet* Packet::New() const { } void Packet::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (_has_bits_[0 / 32] & 127) { type_ = 1; if (has_frame()) { if (frame_ != NULL) frame_->::mozilla::layers::layerscope::FramePacket::Clear(); @@ -4101,230 +4705,248 @@ void Packet::Clear() { } } ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool Packet::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.Packet) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // required .mozilla.layers.layerscope.Packet.DataType type = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); if (::mozilla::layers::layerscope::Packet_DataType_IsValid(value)) { set_type(static_cast< ::mozilla::layers::layerscope::Packet_DataType >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); } } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(18)) goto parse_frame; break; } - + // optional .mozilla.layers.layerscope.FramePacket frame = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 18) { parse_frame: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_frame())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(26)) goto parse_color; break; } - + // optional .mozilla.layers.layerscope.ColorPacket color = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 26) { parse_color: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_color())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(34)) goto parse_texture; break; } - + // optional .mozilla.layers.layerscope.TexturePacket texture = 4; case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 34) { parse_texture: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_texture())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(42)) goto parse_layers; break; } - + // optional .mozilla.layers.layerscope.LayersPacket layers = 5; case 5: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 42) { parse_layers: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_layers())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(50)) goto parse_meta; break; } - + // optional .mozilla.layers.layerscope.MetaPacket meta = 6; case 6: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 50) { parse_meta: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_meta())); } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(58)) goto parse_draw; break; } - + // optional .mozilla.layers.layerscope.DrawPacket draw = 7; case 7: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 58) { parse_draw: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, mutable_draw())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.Packet) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.Packet) + return false; #undef DO_ } void Packet::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.Packet) // required .mozilla.layers.layerscope.Packet.DataType type = 1; if (has_type()) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 1, this->type(), output); } - + // optional .mozilla.layers.layerscope.FramePacket frame = 2; if (has_frame()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 2, this->frame(), output); } - + // optional .mozilla.layers.layerscope.ColorPacket color = 3; if (has_color()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 3, this->color(), output); } - + // optional .mozilla.layers.layerscope.TexturePacket texture = 4; if (has_texture()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 4, this->texture(), output); } - + // optional .mozilla.layers.layerscope.LayersPacket layers = 5; if (has_layers()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 5, this->layers(), output); } - + // optional .mozilla.layers.layerscope.MetaPacket meta = 6; if (has_meta()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 6, this->meta(), output); } - + // optional .mozilla.layers.layerscope.DrawPacket draw = 7; if (has_draw()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( 7, this->draw(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.Packet) } int Packet::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // required .mozilla.layers.layerscope.Packet.DataType type = 1; if (has_type()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); } - + // optional .mozilla.layers.layerscope.FramePacket frame = 2; if (has_frame()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->frame()); } - + // optional .mozilla.layers.layerscope.ColorPacket color = 3; if (has_color()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->color()); } - + // optional .mozilla.layers.layerscope.TexturePacket texture = 4; if (has_texture()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->texture()); } - + // optional .mozilla.layers.layerscope.LayersPacket layers = 5; if (has_layers()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->layers()); } - + // optional .mozilla.layers.layerscope.MetaPacket meta = 6; if (has_meta()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->meta()); } - + // optional .mozilla.layers.layerscope.DrawPacket draw = 7; if (has_draw()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( this->draw()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -4361,6 +4983,7 @@ void Packet::MergeFrom(const Packet& from) { mutable_draw()->::mozilla::layers::layerscope::DrawPacket::MergeFrom(from.draw()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void Packet::CopyFrom(const Packet& from) { @@ -4371,7 +4994,7 @@ void Packet::CopyFrom(const Packet& from) { bool Packet::IsInitialized() const { if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; - + if (has_color()) { if (!this->color().IsInitialized()) return false; } @@ -4397,6 +5020,7 @@ void Packet::Swap(Packet* other) { std::swap(meta_, other->meta_); std::swap(draw_, other->draw_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } @@ -4435,6 +5059,7 @@ const int CommandPacket::kValueFieldNumber; CommandPacket::CommandPacket() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.layers.layerscope.CommandPacket) } void CommandPacket::InitAsDefaultInstance() { @@ -4444,6 +5069,7 @@ CommandPacket::CommandPacket(const CommandPacket& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.layers.layerscope.CommandPacket) } void CommandPacket::SharedCtor() { @@ -4454,11 +5080,16 @@ void CommandPacket::SharedCtor() { } CommandPacket::~CommandPacket() { + // @@protoc_insertion_point(destructor:mozilla.layers.layerscope.CommandPacket) SharedDtor(); } void CommandPacket::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } @@ -4468,7 +5099,12 @@ void CommandPacket::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const CommandPacket& CommandPacket::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); return *default_instance_; +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_LayerScopePacket_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_LayerScopePacket_2eproto(); +#endif + return *default_instance_; } CommandPacket* CommandPacket::default_instance_ = NULL; @@ -4478,99 +5114,133 @@ CommandPacket* CommandPacket::New() const { } void CommandPacket::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - type_ = 0; - value_ = false; - } +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(type_, value_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } bool CommandPacket::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:mozilla.layers.layerscope.CommandPacket) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // required .mozilla.layers.layerscope.CommandPacket.CmdType type = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 8) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); if (::mozilla::layers::layerscope::CommandPacket_CmdType_IsValid(value)) { set_type(static_cast< ::mozilla::layers::layerscope::CommandPacket_CmdType >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); } } else { - goto handle_uninterpreted; + goto handle_unusual; } if (input->ExpectTag(16)) goto parse_value; break; } - + // optional bool value = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + if (tag == 16) { parse_value: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &value_))); set_has_value(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:mozilla.layers.layerscope.CommandPacket) return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.layers.layerscope.CommandPacket) + return false; #undef DO_ } void CommandPacket::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.layers.layerscope.CommandPacket) // required .mozilla.layers.layerscope.CommandPacket.CmdType type = 1; if (has_type()) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 1, this->type(), output); } - + // optional bool value = 2; if (has_value()) { ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->value(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:mozilla.layers.layerscope.CommandPacket) } int CommandPacket::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // required .mozilla.layers.layerscope.CommandPacket.CmdType type = 1; if (has_type()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); } - + // optional bool value = 2; if (has_value()) { total_size += 1 + 1; } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); @@ -4592,6 +5262,7 @@ void CommandPacket::MergeFrom(const CommandPacket& from) { set_value(from.value()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } void CommandPacket::CopyFrom(const CommandPacket& from) { @@ -4602,7 +5273,7 @@ void CommandPacket::CopyFrom(const CommandPacket& from) { bool CommandPacket::IsInitialized() const { if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; - + return true; } @@ -4611,6 +5282,7 @@ void CommandPacket::Swap(CommandPacket* other) { std::swap(type_, other->type_); std::swap(value_, other->value_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } diff --git a/gfx/layers/protobuf/LayerScopePacket.pb.h b/gfx/layers/protobuf/LayerScopePacket.pb.h index 8c1d4dc9d3272..9e27d8a44f07e 100644 --- a/gfx/layers/protobuf/LayerScopePacket.pb.h +++ b/gfx/layers/protobuf/LayerScopePacket.pb.h @@ -8,18 +8,19 @@ #include -#if GOOGLE_PROTOBUF_VERSION < 2004000 +#if GOOGLE_PROTOBUF_VERSION < 2006000 #error This file was generated by a newer version of protoc which is #error incompatible with your Protocol Buffer headers. Please update #error your headers. #endif -#if 2004001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#if 2006001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION #error This file was generated by an older version of protoc which is #error incompatible with your Protocol Buffer headers. Please #error regenerate this file with a newer version of protoc. #endif #include +#include #include #include // @@protoc_insertion_point(includes) @@ -118,66 +119,88 @@ class FramePacket : public ::google::protobuf::MessageLite { public: FramePacket(); virtual ~FramePacket(); - + FramePacket(const FramePacket& from); - + inline FramePacket& operator=(const FramePacket& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const FramePacket& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const FramePacket* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(FramePacket* other); - + // implements Message ---------------------------------------------- - + FramePacket* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const FramePacket& from); void MergeFrom(const FramePacket& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // optional uint64 value = 1; inline bool has_value() const; inline void clear_value(); static const int kValueFieldNumber = 1; inline ::google::protobuf::uint64 value() const; inline void set_value(::google::protobuf::uint64 value); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.FramePacket) private: inline void set_has_value(); inline void clear_has_value(); - - ::google::protobuf::uint64 value_; - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; - + ::google::protobuf::uint64 value_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static FramePacket* default_instance_; }; @@ -187,73 +210,91 @@ class ColorPacket : public ::google::protobuf::MessageLite { public: ColorPacket(); virtual ~ColorPacket(); - + ColorPacket(const ColorPacket& from); - + inline ColorPacket& operator=(const ColorPacket& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const ColorPacket& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ColorPacket* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(ColorPacket* other); - + // implements Message ---------------------------------------------- - + ColorPacket* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const ColorPacket& from); void MergeFrom(const ColorPacket& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // required uint64 layerref = 1; inline bool has_layerref() const; inline void clear_layerref(); static const int kLayerrefFieldNumber = 1; inline ::google::protobuf::uint64 layerref() const; inline void set_layerref(::google::protobuf::uint64 value); - + // optional uint32 width = 2; inline bool has_width() const; inline void clear_width(); static const int kWidthFieldNumber = 2; inline ::google::protobuf::uint32 width() const; inline void set_width(::google::protobuf::uint32 value); - + // optional uint32 height = 3; inline bool has_height() const; inline void clear_height(); static const int kHeightFieldNumber = 3; inline ::google::protobuf::uint32 height() const; inline void set_height(::google::protobuf::uint32 value); - + // optional uint32 color = 4; inline bool has_color() const; inline void clear_color(); static const int kColorFieldNumber = 4; inline ::google::protobuf::uint32 color() const; inline void set_color(::google::protobuf::uint32 value); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.ColorPacket) private: inline void set_has_layerref(); @@ -264,19 +305,23 @@ class ColorPacket : public ::google::protobuf::MessageLite { inline void clear_has_height(); inline void set_has_color(); inline void clear_has_color(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; ::google::protobuf::uint64 layerref_; ::google::protobuf::uint32 width_; ::google::protobuf::uint32 height_; ::google::protobuf::uint32 color_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static ColorPacket* default_instance_; }; @@ -286,101 +331,119 @@ class TexturePacket : public ::google::protobuf::MessageLite { public: TexturePacket(); virtual ~TexturePacket(); - + TexturePacket(const TexturePacket& from); - + inline TexturePacket& operator=(const TexturePacket& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const TexturePacket& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const TexturePacket* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(TexturePacket* other); - + // implements Message ---------------------------------------------- - + TexturePacket* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const TexturePacket& from); void MergeFrom(const TexturePacket& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // required uint64 layerref = 1; inline bool has_layerref() const; inline void clear_layerref(); static const int kLayerrefFieldNumber = 1; inline ::google::protobuf::uint64 layerref() const; inline void set_layerref(::google::protobuf::uint64 value); - + // optional uint32 width = 2; inline bool has_width() const; inline void clear_width(); static const int kWidthFieldNumber = 2; inline ::google::protobuf::uint32 width() const; inline void set_width(::google::protobuf::uint32 value); - + // optional uint32 height = 3; inline bool has_height() const; inline void clear_height(); static const int kHeightFieldNumber = 3; inline ::google::protobuf::uint32 height() const; inline void set_height(::google::protobuf::uint32 value); - + // optional uint32 stride = 4; inline bool has_stride() const; inline void clear_stride(); static const int kStrideFieldNumber = 4; inline ::google::protobuf::uint32 stride() const; inline void set_stride(::google::protobuf::uint32 value); - + // optional uint32 name = 5; inline bool has_name() const; inline void clear_name(); static const int kNameFieldNumber = 5; inline ::google::protobuf::uint32 name() const; inline void set_name(::google::protobuf::uint32 value); - + // optional uint32 target = 6; inline bool has_target() const; inline void clear_target(); static const int kTargetFieldNumber = 6; inline ::google::protobuf::uint32 target() const; inline void set_target(::google::protobuf::uint32 value); - + // optional uint32 dataformat = 7; inline bool has_dataformat() const; inline void clear_dataformat(); static const int kDataformatFieldNumber = 7; inline ::google::protobuf::uint32 dataformat() const; inline void set_dataformat(::google::protobuf::uint32 value); - + // optional uint64 glcontext = 8; inline bool has_glcontext() const; inline void clear_glcontext(); static const int kGlcontextFieldNumber = 8; inline ::google::protobuf::uint64 glcontext() const; inline void set_glcontext(::google::protobuf::uint64 value); - + // optional bytes data = 9; inline bool has_data() const; inline void clear_data(); @@ -391,7 +454,8 @@ class TexturePacket : public ::google::protobuf::MessageLite { inline void set_data(const void* value, size_t size); inline ::std::string* mutable_data(); inline ::std::string* release_data(); - + inline void set_allocated_data(::std::string* data); + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.TexturePacket) private: inline void set_has_layerref(); @@ -412,7 +476,11 @@ class TexturePacket : public ::google::protobuf::MessageLite { inline void clear_has_glcontext(); inline void set_has_data(); inline void clear_has_data(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; ::google::protobuf::uint64 layerref_; ::google::protobuf::uint32 width_; ::google::protobuf::uint32 height_; @@ -422,14 +490,14 @@ class TexturePacket : public ::google::protobuf::MessageLite { ::google::protobuf::uint32 dataformat_; ::google::protobuf::uint64 glcontext_; ::std::string* data_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(9 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static TexturePacket* default_instance_; }; @@ -439,76 +507,98 @@ class LayersPacket_Layer_Size : public ::google::protobuf::MessageLite { public: LayersPacket_Layer_Size(); virtual ~LayersPacket_Layer_Size(); - + LayersPacket_Layer_Size(const LayersPacket_Layer_Size& from); - + inline LayersPacket_Layer_Size& operator=(const LayersPacket_Layer_Size& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const LayersPacket_Layer_Size& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const LayersPacket_Layer_Size* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(LayersPacket_Layer_Size* other); - + // implements Message ---------------------------------------------- - + LayersPacket_Layer_Size* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const LayersPacket_Layer_Size& from); void MergeFrom(const LayersPacket_Layer_Size& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // optional int32 w = 1; inline bool has_w() const; inline void clear_w(); static const int kWFieldNumber = 1; inline ::google::protobuf::int32 w() const; inline void set_w(::google::protobuf::int32 value); - + // optional int32 h = 2; inline bool has_h() const; inline void clear_h(); static const int kHFieldNumber = 2; inline ::google::protobuf::int32 h() const; inline void set_h(::google::protobuf::int32 value); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.LayersPacket.Layer.Size) private: inline void set_has_w(); inline void clear_has_w(); inline void set_has_h(); inline void clear_has_h(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; ::google::protobuf::int32 w_; ::google::protobuf::int32 h_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static LayersPacket_Layer_Size* default_instance_; }; @@ -518,73 +608,91 @@ class LayersPacket_Layer_Rect : public ::google::protobuf::MessageLite { public: LayersPacket_Layer_Rect(); virtual ~LayersPacket_Layer_Rect(); - + LayersPacket_Layer_Rect(const LayersPacket_Layer_Rect& from); - + inline LayersPacket_Layer_Rect& operator=(const LayersPacket_Layer_Rect& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const LayersPacket_Layer_Rect& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const LayersPacket_Layer_Rect* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(LayersPacket_Layer_Rect* other); - + // implements Message ---------------------------------------------- - + LayersPacket_Layer_Rect* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const LayersPacket_Layer_Rect& from); void MergeFrom(const LayersPacket_Layer_Rect& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // optional int32 x = 1; inline bool has_x() const; inline void clear_x(); static const int kXFieldNumber = 1; inline ::google::protobuf::int32 x() const; inline void set_x(::google::protobuf::int32 value); - + // optional int32 y = 2; inline bool has_y() const; inline void clear_y(); static const int kYFieldNumber = 2; inline ::google::protobuf::int32 y() const; inline void set_y(::google::protobuf::int32 value); - + // optional int32 w = 3; inline bool has_w() const; inline void clear_w(); static const int kWFieldNumber = 3; inline ::google::protobuf::int32 w() const; inline void set_w(::google::protobuf::int32 value); - + // optional int32 h = 4; inline bool has_h() const; inline void clear_h(); static const int kHFieldNumber = 4; inline ::google::protobuf::int32 h() const; inline void set_h(::google::protobuf::int32 value); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.LayersPacket.Layer.Rect) private: inline void set_has_x(); @@ -595,19 +703,23 @@ class LayersPacket_Layer_Rect : public ::google::protobuf::MessageLite { inline void clear_has_w(); inline void set_has_h(); inline void clear_has_h(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; ::google::protobuf::int32 x_; ::google::protobuf::int32 y_; ::google::protobuf::int32 w_; ::google::protobuf::int32 h_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static LayersPacket_Layer_Rect* default_instance_; }; @@ -617,45 +729,63 @@ class LayersPacket_Layer_Region : public ::google::protobuf::MessageLite { public: LayersPacket_Layer_Region(); virtual ~LayersPacket_Layer_Region(); - + LayersPacket_Layer_Region(const LayersPacket_Layer_Region& from); - + inline LayersPacket_Layer_Region& operator=(const LayersPacket_Layer_Region& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const LayersPacket_Layer_Region& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const LayersPacket_Layer_Region* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(LayersPacket_Layer_Region* other); - + // implements Message ---------------------------------------------- - + LayersPacket_Layer_Region* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const LayersPacket_Layer_Region& from); void MergeFrom(const LayersPacket_Layer_Region& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // repeated .mozilla.layers.layerscope.LayersPacket.Layer.Rect r = 1; inline int r_size() const; inline void clear_r(); @@ -667,19 +797,23 @@ class LayersPacket_Layer_Region : public ::google::protobuf::MessageLite { r() const; inline ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer_Rect >* mutable_r(); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.LayersPacket.Layer.Region) private: - - ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer_Rect > r_; - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; - + ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer_Rect > r_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static LayersPacket_Layer_Region* default_instance_; }; @@ -689,59 +823,77 @@ class LayersPacket_Layer_Matrix : public ::google::protobuf::MessageLite { public: LayersPacket_Layer_Matrix(); virtual ~LayersPacket_Layer_Matrix(); - + LayersPacket_Layer_Matrix(const LayersPacket_Layer_Matrix& from); - + inline LayersPacket_Layer_Matrix& operator=(const LayersPacket_Layer_Matrix& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const LayersPacket_Layer_Matrix& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const LayersPacket_Layer_Matrix* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(LayersPacket_Layer_Matrix* other); - + // implements Message ---------------------------------------------- - + LayersPacket_Layer_Matrix* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const LayersPacket_Layer_Matrix& from); void MergeFrom(const LayersPacket_Layer_Matrix& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // optional bool is2D = 1; inline bool has_is2d() const; inline void clear_is2d(); static const int kIs2DFieldNumber = 1; inline bool is2d() const; inline void set_is2d(bool value); - + // optional bool isId = 2; inline bool has_isid() const; inline void clear_isid(); static const int kIsIdFieldNumber = 2; inline bool isid() const; inline void set_isid(bool value); - + // repeated float m = 3; inline int m_size() const; inline void clear_m(); @@ -753,25 +905,29 @@ class LayersPacket_Layer_Matrix : public ::google::protobuf::MessageLite { m() const; inline ::google::protobuf::RepeatedField< float >* mutable_m(); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.LayersPacket.Layer.Matrix) private: inline void set_has_is2d(); inline void clear_has_is2d(); inline void set_has_isid(); inline void clear_has_isid(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; ::google::protobuf::RepeatedField< float > m_; bool is2d_; bool isid_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static LayersPacket_Layer_Matrix* default_instance_; }; @@ -781,45 +937,63 @@ class LayersPacket_Layer_Shadow : public ::google::protobuf::MessageLite { public: LayersPacket_Layer_Shadow(); virtual ~LayersPacket_Layer_Shadow(); - + LayersPacket_Layer_Shadow(const LayersPacket_Layer_Shadow& from); - + inline LayersPacket_Layer_Shadow& operator=(const LayersPacket_Layer_Shadow& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const LayersPacket_Layer_Shadow& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const LayersPacket_Layer_Shadow* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(LayersPacket_Layer_Shadow* other); - + // implements Message ---------------------------------------------- - + LayersPacket_Layer_Shadow* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const LayersPacket_Layer_Shadow& from); void MergeFrom(const LayersPacket_Layer_Shadow& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Rect clip = 1; inline bool has_clip() const; inline void clear_clip(); @@ -827,7 +1001,8 @@ class LayersPacket_Layer_Shadow : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Rect& clip() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* mutable_clip(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* release_clip(); - + inline void set_allocated_clip(::mozilla::layers::layerscope::LayersPacket_Layer_Rect* clip); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 2; inline bool has_transform() const; inline void clear_transform(); @@ -835,7 +1010,8 @@ class LayersPacket_Layer_Shadow : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix& transform() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* mutable_transform(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* release_transform(); - + inline void set_allocated_transform(::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* transform); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 3; inline bool has_vregion() const; inline void clear_vregion(); @@ -843,7 +1019,8 @@ class LayersPacket_Layer_Shadow : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& vregion() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_vregion(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_vregion(); - + inline void set_allocated_vregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* vregion); + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.LayersPacket.Layer.Shadow) private: inline void set_has_clip(); @@ -852,18 +1029,22 @@ class LayersPacket_Layer_Shadow : public ::google::protobuf::MessageLite { inline void clear_has_transform(); inline void set_has_vregion(); inline void clear_has_vregion(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* clip_; ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* transform_; ::mozilla::layers::layerscope::LayersPacket_Layer_Region* vregion_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static LayersPacket_Layer_Shadow* default_instance_; }; @@ -873,49 +1054,67 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { public: LayersPacket_Layer(); virtual ~LayersPacket_Layer(); - + LayersPacket_Layer(const LayersPacket_Layer& from); - + inline LayersPacket_Layer& operator=(const LayersPacket_Layer& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const LayersPacket_Layer& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const LayersPacket_Layer* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(LayersPacket_Layer* other); - + // implements Message ---------------------------------------------- - + LayersPacket_Layer* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const LayersPacket_Layer& from); void MergeFrom(const LayersPacket_Layer& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + typedef LayersPacket_Layer_Size Size; typedef LayersPacket_Layer_Rect Rect; typedef LayersPacket_Layer_Region Region; typedef LayersPacket_Layer_Matrix Matrix; typedef LayersPacket_Layer_Shadow Shadow; - + typedef LayersPacket_Layer_LayerType LayerType; static const LayerType UnknownLayer = LayersPacket_Layer_LayerType_UnknownLayer; static const LayerType LayerManager = LayersPacket_Layer_LayerType_LayerManager; @@ -935,7 +1134,7 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { LayersPacket_Layer_LayerType_LayerType_MAX; static const int LayerType_ARRAYSIZE = LayersPacket_Layer_LayerType_LayerType_ARRAYSIZE; - + typedef LayersPacket_Layer_ScrollingDirect ScrollingDirect; static const ScrollingDirect VERTICAL = LayersPacket_Layer_ScrollingDirect_VERTICAL; static const ScrollingDirect HORIZONTAL = LayersPacket_Layer_ScrollingDirect_HORIZONTAL; @@ -948,7 +1147,7 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { LayersPacket_Layer_ScrollingDirect_ScrollingDirect_MAX; static const int ScrollingDirect_ARRAYSIZE = LayersPacket_Layer_ScrollingDirect_ScrollingDirect_ARRAYSIZE; - + typedef LayersPacket_Layer_Filter Filter; static const Filter FILTER_FAST = LayersPacket_Layer_Filter_FILTER_FAST; static const Filter FILTER_GOOD = LayersPacket_Layer_Filter_FILTER_GOOD; @@ -966,30 +1165,30 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { LayersPacket_Layer_Filter_Filter_MAX; static const int Filter_ARRAYSIZE = LayersPacket_Layer_Filter_Filter_ARRAYSIZE; - + // accessors ------------------------------------------------------- - + // required .mozilla.layers.layerscope.LayersPacket.Layer.LayerType type = 1; inline bool has_type() const; inline void clear_type(); static const int kTypeFieldNumber = 1; inline ::mozilla::layers::layerscope::LayersPacket_Layer_LayerType type() const; inline void set_type(::mozilla::layers::layerscope::LayersPacket_Layer_LayerType value); - + // required uint64 ptr = 2; inline bool has_ptr() const; inline void clear_ptr(); static const int kPtrFieldNumber = 2; inline ::google::protobuf::uint64 ptr() const; inline void set_ptr(::google::protobuf::uint64 value); - + // required uint64 parentPtr = 3; inline bool has_parentptr() const; inline void clear_parentptr(); static const int kParentPtrFieldNumber = 3; inline ::google::protobuf::uint64 parentptr() const; inline void set_parentptr(::google::protobuf::uint64 value); - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Rect clip = 10; inline bool has_clip() const; inline void clear_clip(); @@ -997,7 +1196,8 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Rect& clip() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* mutable_clip(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* release_clip(); - + inline void set_allocated_clip(::mozilla::layers::layerscope::LayersPacket_Layer_Rect* clip); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 11; inline bool has_transform() const; inline void clear_transform(); @@ -1005,7 +1205,8 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix& transform() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* mutable_transform(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* release_transform(); - + inline void set_allocated_transform(::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* transform); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 12; inline bool has_vregion() const; inline void clear_vregion(); @@ -1013,7 +1214,8 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& vregion() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_vregion(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_vregion(); - + inline void set_allocated_vregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* vregion); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Shadow shadow = 13; inline bool has_shadow() const; inline void clear_shadow(); @@ -1021,49 +1223,50 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow& shadow() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow* mutable_shadow(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow* release_shadow(); - + inline void set_allocated_shadow(::mozilla::layers::layerscope::LayersPacket_Layer_Shadow* shadow); + // optional float opacity = 14; inline bool has_opacity() const; inline void clear_opacity(); static const int kOpacityFieldNumber = 14; inline float opacity() const; inline void set_opacity(float value); - + // optional bool cOpaque = 15; inline bool has_copaque() const; inline void clear_copaque(); static const int kCOpaqueFieldNumber = 15; inline bool copaque() const; inline void set_copaque(bool value); - + // optional bool cAlpha = 16; inline bool has_calpha() const; inline void clear_calpha(); static const int kCAlphaFieldNumber = 16; inline bool calpha() const; inline void set_calpha(bool value); - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.ScrollingDirect direct = 17; inline bool has_direct() const; inline void clear_direct(); static const int kDirectFieldNumber = 17; inline ::mozilla::layers::layerscope::LayersPacket_Layer_ScrollingDirect direct() const; inline void set_direct(::mozilla::layers::layerscope::LayersPacket_Layer_ScrollingDirect value); - + // optional uint64 barID = 18; inline bool has_barid() const; inline void clear_barid(); static const int kBarIDFieldNumber = 18; inline ::google::protobuf::uint64 barid() const; inline void set_barid(::google::protobuf::uint64 value); - + // optional uint64 mask = 19; inline bool has_mask() const; inline void clear_mask(); static const int kMaskFieldNumber = 19; inline ::google::protobuf::uint64 mask() const; inline void set_mask(::google::protobuf::uint64 value); - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; inline bool has_hitregion() const; inline void clear_hitregion(); @@ -1071,7 +1274,8 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& hitregion() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_hitregion(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_hitregion(); - + inline void set_allocated_hitregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* hitregion); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; inline bool has_dispatchregion() const; inline void clear_dispatchregion(); @@ -1079,7 +1283,8 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& dispatchregion() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_dispatchregion(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_dispatchregion(); - + inline void set_allocated_dispatchregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* dispatchregion); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; inline bool has_noactionregion() const; inline void clear_noactionregion(); @@ -1087,7 +1292,8 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& noactionregion() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_noactionregion(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_noactionregion(); - + inline void set_allocated_noactionregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* noactionregion); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; inline bool has_hpanregion() const; inline void clear_hpanregion(); @@ -1095,7 +1301,8 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& hpanregion() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_hpanregion(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_hpanregion(); - + inline void set_allocated_hpanregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* hpanregion); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; inline bool has_vpanregion() const; inline void clear_vpanregion(); @@ -1103,7 +1310,8 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& vpanregion() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_vpanregion(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_vpanregion(); - + inline void set_allocated_vpanregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* vpanregion); + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region valid = 100; inline bool has_valid() const; inline void clear_valid(); @@ -1111,28 +1319,29 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& valid() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* mutable_valid(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* release_valid(); - + inline void set_allocated_valid(::mozilla::layers::layerscope::LayersPacket_Layer_Region* valid); + // optional uint32 color = 101; inline bool has_color() const; inline void clear_color(); static const int kColorFieldNumber = 101; inline ::google::protobuf::uint32 color() const; inline void set_color(::google::protobuf::uint32 value); - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Filter filter = 102; inline bool has_filter() const; inline void clear_filter(); static const int kFilterFieldNumber = 102; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Filter filter() const; inline void set_filter(::mozilla::layers::layerscope::LayersPacket_Layer_Filter value); - + // optional uint64 refID = 103; inline bool has_refid() const; inline void clear_refid(); static const int kRefIDFieldNumber = 103; inline ::google::protobuf::uint64 refid() const; inline void set_refid(::google::protobuf::uint64 value); - + // optional .mozilla.layers.layerscope.LayersPacket.Layer.Size size = 104; inline bool has_size() const; inline void clear_size(); @@ -1140,7 +1349,8 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Size& size() const; inline ::mozilla::layers::layerscope::LayersPacket_Layer_Size* mutable_size(); inline ::mozilla::layers::layerscope::LayersPacket_Layer_Size* release_size(); - + inline void set_allocated_size(::mozilla::layers::layerscope::LayersPacket_Layer_Size* size); + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.LayersPacket.Layer) private: inline void set_has_type(); @@ -1189,7 +1399,11 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { inline void clear_has_refid(); inline void set_has_size(); inline void clear_has_size(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; ::google::protobuf::uint64 ptr_; ::google::protobuf::uint64 parentptr_; ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* clip_; @@ -1213,14 +1427,14 @@ class LayersPacket_Layer : public ::google::protobuf::MessageLite { int filter_; ::google::protobuf::uint64 refid_; ::mozilla::layers::layerscope::LayersPacket_Layer_Size* size_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(23 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static LayersPacket_Layer* default_instance_; }; @@ -1230,47 +1444,65 @@ class LayersPacket : public ::google::protobuf::MessageLite { public: LayersPacket(); virtual ~LayersPacket(); - + LayersPacket(const LayersPacket& from); - + inline LayersPacket& operator=(const LayersPacket& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const LayersPacket& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const LayersPacket* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(LayersPacket* other); - + // implements Message ---------------------------------------------- - + LayersPacket* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const LayersPacket& from); void MergeFrom(const LayersPacket& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + typedef LayersPacket_Layer Layer; - + // accessors ------------------------------------------------------- - + // repeated .mozilla.layers.layerscope.LayersPacket.Layer layer = 1; inline int layer_size() const; inline void clear_layer(); @@ -1282,19 +1514,23 @@ class LayersPacket : public ::google::protobuf::MessageLite { layer() const; inline ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer >* mutable_layer(); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.LayersPacket) private: - - ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer > layer_; - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; - + ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer > layer_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static LayersPacket* default_instance_; }; @@ -1304,66 +1540,88 @@ class MetaPacket : public ::google::protobuf::MessageLite { public: MetaPacket(); virtual ~MetaPacket(); - + MetaPacket(const MetaPacket& from); - + inline MetaPacket& operator=(const MetaPacket& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const MetaPacket& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const MetaPacket* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(MetaPacket* other); - + // implements Message ---------------------------------------------- - + MetaPacket* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const MetaPacket& from); void MergeFrom(const MetaPacket& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // optional bool composedByHwc = 1; inline bool has_composedbyhwc() const; inline void clear_composedbyhwc(); static const int kComposedByHwcFieldNumber = 1; inline bool composedbyhwc() const; inline void set_composedbyhwc(bool value); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.MetaPacket) private: inline void set_has_composedbyhwc(); inline void clear_has_composedbyhwc(); - - bool composedbyhwc_; - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; - + bool composedbyhwc_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static MetaPacket* default_instance_; }; @@ -1373,73 +1631,91 @@ class DrawPacket_Rect : public ::google::protobuf::MessageLite { public: DrawPacket_Rect(); virtual ~DrawPacket_Rect(); - + DrawPacket_Rect(const DrawPacket_Rect& from); - + inline DrawPacket_Rect& operator=(const DrawPacket_Rect& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const DrawPacket_Rect& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const DrawPacket_Rect* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(DrawPacket_Rect* other); - + // implements Message ---------------------------------------------- - + DrawPacket_Rect* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const DrawPacket_Rect& from); void MergeFrom(const DrawPacket_Rect& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - + // required float x = 1; inline bool has_x() const; inline void clear_x(); static const int kXFieldNumber = 1; inline float x() const; inline void set_x(float value); - + // required float y = 2; inline bool has_y() const; inline void clear_y(); static const int kYFieldNumber = 2; inline float y() const; inline void set_y(float value); - + // required float w = 3; inline bool has_w() const; inline void clear_w(); static const int kWFieldNumber = 3; inline float w() const; inline void set_w(float value); - + // required float h = 4; inline bool has_h() const; inline void clear_h(); static const int kHFieldNumber = 4; inline float h() const; inline void set_h(float value); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.DrawPacket.Rect) private: inline void set_has_x(); @@ -1450,19 +1726,23 @@ class DrawPacket_Rect : public ::google::protobuf::MessageLite { inline void clear_has_w(); inline void set_has_h(); inline void clear_has_h(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; float x_; float y_; float w_; float h_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static DrawPacket_Rect* default_instance_; }; @@ -1472,61 +1752,79 @@ class DrawPacket : public ::google::protobuf::MessageLite { public: DrawPacket(); virtual ~DrawPacket(); - + DrawPacket(const DrawPacket& from); - + inline DrawPacket& operator=(const DrawPacket& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const DrawPacket& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const DrawPacket* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(DrawPacket* other); - + // implements Message ---------------------------------------------- - + DrawPacket* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const DrawPacket& from); void MergeFrom(const DrawPacket& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + typedef DrawPacket_Rect Rect; - + // accessors ------------------------------------------------------- - + // required float offsetX = 1; inline bool has_offsetx() const; inline void clear_offsetx(); static const int kOffsetXFieldNumber = 1; inline float offsetx() const; inline void set_offsetx(float value); - + // required float offsetY = 2; inline bool has_offsety() const; inline void clear_offsety(); static const int kOffsetYFieldNumber = 2; inline float offsety() const; inline void set_offsety(float value); - + // repeated float mvMatrix = 3; inline int mvmatrix_size() const; inline void clear_mvmatrix(); @@ -1538,14 +1836,14 @@ class DrawPacket : public ::google::protobuf::MessageLite { mvmatrix() const; inline ::google::protobuf::RepeatedField< float >* mutable_mvmatrix(); - + // required uint32 totalRects = 4; inline bool has_totalrects() const; inline void clear_totalrects(); static const int kTotalRectsFieldNumber = 4; inline ::google::protobuf::uint32 totalrects() const; inline void set_totalrects(::google::protobuf::uint32 value); - + // repeated .mozilla.layers.layerscope.DrawPacket.Rect layerRect = 5; inline int layerrect_size() const; inline void clear_layerrect(); @@ -1557,14 +1855,14 @@ class DrawPacket : public ::google::protobuf::MessageLite { layerrect() const; inline ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::DrawPacket_Rect >* mutable_layerrect(); - + // required uint64 layerref = 6; inline bool has_layerref() const; inline void clear_layerref(); static const int kLayerrefFieldNumber = 6; inline ::google::protobuf::uint64 layerref() const; inline void set_layerref(::google::protobuf::uint64 value); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.DrawPacket) private: inline void set_has_offsetx(); @@ -1575,21 +1873,25 @@ class DrawPacket : public ::google::protobuf::MessageLite { inline void clear_has_totalrects(); inline void set_has_layerref(); inline void clear_has_layerref(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; float offsetx_; float offsety_; ::google::protobuf::RepeatedField< float > mvmatrix_; ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::DrawPacket_Rect > layerrect_; ::google::protobuf::uint64 layerref_; ::google::protobuf::uint32 totalrects_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(6 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static DrawPacket* default_instance_; }; @@ -1599,43 +1901,61 @@ class Packet : public ::google::protobuf::MessageLite { public: Packet(); virtual ~Packet(); - + Packet(const Packet& from); - + inline Packet& operator=(const Packet& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const Packet& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const Packet* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(Packet* other); - + // implements Message ---------------------------------------------- - + Packet* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const Packet& from); void MergeFrom(const Packet& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + typedef Packet_DataType DataType; static const DataType FRAMESTART = Packet_DataType_FRAMESTART; static const DataType FRAMEEND = Packet_DataType_FRAMEEND; @@ -1653,16 +1973,16 @@ class Packet : public ::google::protobuf::MessageLite { Packet_DataType_DataType_MAX; static const int DataType_ARRAYSIZE = Packet_DataType_DataType_ARRAYSIZE; - + // accessors ------------------------------------------------------- - + // required .mozilla.layers.layerscope.Packet.DataType type = 1; inline bool has_type() const; inline void clear_type(); static const int kTypeFieldNumber = 1; inline ::mozilla::layers::layerscope::Packet_DataType type() const; inline void set_type(::mozilla::layers::layerscope::Packet_DataType value); - + // optional .mozilla.layers.layerscope.FramePacket frame = 2; inline bool has_frame() const; inline void clear_frame(); @@ -1670,7 +1990,8 @@ class Packet : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::FramePacket& frame() const; inline ::mozilla::layers::layerscope::FramePacket* mutable_frame(); inline ::mozilla::layers::layerscope::FramePacket* release_frame(); - + inline void set_allocated_frame(::mozilla::layers::layerscope::FramePacket* frame); + // optional .mozilla.layers.layerscope.ColorPacket color = 3; inline bool has_color() const; inline void clear_color(); @@ -1678,7 +1999,8 @@ class Packet : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::ColorPacket& color() const; inline ::mozilla::layers::layerscope::ColorPacket* mutable_color(); inline ::mozilla::layers::layerscope::ColorPacket* release_color(); - + inline void set_allocated_color(::mozilla::layers::layerscope::ColorPacket* color); + // optional .mozilla.layers.layerscope.TexturePacket texture = 4; inline bool has_texture() const; inline void clear_texture(); @@ -1686,7 +2008,8 @@ class Packet : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::TexturePacket& texture() const; inline ::mozilla::layers::layerscope::TexturePacket* mutable_texture(); inline ::mozilla::layers::layerscope::TexturePacket* release_texture(); - + inline void set_allocated_texture(::mozilla::layers::layerscope::TexturePacket* texture); + // optional .mozilla.layers.layerscope.LayersPacket layers = 5; inline bool has_layers() const; inline void clear_layers(); @@ -1694,7 +2017,8 @@ class Packet : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::LayersPacket& layers() const; inline ::mozilla::layers::layerscope::LayersPacket* mutable_layers(); inline ::mozilla::layers::layerscope::LayersPacket* release_layers(); - + inline void set_allocated_layers(::mozilla::layers::layerscope::LayersPacket* layers); + // optional .mozilla.layers.layerscope.MetaPacket meta = 6; inline bool has_meta() const; inline void clear_meta(); @@ -1702,7 +2026,8 @@ class Packet : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::MetaPacket& meta() const; inline ::mozilla::layers::layerscope::MetaPacket* mutable_meta(); inline ::mozilla::layers::layerscope::MetaPacket* release_meta(); - + inline void set_allocated_meta(::mozilla::layers::layerscope::MetaPacket* meta); + // optional .mozilla.layers.layerscope.DrawPacket draw = 7; inline bool has_draw() const; inline void clear_draw(); @@ -1710,7 +2035,8 @@ class Packet : public ::google::protobuf::MessageLite { inline const ::mozilla::layers::layerscope::DrawPacket& draw() const; inline ::mozilla::layers::layerscope::DrawPacket* mutable_draw(); inline ::mozilla::layers::layerscope::DrawPacket* release_draw(); - + inline void set_allocated_draw(::mozilla::layers::layerscope::DrawPacket* draw); + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.Packet) private: inline void set_has_type(); @@ -1727,7 +2053,11 @@ class Packet : public ::google::protobuf::MessageLite { inline void clear_has_meta(); inline void set_has_draw(); inline void clear_has_draw(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; ::mozilla::layers::layerscope::FramePacket* frame_; ::mozilla::layers::layerscope::ColorPacket* color_; ::mozilla::layers::layerscope::TexturePacket* texture_; @@ -1735,14 +2065,14 @@ class Packet : public ::google::protobuf::MessageLite { ::mozilla::layers::layerscope::MetaPacket* meta_; ::mozilla::layers::layerscope::DrawPacket* draw_; int type_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static Packet* default_instance_; }; @@ -1752,43 +2082,61 @@ class CommandPacket : public ::google::protobuf::MessageLite { public: CommandPacket(); virtual ~CommandPacket(); - + CommandPacket(const CommandPacket& from); - + inline CommandPacket& operator=(const CommandPacket& from) { CopyFrom(from); return *this; } - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + static const CommandPacket& default_instance(); - + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const CommandPacket* internal_default_instance() { + return default_instance_; + } + #endif + void Swap(CommandPacket* other); - + // implements Message ---------------------------------------------- - + CommandPacket* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); void CopyFrom(const CommandPacket& from); void MergeFrom(const CommandPacket& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + typedef CommandPacket_CmdType CmdType; static const CmdType NO_OP = CommandPacket_CmdType_NO_OP; static const CmdType LAYERS_TREE = CommandPacket_CmdType_LAYERS_TREE; @@ -1802,40 +2150,44 @@ class CommandPacket : public ::google::protobuf::MessageLite { CommandPacket_CmdType_CmdType_MAX; static const int CmdType_ARRAYSIZE = CommandPacket_CmdType_CmdType_ARRAYSIZE; - + // accessors ------------------------------------------------------- - + // required .mozilla.layers.layerscope.CommandPacket.CmdType type = 1; inline bool has_type() const; inline void clear_type(); static const int kTypeFieldNumber = 1; inline ::mozilla::layers::layerscope::CommandPacket_CmdType type() const; inline void set_type(::mozilla::layers::layerscope::CommandPacket_CmdType value); - + // optional bool value = 2; inline bool has_value() const; inline void clear_value(); static const int kValueFieldNumber = 2; inline bool value() const; inline void set_value(bool value); - + // @@protoc_insertion_point(class_scope:mozilla.layers.layerscope.CommandPacket) private: inline void set_has_type(); inline void clear_has_type(); inline void set_has_value(); inline void clear_has_value(); - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; int type_; bool value_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; - + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_LayerScopePacket_2eproto_impl(); + #else friend void protobuf_AddDesc_LayerScopePacket_2eproto(); + #endif friend void protobuf_AssignDesc_LayerScopePacket_2eproto(); friend void protobuf_ShutdownFile_LayerScopePacket_2eproto(); - + void InitAsDefaultInstance(); static CommandPacket* default_instance_; }; @@ -1861,11 +2213,13 @@ inline void FramePacket::clear_value() { clear_has_value(); } inline ::google::protobuf::uint64 FramePacket::value() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.FramePacket.value) return value_; } inline void FramePacket::set_value(::google::protobuf::uint64 value) { set_has_value(); value_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.FramePacket.value) } // ------------------------------------------------------------------- @@ -1887,11 +2241,13 @@ inline void ColorPacket::clear_layerref() { clear_has_layerref(); } inline ::google::protobuf::uint64 ColorPacket::layerref() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.ColorPacket.layerref) return layerref_; } inline void ColorPacket::set_layerref(::google::protobuf::uint64 value) { set_has_layerref(); layerref_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.ColorPacket.layerref) } // optional uint32 width = 2; @@ -1909,11 +2265,13 @@ inline void ColorPacket::clear_width() { clear_has_width(); } inline ::google::protobuf::uint32 ColorPacket::width() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.ColorPacket.width) return width_; } inline void ColorPacket::set_width(::google::protobuf::uint32 value) { set_has_width(); width_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.ColorPacket.width) } // optional uint32 height = 3; @@ -1931,11 +2289,13 @@ inline void ColorPacket::clear_height() { clear_has_height(); } inline ::google::protobuf::uint32 ColorPacket::height() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.ColorPacket.height) return height_; } inline void ColorPacket::set_height(::google::protobuf::uint32 value) { set_has_height(); height_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.ColorPacket.height) } // optional uint32 color = 4; @@ -1953,11 +2313,13 @@ inline void ColorPacket::clear_color() { clear_has_color(); } inline ::google::protobuf::uint32 ColorPacket::color() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.ColorPacket.color) return color_; } inline void ColorPacket::set_color(::google::protobuf::uint32 value) { set_has_color(); color_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.ColorPacket.color) } // ------------------------------------------------------------------- @@ -1979,11 +2341,13 @@ inline void TexturePacket::clear_layerref() { clear_has_layerref(); } inline ::google::protobuf::uint64 TexturePacket::layerref() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.TexturePacket.layerref) return layerref_; } inline void TexturePacket::set_layerref(::google::protobuf::uint64 value) { set_has_layerref(); layerref_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.TexturePacket.layerref) } // optional uint32 width = 2; @@ -2001,11 +2365,13 @@ inline void TexturePacket::clear_width() { clear_has_width(); } inline ::google::protobuf::uint32 TexturePacket::width() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.TexturePacket.width) return width_; } inline void TexturePacket::set_width(::google::protobuf::uint32 value) { set_has_width(); width_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.TexturePacket.width) } // optional uint32 height = 3; @@ -2023,11 +2389,13 @@ inline void TexturePacket::clear_height() { clear_has_height(); } inline ::google::protobuf::uint32 TexturePacket::height() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.TexturePacket.height) return height_; } inline void TexturePacket::set_height(::google::protobuf::uint32 value) { set_has_height(); height_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.TexturePacket.height) } // optional uint32 stride = 4; @@ -2045,11 +2413,13 @@ inline void TexturePacket::clear_stride() { clear_has_stride(); } inline ::google::protobuf::uint32 TexturePacket::stride() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.TexturePacket.stride) return stride_; } inline void TexturePacket::set_stride(::google::protobuf::uint32 value) { set_has_stride(); stride_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.TexturePacket.stride) } // optional uint32 name = 5; @@ -2067,11 +2437,13 @@ inline void TexturePacket::clear_name() { clear_has_name(); } inline ::google::protobuf::uint32 TexturePacket::name() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.TexturePacket.name) return name_; } inline void TexturePacket::set_name(::google::protobuf::uint32 value) { set_has_name(); name_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.TexturePacket.name) } // optional uint32 target = 6; @@ -2089,11 +2461,13 @@ inline void TexturePacket::clear_target() { clear_has_target(); } inline ::google::protobuf::uint32 TexturePacket::target() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.TexturePacket.target) return target_; } inline void TexturePacket::set_target(::google::protobuf::uint32 value) { set_has_target(); target_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.TexturePacket.target) } // optional uint32 dataformat = 7; @@ -2111,11 +2485,13 @@ inline void TexturePacket::clear_dataformat() { clear_has_dataformat(); } inline ::google::protobuf::uint32 TexturePacket::dataformat() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.TexturePacket.dataformat) return dataformat_; } inline void TexturePacket::set_dataformat(::google::protobuf::uint32 value) { set_has_dataformat(); dataformat_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.TexturePacket.dataformat) } // optional uint64 glcontext = 8; @@ -2133,11 +2509,13 @@ inline void TexturePacket::clear_glcontext() { clear_has_glcontext(); } inline ::google::protobuf::uint64 TexturePacket::glcontext() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.TexturePacket.glcontext) return glcontext_; } inline void TexturePacket::set_glcontext(::google::protobuf::uint64 value) { set_has_glcontext(); glcontext_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.TexturePacket.glcontext) } // optional bytes data = 9; @@ -2151,52 +2529,70 @@ inline void TexturePacket::clear_has_data() { _has_bits_[0] &= ~0x00000100u; } inline void TexturePacket::clear_data() { - if (data_ != &::google::protobuf::internal::kEmptyString) { + if (data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { data_->clear(); } clear_has_data(); } inline const ::std::string& TexturePacket::data() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.TexturePacket.data) return *data_; } inline void TexturePacket::set_data(const ::std::string& value) { set_has_data(); - if (data_ == &::google::protobuf::internal::kEmptyString) { + if (data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { data_ = new ::std::string; } data_->assign(value); + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.TexturePacket.data) } inline void TexturePacket::set_data(const char* value) { set_has_data(); - if (data_ == &::google::protobuf::internal::kEmptyString) { + if (data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { data_ = new ::std::string; } data_->assign(value); + // @@protoc_insertion_point(field_set_char:mozilla.layers.layerscope.TexturePacket.data) } inline void TexturePacket::set_data(const void* value, size_t size) { set_has_data(); - if (data_ == &::google::protobuf::internal::kEmptyString) { + if (data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { data_ = new ::std::string; } data_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:mozilla.layers.layerscope.TexturePacket.data) } inline ::std::string* TexturePacket::mutable_data() { set_has_data(); - if (data_ == &::google::protobuf::internal::kEmptyString) { + if (data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { data_ = new ::std::string; } + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.TexturePacket.data) return data_; } inline ::std::string* TexturePacket::release_data() { clear_has_data(); - if (data_ == &::google::protobuf::internal::kEmptyString) { + if (data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { ::std::string* temp = data_; - data_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + data_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void TexturePacket::set_allocated_data(::std::string* data) { + if (data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete data_; + } + if (data) { + set_has_data(); + data_ = data; + } else { + clear_has_data(); + data_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.TexturePacket.data) +} // ------------------------------------------------------------------- @@ -2217,11 +2613,13 @@ inline void LayersPacket_Layer_Size::clear_w() { clear_has_w(); } inline ::google::protobuf::int32 LayersPacket_Layer_Size::w() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Size.w) return w_; } inline void LayersPacket_Layer_Size::set_w(::google::protobuf::int32 value) { set_has_w(); w_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.Size.w) } // optional int32 h = 2; @@ -2239,11 +2637,13 @@ inline void LayersPacket_Layer_Size::clear_h() { clear_has_h(); } inline ::google::protobuf::int32 LayersPacket_Layer_Size::h() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Size.h) return h_; } inline void LayersPacket_Layer_Size::set_h(::google::protobuf::int32 value) { set_has_h(); h_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.Size.h) } // ------------------------------------------------------------------- @@ -2265,11 +2665,13 @@ inline void LayersPacket_Layer_Rect::clear_x() { clear_has_x(); } inline ::google::protobuf::int32 LayersPacket_Layer_Rect::x() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Rect.x) return x_; } inline void LayersPacket_Layer_Rect::set_x(::google::protobuf::int32 value) { set_has_x(); x_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.Rect.x) } // optional int32 y = 2; @@ -2287,11 +2689,13 @@ inline void LayersPacket_Layer_Rect::clear_y() { clear_has_y(); } inline ::google::protobuf::int32 LayersPacket_Layer_Rect::y() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Rect.y) return y_; } inline void LayersPacket_Layer_Rect::set_y(::google::protobuf::int32 value) { set_has_y(); y_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.Rect.y) } // optional int32 w = 3; @@ -2309,11 +2713,13 @@ inline void LayersPacket_Layer_Rect::clear_w() { clear_has_w(); } inline ::google::protobuf::int32 LayersPacket_Layer_Rect::w() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Rect.w) return w_; } inline void LayersPacket_Layer_Rect::set_w(::google::protobuf::int32 value) { set_has_w(); w_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.Rect.w) } // optional int32 h = 4; @@ -2331,11 +2737,13 @@ inline void LayersPacket_Layer_Rect::clear_h() { clear_has_h(); } inline ::google::protobuf::int32 LayersPacket_Layer_Rect::h() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Rect.h) return h_; } inline void LayersPacket_Layer_Rect::set_h(::google::protobuf::int32 value) { set_has_h(); h_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.Rect.h) } // ------------------------------------------------------------------- @@ -2350,20 +2758,25 @@ inline void LayersPacket_Layer_Region::clear_r() { r_.Clear(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Rect& LayersPacket_Layer_Region::r(int index) const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Region.r) return r_.Get(index); } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* LayersPacket_Layer_Region::mutable_r(int index) { + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.Region.r) return r_.Mutable(index); } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* LayersPacket_Layer_Region::add_r() { + // @@protoc_insertion_point(field_add:mozilla.layers.layerscope.LayersPacket.Layer.Region.r) return r_.Add(); } inline const ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer_Rect >& LayersPacket_Layer_Region::r() const { + // @@protoc_insertion_point(field_list:mozilla.layers.layerscope.LayersPacket.Layer.Region.r) return r_; } inline ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer_Rect >* LayersPacket_Layer_Region::mutable_r() { + // @@protoc_insertion_point(field_mutable_list:mozilla.layers.layerscope.LayersPacket.Layer.Region.r) return &r_; } @@ -2386,11 +2799,13 @@ inline void LayersPacket_Layer_Matrix::clear_is2d() { clear_has_is2d(); } inline bool LayersPacket_Layer_Matrix::is2d() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Matrix.is2D) return is2d_; } inline void LayersPacket_Layer_Matrix::set_is2d(bool value) { set_has_is2d(); is2d_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.Matrix.is2D) } // optional bool isId = 2; @@ -2408,11 +2823,13 @@ inline void LayersPacket_Layer_Matrix::clear_isid() { clear_has_isid(); } inline bool LayersPacket_Layer_Matrix::isid() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Matrix.isId) return isid_; } inline void LayersPacket_Layer_Matrix::set_isid(bool value) { set_has_isid(); isid_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.Matrix.isId) } // repeated float m = 3; @@ -2423,20 +2840,25 @@ inline void LayersPacket_Layer_Matrix::clear_m() { m_.Clear(); } inline float LayersPacket_Layer_Matrix::m(int index) const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Matrix.m) return m_.Get(index); } inline void LayersPacket_Layer_Matrix::set_m(int index, float value) { m_.Set(index, value); + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.Matrix.m) } inline void LayersPacket_Layer_Matrix::add_m(float value) { m_.Add(value); + // @@protoc_insertion_point(field_add:mozilla.layers.layerscope.LayersPacket.Layer.Matrix.m) } inline const ::google::protobuf::RepeatedField< float >& LayersPacket_Layer_Matrix::m() const { + // @@protoc_insertion_point(field_list:mozilla.layers.layerscope.LayersPacket.Layer.Matrix.m) return m_; } inline ::google::protobuf::RepeatedField< float >* LayersPacket_Layer_Matrix::mutable_m() { + // @@protoc_insertion_point(field_mutable_list:mozilla.layers.layerscope.LayersPacket.Layer.Matrix.m) return &m_; } @@ -2459,11 +2881,17 @@ inline void LayersPacket_Layer_Shadow::clear_clip() { clear_has_clip(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Rect& LayersPacket_Layer_Shadow::clip() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Shadow.clip) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return clip_ != NULL ? *clip_ : *default_instance().clip_; +#else return clip_ != NULL ? *clip_ : *default_instance_->clip_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* LayersPacket_Layer_Shadow::mutable_clip() { set_has_clip(); if (clip_ == NULL) clip_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Rect; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.Shadow.clip) return clip_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* LayersPacket_Layer_Shadow::release_clip() { @@ -2472,6 +2900,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* LayersPacket_Laye clip_ = NULL; return temp; } +inline void LayersPacket_Layer_Shadow::set_allocated_clip(::mozilla::layers::layerscope::LayersPacket_Layer_Rect* clip) { + delete clip_; + clip_ = clip; + if (clip) { + set_has_clip(); + } else { + clear_has_clip(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.Shadow.clip) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 2; inline bool LayersPacket_Layer_Shadow::has_transform() const { @@ -2488,11 +2926,17 @@ inline void LayersPacket_Layer_Shadow::clear_transform() { clear_has_transform(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix& LayersPacket_Layer_Shadow::transform() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Shadow.transform) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return transform_ != NULL ? *transform_ : *default_instance().transform_; +#else return transform_ != NULL ? *transform_ : *default_instance_->transform_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* LayersPacket_Layer_Shadow::mutable_transform() { set_has_transform(); if (transform_ == NULL) transform_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.Shadow.transform) return transform_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* LayersPacket_Layer_Shadow::release_transform() { @@ -2501,6 +2945,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* LayersPacket_La transform_ = NULL; return temp; } +inline void LayersPacket_Layer_Shadow::set_allocated_transform(::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* transform) { + delete transform_; + transform_ = transform; + if (transform) { + set_has_transform(); + } else { + clear_has_transform(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.Shadow.transform) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 3; inline bool LayersPacket_Layer_Shadow::has_vregion() const { @@ -2517,11 +2971,17 @@ inline void LayersPacket_Layer_Shadow::clear_vregion() { clear_has_vregion(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer_Shadow::vregion() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.Shadow.vRegion) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return vregion_ != NULL ? *vregion_ : *default_instance().vregion_; +#else return vregion_ != NULL ? *vregion_ : *default_instance_->vregion_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer_Shadow::mutable_vregion() { set_has_vregion(); if (vregion_ == NULL) vregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.Shadow.vRegion) return vregion_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer_Shadow::release_vregion() { @@ -2530,6 +2990,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_La vregion_ = NULL; return temp; } +inline void LayersPacket_Layer_Shadow::set_allocated_vregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* vregion) { + delete vregion_; + vregion_ = vregion; + if (vregion) { + set_has_vregion(); + } else { + clear_has_vregion(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.Shadow.vRegion) +} // ------------------------------------------------------------------- @@ -2550,12 +3020,14 @@ inline void LayersPacket_Layer::clear_type() { clear_has_type(); } inline ::mozilla::layers::layerscope::LayersPacket_Layer_LayerType LayersPacket_Layer::type() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.type) return static_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_LayerType >(type_); } inline void LayersPacket_Layer::set_type(::mozilla::layers::layerscope::LayersPacket_Layer_LayerType value) { - GOOGLE_DCHECK(::mozilla::layers::layerscope::LayersPacket_Layer_LayerType_IsValid(value)); + assert(::mozilla::layers::layerscope::LayersPacket_Layer_LayerType_IsValid(value)); set_has_type(); type_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.type) } // required uint64 ptr = 2; @@ -2573,11 +3045,13 @@ inline void LayersPacket_Layer::clear_ptr() { clear_has_ptr(); } inline ::google::protobuf::uint64 LayersPacket_Layer::ptr() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.ptr) return ptr_; } inline void LayersPacket_Layer::set_ptr(::google::protobuf::uint64 value) { set_has_ptr(); ptr_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.ptr) } // required uint64 parentPtr = 3; @@ -2595,11 +3069,13 @@ inline void LayersPacket_Layer::clear_parentptr() { clear_has_parentptr(); } inline ::google::protobuf::uint64 LayersPacket_Layer::parentptr() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.parentPtr) return parentptr_; } inline void LayersPacket_Layer::set_parentptr(::google::protobuf::uint64 value) { set_has_parentptr(); parentptr_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.parentPtr) } // optional .mozilla.layers.layerscope.LayersPacket.Layer.Rect clip = 10; @@ -2617,11 +3093,17 @@ inline void LayersPacket_Layer::clear_clip() { clear_has_clip(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Rect& LayersPacket_Layer::clip() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.clip) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return clip_ != NULL ? *clip_ : *default_instance().clip_; +#else return clip_ != NULL ? *clip_ : *default_instance_->clip_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* LayersPacket_Layer::mutable_clip() { set_has_clip(); if (clip_ == NULL) clip_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Rect; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.clip) return clip_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* LayersPacket_Layer::release_clip() { @@ -2630,6 +3112,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Rect* LayersPacket_Laye clip_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_clip(::mozilla::layers::layerscope::LayersPacket_Layer_Rect* clip) { + delete clip_; + clip_ = clip; + if (clip) { + set_has_clip(); + } else { + clear_has_clip(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.clip) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Matrix transform = 11; inline bool LayersPacket_Layer::has_transform() const { @@ -2646,11 +3138,17 @@ inline void LayersPacket_Layer::clear_transform() { clear_has_transform(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix& LayersPacket_Layer::transform() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.transform) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return transform_ != NULL ? *transform_ : *default_instance().transform_; +#else return transform_ != NULL ? *transform_ : *default_instance_->transform_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* LayersPacket_Layer::mutable_transform() { set_has_transform(); if (transform_ == NULL) transform_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.transform) return transform_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* LayersPacket_Layer::release_transform() { @@ -2659,6 +3157,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* LayersPacket_La transform_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_transform(::mozilla::layers::layerscope::LayersPacket_Layer_Matrix* transform) { + delete transform_; + transform_ = transform; + if (transform) { + set_has_transform(); + } else { + clear_has_transform(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.transform) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vRegion = 12; inline bool LayersPacket_Layer::has_vregion() const { @@ -2675,11 +3183,17 @@ inline void LayersPacket_Layer::clear_vregion() { clear_has_vregion(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::vregion() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.vRegion) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return vregion_ != NULL ? *vregion_ : *default_instance().vregion_; +#else return vregion_ != NULL ? *vregion_ : *default_instance_->vregion_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_vregion() { set_has_vregion(); if (vregion_ == NULL) vregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.vRegion) return vregion_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_vregion() { @@ -2688,6 +3202,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_La vregion_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_vregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* vregion) { + delete vregion_; + vregion_ = vregion; + if (vregion) { + set_has_vregion(); + } else { + clear_has_vregion(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.vRegion) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Shadow shadow = 13; inline bool LayersPacket_Layer::has_shadow() const { @@ -2704,11 +3228,17 @@ inline void LayersPacket_Layer::clear_shadow() { clear_has_shadow(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow& LayersPacket_Layer::shadow() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.shadow) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return shadow_ != NULL ? *shadow_ : *default_instance().shadow_; +#else return shadow_ != NULL ? *shadow_ : *default_instance_->shadow_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow* LayersPacket_Layer::mutable_shadow() { set_has_shadow(); if (shadow_ == NULL) shadow_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.shadow) return shadow_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow* LayersPacket_Layer::release_shadow() { @@ -2717,6 +3247,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Shadow* LayersPacket_La shadow_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_shadow(::mozilla::layers::layerscope::LayersPacket_Layer_Shadow* shadow) { + delete shadow_; + shadow_ = shadow; + if (shadow) { + set_has_shadow(); + } else { + clear_has_shadow(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.shadow) +} // optional float opacity = 14; inline bool LayersPacket_Layer::has_opacity() const { @@ -2733,11 +3273,13 @@ inline void LayersPacket_Layer::clear_opacity() { clear_has_opacity(); } inline float LayersPacket_Layer::opacity() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.opacity) return opacity_; } inline void LayersPacket_Layer::set_opacity(float value) { set_has_opacity(); opacity_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.opacity) } // optional bool cOpaque = 15; @@ -2755,11 +3297,13 @@ inline void LayersPacket_Layer::clear_copaque() { clear_has_copaque(); } inline bool LayersPacket_Layer::copaque() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.cOpaque) return copaque_; } inline void LayersPacket_Layer::set_copaque(bool value) { set_has_copaque(); copaque_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.cOpaque) } // optional bool cAlpha = 16; @@ -2777,11 +3321,13 @@ inline void LayersPacket_Layer::clear_calpha() { clear_has_calpha(); } inline bool LayersPacket_Layer::calpha() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.cAlpha) return calpha_; } inline void LayersPacket_Layer::set_calpha(bool value) { set_has_calpha(); calpha_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.cAlpha) } // optional .mozilla.layers.layerscope.LayersPacket.Layer.ScrollingDirect direct = 17; @@ -2799,12 +3345,14 @@ inline void LayersPacket_Layer::clear_direct() { clear_has_direct(); } inline ::mozilla::layers::layerscope::LayersPacket_Layer_ScrollingDirect LayersPacket_Layer::direct() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.direct) return static_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_ScrollingDirect >(direct_); } inline void LayersPacket_Layer::set_direct(::mozilla::layers::layerscope::LayersPacket_Layer_ScrollingDirect value) { - GOOGLE_DCHECK(::mozilla::layers::layerscope::LayersPacket_Layer_ScrollingDirect_IsValid(value)); + assert(::mozilla::layers::layerscope::LayersPacket_Layer_ScrollingDirect_IsValid(value)); set_has_direct(); direct_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.direct) } // optional uint64 barID = 18; @@ -2822,11 +3370,13 @@ inline void LayersPacket_Layer::clear_barid() { clear_has_barid(); } inline ::google::protobuf::uint64 LayersPacket_Layer::barid() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.barID) return barid_; } inline void LayersPacket_Layer::set_barid(::google::protobuf::uint64 value) { set_has_barid(); barid_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.barID) } // optional uint64 mask = 19; @@ -2844,11 +3394,13 @@ inline void LayersPacket_Layer::clear_mask() { clear_has_mask(); } inline ::google::protobuf::uint64 LayersPacket_Layer::mask() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.mask) return mask_; } inline void LayersPacket_Layer::set_mask(::google::protobuf::uint64 value) { set_has_mask(); mask_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.mask) } // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hitRegion = 20; @@ -2866,11 +3418,17 @@ inline void LayersPacket_Layer::clear_hitregion() { clear_has_hitregion(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::hitregion() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.hitRegion) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return hitregion_ != NULL ? *hitregion_ : *default_instance().hitregion_; +#else return hitregion_ != NULL ? *hitregion_ : *default_instance_->hitregion_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_hitregion() { set_has_hitregion(); if (hitregion_ == NULL) hitregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.hitRegion) return hitregion_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_hitregion() { @@ -2879,6 +3437,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_La hitregion_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_hitregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* hitregion) { + delete hitregion_; + hitregion_ = hitregion; + if (hitregion) { + set_has_hitregion(); + } else { + clear_has_hitregion(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.hitRegion) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region dispatchRegion = 21; inline bool LayersPacket_Layer::has_dispatchregion() const { @@ -2895,11 +3463,17 @@ inline void LayersPacket_Layer::clear_dispatchregion() { clear_has_dispatchregion(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::dispatchregion() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.dispatchRegion) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return dispatchregion_ != NULL ? *dispatchregion_ : *default_instance().dispatchregion_; +#else return dispatchregion_ != NULL ? *dispatchregion_ : *default_instance_->dispatchregion_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_dispatchregion() { set_has_dispatchregion(); if (dispatchregion_ == NULL) dispatchregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.dispatchRegion) return dispatchregion_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_dispatchregion() { @@ -2908,6 +3482,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_La dispatchregion_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_dispatchregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* dispatchregion) { + delete dispatchregion_; + dispatchregion_ = dispatchregion; + if (dispatchregion) { + set_has_dispatchregion(); + } else { + clear_has_dispatchregion(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.dispatchRegion) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region noActionRegion = 22; inline bool LayersPacket_Layer::has_noactionregion() const { @@ -2924,11 +3508,17 @@ inline void LayersPacket_Layer::clear_noactionregion() { clear_has_noactionregion(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::noactionregion() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.noActionRegion) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return noactionregion_ != NULL ? *noactionregion_ : *default_instance().noactionregion_; +#else return noactionregion_ != NULL ? *noactionregion_ : *default_instance_->noactionregion_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_noactionregion() { set_has_noactionregion(); if (noactionregion_ == NULL) noactionregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.noActionRegion) return noactionregion_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_noactionregion() { @@ -2937,6 +3527,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_La noactionregion_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_noactionregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* noactionregion) { + delete noactionregion_; + noactionregion_ = noactionregion; + if (noactionregion) { + set_has_noactionregion(); + } else { + clear_has_noactionregion(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.noActionRegion) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region hPanRegion = 23; inline bool LayersPacket_Layer::has_hpanregion() const { @@ -2953,11 +3553,17 @@ inline void LayersPacket_Layer::clear_hpanregion() { clear_has_hpanregion(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::hpanregion() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.hPanRegion) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return hpanregion_ != NULL ? *hpanregion_ : *default_instance().hpanregion_; +#else return hpanregion_ != NULL ? *hpanregion_ : *default_instance_->hpanregion_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_hpanregion() { set_has_hpanregion(); if (hpanregion_ == NULL) hpanregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.hPanRegion) return hpanregion_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_hpanregion() { @@ -2966,6 +3572,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_La hpanregion_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_hpanregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* hpanregion) { + delete hpanregion_; + hpanregion_ = hpanregion; + if (hpanregion) { + set_has_hpanregion(); + } else { + clear_has_hpanregion(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.hPanRegion) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region vPanRegion = 24; inline bool LayersPacket_Layer::has_vpanregion() const { @@ -2982,11 +3598,17 @@ inline void LayersPacket_Layer::clear_vpanregion() { clear_has_vpanregion(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::vpanregion() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.vPanRegion) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return vpanregion_ != NULL ? *vpanregion_ : *default_instance().vpanregion_; +#else return vpanregion_ != NULL ? *vpanregion_ : *default_instance_->vpanregion_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_vpanregion() { set_has_vpanregion(); if (vpanregion_ == NULL) vpanregion_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.vPanRegion) return vpanregion_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_vpanregion() { @@ -2995,6 +3617,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_La vpanregion_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_vpanregion(::mozilla::layers::layerscope::LayersPacket_Layer_Region* vpanregion) { + delete vpanregion_; + vpanregion_ = vpanregion; + if (vpanregion) { + set_has_vpanregion(); + } else { + clear_has_vpanregion(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.vPanRegion) +} // optional .mozilla.layers.layerscope.LayersPacket.Layer.Region valid = 100; inline bool LayersPacket_Layer::has_valid() const { @@ -3011,11 +3643,17 @@ inline void LayersPacket_Layer::clear_valid() { clear_has_valid(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Region& LayersPacket_Layer::valid() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.valid) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return valid_ != NULL ? *valid_ : *default_instance().valid_; +#else return valid_ != NULL ? *valid_ : *default_instance_->valid_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::mutable_valid() { set_has_valid(); if (valid_ == NULL) valid_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Region; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.valid) return valid_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_Layer::release_valid() { @@ -3024,6 +3662,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Region* LayersPacket_La valid_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_valid(::mozilla::layers::layerscope::LayersPacket_Layer_Region* valid) { + delete valid_; + valid_ = valid; + if (valid) { + set_has_valid(); + } else { + clear_has_valid(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.valid) +} // optional uint32 color = 101; inline bool LayersPacket_Layer::has_color() const { @@ -3040,11 +3688,13 @@ inline void LayersPacket_Layer::clear_color() { clear_has_color(); } inline ::google::protobuf::uint32 LayersPacket_Layer::color() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.color) return color_; } inline void LayersPacket_Layer::set_color(::google::protobuf::uint32 value) { set_has_color(); color_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.color) } // optional .mozilla.layers.layerscope.LayersPacket.Layer.Filter filter = 102; @@ -3062,12 +3712,14 @@ inline void LayersPacket_Layer::clear_filter() { clear_has_filter(); } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Filter LayersPacket_Layer::filter() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.filter) return static_cast< ::mozilla::layers::layerscope::LayersPacket_Layer_Filter >(filter_); } inline void LayersPacket_Layer::set_filter(::mozilla::layers::layerscope::LayersPacket_Layer_Filter value) { - GOOGLE_DCHECK(::mozilla::layers::layerscope::LayersPacket_Layer_Filter_IsValid(value)); + assert(::mozilla::layers::layerscope::LayersPacket_Layer_Filter_IsValid(value)); set_has_filter(); filter_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.filter) } // optional uint64 refID = 103; @@ -3085,11 +3737,13 @@ inline void LayersPacket_Layer::clear_refid() { clear_has_refid(); } inline ::google::protobuf::uint64 LayersPacket_Layer::refid() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.refID) return refid_; } inline void LayersPacket_Layer::set_refid(::google::protobuf::uint64 value) { set_has_refid(); refid_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.LayersPacket.Layer.refID) } // optional .mozilla.layers.layerscope.LayersPacket.Layer.Size size = 104; @@ -3107,11 +3761,17 @@ inline void LayersPacket_Layer::clear_size() { clear_has_size(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer_Size& LayersPacket_Layer::size() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.Layer.size) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return size_ != NULL ? *size_ : *default_instance().size_; +#else return size_ != NULL ? *size_ : *default_instance_->size_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Size* LayersPacket_Layer::mutable_size() { set_has_size(); if (size_ == NULL) size_ = new ::mozilla::layers::layerscope::LayersPacket_Layer_Size; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.Layer.size) return size_; } inline ::mozilla::layers::layerscope::LayersPacket_Layer_Size* LayersPacket_Layer::release_size() { @@ -3120,6 +3780,16 @@ inline ::mozilla::layers::layerscope::LayersPacket_Layer_Size* LayersPacket_Laye size_ = NULL; return temp; } +inline void LayersPacket_Layer::set_allocated_size(::mozilla::layers::layerscope::LayersPacket_Layer_Size* size) { + delete size_; + size_ = size; + if (size) { + set_has_size(); + } else { + clear_has_size(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.LayersPacket.Layer.size) +} // ------------------------------------------------------------------- @@ -3133,20 +3803,25 @@ inline void LayersPacket::clear_layer() { layer_.Clear(); } inline const ::mozilla::layers::layerscope::LayersPacket_Layer& LayersPacket::layer(int index) const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.LayersPacket.layer) return layer_.Get(index); } inline ::mozilla::layers::layerscope::LayersPacket_Layer* LayersPacket::mutable_layer(int index) { + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.LayersPacket.layer) return layer_.Mutable(index); } inline ::mozilla::layers::layerscope::LayersPacket_Layer* LayersPacket::add_layer() { + // @@protoc_insertion_point(field_add:mozilla.layers.layerscope.LayersPacket.layer) return layer_.Add(); } inline const ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer >& LayersPacket::layer() const { + // @@protoc_insertion_point(field_list:mozilla.layers.layerscope.LayersPacket.layer) return layer_; } inline ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::LayersPacket_Layer >* LayersPacket::mutable_layer() { + // @@protoc_insertion_point(field_mutable_list:mozilla.layers.layerscope.LayersPacket.layer) return &layer_; } @@ -3169,11 +3844,13 @@ inline void MetaPacket::clear_composedbyhwc() { clear_has_composedbyhwc(); } inline bool MetaPacket::composedbyhwc() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.MetaPacket.composedByHwc) return composedbyhwc_; } inline void MetaPacket::set_composedbyhwc(bool value) { set_has_composedbyhwc(); composedbyhwc_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.MetaPacket.composedByHwc) } // ------------------------------------------------------------------- @@ -3195,11 +3872,13 @@ inline void DrawPacket_Rect::clear_x() { clear_has_x(); } inline float DrawPacket_Rect::x() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.Rect.x) return x_; } inline void DrawPacket_Rect::set_x(float value) { set_has_x(); x_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.DrawPacket.Rect.x) } // required float y = 2; @@ -3217,11 +3896,13 @@ inline void DrawPacket_Rect::clear_y() { clear_has_y(); } inline float DrawPacket_Rect::y() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.Rect.y) return y_; } inline void DrawPacket_Rect::set_y(float value) { set_has_y(); y_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.DrawPacket.Rect.y) } // required float w = 3; @@ -3239,11 +3920,13 @@ inline void DrawPacket_Rect::clear_w() { clear_has_w(); } inline float DrawPacket_Rect::w() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.Rect.w) return w_; } inline void DrawPacket_Rect::set_w(float value) { set_has_w(); w_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.DrawPacket.Rect.w) } // required float h = 4; @@ -3261,11 +3944,13 @@ inline void DrawPacket_Rect::clear_h() { clear_has_h(); } inline float DrawPacket_Rect::h() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.Rect.h) return h_; } inline void DrawPacket_Rect::set_h(float value) { set_has_h(); h_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.DrawPacket.Rect.h) } // ------------------------------------------------------------------- @@ -3287,11 +3972,13 @@ inline void DrawPacket::clear_offsetx() { clear_has_offsetx(); } inline float DrawPacket::offsetx() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.offsetX) return offsetx_; } inline void DrawPacket::set_offsetx(float value) { set_has_offsetx(); offsetx_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.DrawPacket.offsetX) } // required float offsetY = 2; @@ -3309,11 +3996,13 @@ inline void DrawPacket::clear_offsety() { clear_has_offsety(); } inline float DrawPacket::offsety() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.offsetY) return offsety_; } inline void DrawPacket::set_offsety(float value) { set_has_offsety(); offsety_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.DrawPacket.offsetY) } // repeated float mvMatrix = 3; @@ -3324,20 +4013,25 @@ inline void DrawPacket::clear_mvmatrix() { mvmatrix_.Clear(); } inline float DrawPacket::mvmatrix(int index) const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.mvMatrix) return mvmatrix_.Get(index); } inline void DrawPacket::set_mvmatrix(int index, float value) { mvmatrix_.Set(index, value); + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.DrawPacket.mvMatrix) } inline void DrawPacket::add_mvmatrix(float value) { mvmatrix_.Add(value); + // @@protoc_insertion_point(field_add:mozilla.layers.layerscope.DrawPacket.mvMatrix) } inline const ::google::protobuf::RepeatedField< float >& DrawPacket::mvmatrix() const { + // @@protoc_insertion_point(field_list:mozilla.layers.layerscope.DrawPacket.mvMatrix) return mvmatrix_; } inline ::google::protobuf::RepeatedField< float >* DrawPacket::mutable_mvmatrix() { + // @@protoc_insertion_point(field_mutable_list:mozilla.layers.layerscope.DrawPacket.mvMatrix) return &mvmatrix_; } @@ -3356,11 +4050,13 @@ inline void DrawPacket::clear_totalrects() { clear_has_totalrects(); } inline ::google::protobuf::uint32 DrawPacket::totalrects() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.totalRects) return totalrects_; } inline void DrawPacket::set_totalrects(::google::protobuf::uint32 value) { set_has_totalrects(); totalrects_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.DrawPacket.totalRects) } // repeated .mozilla.layers.layerscope.DrawPacket.Rect layerRect = 5; @@ -3371,20 +4067,25 @@ inline void DrawPacket::clear_layerrect() { layerrect_.Clear(); } inline const ::mozilla::layers::layerscope::DrawPacket_Rect& DrawPacket::layerrect(int index) const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.layerRect) return layerrect_.Get(index); } inline ::mozilla::layers::layerscope::DrawPacket_Rect* DrawPacket::mutable_layerrect(int index) { + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.DrawPacket.layerRect) return layerrect_.Mutable(index); } inline ::mozilla::layers::layerscope::DrawPacket_Rect* DrawPacket::add_layerrect() { + // @@protoc_insertion_point(field_add:mozilla.layers.layerscope.DrawPacket.layerRect) return layerrect_.Add(); } inline const ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::DrawPacket_Rect >& DrawPacket::layerrect() const { + // @@protoc_insertion_point(field_list:mozilla.layers.layerscope.DrawPacket.layerRect) return layerrect_; } inline ::google::protobuf::RepeatedPtrField< ::mozilla::layers::layerscope::DrawPacket_Rect >* DrawPacket::mutable_layerrect() { + // @@protoc_insertion_point(field_mutable_list:mozilla.layers.layerscope.DrawPacket.layerRect) return &layerrect_; } @@ -3403,11 +4104,13 @@ inline void DrawPacket::clear_layerref() { clear_has_layerref(); } inline ::google::protobuf::uint64 DrawPacket::layerref() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.DrawPacket.layerref) return layerref_; } inline void DrawPacket::set_layerref(::google::protobuf::uint64 value) { set_has_layerref(); layerref_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.DrawPacket.layerref) } // ------------------------------------------------------------------- @@ -3429,12 +4132,14 @@ inline void Packet::clear_type() { clear_has_type(); } inline ::mozilla::layers::layerscope::Packet_DataType Packet::type() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.Packet.type) return static_cast< ::mozilla::layers::layerscope::Packet_DataType >(type_); } inline void Packet::set_type(::mozilla::layers::layerscope::Packet_DataType value) { - GOOGLE_DCHECK(::mozilla::layers::layerscope::Packet_DataType_IsValid(value)); + assert(::mozilla::layers::layerscope::Packet_DataType_IsValid(value)); set_has_type(); type_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.Packet.type) } // optional .mozilla.layers.layerscope.FramePacket frame = 2; @@ -3452,11 +4157,17 @@ inline void Packet::clear_frame() { clear_has_frame(); } inline const ::mozilla::layers::layerscope::FramePacket& Packet::frame() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.Packet.frame) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return frame_ != NULL ? *frame_ : *default_instance().frame_; +#else return frame_ != NULL ? *frame_ : *default_instance_->frame_; +#endif } inline ::mozilla::layers::layerscope::FramePacket* Packet::mutable_frame() { set_has_frame(); if (frame_ == NULL) frame_ = new ::mozilla::layers::layerscope::FramePacket; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.Packet.frame) return frame_; } inline ::mozilla::layers::layerscope::FramePacket* Packet::release_frame() { @@ -3465,6 +4176,16 @@ inline ::mozilla::layers::layerscope::FramePacket* Packet::release_frame() { frame_ = NULL; return temp; } +inline void Packet::set_allocated_frame(::mozilla::layers::layerscope::FramePacket* frame) { + delete frame_; + frame_ = frame; + if (frame) { + set_has_frame(); + } else { + clear_has_frame(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.Packet.frame) +} // optional .mozilla.layers.layerscope.ColorPacket color = 3; inline bool Packet::has_color() const { @@ -3481,11 +4202,17 @@ inline void Packet::clear_color() { clear_has_color(); } inline const ::mozilla::layers::layerscope::ColorPacket& Packet::color() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.Packet.color) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return color_ != NULL ? *color_ : *default_instance().color_; +#else return color_ != NULL ? *color_ : *default_instance_->color_; +#endif } inline ::mozilla::layers::layerscope::ColorPacket* Packet::mutable_color() { set_has_color(); if (color_ == NULL) color_ = new ::mozilla::layers::layerscope::ColorPacket; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.Packet.color) return color_; } inline ::mozilla::layers::layerscope::ColorPacket* Packet::release_color() { @@ -3494,6 +4221,16 @@ inline ::mozilla::layers::layerscope::ColorPacket* Packet::release_color() { color_ = NULL; return temp; } +inline void Packet::set_allocated_color(::mozilla::layers::layerscope::ColorPacket* color) { + delete color_; + color_ = color; + if (color) { + set_has_color(); + } else { + clear_has_color(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.Packet.color) +} // optional .mozilla.layers.layerscope.TexturePacket texture = 4; inline bool Packet::has_texture() const { @@ -3510,11 +4247,17 @@ inline void Packet::clear_texture() { clear_has_texture(); } inline const ::mozilla::layers::layerscope::TexturePacket& Packet::texture() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.Packet.texture) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return texture_ != NULL ? *texture_ : *default_instance().texture_; +#else return texture_ != NULL ? *texture_ : *default_instance_->texture_; +#endif } inline ::mozilla::layers::layerscope::TexturePacket* Packet::mutable_texture() { set_has_texture(); if (texture_ == NULL) texture_ = new ::mozilla::layers::layerscope::TexturePacket; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.Packet.texture) return texture_; } inline ::mozilla::layers::layerscope::TexturePacket* Packet::release_texture() { @@ -3523,6 +4266,16 @@ inline ::mozilla::layers::layerscope::TexturePacket* Packet::release_texture() { texture_ = NULL; return temp; } +inline void Packet::set_allocated_texture(::mozilla::layers::layerscope::TexturePacket* texture) { + delete texture_; + texture_ = texture; + if (texture) { + set_has_texture(); + } else { + clear_has_texture(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.Packet.texture) +} // optional .mozilla.layers.layerscope.LayersPacket layers = 5; inline bool Packet::has_layers() const { @@ -3539,11 +4292,17 @@ inline void Packet::clear_layers() { clear_has_layers(); } inline const ::mozilla::layers::layerscope::LayersPacket& Packet::layers() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.Packet.layers) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return layers_ != NULL ? *layers_ : *default_instance().layers_; +#else return layers_ != NULL ? *layers_ : *default_instance_->layers_; +#endif } inline ::mozilla::layers::layerscope::LayersPacket* Packet::mutable_layers() { set_has_layers(); if (layers_ == NULL) layers_ = new ::mozilla::layers::layerscope::LayersPacket; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.Packet.layers) return layers_; } inline ::mozilla::layers::layerscope::LayersPacket* Packet::release_layers() { @@ -3552,6 +4311,16 @@ inline ::mozilla::layers::layerscope::LayersPacket* Packet::release_layers() { layers_ = NULL; return temp; } +inline void Packet::set_allocated_layers(::mozilla::layers::layerscope::LayersPacket* layers) { + delete layers_; + layers_ = layers; + if (layers) { + set_has_layers(); + } else { + clear_has_layers(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.Packet.layers) +} // optional .mozilla.layers.layerscope.MetaPacket meta = 6; inline bool Packet::has_meta() const { @@ -3568,11 +4337,17 @@ inline void Packet::clear_meta() { clear_has_meta(); } inline const ::mozilla::layers::layerscope::MetaPacket& Packet::meta() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.Packet.meta) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return meta_ != NULL ? *meta_ : *default_instance().meta_; +#else return meta_ != NULL ? *meta_ : *default_instance_->meta_; +#endif } inline ::mozilla::layers::layerscope::MetaPacket* Packet::mutable_meta() { set_has_meta(); if (meta_ == NULL) meta_ = new ::mozilla::layers::layerscope::MetaPacket; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.Packet.meta) return meta_; } inline ::mozilla::layers::layerscope::MetaPacket* Packet::release_meta() { @@ -3581,6 +4356,16 @@ inline ::mozilla::layers::layerscope::MetaPacket* Packet::release_meta() { meta_ = NULL; return temp; } +inline void Packet::set_allocated_meta(::mozilla::layers::layerscope::MetaPacket* meta) { + delete meta_; + meta_ = meta; + if (meta) { + set_has_meta(); + } else { + clear_has_meta(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.Packet.meta) +} // optional .mozilla.layers.layerscope.DrawPacket draw = 7; inline bool Packet::has_draw() const { @@ -3597,11 +4382,17 @@ inline void Packet::clear_draw() { clear_has_draw(); } inline const ::mozilla::layers::layerscope::DrawPacket& Packet::draw() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.Packet.draw) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return draw_ != NULL ? *draw_ : *default_instance().draw_; +#else return draw_ != NULL ? *draw_ : *default_instance_->draw_; +#endif } inline ::mozilla::layers::layerscope::DrawPacket* Packet::mutable_draw() { set_has_draw(); if (draw_ == NULL) draw_ = new ::mozilla::layers::layerscope::DrawPacket; + // @@protoc_insertion_point(field_mutable:mozilla.layers.layerscope.Packet.draw) return draw_; } inline ::mozilla::layers::layerscope::DrawPacket* Packet::release_draw() { @@ -3610,6 +4401,16 @@ inline ::mozilla::layers::layerscope::DrawPacket* Packet::release_draw() { draw_ = NULL; return temp; } +inline void Packet::set_allocated_draw(::mozilla::layers::layerscope::DrawPacket* draw) { + delete draw_; + draw_ = draw; + if (draw) { + set_has_draw(); + } else { + clear_has_draw(); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.layers.layerscope.Packet.draw) +} // ------------------------------------------------------------------- @@ -3630,12 +4431,14 @@ inline void CommandPacket::clear_type() { clear_has_type(); } inline ::mozilla::layers::layerscope::CommandPacket_CmdType CommandPacket::type() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.CommandPacket.type) return static_cast< ::mozilla::layers::layerscope::CommandPacket_CmdType >(type_); } inline void CommandPacket::set_type(::mozilla::layers::layerscope::CommandPacket_CmdType value) { - GOOGLE_DCHECK(::mozilla::layers::layerscope::CommandPacket_CmdType_IsValid(value)); + assert(::mozilla::layers::layerscope::CommandPacket_CmdType_IsValid(value)); set_has_type(); type_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.CommandPacket.type) } // optional bool value = 2; @@ -3653,11 +4456,13 @@ inline void CommandPacket::clear_value() { clear_has_value(); } inline bool CommandPacket::value() const { + // @@protoc_insertion_point(field_get:mozilla.layers.layerscope.CommandPacket.value) return value_; } inline void CommandPacket::set_value(bool value) { set_has_value(); value_ = value; + // @@protoc_insertion_point(field_set:mozilla.layers.layerscope.CommandPacket.value) } diff --git a/toolkit/components/downloads/csd.pb.cc b/toolkit/components/downloads/csd.pb.cc index 99108deecfa02..5896e47688ee5 100644 --- a/toolkit/components/downloads/csd.pb.cc +++ b/toolkit/components/downloads/csd.pb.cc @@ -1,18 +1,27 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! +// source: csd.proto #define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION #include "csd.pb.h" #include +#include #include #include #include +#include // @@protoc_insertion_point(includes) namespace safe_browsing { void protobuf_ShutdownFile_csd_2eproto() { + delete ClientPhishingRequest::default_instance_; + delete ClientPhishingRequest_Feature::default_instance_; + delete ClientPhishingResponse::default_instance_; + delete ClientMalwareRequest::default_instance_; + delete ClientMalwareRequest_UrlInfo::default_instance_; + delete ClientMalwareResponse::default_instance_; delete ClientDownloadRequest::default_instance_; delete ClientDownloadRequest_Digests::default_instance_; delete ClientDownloadRequest_Resource::default_instance_; @@ -22,16 +31,51 @@ void protobuf_ShutdownFile_csd_2eproto() { delete ClientDownloadRequest_PEImageHeaders::default_instance_; delete ClientDownloadRequest_PEImageHeaders_DebugData::default_instance_; delete ClientDownloadRequest_ImageHeaders::default_instance_; + delete ClientDownloadRequest_ArchivedBinary::default_instance_; delete ClientDownloadResponse::default_instance_; delete ClientDownloadResponse_MoreInfo::default_instance_; -} + delete ClientDownloadReport::default_instance_; + delete ClientDownloadReport_UserInformation::default_instance_; + delete ClientUploadResponse::default_instance_; + delete ClientIncidentReport::default_instance_; + delete ClientIncidentReport_IncidentData::default_instance_; + delete ClientIncidentReport_IncidentData_TrackedPreferenceIncident::default_instance_; + delete ClientIncidentReport_IncidentData_BinaryIntegrityIncident::default_instance_; + delete ClientIncidentReport_IncidentData_BlacklistLoadIncident::default_instance_; + delete ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::default_instance_; + delete ClientIncidentReport_IncidentData_ScriptRequestIncident::default_instance_; + delete ClientIncidentReport_DownloadDetails::default_instance_; + delete ClientIncidentReport_EnvironmentData::default_instance_; + delete ClientIncidentReport_EnvironmentData_OS::default_instance_; + delete ClientIncidentReport_EnvironmentData_Machine::default_instance_; + delete ClientIncidentReport_EnvironmentData_Process::default_instance_; + delete ClientIncidentReport_EnvironmentData_Process_Patch::default_instance_; + delete ClientIncidentReport_EnvironmentData_Process_NetworkProvider::default_instance_; + delete ClientIncidentReport_EnvironmentData_Process_Dll::default_instance_; + delete ClientIncidentReport_EnvironmentData_Process_ModuleState::default_instance_; + delete ClientIncidentResponse::default_instance_; + delete ClientIncidentResponse_EnvironmentRequest::default_instance_; + delete DownloadMetadata::default_instance_; +} + +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER +void protobuf_AddDesc_csd_2eproto_impl() { + GOOGLE_PROTOBUF_VERIFY_VERSION; +#else void protobuf_AddDesc_csd_2eproto() { static bool already_here = false; if (already_here) return; already_here = true; GOOGLE_PROTOBUF_VERIFY_VERSION; +#endif + ClientPhishingRequest::default_instance_ = new ClientPhishingRequest(); + ClientPhishingRequest_Feature::default_instance_ = new ClientPhishingRequest_Feature(); + ClientPhishingResponse::default_instance_ = new ClientPhishingResponse(); + ClientMalwareRequest::default_instance_ = new ClientMalwareRequest(); + ClientMalwareRequest_UrlInfo::default_instance_ = new ClientMalwareRequest_UrlInfo(); + ClientMalwareResponse::default_instance_ = new ClientMalwareResponse(); ClientDownloadRequest::default_instance_ = new ClientDownloadRequest(); ClientDownloadRequest_Digests::default_instance_ = new ClientDownloadRequest_Digests(); ClientDownloadRequest_Resource::default_instance_ = new ClientDownloadRequest_Resource(); @@ -41,8 +85,37 @@ void protobuf_AddDesc_csd_2eproto() { ClientDownloadRequest_PEImageHeaders::default_instance_ = new ClientDownloadRequest_PEImageHeaders(); ClientDownloadRequest_PEImageHeaders_DebugData::default_instance_ = new ClientDownloadRequest_PEImageHeaders_DebugData(); ClientDownloadRequest_ImageHeaders::default_instance_ = new ClientDownloadRequest_ImageHeaders(); + ClientDownloadRequest_ArchivedBinary::default_instance_ = new ClientDownloadRequest_ArchivedBinary(); ClientDownloadResponse::default_instance_ = new ClientDownloadResponse(); ClientDownloadResponse_MoreInfo::default_instance_ = new ClientDownloadResponse_MoreInfo(); + ClientDownloadReport::default_instance_ = new ClientDownloadReport(); + ClientDownloadReport_UserInformation::default_instance_ = new ClientDownloadReport_UserInformation(); + ClientUploadResponse::default_instance_ = new ClientUploadResponse(); + ClientIncidentReport::default_instance_ = new ClientIncidentReport(); + ClientIncidentReport_IncidentData::default_instance_ = new ClientIncidentReport_IncidentData(); + ClientIncidentReport_IncidentData_TrackedPreferenceIncident::default_instance_ = new ClientIncidentReport_IncidentData_TrackedPreferenceIncident(); + ClientIncidentReport_IncidentData_BinaryIntegrityIncident::default_instance_ = new ClientIncidentReport_IncidentData_BinaryIntegrityIncident(); + ClientIncidentReport_IncidentData_BlacklistLoadIncident::default_instance_ = new ClientIncidentReport_IncidentData_BlacklistLoadIncident(); + ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::default_instance_ = new ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident(); + ClientIncidentReport_IncidentData_ScriptRequestIncident::default_instance_ = new ClientIncidentReport_IncidentData_ScriptRequestIncident(); + ClientIncidentReport_DownloadDetails::default_instance_ = new ClientIncidentReport_DownloadDetails(); + ClientIncidentReport_EnvironmentData::default_instance_ = new ClientIncidentReport_EnvironmentData(); + ClientIncidentReport_EnvironmentData_OS::default_instance_ = new ClientIncidentReport_EnvironmentData_OS(); + ClientIncidentReport_EnvironmentData_Machine::default_instance_ = new ClientIncidentReport_EnvironmentData_Machine(); + ClientIncidentReport_EnvironmentData_Process::default_instance_ = new ClientIncidentReport_EnvironmentData_Process(); + ClientIncidentReport_EnvironmentData_Process_Patch::default_instance_ = new ClientIncidentReport_EnvironmentData_Process_Patch(); + ClientIncidentReport_EnvironmentData_Process_NetworkProvider::default_instance_ = new ClientIncidentReport_EnvironmentData_Process_NetworkProvider(); + ClientIncidentReport_EnvironmentData_Process_Dll::default_instance_ = new ClientIncidentReport_EnvironmentData_Process_Dll(); + ClientIncidentReport_EnvironmentData_Process_ModuleState::default_instance_ = new ClientIncidentReport_EnvironmentData_Process_ModuleState(); + ClientIncidentResponse::default_instance_ = new ClientIncidentResponse(); + ClientIncidentResponse_EnvironmentRequest::default_instance_ = new ClientIncidentResponse_EnvironmentRequest(); + DownloadMetadata::default_instance_ = new DownloadMetadata(); + ClientPhishingRequest::default_instance_->InitAsDefaultInstance(); + ClientPhishingRequest_Feature::default_instance_->InitAsDefaultInstance(); + ClientPhishingResponse::default_instance_->InitAsDefaultInstance(); + ClientMalwareRequest::default_instance_->InitAsDefaultInstance(); + ClientMalwareRequest_UrlInfo::default_instance_->InitAsDefaultInstance(); + ClientMalwareResponse::default_instance_->InitAsDefaultInstance(); ClientDownloadRequest::default_instance_->InitAsDefaultInstance(); ClientDownloadRequest_Digests::default_instance_->InitAsDefaultInstance(); ClientDownloadRequest_Resource::default_instance_->InitAsDefaultInstance(); @@ -52,2831 +125,11940 @@ void protobuf_AddDesc_csd_2eproto() { ClientDownloadRequest_PEImageHeaders::default_instance_->InitAsDefaultInstance(); ClientDownloadRequest_PEImageHeaders_DebugData::default_instance_->InitAsDefaultInstance(); ClientDownloadRequest_ImageHeaders::default_instance_->InitAsDefaultInstance(); + ClientDownloadRequest_ArchivedBinary::default_instance_->InitAsDefaultInstance(); ClientDownloadResponse::default_instance_->InitAsDefaultInstance(); ClientDownloadResponse_MoreInfo::default_instance_->InitAsDefaultInstance(); + ClientDownloadReport::default_instance_->InitAsDefaultInstance(); + ClientDownloadReport_UserInformation::default_instance_->InitAsDefaultInstance(); + ClientUploadResponse::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_IncidentData::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_IncidentData_TrackedPreferenceIncident::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_IncidentData_BinaryIntegrityIncident::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_IncidentData_BlacklistLoadIncident::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_IncidentData_ScriptRequestIncident::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_DownloadDetails::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_EnvironmentData::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_EnvironmentData_OS::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_EnvironmentData_Machine::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_EnvironmentData_Process::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_EnvironmentData_Process_Patch::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_EnvironmentData_Process_NetworkProvider::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_EnvironmentData_Process_Dll::default_instance_->InitAsDefaultInstance(); + ClientIncidentReport_EnvironmentData_Process_ModuleState::default_instance_->InitAsDefaultInstance(); + ClientIncidentResponse::default_instance_->InitAsDefaultInstance(); + ClientIncidentResponse_EnvironmentRequest::default_instance_->InitAsDefaultInstance(); + DownloadMetadata::default_instance_->InitAsDefaultInstance(); ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_csd_2eproto); } +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AddDesc_csd_2eproto_once_); +void protobuf_AddDesc_csd_2eproto() { + ::google::protobuf::GoogleOnceInit(&protobuf_AddDesc_csd_2eproto_once_, + &protobuf_AddDesc_csd_2eproto_impl); +} +#else // Force AddDescriptors() to be called at static initialization time. struct StaticDescriptorInitializer_csd_2eproto { StaticDescriptorInitializer_csd_2eproto() { protobuf_AddDesc_csd_2eproto(); } } static_descriptor_initializer_csd_2eproto_; - +#endif // =================================================================== -bool ClientDownloadRequest_ResourceType_IsValid(int value) { - switch(value) { - case 0: - case 1: - case 2: - case 3: - return true; - default: - return false; - } -} - -#ifndef _MSC_VER -const ClientDownloadRequest_ResourceType ClientDownloadRequest::DOWNLOAD_URL; -const ClientDownloadRequest_ResourceType ClientDownloadRequest::DOWNLOAD_REDIRECT; -const ClientDownloadRequest_ResourceType ClientDownloadRequest::TAB_URL; -const ClientDownloadRequest_ResourceType ClientDownloadRequest::TAB_REDIRECT; -const ClientDownloadRequest_ResourceType ClientDownloadRequest::ResourceType_MIN; -const ClientDownloadRequest_ResourceType ClientDownloadRequest::ResourceType_MAX; -const int ClientDownloadRequest::ResourceType_ARRAYSIZE; -#endif // _MSC_VER -bool ClientDownloadRequest_DownloadType_IsValid(int value) { - switch(value) { - case 0: - case 1: - case 2: - case 3: - return true; - default: - return false; - } -} - -#ifndef _MSC_VER -const ClientDownloadRequest_DownloadType ClientDownloadRequest::WIN_EXECUTABLE; -const ClientDownloadRequest_DownloadType ClientDownloadRequest::CHROME_EXTENSION; -const ClientDownloadRequest_DownloadType ClientDownloadRequest::ANDROID_APK; -const ClientDownloadRequest_DownloadType ClientDownloadRequest::ZIPPED_EXECUTABLE; -const ClientDownloadRequest_DownloadType ClientDownloadRequest::DownloadType_MIN; -const ClientDownloadRequest_DownloadType ClientDownloadRequest::DownloadType_MAX; -const int ClientDownloadRequest::DownloadType_ARRAYSIZE; -#endif // _MSC_VER #ifndef _MSC_VER -const int ClientDownloadRequest_Digests::kSha256FieldNumber; -const int ClientDownloadRequest_Digests::kSha1FieldNumber; -const int ClientDownloadRequest_Digests::kMd5FieldNumber; +const int ClientPhishingRequest_Feature::kNameFieldNumber; +const int ClientPhishingRequest_Feature::kValueFieldNumber; #endif // !_MSC_VER -ClientDownloadRequest_Digests::ClientDownloadRequest_Digests() +ClientPhishingRequest_Feature::ClientPhishingRequest_Feature() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientPhishingRequest.Feature) } -void ClientDownloadRequest_Digests::InitAsDefaultInstance() { +void ClientPhishingRequest_Feature::InitAsDefaultInstance() { } -ClientDownloadRequest_Digests::ClientDownloadRequest_Digests(const ClientDownloadRequest_Digests& from) +ClientPhishingRequest_Feature::ClientPhishingRequest_Feature(const ClientPhishingRequest_Feature& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientPhishingRequest.Feature) } -void ClientDownloadRequest_Digests::SharedCtor() { +void ClientPhishingRequest_Feature::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; - sha256_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - sha1_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - md5_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + value_ = 0; ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadRequest_Digests::~ClientDownloadRequest_Digests() { +ClientPhishingRequest_Feature::~ClientPhishingRequest_Feature() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientPhishingRequest.Feature) SharedDtor(); } -void ClientDownloadRequest_Digests::SharedDtor() { - if (sha256_ != &::google::protobuf::internal::kEmptyString) { - delete sha256_; - } - if (sha1_ != &::google::protobuf::internal::kEmptyString) { - delete sha1_; - } - if (md5_ != &::google::protobuf::internal::kEmptyString) { - delete md5_; +void ClientPhishingRequest_Feature::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } -void ClientDownloadRequest_Digests::SetCachedSize(int size) const { +void ClientPhishingRequest_Feature::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadRequest_Digests& ClientDownloadRequest_Digests::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientPhishingRequest_Feature& ClientPhishingRequest_Feature::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadRequest_Digests* ClientDownloadRequest_Digests::default_instance_ = NULL; +ClientPhishingRequest_Feature* ClientPhishingRequest_Feature::default_instance_ = NULL; -ClientDownloadRequest_Digests* ClientDownloadRequest_Digests::New() const { - return new ClientDownloadRequest_Digests; +ClientPhishingRequest_Feature* ClientPhishingRequest_Feature::New() const { + return new ClientPhishingRequest_Feature; } -void ClientDownloadRequest_Digests::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (has_sha256()) { - if (sha256_ != &::google::protobuf::internal::kEmptyString) { - sha256_->clear(); - } - } - if (has_sha1()) { - if (sha1_ != &::google::protobuf::internal::kEmptyString) { - sha1_->clear(); - } - } - if (has_md5()) { - if (md5_ != &::google::protobuf::internal::kEmptyString) { - md5_->clear(); +void ClientPhishingRequest_Feature::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); } } + value_ = 0; } ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadRequest_Digests::MergePartialFromCodedStream( +bool ClientPhishingRequest_Feature::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientPhishingRequest.Feature) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // optional bytes sha256 = 1; + // required string name = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_sha256())); + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(18)) goto parse_sha1; + if (input->ExpectTag(17)) goto parse_value; break; } - - // optional bytes sha1 = 2; + + // required double value = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_sha1: - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_sha1())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(26)) goto parse_md5; - break; - } - - // optional bytes md5 = 3; - case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_md5: - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_md5())); + if (tag == 17) { + parse_value: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &value_))); + set_has_value(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientPhishingRequest.Feature) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientPhishingRequest.Feature) + return false; #undef DO_ } -void ClientDownloadRequest_Digests::SerializeWithCachedSizes( +void ClientPhishingRequest_Feature::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // optional bytes sha256 = 1; - if (has_sha256()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 1, this->sha256(), output); - } - - // optional bytes sha1 = 2; - if (has_sha1()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 2, this->sha1(), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientPhishingRequest.Feature) + // required string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); } - - // optional bytes md5 = 3; - if (has_md5()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 3, this->md5(), output); + + // required double value = 2; + if (has_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->value(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientPhishingRequest.Feature) } -int ClientDownloadRequest_Digests::ByteSize() const { +int ClientPhishingRequest_Feature::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // optional bytes sha256 = 1; - if (has_sha256()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->sha256()); - } - - // optional bytes sha1 = 2; - if (has_sha1()) { + // required string name = 1; + if (has_name()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->sha1()); + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); } - - // optional bytes md5 = 3; - if (has_md5()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->md5()); + + // required double value = 2; + if (has_value()) { + total_size += 1 + 8; } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadRequest_Digests::CheckTypeAndMergeFrom( +void ClientPhishingRequest_Feature::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadRequest_Digests::MergeFrom(const ClientDownloadRequest_Digests& from) { +void ClientPhishingRequest_Feature::MergeFrom(const ClientPhishingRequest_Feature& from) { GOOGLE_CHECK_NE(&from, this); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (from.has_sha256()) { - set_sha256(from.sha256()); - } - if (from.has_sha1()) { - set_sha1(from.sha1()); + if (from.has_name()) { + set_name(from.name()); } - if (from.has_md5()) { - set_md5(from.md5()); + if (from.has_value()) { + set_value(from.value()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadRequest_Digests::CopyFrom(const ClientDownloadRequest_Digests& from) { +void ClientPhishingRequest_Feature::CopyFrom(const ClientPhishingRequest_Feature& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadRequest_Digests::IsInitialized() const { - +bool ClientPhishingRequest_Feature::IsInitialized() const { + if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false; + return true; } -void ClientDownloadRequest_Digests::Swap(ClientDownloadRequest_Digests* other) { +void ClientPhishingRequest_Feature::Swap(ClientPhishingRequest_Feature* other) { if (other != this) { - std::swap(sha256_, other->sha256_); - std::swap(sha1_, other->sha1_); - std::swap(md5_, other->md5_); + std::swap(name_, other->name_); + std::swap(value_, other->value_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadRequest_Digests::GetTypeName() const { - return "safe_browsing.ClientDownloadRequest.Digests"; +::std::string ClientPhishingRequest_Feature::GetTypeName() const { + return "safe_browsing.ClientPhishingRequest.Feature"; } // ------------------------------------------------------------------- #ifndef _MSC_VER -const int ClientDownloadRequest_Resource::kUrlFieldNumber; -const int ClientDownloadRequest_Resource::kTypeFieldNumber; -const int ClientDownloadRequest_Resource::kRemoteIpFieldNumber; -const int ClientDownloadRequest_Resource::kReferrerFieldNumber; +const int ClientPhishingRequest::kUrlFieldNumber; +const int ClientPhishingRequest::kOBSOLETEHashPrefixFieldNumber; +const int ClientPhishingRequest::kClientScoreFieldNumber; +const int ClientPhishingRequest::kIsPhishingFieldNumber; +const int ClientPhishingRequest::kFeatureMapFieldNumber; +const int ClientPhishingRequest::kModelVersionFieldNumber; +const int ClientPhishingRequest::kNonModelFeatureMapFieldNumber; +const int ClientPhishingRequest::kOBSOLETEReferrerUrlFieldNumber; +const int ClientPhishingRequest::kShingleHashesFieldNumber; #endif // !_MSC_VER -ClientDownloadRequest_Resource::ClientDownloadRequest_Resource() +ClientPhishingRequest::ClientPhishingRequest() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientPhishingRequest) } -void ClientDownloadRequest_Resource::InitAsDefaultInstance() { +void ClientPhishingRequest::InitAsDefaultInstance() { } -ClientDownloadRequest_Resource::ClientDownloadRequest_Resource(const ClientDownloadRequest_Resource& from) +ClientPhishingRequest::ClientPhishingRequest(const ClientPhishingRequest& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientPhishingRequest) } -void ClientDownloadRequest_Resource::SharedCtor() { +void ClientPhishingRequest::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; - url_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - type_ = 0; - remote_ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - referrer_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + obsolete_hash_prefix_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + client_score_ = 0; + is_phishing_ = false; + model_version_ = 0; + obsolete_referrer_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadRequest_Resource::~ClientDownloadRequest_Resource() { +ClientPhishingRequest::~ClientPhishingRequest() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientPhishingRequest) SharedDtor(); } -void ClientDownloadRequest_Resource::SharedDtor() { - if (url_ != &::google::protobuf::internal::kEmptyString) { +void ClientPhishingRequest::SharedDtor() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { delete url_; } - if (remote_ip_ != &::google::protobuf::internal::kEmptyString) { - delete remote_ip_; + if (obsolete_hash_prefix_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete obsolete_hash_prefix_; } - if (referrer_ != &::google::protobuf::internal::kEmptyString) { - delete referrer_; + if (obsolete_referrer_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete obsolete_referrer_url_; } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } -void ClientDownloadRequest_Resource::SetCachedSize(int size) const { +void ClientPhishingRequest::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadRequest_Resource& ClientDownloadRequest_Resource::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientPhishingRequest& ClientPhishingRequest::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadRequest_Resource* ClientDownloadRequest_Resource::default_instance_ = NULL; +ClientPhishingRequest* ClientPhishingRequest::default_instance_ = NULL; -ClientDownloadRequest_Resource* ClientDownloadRequest_Resource::New() const { - return new ClientDownloadRequest_Resource; +ClientPhishingRequest* ClientPhishingRequest::New() const { + return new ClientPhishingRequest; } -void ClientDownloadRequest_Resource::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { +void ClientPhishingRequest::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + if (_has_bits_[0 / 32] & 175) { + ZR_(client_score_, is_phishing_); if (has_url()) { - if (url_ != &::google::protobuf::internal::kEmptyString) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { url_->clear(); } } - type_ = 0; - if (has_remote_ip()) { - if (remote_ip_ != &::google::protobuf::internal::kEmptyString) { - remote_ip_->clear(); + if (has_obsolete_hash_prefix()) { + if (obsolete_hash_prefix_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_hash_prefix_->clear(); } } - if (has_referrer()) { - if (referrer_ != &::google::protobuf::internal::kEmptyString) { - referrer_->clear(); + model_version_ = 0; + if (has_obsolete_referrer_url()) { + if (obsolete_referrer_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_referrer_url_->clear(); } } } + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + feature_map_.Clear(); + non_model_feature_map_.Clear(); + shingle_hashes_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadRequest_Resource::MergePartialFromCodedStream( +bool ClientPhishingRequest::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientPhishingRequest) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // required string url = 1; + // optional string url = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 10) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_url())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(16)) goto parse_type; + if (input->ExpectTag(21)) goto parse_client_score; break; } - - // required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; + + // required float client_score = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - parse_type: - int value; + if (tag == 21) { + parse_client_score: DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( - input, &value))); - if (::safe_browsing::ClientDownloadRequest_ResourceType_IsValid(value)) { - set_type(static_cast< ::safe_browsing::ClientDownloadRequest_ResourceType >(value)); - } + float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>( + input, &client_score_))); + set_has_client_score(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(26)) goto parse_remote_ip; + if (input->ExpectTag(32)) goto parse_is_phishing; break; } - - // optional bytes remote_ip = 3; - case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_remote_ip: - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_remote_ip())); + + // optional bool is_phishing = 4; + case 4: { + if (tag == 32) { + parse_is_phishing: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &is_phishing_))); + set_has_is_phishing(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(34)) goto parse_referrer; + if (input->ExpectTag(42)) goto parse_feature_map; break; } - - // optional string referrer = 4; - case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_referrer: + + // repeated .safe_browsing.ClientPhishingRequest.Feature feature_map = 5; + case 5: { + if (tag == 42) { + parse_feature_map: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_feature_map())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_feature_map; + if (input->ExpectTag(48)) goto parse_model_version; + break; + } + + // optional int32 model_version = 6; + case 6: { + if (tag == 48) { + parse_model_version: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &model_version_))); + set_has_model_version(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(66)) goto parse_non_model_feature_map; + break; + } + + // repeated .safe_browsing.ClientPhishingRequest.Feature non_model_feature_map = 8; + case 8: { + if (tag == 66) { + parse_non_model_feature_map: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_non_model_feature_map())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(66)) goto parse_non_model_feature_map; + if (input->ExpectTag(74)) goto parse_OBSOLETE_referrer_url; + break; + } + + // optional string OBSOLETE_referrer_url = 9; + case 9: { + if (tag == 74) { + parse_OBSOLETE_referrer_url: DO_(::google::protobuf::internal::WireFormatLite::ReadString( - input, this->mutable_referrer())); + input, this->mutable_obsolete_referrer_url())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(82)) goto parse_OBSOLETE_hash_prefix; + break; + } + + // optional bytes OBSOLETE_hash_prefix = 10; + case 10: { + if (tag == 82) { + parse_OBSOLETE_hash_prefix: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_obsolete_hash_prefix())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(98)) goto parse_shingle_hashes; + break; + } + + // repeated uint32 shingle_hashes = 12 [packed = true]; + case 12: { + if (tag == 98) { + parse_shingle_hashes: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, this->mutable_shingle_hashes()))); + } else if (tag == 96) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + 1, 98, input, this->mutable_shingle_hashes()))); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientPhishingRequest) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientPhishingRequest) + return false; #undef DO_ } -void ClientDownloadRequest_Resource::SerializeWithCachedSizes( +void ClientPhishingRequest::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // required string url = 1; + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientPhishingRequest) + // optional string url = 1; if (has_url()) { - ::google::protobuf::internal::WireFormatLite::WriteString( + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->url(), output); } - - // required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; - if (has_type()) { - ::google::protobuf::internal::WireFormatLite::WriteEnum( - 2, this->type(), output); + + // required float client_score = 2; + if (has_client_score()) { + ::google::protobuf::internal::WireFormatLite::WriteFloat(2, this->client_score(), output); } - - // optional bytes remote_ip = 3; - if (has_remote_ip()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 3, this->remote_ip(), output); + + // optional bool is_phishing = 4; + if (has_is_phishing()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->is_phishing(), output); } - - // optional string referrer = 4; - if (has_referrer()) { - ::google::protobuf::internal::WireFormatLite::WriteString( - 4, this->referrer(), output); + + // repeated .safe_browsing.ClientPhishingRequest.Feature feature_map = 5; + for (int i = 0; i < this->feature_map_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 5, this->feature_map(i), output); + } + + // optional int32 model_version = 6; + if (has_model_version()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(6, this->model_version(), output); + } + + // repeated .safe_browsing.ClientPhishingRequest.Feature non_model_feature_map = 8; + for (int i = 0; i < this->non_model_feature_map_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 8, this->non_model_feature_map(i), output); + } + + // optional string OBSOLETE_referrer_url = 9; + if (has_obsolete_referrer_url()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 9, this->obsolete_referrer_url(), output); + } + + // optional bytes OBSOLETE_hash_prefix = 10; + if (has_obsolete_hash_prefix()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 10, this->obsolete_hash_prefix(), output); + } + + // repeated uint32 shingle_hashes = 12 [packed = true]; + if (this->shingle_hashes_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(12, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_shingle_hashes_cached_byte_size_); + } + for (int i = 0; i < this->shingle_hashes_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32NoTag( + this->shingle_hashes(i), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientPhishingRequest) } -int ClientDownloadRequest_Resource::ByteSize() const { +int ClientPhishingRequest::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // required string url = 1; + // optional string url = 1; if (has_url()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->url()); } - - // required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; - if (has_type()) { + + // optional bytes OBSOLETE_hash_prefix = 10; + if (has_obsolete_hash_prefix()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->obsolete_hash_prefix()); } - - // optional bytes remote_ip = 3; - if (has_remote_ip()) { + + // required float client_score = 2; + if (has_client_score()) { + total_size += 1 + 4; + } + + // optional bool is_phishing = 4; + if (has_is_phishing()) { + total_size += 1 + 1; + } + + // optional int32 model_version = 6; + if (has_model_version()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->remote_ip()); + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->model_version()); } - - // optional string referrer = 4; - if (has_referrer()) { + + // optional string OBSOLETE_referrer_url = 9; + if (has_obsolete_referrer_url()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( - this->referrer()); + this->obsolete_referrer_url()); + } + + } + // repeated .safe_browsing.ClientPhishingRequest.Feature feature_map = 5; + total_size += 1 * this->feature_map_size(); + for (int i = 0; i < this->feature_map_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->feature_map(i)); + } + + // repeated .safe_browsing.ClientPhishingRequest.Feature non_model_feature_map = 8; + total_size += 1 * this->non_model_feature_map_size(); + for (int i = 0; i < this->non_model_feature_map_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->non_model_feature_map(i)); + } + + // repeated uint32 shingle_hashes = 12 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->shingle_hashes_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + UInt32Size(this->shingle_hashes(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); } - + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _shingle_hashes_cached_byte_size_ = data_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + total_size += data_size; } + + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadRequest_Resource::CheckTypeAndMergeFrom( +void ClientPhishingRequest::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadRequest_Resource::MergeFrom(const ClientDownloadRequest_Resource& from) { +void ClientPhishingRequest::MergeFrom(const ClientPhishingRequest& from) { GOOGLE_CHECK_NE(&from, this); + feature_map_.MergeFrom(from.feature_map_); + non_model_feature_map_.MergeFrom(from.non_model_feature_map_); + shingle_hashes_.MergeFrom(from.shingle_hashes_); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { if (from.has_url()) { set_url(from.url()); } - if (from.has_type()) { - set_type(from.type()); + if (from.has_obsolete_hash_prefix()) { + set_obsolete_hash_prefix(from.obsolete_hash_prefix()); } - if (from.has_remote_ip()) { - set_remote_ip(from.remote_ip()); + if (from.has_client_score()) { + set_client_score(from.client_score()); } - if (from.has_referrer()) { - set_referrer(from.referrer()); + if (from.has_is_phishing()) { + set_is_phishing(from.is_phishing()); + } + if (from.has_model_version()) { + set_model_version(from.model_version()); + } + if (from.has_obsolete_referrer_url()) { + set_obsolete_referrer_url(from.obsolete_referrer_url()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadRequest_Resource::CopyFrom(const ClientDownloadRequest_Resource& from) { +void ClientPhishingRequest::CopyFrom(const ClientPhishingRequest& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadRequest_Resource::IsInitialized() const { - if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false; - +bool ClientPhishingRequest::IsInitialized() const { + if ((_has_bits_[0] & 0x00000004) != 0x00000004) return false; + + if (!::google::protobuf::internal::AllAreInitialized(this->feature_map())) return false; + if (!::google::protobuf::internal::AllAreInitialized(this->non_model_feature_map())) return false; return true; } -void ClientDownloadRequest_Resource::Swap(ClientDownloadRequest_Resource* other) { +void ClientPhishingRequest::Swap(ClientPhishingRequest* other) { if (other != this) { std::swap(url_, other->url_); - std::swap(type_, other->type_); - std::swap(remote_ip_, other->remote_ip_); - std::swap(referrer_, other->referrer_); + std::swap(obsolete_hash_prefix_, other->obsolete_hash_prefix_); + std::swap(client_score_, other->client_score_); + std::swap(is_phishing_, other->is_phishing_); + feature_map_.Swap(&other->feature_map_); + std::swap(model_version_, other->model_version_); + non_model_feature_map_.Swap(&other->non_model_feature_map_); + std::swap(obsolete_referrer_url_, other->obsolete_referrer_url_); + shingle_hashes_.Swap(&other->shingle_hashes_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadRequest_Resource::GetTypeName() const { - return "safe_browsing.ClientDownloadRequest.Resource"; +::std::string ClientPhishingRequest::GetTypeName() const { + return "safe_browsing.ClientPhishingRequest"; } -// ------------------------------------------------------------------- +// =================================================================== #ifndef _MSC_VER -const int ClientDownloadRequest_CertificateChain_Element::kCertificateFieldNumber; +const int ClientPhishingResponse::kPhishyFieldNumber; +const int ClientPhishingResponse::kOBSOLETEWhitelistExpressionFieldNumber; #endif // !_MSC_VER -ClientDownloadRequest_CertificateChain_Element::ClientDownloadRequest_CertificateChain_Element() +ClientPhishingResponse::ClientPhishingResponse() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientPhishingResponse) } -void ClientDownloadRequest_CertificateChain_Element::InitAsDefaultInstance() { +void ClientPhishingResponse::InitAsDefaultInstance() { } -ClientDownloadRequest_CertificateChain_Element::ClientDownloadRequest_CertificateChain_Element(const ClientDownloadRequest_CertificateChain_Element& from) +ClientPhishingResponse::ClientPhishingResponse(const ClientPhishingResponse& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientPhishingResponse) } -void ClientDownloadRequest_CertificateChain_Element::SharedCtor() { +void ClientPhishingResponse::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; - certificate_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + phishy_ = false; ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadRequest_CertificateChain_Element::~ClientDownloadRequest_CertificateChain_Element() { +ClientPhishingResponse::~ClientPhishingResponse() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientPhishingResponse) SharedDtor(); } -void ClientDownloadRequest_CertificateChain_Element::SharedDtor() { - if (certificate_ != &::google::protobuf::internal::kEmptyString) { - delete certificate_; - } +void ClientPhishingResponse::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } -void ClientDownloadRequest_CertificateChain_Element::SetCachedSize(int size) const { +void ClientPhishingResponse::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadRequest_CertificateChain_Element& ClientDownloadRequest_CertificateChain_Element::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientPhishingResponse& ClientPhishingResponse::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadRequest_CertificateChain_Element* ClientDownloadRequest_CertificateChain_Element::default_instance_ = NULL; +ClientPhishingResponse* ClientPhishingResponse::default_instance_ = NULL; -ClientDownloadRequest_CertificateChain_Element* ClientDownloadRequest_CertificateChain_Element::New() const { - return new ClientDownloadRequest_CertificateChain_Element; +ClientPhishingResponse* ClientPhishingResponse::New() const { + return new ClientPhishingResponse; } -void ClientDownloadRequest_CertificateChain_Element::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (has_certificate()) { - if (certificate_ != &::google::protobuf::internal::kEmptyString) { - certificate_->clear(); - } - } - } +void ClientPhishingResponse::Clear() { + phishy_ = false; + obsolete_whitelist_expression_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadRequest_CertificateChain_Element::MergePartialFromCodedStream( +bool ClientPhishingResponse::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientPhishingResponse) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // optional bytes certificate = 1; + // required bool phishy = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_certificate())); + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &phishy_))); + set_has_phishy(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_OBSOLETE_whitelist_expression; + break; + } + + // repeated string OBSOLETE_whitelist_expression = 2; + case 2: { + if (tag == 18) { + parse_OBSOLETE_whitelist_expression: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_obsolete_whitelist_expression())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectTag(18)) goto parse_OBSOLETE_whitelist_expression; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientPhishingResponse) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientPhishingResponse) + return false; #undef DO_ } -void ClientDownloadRequest_CertificateChain_Element::SerializeWithCachedSizes( +void ClientPhishingResponse::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // optional bytes certificate = 1; - if (has_certificate()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 1, this->certificate(), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientPhishingResponse) + // required bool phishy = 1; + if (has_phishy()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->phishy(), output); } - + + // repeated string OBSOLETE_whitelist_expression = 2; + for (int i = 0; i < this->obsolete_whitelist_expression_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->obsolete_whitelist_expression(i), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientPhishingResponse) } -int ClientDownloadRequest_CertificateChain_Element::ByteSize() const { +int ClientPhishingResponse::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // optional bytes certificate = 1; - if (has_certificate()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->certificate()); + // required bool phishy = 1; + if (has_phishy()) { + total_size += 1 + 1; } - + + } + // repeated string OBSOLETE_whitelist_expression = 2; + total_size += 1 * this->obsolete_whitelist_expression_size(); + for (int i = 0; i < this->obsolete_whitelist_expression_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->obsolete_whitelist_expression(i)); } + + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadRequest_CertificateChain_Element::CheckTypeAndMergeFrom( +void ClientPhishingResponse::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadRequest_CertificateChain_Element::MergeFrom(const ClientDownloadRequest_CertificateChain_Element& from) { +void ClientPhishingResponse::MergeFrom(const ClientPhishingResponse& from) { GOOGLE_CHECK_NE(&from, this); + obsolete_whitelist_expression_.MergeFrom(from.obsolete_whitelist_expression_); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (from.has_certificate()) { - set_certificate(from.certificate()); + if (from.has_phishy()) { + set_phishy(from.phishy()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadRequest_CertificateChain_Element::CopyFrom(const ClientDownloadRequest_CertificateChain_Element& from) { +void ClientPhishingResponse::CopyFrom(const ClientPhishingResponse& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadRequest_CertificateChain_Element::IsInitialized() const { - +bool ClientPhishingResponse::IsInitialized() const { + if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; + return true; } -void ClientDownloadRequest_CertificateChain_Element::Swap(ClientDownloadRequest_CertificateChain_Element* other) { +void ClientPhishingResponse::Swap(ClientPhishingResponse* other) { if (other != this) { - std::swap(certificate_, other->certificate_); + std::swap(phishy_, other->phishy_); + obsolete_whitelist_expression_.Swap(&other->obsolete_whitelist_expression_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadRequest_CertificateChain_Element::GetTypeName() const { - return "safe_browsing.ClientDownloadRequest.CertificateChain.Element"; +::std::string ClientPhishingResponse::GetTypeName() const { + return "safe_browsing.ClientPhishingResponse"; } -// ------------------------------------------------------------------- +// =================================================================== #ifndef _MSC_VER -const int ClientDownloadRequest_CertificateChain::kElementFieldNumber; +const int ClientMalwareRequest_UrlInfo::kIpFieldNumber; +const int ClientMalwareRequest_UrlInfo::kUrlFieldNumber; +const int ClientMalwareRequest_UrlInfo::kMethodFieldNumber; +const int ClientMalwareRequest_UrlInfo::kReferrerFieldNumber; +const int ClientMalwareRequest_UrlInfo::kResourceTypeFieldNumber; #endif // !_MSC_VER -ClientDownloadRequest_CertificateChain::ClientDownloadRequest_CertificateChain() +ClientMalwareRequest_UrlInfo::ClientMalwareRequest_UrlInfo() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientMalwareRequest.UrlInfo) } -void ClientDownloadRequest_CertificateChain::InitAsDefaultInstance() { +void ClientMalwareRequest_UrlInfo::InitAsDefaultInstance() { } -ClientDownloadRequest_CertificateChain::ClientDownloadRequest_CertificateChain(const ClientDownloadRequest_CertificateChain& from) +ClientMalwareRequest_UrlInfo::ClientMalwareRequest_UrlInfo(const ClientMalwareRequest_UrlInfo& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientMalwareRequest.UrlInfo) } -void ClientDownloadRequest_CertificateChain::SharedCtor() { +void ClientMalwareRequest_UrlInfo::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; + ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + method_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + referrer_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + resource_type_ = 0; ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadRequest_CertificateChain::~ClientDownloadRequest_CertificateChain() { +ClientMalwareRequest_UrlInfo::~ClientMalwareRequest_UrlInfo() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientMalwareRequest.UrlInfo) SharedDtor(); } -void ClientDownloadRequest_CertificateChain::SharedDtor() { +void ClientMalwareRequest_UrlInfo::SharedDtor() { + if (ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete ip_; + } + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (method_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete method_; + } + if (referrer_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete referrer_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } -void ClientDownloadRequest_CertificateChain::SetCachedSize(int size) const { +void ClientMalwareRequest_UrlInfo::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadRequest_CertificateChain& ClientDownloadRequest_CertificateChain::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientMalwareRequest_UrlInfo& ClientMalwareRequest_UrlInfo::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadRequest_CertificateChain* ClientDownloadRequest_CertificateChain::default_instance_ = NULL; +ClientMalwareRequest_UrlInfo* ClientMalwareRequest_UrlInfo::default_instance_ = NULL; -ClientDownloadRequest_CertificateChain* ClientDownloadRequest_CertificateChain::New() const { - return new ClientDownloadRequest_CertificateChain; +ClientMalwareRequest_UrlInfo* ClientMalwareRequest_UrlInfo::New() const { + return new ClientMalwareRequest_UrlInfo; } -void ClientDownloadRequest_CertificateChain::Clear() { - element_.Clear(); +void ClientMalwareRequest_UrlInfo::Clear() { + if (_has_bits_[0 / 32] & 31) { + if (has_ip()) { + if (ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + ip_->clear(); + } + } + if (has_url()) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + } + if (has_method()) { + if (method_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + method_->clear(); + } + } + if (has_referrer()) { + if (referrer_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_->clear(); + } + } + resource_type_ = 0; + } ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadRequest_CertificateChain::MergePartialFromCodedStream( +bool ClientMalwareRequest_UrlInfo::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientMalwareRequest.UrlInfo) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; + // required string ip = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_element: - DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( - input, add_element())); + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_ip())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(10)) goto parse_element; - if (input->ExpectAtEnd()) return true; + if (input->ExpectTag(18)) goto parse_url; + break; + } + + // required string url = 2; + case 2: { + if (tag == 18) { + parse_url: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_url())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_method; + break; + } + + // optional string method = 3; + case 3: { + if (tag == 26) { + parse_method: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_method())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_referrer; + break; + } + + // optional string referrer = 4; + case 4: { + if (tag == 34) { + parse_referrer: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_referrer())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(40)) goto parse_resource_type; + break; + } + + // optional int32 resource_type = 5; + case 5: { + if (tag == 40) { + parse_resource_type: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &resource_type_))); + set_has_resource_type(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientMalwareRequest.UrlInfo) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientMalwareRequest.UrlInfo) + return false; #undef DO_ } -void ClientDownloadRequest_CertificateChain::SerializeWithCachedSizes( +void ClientMalwareRequest_UrlInfo::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; - for (int i = 0; i < this->element_size(); i++) { - ::google::protobuf::internal::WireFormatLite::WriteMessage( - 1, this->element(i), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientMalwareRequest.UrlInfo) + // required string ip = 1; + if (has_ip()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->ip(), output); } - -} -int ClientDownloadRequest_CertificateChain::ByteSize() const { - int total_size = 0; - - // repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; - total_size += 1 * this->element_size(); - for (int i = 0; i < this->element_size(); i++) { - total_size += - ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( - this->element(i)); + // required string url = 2; + if (has_url()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->url(), output); } - - GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); - _cached_size_ = total_size; - GOOGLE_SAFE_CONCURRENT_WRITES_END(); - return total_size; -} -void ClientDownloadRequest_CertificateChain::CheckTypeAndMergeFrom( - const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); -} + // optional string method = 3; + if (has_method()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 3, this->method(), output); + } -void ClientDownloadRequest_CertificateChain::MergeFrom(const ClientDownloadRequest_CertificateChain& from) { + // optional string referrer = 4; + if (has_referrer()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 4, this->referrer(), output); + } + + // optional int32 resource_type = 5; + if (has_resource_type()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(5, this->resource_type(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientMalwareRequest.UrlInfo) +} + +int ClientMalwareRequest_UrlInfo::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required string ip = 1; + if (has_ip()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->ip()); + } + + // required string url = 2; + if (has_url()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->url()); + } + + // optional string method = 3; + if (has_method()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->method()); + } + + // optional string referrer = 4; + if (has_referrer()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->referrer()); + } + + // optional int32 resource_type = 5; + if (has_resource_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->resource_type()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientMalwareRequest_UrlInfo::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientMalwareRequest_UrlInfo::MergeFrom(const ClientMalwareRequest_UrlInfo& from) { GOOGLE_CHECK_NE(&from, this); - element_.MergeFrom(from.element_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_ip()) { + set_ip(from.ip()); + } + if (from.has_url()) { + set_url(from.url()); + } + if (from.has_method()) { + set_method(from.method()); + } + if (from.has_referrer()) { + set_referrer(from.referrer()); + } + if (from.has_resource_type()) { + set_resource_type(from.resource_type()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadRequest_CertificateChain::CopyFrom(const ClientDownloadRequest_CertificateChain& from) { +void ClientMalwareRequest_UrlInfo::CopyFrom(const ClientMalwareRequest_UrlInfo& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadRequest_CertificateChain::IsInitialized() const { - +bool ClientMalwareRequest_UrlInfo::IsInitialized() const { + if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false; + return true; } -void ClientDownloadRequest_CertificateChain::Swap(ClientDownloadRequest_CertificateChain* other) { +void ClientMalwareRequest_UrlInfo::Swap(ClientMalwareRequest_UrlInfo* other) { if (other != this) { - element_.Swap(&other->element_); + std::swap(ip_, other->ip_); + std::swap(url_, other->url_); + std::swap(method_, other->method_); + std::swap(referrer_, other->referrer_); + std::swap(resource_type_, other->resource_type_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadRequest_CertificateChain::GetTypeName() const { - return "safe_browsing.ClientDownloadRequest.CertificateChain"; +::std::string ClientMalwareRequest_UrlInfo::GetTypeName() const { + return "safe_browsing.ClientMalwareRequest.UrlInfo"; } // ------------------------------------------------------------------- #ifndef _MSC_VER -const int ClientDownloadRequest_SignatureInfo::kCertificateChainFieldNumber; -const int ClientDownloadRequest_SignatureInfo::kTrustedFieldNumber; +const int ClientMalwareRequest::kUrlFieldNumber; +const int ClientMalwareRequest::kReferrerUrlFieldNumber; +const int ClientMalwareRequest::kBadIpUrlInfoFieldNumber; #endif // !_MSC_VER -ClientDownloadRequest_SignatureInfo::ClientDownloadRequest_SignatureInfo() +ClientMalwareRequest::ClientMalwareRequest() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientMalwareRequest) } -void ClientDownloadRequest_SignatureInfo::InitAsDefaultInstance() { +void ClientMalwareRequest::InitAsDefaultInstance() { } -ClientDownloadRequest_SignatureInfo::ClientDownloadRequest_SignatureInfo(const ClientDownloadRequest_SignatureInfo& from) +ClientMalwareRequest::ClientMalwareRequest(const ClientMalwareRequest& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientMalwareRequest) } -void ClientDownloadRequest_SignatureInfo::SharedCtor() { +void ClientMalwareRequest::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; - trusted_ = false; + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + referrer_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadRequest_SignatureInfo::~ClientDownloadRequest_SignatureInfo() { +ClientMalwareRequest::~ClientMalwareRequest() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientMalwareRequest) SharedDtor(); } -void ClientDownloadRequest_SignatureInfo::SharedDtor() { +void ClientMalwareRequest::SharedDtor() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (referrer_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete referrer_url_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } -void ClientDownloadRequest_SignatureInfo::SetCachedSize(int size) const { +void ClientMalwareRequest::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadRequest_SignatureInfo& ClientDownloadRequest_SignatureInfo::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientMalwareRequest& ClientMalwareRequest::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadRequest_SignatureInfo* ClientDownloadRequest_SignatureInfo::default_instance_ = NULL; +ClientMalwareRequest* ClientMalwareRequest::default_instance_ = NULL; -ClientDownloadRequest_SignatureInfo* ClientDownloadRequest_SignatureInfo::New() const { - return new ClientDownloadRequest_SignatureInfo; +ClientMalwareRequest* ClientMalwareRequest::New() const { + return new ClientMalwareRequest; } -void ClientDownloadRequest_SignatureInfo::Clear() { - if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { - trusted_ = false; +void ClientMalwareRequest::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_url()) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + } + if (has_referrer_url()) { + if (referrer_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_url_->clear(); + } + } } - certificate_chain_.Clear(); + bad_ip_url_info_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadRequest_SignatureInfo::MergePartialFromCodedStream( +bool ClientMalwareRequest::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientMalwareRequest) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; + // required string url = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_certificate_chain: - DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( - input, add_certificate_chain())); + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_url())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(10)) goto parse_certificate_chain; - if (input->ExpectTag(16)) goto parse_trusted; + if (input->ExpectTag(34)) goto parse_referrer_url; break; } - - // optional bool trusted = 2; - case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - parse_trusted: - DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( - input, &trusted_))); - set_has_trusted(); + + // optional string referrer_url = 4; + case 4: { + if (tag == 34) { + parse_referrer_url: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_referrer_url())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(58)) goto parse_bad_ip_url_info; + break; + } + + // repeated .safe_browsing.ClientMalwareRequest.UrlInfo bad_ip_url_info = 7; + case 7: { + if (tag == 58) { + parse_bad_ip_url_info: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_bad_ip_url_info())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectTag(58)) goto parse_bad_ip_url_info; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientMalwareRequest) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientMalwareRequest) + return false; #undef DO_ } -void ClientDownloadRequest_SignatureInfo::SerializeWithCachedSizes( +void ClientMalwareRequest::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; - for (int i = 0; i < this->certificate_chain_size(); i++) { - ::google::protobuf::internal::WireFormatLite::WriteMessage( - 1, this->certificate_chain(i), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientMalwareRequest) + // required string url = 1; + if (has_url()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->url(), output); } - - // optional bool trusted = 2; - if (has_trusted()) { - ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->trusted(), output); + + // optional string referrer_url = 4; + if (has_referrer_url()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 4, this->referrer_url(), output); + } + + // repeated .safe_browsing.ClientMalwareRequest.UrlInfo bad_ip_url_info = 7; + for (int i = 0; i < this->bad_ip_url_info_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 7, this->bad_ip_url_info(i), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientMalwareRequest) } -int ClientDownloadRequest_SignatureInfo::ByteSize() const { +int ClientMalwareRequest::ByteSize() const { int total_size = 0; - - if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { - // optional bool trusted = 2; - if (has_trusted()) { - total_size += 1 + 1; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required string url = 1; + if (has_url()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->url()); + } + + // optional string referrer_url = 4; + if (has_referrer_url()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->referrer_url()); } - + } - // repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; - total_size += 1 * this->certificate_chain_size(); - for (int i = 0; i < this->certificate_chain_size(); i++) { + // repeated .safe_browsing.ClientMalwareRequest.UrlInfo bad_ip_url_info = 7; + total_size += 1 * this->bad_ip_url_info_size(); + for (int i = 0; i < this->bad_ip_url_info_size(); i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( - this->certificate_chain(i)); + this->bad_ip_url_info(i)); } - + + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadRequest_SignatureInfo::CheckTypeAndMergeFrom( +void ClientMalwareRequest::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadRequest_SignatureInfo::MergeFrom(const ClientDownloadRequest_SignatureInfo& from) { +void ClientMalwareRequest::MergeFrom(const ClientMalwareRequest& from) { GOOGLE_CHECK_NE(&from, this); - certificate_chain_.MergeFrom(from.certificate_chain_); - if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { - if (from.has_trusted()) { - set_trusted(from.trusted()); + bad_ip_url_info_.MergeFrom(from.bad_ip_url_info_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_url()) { + set_url(from.url()); + } + if (from.has_referrer_url()) { + set_referrer_url(from.referrer_url()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadRequest_SignatureInfo::CopyFrom(const ClientDownloadRequest_SignatureInfo& from) { +void ClientMalwareRequest::CopyFrom(const ClientMalwareRequest& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadRequest_SignatureInfo::IsInitialized() const { - +bool ClientMalwareRequest::IsInitialized() const { + if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; + + if (!::google::protobuf::internal::AllAreInitialized(this->bad_ip_url_info())) return false; return true; } -void ClientDownloadRequest_SignatureInfo::Swap(ClientDownloadRequest_SignatureInfo* other) { +void ClientMalwareRequest::Swap(ClientMalwareRequest* other) { if (other != this) { - certificate_chain_.Swap(&other->certificate_chain_); - std::swap(trusted_, other->trusted_); + std::swap(url_, other->url_); + std::swap(referrer_url_, other->referrer_url_); + bad_ip_url_info_.Swap(&other->bad_ip_url_info_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadRequest_SignatureInfo::GetTypeName() const { - return "safe_browsing.ClientDownloadRequest.SignatureInfo"; +::std::string ClientMalwareRequest::GetTypeName() const { + return "safe_browsing.ClientMalwareRequest"; } -// ------------------------------------------------------------------- +// =================================================================== #ifndef _MSC_VER -const int ClientDownloadRequest_PEImageHeaders_DebugData::kDirectoryEntryFieldNumber; -const int ClientDownloadRequest_PEImageHeaders_DebugData::kRawDataFieldNumber; +const int ClientMalwareResponse::kBlacklistFieldNumber; +const int ClientMalwareResponse::kBadIpFieldNumber; +const int ClientMalwareResponse::kBadUrlFieldNumber; #endif // !_MSC_VER -ClientDownloadRequest_PEImageHeaders_DebugData::ClientDownloadRequest_PEImageHeaders_DebugData() +ClientMalwareResponse::ClientMalwareResponse() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientMalwareResponse) } -void ClientDownloadRequest_PEImageHeaders_DebugData::InitAsDefaultInstance() { +void ClientMalwareResponse::InitAsDefaultInstance() { } -ClientDownloadRequest_PEImageHeaders_DebugData::ClientDownloadRequest_PEImageHeaders_DebugData(const ClientDownloadRequest_PEImageHeaders_DebugData& from) +ClientMalwareResponse::ClientMalwareResponse(const ClientMalwareResponse& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientMalwareResponse) } -void ClientDownloadRequest_PEImageHeaders_DebugData::SharedCtor() { +void ClientMalwareResponse::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; - directory_entry_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - raw_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + blacklist_ = false; + bad_ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + bad_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadRequest_PEImageHeaders_DebugData::~ClientDownloadRequest_PEImageHeaders_DebugData() { +ClientMalwareResponse::~ClientMalwareResponse() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientMalwareResponse) SharedDtor(); } -void ClientDownloadRequest_PEImageHeaders_DebugData::SharedDtor() { - if (directory_entry_ != &::google::protobuf::internal::kEmptyString) { - delete directory_entry_; +void ClientMalwareResponse::SharedDtor() { + if (bad_ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete bad_ip_; } - if (raw_data_ != &::google::protobuf::internal::kEmptyString) { - delete raw_data_; + if (bad_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete bad_url_; } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } -void ClientDownloadRequest_PEImageHeaders_DebugData::SetCachedSize(int size) const { +void ClientMalwareResponse::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadRequest_PEImageHeaders_DebugData& ClientDownloadRequest_PEImageHeaders_DebugData::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientMalwareResponse& ClientMalwareResponse::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadRequest_PEImageHeaders_DebugData* ClientDownloadRequest_PEImageHeaders_DebugData::default_instance_ = NULL; +ClientMalwareResponse* ClientMalwareResponse::default_instance_ = NULL; -ClientDownloadRequest_PEImageHeaders_DebugData* ClientDownloadRequest_PEImageHeaders_DebugData::New() const { - return new ClientDownloadRequest_PEImageHeaders_DebugData; +ClientMalwareResponse* ClientMalwareResponse::New() const { + return new ClientMalwareResponse; } -void ClientDownloadRequest_PEImageHeaders_DebugData::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (has_directory_entry()) { - if (directory_entry_ != &::google::protobuf::internal::kEmptyString) { - directory_entry_->clear(); +void ClientMalwareResponse::Clear() { + if (_has_bits_[0 / 32] & 7) { + blacklist_ = false; + if (has_bad_ip()) { + if (bad_ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_ip_->clear(); } } - if (has_raw_data()) { - if (raw_data_ != &::google::protobuf::internal::kEmptyString) { - raw_data_->clear(); + if (has_bad_url()) { + if (bad_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_url_->clear(); } } } ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadRequest_PEImageHeaders_DebugData::MergePartialFromCodedStream( +bool ClientMalwareResponse::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientMalwareResponse) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // optional bytes directory_entry = 1; + // required bool blacklist = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_directory_entry())); + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &blacklist_))); + set_has_blacklist(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(18)) goto parse_raw_data; + if (input->ExpectTag(18)) goto parse_bad_ip; break; } - - // optional bytes raw_data = 2; + + // optional string bad_ip = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_raw_data: - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_raw_data())); + if (tag == 18) { + parse_bad_ip: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_bad_ip())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_bad_url; + break; + } + + // optional string bad_url = 3; + case 3: { + if (tag == 26) { + parse_bad_url: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_bad_url())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientMalwareResponse) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientMalwareResponse) + return false; #undef DO_ } -void ClientDownloadRequest_PEImageHeaders_DebugData::SerializeWithCachedSizes( +void ClientMalwareResponse::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // optional bytes directory_entry = 1; - if (has_directory_entry()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 1, this->directory_entry(), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientMalwareResponse) + // required bool blacklist = 1; + if (has_blacklist()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->blacklist(), output); } - - // optional bytes raw_data = 2; - if (has_raw_data()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 2, this->raw_data(), output); + + // optional string bad_ip = 2; + if (has_bad_ip()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->bad_ip(), output); + } + + // optional string bad_url = 3; + if (has_bad_url()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 3, this->bad_url(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientMalwareResponse) } -int ClientDownloadRequest_PEImageHeaders_DebugData::ByteSize() const { +int ClientMalwareResponse::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // optional bytes directory_entry = 1; - if (has_directory_entry()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->directory_entry()); + // required bool blacklist = 1; + if (has_blacklist()) { + total_size += 1 + 1; } - - // optional bytes raw_data = 2; - if (has_raw_data()) { + + // optional string bad_ip = 2; + if (has_bad_ip()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->raw_data()); + ::google::protobuf::internal::WireFormatLite::StringSize( + this->bad_ip()); } - + + // optional string bad_url = 3; + if (has_bad_url()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->bad_url()); + } + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadRequest_PEImageHeaders_DebugData::CheckTypeAndMergeFrom( +void ClientMalwareResponse::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadRequest_PEImageHeaders_DebugData::MergeFrom(const ClientDownloadRequest_PEImageHeaders_DebugData& from) { +void ClientMalwareResponse::MergeFrom(const ClientMalwareResponse& from) { GOOGLE_CHECK_NE(&from, this); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (from.has_directory_entry()) { - set_directory_entry(from.directory_entry()); + if (from.has_blacklist()) { + set_blacklist(from.blacklist()); } - if (from.has_raw_data()) { - set_raw_data(from.raw_data()); + if (from.has_bad_ip()) { + set_bad_ip(from.bad_ip()); + } + if (from.has_bad_url()) { + set_bad_url(from.bad_url()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadRequest_PEImageHeaders_DebugData::CopyFrom(const ClientDownloadRequest_PEImageHeaders_DebugData& from) { +void ClientMalwareResponse::CopyFrom(const ClientMalwareResponse& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadRequest_PEImageHeaders_DebugData::IsInitialized() const { - +bool ClientMalwareResponse::IsInitialized() const { + if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; + return true; } -void ClientDownloadRequest_PEImageHeaders_DebugData::Swap(ClientDownloadRequest_PEImageHeaders_DebugData* other) { +void ClientMalwareResponse::Swap(ClientMalwareResponse* other) { if (other != this) { - std::swap(directory_entry_, other->directory_entry_); - std::swap(raw_data_, other->raw_data_); + std::swap(blacklist_, other->blacklist_); + std::swap(bad_ip_, other->bad_ip_); + std::swap(bad_url_, other->bad_url_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadRequest_PEImageHeaders_DebugData::GetTypeName() const { - return "safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData"; +::std::string ClientMalwareResponse::GetTypeName() const { + return "safe_browsing.ClientMalwareResponse"; } -// ------------------------------------------------------------------- +// =================================================================== + +bool ClientDownloadRequest_ResourceType_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + case 3: + return true; + default: + return false; + } +} #ifndef _MSC_VER -const int ClientDownloadRequest_PEImageHeaders::kDosHeaderFieldNumber; -const int ClientDownloadRequest_PEImageHeaders::kFileHeaderFieldNumber; -const int ClientDownloadRequest_PEImageHeaders::kOptionalHeaders32FieldNumber; -const int ClientDownloadRequest_PEImageHeaders::kOptionalHeaders64FieldNumber; -const int ClientDownloadRequest_PEImageHeaders::kSectionHeaderFieldNumber; -const int ClientDownloadRequest_PEImageHeaders::kExportSectionDataFieldNumber; -const int ClientDownloadRequest_PEImageHeaders::kDebugDataFieldNumber; +const ClientDownloadRequest_ResourceType ClientDownloadRequest::DOWNLOAD_URL; +const ClientDownloadRequest_ResourceType ClientDownloadRequest::DOWNLOAD_REDIRECT; +const ClientDownloadRequest_ResourceType ClientDownloadRequest::TAB_URL; +const ClientDownloadRequest_ResourceType ClientDownloadRequest::TAB_REDIRECT; +const ClientDownloadRequest_ResourceType ClientDownloadRequest::ResourceType_MIN; +const ClientDownloadRequest_ResourceType ClientDownloadRequest::ResourceType_MAX; +const int ClientDownloadRequest::ResourceType_ARRAYSIZE; +#endif // _MSC_VER +bool ClientDownloadRequest_DownloadType_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + case 3: + case 4: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const ClientDownloadRequest_DownloadType ClientDownloadRequest::WIN_EXECUTABLE; +const ClientDownloadRequest_DownloadType ClientDownloadRequest::CHROME_EXTENSION; +const ClientDownloadRequest_DownloadType ClientDownloadRequest::ANDROID_APK; +const ClientDownloadRequest_DownloadType ClientDownloadRequest::ZIPPED_EXECUTABLE; +const ClientDownloadRequest_DownloadType ClientDownloadRequest::MAC_EXECUTABLE; +const ClientDownloadRequest_DownloadType ClientDownloadRequest::DownloadType_MIN; +const ClientDownloadRequest_DownloadType ClientDownloadRequest::DownloadType_MAX; +const int ClientDownloadRequest::DownloadType_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int ClientDownloadRequest_Digests::kSha256FieldNumber; +const int ClientDownloadRequest_Digests::kSha1FieldNumber; +const int ClientDownloadRequest_Digests::kMd5FieldNumber; #endif // !_MSC_VER -ClientDownloadRequest_PEImageHeaders::ClientDownloadRequest_PEImageHeaders() +ClientDownloadRequest_Digests::ClientDownloadRequest_Digests() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest.Digests) } -void ClientDownloadRequest_PEImageHeaders::InitAsDefaultInstance() { +void ClientDownloadRequest_Digests::InitAsDefaultInstance() { } -ClientDownloadRequest_PEImageHeaders::ClientDownloadRequest_PEImageHeaders(const ClientDownloadRequest_PEImageHeaders& from) +ClientDownloadRequest_Digests::ClientDownloadRequest_Digests(const ClientDownloadRequest_Digests& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest.Digests) } -void ClientDownloadRequest_PEImageHeaders::SharedCtor() { +void ClientDownloadRequest_Digests::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; - dos_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - file_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - optional_headers32_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - optional_headers64_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - export_section_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + sha256_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + sha1_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + md5_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadRequest_PEImageHeaders::~ClientDownloadRequest_PEImageHeaders() { +ClientDownloadRequest_Digests::~ClientDownloadRequest_Digests() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest.Digests) SharedDtor(); } -void ClientDownloadRequest_PEImageHeaders::SharedDtor() { - if (dos_header_ != &::google::protobuf::internal::kEmptyString) { - delete dos_header_; - } - if (file_header_ != &::google::protobuf::internal::kEmptyString) { - delete file_header_; - } - if (optional_headers32_ != &::google::protobuf::internal::kEmptyString) { - delete optional_headers32_; +void ClientDownloadRequest_Digests::SharedDtor() { + if (sha256_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete sha256_; } - if (optional_headers64_ != &::google::protobuf::internal::kEmptyString) { - delete optional_headers64_; + if (sha1_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete sha1_; } - if (export_section_data_ != &::google::protobuf::internal::kEmptyString) { - delete export_section_data_; + if (md5_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete md5_; } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } -void ClientDownloadRequest_PEImageHeaders::SetCachedSize(int size) const { +void ClientDownloadRequest_Digests::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadRequest_PEImageHeaders& ClientDownloadRequest_PEImageHeaders::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientDownloadRequest_Digests& ClientDownloadRequest_Digests::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadRequest_PEImageHeaders* ClientDownloadRequest_PEImageHeaders::default_instance_ = NULL; +ClientDownloadRequest_Digests* ClientDownloadRequest_Digests::default_instance_ = NULL; -ClientDownloadRequest_PEImageHeaders* ClientDownloadRequest_PEImageHeaders::New() const { - return new ClientDownloadRequest_PEImageHeaders; +ClientDownloadRequest_Digests* ClientDownloadRequest_Digests::New() const { + return new ClientDownloadRequest_Digests; } -void ClientDownloadRequest_PEImageHeaders::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (has_dos_header()) { - if (dos_header_ != &::google::protobuf::internal::kEmptyString) { - dos_header_->clear(); - } - } - if (has_file_header()) { - if (file_header_ != &::google::protobuf::internal::kEmptyString) { - file_header_->clear(); - } - } - if (has_optional_headers32()) { - if (optional_headers32_ != &::google::protobuf::internal::kEmptyString) { - optional_headers32_->clear(); +void ClientDownloadRequest_Digests::Clear() { + if (_has_bits_[0 / 32] & 7) { + if (has_sha256()) { + if (sha256_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha256_->clear(); } } - if (has_optional_headers64()) { - if (optional_headers64_ != &::google::protobuf::internal::kEmptyString) { - optional_headers64_->clear(); + if (has_sha1()) { + if (sha1_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha1_->clear(); } } - if (has_export_section_data()) { - if (export_section_data_ != &::google::protobuf::internal::kEmptyString) { - export_section_data_->clear(); + if (has_md5()) { + if (md5_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + md5_->clear(); } } } - section_header_.Clear(); - debug_data_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadRequest_PEImageHeaders::MergePartialFromCodedStream( +bool ClientDownloadRequest_Digests::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest.Digests) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // optional bytes dos_header = 1; + // optional bytes sha256 = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + if (tag == 10) { DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_dos_header())); + input, this->mutable_sha256())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(18)) goto parse_file_header; + if (input->ExpectTag(18)) goto parse_sha1; break; } - - // optional bytes file_header = 2; + + // optional bytes sha1 = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_file_header: + if (tag == 18) { + parse_sha1: DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_file_header())); + input, this->mutable_sha1())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(26)) goto parse_optional_headers32; + if (input->ExpectTag(26)) goto parse_md5; break; } - - // optional bytes optional_headers32 = 3; + + // optional bytes md5 = 3; case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_optional_headers32: - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_optional_headers32())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(34)) goto parse_optional_headers64; - break; - } - - // optional bytes optional_headers64 = 4; - case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_optional_headers64: - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_optional_headers64())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(42)) goto parse_section_header; - break; - } - - // repeated bytes section_header = 5; - case 5: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_section_header: - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->add_section_header())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(42)) goto parse_section_header; - if (input->ExpectTag(50)) goto parse_export_section_data; - break; - } - - // optional bytes export_section_data = 6; - case 6: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_export_section_data: + if (tag == 26) { + parse_md5: DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_export_section_data())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(58)) goto parse_debug_data; - break; - } - - // repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; - case 7: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_debug_data: - DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( - input, add_debug_data())); + input, this->mutable_md5())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(58)) goto parse_debug_data; - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest.Digests) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest.Digests) + return false; #undef DO_ } -void ClientDownloadRequest_PEImageHeaders::SerializeWithCachedSizes( +void ClientDownloadRequest_Digests::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // optional bytes dos_header = 1; - if (has_dos_header()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 1, this->dos_header(), output); - } - - // optional bytes file_header = 2; - if (has_file_header()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 2, this->file_header(), output); - } - - // optional bytes optional_headers32 = 3; - if (has_optional_headers32()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 3, this->optional_headers32(), output); - } - - // optional bytes optional_headers64 = 4; - if (has_optional_headers64()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 4, this->optional_headers64(), output); - } - - // repeated bytes section_header = 5; - for (int i = 0; i < this->section_header_size(); i++) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 5, this->section_header(i), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest.Digests) + // optional bytes sha256 = 1; + if (has_sha256()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 1, this->sha256(), output); } - - // optional bytes export_section_data = 6; - if (has_export_section_data()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 6, this->export_section_data(), output); + + // optional bytes sha1 = 2; + if (has_sha1()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 2, this->sha1(), output); } - - // repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; - for (int i = 0; i < this->debug_data_size(); i++) { - ::google::protobuf::internal::WireFormatLite::WriteMessage( - 7, this->debug_data(i), output); + + // optional bytes md5 = 3; + if (has_md5()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 3, this->md5(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest.Digests) } -int ClientDownloadRequest_PEImageHeaders::ByteSize() const { +int ClientDownloadRequest_Digests::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // optional bytes dos_header = 1; - if (has_dos_header()) { + // optional bytes sha256 = 1; + if (has_sha256()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( - this->dos_header()); - } - - // optional bytes file_header = 2; - if (has_file_header()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->file_header()); - } - - // optional bytes optional_headers32 = 3; - if (has_optional_headers32()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->optional_headers32()); + this->sha256()); } - - // optional bytes optional_headers64 = 4; - if (has_optional_headers64()) { + + // optional bytes sha1 = 2; + if (has_sha1()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( - this->optional_headers64()); + this->sha1()); } - - // optional bytes export_section_data = 6; - if (has_export_section_data()) { + + // optional bytes md5 = 3; + if (has_md5()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( - this->export_section_data()); + this->md5()); } - - } - // repeated bytes section_header = 5; - total_size += 1 * this->section_header_size(); - for (int i = 0; i < this->section_header_size(); i++) { - total_size += ::google::protobuf::internal::WireFormatLite::BytesSize( - this->section_header(i)); - } - - // repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; - total_size += 1 * this->debug_data_size(); - for (int i = 0; i < this->debug_data_size(); i++) { - total_size += - ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( - this->debug_data(i)); + } - + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadRequest_PEImageHeaders::CheckTypeAndMergeFrom( +void ClientDownloadRequest_Digests::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadRequest_PEImageHeaders::MergeFrom(const ClientDownloadRequest_PEImageHeaders& from) { +void ClientDownloadRequest_Digests::MergeFrom(const ClientDownloadRequest_Digests& from) { GOOGLE_CHECK_NE(&from, this); - section_header_.MergeFrom(from.section_header_); - debug_data_.MergeFrom(from.debug_data_); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (from.has_dos_header()) { - set_dos_header(from.dos_header()); - } - if (from.has_file_header()) { - set_file_header(from.file_header()); - } - if (from.has_optional_headers32()) { - set_optional_headers32(from.optional_headers32()); + if (from.has_sha256()) { + set_sha256(from.sha256()); } - if (from.has_optional_headers64()) { - set_optional_headers64(from.optional_headers64()); + if (from.has_sha1()) { + set_sha1(from.sha1()); } - if (from.has_export_section_data()) { - set_export_section_data(from.export_section_data()); + if (from.has_md5()) { + set_md5(from.md5()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadRequest_PEImageHeaders::CopyFrom(const ClientDownloadRequest_PEImageHeaders& from) { +void ClientDownloadRequest_Digests::CopyFrom(const ClientDownloadRequest_Digests& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadRequest_PEImageHeaders::IsInitialized() const { - +bool ClientDownloadRequest_Digests::IsInitialized() const { + return true; } -void ClientDownloadRequest_PEImageHeaders::Swap(ClientDownloadRequest_PEImageHeaders* other) { +void ClientDownloadRequest_Digests::Swap(ClientDownloadRequest_Digests* other) { if (other != this) { - std::swap(dos_header_, other->dos_header_); - std::swap(file_header_, other->file_header_); - std::swap(optional_headers32_, other->optional_headers32_); - std::swap(optional_headers64_, other->optional_headers64_); - section_header_.Swap(&other->section_header_); - std::swap(export_section_data_, other->export_section_data_); - debug_data_.Swap(&other->debug_data_); + std::swap(sha256_, other->sha256_); + std::swap(sha1_, other->sha1_); + std::swap(md5_, other->md5_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadRequest_PEImageHeaders::GetTypeName() const { - return "safe_browsing.ClientDownloadRequest.PEImageHeaders"; +::std::string ClientDownloadRequest_Digests::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest.Digests"; } // ------------------------------------------------------------------- #ifndef _MSC_VER -const int ClientDownloadRequest_ImageHeaders::kPeHeadersFieldNumber; +const int ClientDownloadRequest_Resource::kUrlFieldNumber; +const int ClientDownloadRequest_Resource::kTypeFieldNumber; +const int ClientDownloadRequest_Resource::kRemoteIpFieldNumber; +const int ClientDownloadRequest_Resource::kReferrerFieldNumber; #endif // !_MSC_VER -ClientDownloadRequest_ImageHeaders::ClientDownloadRequest_ImageHeaders() +ClientDownloadRequest_Resource::ClientDownloadRequest_Resource() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest.Resource) } -void ClientDownloadRequest_ImageHeaders::InitAsDefaultInstance() { - pe_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_PEImageHeaders*>(&::safe_browsing::ClientDownloadRequest_PEImageHeaders::default_instance()); +void ClientDownloadRequest_Resource::InitAsDefaultInstance() { } -ClientDownloadRequest_ImageHeaders::ClientDownloadRequest_ImageHeaders(const ClientDownloadRequest_ImageHeaders& from) +ClientDownloadRequest_Resource::ClientDownloadRequest_Resource(const ClientDownloadRequest_Resource& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest.Resource) } -void ClientDownloadRequest_ImageHeaders::SharedCtor() { +void ClientDownloadRequest_Resource::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; - pe_headers_ = NULL; + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + type_ = 0; + remote_ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + referrer_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadRequest_ImageHeaders::~ClientDownloadRequest_ImageHeaders() { +ClientDownloadRequest_Resource::~ClientDownloadRequest_Resource() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest.Resource) SharedDtor(); } -void ClientDownloadRequest_ImageHeaders::SharedDtor() { +void ClientDownloadRequest_Resource::SharedDtor() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (remote_ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete remote_ip_; + } + if (referrer_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete referrer_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { - delete pe_headers_; + #endif } } -void ClientDownloadRequest_ImageHeaders::SetCachedSize(int size) const { +void ClientDownloadRequest_Resource::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadRequest_ImageHeaders& ClientDownloadRequest_ImageHeaders::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientDownloadRequest_Resource& ClientDownloadRequest_Resource::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadRequest_ImageHeaders* ClientDownloadRequest_ImageHeaders::default_instance_ = NULL; +ClientDownloadRequest_Resource* ClientDownloadRequest_Resource::default_instance_ = NULL; -ClientDownloadRequest_ImageHeaders* ClientDownloadRequest_ImageHeaders::New() const { - return new ClientDownloadRequest_ImageHeaders; +ClientDownloadRequest_Resource* ClientDownloadRequest_Resource::New() const { + return new ClientDownloadRequest_Resource; } -void ClientDownloadRequest_ImageHeaders::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (has_pe_headers()) { - if (pe_headers_ != NULL) pe_headers_->::safe_browsing::ClientDownloadRequest_PEImageHeaders::Clear(); +void ClientDownloadRequest_Resource::Clear() { + if (_has_bits_[0 / 32] & 15) { + if (has_url()) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + } + type_ = 0; + if (has_remote_ip()) { + if (remote_ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + remote_ip_->clear(); + } + } + if (has_referrer()) { + if (referrer_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_->clear(); + } } } ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadRequest_ImageHeaders::MergePartialFromCodedStream( +bool ClientDownloadRequest_Resource::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest.Resource) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; + // required string url = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( - input, mutable_pe_headers())); + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_url())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(16)) goto parse_type; + break; + } + + // required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; + case 2: { + if (tag == 16) { + parse_type: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientDownloadRequest_ResourceType_IsValid(value)) { + set_type(static_cast< ::safe_browsing::ClientDownloadRequest_ResourceType >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_remote_ip; + break; + } + + // optional bytes remote_ip = 3; + case 3: { + if (tag == 26) { + parse_remote_ip: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_remote_ip())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_referrer; + break; + } + + // optional string referrer = 4; + case 4: { + if (tag == 34) { + parse_referrer: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_referrer())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest.Resource) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest.Resource) + return false; #undef DO_ } -void ClientDownloadRequest_ImageHeaders::SerializeWithCachedSizes( +void ClientDownloadRequest_Resource::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; - if (has_pe_headers()) { - ::google::protobuf::internal::WireFormatLite::WriteMessage( - 1, this->pe_headers(), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest.Resource) + // required string url = 1; + if (has_url()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->url(), output); + } + + // required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; + if (has_type()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 2, this->type(), output); + } + + // optional bytes remote_ip = 3; + if (has_remote_ip()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 3, this->remote_ip(), output); + } + + // optional string referrer = 4; + if (has_referrer()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 4, this->referrer(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest.Resource) } -int ClientDownloadRequest_ImageHeaders::ByteSize() const { +int ClientDownloadRequest_Resource::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; - if (has_pe_headers()) { + // required string url = 1; + if (has_url()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( - this->pe_headers()); + ::google::protobuf::internal::WireFormatLite::StringSize( + this->url()); + } + + // required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; + if (has_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); + } + + // optional bytes remote_ip = 3; + if (has_remote_ip()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->remote_ip()); + } + + // optional string referrer = 4; + if (has_referrer()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->referrer()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadRequest_ImageHeaders::CheckTypeAndMergeFrom( +void ClientDownloadRequest_Resource::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadRequest_ImageHeaders::MergeFrom(const ClientDownloadRequest_ImageHeaders& from) { +void ClientDownloadRequest_Resource::MergeFrom(const ClientDownloadRequest_Resource& from) { GOOGLE_CHECK_NE(&from, this); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (from.has_pe_headers()) { - mutable_pe_headers()->::safe_browsing::ClientDownloadRequest_PEImageHeaders::MergeFrom(from.pe_headers()); + if (from.has_url()) { + set_url(from.url()); + } + if (from.has_type()) { + set_type(from.type()); + } + if (from.has_remote_ip()) { + set_remote_ip(from.remote_ip()); + } + if (from.has_referrer()) { + set_referrer(from.referrer()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadRequest_ImageHeaders::CopyFrom(const ClientDownloadRequest_ImageHeaders& from) { +void ClientDownloadRequest_Resource::CopyFrom(const ClientDownloadRequest_Resource& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadRequest_ImageHeaders::IsInitialized() const { - +bool ClientDownloadRequest_Resource::IsInitialized() const { + if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false; + return true; } -void ClientDownloadRequest_ImageHeaders::Swap(ClientDownloadRequest_ImageHeaders* other) { +void ClientDownloadRequest_Resource::Swap(ClientDownloadRequest_Resource* other) { if (other != this) { - std::swap(pe_headers_, other->pe_headers_); + std::swap(url_, other->url_); + std::swap(type_, other->type_); + std::swap(remote_ip_, other->remote_ip_); + std::swap(referrer_, other->referrer_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadRequest_ImageHeaders::GetTypeName() const { - return "safe_browsing.ClientDownloadRequest.ImageHeaders"; +::std::string ClientDownloadRequest_Resource::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest.Resource"; } // ------------------------------------------------------------------- #ifndef _MSC_VER -const int ClientDownloadRequest::kUrlFieldNumber; -const int ClientDownloadRequest::kDigestsFieldNumber; -const int ClientDownloadRequest::kLengthFieldNumber; -const int ClientDownloadRequest::kResourcesFieldNumber; -const int ClientDownloadRequest::kSignatureFieldNumber; -const int ClientDownloadRequest::kUserInitiatedFieldNumber; -const int ClientDownloadRequest::kFileBasenameFieldNumber; -const int ClientDownloadRequest::kDownloadTypeFieldNumber; -const int ClientDownloadRequest::kLocaleFieldNumber; -const int ClientDownloadRequest::kImageHeadersFieldNumber; +const int ClientDownloadRequest_CertificateChain_Element::kCertificateFieldNumber; #endif // !_MSC_VER -ClientDownloadRequest::ClientDownloadRequest() +ClientDownloadRequest_CertificateChain_Element::ClientDownloadRequest_CertificateChain_Element() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest.CertificateChain.Element) } -void ClientDownloadRequest::InitAsDefaultInstance() { - digests_ = const_cast< ::safe_browsing::ClientDownloadRequest_Digests*>(&::safe_browsing::ClientDownloadRequest_Digests::default_instance()); - signature_ = const_cast< ::safe_browsing::ClientDownloadRequest_SignatureInfo*>(&::safe_browsing::ClientDownloadRequest_SignatureInfo::default_instance()); - image_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_ImageHeaders*>(&::safe_browsing::ClientDownloadRequest_ImageHeaders::default_instance()); +void ClientDownloadRequest_CertificateChain_Element::InitAsDefaultInstance() { } -ClientDownloadRequest::ClientDownloadRequest(const ClientDownloadRequest& from) +ClientDownloadRequest_CertificateChain_Element::ClientDownloadRequest_CertificateChain_Element(const ClientDownloadRequest_CertificateChain_Element& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest.CertificateChain.Element) } -void ClientDownloadRequest::SharedCtor() { +void ClientDownloadRequest_CertificateChain_Element::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; - url_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - digests_ = NULL; - length_ = GOOGLE_LONGLONG(0); - signature_ = NULL; - user_initiated_ = false; - file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - download_type_ = 0; - locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - image_headers_ = NULL; + certificate_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadRequest::~ClientDownloadRequest() { +ClientDownloadRequest_CertificateChain_Element::~ClientDownloadRequest_CertificateChain_Element() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest.CertificateChain.Element) SharedDtor(); } -void ClientDownloadRequest::SharedDtor() { - if (url_ != &::google::protobuf::internal::kEmptyString) { - delete url_; - } - if (file_basename_ != &::google::protobuf::internal::kEmptyString) { - delete file_basename_; - } - if (locale_ != &::google::protobuf::internal::kEmptyString) { - delete locale_; +void ClientDownloadRequest_CertificateChain_Element::SharedDtor() { + if (certificate_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete certificate_; } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { - delete digests_; - delete signature_; - delete image_headers_; + #endif } } -void ClientDownloadRequest::SetCachedSize(int size) const { +void ClientDownloadRequest_CertificateChain_Element::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadRequest& ClientDownloadRequest::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientDownloadRequest_CertificateChain_Element& ClientDownloadRequest_CertificateChain_Element::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadRequest* ClientDownloadRequest::default_instance_ = NULL; +ClientDownloadRequest_CertificateChain_Element* ClientDownloadRequest_CertificateChain_Element::default_instance_ = NULL; -ClientDownloadRequest* ClientDownloadRequest::New() const { - return new ClientDownloadRequest; +ClientDownloadRequest_CertificateChain_Element* ClientDownloadRequest_CertificateChain_Element::New() const { + return new ClientDownloadRequest_CertificateChain_Element; } -void ClientDownloadRequest::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (has_url()) { - if (url_ != &::google::protobuf::internal::kEmptyString) { - url_->clear(); - } - } - if (has_digests()) { - if (digests_ != NULL) digests_->::safe_browsing::ClientDownloadRequest_Digests::Clear(); - } - length_ = GOOGLE_LONGLONG(0); - if (has_signature()) { - if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); - } - user_initiated_ = false; - if (has_file_basename()) { - if (file_basename_ != &::google::protobuf::internal::kEmptyString) { - file_basename_->clear(); - } - } - download_type_ = 0; - } - if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { - if (has_locale()) { - if (locale_ != &::google::protobuf::internal::kEmptyString) { - locale_->clear(); - } - } - if (has_image_headers()) { - if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); +void ClientDownloadRequest_CertificateChain_Element::Clear() { + if (has_certificate()) { + if (certificate_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + certificate_->clear(); } } - resources_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadRequest::MergePartialFromCodedStream( +bool ClientDownloadRequest_CertificateChain_Element::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest.CertificateChain.Element) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // required string url = 1; + // optional bytes certificate = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - DO_(::google::protobuf::internal::WireFormatLite::ReadString( - input, this->mutable_url())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(18)) goto parse_digests; - break; - } - - // required .safe_browsing.ClientDownloadRequest.Digests digests = 2; - case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_digests: - DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( - input, mutable_digests())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(24)) goto parse_length; - break; - } - - // required int64 length = 3; - case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - parse_length: - DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( - input, &length_))); - set_has_length(); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(34)) goto parse_resources; - break; - } - - // repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; - case 4: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_resources: - DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( - input, add_resources())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(34)) goto parse_resources; - if (input->ExpectTag(42)) goto parse_signature; - break; - } - - // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; - case 5: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_signature: - DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( - input, mutable_signature())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(48)) goto parse_user_initiated; - break; - } - - // optional bool user_initiated = 6; - case 6: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - parse_user_initiated: - DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( - input, &user_initiated_))); - set_has_user_initiated(); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(74)) goto parse_file_basename; - break; - } - - // optional string file_basename = 9; - case 9: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_file_basename: - DO_(::google::protobuf::internal::WireFormatLite::ReadString( - input, this->mutable_file_basename())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(80)) goto parse_download_type; - break; - } - - // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; - case 10: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - parse_download_type: - int value; - DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( - input, &value))); - if (::safe_browsing::ClientDownloadRequest_DownloadType_IsValid(value)) { - set_download_type(static_cast< ::safe_browsing::ClientDownloadRequest_DownloadType >(value)); - } - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(90)) goto parse_locale; - break; - } - - // optional string locale = 11; - case 11: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_locale: - DO_(::google::protobuf::internal::WireFormatLite::ReadString( - input, this->mutable_locale())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectTag(146)) goto parse_image_headers; - break; - } - - // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; - case 18: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_image_headers: - DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( - input, mutable_image_headers())); + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_certificate())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest.CertificateChain.Element) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest.CertificateChain.Element) + return false; #undef DO_ } -void ClientDownloadRequest::SerializeWithCachedSizes( +void ClientDownloadRequest_CertificateChain_Element::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // required string url = 1; - if (has_url()) { - ::google::protobuf::internal::WireFormatLite::WriteString( - 1, this->url(), output); - } - - // required .safe_browsing.ClientDownloadRequest.Digests digests = 2; - if (has_digests()) { - ::google::protobuf::internal::WireFormatLite::WriteMessage( - 2, this->digests(), output); - } - - // required int64 length = 3; - if (has_length()) { - ::google::protobuf::internal::WireFormatLite::WriteInt64(3, this->length(), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest.CertificateChain.Element) + // optional bytes certificate = 1; + if (has_certificate()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 1, this->certificate(), output); } - - // repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; - for (int i = 0; i < this->resources_size(); i++) { - ::google::protobuf::internal::WireFormatLite::WriteMessage( - 4, this->resources(i), output); + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest.CertificateChain.Element) +} + +int ClientDownloadRequest_CertificateChain_Element::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bytes certificate = 1; + if (has_certificate()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->certificate()); + } + } - - // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; - if (has_signature()) { - ::google::protobuf::internal::WireFormatLite::WriteMessage( + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadRequest_CertificateChain_Element::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadRequest_CertificateChain_Element::MergeFrom(const ClientDownloadRequest_CertificateChain_Element& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_certificate()) { + set_certificate(from.certificate()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadRequest_CertificateChain_Element::CopyFrom(const ClientDownloadRequest_CertificateChain_Element& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadRequest_CertificateChain_Element::IsInitialized() const { + + return true; +} + +void ClientDownloadRequest_CertificateChain_Element::Swap(ClientDownloadRequest_CertificateChain_Element* other) { + if (other != this) { + std::swap(certificate_, other->certificate_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadRequest_CertificateChain_Element::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest.CertificateChain.Element"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientDownloadRequest_CertificateChain::kElementFieldNumber; +#endif // !_MSC_VER + +ClientDownloadRequest_CertificateChain::ClientDownloadRequest_CertificateChain() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest.CertificateChain) +} + +void ClientDownloadRequest_CertificateChain::InitAsDefaultInstance() { +} + +ClientDownloadRequest_CertificateChain::ClientDownloadRequest_CertificateChain(const ClientDownloadRequest_CertificateChain& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest.CertificateChain) +} + +void ClientDownloadRequest_CertificateChain::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadRequest_CertificateChain::~ClientDownloadRequest_CertificateChain() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest.CertificateChain) + SharedDtor(); +} + +void ClientDownloadRequest_CertificateChain::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientDownloadRequest_CertificateChain::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadRequest_CertificateChain& ClientDownloadRequest_CertificateChain::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadRequest_CertificateChain* ClientDownloadRequest_CertificateChain::default_instance_ = NULL; + +ClientDownloadRequest_CertificateChain* ClientDownloadRequest_CertificateChain::New() const { + return new ClientDownloadRequest_CertificateChain; +} + +void ClientDownloadRequest_CertificateChain::Clear() { + element_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadRequest_CertificateChain::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest.CertificateChain) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; + case 1: { + if (tag == 10) { + parse_element: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_element())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(10)) goto parse_element; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest.CertificateChain) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest.CertificateChain) + return false; +#undef DO_ +} + +void ClientDownloadRequest_CertificateChain::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest.CertificateChain) + // repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; + for (int i = 0; i < this->element_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 1, this->element(i), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest.CertificateChain) +} + +int ClientDownloadRequest_CertificateChain::ByteSize() const { + int total_size = 0; + + // repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; + total_size += 1 * this->element_size(); + for (int i = 0; i < this->element_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->element(i)); + } + + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadRequest_CertificateChain::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadRequest_CertificateChain::MergeFrom(const ClientDownloadRequest_CertificateChain& from) { + GOOGLE_CHECK_NE(&from, this); + element_.MergeFrom(from.element_); + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadRequest_CertificateChain::CopyFrom(const ClientDownloadRequest_CertificateChain& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadRequest_CertificateChain::IsInitialized() const { + + return true; +} + +void ClientDownloadRequest_CertificateChain::Swap(ClientDownloadRequest_CertificateChain* other) { + if (other != this) { + element_.Swap(&other->element_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadRequest_CertificateChain::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest.CertificateChain"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientDownloadRequest_SignatureInfo::kCertificateChainFieldNumber; +const int ClientDownloadRequest_SignatureInfo::kTrustedFieldNumber; +#endif // !_MSC_VER + +ClientDownloadRequest_SignatureInfo::ClientDownloadRequest_SignatureInfo() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest.SignatureInfo) +} + +void ClientDownloadRequest_SignatureInfo::InitAsDefaultInstance() { +} + +ClientDownloadRequest_SignatureInfo::ClientDownloadRequest_SignatureInfo(const ClientDownloadRequest_SignatureInfo& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest.SignatureInfo) +} + +void ClientDownloadRequest_SignatureInfo::SharedCtor() { + _cached_size_ = 0; + trusted_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadRequest_SignatureInfo::~ClientDownloadRequest_SignatureInfo() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest.SignatureInfo) + SharedDtor(); +} + +void ClientDownloadRequest_SignatureInfo::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientDownloadRequest_SignatureInfo::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadRequest_SignatureInfo& ClientDownloadRequest_SignatureInfo::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadRequest_SignatureInfo* ClientDownloadRequest_SignatureInfo::default_instance_ = NULL; + +ClientDownloadRequest_SignatureInfo* ClientDownloadRequest_SignatureInfo::New() const { + return new ClientDownloadRequest_SignatureInfo; +} + +void ClientDownloadRequest_SignatureInfo::Clear() { + trusted_ = false; + certificate_chain_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadRequest_SignatureInfo::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest.SignatureInfo) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; + case 1: { + if (tag == 10) { + parse_certificate_chain: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_certificate_chain())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(10)) goto parse_certificate_chain; + if (input->ExpectTag(16)) goto parse_trusted; + break; + } + + // optional bool trusted = 2; + case 2: { + if (tag == 16) { + parse_trusted: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &trusted_))); + set_has_trusted(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest.SignatureInfo) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest.SignatureInfo) + return false; +#undef DO_ +} + +void ClientDownloadRequest_SignatureInfo::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest.SignatureInfo) + // repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; + for (int i = 0; i < this->certificate_chain_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 1, this->certificate_chain(i), output); + } + + // optional bool trusted = 2; + if (has_trusted()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->trusted(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest.SignatureInfo) +} + +int ClientDownloadRequest_SignatureInfo::ByteSize() const { + int total_size = 0; + + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + // optional bool trusted = 2; + if (has_trusted()) { + total_size += 1 + 1; + } + + } + // repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; + total_size += 1 * this->certificate_chain_size(); + for (int i = 0; i < this->certificate_chain_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->certificate_chain(i)); + } + + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadRequest_SignatureInfo::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadRequest_SignatureInfo::MergeFrom(const ClientDownloadRequest_SignatureInfo& from) { + GOOGLE_CHECK_NE(&from, this); + certificate_chain_.MergeFrom(from.certificate_chain_); + if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (from.has_trusted()) { + set_trusted(from.trusted()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadRequest_SignatureInfo::CopyFrom(const ClientDownloadRequest_SignatureInfo& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadRequest_SignatureInfo::IsInitialized() const { + + return true; +} + +void ClientDownloadRequest_SignatureInfo::Swap(ClientDownloadRequest_SignatureInfo* other) { + if (other != this) { + certificate_chain_.Swap(&other->certificate_chain_); + std::swap(trusted_, other->trusted_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadRequest_SignatureInfo::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest.SignatureInfo"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientDownloadRequest_PEImageHeaders_DebugData::kDirectoryEntryFieldNumber; +const int ClientDownloadRequest_PEImageHeaders_DebugData::kRawDataFieldNumber; +#endif // !_MSC_VER + +ClientDownloadRequest_PEImageHeaders_DebugData::ClientDownloadRequest_PEImageHeaders_DebugData() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::InitAsDefaultInstance() { +} + +ClientDownloadRequest_PEImageHeaders_DebugData::ClientDownloadRequest_PEImageHeaders_DebugData(const ClientDownloadRequest_PEImageHeaders_DebugData& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + directory_entry_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + raw_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadRequest_PEImageHeaders_DebugData::~ClientDownloadRequest_PEImageHeaders_DebugData() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) + SharedDtor(); +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::SharedDtor() { + if (directory_entry_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete directory_entry_; + } + if (raw_data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete raw_data_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadRequest_PEImageHeaders_DebugData& ClientDownloadRequest_PEImageHeaders_DebugData::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadRequest_PEImageHeaders_DebugData* ClientDownloadRequest_PEImageHeaders_DebugData::default_instance_ = NULL; + +ClientDownloadRequest_PEImageHeaders_DebugData* ClientDownloadRequest_PEImageHeaders_DebugData::New() const { + return new ClientDownloadRequest_PEImageHeaders_DebugData; +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_directory_entry()) { + if (directory_entry_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + directory_entry_->clear(); + } + } + if (has_raw_data()) { + if (raw_data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + raw_data_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadRequest_PEImageHeaders_DebugData::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bytes directory_entry = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_directory_entry())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_raw_data; + break; + } + + // optional bytes raw_data = 2; + case 2: { + if (tag == 18) { + parse_raw_data: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_raw_data())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) + return false; +#undef DO_ +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) + // optional bytes directory_entry = 1; + if (has_directory_entry()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 1, this->directory_entry(), output); + } + + // optional bytes raw_data = 2; + if (has_raw_data()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 2, this->raw_data(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) +} + +int ClientDownloadRequest_PEImageHeaders_DebugData::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bytes directory_entry = 1; + if (has_directory_entry()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->directory_entry()); + } + + // optional bytes raw_data = 2; + if (has_raw_data()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->raw_data()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::MergeFrom(const ClientDownloadRequest_PEImageHeaders_DebugData& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_directory_entry()) { + set_directory_entry(from.directory_entry()); + } + if (from.has_raw_data()) { + set_raw_data(from.raw_data()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::CopyFrom(const ClientDownloadRequest_PEImageHeaders_DebugData& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadRequest_PEImageHeaders_DebugData::IsInitialized() const { + + return true; +} + +void ClientDownloadRequest_PEImageHeaders_DebugData::Swap(ClientDownloadRequest_PEImageHeaders_DebugData* other) { + if (other != this) { + std::swap(directory_entry_, other->directory_entry_); + std::swap(raw_data_, other->raw_data_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadRequest_PEImageHeaders_DebugData::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientDownloadRequest_PEImageHeaders::kDosHeaderFieldNumber; +const int ClientDownloadRequest_PEImageHeaders::kFileHeaderFieldNumber; +const int ClientDownloadRequest_PEImageHeaders::kOptionalHeaders32FieldNumber; +const int ClientDownloadRequest_PEImageHeaders::kOptionalHeaders64FieldNumber; +const int ClientDownloadRequest_PEImageHeaders::kSectionHeaderFieldNumber; +const int ClientDownloadRequest_PEImageHeaders::kExportSectionDataFieldNumber; +const int ClientDownloadRequest_PEImageHeaders::kDebugDataFieldNumber; +#endif // !_MSC_VER + +ClientDownloadRequest_PEImageHeaders::ClientDownloadRequest_PEImageHeaders() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest.PEImageHeaders) +} + +void ClientDownloadRequest_PEImageHeaders::InitAsDefaultInstance() { +} + +ClientDownloadRequest_PEImageHeaders::ClientDownloadRequest_PEImageHeaders(const ClientDownloadRequest_PEImageHeaders& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest.PEImageHeaders) +} + +void ClientDownloadRequest_PEImageHeaders::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + dos_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + file_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + optional_headers32_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + optional_headers64_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + export_section_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadRequest_PEImageHeaders::~ClientDownloadRequest_PEImageHeaders() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest.PEImageHeaders) + SharedDtor(); +} + +void ClientDownloadRequest_PEImageHeaders::SharedDtor() { + if (dos_header_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete dos_header_; + } + if (file_header_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete file_header_; + } + if (optional_headers32_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete optional_headers32_; + } + if (optional_headers64_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete optional_headers64_; + } + if (export_section_data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete export_section_data_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientDownloadRequest_PEImageHeaders::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadRequest_PEImageHeaders& ClientDownloadRequest_PEImageHeaders::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadRequest_PEImageHeaders* ClientDownloadRequest_PEImageHeaders::default_instance_ = NULL; + +ClientDownloadRequest_PEImageHeaders* ClientDownloadRequest_PEImageHeaders::New() const { + return new ClientDownloadRequest_PEImageHeaders; +} + +void ClientDownloadRequest_PEImageHeaders::Clear() { + if (_has_bits_[0 / 32] & 47) { + if (has_dos_header()) { + if (dos_header_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + dos_header_->clear(); + } + } + if (has_file_header()) { + if (file_header_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_header_->clear(); + } + } + if (has_optional_headers32()) { + if (optional_headers32_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers32_->clear(); + } + } + if (has_optional_headers64()) { + if (optional_headers64_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers64_->clear(); + } + } + if (has_export_section_data()) { + if (export_section_data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + export_section_data_->clear(); + } + } + } + section_header_.Clear(); + debug_data_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadRequest_PEImageHeaders::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest.PEImageHeaders) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bytes dos_header = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_dos_header())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_file_header; + break; + } + + // optional bytes file_header = 2; + case 2: { + if (tag == 18) { + parse_file_header: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_file_header())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_optional_headers32; + break; + } + + // optional bytes optional_headers32 = 3; + case 3: { + if (tag == 26) { + parse_optional_headers32: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_optional_headers32())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_optional_headers64; + break; + } + + // optional bytes optional_headers64 = 4; + case 4: { + if (tag == 34) { + parse_optional_headers64: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_optional_headers64())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_section_header; + break; + } + + // repeated bytes section_header = 5; + case 5: { + if (tag == 42) { + parse_section_header: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->add_section_header())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_section_header; + if (input->ExpectTag(50)) goto parse_export_section_data; + break; + } + + // optional bytes export_section_data = 6; + case 6: { + if (tag == 50) { + parse_export_section_data: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_export_section_data())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(58)) goto parse_debug_data; + break; + } + + // repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; + case 7: { + if (tag == 58) { + parse_debug_data: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_debug_data())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(58)) goto parse_debug_data; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest.PEImageHeaders) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest.PEImageHeaders) + return false; +#undef DO_ +} + +void ClientDownloadRequest_PEImageHeaders::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest.PEImageHeaders) + // optional bytes dos_header = 1; + if (has_dos_header()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 1, this->dos_header(), output); + } + + // optional bytes file_header = 2; + if (has_file_header()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 2, this->file_header(), output); + } + + // optional bytes optional_headers32 = 3; + if (has_optional_headers32()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 3, this->optional_headers32(), output); + } + + // optional bytes optional_headers64 = 4; + if (has_optional_headers64()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 4, this->optional_headers64(), output); + } + + // repeated bytes section_header = 5; + for (int i = 0; i < this->section_header_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteBytes( + 5, this->section_header(i), output); + } + + // optional bytes export_section_data = 6; + if (has_export_section_data()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 6, this->export_section_data(), output); + } + + // repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; + for (int i = 0; i < this->debug_data_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 7, this->debug_data(i), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest.PEImageHeaders) +} + +int ClientDownloadRequest_PEImageHeaders::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bytes dos_header = 1; + if (has_dos_header()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->dos_header()); + } + + // optional bytes file_header = 2; + if (has_file_header()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->file_header()); + } + + // optional bytes optional_headers32 = 3; + if (has_optional_headers32()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->optional_headers32()); + } + + // optional bytes optional_headers64 = 4; + if (has_optional_headers64()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->optional_headers64()); + } + + // optional bytes export_section_data = 6; + if (has_export_section_data()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->export_section_data()); + } + + } + // repeated bytes section_header = 5; + total_size += 1 * this->section_header_size(); + for (int i = 0; i < this->section_header_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::BytesSize( + this->section_header(i)); + } + + // repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; + total_size += 1 * this->debug_data_size(); + for (int i = 0; i < this->debug_data_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->debug_data(i)); + } + + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadRequest_PEImageHeaders::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadRequest_PEImageHeaders::MergeFrom(const ClientDownloadRequest_PEImageHeaders& from) { + GOOGLE_CHECK_NE(&from, this); + section_header_.MergeFrom(from.section_header_); + debug_data_.MergeFrom(from.debug_data_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_dos_header()) { + set_dos_header(from.dos_header()); + } + if (from.has_file_header()) { + set_file_header(from.file_header()); + } + if (from.has_optional_headers32()) { + set_optional_headers32(from.optional_headers32()); + } + if (from.has_optional_headers64()) { + set_optional_headers64(from.optional_headers64()); + } + if (from.has_export_section_data()) { + set_export_section_data(from.export_section_data()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadRequest_PEImageHeaders::CopyFrom(const ClientDownloadRequest_PEImageHeaders& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadRequest_PEImageHeaders::IsInitialized() const { + + return true; +} + +void ClientDownloadRequest_PEImageHeaders::Swap(ClientDownloadRequest_PEImageHeaders* other) { + if (other != this) { + std::swap(dos_header_, other->dos_header_); + std::swap(file_header_, other->file_header_); + std::swap(optional_headers32_, other->optional_headers32_); + std::swap(optional_headers64_, other->optional_headers64_); + section_header_.Swap(&other->section_header_); + std::swap(export_section_data_, other->export_section_data_); + debug_data_.Swap(&other->debug_data_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadRequest_PEImageHeaders::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest.PEImageHeaders"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientDownloadRequest_ImageHeaders::kPeHeadersFieldNumber; +#endif // !_MSC_VER + +ClientDownloadRequest_ImageHeaders::ClientDownloadRequest_ImageHeaders() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest.ImageHeaders) +} + +void ClientDownloadRequest_ImageHeaders::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + pe_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_PEImageHeaders*>( + ::safe_browsing::ClientDownloadRequest_PEImageHeaders::internal_default_instance()); +#else + pe_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_PEImageHeaders*>(&::safe_browsing::ClientDownloadRequest_PEImageHeaders::default_instance()); +#endif +} + +ClientDownloadRequest_ImageHeaders::ClientDownloadRequest_ImageHeaders(const ClientDownloadRequest_ImageHeaders& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest.ImageHeaders) +} + +void ClientDownloadRequest_ImageHeaders::SharedCtor() { + _cached_size_ = 0; + pe_headers_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadRequest_ImageHeaders::~ClientDownloadRequest_ImageHeaders() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest.ImageHeaders) + SharedDtor(); +} + +void ClientDownloadRequest_ImageHeaders::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete pe_headers_; + } +} + +void ClientDownloadRequest_ImageHeaders::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadRequest_ImageHeaders& ClientDownloadRequest_ImageHeaders::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadRequest_ImageHeaders* ClientDownloadRequest_ImageHeaders::default_instance_ = NULL; + +ClientDownloadRequest_ImageHeaders* ClientDownloadRequest_ImageHeaders::New() const { + return new ClientDownloadRequest_ImageHeaders; +} + +void ClientDownloadRequest_ImageHeaders::Clear() { + if (has_pe_headers()) { + if (pe_headers_ != NULL) pe_headers_->::safe_browsing::ClientDownloadRequest_PEImageHeaders::Clear(); + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadRequest_ImageHeaders::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest.ImageHeaders) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_pe_headers())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest.ImageHeaders) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest.ImageHeaders) + return false; +#undef DO_ +} + +void ClientDownloadRequest_ImageHeaders::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest.ImageHeaders) + // optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; + if (has_pe_headers()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 1, this->pe_headers(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest.ImageHeaders) +} + +int ClientDownloadRequest_ImageHeaders::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; + if (has_pe_headers()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->pe_headers()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadRequest_ImageHeaders::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadRequest_ImageHeaders::MergeFrom(const ClientDownloadRequest_ImageHeaders& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_pe_headers()) { + mutable_pe_headers()->::safe_browsing::ClientDownloadRequest_PEImageHeaders::MergeFrom(from.pe_headers()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadRequest_ImageHeaders::CopyFrom(const ClientDownloadRequest_ImageHeaders& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadRequest_ImageHeaders::IsInitialized() const { + + return true; +} + +void ClientDownloadRequest_ImageHeaders::Swap(ClientDownloadRequest_ImageHeaders* other) { + if (other != this) { + std::swap(pe_headers_, other->pe_headers_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadRequest_ImageHeaders::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest.ImageHeaders"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientDownloadRequest_ArchivedBinary::kFileBasenameFieldNumber; +const int ClientDownloadRequest_ArchivedBinary::kDownloadTypeFieldNumber; +const int ClientDownloadRequest_ArchivedBinary::kDigestsFieldNumber; +const int ClientDownloadRequest_ArchivedBinary::kLengthFieldNumber; +const int ClientDownloadRequest_ArchivedBinary::kSignatureFieldNumber; +const int ClientDownloadRequest_ArchivedBinary::kImageHeadersFieldNumber; +#endif // !_MSC_VER + +ClientDownloadRequest_ArchivedBinary::ClientDownloadRequest_ArchivedBinary() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest.ArchivedBinary) +} + +void ClientDownloadRequest_ArchivedBinary::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + digests_ = const_cast< ::safe_browsing::ClientDownloadRequest_Digests*>( + ::safe_browsing::ClientDownloadRequest_Digests::internal_default_instance()); +#else + digests_ = const_cast< ::safe_browsing::ClientDownloadRequest_Digests*>(&::safe_browsing::ClientDownloadRequest_Digests::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + signature_ = const_cast< ::safe_browsing::ClientDownloadRequest_SignatureInfo*>( + ::safe_browsing::ClientDownloadRequest_SignatureInfo::internal_default_instance()); +#else + signature_ = const_cast< ::safe_browsing::ClientDownloadRequest_SignatureInfo*>(&::safe_browsing::ClientDownloadRequest_SignatureInfo::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + image_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_ImageHeaders*>( + ::safe_browsing::ClientDownloadRequest_ImageHeaders::internal_default_instance()); +#else + image_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_ImageHeaders*>(&::safe_browsing::ClientDownloadRequest_ImageHeaders::default_instance()); +#endif +} + +ClientDownloadRequest_ArchivedBinary::ClientDownloadRequest_ArchivedBinary(const ClientDownloadRequest_ArchivedBinary& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest.ArchivedBinary) +} + +void ClientDownloadRequest_ArchivedBinary::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + download_type_ = 0; + digests_ = NULL; + length_ = GOOGLE_LONGLONG(0); + signature_ = NULL; + image_headers_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadRequest_ArchivedBinary::~ClientDownloadRequest_ArchivedBinary() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest.ArchivedBinary) + SharedDtor(); +} + +void ClientDownloadRequest_ArchivedBinary::SharedDtor() { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete file_basename_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete digests_; + delete signature_; + delete image_headers_; + } +} + +void ClientDownloadRequest_ArchivedBinary::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadRequest_ArchivedBinary& ClientDownloadRequest_ArchivedBinary::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadRequest_ArchivedBinary* ClientDownloadRequest_ArchivedBinary::default_instance_ = NULL; + +ClientDownloadRequest_ArchivedBinary* ClientDownloadRequest_ArchivedBinary::New() const { + return new ClientDownloadRequest_ArchivedBinary; +} + +void ClientDownloadRequest_ArchivedBinary::Clear() { + if (_has_bits_[0 / 32] & 63) { + if (has_file_basename()) { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_->clear(); + } + } + download_type_ = 0; + if (has_digests()) { + if (digests_ != NULL) digests_->::safe_browsing::ClientDownloadRequest_Digests::Clear(); + } + length_ = GOOGLE_LONGLONG(0); + if (has_signature()) { + if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); + } + if (has_image_headers()) { + if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadRequest_ArchivedBinary::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest.ArchivedBinary) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string file_basename = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_file_basename())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(16)) goto parse_download_type; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 2; + case 2: { + if (tag == 16) { + parse_download_type: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientDownloadRequest_DownloadType_IsValid(value)) { + set_download_type(static_cast< ::safe_browsing::ClientDownloadRequest_DownloadType >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_digests; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.Digests digests = 3; + case 3: { + if (tag == 26) { + parse_digests: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_digests())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(32)) goto parse_length; + break; + } + + // optional int64 length = 4; + case 4: { + if (tag == 32) { + parse_length: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &length_))); + set_has_length(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_signature; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + case 5: { + if (tag == 42) { + parse_signature: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_signature())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(50)) goto parse_image_headers; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; + case 6: { + if (tag == 50) { + parse_image_headers: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_image_headers())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest.ArchivedBinary) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest.ArchivedBinary) + return false; +#undef DO_ +} + +void ClientDownloadRequest_ArchivedBinary::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest.ArchivedBinary) + // optional string file_basename = 1; + if (has_file_basename()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->file_basename(), output); + } + + // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 2; + if (has_download_type()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 2, this->download_type(), output); + } + + // optional .safe_browsing.ClientDownloadRequest.Digests digests = 3; + if (has_digests()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 3, this->digests(), output); + } + + // optional int64 length = 4; + if (has_length()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(4, this->length(), output); + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + if (has_signature()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 5, this->signature(), output); + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; + if (has_image_headers()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 6, this->image_headers(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest.ArchivedBinary) +} + +int ClientDownloadRequest_ArchivedBinary::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string file_basename = 1; + if (has_file_basename()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->file_basename()); + } + + // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 2; + if (has_download_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->download_type()); + } + + // optional .safe_browsing.ClientDownloadRequest.Digests digests = 3; + if (has_digests()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->digests()); + } + + // optional int64 length = 4; + if (has_length()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->length()); + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + if (has_signature()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->signature()); + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; + if (has_image_headers()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->image_headers()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadRequest_ArchivedBinary::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadRequest_ArchivedBinary::MergeFrom(const ClientDownloadRequest_ArchivedBinary& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_file_basename()) { + set_file_basename(from.file_basename()); + } + if (from.has_download_type()) { + set_download_type(from.download_type()); + } + if (from.has_digests()) { + mutable_digests()->::safe_browsing::ClientDownloadRequest_Digests::MergeFrom(from.digests()); + } + if (from.has_length()) { + set_length(from.length()); + } + if (from.has_signature()) { + mutable_signature()->::safe_browsing::ClientDownloadRequest_SignatureInfo::MergeFrom(from.signature()); + } + if (from.has_image_headers()) { + mutable_image_headers()->::safe_browsing::ClientDownloadRequest_ImageHeaders::MergeFrom(from.image_headers()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadRequest_ArchivedBinary::CopyFrom(const ClientDownloadRequest_ArchivedBinary& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadRequest_ArchivedBinary::IsInitialized() const { + + return true; +} + +void ClientDownloadRequest_ArchivedBinary::Swap(ClientDownloadRequest_ArchivedBinary* other) { + if (other != this) { + std::swap(file_basename_, other->file_basename_); + std::swap(download_type_, other->download_type_); + std::swap(digests_, other->digests_); + std::swap(length_, other->length_); + std::swap(signature_, other->signature_); + std::swap(image_headers_, other->image_headers_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadRequest_ArchivedBinary::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest.ArchivedBinary"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientDownloadRequest::kUrlFieldNumber; +const int ClientDownloadRequest::kDigestsFieldNumber; +const int ClientDownloadRequest::kLengthFieldNumber; +const int ClientDownloadRequest::kResourcesFieldNumber; +const int ClientDownloadRequest::kSignatureFieldNumber; +const int ClientDownloadRequest::kUserInitiatedFieldNumber; +const int ClientDownloadRequest::kFileBasenameFieldNumber; +const int ClientDownloadRequest::kDownloadTypeFieldNumber; +const int ClientDownloadRequest::kLocaleFieldNumber; +const int ClientDownloadRequest::kImageHeadersFieldNumber; +const int ClientDownloadRequest::kArchivedBinaryFieldNumber; +#endif // !_MSC_VER + +ClientDownloadRequest::ClientDownloadRequest() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadRequest) +} + +void ClientDownloadRequest::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + digests_ = const_cast< ::safe_browsing::ClientDownloadRequest_Digests*>( + ::safe_browsing::ClientDownloadRequest_Digests::internal_default_instance()); +#else + digests_ = const_cast< ::safe_browsing::ClientDownloadRequest_Digests*>(&::safe_browsing::ClientDownloadRequest_Digests::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + signature_ = const_cast< ::safe_browsing::ClientDownloadRequest_SignatureInfo*>( + ::safe_browsing::ClientDownloadRequest_SignatureInfo::internal_default_instance()); +#else + signature_ = const_cast< ::safe_browsing::ClientDownloadRequest_SignatureInfo*>(&::safe_browsing::ClientDownloadRequest_SignatureInfo::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + image_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_ImageHeaders*>( + ::safe_browsing::ClientDownloadRequest_ImageHeaders::internal_default_instance()); +#else + image_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_ImageHeaders*>(&::safe_browsing::ClientDownloadRequest_ImageHeaders::default_instance()); +#endif +} + +ClientDownloadRequest::ClientDownloadRequest(const ClientDownloadRequest& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadRequest) +} + +void ClientDownloadRequest::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + digests_ = NULL; + length_ = GOOGLE_LONGLONG(0); + signature_ = NULL; + user_initiated_ = false; + file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + download_type_ = 0; + locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + image_headers_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadRequest::~ClientDownloadRequest() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadRequest) + SharedDtor(); +} + +void ClientDownloadRequest::SharedDtor() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete file_basename_; + } + if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete locale_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete digests_; + delete signature_; + delete image_headers_; + } +} + +void ClientDownloadRequest::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadRequest& ClientDownloadRequest::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadRequest* ClientDownloadRequest::default_instance_ = NULL; + +ClientDownloadRequest* ClientDownloadRequest::New() const { + return new ClientDownloadRequest; +} + +void ClientDownloadRequest::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + if (_has_bits_[0 / 32] & 247) { + ZR_(user_initiated_, download_type_); + if (has_url()) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + } + if (has_digests()) { + if (digests_ != NULL) digests_->::safe_browsing::ClientDownloadRequest_Digests::Clear(); + } + length_ = GOOGLE_LONGLONG(0); + if (has_signature()) { + if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); + } + if (has_file_basename()) { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_->clear(); + } + } + } + if (_has_bits_[8 / 32] & 768) { + if (has_locale()) { + if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + locale_->clear(); + } + } + if (has_image_headers()) { + if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); + } + } + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + resources_.Clear(); + archived_binary_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadRequest::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadRequest) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required string url = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_url())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_digests; + break; + } + + // required .safe_browsing.ClientDownloadRequest.Digests digests = 2; + case 2: { + if (tag == 18) { + parse_digests: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_digests())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_length; + break; + } + + // required int64 length = 3; + case 3: { + if (tag == 24) { + parse_length: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &length_))); + set_has_length(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_resources; + break; + } + + // repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; + case 4: { + if (tag == 34) { + parse_resources: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_resources())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_resources; + if (input->ExpectTag(42)) goto parse_signature; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + case 5: { + if (tag == 42) { + parse_signature: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_signature())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(48)) goto parse_user_initiated; + break; + } + + // optional bool user_initiated = 6; + case 6: { + if (tag == 48) { + parse_user_initiated: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &user_initiated_))); + set_has_user_initiated(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(74)) goto parse_file_basename; + break; + } + + // optional string file_basename = 9; + case 9: { + if (tag == 74) { + parse_file_basename: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_file_basename())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(80)) goto parse_download_type; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; + case 10: { + if (tag == 80) { + parse_download_type: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientDownloadRequest_DownloadType_IsValid(value)) { + set_download_type(static_cast< ::safe_browsing::ClientDownloadRequest_DownloadType >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(90)) goto parse_locale; + break; + } + + // optional string locale = 11; + case 11: { + if (tag == 90) { + parse_locale: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_locale())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(146)) goto parse_image_headers; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; + case 18: { + if (tag == 146) { + parse_image_headers: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_image_headers())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(178)) goto parse_archived_binary; + break; + } + + // repeated .safe_browsing.ClientDownloadRequest.ArchivedBinary archived_binary = 22; + case 22: { + if (tag == 178) { + parse_archived_binary: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_archived_binary())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(178)) goto parse_archived_binary; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadRequest) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadRequest) + return false; +#undef DO_ +} + +void ClientDownloadRequest::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadRequest) + // required string url = 1; + if (has_url()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->url(), output); + } + + // required .safe_browsing.ClientDownloadRequest.Digests digests = 2; + if (has_digests()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->digests(), output); + } + + // required int64 length = 3; + if (has_length()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(3, this->length(), output); + } + + // repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; + for (int i = 0; i < this->resources_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 4, this->resources(i), output); + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + if (has_signature()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 5, this->signature(), output); + } + + // optional bool user_initiated = 6; + if (has_user_initiated()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(6, this->user_initiated(), output); + } + + // optional string file_basename = 9; + if (has_file_basename()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 9, this->file_basename(), output); + } + + // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; + if (has_download_type()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 10, this->download_type(), output); + } + + // optional string locale = 11; + if (has_locale()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 11, this->locale(), output); + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; + if (has_image_headers()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 18, this->image_headers(), output); + } + + // repeated .safe_browsing.ClientDownloadRequest.ArchivedBinary archived_binary = 22; + for (int i = 0; i < this->archived_binary_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 22, this->archived_binary(i), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadRequest) +} + +int ClientDownloadRequest::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required string url = 1; + if (has_url()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->url()); + } + + // required .safe_browsing.ClientDownloadRequest.Digests digests = 2; + if (has_digests()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->digests()); + } + + // required int64 length = 3; + if (has_length()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->length()); + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + if (has_signature()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->signature()); + } + + // optional bool user_initiated = 6; + if (has_user_initiated()) { + total_size += 1 + 1; + } + + // optional string file_basename = 9; + if (has_file_basename()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->file_basename()); + } + + // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; + if (has_download_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->download_type()); + } + + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + // optional string locale = 11; + if (has_locale()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->locale()); + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; + if (has_image_headers()) { + total_size += 2 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->image_headers()); + } + + } + // repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; + total_size += 1 * this->resources_size(); + for (int i = 0; i < this->resources_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->resources(i)); + } + + // repeated .safe_browsing.ClientDownloadRequest.ArchivedBinary archived_binary = 22; + total_size += 2 * this->archived_binary_size(); + for (int i = 0; i < this->archived_binary_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->archived_binary(i)); + } + + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadRequest::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadRequest::MergeFrom(const ClientDownloadRequest& from) { + GOOGLE_CHECK_NE(&from, this); + resources_.MergeFrom(from.resources_); + archived_binary_.MergeFrom(from.archived_binary_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_url()) { + set_url(from.url()); + } + if (from.has_digests()) { + mutable_digests()->::safe_browsing::ClientDownloadRequest_Digests::MergeFrom(from.digests()); + } + if (from.has_length()) { + set_length(from.length()); + } + if (from.has_signature()) { + mutable_signature()->::safe_browsing::ClientDownloadRequest_SignatureInfo::MergeFrom(from.signature()); + } + if (from.has_user_initiated()) { + set_user_initiated(from.user_initiated()); + } + if (from.has_file_basename()) { + set_file_basename(from.file_basename()); + } + if (from.has_download_type()) { + set_download_type(from.download_type()); + } + } + if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (from.has_locale()) { + set_locale(from.locale()); + } + if (from.has_image_headers()) { + mutable_image_headers()->::safe_browsing::ClientDownloadRequest_ImageHeaders::MergeFrom(from.image_headers()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadRequest::CopyFrom(const ClientDownloadRequest& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadRequest::IsInitialized() const { + if ((_has_bits_[0] & 0x00000007) != 0x00000007) return false; + + if (!::google::protobuf::internal::AllAreInitialized(this->resources())) return false; + return true; +} + +void ClientDownloadRequest::Swap(ClientDownloadRequest* other) { + if (other != this) { + std::swap(url_, other->url_); + std::swap(digests_, other->digests_); + std::swap(length_, other->length_); + resources_.Swap(&other->resources_); + std::swap(signature_, other->signature_); + std::swap(user_initiated_, other->user_initiated_); + std::swap(file_basename_, other->file_basename_); + std::swap(download_type_, other->download_type_); + std::swap(locale_, other->locale_); + std::swap(image_headers_, other->image_headers_); + archived_binary_.Swap(&other->archived_binary_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadRequest::GetTypeName() const { + return "safe_browsing.ClientDownloadRequest"; +} + + +// =================================================================== + +bool ClientDownloadResponse_Verdict_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + case 3: + case 4: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const ClientDownloadResponse_Verdict ClientDownloadResponse::SAFE; +const ClientDownloadResponse_Verdict ClientDownloadResponse::DANGEROUS; +const ClientDownloadResponse_Verdict ClientDownloadResponse::UNCOMMON; +const ClientDownloadResponse_Verdict ClientDownloadResponse::POTENTIALLY_UNWANTED; +const ClientDownloadResponse_Verdict ClientDownloadResponse::DANGEROUS_HOST; +const ClientDownloadResponse_Verdict ClientDownloadResponse::Verdict_MIN; +const ClientDownloadResponse_Verdict ClientDownloadResponse::Verdict_MAX; +const int ClientDownloadResponse::Verdict_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int ClientDownloadResponse_MoreInfo::kDescriptionFieldNumber; +const int ClientDownloadResponse_MoreInfo::kUrlFieldNumber; +#endif // !_MSC_VER + +ClientDownloadResponse_MoreInfo::ClientDownloadResponse_MoreInfo() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadResponse.MoreInfo) +} + +void ClientDownloadResponse_MoreInfo::InitAsDefaultInstance() { +} + +ClientDownloadResponse_MoreInfo::ClientDownloadResponse_MoreInfo(const ClientDownloadResponse_MoreInfo& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadResponse.MoreInfo) +} + +void ClientDownloadResponse_MoreInfo::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + description_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadResponse_MoreInfo::~ClientDownloadResponse_MoreInfo() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadResponse.MoreInfo) + SharedDtor(); +} + +void ClientDownloadResponse_MoreInfo::SharedDtor() { + if (description_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete description_; + } + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientDownloadResponse_MoreInfo::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadResponse_MoreInfo& ClientDownloadResponse_MoreInfo::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadResponse_MoreInfo* ClientDownloadResponse_MoreInfo::default_instance_ = NULL; + +ClientDownloadResponse_MoreInfo* ClientDownloadResponse_MoreInfo::New() const { + return new ClientDownloadResponse_MoreInfo; +} + +void ClientDownloadResponse_MoreInfo::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_description()) { + if (description_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + description_->clear(); + } + } + if (has_url()) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadResponse_MoreInfo::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadResponse.MoreInfo) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string description = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_description())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_url; + break; + } + + // optional string url = 2; + case 2: { + if (tag == 18) { + parse_url: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_url())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadResponse.MoreInfo) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadResponse.MoreInfo) + return false; +#undef DO_ +} + +void ClientDownloadResponse_MoreInfo::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadResponse.MoreInfo) + // optional string description = 1; + if (has_description()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->description(), output); + } + + // optional string url = 2; + if (has_url()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->url(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadResponse.MoreInfo) +} + +int ClientDownloadResponse_MoreInfo::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string description = 1; + if (has_description()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->description()); + } + + // optional string url = 2; + if (has_url()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->url()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadResponse_MoreInfo::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadResponse_MoreInfo::MergeFrom(const ClientDownloadResponse_MoreInfo& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_description()) { + set_description(from.description()); + } + if (from.has_url()) { + set_url(from.url()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadResponse_MoreInfo::CopyFrom(const ClientDownloadResponse_MoreInfo& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadResponse_MoreInfo::IsInitialized() const { + + return true; +} + +void ClientDownloadResponse_MoreInfo::Swap(ClientDownloadResponse_MoreInfo* other) { + if (other != this) { + std::swap(description_, other->description_); + std::swap(url_, other->url_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadResponse_MoreInfo::GetTypeName() const { + return "safe_browsing.ClientDownloadResponse.MoreInfo"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientDownloadResponse::kVerdictFieldNumber; +const int ClientDownloadResponse::kMoreInfoFieldNumber; +const int ClientDownloadResponse::kTokenFieldNumber; +#endif // !_MSC_VER + +ClientDownloadResponse::ClientDownloadResponse() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadResponse) +} + +void ClientDownloadResponse::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + more_info_ = const_cast< ::safe_browsing::ClientDownloadResponse_MoreInfo*>( + ::safe_browsing::ClientDownloadResponse_MoreInfo::internal_default_instance()); +#else + more_info_ = const_cast< ::safe_browsing::ClientDownloadResponse_MoreInfo*>(&::safe_browsing::ClientDownloadResponse_MoreInfo::default_instance()); +#endif +} + +ClientDownloadResponse::ClientDownloadResponse(const ClientDownloadResponse& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadResponse) +} + +void ClientDownloadResponse::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + verdict_ = 0; + more_info_ = NULL; + token_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadResponse::~ClientDownloadResponse() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadResponse) + SharedDtor(); +} + +void ClientDownloadResponse::SharedDtor() { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete token_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete more_info_; + } +} + +void ClientDownloadResponse::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadResponse& ClientDownloadResponse::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadResponse* ClientDownloadResponse::default_instance_ = NULL; + +ClientDownloadResponse* ClientDownloadResponse::New() const { + return new ClientDownloadResponse; +} + +void ClientDownloadResponse::Clear() { + if (_has_bits_[0 / 32] & 7) { + verdict_ = 0; + if (has_more_info()) { + if (more_info_ != NULL) more_info_->::safe_browsing::ClientDownloadResponse_MoreInfo::Clear(); + } + if (has_token()) { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadResponse::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadResponse) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; + case 1: { + if (tag == 8) { + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientDownloadResponse_Verdict_IsValid(value)) { + set_verdict(static_cast< ::safe_browsing::ClientDownloadResponse_Verdict >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_more_info; + break; + } + + // optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; + case 2: { + if (tag == 18) { + parse_more_info: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_more_info())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_token; + break; + } + + // optional bytes token = 3; + case 3: { + if (tag == 26) { + parse_token: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_token())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadResponse) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadResponse) + return false; +#undef DO_ +} + +void ClientDownloadResponse::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadResponse) + // required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; + if (has_verdict()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 1, this->verdict(), output); + } + + // optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; + if (has_more_info()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->more_info(), output); + } + + // optional bytes token = 3; + if (has_token()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 3, this->token(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadResponse) +} + +int ClientDownloadResponse::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; + if (has_verdict()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->verdict()); + } + + // optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; + if (has_more_info()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->more_info()); + } + + // optional bytes token = 3; + if (has_token()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->token()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadResponse::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadResponse::MergeFrom(const ClientDownloadResponse& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_verdict()) { + set_verdict(from.verdict()); + } + if (from.has_more_info()) { + mutable_more_info()->::safe_browsing::ClientDownloadResponse_MoreInfo::MergeFrom(from.more_info()); + } + if (from.has_token()) { + set_token(from.token()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadResponse::CopyFrom(const ClientDownloadResponse& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadResponse::IsInitialized() const { + if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; + + return true; +} + +void ClientDownloadResponse::Swap(ClientDownloadResponse* other) { + if (other != this) { + std::swap(verdict_, other->verdict_); + std::swap(more_info_, other->more_info_); + std::swap(token_, other->token_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadResponse::GetTypeName() const { + return "safe_browsing.ClientDownloadResponse"; +} + + +// =================================================================== + +bool ClientDownloadReport_Reason_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const ClientDownloadReport_Reason ClientDownloadReport::SHARE; +const ClientDownloadReport_Reason ClientDownloadReport::FALSE_POSITIVE; +const ClientDownloadReport_Reason ClientDownloadReport::APPEAL; +const ClientDownloadReport_Reason ClientDownloadReport::Reason_MIN; +const ClientDownloadReport_Reason ClientDownloadReport::Reason_MAX; +const int ClientDownloadReport::Reason_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int ClientDownloadReport_UserInformation::kEmailFieldNumber; +#endif // !_MSC_VER + +ClientDownloadReport_UserInformation::ClientDownloadReport_UserInformation() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadReport.UserInformation) +} + +void ClientDownloadReport_UserInformation::InitAsDefaultInstance() { +} + +ClientDownloadReport_UserInformation::ClientDownloadReport_UserInformation(const ClientDownloadReport_UserInformation& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadReport.UserInformation) +} + +void ClientDownloadReport_UserInformation::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + email_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadReport_UserInformation::~ClientDownloadReport_UserInformation() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadReport.UserInformation) + SharedDtor(); +} + +void ClientDownloadReport_UserInformation::SharedDtor() { + if (email_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete email_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientDownloadReport_UserInformation::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadReport_UserInformation& ClientDownloadReport_UserInformation::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadReport_UserInformation* ClientDownloadReport_UserInformation::default_instance_ = NULL; + +ClientDownloadReport_UserInformation* ClientDownloadReport_UserInformation::New() const { + return new ClientDownloadReport_UserInformation; +} + +void ClientDownloadReport_UserInformation::Clear() { + if (has_email()) { + if (email_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + email_->clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadReport_UserInformation::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadReport.UserInformation) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string email = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_email())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadReport.UserInformation) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadReport.UserInformation) + return false; +#undef DO_ +} + +void ClientDownloadReport_UserInformation::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadReport.UserInformation) + // optional string email = 1; + if (has_email()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->email(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadReport.UserInformation) +} + +int ClientDownloadReport_UserInformation::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string email = 1; + if (has_email()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->email()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadReport_UserInformation::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadReport_UserInformation::MergeFrom(const ClientDownloadReport_UserInformation& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_email()) { + set_email(from.email()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadReport_UserInformation::CopyFrom(const ClientDownloadReport_UserInformation& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadReport_UserInformation::IsInitialized() const { + + return true; +} + +void ClientDownloadReport_UserInformation::Swap(ClientDownloadReport_UserInformation* other) { + if (other != this) { + std::swap(email_, other->email_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadReport_UserInformation::GetTypeName() const { + return "safe_browsing.ClientDownloadReport.UserInformation"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientDownloadReport::kReasonFieldNumber; +const int ClientDownloadReport::kDownloadRequestFieldNumber; +const int ClientDownloadReport::kUserInformationFieldNumber; +const int ClientDownloadReport::kCommentFieldNumber; +const int ClientDownloadReport::kDownloadResponseFieldNumber; +#endif // !_MSC_VER + +ClientDownloadReport::ClientDownloadReport() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientDownloadReport) +} + +void ClientDownloadReport::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + download_request_ = const_cast< ::safe_browsing::ClientDownloadRequest*>( + ::safe_browsing::ClientDownloadRequest::internal_default_instance()); +#else + download_request_ = const_cast< ::safe_browsing::ClientDownloadRequest*>(&::safe_browsing::ClientDownloadRequest::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + user_information_ = const_cast< ::safe_browsing::ClientDownloadReport_UserInformation*>( + ::safe_browsing::ClientDownloadReport_UserInformation::internal_default_instance()); +#else + user_information_ = const_cast< ::safe_browsing::ClientDownloadReport_UserInformation*>(&::safe_browsing::ClientDownloadReport_UserInformation::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + download_response_ = const_cast< ::safe_browsing::ClientDownloadResponse*>( + ::safe_browsing::ClientDownloadResponse::internal_default_instance()); +#else + download_response_ = const_cast< ::safe_browsing::ClientDownloadResponse*>(&::safe_browsing::ClientDownloadResponse::default_instance()); +#endif +} + +ClientDownloadReport::ClientDownloadReport(const ClientDownloadReport& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientDownloadReport) +} + +void ClientDownloadReport::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + reason_ = 0; + download_request_ = NULL; + user_information_ = NULL; + comment_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + download_response_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientDownloadReport::~ClientDownloadReport() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientDownloadReport) + SharedDtor(); +} + +void ClientDownloadReport::SharedDtor() { + if (comment_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete comment_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete download_request_; + delete user_information_; + delete download_response_; + } +} + +void ClientDownloadReport::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientDownloadReport& ClientDownloadReport::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientDownloadReport* ClientDownloadReport::default_instance_ = NULL; + +ClientDownloadReport* ClientDownloadReport::New() const { + return new ClientDownloadReport; +} + +void ClientDownloadReport::Clear() { + if (_has_bits_[0 / 32] & 31) { + reason_ = 0; + if (has_download_request()) { + if (download_request_ != NULL) download_request_->::safe_browsing::ClientDownloadRequest::Clear(); + } + if (has_user_information()) { + if (user_information_ != NULL) user_information_->::safe_browsing::ClientDownloadReport_UserInformation::Clear(); + } + if (has_comment()) { + if (comment_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + comment_->clear(); + } + } + if (has_download_response()) { + if (download_response_ != NULL) download_response_->::safe_browsing::ClientDownloadResponse::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientDownloadReport::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientDownloadReport) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional .safe_browsing.ClientDownloadReport.Reason reason = 1; + case 1: { + if (tag == 8) { + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientDownloadReport_Reason_IsValid(value)) { + set_reason(static_cast< ::safe_browsing::ClientDownloadReport_Reason >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_download_request; + break; + } + + // optional .safe_browsing.ClientDownloadRequest download_request = 2; + case 2: { + if (tag == 18) { + parse_download_request: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_download_request())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_user_information; + break; + } + + // optional .safe_browsing.ClientDownloadReport.UserInformation user_information = 3; + case 3: { + if (tag == 26) { + parse_user_information: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_user_information())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_comment; + break; + } + + // optional bytes comment = 4; + case 4: { + if (tag == 34) { + parse_comment: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_comment())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_download_response; + break; + } + + // optional .safe_browsing.ClientDownloadResponse download_response = 5; + case 5: { + if (tag == 42) { + parse_download_response: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_download_response())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientDownloadReport) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientDownloadReport) + return false; +#undef DO_ +} + +void ClientDownloadReport::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientDownloadReport) + // optional .safe_browsing.ClientDownloadReport.Reason reason = 1; + if (has_reason()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 1, this->reason(), output); + } + + // optional .safe_browsing.ClientDownloadRequest download_request = 2; + if (has_download_request()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->download_request(), output); + } + + // optional .safe_browsing.ClientDownloadReport.UserInformation user_information = 3; + if (has_user_information()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 3, this->user_information(), output); + } + + // optional bytes comment = 4; + if (has_comment()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 4, this->comment(), output); + } + + // optional .safe_browsing.ClientDownloadResponse download_response = 5; + if (has_download_response()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 5, this->download_response(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientDownloadReport) +} + +int ClientDownloadReport::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional .safe_browsing.ClientDownloadReport.Reason reason = 1; + if (has_reason()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->reason()); + } + + // optional .safe_browsing.ClientDownloadRequest download_request = 2; + if (has_download_request()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->download_request()); + } + + // optional .safe_browsing.ClientDownloadReport.UserInformation user_information = 3; + if (has_user_information()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->user_information()); + } + + // optional bytes comment = 4; + if (has_comment()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->comment()); + } + + // optional .safe_browsing.ClientDownloadResponse download_response = 5; + if (has_download_response()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->download_response()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientDownloadReport::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientDownloadReport::MergeFrom(const ClientDownloadReport& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_reason()) { + set_reason(from.reason()); + } + if (from.has_download_request()) { + mutable_download_request()->::safe_browsing::ClientDownloadRequest::MergeFrom(from.download_request()); + } + if (from.has_user_information()) { + mutable_user_information()->::safe_browsing::ClientDownloadReport_UserInformation::MergeFrom(from.user_information()); + } + if (from.has_comment()) { + set_comment(from.comment()); + } + if (from.has_download_response()) { + mutable_download_response()->::safe_browsing::ClientDownloadResponse::MergeFrom(from.download_response()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientDownloadReport::CopyFrom(const ClientDownloadReport& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientDownloadReport::IsInitialized() const { + + if (has_download_request()) { + if (!this->download_request().IsInitialized()) return false; + } + if (has_download_response()) { + if (!this->download_response().IsInitialized()) return false; + } + return true; +} + +void ClientDownloadReport::Swap(ClientDownloadReport* other) { + if (other != this) { + std::swap(reason_, other->reason_); + std::swap(download_request_, other->download_request_); + std::swap(user_information_, other->user_information_); + std::swap(comment_, other->comment_); + std::swap(download_response_, other->download_response_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientDownloadReport::GetTypeName() const { + return "safe_browsing.ClientDownloadReport"; +} + + +// =================================================================== + +bool ClientUploadResponse_UploadStatus_IsValid(int value) { + switch(value) { + case 0: + case 1: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const ClientUploadResponse_UploadStatus ClientUploadResponse::SUCCESS; +const ClientUploadResponse_UploadStatus ClientUploadResponse::UPLOAD_FAILURE; +const ClientUploadResponse_UploadStatus ClientUploadResponse::UploadStatus_MIN; +const ClientUploadResponse_UploadStatus ClientUploadResponse::UploadStatus_MAX; +const int ClientUploadResponse::UploadStatus_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int ClientUploadResponse::kStatusFieldNumber; +const int ClientUploadResponse::kPermalinkFieldNumber; +#endif // !_MSC_VER + +ClientUploadResponse::ClientUploadResponse() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientUploadResponse) +} + +void ClientUploadResponse::InitAsDefaultInstance() { +} + +ClientUploadResponse::ClientUploadResponse(const ClientUploadResponse& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientUploadResponse) +} + +void ClientUploadResponse::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + status_ = 0; + permalink_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientUploadResponse::~ClientUploadResponse() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientUploadResponse) + SharedDtor(); +} + +void ClientUploadResponse::SharedDtor() { + if (permalink_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete permalink_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientUploadResponse::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientUploadResponse& ClientUploadResponse::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientUploadResponse* ClientUploadResponse::default_instance_ = NULL; + +ClientUploadResponse* ClientUploadResponse::New() const { + return new ClientUploadResponse; +} + +void ClientUploadResponse::Clear() { + if (_has_bits_[0 / 32] & 3) { + status_ = 0; + if (has_permalink()) { + if (permalink_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + permalink_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientUploadResponse::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientUploadResponse) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional .safe_browsing.ClientUploadResponse.UploadStatus status = 1; + case 1: { + if (tag == 8) { + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientUploadResponse_UploadStatus_IsValid(value)) { + set_status(static_cast< ::safe_browsing::ClientUploadResponse_UploadStatus >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_permalink; + break; + } + + // optional string permalink = 2; + case 2: { + if (tag == 18) { + parse_permalink: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_permalink())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientUploadResponse) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientUploadResponse) + return false; +#undef DO_ +} + +void ClientUploadResponse::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientUploadResponse) + // optional .safe_browsing.ClientUploadResponse.UploadStatus status = 1; + if (has_status()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 1, this->status(), output); + } + + // optional string permalink = 2; + if (has_permalink()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->permalink(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientUploadResponse) +} + +int ClientUploadResponse::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional .safe_browsing.ClientUploadResponse.UploadStatus status = 1; + if (has_status()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->status()); + } + + // optional string permalink = 2; + if (has_permalink()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->permalink()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientUploadResponse::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientUploadResponse::MergeFrom(const ClientUploadResponse& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_status()) { + set_status(from.status()); + } + if (from.has_permalink()) { + set_permalink(from.permalink()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientUploadResponse::CopyFrom(const ClientUploadResponse& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientUploadResponse::IsInitialized() const { + + return true; +} + +void ClientUploadResponse::Swap(ClientUploadResponse* other) { + if (other != this) { + std::swap(status_, other->status_); + std::swap(permalink_, other->permalink_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientUploadResponse::GetTypeName() const { + return "safe_browsing.ClientUploadResponse"; +} + + +// =================================================================== + +bool ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + case 3: + case 4: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident::UNKNOWN; +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident::CLEARED; +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident::WEAK_LEGACY_OBSOLETE; +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident::CHANGED; +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident::UNTRUSTED_UNKNOWN_VALUE; +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident::ValueState_MIN; +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident::ValueState_MAX; +const int ClientIncidentReport_IncidentData_TrackedPreferenceIncident::ValueState_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int ClientIncidentReport_IncidentData_TrackedPreferenceIncident::kPathFieldNumber; +const int ClientIncidentReport_IncidentData_TrackedPreferenceIncident::kAtomicValueFieldNumber; +const int ClientIncidentReport_IncidentData_TrackedPreferenceIncident::kSplitKeyFieldNumber; +const int ClientIncidentReport_IncidentData_TrackedPreferenceIncident::kValueStateFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_IncidentData_TrackedPreferenceIncident::ClientIncidentReport_IncidentData_TrackedPreferenceIncident() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident) +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::InitAsDefaultInstance() { +} + +ClientIncidentReport_IncidentData_TrackedPreferenceIncident::ClientIncidentReport_IncidentData_TrackedPreferenceIncident(const ClientIncidentReport_IncidentData_TrackedPreferenceIncident& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident) +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + path_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + atomic_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + value_state_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_IncidentData_TrackedPreferenceIncident::~ClientIncidentReport_IncidentData_TrackedPreferenceIncident() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident) + SharedDtor(); +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::SharedDtor() { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete path_; + } + if (atomic_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete atomic_value_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident& ClientIncidentReport_IncidentData_TrackedPreferenceIncident::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_IncidentData_TrackedPreferenceIncident* ClientIncidentReport_IncidentData_TrackedPreferenceIncident::default_instance_ = NULL; + +ClientIncidentReport_IncidentData_TrackedPreferenceIncident* ClientIncidentReport_IncidentData_TrackedPreferenceIncident::New() const { + return new ClientIncidentReport_IncidentData_TrackedPreferenceIncident; +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::Clear() { + if (_has_bits_[0 / 32] & 11) { + if (has_path()) { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_->clear(); + } + } + if (has_atomic_value()) { + if (atomic_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + atomic_value_->clear(); + } + } + value_state_ = 0; + } + split_key_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_IncidentData_TrackedPreferenceIncident::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string path = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_path())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_atomic_value; + break; + } + + // optional string atomic_value = 2; + case 2: { + if (tag == 18) { + parse_atomic_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_atomic_value())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_split_key; + break; + } + + // repeated string split_key = 3; + case 3: { + if (tag == 26) { + parse_split_key: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_split_key())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_split_key; + if (input->ExpectTag(32)) goto parse_value_state; + break; + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.ValueState value_state = 4; + case 4: { + if (tag == 32) { + parse_value_state: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_IsValid(value)) { + set_value_state(static_cast< ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident) + return false; +#undef DO_ +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident) + // optional string path = 1; + if (has_path()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->path(), output); + } + + // optional string atomic_value = 2; + if (has_atomic_value()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->atomic_value(), output); + } + + // repeated string split_key = 3; + for (int i = 0; i < this->split_key_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->split_key(i), output); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.ValueState value_state = 4; + if (has_value_state()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 4, this->value_state(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident) +} + +int ClientIncidentReport_IncidentData_TrackedPreferenceIncident::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string path = 1; + if (has_path()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->path()); + } + + // optional string atomic_value = 2; + if (has_atomic_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->atomic_value()); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.ValueState value_state = 4; + if (has_value_state()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->value_state()); + } + + } + // repeated string split_key = 3; + total_size += 1 * this->split_key_size(); + for (int i = 0; i < this->split_key_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->split_key(i)); + } + + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::MergeFrom(const ClientIncidentReport_IncidentData_TrackedPreferenceIncident& from) { + GOOGLE_CHECK_NE(&from, this); + split_key_.MergeFrom(from.split_key_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_path()) { + set_path(from.path()); + } + if (from.has_atomic_value()) { + set_atomic_value(from.atomic_value()); + } + if (from.has_value_state()) { + set_value_state(from.value_state()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::CopyFrom(const ClientIncidentReport_IncidentData_TrackedPreferenceIncident& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_IncidentData_TrackedPreferenceIncident::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::Swap(ClientIncidentReport_IncidentData_TrackedPreferenceIncident* other) { + if (other != this) { + std::swap(path_, other->path_); + std::swap(atomic_value_, other->atomic_value_); + split_key_.Swap(&other->split_key_); + std::swap(value_state_, other->value_state_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_IncidentData_TrackedPreferenceIncident::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_IncidentData_BinaryIntegrityIncident::kFileBasenameFieldNumber; +const int ClientIncidentReport_IncidentData_BinaryIntegrityIncident::kSignatureFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_IncidentData_BinaryIntegrityIncident::ClientIncidentReport_IncidentData_BinaryIntegrityIncident() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident) +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + signature_ = const_cast< ::safe_browsing::ClientDownloadRequest_SignatureInfo*>( + ::safe_browsing::ClientDownloadRequest_SignatureInfo::internal_default_instance()); +#else + signature_ = const_cast< ::safe_browsing::ClientDownloadRequest_SignatureInfo*>(&::safe_browsing::ClientDownloadRequest_SignatureInfo::default_instance()); +#endif +} + +ClientIncidentReport_IncidentData_BinaryIntegrityIncident::ClientIncidentReport_IncidentData_BinaryIntegrityIncident(const ClientIncidentReport_IncidentData_BinaryIntegrityIncident& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident) +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + signature_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_IncidentData_BinaryIntegrityIncident::~ClientIncidentReport_IncidentData_BinaryIntegrityIncident() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident) + SharedDtor(); +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::SharedDtor() { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete file_basename_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete signature_; + } +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_IncidentData_BinaryIntegrityIncident& ClientIncidentReport_IncidentData_BinaryIntegrityIncident::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_IncidentData_BinaryIntegrityIncident* ClientIncidentReport_IncidentData_BinaryIntegrityIncident::default_instance_ = NULL; + +ClientIncidentReport_IncidentData_BinaryIntegrityIncident* ClientIncidentReport_IncidentData_BinaryIntegrityIncident::New() const { + return new ClientIncidentReport_IncidentData_BinaryIntegrityIncident; +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_file_basename()) { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_->clear(); + } + } + if (has_signature()) { + if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_IncidentData_BinaryIntegrityIncident::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string file_basename = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_file_basename())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_signature; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 2; + case 2: { + if (tag == 18) { + parse_signature: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_signature())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident) + return false; +#undef DO_ +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident) + // optional string file_basename = 1; + if (has_file_basename()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->file_basename(), output); + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 2; + if (has_signature()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->signature(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident) +} + +int ClientIncidentReport_IncidentData_BinaryIntegrityIncident::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string file_basename = 1; + if (has_file_basename()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->file_basename()); + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 2; + if (has_signature()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->signature()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::MergeFrom(const ClientIncidentReport_IncidentData_BinaryIntegrityIncident& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_file_basename()) { + set_file_basename(from.file_basename()); + } + if (from.has_signature()) { + mutable_signature()->::safe_browsing::ClientDownloadRequest_SignatureInfo::MergeFrom(from.signature()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::CopyFrom(const ClientIncidentReport_IncidentData_BinaryIntegrityIncident& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_IncidentData_BinaryIntegrityIncident::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::Swap(ClientIncidentReport_IncidentData_BinaryIntegrityIncident* other) { + if (other != this) { + std::swap(file_basename_, other->file_basename_); + std::swap(signature_, other->signature_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_IncidentData_BinaryIntegrityIncident::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_IncidentData_BlacklistLoadIncident::kPathFieldNumber; +const int ClientIncidentReport_IncidentData_BlacklistLoadIncident::kDigestFieldNumber; +const int ClientIncidentReport_IncidentData_BlacklistLoadIncident::kVersionFieldNumber; +const int ClientIncidentReport_IncidentData_BlacklistLoadIncident::kBlacklistInitializedFieldNumber; +const int ClientIncidentReport_IncidentData_BlacklistLoadIncident::kSignatureFieldNumber; +const int ClientIncidentReport_IncidentData_BlacklistLoadIncident::kImageHeadersFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_IncidentData_BlacklistLoadIncident::ClientIncidentReport_IncidentData_BlacklistLoadIncident() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident) +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + digest_ = const_cast< ::safe_browsing::ClientDownloadRequest_Digests*>( + ::safe_browsing::ClientDownloadRequest_Digests::internal_default_instance()); +#else + digest_ = const_cast< ::safe_browsing::ClientDownloadRequest_Digests*>(&::safe_browsing::ClientDownloadRequest_Digests::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + signature_ = const_cast< ::safe_browsing::ClientDownloadRequest_SignatureInfo*>( + ::safe_browsing::ClientDownloadRequest_SignatureInfo::internal_default_instance()); +#else + signature_ = const_cast< ::safe_browsing::ClientDownloadRequest_SignatureInfo*>(&::safe_browsing::ClientDownloadRequest_SignatureInfo::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + image_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_ImageHeaders*>( + ::safe_browsing::ClientDownloadRequest_ImageHeaders::internal_default_instance()); +#else + image_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_ImageHeaders*>(&::safe_browsing::ClientDownloadRequest_ImageHeaders::default_instance()); +#endif +} + +ClientIncidentReport_IncidentData_BlacklistLoadIncident::ClientIncidentReport_IncidentData_BlacklistLoadIncident(const ClientIncidentReport_IncidentData_BlacklistLoadIncident& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident) +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + path_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + digest_ = NULL; + version_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + blacklist_initialized_ = false; + signature_ = NULL; + image_headers_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_IncidentData_BlacklistLoadIncident::~ClientIncidentReport_IncidentData_BlacklistLoadIncident() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident) + SharedDtor(); +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::SharedDtor() { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete path_; + } + if (version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete version_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete digest_; + delete signature_; + delete image_headers_; + } +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_IncidentData_BlacklistLoadIncident& ClientIncidentReport_IncidentData_BlacklistLoadIncident::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_IncidentData_BlacklistLoadIncident* ClientIncidentReport_IncidentData_BlacklistLoadIncident::default_instance_ = NULL; + +ClientIncidentReport_IncidentData_BlacklistLoadIncident* ClientIncidentReport_IncidentData_BlacklistLoadIncident::New() const { + return new ClientIncidentReport_IncidentData_BlacklistLoadIncident; +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::Clear() { + if (_has_bits_[0 / 32] & 63) { + if (has_path()) { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_->clear(); + } + } + if (has_digest()) { + if (digest_ != NULL) digest_->::safe_browsing::ClientDownloadRequest_Digests::Clear(); + } + if (has_version()) { + if (version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_->clear(); + } + } + blacklist_initialized_ = false; + if (has_signature()) { + if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); + } + if (has_image_headers()) { + if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_IncidentData_BlacklistLoadIncident::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string path = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_path())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_digest; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.Digests digest = 2; + case 2: { + if (tag == 18) { + parse_digest: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_digest())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_version; + break; + } + + // optional string version = 3; + case 3: { + if (tag == 26) { + parse_version: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_version())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(32)) goto parse_blacklist_initialized; + break; + } + + // optional bool blacklist_initialized = 4; + case 4: { + if (tag == 32) { + parse_blacklist_initialized: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &blacklist_initialized_))); + set_has_blacklist_initialized(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_signature; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + case 5: { + if (tag == 42) { + parse_signature: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_signature())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(50)) goto parse_image_headers; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; + case 6: { + if (tag == 50) { + parse_image_headers: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_image_headers())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident) + return false; +#undef DO_ +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident) + // optional string path = 1; + if (has_path()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->path(), output); + } + + // optional .safe_browsing.ClientDownloadRequest.Digests digest = 2; + if (has_digest()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->digest(), output); + } + + // optional string version = 3; + if (has_version()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 3, this->version(), output); + } + + // optional bool blacklist_initialized = 4; + if (has_blacklist_initialized()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->blacklist_initialized(), output); + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + if (has_signature()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( 5, this->signature(), output); } - - // optional bool user_initiated = 6; - if (has_user_initiated()) { - ::google::protobuf::internal::WireFormatLite::WriteBool(6, this->user_initiated(), output); + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; + if (has_image_headers()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 6, this->image_headers(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident) +} + +int ClientIncidentReport_IncidentData_BlacklistLoadIncident::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string path = 1; + if (has_path()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->path()); + } + + // optional .safe_browsing.ClientDownloadRequest.Digests digest = 2; + if (has_digest()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->digest()); + } + + // optional string version = 3; + if (has_version()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->version()); + } + + // optional bool blacklist_initialized = 4; + if (has_blacklist_initialized()) { + total_size += 1 + 1; + } + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + if (has_signature()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->signature()); + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; + if (has_image_headers()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->image_headers()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::MergeFrom(const ClientIncidentReport_IncidentData_BlacklistLoadIncident& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_path()) { + set_path(from.path()); + } + if (from.has_digest()) { + mutable_digest()->::safe_browsing::ClientDownloadRequest_Digests::MergeFrom(from.digest()); + } + if (from.has_version()) { + set_version(from.version()); + } + if (from.has_blacklist_initialized()) { + set_blacklist_initialized(from.blacklist_initialized()); + } + if (from.has_signature()) { + mutable_signature()->::safe_browsing::ClientDownloadRequest_SignatureInfo::MergeFrom(from.signature()); + } + if (from.has_image_headers()) { + mutable_image_headers()->::safe_browsing::ClientDownloadRequest_ImageHeaders::MergeFrom(from.image_headers()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::CopyFrom(const ClientIncidentReport_IncidentData_BlacklistLoadIncident& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_IncidentData_BlacklistLoadIncident::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_IncidentData_BlacklistLoadIncident::Swap(ClientIncidentReport_IncidentData_BlacklistLoadIncident* other) { + if (other != this) { + std::swap(path_, other->path_); + std::swap(digest_, other->digest_); + std::swap(version_, other->version_); + std::swap(blacklist_initialized_, other->blacklist_initialized_); + std::swap(signature_, other->signature_); + std::swap(image_headers_, other->image_headers_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_IncidentData_BlacklistLoadIncident::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::kVariationsSeedSignatureFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident) +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::InitAsDefaultInstance() { +} + +ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident(const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident) +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + variations_seed_signature_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::~ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident) + SharedDtor(); +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::SharedDtor() { + if (variations_seed_signature_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete variations_seed_signature_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::default_instance_ = NULL; + +ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::New() const { + return new ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident; +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::Clear() { + if (has_variations_seed_signature()) { + if (variations_seed_signature_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + variations_seed_signature_->clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string variations_seed_signature = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_variations_seed_signature())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident) + return false; +#undef DO_ +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident) + // optional string variations_seed_signature = 1; + if (has_variations_seed_signature()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->variations_seed_signature(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident) +} + +int ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string variations_seed_signature = 1; + if (has_variations_seed_signature()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->variations_seed_signature()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::MergeFrom(const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_variations_seed_signature()) { + set_variations_seed_signature(from.variations_seed_signature()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::CopyFrom(const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::Swap(ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* other) { + if (other != this) { + std::swap(variations_seed_signature_, other->variations_seed_signature_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_IncidentData_ScriptRequestIncident::kScriptDigestFieldNumber; +const int ClientIncidentReport_IncidentData_ScriptRequestIncident::kInclusionOriginFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_IncidentData_ScriptRequestIncident::ClientIncidentReport_IncidentData_ScriptRequestIncident() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident) +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::InitAsDefaultInstance() { +} + +ClientIncidentReport_IncidentData_ScriptRequestIncident::ClientIncidentReport_IncidentData_ScriptRequestIncident(const ClientIncidentReport_IncidentData_ScriptRequestIncident& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident) +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + script_digest_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + inclusion_origin_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_IncidentData_ScriptRequestIncident::~ClientIncidentReport_IncidentData_ScriptRequestIncident() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident) + SharedDtor(); +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::SharedDtor() { + if (script_digest_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete script_digest_; + } + if (inclusion_origin_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete inclusion_origin_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_IncidentData_ScriptRequestIncident& ClientIncidentReport_IncidentData_ScriptRequestIncident::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_IncidentData_ScriptRequestIncident* ClientIncidentReport_IncidentData_ScriptRequestIncident::default_instance_ = NULL; + +ClientIncidentReport_IncidentData_ScriptRequestIncident* ClientIncidentReport_IncidentData_ScriptRequestIncident::New() const { + return new ClientIncidentReport_IncidentData_ScriptRequestIncident; +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_script_digest()) { + if (script_digest_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + script_digest_->clear(); + } + } + if (has_inclusion_origin()) { + if (inclusion_origin_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + inclusion_origin_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_IncidentData_ScriptRequestIncident::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string script_digest = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_script_digest())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_inclusion_origin; + break; + } + + // optional string inclusion_origin = 2; + case 2: { + if (tag == 18) { + parse_inclusion_origin: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_inclusion_origin())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident) + return false; +#undef DO_ +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident) + // optional string script_digest = 1; + if (has_script_digest()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->script_digest(), output); + } + + // optional string inclusion_origin = 2; + if (has_inclusion_origin()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->inclusion_origin(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident) +} + +int ClientIncidentReport_IncidentData_ScriptRequestIncident::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string script_digest = 1; + if (has_script_digest()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->script_digest()); + } + + // optional string inclusion_origin = 2; + if (has_inclusion_origin()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->inclusion_origin()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::MergeFrom(const ClientIncidentReport_IncidentData_ScriptRequestIncident& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_script_digest()) { + set_script_digest(from.script_digest()); + } + if (from.has_inclusion_origin()) { + set_inclusion_origin(from.inclusion_origin()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::CopyFrom(const ClientIncidentReport_IncidentData_ScriptRequestIncident& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_IncidentData_ScriptRequestIncident::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_IncidentData_ScriptRequestIncident::Swap(ClientIncidentReport_IncidentData_ScriptRequestIncident* other) { + if (other != this) { + std::swap(script_digest_, other->script_digest_); + std::swap(inclusion_origin_, other->inclusion_origin_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_IncidentData_ScriptRequestIncident::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_IncidentData::kIncidentTimeMsecFieldNumber; +const int ClientIncidentReport_IncidentData::kTrackedPreferenceFieldNumber; +const int ClientIncidentReport_IncidentData::kBinaryIntegrityFieldNumber; +const int ClientIncidentReport_IncidentData::kBlacklistLoadFieldNumber; +const int ClientIncidentReport_IncidentData::kVariationsSeedSignatureFieldNumber; +const int ClientIncidentReport_IncidentData::kScriptRequestFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_IncidentData::ClientIncidentReport_IncidentData() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.IncidentData) +} + +void ClientIncidentReport_IncidentData::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + tracked_preference_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident*>( + ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident::internal_default_instance()); +#else + tracked_preference_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident*>(&::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + binary_integrity_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident*>( + ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident::internal_default_instance()); +#else + binary_integrity_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident*>(&::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + blacklist_load_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident*>( + ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident::internal_default_instance()); +#else + blacklist_load_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident*>(&::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + variations_seed_signature_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident*>( + ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::internal_default_instance()); +#else + variations_seed_signature_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident*>(&::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + script_request_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident*>( + ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident::internal_default_instance()); +#else + script_request_ = const_cast< ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident*>(&::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident::default_instance()); +#endif +} + +ClientIncidentReport_IncidentData::ClientIncidentReport_IncidentData(const ClientIncidentReport_IncidentData& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.IncidentData) +} + +void ClientIncidentReport_IncidentData::SharedCtor() { + _cached_size_ = 0; + incident_time_msec_ = GOOGLE_LONGLONG(0); + tracked_preference_ = NULL; + binary_integrity_ = NULL; + blacklist_load_ = NULL; + variations_seed_signature_ = NULL; + script_request_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_IncidentData::~ClientIncidentReport_IncidentData() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.IncidentData) + SharedDtor(); +} + +void ClientIncidentReport_IncidentData::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete tracked_preference_; + delete binary_integrity_; + delete blacklist_load_; + delete variations_seed_signature_; + delete script_request_; + } +} + +void ClientIncidentReport_IncidentData::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_IncidentData& ClientIncidentReport_IncidentData::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_IncidentData* ClientIncidentReport_IncidentData::default_instance_ = NULL; + +ClientIncidentReport_IncidentData* ClientIncidentReport_IncidentData::New() const { + return new ClientIncidentReport_IncidentData; +} + +void ClientIncidentReport_IncidentData::Clear() { + if (_has_bits_[0 / 32] & 63) { + incident_time_msec_ = GOOGLE_LONGLONG(0); + if (has_tracked_preference()) { + if (tracked_preference_ != NULL) tracked_preference_->::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident::Clear(); + } + if (has_binary_integrity()) { + if (binary_integrity_ != NULL) binary_integrity_->::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident::Clear(); + } + if (has_blacklist_load()) { + if (blacklist_load_ != NULL) blacklist_load_->::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident::Clear(); + } + if (has_variations_seed_signature()) { + if (variations_seed_signature_ != NULL) variations_seed_signature_->::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::Clear(); + } + if (has_script_request()) { + if (script_request_ != NULL) script_request_->::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_IncidentData::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.IncidentData) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional int64 incident_time_msec = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &incident_time_msec_))); + set_has_incident_time_msec(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_tracked_preference; + break; + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident tracked_preference = 2; + case 2: { + if (tag == 18) { + parse_tracked_preference: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_tracked_preference())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_binary_integrity; + break; + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident binary_integrity = 3; + case 3: { + if (tag == 26) { + parse_binary_integrity: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_binary_integrity())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_blacklist_load; + break; + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident blacklist_load = 4; + case 4: { + if (tag == 34) { + parse_blacklist_load: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_blacklist_load())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(50)) goto parse_variations_seed_signature; + break; + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident variations_seed_signature = 6; + case 6: { + if (tag == 50) { + parse_variations_seed_signature: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_variations_seed_signature())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(58)) goto parse_script_request; + break; + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident script_request = 7; + case 7: { + if (tag == 58) { + parse_script_request: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_script_request())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.IncidentData) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.IncidentData) + return false; +#undef DO_ +} + +void ClientIncidentReport_IncidentData::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.IncidentData) + // optional int64 incident_time_msec = 1; + if (has_incident_time_msec()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(1, this->incident_time_msec(), output); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident tracked_preference = 2; + if (has_tracked_preference()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->tracked_preference(), output); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident binary_integrity = 3; + if (has_binary_integrity()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 3, this->binary_integrity(), output); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident blacklist_load = 4; + if (has_blacklist_load()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 4, this->blacklist_load(), output); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident variations_seed_signature = 6; + if (has_variations_seed_signature()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 6, this->variations_seed_signature(), output); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident script_request = 7; + if (has_script_request()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 7, this->script_request(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.IncidentData) +} + +int ClientIncidentReport_IncidentData::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional int64 incident_time_msec = 1; + if (has_incident_time_msec()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->incident_time_msec()); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident tracked_preference = 2; + if (has_tracked_preference()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->tracked_preference()); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident binary_integrity = 3; + if (has_binary_integrity()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->binary_integrity()); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident blacklist_load = 4; + if (has_blacklist_load()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->blacklist_load()); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident variations_seed_signature = 6; + if (has_variations_seed_signature()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->variations_seed_signature()); + } + + // optional .safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident script_request = 7; + if (has_script_request()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->script_request()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_IncidentData::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_IncidentData::MergeFrom(const ClientIncidentReport_IncidentData& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_incident_time_msec()) { + set_incident_time_msec(from.incident_time_msec()); + } + if (from.has_tracked_preference()) { + mutable_tracked_preference()->::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident::MergeFrom(from.tracked_preference()); + } + if (from.has_binary_integrity()) { + mutable_binary_integrity()->::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident::MergeFrom(from.binary_integrity()); + } + if (from.has_blacklist_load()) { + mutable_blacklist_load()->::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident::MergeFrom(from.blacklist_load()); + } + if (from.has_variations_seed_signature()) { + mutable_variations_seed_signature()->::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::MergeFrom(from.variations_seed_signature()); + } + if (from.has_script_request()) { + mutable_script_request()->::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident::MergeFrom(from.script_request()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_IncidentData::CopyFrom(const ClientIncidentReport_IncidentData& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_IncidentData::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_IncidentData::Swap(ClientIncidentReport_IncidentData* other) { + if (other != this) { + std::swap(incident_time_msec_, other->incident_time_msec_); + std::swap(tracked_preference_, other->tracked_preference_); + std::swap(binary_integrity_, other->binary_integrity_); + std::swap(blacklist_load_, other->blacklist_load_); + std::swap(variations_seed_signature_, other->variations_seed_signature_); + std::swap(script_request_, other->script_request_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_IncidentData::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.IncidentData"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_DownloadDetails::kTokenFieldNumber; +const int ClientIncidentReport_DownloadDetails::kDownloadFieldNumber; +const int ClientIncidentReport_DownloadDetails::kDownloadTimeMsecFieldNumber; +const int ClientIncidentReport_DownloadDetails::kOpenTimeMsecFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_DownloadDetails::ClientIncidentReport_DownloadDetails() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.DownloadDetails) +} + +void ClientIncidentReport_DownloadDetails::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + download_ = const_cast< ::safe_browsing::ClientDownloadRequest*>( + ::safe_browsing::ClientDownloadRequest::internal_default_instance()); +#else + download_ = const_cast< ::safe_browsing::ClientDownloadRequest*>(&::safe_browsing::ClientDownloadRequest::default_instance()); +#endif +} + +ClientIncidentReport_DownloadDetails::ClientIncidentReport_DownloadDetails(const ClientIncidentReport_DownloadDetails& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.DownloadDetails) +} + +void ClientIncidentReport_DownloadDetails::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + token_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + download_ = NULL; + download_time_msec_ = GOOGLE_LONGLONG(0); + open_time_msec_ = GOOGLE_LONGLONG(0); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_DownloadDetails::~ClientIncidentReport_DownloadDetails() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.DownloadDetails) + SharedDtor(); +} + +void ClientIncidentReport_DownloadDetails::SharedDtor() { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete token_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete download_; + } +} + +void ClientIncidentReport_DownloadDetails::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_DownloadDetails& ClientIncidentReport_DownloadDetails::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_DownloadDetails* ClientIncidentReport_DownloadDetails::default_instance_ = NULL; + +ClientIncidentReport_DownloadDetails* ClientIncidentReport_DownloadDetails::New() const { + return new ClientIncidentReport_DownloadDetails; +} + +void ClientIncidentReport_DownloadDetails::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + if (_has_bits_[0 / 32] & 15) { + ZR_(download_time_msec_, open_time_msec_); + if (has_token()) { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_->clear(); + } + } + if (has_download()) { + if (download_ != NULL) download_->::safe_browsing::ClientDownloadRequest::Clear(); + } + } + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_DownloadDetails::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.DownloadDetails) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bytes token = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_token())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_download; + break; + } + + // optional .safe_browsing.ClientDownloadRequest download = 2; + case 2: { + if (tag == 18) { + parse_download: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_download())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_download_time_msec; + break; + } + + // optional int64 download_time_msec = 3; + case 3: { + if (tag == 24) { + parse_download_time_msec: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &download_time_msec_))); + set_has_download_time_msec(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(32)) goto parse_open_time_msec; + break; + } + + // optional int64 open_time_msec = 4; + case 4: { + if (tag == 32) { + parse_open_time_msec: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &open_time_msec_))); + set_has_open_time_msec(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.DownloadDetails) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.DownloadDetails) + return false; +#undef DO_ +} + +void ClientIncidentReport_DownloadDetails::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.DownloadDetails) + // optional bytes token = 1; + if (has_token()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 1, this->token(), output); + } + + // optional .safe_browsing.ClientDownloadRequest download = 2; + if (has_download()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->download(), output); + } + + // optional int64 download_time_msec = 3; + if (has_download_time_msec()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(3, this->download_time_msec(), output); + } + + // optional int64 open_time_msec = 4; + if (has_open_time_msec()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(4, this->open_time_msec(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.DownloadDetails) +} + +int ClientIncidentReport_DownloadDetails::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bytes token = 1; + if (has_token()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->token()); + } + + // optional .safe_browsing.ClientDownloadRequest download = 2; + if (has_download()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->download()); + } + + // optional int64 download_time_msec = 3; + if (has_download_time_msec()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->download_time_msec()); + } + + // optional int64 open_time_msec = 4; + if (has_open_time_msec()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->open_time_msec()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_DownloadDetails::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_DownloadDetails::MergeFrom(const ClientIncidentReport_DownloadDetails& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_token()) { + set_token(from.token()); + } + if (from.has_download()) { + mutable_download()->::safe_browsing::ClientDownloadRequest::MergeFrom(from.download()); + } + if (from.has_download_time_msec()) { + set_download_time_msec(from.download_time_msec()); + } + if (from.has_open_time_msec()) { + set_open_time_msec(from.open_time_msec()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_DownloadDetails::CopyFrom(const ClientIncidentReport_DownloadDetails& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_DownloadDetails::IsInitialized() const { + + if (has_download()) { + if (!this->download().IsInitialized()) return false; + } + return true; +} + +void ClientIncidentReport_DownloadDetails::Swap(ClientIncidentReport_DownloadDetails* other) { + if (other != this) { + std::swap(token_, other->token_); + std::swap(download_, other->download_); + std::swap(download_time_msec_, other->download_time_msec_); + std::swap(open_time_msec_, other->open_time_msec_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_DownloadDetails::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.DownloadDetails"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_EnvironmentData_OS::kOsNameFieldNumber; +const int ClientIncidentReport_EnvironmentData_OS::kOsVersionFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_EnvironmentData_OS::ClientIncidentReport_EnvironmentData_OS() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.EnvironmentData.OS) +} + +void ClientIncidentReport_EnvironmentData_OS::InitAsDefaultInstance() { +} + +ClientIncidentReport_EnvironmentData_OS::ClientIncidentReport_EnvironmentData_OS(const ClientIncidentReport_EnvironmentData_OS& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.EnvironmentData.OS) +} + +void ClientIncidentReport_EnvironmentData_OS::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + os_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + os_version_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_EnvironmentData_OS::~ClientIncidentReport_EnvironmentData_OS() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.EnvironmentData.OS) + SharedDtor(); +} + +void ClientIncidentReport_EnvironmentData_OS::SharedDtor() { + if (os_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete os_name_; + } + if (os_version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete os_version_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentReport_EnvironmentData_OS::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_EnvironmentData_OS& ClientIncidentReport_EnvironmentData_OS::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_EnvironmentData_OS* ClientIncidentReport_EnvironmentData_OS::default_instance_ = NULL; + +ClientIncidentReport_EnvironmentData_OS* ClientIncidentReport_EnvironmentData_OS::New() const { + return new ClientIncidentReport_EnvironmentData_OS; +} + +void ClientIncidentReport_EnvironmentData_OS::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_os_name()) { + if (os_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_name_->clear(); + } + } + if (has_os_version()) { + if (os_version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_version_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_EnvironmentData_OS::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.EnvironmentData.OS) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string os_name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_os_name())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_os_version; + break; + } + + // optional string os_version = 2; + case 2: { + if (tag == 18) { + parse_os_version: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_os_version())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.EnvironmentData.OS) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.EnvironmentData.OS) + return false; +#undef DO_ +} + +void ClientIncidentReport_EnvironmentData_OS::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.EnvironmentData.OS) + // optional string os_name = 1; + if (has_os_name()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->os_name(), output); + } + + // optional string os_version = 2; + if (has_os_version()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->os_version(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.EnvironmentData.OS) +} + +int ClientIncidentReport_EnvironmentData_OS::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string os_name = 1; + if (has_os_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->os_name()); + } + + // optional string os_version = 2; + if (has_os_version()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->os_version()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_EnvironmentData_OS::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_EnvironmentData_OS::MergeFrom(const ClientIncidentReport_EnvironmentData_OS& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_os_name()) { + set_os_name(from.os_name()); + } + if (from.has_os_version()) { + set_os_version(from.os_version()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_EnvironmentData_OS::CopyFrom(const ClientIncidentReport_EnvironmentData_OS& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_EnvironmentData_OS::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_EnvironmentData_OS::Swap(ClientIncidentReport_EnvironmentData_OS* other) { + if (other != this) { + std::swap(os_name_, other->os_name_); + std::swap(os_version_, other->os_version_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_EnvironmentData_OS::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.EnvironmentData.OS"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_EnvironmentData_Machine::kCpuArchitectureFieldNumber; +const int ClientIncidentReport_EnvironmentData_Machine::kCpuVendorFieldNumber; +const int ClientIncidentReport_EnvironmentData_Machine::kCpuidFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_EnvironmentData_Machine::ClientIncidentReport_EnvironmentData_Machine() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Machine) +} + +void ClientIncidentReport_EnvironmentData_Machine::InitAsDefaultInstance() { +} + +ClientIncidentReport_EnvironmentData_Machine::ClientIncidentReport_EnvironmentData_Machine(const ClientIncidentReport_EnvironmentData_Machine& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Machine) +} + +void ClientIncidentReport_EnvironmentData_Machine::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + cpu_architecture_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + cpu_vendor_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + cpuid_ = 0u; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_EnvironmentData_Machine::~ClientIncidentReport_EnvironmentData_Machine() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.EnvironmentData.Machine) + SharedDtor(); +} + +void ClientIncidentReport_EnvironmentData_Machine::SharedDtor() { + if (cpu_architecture_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete cpu_architecture_; + } + if (cpu_vendor_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete cpu_vendor_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentReport_EnvironmentData_Machine::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_EnvironmentData_Machine& ClientIncidentReport_EnvironmentData_Machine::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_EnvironmentData_Machine* ClientIncidentReport_EnvironmentData_Machine::default_instance_ = NULL; + +ClientIncidentReport_EnvironmentData_Machine* ClientIncidentReport_EnvironmentData_Machine::New() const { + return new ClientIncidentReport_EnvironmentData_Machine; +} + +void ClientIncidentReport_EnvironmentData_Machine::Clear() { + if (_has_bits_[0 / 32] & 7) { + if (has_cpu_architecture()) { + if (cpu_architecture_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_architecture_->clear(); + } + } + if (has_cpu_vendor()) { + if (cpu_vendor_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_vendor_->clear(); + } + } + cpuid_ = 0u; + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_EnvironmentData_Machine::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.EnvironmentData.Machine) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string cpu_architecture = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_cpu_architecture())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_cpu_vendor; + break; + } + + // optional string cpu_vendor = 2; + case 2: { + if (tag == 18) { + parse_cpu_vendor: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_cpu_vendor())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_cpuid; + break; + } + + // optional uint32 cpuid = 3; + case 3: { + if (tag == 24) { + parse_cpuid: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, &cpuid_))); + set_has_cpuid(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.EnvironmentData.Machine) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.EnvironmentData.Machine) + return false; +#undef DO_ +} + +void ClientIncidentReport_EnvironmentData_Machine::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.EnvironmentData.Machine) + // optional string cpu_architecture = 1; + if (has_cpu_architecture()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->cpu_architecture(), output); + } + + // optional string cpu_vendor = 2; + if (has_cpu_vendor()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->cpu_vendor(), output); + } + + // optional uint32 cpuid = 3; + if (has_cpuid()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32(3, this->cpuid(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.EnvironmentData.Machine) +} + +int ClientIncidentReport_EnvironmentData_Machine::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string cpu_architecture = 1; + if (has_cpu_architecture()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->cpu_architecture()); + } + + // optional string cpu_vendor = 2; + if (has_cpu_vendor()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->cpu_vendor()); + } + + // optional uint32 cpuid = 3; + if (has_cpuid()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt32Size( + this->cpuid()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_EnvironmentData_Machine::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_EnvironmentData_Machine::MergeFrom(const ClientIncidentReport_EnvironmentData_Machine& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_cpu_architecture()) { + set_cpu_architecture(from.cpu_architecture()); + } + if (from.has_cpu_vendor()) { + set_cpu_vendor(from.cpu_vendor()); + } + if (from.has_cpuid()) { + set_cpuid(from.cpuid()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_EnvironmentData_Machine::CopyFrom(const ClientIncidentReport_EnvironmentData_Machine& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_EnvironmentData_Machine::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_EnvironmentData_Machine::Swap(ClientIncidentReport_EnvironmentData_Machine* other) { + if (other != this) { + std::swap(cpu_architecture_, other->cpu_architecture_); + std::swap(cpu_vendor_, other->cpu_vendor_); + std::swap(cpuid_, other->cpuid_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_EnvironmentData_Machine::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.EnvironmentData.Machine"; +} + + +// ------------------------------------------------------------------- + +bool ClientIncidentReport_EnvironmentData_Process_Channel_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + case 3: + case 4: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process::CHANNEL_UNKNOWN; +const ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process::CHANNEL_CANARY; +const ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process::CHANNEL_DEV; +const ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process::CHANNEL_BETA; +const ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process::CHANNEL_STABLE; +const ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process::Channel_MIN; +const ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process::Channel_MAX; +const int ClientIncidentReport_EnvironmentData_Process::Channel_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int ClientIncidentReport_EnvironmentData_Process_Patch::kFunctionFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process_Patch::kTargetDllFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_EnvironmentData_Process_Patch::ClientIncidentReport_EnvironmentData_Process_Patch() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch) +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::InitAsDefaultInstance() { +} + +ClientIncidentReport_EnvironmentData_Process_Patch::ClientIncidentReport_EnvironmentData_Process_Patch(const ClientIncidentReport_EnvironmentData_Process_Patch& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch) +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + function_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + target_dll_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_EnvironmentData_Process_Patch::~ClientIncidentReport_EnvironmentData_Process_Patch() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch) + SharedDtor(); +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::SharedDtor() { + if (function_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete function_; + } + if (target_dll_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete target_dll_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_EnvironmentData_Process_Patch& ClientIncidentReport_EnvironmentData_Process_Patch::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_EnvironmentData_Process_Patch* ClientIncidentReport_EnvironmentData_Process_Patch::default_instance_ = NULL; + +ClientIncidentReport_EnvironmentData_Process_Patch* ClientIncidentReport_EnvironmentData_Process_Patch::New() const { + return new ClientIncidentReport_EnvironmentData_Process_Patch; +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_function()) { + if (function_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + function_->clear(); + } + } + if (has_target_dll()) { + if (target_dll_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + target_dll_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_EnvironmentData_Process_Patch::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string function = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_function())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_target_dll; + break; + } + + // optional string target_dll = 2; + case 2: { + if (tag == 18) { + parse_target_dll: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_target_dll())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch) + return false; +#undef DO_ +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch) + // optional string function = 1; + if (has_function()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->function(), output); + } + + // optional string target_dll = 2; + if (has_target_dll()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->target_dll(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch) +} + +int ClientIncidentReport_EnvironmentData_Process_Patch::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string function = 1; + if (has_function()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->function()); + } + + // optional string target_dll = 2; + if (has_target_dll()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->target_dll()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::MergeFrom(const ClientIncidentReport_EnvironmentData_Process_Patch& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_function()) { + set_function(from.function()); + } + if (from.has_target_dll()) { + set_target_dll(from.target_dll()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::CopyFrom(const ClientIncidentReport_EnvironmentData_Process_Patch& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_EnvironmentData_Process_Patch::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_EnvironmentData_Process_Patch::Swap(ClientIncidentReport_EnvironmentData_Process_Patch* other) { + if (other != this) { + std::swap(function_, other->function_); + std::swap(target_dll_, other->target_dll_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_EnvironmentData_Process_Patch::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +#endif // !_MSC_VER + +ClientIncidentReport_EnvironmentData_Process_NetworkProvider::ClientIncidentReport_EnvironmentData_Process_NetworkProvider() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider) +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::InitAsDefaultInstance() { +} + +ClientIncidentReport_EnvironmentData_Process_NetworkProvider::ClientIncidentReport_EnvironmentData_Process_NetworkProvider(const ClientIncidentReport_EnvironmentData_Process_NetworkProvider& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider) +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_EnvironmentData_Process_NetworkProvider::~ClientIncidentReport_EnvironmentData_Process_NetworkProvider() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider) + SharedDtor(); +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_EnvironmentData_Process_NetworkProvider& ClientIncidentReport_EnvironmentData_Process_NetworkProvider::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_EnvironmentData_Process_NetworkProvider* ClientIncidentReport_EnvironmentData_Process_NetworkProvider::default_instance_ = NULL; + +ClientIncidentReport_EnvironmentData_Process_NetworkProvider* ClientIncidentReport_EnvironmentData_Process_NetworkProvider::New() const { + return new ClientIncidentReport_EnvironmentData_Process_NetworkProvider; +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::Clear() { + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_EnvironmentData_Process_NetworkProvider::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider) + return false; +#undef DO_ +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider) + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider) +} + +int ClientIncidentReport_EnvironmentData_Process_NetworkProvider::ByteSize() const { + int total_size = 0; + + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::MergeFrom(const ClientIncidentReport_EnvironmentData_Process_NetworkProvider& from) { + GOOGLE_CHECK_NE(&from, this); + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::CopyFrom(const ClientIncidentReport_EnvironmentData_Process_NetworkProvider& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_EnvironmentData_Process_NetworkProvider::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_EnvironmentData_Process_NetworkProvider::Swap(ClientIncidentReport_EnvironmentData_Process_NetworkProvider* other) { + if (other != this) { + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_EnvironmentData_Process_NetworkProvider::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider"; +} + + +// ------------------------------------------------------------------- + +bool ClientIncidentReport_EnvironmentData_Process_Dll_Feature_IsValid(int value) { + switch(value) { + case 0: + case 1: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const ClientIncidentReport_EnvironmentData_Process_Dll_Feature ClientIncidentReport_EnvironmentData_Process_Dll::UNKNOWN; +const ClientIncidentReport_EnvironmentData_Process_Dll_Feature ClientIncidentReport_EnvironmentData_Process_Dll::LSP; +const ClientIncidentReport_EnvironmentData_Process_Dll_Feature ClientIncidentReport_EnvironmentData_Process_Dll::Feature_MIN; +const ClientIncidentReport_EnvironmentData_Process_Dll_Feature ClientIncidentReport_EnvironmentData_Process_Dll::Feature_MAX; +const int ClientIncidentReport_EnvironmentData_Process_Dll::Feature_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int ClientIncidentReport_EnvironmentData_Process_Dll::kPathFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process_Dll::kBaseAddressFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process_Dll::kLengthFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process_Dll::kFeatureFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process_Dll::kImageHeadersFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_EnvironmentData_Process_Dll::ClientIncidentReport_EnvironmentData_Process_Dll() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll) +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + image_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_ImageHeaders*>( + ::safe_browsing::ClientDownloadRequest_ImageHeaders::internal_default_instance()); +#else + image_headers_ = const_cast< ::safe_browsing::ClientDownloadRequest_ImageHeaders*>(&::safe_browsing::ClientDownloadRequest_ImageHeaders::default_instance()); +#endif +} + +ClientIncidentReport_EnvironmentData_Process_Dll::ClientIncidentReport_EnvironmentData_Process_Dll(const ClientIncidentReport_EnvironmentData_Process_Dll& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll) +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + path_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + base_address_ = GOOGLE_ULONGLONG(0); + length_ = 0u; + image_headers_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_EnvironmentData_Process_Dll::~ClientIncidentReport_EnvironmentData_Process_Dll() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll) + SharedDtor(); +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::SharedDtor() { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete path_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete image_headers_; + } +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_EnvironmentData_Process_Dll& ClientIncidentReport_EnvironmentData_Process_Dll::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_EnvironmentData_Process_Dll* ClientIncidentReport_EnvironmentData_Process_Dll::default_instance_ = NULL; + +ClientIncidentReport_EnvironmentData_Process_Dll* ClientIncidentReport_EnvironmentData_Process_Dll::New() const { + return new ClientIncidentReport_EnvironmentData_Process_Dll; +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::Clear() { + if (_has_bits_[0 / 32] & 23) { + if (has_path()) { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_->clear(); + } + } + base_address_ = GOOGLE_ULONGLONG(0); + length_ = 0u; + if (has_image_headers()) { + if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); + } + } + feature_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_EnvironmentData_Process_Dll::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string path = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_path())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(16)) goto parse_base_address; + break; + } + + // optional uint64 base_address = 2; + case 2: { + if (tag == 16) { + parse_base_address: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &base_address_))); + set_has_base_address(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_length; + break; + } + + // optional uint32 length = 3; + case 3: { + if (tag == 24) { + parse_length: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, &length_))); + set_has_length(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(32)) goto parse_feature; + break; + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.Feature feature = 4; + case 4: { + if (tag == 32) { + parse_feature: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature_IsValid(value)) { + add_feature(static_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else if (tag == 34) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedEnumNoInline( + input, + &::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature_IsValid, + this->mutable_feature()))); + } else { + goto handle_unusual; + } + if (input->ExpectTag(32)) goto parse_feature; + if (input->ExpectTag(42)) goto parse_image_headers; + break; + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 5; + case 5: { + if (tag == 42) { + parse_image_headers: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_image_headers())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll) + return false; +#undef DO_ +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll) + // optional string path = 1; + if (has_path()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->path(), output); + } + + // optional uint64 base_address = 2; + if (has_base_address()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(2, this->base_address(), output); + } + + // optional uint32 length = 3; + if (has_length()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32(3, this->length(), output); + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.Feature feature = 4; + for (int i = 0; i < this->feature_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 4, this->feature(i), output); + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 5; + if (has_image_headers()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 5, this->image_headers(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll) +} + +int ClientIncidentReport_EnvironmentData_Process_Dll::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string path = 1; + if (has_path()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->path()); + } + + // optional uint64 base_address = 2; + if (has_base_address()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->base_address()); + } + + // optional uint32 length = 3; + if (has_length()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt32Size( + this->length()); + } + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 5; + if (has_image_headers()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->image_headers()); + } + + } + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.Feature feature = 4; + { + int data_size = 0; + for (int i = 0; i < this->feature_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite::EnumSize( + this->feature(i)); + } + total_size += 1 * this->feature_size() + data_size; + } + + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::MergeFrom(const ClientIncidentReport_EnvironmentData_Process_Dll& from) { + GOOGLE_CHECK_NE(&from, this); + feature_.MergeFrom(from.feature_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_path()) { + set_path(from.path()); + } + if (from.has_base_address()) { + set_base_address(from.base_address()); + } + if (from.has_length()) { + set_length(from.length()); + } + if (from.has_image_headers()) { + mutable_image_headers()->::safe_browsing::ClientDownloadRequest_ImageHeaders::MergeFrom(from.image_headers()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::CopyFrom(const ClientIncidentReport_EnvironmentData_Process_Dll& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_EnvironmentData_Process_Dll::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_EnvironmentData_Process_Dll::Swap(ClientIncidentReport_EnvironmentData_Process_Dll* other) { + if (other != this) { + std::swap(path_, other->path_); + std::swap(base_address_, other->base_address_); + std::swap(length_, other->length_); + feature_.Swap(&other->feature_); + std::swap(image_headers_, other->image_headers_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_EnvironmentData_Process_Dll::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll"; +} + + +// ------------------------------------------------------------------- + +bool ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + case 3: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ClientIncidentReport_EnvironmentData_Process_ModuleState::UNKNOWN; +const ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ClientIncidentReport_EnvironmentData_Process_ModuleState::MODULE_STATE_UNKNOWN; +const ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ClientIncidentReport_EnvironmentData_Process_ModuleState::MODULE_STATE_UNMODIFIED; +const ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ClientIncidentReport_EnvironmentData_Process_ModuleState::MODULE_STATE_MODIFIED; +const ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ClientIncidentReport_EnvironmentData_Process_ModuleState::ModifiedState_MIN; +const ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ClientIncidentReport_EnvironmentData_Process_ModuleState::ModifiedState_MAX; +const int ClientIncidentReport_EnvironmentData_Process_ModuleState::ModifiedState_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int ClientIncidentReport_EnvironmentData_Process_ModuleState::kNameFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process_ModuleState::kModifiedStateFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process_ModuleState::kModifiedExportFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_EnvironmentData_Process_ModuleState::ClientIncidentReport_EnvironmentData_Process_ModuleState() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState) +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::InitAsDefaultInstance() { +} + +ClientIncidentReport_EnvironmentData_Process_ModuleState::ClientIncidentReport_EnvironmentData_Process_ModuleState(const ClientIncidentReport_EnvironmentData_Process_ModuleState& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState) +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + modified_state_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_EnvironmentData_Process_ModuleState::~ClientIncidentReport_EnvironmentData_Process_ModuleState() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState) + SharedDtor(); +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_EnvironmentData_Process_ModuleState& ClientIncidentReport_EnvironmentData_Process_ModuleState::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_EnvironmentData_Process_ModuleState* ClientIncidentReport_EnvironmentData_Process_ModuleState::default_instance_ = NULL; + +ClientIncidentReport_EnvironmentData_Process_ModuleState* ClientIncidentReport_EnvironmentData_Process_ModuleState::New() const { + return new ClientIncidentReport_EnvironmentData_Process_ModuleState; +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + modified_state_ = 0; + } + modified_export_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_EnvironmentData_Process_ModuleState::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(16)) goto parse_modified_state; + break; + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.ModifiedState modified_state = 2; + case 2: { + if (tag == 16) { + parse_modified_state: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_IsValid(value)) { + set_modified_state(static_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_modified_export; + break; + } + + // repeated string modified_export = 3; + case 3: { + if (tag == 26) { + parse_modified_export: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_modified_export())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_modified_export; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState) + return false; +#undef DO_ +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.ModifiedState modified_state = 2; + if (has_modified_state()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 2, this->modified_state(), output); + } + + // repeated string modified_export = 3; + for (int i = 0; i < this->modified_export_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->modified_export(i), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState) +} + +int ClientIncidentReport_EnvironmentData_Process_ModuleState::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.ModifiedState modified_state = 2; + if (has_modified_state()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->modified_state()); + } + + } + // repeated string modified_export = 3; + total_size += 1 * this->modified_export_size(); + for (int i = 0; i < this->modified_export_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->modified_export(i)); + } + + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::MergeFrom(const ClientIncidentReport_EnvironmentData_Process_ModuleState& from) { + GOOGLE_CHECK_NE(&from, this); + modified_export_.MergeFrom(from.modified_export_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_modified_state()) { + set_modified_state(from.modified_state()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::CopyFrom(const ClientIncidentReport_EnvironmentData_Process_ModuleState& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_EnvironmentData_Process_ModuleState::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_EnvironmentData_Process_ModuleState::Swap(ClientIncidentReport_EnvironmentData_Process_ModuleState* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(modified_state_, other->modified_state_); + modified_export_.Swap(&other->modified_export_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_EnvironmentData_Process_ModuleState::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_EnvironmentData_Process::kVersionFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kOBSOLETEDllsFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kPatchesFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kNetworkProvidersFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kChromeUpdateChannelFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kUptimeMsecFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kMetricsConsentFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kExtendedConsentFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kDllFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kBlacklistedDllFieldNumber; +const int ClientIncidentReport_EnvironmentData_Process::kModuleStateFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_EnvironmentData_Process::ClientIncidentReport_EnvironmentData_Process() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process) +} + +void ClientIncidentReport_EnvironmentData_Process::InitAsDefaultInstance() { +} + +ClientIncidentReport_EnvironmentData_Process::ClientIncidentReport_EnvironmentData_Process(const ClientIncidentReport_EnvironmentData_Process& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process) +} + +void ClientIncidentReport_EnvironmentData_Process::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + version_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + chrome_update_channel_ = 0; + uptime_msec_ = GOOGLE_LONGLONG(0); + metrics_consent_ = false; + extended_consent_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_EnvironmentData_Process::~ClientIncidentReport_EnvironmentData_Process() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.EnvironmentData.Process) + SharedDtor(); +} + +void ClientIncidentReport_EnvironmentData_Process::SharedDtor() { + if (version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete version_; + } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentReport_EnvironmentData_Process::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_EnvironmentData_Process& ClientIncidentReport_EnvironmentData_Process::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_EnvironmentData_Process* ClientIncidentReport_EnvironmentData_Process::default_instance_ = NULL; + +ClientIncidentReport_EnvironmentData_Process* ClientIncidentReport_EnvironmentData_Process::New() const { + return new ClientIncidentReport_EnvironmentData_Process; +} + +void ClientIncidentReport_EnvironmentData_Process::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + if (_has_bits_[0 / 32] & 241) { + ZR_(uptime_msec_, extended_consent_); + if (has_version()) { + if (version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_->clear(); + } + } + } + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + obsolete_dlls_.Clear(); + patches_.Clear(); + network_providers_.Clear(); + dll_.Clear(); + blacklisted_dll_.Clear(); + module_state_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_EnvironmentData_Process::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string version = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_version())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_OBSOLETE_dlls; + break; + } + + // repeated string OBSOLETE_dlls = 2; + case 2: { + if (tag == 18) { + parse_OBSOLETE_dlls: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_obsolete_dlls())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_OBSOLETE_dlls; + if (input->ExpectTag(26)) goto parse_patches; + break; + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch patches = 3; + case 3: { + if (tag == 26) { + parse_patches: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_patches())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_patches; + if (input->ExpectTag(34)) goto parse_network_providers; + break; + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider network_providers = 4; + case 4: { + if (tag == 34) { + parse_network_providers: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_network_providers())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_network_providers; + if (input->ExpectTag(40)) goto parse_chrome_update_channel; + break; + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Channel chrome_update_channel = 5; + case 5: { + if (tag == 40) { + parse_chrome_update_channel: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Channel_IsValid(value)) { + set_chrome_update_channel(static_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Channel >(value)); + } else { + unknown_fields_stream.WriteVarint32(tag); + unknown_fields_stream.WriteVarint32(value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(48)) goto parse_uptime_msec; + break; + } + + // optional int64 uptime_msec = 6; + case 6: { + if (tag == 48) { + parse_uptime_msec: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &uptime_msec_))); + set_has_uptime_msec(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(56)) goto parse_metrics_consent; + break; + } + + // optional bool metrics_consent = 7; + case 7: { + if (tag == 56) { + parse_metrics_consent: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &metrics_consent_))); + set_has_metrics_consent(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(64)) goto parse_extended_consent; + break; + } + + // optional bool extended_consent = 8; + case 8: { + if (tag == 64) { + parse_extended_consent: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &extended_consent_))); + set_has_extended_consent(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(74)) goto parse_dll; + break; + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll dll = 9; + case 9: { + if (tag == 74) { + parse_dll: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_dll())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(74)) goto parse_dll; + if (input->ExpectTag(82)) goto parse_blacklisted_dll; + break; + } + + // repeated string blacklisted_dll = 10; + case 10: { + if (tag == 82) { + parse_blacklisted_dll: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_blacklisted_dll())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(82)) goto parse_blacklisted_dll; + if (input->ExpectTag(90)) goto parse_module_state; + break; + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState module_state = 11; + case 11: { + if (tag == 90) { + parse_module_state: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_module_state())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(90)) goto parse_module_state; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.EnvironmentData.Process) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.EnvironmentData.Process) + return false; +#undef DO_ +} + +void ClientIncidentReport_EnvironmentData_Process::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.EnvironmentData.Process) + // optional string version = 1; + if (has_version()) { + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->version(), output); + } + + // repeated string OBSOLETE_dlls = 2; + for (int i = 0; i < this->obsolete_dlls_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->obsolete_dlls(i), output); + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch patches = 3; + for (int i = 0; i < this->patches_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 3, this->patches(i), output); + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider network_providers = 4; + for (int i = 0; i < this->network_providers_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 4, this->network_providers(i), output); + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Channel chrome_update_channel = 5; + if (has_chrome_update_channel()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 5, this->chrome_update_channel(), output); + } + + // optional int64 uptime_msec = 6; + if (has_uptime_msec()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(6, this->uptime_msec(), output); + } + + // optional bool metrics_consent = 7; + if (has_metrics_consent()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(7, this->metrics_consent(), output); + } + + // optional bool extended_consent = 8; + if (has_extended_consent()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(8, this->extended_consent(), output); + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll dll = 9; + for (int i = 0; i < this->dll_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 9, this->dll(i), output); + } + + // repeated string blacklisted_dll = 10; + for (int i = 0; i < this->blacklisted_dll_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteString( + 10, this->blacklisted_dll(i), output); + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState module_state = 11; + for (int i = 0; i < this->module_state_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 11, this->module_state(i), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.EnvironmentData.Process) +} + +int ClientIncidentReport_EnvironmentData_Process::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string version = 1; + if (has_version()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->version()); + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Channel chrome_update_channel = 5; + if (has_chrome_update_channel()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->chrome_update_channel()); + } + + // optional int64 uptime_msec = 6; + if (has_uptime_msec()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->uptime_msec()); + } + + // optional bool metrics_consent = 7; + if (has_metrics_consent()) { + total_size += 1 + 1; + } + + // optional bool extended_consent = 8; + if (has_extended_consent()) { + total_size += 1 + 1; + } + + } + // repeated string OBSOLETE_dlls = 2; + total_size += 1 * this->obsolete_dlls_size(); + for (int i = 0; i < this->obsolete_dlls_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->obsolete_dlls(i)); + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch patches = 3; + total_size += 1 * this->patches_size(); + for (int i = 0; i < this->patches_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->patches(i)); + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider network_providers = 4; + total_size += 1 * this->network_providers_size(); + for (int i = 0; i < this->network_providers_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->network_providers(i)); + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll dll = 9; + total_size += 1 * this->dll_size(); + for (int i = 0; i < this->dll_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->dll(i)); + } + + // repeated string blacklisted_dll = 10; + total_size += 1 * this->blacklisted_dll_size(); + for (int i = 0; i < this->blacklisted_dll_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->blacklisted_dll(i)); + } + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState module_state = 11; + total_size += 1 * this->module_state_size(); + for (int i = 0; i < this->module_state_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->module_state(i)); + } + + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_EnvironmentData_Process::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_EnvironmentData_Process::MergeFrom(const ClientIncidentReport_EnvironmentData_Process& from) { + GOOGLE_CHECK_NE(&from, this); + obsolete_dlls_.MergeFrom(from.obsolete_dlls_); + patches_.MergeFrom(from.patches_); + network_providers_.MergeFrom(from.network_providers_); + dll_.MergeFrom(from.dll_); + blacklisted_dll_.MergeFrom(from.blacklisted_dll_); + module_state_.MergeFrom(from.module_state_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_version()) { + set_version(from.version()); + } + if (from.has_chrome_update_channel()) { + set_chrome_update_channel(from.chrome_update_channel()); + } + if (from.has_uptime_msec()) { + set_uptime_msec(from.uptime_msec()); + } + if (from.has_metrics_consent()) { + set_metrics_consent(from.metrics_consent()); + } + if (from.has_extended_consent()) { + set_extended_consent(from.extended_consent()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_EnvironmentData_Process::CopyFrom(const ClientIncidentReport_EnvironmentData_Process& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_EnvironmentData_Process::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_EnvironmentData_Process::Swap(ClientIncidentReport_EnvironmentData_Process* other) { + if (other != this) { + std::swap(version_, other->version_); + obsolete_dlls_.Swap(&other->obsolete_dlls_); + patches_.Swap(&other->patches_); + network_providers_.Swap(&other->network_providers_); + std::swap(chrome_update_channel_, other->chrome_update_channel_); + std::swap(uptime_msec_, other->uptime_msec_); + std::swap(metrics_consent_, other->metrics_consent_); + std::swap(extended_consent_, other->extended_consent_); + dll_.Swap(&other->dll_); + blacklisted_dll_.Swap(&other->blacklisted_dll_); + module_state_.Swap(&other->module_state_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_EnvironmentData_Process::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.EnvironmentData.Process"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport_EnvironmentData::kOsFieldNumber; +const int ClientIncidentReport_EnvironmentData::kMachineFieldNumber; +const int ClientIncidentReport_EnvironmentData::kProcessFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport_EnvironmentData::ClientIncidentReport_EnvironmentData() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport.EnvironmentData) +} + +void ClientIncidentReport_EnvironmentData::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + os_ = const_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_OS*>( + ::safe_browsing::ClientIncidentReport_EnvironmentData_OS::internal_default_instance()); +#else + os_ = const_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_OS*>(&::safe_browsing::ClientIncidentReport_EnvironmentData_OS::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + machine_ = const_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine*>( + ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine::internal_default_instance()); +#else + machine_ = const_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine*>(&::safe_browsing::ClientIncidentReport_EnvironmentData_Machine::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + process_ = const_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process*>( + ::safe_browsing::ClientIncidentReport_EnvironmentData_Process::internal_default_instance()); +#else + process_ = const_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process*>(&::safe_browsing::ClientIncidentReport_EnvironmentData_Process::default_instance()); +#endif +} + +ClientIncidentReport_EnvironmentData::ClientIncidentReport_EnvironmentData(const ClientIncidentReport_EnvironmentData& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport.EnvironmentData) +} + +void ClientIncidentReport_EnvironmentData::SharedCtor() { + _cached_size_ = 0; + os_ = NULL; + machine_ = NULL; + process_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport_EnvironmentData::~ClientIncidentReport_EnvironmentData() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport.EnvironmentData) + SharedDtor(); +} + +void ClientIncidentReport_EnvironmentData::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete os_; + delete machine_; + delete process_; + } +} + +void ClientIncidentReport_EnvironmentData::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport_EnvironmentData& ClientIncidentReport_EnvironmentData::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport_EnvironmentData* ClientIncidentReport_EnvironmentData::default_instance_ = NULL; + +ClientIncidentReport_EnvironmentData* ClientIncidentReport_EnvironmentData::New() const { + return new ClientIncidentReport_EnvironmentData; +} + +void ClientIncidentReport_EnvironmentData::Clear() { + if (_has_bits_[0 / 32] & 7) { + if (has_os()) { + if (os_ != NULL) os_->::safe_browsing::ClientIncidentReport_EnvironmentData_OS::Clear(); + } + if (has_machine()) { + if (machine_ != NULL) machine_->::safe_browsing::ClientIncidentReport_EnvironmentData_Machine::Clear(); + } + if (has_process()) { + if (process_ != NULL) process_->::safe_browsing::ClientIncidentReport_EnvironmentData_Process::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport_EnvironmentData::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport.EnvironmentData) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.OS os = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_os())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_machine; + break; + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Machine machine = 2; + case 2: { + if (tag == 18) { + parse_machine: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_machine())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_process; + break; + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process process = 3; + case 3: { + if (tag == 26) { + parse_process: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_process())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport.EnvironmentData) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport.EnvironmentData) + return false; +#undef DO_ +} + +void ClientIncidentReport_EnvironmentData::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport.EnvironmentData) + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.OS os = 1; + if (has_os()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 1, this->os(), output); + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Machine machine = 2; + if (has_machine()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->machine(), output); + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process process = 3; + if (has_process()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 3, this->process(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport.EnvironmentData) +} + +int ClientIncidentReport_EnvironmentData::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.OS os = 1; + if (has_os()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->os()); + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Machine machine = 2; + if (has_machine()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->machine()); + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process process = 3; + if (has_process()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->process()); + } + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentReport_EnvironmentData::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentReport_EnvironmentData::MergeFrom(const ClientIncidentReport_EnvironmentData& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_os()) { + mutable_os()->::safe_browsing::ClientIncidentReport_EnvironmentData_OS::MergeFrom(from.os()); + } + if (from.has_machine()) { + mutable_machine()->::safe_browsing::ClientIncidentReport_EnvironmentData_Machine::MergeFrom(from.machine()); + } + if (from.has_process()) { + mutable_process()->::safe_browsing::ClientIncidentReport_EnvironmentData_Process::MergeFrom(from.process()); + } + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport_EnvironmentData::CopyFrom(const ClientIncidentReport_EnvironmentData& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport_EnvironmentData::IsInitialized() const { + + return true; +} + +void ClientIncidentReport_EnvironmentData::Swap(ClientIncidentReport_EnvironmentData* other) { + if (other != this) { + std::swap(os_, other->os_); + std::swap(machine_, other->machine_); + std::swap(process_, other->process_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport_EnvironmentData::GetTypeName() const { + return "safe_browsing.ClientIncidentReport.EnvironmentData"; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int ClientIncidentReport::kIncidentFieldNumber; +const int ClientIncidentReport::kDownloadFieldNumber; +const int ClientIncidentReport::kEnvironmentFieldNumber; +#endif // !_MSC_VER + +ClientIncidentReport::ClientIncidentReport() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentReport) +} + +void ClientIncidentReport::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + download_ = const_cast< ::safe_browsing::ClientIncidentReport_DownloadDetails*>( + ::safe_browsing::ClientIncidentReport_DownloadDetails::internal_default_instance()); +#else + download_ = const_cast< ::safe_browsing::ClientIncidentReport_DownloadDetails*>(&::safe_browsing::ClientIncidentReport_DownloadDetails::default_instance()); +#endif +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + environment_ = const_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData*>( + ::safe_browsing::ClientIncidentReport_EnvironmentData::internal_default_instance()); +#else + environment_ = const_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData*>(&::safe_browsing::ClientIncidentReport_EnvironmentData::default_instance()); +#endif +} + +ClientIncidentReport::ClientIncidentReport(const ClientIncidentReport& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentReport) +} + +void ClientIncidentReport::SharedCtor() { + _cached_size_ = 0; + download_ = NULL; + environment_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentReport::~ClientIncidentReport() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentReport) + SharedDtor(); +} + +void ClientIncidentReport::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + delete download_; + delete environment_; + } +} + +void ClientIncidentReport::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentReport& ClientIncidentReport::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentReport* ClientIncidentReport::default_instance_ = NULL; + +ClientIncidentReport* ClientIncidentReport::New() const { + return new ClientIncidentReport; +} + +void ClientIncidentReport::Clear() { + if (_has_bits_[0 / 32] & 6) { + if (has_download()) { + if (download_ != NULL) download_->::safe_browsing::ClientIncidentReport_DownloadDetails::Clear(); + } + if (has_environment()) { + if (environment_ != NULL) environment_->::safe_browsing::ClientIncidentReport_EnvironmentData::Clear(); + } } - - // optional string file_basename = 9; - if (has_file_basename()) { - ::google::protobuf::internal::WireFormatLite::WriteString( - 9, this->file_basename(), output); + incident_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentReport::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentReport) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .safe_browsing.ClientIncidentReport.IncidentData incident = 1; + case 1: { + if (tag == 10) { + parse_incident: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_incident())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(10)) goto parse_incident; + if (input->ExpectTag(18)) goto parse_download; + break; + } + + // optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; + case 2: { + if (tag == 18) { + parse_download: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_download())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_environment; + break; + } + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData environment = 3; + case 3: { + if (tag == 26) { + parse_environment: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_environment())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } } - - // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; - if (has_download_type()) { - ::google::protobuf::internal::WireFormatLite::WriteEnum( - 10, this->download_type(), output); +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentReport) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentReport) + return false; +#undef DO_ +} + +void ClientIncidentReport::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentReport) + // repeated .safe_browsing.ClientIncidentReport.IncidentData incident = 1; + for (int i = 0; i < this->incident_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 1, this->incident(i), output); } - - // optional string locale = 11; - if (has_locale()) { - ::google::protobuf::internal::WireFormatLite::WriteString( - 11, this->locale(), output); + + // optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; + if (has_download()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->download(), output); } - - // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; - if (has_image_headers()) { + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData environment = 3; + if (has_environment()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( - 18, this->image_headers(), output); + 3, this->environment(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentReport) } -int ClientDownloadRequest::ByteSize() const { +int ClientIncidentReport::ByteSize() const { int total_size = 0; - - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // required string url = 1; - if (has_url()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::StringSize( - this->url()); - } - - // required .safe_browsing.ClientDownloadRequest.Digests digests = 2; - if (has_digests()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( - this->digests()); - } - - // required int64 length = 3; - if (has_length()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::Int64Size( - this->length()); - } - - // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; - if (has_signature()) { + + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + // optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; + if (has_download()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( - this->signature()); - } - - // optional bool user_initiated = 6; - if (has_user_initiated()) { - total_size += 1 + 1; - } - - // optional string file_basename = 9; - if (has_file_basename()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::StringSize( - this->file_basename()); - } - - // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; - if (has_download_type()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::EnumSize(this->download_type()); + this->download()); } - - } - if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { - // optional string locale = 11; - if (has_locale()) { + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData environment = 3; + if (has_environment()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::StringSize( - this->locale()); - } - - // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; - if (has_image_headers()) { - total_size += 2 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( - this->image_headers()); + this->environment()); } - + } - // repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; - total_size += 1 * this->resources_size(); - for (int i = 0; i < this->resources_size(); i++) { + // repeated .safe_browsing.ClientIncidentReport.IncidentData incident = 1; + total_size += 1 * this->incident_size(); + for (int i = 0; i < this->incident_size(); i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( - this->resources(i)); + this->incident(i)); } - + + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadRequest::CheckTypeAndMergeFrom( +void ClientIncidentReport::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadRequest::MergeFrom(const ClientDownloadRequest& from) { +void ClientIncidentReport::MergeFrom(const ClientIncidentReport& from) { GOOGLE_CHECK_NE(&from, this); - resources_.MergeFrom(from.resources_); - if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (from.has_url()) { - set_url(from.url()); - } - if (from.has_digests()) { - mutable_digests()->::safe_browsing::ClientDownloadRequest_Digests::MergeFrom(from.digests()); - } - if (from.has_length()) { - set_length(from.length()); - } - if (from.has_signature()) { - mutable_signature()->::safe_browsing::ClientDownloadRequest_SignatureInfo::MergeFrom(from.signature()); - } - if (from.has_user_initiated()) { - set_user_initiated(from.user_initiated()); + incident_.MergeFrom(from.incident_); + if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (from.has_download()) { + mutable_download()->::safe_browsing::ClientIncidentReport_DownloadDetails::MergeFrom(from.download()); } - if (from.has_file_basename()) { - set_file_basename(from.file_basename()); + if (from.has_environment()) { + mutable_environment()->::safe_browsing::ClientIncidentReport_EnvironmentData::MergeFrom(from.environment()); } - if (from.has_download_type()) { - set_download_type(from.download_type()); + } + mutable_unknown_fields()->append(from.unknown_fields()); +} + +void ClientIncidentReport::CopyFrom(const ClientIncidentReport& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ClientIncidentReport::IsInitialized() const { + + if (has_download()) { + if (!this->download().IsInitialized()) return false; + } + return true; +} + +void ClientIncidentReport::Swap(ClientIncidentReport* other) { + if (other != this) { + incident_.Swap(&other->incident_); + std::swap(download_, other->download_); + std::swap(environment_, other->environment_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::std::string ClientIncidentReport::GetTypeName() const { + return "safe_browsing.ClientIncidentReport"; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int ClientIncidentResponse_EnvironmentRequest::kDllIndexFieldNumber; +#endif // !_MSC_VER + +ClientIncidentResponse_EnvironmentRequest::ClientIncidentResponse_EnvironmentRequest() + : ::google::protobuf::MessageLite() { + SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentResponse.EnvironmentRequest) +} + +void ClientIncidentResponse_EnvironmentRequest::InitAsDefaultInstance() { +} + +ClientIncidentResponse_EnvironmentRequest::ClientIncidentResponse_EnvironmentRequest(const ClientIncidentResponse_EnvironmentRequest& from) + : ::google::protobuf::MessageLite() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentResponse.EnvironmentRequest) +} + +void ClientIncidentResponse_EnvironmentRequest::SharedCtor() { + _cached_size_ = 0; + dll_index_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ClientIncidentResponse_EnvironmentRequest::~ClientIncidentResponse_EnvironmentRequest() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentResponse.EnvironmentRequest) + SharedDtor(); +} + +void ClientIncidentResponse_EnvironmentRequest::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else + if (this != default_instance_) { + #endif + } +} + +void ClientIncidentResponse_EnvironmentRequest::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ClientIncidentResponse_EnvironmentRequest& ClientIncidentResponse_EnvironmentRequest::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; +} + +ClientIncidentResponse_EnvironmentRequest* ClientIncidentResponse_EnvironmentRequest::default_instance_ = NULL; + +ClientIncidentResponse_EnvironmentRequest* ClientIncidentResponse_EnvironmentRequest::New() const { + return new ClientIncidentResponse_EnvironmentRequest; +} + +void ClientIncidentResponse_EnvironmentRequest::Clear() { + dll_index_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); +} + +bool ClientIncidentResponse_EnvironmentRequest::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentResponse.EnvironmentRequest) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional int32 dll_index = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &dll_index_))); + set_has_dll_index(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } } } - if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { - if (from.has_locale()) { - set_locale(from.locale()); +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentResponse.EnvironmentRequest) + return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentResponse.EnvironmentRequest) + return false; +#undef DO_ +} + +void ClientIncidentResponse_EnvironmentRequest::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentResponse.EnvironmentRequest) + // optional int32 dll_index = 1; + if (has_dll_index()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->dll_index(), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentResponse.EnvironmentRequest) +} + +int ClientIncidentResponse_EnvironmentRequest::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional int32 dll_index = 1; + if (has_dll_index()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->dll_index()); } - if (from.has_image_headers()) { - mutable_image_headers()->::safe_browsing::ClientDownloadRequest_ImageHeaders::MergeFrom(from.image_headers()); + + } + total_size += unknown_fields().size(); + + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ClientIncidentResponse_EnvironmentRequest::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void ClientIncidentResponse_EnvironmentRequest::MergeFrom(const ClientIncidentResponse_EnvironmentRequest& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_dll_index()) { + set_dll_index(from.dll_index()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadRequest::CopyFrom(const ClientDownloadRequest& from) { +void ClientIncidentResponse_EnvironmentRequest::CopyFrom(const ClientIncidentResponse_EnvironmentRequest& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadRequest::IsInitialized() const { - if ((_has_bits_[0] & 0x00000007) != 0x00000007) return false; - - for (int i = 0; i < resources_size(); i++) { - if (!this->resources(i).IsInitialized()) return false; - } +bool ClientIncidentResponse_EnvironmentRequest::IsInitialized() const { + return true; } -void ClientDownloadRequest::Swap(ClientDownloadRequest* other) { +void ClientIncidentResponse_EnvironmentRequest::Swap(ClientIncidentResponse_EnvironmentRequest* other) { if (other != this) { - std::swap(url_, other->url_); - std::swap(digests_, other->digests_); - std::swap(length_, other->length_); - resources_.Swap(&other->resources_); - std::swap(signature_, other->signature_); - std::swap(user_initiated_, other->user_initiated_); - std::swap(file_basename_, other->file_basename_); - std::swap(download_type_, other->download_type_); - std::swap(locale_, other->locale_); - std::swap(image_headers_, other->image_headers_); + std::swap(dll_index_, other->dll_index_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadRequest::GetTypeName() const { - return "safe_browsing.ClientDownloadRequest"; +::std::string ClientIncidentResponse_EnvironmentRequest::GetTypeName() const { + return "safe_browsing.ClientIncidentResponse.EnvironmentRequest"; } -// =================================================================== - -bool ClientDownloadResponse_Verdict_IsValid(int value) { - switch(value) { - case 0: - case 1: - case 2: - case 3: - case 4: - return true; - default: - return false; - } -} +// ------------------------------------------------------------------- #ifndef _MSC_VER -const ClientDownloadResponse_Verdict ClientDownloadResponse::SAFE; -const ClientDownloadResponse_Verdict ClientDownloadResponse::DANGEROUS; -const ClientDownloadResponse_Verdict ClientDownloadResponse::UNCOMMON; -const ClientDownloadResponse_Verdict ClientDownloadResponse::POTENTIALLY_UNWANTED; -const ClientDownloadResponse_Verdict ClientDownloadResponse::DANGEROUS_HOST; -const ClientDownloadResponse_Verdict ClientDownloadResponse::Verdict_MIN; -const ClientDownloadResponse_Verdict ClientDownloadResponse::Verdict_MAX; -const int ClientDownloadResponse::Verdict_ARRAYSIZE; -#endif // _MSC_VER -#ifndef _MSC_VER -const int ClientDownloadResponse_MoreInfo::kDescriptionFieldNumber; -const int ClientDownloadResponse_MoreInfo::kUrlFieldNumber; +const int ClientIncidentResponse::kTokenFieldNumber; +const int ClientIncidentResponse::kDownloadRequestedFieldNumber; +const int ClientIncidentResponse::kEnvironmentRequestsFieldNumber; #endif // !_MSC_VER -ClientDownloadResponse_MoreInfo::ClientDownloadResponse_MoreInfo() +ClientIncidentResponse::ClientIncidentResponse() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.ClientIncidentResponse) } -void ClientDownloadResponse_MoreInfo::InitAsDefaultInstance() { +void ClientIncidentResponse::InitAsDefaultInstance() { } -ClientDownloadResponse_MoreInfo::ClientDownloadResponse_MoreInfo(const ClientDownloadResponse_MoreInfo& from) +ClientIncidentResponse::ClientIncidentResponse(const ClientIncidentResponse& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.ClientIncidentResponse) } -void ClientDownloadResponse_MoreInfo::SharedCtor() { +void ClientIncidentResponse::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); _cached_size_ = 0; - description_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - url_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + token_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + download_requested_ = false; ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadResponse_MoreInfo::~ClientDownloadResponse_MoreInfo() { +ClientIncidentResponse::~ClientIncidentResponse() { + // @@protoc_insertion_point(destructor:safe_browsing.ClientIncidentResponse) SharedDtor(); } -void ClientDownloadResponse_MoreInfo::SharedDtor() { - if (description_ != &::google::protobuf::internal::kEmptyString) { - delete description_; - } - if (url_ != &::google::protobuf::internal::kEmptyString) { - delete url_; +void ClientIncidentResponse::SharedDtor() { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete token_; } + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { + #endif } } -void ClientDownloadResponse_MoreInfo::SetCachedSize(int size) const { +void ClientIncidentResponse::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadResponse_MoreInfo& ClientDownloadResponse_MoreInfo::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const ClientIncidentResponse& ClientIncidentResponse::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadResponse_MoreInfo* ClientDownloadResponse_MoreInfo::default_instance_ = NULL; +ClientIncidentResponse* ClientIncidentResponse::default_instance_ = NULL; -ClientDownloadResponse_MoreInfo* ClientDownloadResponse_MoreInfo::New() const { - return new ClientDownloadResponse_MoreInfo; +ClientIncidentResponse* ClientIncidentResponse::New() const { + return new ClientIncidentResponse; } -void ClientDownloadResponse_MoreInfo::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (has_description()) { - if (description_ != &::google::protobuf::internal::kEmptyString) { - description_->clear(); - } - } - if (has_url()) { - if (url_ != &::google::protobuf::internal::kEmptyString) { - url_->clear(); +void ClientIncidentResponse::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_token()) { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_->clear(); } } + download_requested_ = false; } + environment_requests_.Clear(); ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadResponse_MoreInfo::MergePartialFromCodedStream( +bool ClientIncidentResponse::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.ClientIncidentResponse) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // optional string description = 1; + // optional bytes token = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - DO_(::google::protobuf::internal::WireFormatLite::ReadString( - input, this->mutable_description())); + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_token())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(18)) goto parse_url; + if (input->ExpectTag(16)) goto parse_download_requested; break; } - - // optional string url = 2; + + // optional bool download_requested = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_url: - DO_(::google::protobuf::internal::WireFormatLite::ReadString( - input, this->mutable_url())); + if (tag == 16) { + parse_download_requested: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &download_requested_))); + set_has_download_requested(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_environment_requests; + break; + } + + // repeated .safe_browsing.ClientIncidentResponse.EnvironmentRequest environment_requests = 3; + case 3: { + if (tag == 26) { + parse_environment_requests: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_environment_requests())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectAtEnd()) return true; + if (input->ExpectTag(26)) goto parse_environment_requests; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.ClientIncidentResponse) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.ClientIncidentResponse) + return false; #undef DO_ } -void ClientDownloadResponse_MoreInfo::SerializeWithCachedSizes( +void ClientIncidentResponse::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // optional string description = 1; - if (has_description()) { - ::google::protobuf::internal::WireFormatLite::WriteString( - 1, this->description(), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.ClientIncidentResponse) + // optional bytes token = 1; + if (has_token()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 1, this->token(), output); } - - // optional string url = 2; - if (has_url()) { - ::google::protobuf::internal::WireFormatLite::WriteString( - 2, this->url(), output); + + // optional bool download_requested = 2; + if (has_download_requested()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->download_requested(), output); } - + + // repeated .safe_browsing.ClientIncidentResponse.EnvironmentRequest environment_requests = 3; + for (int i = 0; i < this->environment_requests_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 3, this->environment_requests(i), output); + } + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.ClientIncidentResponse) } -int ClientDownloadResponse_MoreInfo::ByteSize() const { +int ClientIncidentResponse::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // optional string description = 1; - if (has_description()) { + // optional bytes token = 1; + if (has_token()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::StringSize( - this->description()); + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->token()); } - - // optional string url = 2; - if (has_url()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::StringSize( - this->url()); + + // optional bool download_requested = 2; + if (has_download_requested()) { + total_size += 1 + 1; } - + + } + // repeated .safe_browsing.ClientIncidentResponse.EnvironmentRequest environment_requests = 3; + total_size += 1 * this->environment_requests_size(); + for (int i = 0; i < this->environment_requests_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->environment_requests(i)); } + + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadResponse_MoreInfo::CheckTypeAndMergeFrom( +void ClientIncidentResponse::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadResponse_MoreInfo::MergeFrom(const ClientDownloadResponse_MoreInfo& from) { +void ClientIncidentResponse::MergeFrom(const ClientIncidentResponse& from) { GOOGLE_CHECK_NE(&from, this); + environment_requests_.MergeFrom(from.environment_requests_); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (from.has_description()) { - set_description(from.description()); + if (from.has_token()) { + set_token(from.token()); } - if (from.has_url()) { - set_url(from.url()); + if (from.has_download_requested()) { + set_download_requested(from.download_requested()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadResponse_MoreInfo::CopyFrom(const ClientDownloadResponse_MoreInfo& from) { +void ClientIncidentResponse::CopyFrom(const ClientIncidentResponse& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadResponse_MoreInfo::IsInitialized() const { - +bool ClientIncidentResponse::IsInitialized() const { + return true; } -void ClientDownloadResponse_MoreInfo::Swap(ClientDownloadResponse_MoreInfo* other) { +void ClientIncidentResponse::Swap(ClientIncidentResponse* other) { if (other != this) { - std::swap(description_, other->description_); - std::swap(url_, other->url_); + std::swap(token_, other->token_); + std::swap(download_requested_, other->download_requested_); + environment_requests_.Swap(&other->environment_requests_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadResponse_MoreInfo::GetTypeName() const { - return "safe_browsing.ClientDownloadResponse.MoreInfo"; +::std::string ClientIncidentResponse::GetTypeName() const { + return "safe_browsing.ClientIncidentResponse"; } -// ------------------------------------------------------------------- +// =================================================================== #ifndef _MSC_VER -const int ClientDownloadResponse::kVerdictFieldNumber; -const int ClientDownloadResponse::kMoreInfoFieldNumber; -const int ClientDownloadResponse::kTokenFieldNumber; +const int DownloadMetadata::kDownloadIdFieldNumber; +const int DownloadMetadata::kDownloadFieldNumber; #endif // !_MSC_VER -ClientDownloadResponse::ClientDownloadResponse() +DownloadMetadata::DownloadMetadata() : ::google::protobuf::MessageLite() { SharedCtor(); + // @@protoc_insertion_point(constructor:safe_browsing.DownloadMetadata) } -void ClientDownloadResponse::InitAsDefaultInstance() { - more_info_ = const_cast< ::safe_browsing::ClientDownloadResponse_MoreInfo*>(&::safe_browsing::ClientDownloadResponse_MoreInfo::default_instance()); +void DownloadMetadata::InitAsDefaultInstance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + download_ = const_cast< ::safe_browsing::ClientIncidentReport_DownloadDetails*>( + ::safe_browsing::ClientIncidentReport_DownloadDetails::internal_default_instance()); +#else + download_ = const_cast< ::safe_browsing::ClientIncidentReport_DownloadDetails*>(&::safe_browsing::ClientIncidentReport_DownloadDetails::default_instance()); +#endif } -ClientDownloadResponse::ClientDownloadResponse(const ClientDownloadResponse& from) +DownloadMetadata::DownloadMetadata(const DownloadMetadata& from) : ::google::protobuf::MessageLite() { SharedCtor(); MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:safe_browsing.DownloadMetadata) } -void ClientDownloadResponse::SharedCtor() { +void DownloadMetadata::SharedCtor() { _cached_size_ = 0; - verdict_ = 0; - more_info_ = NULL; - token_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + download_id_ = 0u; + download_ = NULL; ::memset(_has_bits_, 0, sizeof(_has_bits_)); } -ClientDownloadResponse::~ClientDownloadResponse() { +DownloadMetadata::~DownloadMetadata() { + // @@protoc_insertion_point(destructor:safe_browsing.DownloadMetadata) SharedDtor(); } -void ClientDownloadResponse::SharedDtor() { - if (token_ != &::google::protobuf::internal::kEmptyString) { - delete token_; - } +void DownloadMetadata::SharedDtor() { + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + if (this != &default_instance()) { + #else if (this != default_instance_) { - delete more_info_; + #endif + delete download_; } } -void ClientDownloadResponse::SetCachedSize(int size) const { +void DownloadMetadata::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } -const ClientDownloadResponse& ClientDownloadResponse::default_instance() { - if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); return *default_instance_; +const DownloadMetadata& DownloadMetadata::default_instance() { +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + protobuf_AddDesc_csd_2eproto(); +#else + if (default_instance_ == NULL) protobuf_AddDesc_csd_2eproto(); +#endif + return *default_instance_; } -ClientDownloadResponse* ClientDownloadResponse::default_instance_ = NULL; +DownloadMetadata* DownloadMetadata::default_instance_ = NULL; -ClientDownloadResponse* ClientDownloadResponse::New() const { - return new ClientDownloadResponse; +DownloadMetadata* DownloadMetadata::New() const { + return new DownloadMetadata; } -void ClientDownloadResponse::Clear() { - if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - verdict_ = 0; - if (has_more_info()) { - if (more_info_ != NULL) more_info_->::safe_browsing::ClientDownloadResponse_MoreInfo::Clear(); - } - if (has_token()) { - if (token_ != &::google::protobuf::internal::kEmptyString) { - token_->clear(); - } +void DownloadMetadata::Clear() { + if (_has_bits_[0 / 32] & 3) { + download_id_ = 0u; + if (has_download()) { + if (download_ != NULL) download_->::safe_browsing::ClientIncidentReport_DownloadDetails::Clear(); } } ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->clear(); } -bool ClientDownloadResponse::MergePartialFromCodedStream( +bool DownloadMetadata::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { -#define DO_(EXPRESSION) if (!(EXPRESSION)) return false +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; - while ((tag = input->ReadTag()) != 0) { + ::google::protobuf::io::StringOutputStream unknown_fields_string( + mutable_unknown_fields()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_string); + // @@protoc_insertion_point(parse_start:safe_browsing.DownloadMetadata) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { - // required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; + // optional uint32 download_id = 1; case 1: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { - int value; + if (tag == 8) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< - int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( - input, &value))); - if (::safe_browsing::ClientDownloadResponse_Verdict_IsValid(value)) { - set_verdict(static_cast< ::safe_browsing::ClientDownloadResponse_Verdict >(value)); - } + ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>( + input, &download_id_))); + set_has_download_id(); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(18)) goto parse_more_info; + if (input->ExpectTag(18)) goto parse_download; break; } - - // optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; + + // optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; case 2: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_more_info: + if (tag == 18) { + parse_download: DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( - input, mutable_more_info())); + input, mutable_download())); } else { - goto handle_uninterpreted; + goto handle_unusual; } - if (input->ExpectTag(26)) goto parse_token; - break; - } - - // optional bytes token = 3; - case 3: { - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == - ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { - parse_token: - DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( - input, this->mutable_token())); - } else { - goto handle_uninterpreted; - } - if (input->ExpectAtEnd()) return true; + if (input->ExpectAtEnd()) goto success; break; } - + default: { - handle_uninterpreted: - if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { - return true; + goto success; } - DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag)); + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); break; } } } +success: + // @@protoc_insertion_point(parse_success:safe_browsing.DownloadMetadata) return true; +failure: + // @@protoc_insertion_point(parse_failure:safe_browsing.DownloadMetadata) + return false; #undef DO_ } -void ClientDownloadResponse::SerializeWithCachedSizes( +void DownloadMetadata::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { - // required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; - if (has_verdict()) { - ::google::protobuf::internal::WireFormatLite::WriteEnum( - 1, this->verdict(), output); + // @@protoc_insertion_point(serialize_start:safe_browsing.DownloadMetadata) + // optional uint32 download_id = 1; + if (has_download_id()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt32(1, this->download_id(), output); } - - // optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; - if (has_more_info()) { + + // optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; + if (has_download()) { ::google::protobuf::internal::WireFormatLite::WriteMessage( - 2, this->more_info(), output); - } - - // optional bytes token = 3; - if (has_token()) { - ::google::protobuf::internal::WireFormatLite::WriteBytes( - 3, this->token(), output); + 2, this->download(), output); } - + + output->WriteRaw(unknown_fields().data(), + unknown_fields().size()); + // @@protoc_insertion_point(serialize_end:safe_browsing.DownloadMetadata) } -int ClientDownloadResponse::ByteSize() const { +int DownloadMetadata::ByteSize() const { int total_size = 0; - + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { - // required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; - if (has_verdict()) { + // optional uint32 download_id = 1; + if (has_download_id()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::EnumSize(this->verdict()); + ::google::protobuf::internal::WireFormatLite::UInt32Size( + this->download_id()); } - - // optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; - if (has_more_info()) { + + // optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; + if (has_download()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( - this->more_info()); - } - - // optional bytes token = 3; - if (has_token()) { - total_size += 1 + - ::google::protobuf::internal::WireFormatLite::BytesSize( - this->token()); + this->download()); } - + } + total_size += unknown_fields().size(); + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } -void ClientDownloadResponse::CheckTypeAndMergeFrom( +void DownloadMetadata::CheckTypeAndMergeFrom( const ::google::protobuf::MessageLite& from) { - MergeFrom(*::google::protobuf::down_cast(&from)); + MergeFrom(*::google::protobuf::down_cast(&from)); } -void ClientDownloadResponse::MergeFrom(const ClientDownloadResponse& from) { +void DownloadMetadata::MergeFrom(const DownloadMetadata& from) { GOOGLE_CHECK_NE(&from, this); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { - if (from.has_verdict()) { - set_verdict(from.verdict()); + if (from.has_download_id()) { + set_download_id(from.download_id()); } - if (from.has_more_info()) { - mutable_more_info()->::safe_browsing::ClientDownloadResponse_MoreInfo::MergeFrom(from.more_info()); - } - if (from.has_token()) { - set_token(from.token()); + if (from.has_download()) { + mutable_download()->::safe_browsing::ClientIncidentReport_DownloadDetails::MergeFrom(from.download()); } } + mutable_unknown_fields()->append(from.unknown_fields()); } -void ClientDownloadResponse::CopyFrom(const ClientDownloadResponse& from) { +void DownloadMetadata::CopyFrom(const DownloadMetadata& from) { if (&from == this) return; Clear(); MergeFrom(from); } -bool ClientDownloadResponse::IsInitialized() const { - if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; - +bool DownloadMetadata::IsInitialized() const { + + if (has_download()) { + if (!this->download().IsInitialized()) return false; + } return true; } -void ClientDownloadResponse::Swap(ClientDownloadResponse* other) { +void DownloadMetadata::Swap(DownloadMetadata* other) { if (other != this) { - std::swap(verdict_, other->verdict_); - std::swap(more_info_, other->more_info_); - std::swap(token_, other->token_); + std::swap(download_id_, other->download_id_); + std::swap(download_, other->download_); std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.swap(other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } -::std::string ClientDownloadResponse::GetTypeName() const { - return "safe_browsing.ClientDownloadResponse"; +::std::string DownloadMetadata::GetTypeName() const { + return "safe_browsing.DownloadMetadata"; } diff --git a/toolkit/components/downloads/csd.pb.h b/toolkit/components/downloads/csd.pb.h index 8380488d2af6f..b2e8734be89b0 100644 --- a/toolkit/components/downloads/csd.pb.h +++ b/toolkit/components/downloads/csd.pb.h @@ -8,18 +8,19 @@ #include -#if GOOGLE_PROTOBUF_VERSION < 2004000 +#if GOOGLE_PROTOBUF_VERSION < 2006000 #error This file was generated by a newer version of protoc which is #error incompatible with your Protocol Buffer headers. Please update #error your headers. #endif -#if 2004001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#if 2006001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION #error This file was generated by an older version of protoc which is #error incompatible with your Protocol Buffer headers. Please #error regenerate this file with a newer version of protoc. #endif #include +#include #include #include // @@protoc_insertion_point(includes) @@ -31,6 +32,12 @@ void protobuf_AddDesc_csd_2eproto(); void protobuf_AssignDesc_csd_2eproto(); void protobuf_ShutdownFile_csd_2eproto(); +class ClientPhishingRequest; +class ClientPhishingRequest_Feature; +class ClientPhishingResponse; +class ClientMalwareRequest; +class ClientMalwareRequest_UrlInfo; +class ClientMalwareResponse; class ClientDownloadRequest; class ClientDownloadRequest_Digests; class ClientDownloadRequest_Resource; @@ -40,8 +47,31 @@ class ClientDownloadRequest_SignatureInfo; class ClientDownloadRequest_PEImageHeaders; class ClientDownloadRequest_PEImageHeaders_DebugData; class ClientDownloadRequest_ImageHeaders; +class ClientDownloadRequest_ArchivedBinary; class ClientDownloadResponse; class ClientDownloadResponse_MoreInfo; +class ClientDownloadReport; +class ClientDownloadReport_UserInformation; +class ClientUploadResponse; +class ClientIncidentReport; +class ClientIncidentReport_IncidentData; +class ClientIncidentReport_IncidentData_TrackedPreferenceIncident; +class ClientIncidentReport_IncidentData_BinaryIntegrityIncident; +class ClientIncidentReport_IncidentData_BlacklistLoadIncident; +class ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident; +class ClientIncidentReport_IncidentData_ScriptRequestIncident; +class ClientIncidentReport_DownloadDetails; +class ClientIncidentReport_EnvironmentData; +class ClientIncidentReport_EnvironmentData_OS; +class ClientIncidentReport_EnvironmentData_Machine; +class ClientIncidentReport_EnvironmentData_Process; +class ClientIncidentReport_EnvironmentData_Process_Patch; +class ClientIncidentReport_EnvironmentData_Process_NetworkProvider; +class ClientIncidentReport_EnvironmentData_Process_Dll; +class ClientIncidentReport_EnvironmentData_Process_ModuleState; +class ClientIncidentResponse; +class ClientIncidentResponse_EnvironmentRequest; +class DownloadMetadata; enum ClientDownloadRequest_ResourceType { ClientDownloadRequest_ResourceType_DOWNLOAD_URL = 0, @@ -78,153 +108,241 @@ const ClientDownloadResponse_Verdict ClientDownloadResponse_Verdict_Verdict_MIN const ClientDownloadResponse_Verdict ClientDownloadResponse_Verdict_Verdict_MAX = ClientDownloadResponse_Verdict_DANGEROUS_HOST; const int ClientDownloadResponse_Verdict_Verdict_ARRAYSIZE = ClientDownloadResponse_Verdict_Verdict_MAX + 1; +enum ClientDownloadReport_Reason { + ClientDownloadReport_Reason_SHARE = 0, + ClientDownloadReport_Reason_FALSE_POSITIVE = 1, + ClientDownloadReport_Reason_APPEAL = 2 +}; +bool ClientDownloadReport_Reason_IsValid(int value); +const ClientDownloadReport_Reason ClientDownloadReport_Reason_Reason_MIN = ClientDownloadReport_Reason_SHARE; +const ClientDownloadReport_Reason ClientDownloadReport_Reason_Reason_MAX = ClientDownloadReport_Reason_APPEAL; +const int ClientDownloadReport_Reason_Reason_ARRAYSIZE = ClientDownloadReport_Reason_Reason_MAX + 1; + +enum ClientUploadResponse_UploadStatus { + ClientUploadResponse_UploadStatus_SUCCESS = 0, + ClientUploadResponse_UploadStatus_UPLOAD_FAILURE = 1 +}; +bool ClientUploadResponse_UploadStatus_IsValid(int value); +const ClientUploadResponse_UploadStatus ClientUploadResponse_UploadStatus_UploadStatus_MIN = ClientUploadResponse_UploadStatus_SUCCESS; +const ClientUploadResponse_UploadStatus ClientUploadResponse_UploadStatus_UploadStatus_MAX = ClientUploadResponse_UploadStatus_UPLOAD_FAILURE; +const int ClientUploadResponse_UploadStatus_UploadStatus_ARRAYSIZE = ClientUploadResponse_UploadStatus_UploadStatus_MAX + 1; + +enum ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState { + ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_UNKNOWN = 0, + ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_CLEARED = 1, + ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_WEAK_LEGACY_OBSOLETE = 2, + ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_CHANGED = 3, + ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_UNTRUSTED_UNKNOWN_VALUE = 4 +}; +bool ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_IsValid(int value); +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_ValueState_MIN = ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_UNKNOWN; +const ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_ValueState_MAX = ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_UNTRUSTED_UNKNOWN_VALUE; +const int ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_ValueState_ARRAYSIZE = ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_ValueState_MAX + 1; + +enum ClientIncidentReport_EnvironmentData_Process_Dll_Feature { + ClientIncidentReport_EnvironmentData_Process_Dll_Feature_UNKNOWN = 0, + ClientIncidentReport_EnvironmentData_Process_Dll_Feature_LSP = 1 +}; +bool ClientIncidentReport_EnvironmentData_Process_Dll_Feature_IsValid(int value); +const ClientIncidentReport_EnvironmentData_Process_Dll_Feature ClientIncidentReport_EnvironmentData_Process_Dll_Feature_Feature_MIN = ClientIncidentReport_EnvironmentData_Process_Dll_Feature_UNKNOWN; +const ClientIncidentReport_EnvironmentData_Process_Dll_Feature ClientIncidentReport_EnvironmentData_Process_Dll_Feature_Feature_MAX = ClientIncidentReport_EnvironmentData_Process_Dll_Feature_LSP; +const int ClientIncidentReport_EnvironmentData_Process_Dll_Feature_Feature_ARRAYSIZE = ClientIncidentReport_EnvironmentData_Process_Dll_Feature_Feature_MAX + 1; + +enum ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState { + ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_UNKNOWN = 0, + ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_MODULE_STATE_UNKNOWN = 1, + ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_MODULE_STATE_UNMODIFIED = 2, + ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_MODULE_STATE_MODIFIED = 3 +}; +bool ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_IsValid(int value); +const ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_ModifiedState_MIN = ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_UNKNOWN; +const ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_ModifiedState_MAX = ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_MODULE_STATE_MODIFIED; +const int ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_ModifiedState_ARRAYSIZE = ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_ModifiedState_MAX + 1; + +enum ClientIncidentReport_EnvironmentData_Process_Channel { + ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_UNKNOWN = 0, + ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_CANARY = 1, + ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_DEV = 2, + ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_BETA = 3, + ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_STABLE = 4 +}; +bool ClientIncidentReport_EnvironmentData_Process_Channel_IsValid(int value); +const ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process_Channel_Channel_MIN = ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_UNKNOWN; +const ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process_Channel_Channel_MAX = ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_STABLE; +const int ClientIncidentReport_EnvironmentData_Process_Channel_Channel_ARRAYSIZE = ClientIncidentReport_EnvironmentData_Process_Channel_Channel_MAX + 1; + // =================================================================== -class ClientDownloadRequest_Digests : public ::google::protobuf::MessageLite { +class ClientPhishingRequest_Feature : public ::google::protobuf::MessageLite { public: - ClientDownloadRequest_Digests(); - virtual ~ClientDownloadRequest_Digests(); - - ClientDownloadRequest_Digests(const ClientDownloadRequest_Digests& from); - - inline ClientDownloadRequest_Digests& operator=(const ClientDownloadRequest_Digests& from) { + ClientPhishingRequest_Feature(); + virtual ~ClientPhishingRequest_Feature(); + + ClientPhishingRequest_Feature(const ClientPhishingRequest_Feature& from); + + inline ClientPhishingRequest_Feature& operator=(const ClientPhishingRequest_Feature& from) { CopyFrom(from); return *this; } - - static const ClientDownloadRequest_Digests& default_instance(); - - void Swap(ClientDownloadRequest_Digests* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientPhishingRequest_Feature& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientPhishingRequest_Feature* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientPhishingRequest_Feature* other); + // implements Message ---------------------------------------------- - - ClientDownloadRequest_Digests* New() const; + + ClientPhishingRequest_Feature* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadRequest_Digests& from); - void MergeFrom(const ClientDownloadRequest_Digests& from); + void CopyFrom(const ClientPhishingRequest_Feature& from); + void MergeFrom(const ClientPhishingRequest_Feature& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - - // optional bytes sha256 = 1; - inline bool has_sha256() const; - inline void clear_sha256(); - static const int kSha256FieldNumber = 1; - inline const ::std::string& sha256() const; - inline void set_sha256(const ::std::string& value); - inline void set_sha256(const char* value); - inline void set_sha256(const void* value, size_t size); - inline ::std::string* mutable_sha256(); - inline ::std::string* release_sha256(); - - // optional bytes sha1 = 2; - inline bool has_sha1() const; - inline void clear_sha1(); - static const int kSha1FieldNumber = 2; - inline const ::std::string& sha1() const; - inline void set_sha1(const ::std::string& value); - inline void set_sha1(const char* value); - inline void set_sha1(const void* value, size_t size); - inline ::std::string* mutable_sha1(); - inline ::std::string* release_sha1(); - - // optional bytes md5 = 3; - inline bool has_md5() const; - inline void clear_md5(); - static const int kMd5FieldNumber = 3; - inline const ::std::string& md5() const; - inline void set_md5(const ::std::string& value); - inline void set_md5(const char* value); - inline void set_md5(const void* value, size_t size); - inline ::std::string* mutable_md5(); - inline ::std::string* release_md5(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.Digests) + + // required string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // required double value = 2; + inline bool has_value() const; + inline void clear_value(); + static const int kValueFieldNumber = 2; + inline double value() const; + inline void set_value(double value); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientPhishingRequest.Feature) private: - inline void set_has_sha256(); - inline void clear_has_sha256(); - inline void set_has_sha1(); - inline void clear_has_sha1(); - inline void set_has_md5(); - inline void clear_has_md5(); - - ::std::string* sha256_; - ::std::string* sha1_; - ::std::string* md5_; - + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_value(); + inline void clear_has_value(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; - + ::std::string* name_; + double value_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else friend void protobuf_AddDesc_csd_2eproto(); + #endif friend void protobuf_AssignDesc_csd_2eproto(); friend void protobuf_ShutdownFile_csd_2eproto(); - + void InitAsDefaultInstance(); - static ClientDownloadRequest_Digests* default_instance_; + static ClientPhishingRequest_Feature* default_instance_; }; // ------------------------------------------------------------------- -class ClientDownloadRequest_Resource : public ::google::protobuf::MessageLite { +class ClientPhishingRequest : public ::google::protobuf::MessageLite { public: - ClientDownloadRequest_Resource(); - virtual ~ClientDownloadRequest_Resource(); - - ClientDownloadRequest_Resource(const ClientDownloadRequest_Resource& from); - - inline ClientDownloadRequest_Resource& operator=(const ClientDownloadRequest_Resource& from) { + ClientPhishingRequest(); + virtual ~ClientPhishingRequest(); + + ClientPhishingRequest(const ClientPhishingRequest& from); + + inline ClientPhishingRequest& operator=(const ClientPhishingRequest& from) { CopyFrom(from); return *this; } - - static const ClientDownloadRequest_Resource& default_instance(); - - void Swap(ClientDownloadRequest_Resource* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientPhishingRequest& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientPhishingRequest* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientPhishingRequest* other); + // implements Message ---------------------------------------------- - - ClientDownloadRequest_Resource* New() const; + + ClientPhishingRequest* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadRequest_Resource& from); - void MergeFrom(const ClientDownloadRequest_Resource& from); + void CopyFrom(const ClientPhishingRequest& from); + void MergeFrom(const ClientPhishingRequest& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + + typedef ClientPhishingRequest_Feature Feature; + // accessors ------------------------------------------------------- - - // required string url = 1; + + // optional string url = 1; inline bool has_url() const; inline void clear_url(); static const int kUrlFieldNumber = 1; @@ -234,958 +352,2170 @@ class ClientDownloadRequest_Resource : public ::google::protobuf::MessageLite { inline void set_url(const char* value, size_t size); inline ::std::string* mutable_url(); inline ::std::string* release_url(); - - // required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; - inline bool has_type() const; - inline void clear_type(); - static const int kTypeFieldNumber = 2; - inline ::safe_browsing::ClientDownloadRequest_ResourceType type() const; - inline void set_type(::safe_browsing::ClientDownloadRequest_ResourceType value); - - // optional bytes remote_ip = 3; - inline bool has_remote_ip() const; - inline void clear_remote_ip(); - static const int kRemoteIpFieldNumber = 3; - inline const ::std::string& remote_ip() const; - inline void set_remote_ip(const ::std::string& value); - inline void set_remote_ip(const char* value); - inline void set_remote_ip(const void* value, size_t size); - inline ::std::string* mutable_remote_ip(); - inline ::std::string* release_remote_ip(); - - // optional string referrer = 4; - inline bool has_referrer() const; - inline void clear_referrer(); - static const int kReferrerFieldNumber = 4; - inline const ::std::string& referrer() const; - inline void set_referrer(const ::std::string& value); - inline void set_referrer(const char* value); - inline void set_referrer(const char* value, size_t size); - inline ::std::string* mutable_referrer(); - inline ::std::string* release_referrer(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.Resource) + inline void set_allocated_url(::std::string* url); + + // optional bytes OBSOLETE_hash_prefix = 10; + inline bool has_obsolete_hash_prefix() const; + inline void clear_obsolete_hash_prefix(); + static const int kOBSOLETEHashPrefixFieldNumber = 10; + inline const ::std::string& obsolete_hash_prefix() const; + inline void set_obsolete_hash_prefix(const ::std::string& value); + inline void set_obsolete_hash_prefix(const char* value); + inline void set_obsolete_hash_prefix(const void* value, size_t size); + inline ::std::string* mutable_obsolete_hash_prefix(); + inline ::std::string* release_obsolete_hash_prefix(); + inline void set_allocated_obsolete_hash_prefix(::std::string* obsolete_hash_prefix); + + // required float client_score = 2; + inline bool has_client_score() const; + inline void clear_client_score(); + static const int kClientScoreFieldNumber = 2; + inline float client_score() const; + inline void set_client_score(float value); + + // optional bool is_phishing = 4; + inline bool has_is_phishing() const; + inline void clear_is_phishing(); + static const int kIsPhishingFieldNumber = 4; + inline bool is_phishing() const; + inline void set_is_phishing(bool value); + + // repeated .safe_browsing.ClientPhishingRequest.Feature feature_map = 5; + inline int feature_map_size() const; + inline void clear_feature_map(); + static const int kFeatureMapFieldNumber = 5; + inline const ::safe_browsing::ClientPhishingRequest_Feature& feature_map(int index) const; + inline ::safe_browsing::ClientPhishingRequest_Feature* mutable_feature_map(int index); + inline ::safe_browsing::ClientPhishingRequest_Feature* add_feature_map(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature >& + feature_map() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature >* + mutable_feature_map(); + + // optional int32 model_version = 6; + inline bool has_model_version() const; + inline void clear_model_version(); + static const int kModelVersionFieldNumber = 6; + inline ::google::protobuf::int32 model_version() const; + inline void set_model_version(::google::protobuf::int32 value); + + // repeated .safe_browsing.ClientPhishingRequest.Feature non_model_feature_map = 8; + inline int non_model_feature_map_size() const; + inline void clear_non_model_feature_map(); + static const int kNonModelFeatureMapFieldNumber = 8; + inline const ::safe_browsing::ClientPhishingRequest_Feature& non_model_feature_map(int index) const; + inline ::safe_browsing::ClientPhishingRequest_Feature* mutable_non_model_feature_map(int index); + inline ::safe_browsing::ClientPhishingRequest_Feature* add_non_model_feature_map(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature >& + non_model_feature_map() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature >* + mutable_non_model_feature_map(); + + // optional string OBSOLETE_referrer_url = 9; + inline bool has_obsolete_referrer_url() const; + inline void clear_obsolete_referrer_url(); + static const int kOBSOLETEReferrerUrlFieldNumber = 9; + inline const ::std::string& obsolete_referrer_url() const; + inline void set_obsolete_referrer_url(const ::std::string& value); + inline void set_obsolete_referrer_url(const char* value); + inline void set_obsolete_referrer_url(const char* value, size_t size); + inline ::std::string* mutable_obsolete_referrer_url(); + inline ::std::string* release_obsolete_referrer_url(); + inline void set_allocated_obsolete_referrer_url(::std::string* obsolete_referrer_url); + + // repeated uint32 shingle_hashes = 12 [packed = true]; + inline int shingle_hashes_size() const; + inline void clear_shingle_hashes(); + static const int kShingleHashesFieldNumber = 12; + inline ::google::protobuf::uint32 shingle_hashes(int index) const; + inline void set_shingle_hashes(int index, ::google::protobuf::uint32 value); + inline void add_shingle_hashes(::google::protobuf::uint32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& + shingle_hashes() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* + mutable_shingle_hashes(); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientPhishingRequest) private: inline void set_has_url(); inline void clear_has_url(); - inline void set_has_type(); - inline void clear_has_type(); - inline void set_has_remote_ip(); - inline void clear_has_remote_ip(); - inline void set_has_referrer(); - inline void clear_has_referrer(); - - ::std::string* url_; - ::std::string* remote_ip_; - ::std::string* referrer_; - int type_; - + inline void set_has_obsolete_hash_prefix(); + inline void clear_has_obsolete_hash_prefix(); + inline void set_has_client_score(); + inline void clear_has_client_score(); + inline void set_has_is_phishing(); + inline void clear_has_is_phishing(); + inline void set_has_model_version(); + inline void clear_has_model_version(); + inline void set_has_obsolete_referrer_url(); + inline void clear_has_obsolete_referrer_url(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32]; - + ::std::string* url_; + ::std::string* obsolete_hash_prefix_; + float client_score_; + bool is_phishing_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature > feature_map_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature > non_model_feature_map_; + ::std::string* obsolete_referrer_url_; + ::google::protobuf::RepeatedField< ::google::protobuf::uint32 > shingle_hashes_; + mutable int _shingle_hashes_cached_byte_size_; + ::google::protobuf::int32 model_version_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else friend void protobuf_AddDesc_csd_2eproto(); + #endif friend void protobuf_AssignDesc_csd_2eproto(); friend void protobuf_ShutdownFile_csd_2eproto(); - + void InitAsDefaultInstance(); - static ClientDownloadRequest_Resource* default_instance_; + static ClientPhishingRequest* default_instance_; }; // ------------------------------------------------------------------- -class ClientDownloadRequest_CertificateChain_Element : public ::google::protobuf::MessageLite { +class ClientPhishingResponse : public ::google::protobuf::MessageLite { public: - ClientDownloadRequest_CertificateChain_Element(); - virtual ~ClientDownloadRequest_CertificateChain_Element(); - - ClientDownloadRequest_CertificateChain_Element(const ClientDownloadRequest_CertificateChain_Element& from); - - inline ClientDownloadRequest_CertificateChain_Element& operator=(const ClientDownloadRequest_CertificateChain_Element& from) { + ClientPhishingResponse(); + virtual ~ClientPhishingResponse(); + + ClientPhishingResponse(const ClientPhishingResponse& from); + + inline ClientPhishingResponse& operator=(const ClientPhishingResponse& from) { CopyFrom(from); return *this; } - - static const ClientDownloadRequest_CertificateChain_Element& default_instance(); - - void Swap(ClientDownloadRequest_CertificateChain_Element* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientPhishingResponse& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientPhishingResponse* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientPhishingResponse* other); + // implements Message ---------------------------------------------- - - ClientDownloadRequest_CertificateChain_Element* New() const; + + ClientPhishingResponse* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadRequest_CertificateChain_Element& from); - void MergeFrom(const ClientDownloadRequest_CertificateChain_Element& from); + void CopyFrom(const ClientPhishingResponse& from); + void MergeFrom(const ClientPhishingResponse& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - - // optional bytes certificate = 1; - inline bool has_certificate() const; - inline void clear_certificate(); - static const int kCertificateFieldNumber = 1; - inline const ::std::string& certificate() const; - inline void set_certificate(const ::std::string& value); - inline void set_certificate(const char* value); - inline void set_certificate(const void* value, size_t size); - inline ::std::string* mutable_certificate(); - inline ::std::string* release_certificate(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.CertificateChain.Element) + + // required bool phishy = 1; + inline bool has_phishy() const; + inline void clear_phishy(); + static const int kPhishyFieldNumber = 1; + inline bool phishy() const; + inline void set_phishy(bool value); + + // repeated string OBSOLETE_whitelist_expression = 2; + inline int obsolete_whitelist_expression_size() const; + inline void clear_obsolete_whitelist_expression(); + static const int kOBSOLETEWhitelistExpressionFieldNumber = 2; + inline const ::std::string& obsolete_whitelist_expression(int index) const; + inline ::std::string* mutable_obsolete_whitelist_expression(int index); + inline void set_obsolete_whitelist_expression(int index, const ::std::string& value); + inline void set_obsolete_whitelist_expression(int index, const char* value); + inline void set_obsolete_whitelist_expression(int index, const char* value, size_t size); + inline ::std::string* add_obsolete_whitelist_expression(); + inline void add_obsolete_whitelist_expression(const ::std::string& value); + inline void add_obsolete_whitelist_expression(const char* value); + inline void add_obsolete_whitelist_expression(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& obsolete_whitelist_expression() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_obsolete_whitelist_expression(); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientPhishingResponse) private: - inline void set_has_certificate(); - inline void clear_has_certificate(); - - ::std::string* certificate_; - + inline void set_has_phishy(); + inline void clear_has_phishy(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; - + ::google::protobuf::RepeatedPtrField< ::std::string> obsolete_whitelist_expression_; + bool phishy_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else friend void protobuf_AddDesc_csd_2eproto(); + #endif friend void protobuf_AssignDesc_csd_2eproto(); friend void protobuf_ShutdownFile_csd_2eproto(); - + void InitAsDefaultInstance(); - static ClientDownloadRequest_CertificateChain_Element* default_instance_; + static ClientPhishingResponse* default_instance_; }; // ------------------------------------------------------------------- -class ClientDownloadRequest_CertificateChain : public ::google::protobuf::MessageLite { +class ClientMalwareRequest_UrlInfo : public ::google::protobuf::MessageLite { public: - ClientDownloadRequest_CertificateChain(); - virtual ~ClientDownloadRequest_CertificateChain(); - - ClientDownloadRequest_CertificateChain(const ClientDownloadRequest_CertificateChain& from); - - inline ClientDownloadRequest_CertificateChain& operator=(const ClientDownloadRequest_CertificateChain& from) { + ClientMalwareRequest_UrlInfo(); + virtual ~ClientMalwareRequest_UrlInfo(); + + ClientMalwareRequest_UrlInfo(const ClientMalwareRequest_UrlInfo& from); + + inline ClientMalwareRequest_UrlInfo& operator=(const ClientMalwareRequest_UrlInfo& from) { CopyFrom(from); return *this; } - - static const ClientDownloadRequest_CertificateChain& default_instance(); - - void Swap(ClientDownloadRequest_CertificateChain* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientMalwareRequest_UrlInfo& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientMalwareRequest_UrlInfo* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientMalwareRequest_UrlInfo* other); + // implements Message ---------------------------------------------- - - ClientDownloadRequest_CertificateChain* New() const; + + ClientMalwareRequest_UrlInfo* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadRequest_CertificateChain& from); - void MergeFrom(const ClientDownloadRequest_CertificateChain& from); + void CopyFrom(const ClientMalwareRequest_UrlInfo& from); + void MergeFrom(const ClientMalwareRequest_UrlInfo& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - - typedef ClientDownloadRequest_CertificateChain_Element Element; - + // accessors ------------------------------------------------------- - - // repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; - inline int element_size() const; - inline void clear_element(); - static const int kElementFieldNumber = 1; - inline const ::safe_browsing::ClientDownloadRequest_CertificateChain_Element& element(int index) const; - inline ::safe_browsing::ClientDownloadRequest_CertificateChain_Element* mutable_element(int index); - inline ::safe_browsing::ClientDownloadRequest_CertificateChain_Element* add_element(); - inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element >& - element() const; - inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element >* - mutable_element(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.CertificateChain) - private: - - ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element > element_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; - - friend void protobuf_AddDesc_csd_2eproto(); - friend void protobuf_AssignDesc_csd_2eproto(); - friend void protobuf_ShutdownFile_csd_2eproto(); - - void InitAsDefaultInstance(); - static ClientDownloadRequest_CertificateChain* default_instance_; -}; -// ------------------------------------------------------------------- -class ClientDownloadRequest_SignatureInfo : public ::google::protobuf::MessageLite { - public: - ClientDownloadRequest_SignatureInfo(); - virtual ~ClientDownloadRequest_SignatureInfo(); - - ClientDownloadRequest_SignatureInfo(const ClientDownloadRequest_SignatureInfo& from); - - inline ClientDownloadRequest_SignatureInfo& operator=(const ClientDownloadRequest_SignatureInfo& from) { + // required string ip = 1; + inline bool has_ip() const; + inline void clear_ip(); + static const int kIpFieldNumber = 1; + inline const ::std::string& ip() const; + inline void set_ip(const ::std::string& value); + inline void set_ip(const char* value); + inline void set_ip(const char* value, size_t size); + inline ::std::string* mutable_ip(); + inline ::std::string* release_ip(); + inline void set_allocated_ip(::std::string* ip); + + // required string url = 2; + inline bool has_url() const; + inline void clear_url(); + static const int kUrlFieldNumber = 2; + inline const ::std::string& url() const; + inline void set_url(const ::std::string& value); + inline void set_url(const char* value); + inline void set_url(const char* value, size_t size); + inline ::std::string* mutable_url(); + inline ::std::string* release_url(); + inline void set_allocated_url(::std::string* url); + + // optional string method = 3; + inline bool has_method() const; + inline void clear_method(); + static const int kMethodFieldNumber = 3; + inline const ::std::string& method() const; + inline void set_method(const ::std::string& value); + inline void set_method(const char* value); + inline void set_method(const char* value, size_t size); + inline ::std::string* mutable_method(); + inline ::std::string* release_method(); + inline void set_allocated_method(::std::string* method); + + // optional string referrer = 4; + inline bool has_referrer() const; + inline void clear_referrer(); + static const int kReferrerFieldNumber = 4; + inline const ::std::string& referrer() const; + inline void set_referrer(const ::std::string& value); + inline void set_referrer(const char* value); + inline void set_referrer(const char* value, size_t size); + inline ::std::string* mutable_referrer(); + inline ::std::string* release_referrer(); + inline void set_allocated_referrer(::std::string* referrer); + + // optional int32 resource_type = 5; + inline bool has_resource_type() const; + inline void clear_resource_type(); + static const int kResourceTypeFieldNumber = 5; + inline ::google::protobuf::int32 resource_type() const; + inline void set_resource_type(::google::protobuf::int32 value); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientMalwareRequest.UrlInfo) + private: + inline void set_has_ip(); + inline void clear_has_ip(); + inline void set_has_url(); + inline void clear_has_url(); + inline void set_has_method(); + inline void clear_has_method(); + inline void set_has_referrer(); + inline void clear_has_referrer(); + inline void set_has_resource_type(); + inline void clear_has_resource_type(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* ip_; + ::std::string* url_; + ::std::string* method_; + ::std::string* referrer_; + ::google::protobuf::int32 resource_type_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientMalwareRequest_UrlInfo* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientMalwareRequest : public ::google::protobuf::MessageLite { + public: + ClientMalwareRequest(); + virtual ~ClientMalwareRequest(); + + ClientMalwareRequest(const ClientMalwareRequest& from); + + inline ClientMalwareRequest& operator=(const ClientMalwareRequest& from) { CopyFrom(from); return *this; } - - static const ClientDownloadRequest_SignatureInfo& default_instance(); - - void Swap(ClientDownloadRequest_SignatureInfo* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientMalwareRequest& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientMalwareRequest* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientMalwareRequest* other); + // implements Message ---------------------------------------------- - - ClientDownloadRequest_SignatureInfo* New() const; + + ClientMalwareRequest* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadRequest_SignatureInfo& from); - void MergeFrom(const ClientDownloadRequest_SignatureInfo& from); + void CopyFrom(const ClientMalwareRequest& from); + void MergeFrom(const ClientMalwareRequest& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + + typedef ClientMalwareRequest_UrlInfo UrlInfo; + // accessors ------------------------------------------------------- - - // repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; - inline int certificate_chain_size() const; - inline void clear_certificate_chain(); - static const int kCertificateChainFieldNumber = 1; - inline const ::safe_browsing::ClientDownloadRequest_CertificateChain& certificate_chain(int index) const; - inline ::safe_browsing::ClientDownloadRequest_CertificateChain* mutable_certificate_chain(int index); - inline ::safe_browsing::ClientDownloadRequest_CertificateChain* add_certificate_chain(); - inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain >& - certificate_chain() const; - inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain >* - mutable_certificate_chain(); - - // optional bool trusted = 2; - inline bool has_trusted() const; - inline void clear_trusted(); - static const int kTrustedFieldNumber = 2; - inline bool trusted() const; - inline void set_trusted(bool value); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.SignatureInfo) + + // required string url = 1; + inline bool has_url() const; + inline void clear_url(); + static const int kUrlFieldNumber = 1; + inline const ::std::string& url() const; + inline void set_url(const ::std::string& value); + inline void set_url(const char* value); + inline void set_url(const char* value, size_t size); + inline ::std::string* mutable_url(); + inline ::std::string* release_url(); + inline void set_allocated_url(::std::string* url); + + // optional string referrer_url = 4; + inline bool has_referrer_url() const; + inline void clear_referrer_url(); + static const int kReferrerUrlFieldNumber = 4; + inline const ::std::string& referrer_url() const; + inline void set_referrer_url(const ::std::string& value); + inline void set_referrer_url(const char* value); + inline void set_referrer_url(const char* value, size_t size); + inline ::std::string* mutable_referrer_url(); + inline ::std::string* release_referrer_url(); + inline void set_allocated_referrer_url(::std::string* referrer_url); + + // repeated .safe_browsing.ClientMalwareRequest.UrlInfo bad_ip_url_info = 7; + inline int bad_ip_url_info_size() const; + inline void clear_bad_ip_url_info(); + static const int kBadIpUrlInfoFieldNumber = 7; + inline const ::safe_browsing::ClientMalwareRequest_UrlInfo& bad_ip_url_info(int index) const; + inline ::safe_browsing::ClientMalwareRequest_UrlInfo* mutable_bad_ip_url_info(int index); + inline ::safe_browsing::ClientMalwareRequest_UrlInfo* add_bad_ip_url_info(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientMalwareRequest_UrlInfo >& + bad_ip_url_info() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientMalwareRequest_UrlInfo >* + mutable_bad_ip_url_info(); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientMalwareRequest) private: - inline void set_has_trusted(); - inline void clear_has_trusted(); - - ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain > certificate_chain_; - bool trusted_; - + inline void set_has_url(); + inline void clear_has_url(); + inline void set_has_referrer_url(); + inline void clear_has_referrer_url(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; - + ::std::string* url_; + ::std::string* referrer_url_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientMalwareRequest_UrlInfo > bad_ip_url_info_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else friend void protobuf_AddDesc_csd_2eproto(); + #endif friend void protobuf_AssignDesc_csd_2eproto(); friend void protobuf_ShutdownFile_csd_2eproto(); - + void InitAsDefaultInstance(); - static ClientDownloadRequest_SignatureInfo* default_instance_; + static ClientMalwareRequest* default_instance_; }; // ------------------------------------------------------------------- -class ClientDownloadRequest_PEImageHeaders_DebugData : public ::google::protobuf::MessageLite { +class ClientMalwareResponse : public ::google::protobuf::MessageLite { public: - ClientDownloadRequest_PEImageHeaders_DebugData(); - virtual ~ClientDownloadRequest_PEImageHeaders_DebugData(); - - ClientDownloadRequest_PEImageHeaders_DebugData(const ClientDownloadRequest_PEImageHeaders_DebugData& from); - - inline ClientDownloadRequest_PEImageHeaders_DebugData& operator=(const ClientDownloadRequest_PEImageHeaders_DebugData& from) { + ClientMalwareResponse(); + virtual ~ClientMalwareResponse(); + + ClientMalwareResponse(const ClientMalwareResponse& from); + + inline ClientMalwareResponse& operator=(const ClientMalwareResponse& from) { CopyFrom(from); return *this; } - - static const ClientDownloadRequest_PEImageHeaders_DebugData& default_instance(); - - void Swap(ClientDownloadRequest_PEImageHeaders_DebugData* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientMalwareResponse& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientMalwareResponse* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientMalwareResponse* other); + // implements Message ---------------------------------------------- - - ClientDownloadRequest_PEImageHeaders_DebugData* New() const; + + ClientMalwareResponse* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadRequest_PEImageHeaders_DebugData& from); - void MergeFrom(const ClientDownloadRequest_PEImageHeaders_DebugData& from); + void CopyFrom(const ClientMalwareResponse& from); + void MergeFrom(const ClientMalwareResponse& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - - // optional bytes directory_entry = 1; - inline bool has_directory_entry() const; - inline void clear_directory_entry(); - static const int kDirectoryEntryFieldNumber = 1; - inline const ::std::string& directory_entry() const; - inline void set_directory_entry(const ::std::string& value); - inline void set_directory_entry(const char* value); - inline void set_directory_entry(const void* value, size_t size); - inline ::std::string* mutable_directory_entry(); - inline ::std::string* release_directory_entry(); - - // optional bytes raw_data = 2; - inline bool has_raw_data() const; - inline void clear_raw_data(); - static const int kRawDataFieldNumber = 2; - inline const ::std::string& raw_data() const; - inline void set_raw_data(const ::std::string& value); - inline void set_raw_data(const char* value); - inline void set_raw_data(const void* value, size_t size); - inline ::std::string* mutable_raw_data(); - inline ::std::string* release_raw_data(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) + + // required bool blacklist = 1; + inline bool has_blacklist() const; + inline void clear_blacklist(); + static const int kBlacklistFieldNumber = 1; + inline bool blacklist() const; + inline void set_blacklist(bool value); + + // optional string bad_ip = 2; + inline bool has_bad_ip() const; + inline void clear_bad_ip(); + static const int kBadIpFieldNumber = 2; + inline const ::std::string& bad_ip() const; + inline void set_bad_ip(const ::std::string& value); + inline void set_bad_ip(const char* value); + inline void set_bad_ip(const char* value, size_t size); + inline ::std::string* mutable_bad_ip(); + inline ::std::string* release_bad_ip(); + inline void set_allocated_bad_ip(::std::string* bad_ip); + + // optional string bad_url = 3; + inline bool has_bad_url() const; + inline void clear_bad_url(); + static const int kBadUrlFieldNumber = 3; + inline const ::std::string& bad_url() const; + inline void set_bad_url(const ::std::string& value); + inline void set_bad_url(const char* value); + inline void set_bad_url(const char* value, size_t size); + inline ::std::string* mutable_bad_url(); + inline ::std::string* release_bad_url(); + inline void set_allocated_bad_url(::std::string* bad_url); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientMalwareResponse) private: - inline void set_has_directory_entry(); - inline void clear_has_directory_entry(); - inline void set_has_raw_data(); - inline void clear_has_raw_data(); - - ::std::string* directory_entry_; - ::std::string* raw_data_; - + inline void set_has_blacklist(); + inline void clear_has_blacklist(); + inline void set_has_bad_ip(); + inline void clear_has_bad_ip(); + inline void set_has_bad_url(); + inline void clear_has_bad_url(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; - + ::std::string* bad_ip_; + ::std::string* bad_url_; + bool blacklist_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else friend void protobuf_AddDesc_csd_2eproto(); + #endif friend void protobuf_AssignDesc_csd_2eproto(); friend void protobuf_ShutdownFile_csd_2eproto(); - + void InitAsDefaultInstance(); - static ClientDownloadRequest_PEImageHeaders_DebugData* default_instance_; + static ClientMalwareResponse* default_instance_; }; // ------------------------------------------------------------------- -class ClientDownloadRequest_PEImageHeaders : public ::google::protobuf::MessageLite { +class ClientDownloadRequest_Digests : public ::google::protobuf::MessageLite { public: - ClientDownloadRequest_PEImageHeaders(); - virtual ~ClientDownloadRequest_PEImageHeaders(); - - ClientDownloadRequest_PEImageHeaders(const ClientDownloadRequest_PEImageHeaders& from); - - inline ClientDownloadRequest_PEImageHeaders& operator=(const ClientDownloadRequest_PEImageHeaders& from) { + ClientDownloadRequest_Digests(); + virtual ~ClientDownloadRequest_Digests(); + + ClientDownloadRequest_Digests(const ClientDownloadRequest_Digests& from); + + inline ClientDownloadRequest_Digests& operator=(const ClientDownloadRequest_Digests& from) { CopyFrom(from); return *this; } - - static const ClientDownloadRequest_PEImageHeaders& default_instance(); - - void Swap(ClientDownloadRequest_PEImageHeaders* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest_Digests& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest_Digests* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest_Digests* other); + // implements Message ---------------------------------------------- - - ClientDownloadRequest_PEImageHeaders* New() const; + + ClientDownloadRequest_Digests* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadRequest_PEImageHeaders& from); - void MergeFrom(const ClientDownloadRequest_PEImageHeaders& from); + void CopyFrom(const ClientDownloadRequest_Digests& from); + void MergeFrom(const ClientDownloadRequest_Digests& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - - typedef ClientDownloadRequest_PEImageHeaders_DebugData DebugData; - + // accessors ------------------------------------------------------- - - // optional bytes dos_header = 1; - inline bool has_dos_header() const; - inline void clear_dos_header(); - static const int kDosHeaderFieldNumber = 1; - inline const ::std::string& dos_header() const; - inline void set_dos_header(const ::std::string& value); - inline void set_dos_header(const char* value); - inline void set_dos_header(const void* value, size_t size); - inline ::std::string* mutable_dos_header(); - inline ::std::string* release_dos_header(); - - // optional bytes file_header = 2; - inline bool has_file_header() const; - inline void clear_file_header(); - static const int kFileHeaderFieldNumber = 2; - inline const ::std::string& file_header() const; - inline void set_file_header(const ::std::string& value); - inline void set_file_header(const char* value); - inline void set_file_header(const void* value, size_t size); - inline ::std::string* mutable_file_header(); - inline ::std::string* release_file_header(); - - // optional bytes optional_headers32 = 3; - inline bool has_optional_headers32() const; - inline void clear_optional_headers32(); - static const int kOptionalHeaders32FieldNumber = 3; - inline const ::std::string& optional_headers32() const; - inline void set_optional_headers32(const ::std::string& value); - inline void set_optional_headers32(const char* value); - inline void set_optional_headers32(const void* value, size_t size); - inline ::std::string* mutable_optional_headers32(); - inline ::std::string* release_optional_headers32(); - - // optional bytes optional_headers64 = 4; - inline bool has_optional_headers64() const; - inline void clear_optional_headers64(); - static const int kOptionalHeaders64FieldNumber = 4; - inline const ::std::string& optional_headers64() const; - inline void set_optional_headers64(const ::std::string& value); - inline void set_optional_headers64(const char* value); - inline void set_optional_headers64(const void* value, size_t size); - inline ::std::string* mutable_optional_headers64(); - inline ::std::string* release_optional_headers64(); - - // repeated bytes section_header = 5; - inline int section_header_size() const; - inline void clear_section_header(); - static const int kSectionHeaderFieldNumber = 5; - inline const ::std::string& section_header(int index) const; - inline ::std::string* mutable_section_header(int index); - inline void set_section_header(int index, const ::std::string& value); - inline void set_section_header(int index, const char* value); - inline void set_section_header(int index, const void* value, size_t size); - inline ::std::string* add_section_header(); - inline void add_section_header(const ::std::string& value); - inline void add_section_header(const char* value); - inline void add_section_header(const void* value, size_t size); - inline const ::google::protobuf::RepeatedPtrField< ::std::string>& section_header() const; - inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_section_header(); - - // optional bytes export_section_data = 6; - inline bool has_export_section_data() const; - inline void clear_export_section_data(); - static const int kExportSectionDataFieldNumber = 6; - inline const ::std::string& export_section_data() const; - inline void set_export_section_data(const ::std::string& value); - inline void set_export_section_data(const char* value); - inline void set_export_section_data(const void* value, size_t size); - inline ::std::string* mutable_export_section_data(); - inline ::std::string* release_export_section_data(); - - // repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; - inline int debug_data_size() const; - inline void clear_debug_data(); - static const int kDebugDataFieldNumber = 7; - inline const ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData& debug_data(int index) const; - inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData* mutable_debug_data(int index); - inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData* add_debug_data(); - inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData >& - debug_data() const; - inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData >* - mutable_debug_data(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.PEImageHeaders) + + // optional bytes sha256 = 1; + inline bool has_sha256() const; + inline void clear_sha256(); + static const int kSha256FieldNumber = 1; + inline const ::std::string& sha256() const; + inline void set_sha256(const ::std::string& value); + inline void set_sha256(const char* value); + inline void set_sha256(const void* value, size_t size); + inline ::std::string* mutable_sha256(); + inline ::std::string* release_sha256(); + inline void set_allocated_sha256(::std::string* sha256); + + // optional bytes sha1 = 2; + inline bool has_sha1() const; + inline void clear_sha1(); + static const int kSha1FieldNumber = 2; + inline const ::std::string& sha1() const; + inline void set_sha1(const ::std::string& value); + inline void set_sha1(const char* value); + inline void set_sha1(const void* value, size_t size); + inline ::std::string* mutable_sha1(); + inline ::std::string* release_sha1(); + inline void set_allocated_sha1(::std::string* sha1); + + // optional bytes md5 = 3; + inline bool has_md5() const; + inline void clear_md5(); + static const int kMd5FieldNumber = 3; + inline const ::std::string& md5() const; + inline void set_md5(const ::std::string& value); + inline void set_md5(const char* value); + inline void set_md5(const void* value, size_t size); + inline ::std::string* mutable_md5(); + inline ::std::string* release_md5(); + inline void set_allocated_md5(::std::string* md5); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.Digests) private: - inline void set_has_dos_header(); - inline void clear_has_dos_header(); - inline void set_has_file_header(); - inline void clear_has_file_header(); - inline void set_has_optional_headers32(); - inline void clear_has_optional_headers32(); - inline void set_has_optional_headers64(); - inline void clear_has_optional_headers64(); - inline void set_has_export_section_data(); - inline void clear_has_export_section_data(); - - ::std::string* dos_header_; - ::std::string* file_header_; - ::std::string* optional_headers32_; - ::std::string* optional_headers64_; - ::google::protobuf::RepeatedPtrField< ::std::string> section_header_; - ::std::string* export_section_data_; - ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData > debug_data_; - + inline void set_has_sha256(); + inline void clear_has_sha256(); + inline void set_has_sha1(); + inline void clear_has_sha1(); + inline void set_has_md5(); + inline void clear_has_md5(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32]; - + ::std::string* sha256_; + ::std::string* sha1_; + ::std::string* md5_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else friend void protobuf_AddDesc_csd_2eproto(); + #endif friend void protobuf_AssignDesc_csd_2eproto(); friend void protobuf_ShutdownFile_csd_2eproto(); - + void InitAsDefaultInstance(); - static ClientDownloadRequest_PEImageHeaders* default_instance_; + static ClientDownloadRequest_Digests* default_instance_; }; // ------------------------------------------------------------------- -class ClientDownloadRequest_ImageHeaders : public ::google::protobuf::MessageLite { +class ClientDownloadRequest_Resource : public ::google::protobuf::MessageLite { public: - ClientDownloadRequest_ImageHeaders(); - virtual ~ClientDownloadRequest_ImageHeaders(); - - ClientDownloadRequest_ImageHeaders(const ClientDownloadRequest_ImageHeaders& from); - - inline ClientDownloadRequest_ImageHeaders& operator=(const ClientDownloadRequest_ImageHeaders& from) { + ClientDownloadRequest_Resource(); + virtual ~ClientDownloadRequest_Resource(); + + ClientDownloadRequest_Resource(const ClientDownloadRequest_Resource& from); + + inline ClientDownloadRequest_Resource& operator=(const ClientDownloadRequest_Resource& from) { CopyFrom(from); return *this; } - - static const ClientDownloadRequest_ImageHeaders& default_instance(); - - void Swap(ClientDownloadRequest_ImageHeaders* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest_Resource& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest_Resource* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest_Resource* other); + // implements Message ---------------------------------------------- - - ClientDownloadRequest_ImageHeaders* New() const; + + ClientDownloadRequest_Resource* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadRequest_ImageHeaders& from); - void MergeFrom(const ClientDownloadRequest_ImageHeaders& from); + void CopyFrom(const ClientDownloadRequest_Resource& from); + void MergeFrom(const ClientDownloadRequest_Resource& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + // accessors ------------------------------------------------------- - - // optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; - inline bool has_pe_headers() const; - inline void clear_pe_headers(); - static const int kPeHeadersFieldNumber = 1; - inline const ::safe_browsing::ClientDownloadRequest_PEImageHeaders& pe_headers() const; - inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders* mutable_pe_headers(); - inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders* release_pe_headers(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.ImageHeaders) + + // required string url = 1; + inline bool has_url() const; + inline void clear_url(); + static const int kUrlFieldNumber = 1; + inline const ::std::string& url() const; + inline void set_url(const ::std::string& value); + inline void set_url(const char* value); + inline void set_url(const char* value, size_t size); + inline ::std::string* mutable_url(); + inline ::std::string* release_url(); + inline void set_allocated_url(::std::string* url); + + // required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; + inline bool has_type() const; + inline void clear_type(); + static const int kTypeFieldNumber = 2; + inline ::safe_browsing::ClientDownloadRequest_ResourceType type() const; + inline void set_type(::safe_browsing::ClientDownloadRequest_ResourceType value); + + // optional bytes remote_ip = 3; + inline bool has_remote_ip() const; + inline void clear_remote_ip(); + static const int kRemoteIpFieldNumber = 3; + inline const ::std::string& remote_ip() const; + inline void set_remote_ip(const ::std::string& value); + inline void set_remote_ip(const char* value); + inline void set_remote_ip(const void* value, size_t size); + inline ::std::string* mutable_remote_ip(); + inline ::std::string* release_remote_ip(); + inline void set_allocated_remote_ip(::std::string* remote_ip); + + // optional string referrer = 4; + inline bool has_referrer() const; + inline void clear_referrer(); + static const int kReferrerFieldNumber = 4; + inline const ::std::string& referrer() const; + inline void set_referrer(const ::std::string& value); + inline void set_referrer(const char* value); + inline void set_referrer(const char* value, size_t size); + inline ::std::string* mutable_referrer(); + inline ::std::string* release_referrer(); + inline void set_allocated_referrer(::std::string* referrer); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.Resource) private: - inline void set_has_pe_headers(); - inline void clear_has_pe_headers(); - - ::safe_browsing::ClientDownloadRequest_PEImageHeaders* pe_headers_; - + inline void set_has_url(); + inline void clear_has_url(); + inline void set_has_type(); + inline void clear_has_type(); + inline void set_has_remote_ip(); + inline void clear_has_remote_ip(); + inline void set_has_referrer(); + inline void clear_has_referrer(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; - + ::std::string* url_; + ::std::string* remote_ip_; + ::std::string* referrer_; + int type_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else friend void protobuf_AddDesc_csd_2eproto(); + #endif friend void protobuf_AssignDesc_csd_2eproto(); friend void protobuf_ShutdownFile_csd_2eproto(); - + void InitAsDefaultInstance(); - static ClientDownloadRequest_ImageHeaders* default_instance_; + static ClientDownloadRequest_Resource* default_instance_; }; // ------------------------------------------------------------------- -class ClientDownloadRequest : public ::google::protobuf::MessageLite { +class ClientDownloadRequest_CertificateChain_Element : public ::google::protobuf::MessageLite { public: - ClientDownloadRequest(); - virtual ~ClientDownloadRequest(); - - ClientDownloadRequest(const ClientDownloadRequest& from); - - inline ClientDownloadRequest& operator=(const ClientDownloadRequest& from) { + ClientDownloadRequest_CertificateChain_Element(); + virtual ~ClientDownloadRequest_CertificateChain_Element(); + + ClientDownloadRequest_CertificateChain_Element(const ClientDownloadRequest_CertificateChain_Element& from); + + inline ClientDownloadRequest_CertificateChain_Element& operator=(const ClientDownloadRequest_CertificateChain_Element& from) { CopyFrom(from); return *this; } - - static const ClientDownloadRequest& default_instance(); - - void Swap(ClientDownloadRequest* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest_CertificateChain_Element& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest_CertificateChain_Element* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest_CertificateChain_Element* other); + // implements Message ---------------------------------------------- - - ClientDownloadRequest* New() const; + + ClientDownloadRequest_CertificateChain_Element* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadRequest& from); - void MergeFrom(const ClientDownloadRequest& from); + void CopyFrom(const ClientDownloadRequest_CertificateChain_Element& from); + void MergeFrom(const ClientDownloadRequest_CertificateChain_Element& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - - typedef ClientDownloadRequest_Digests Digests; - typedef ClientDownloadRequest_Resource Resource; - typedef ClientDownloadRequest_CertificateChain CertificateChain; - typedef ClientDownloadRequest_SignatureInfo SignatureInfo; - typedef ClientDownloadRequest_PEImageHeaders PEImageHeaders; - typedef ClientDownloadRequest_ImageHeaders ImageHeaders; - - typedef ClientDownloadRequest_ResourceType ResourceType; - static const ResourceType DOWNLOAD_URL = ClientDownloadRequest_ResourceType_DOWNLOAD_URL; - static const ResourceType DOWNLOAD_REDIRECT = ClientDownloadRequest_ResourceType_DOWNLOAD_REDIRECT; - static const ResourceType TAB_URL = ClientDownloadRequest_ResourceType_TAB_URL; - static const ResourceType TAB_REDIRECT = ClientDownloadRequest_ResourceType_TAB_REDIRECT; - static inline bool ResourceType_IsValid(int value) { - return ClientDownloadRequest_ResourceType_IsValid(value); - } - static const ResourceType ResourceType_MIN = - ClientDownloadRequest_ResourceType_ResourceType_MIN; - static const ResourceType ResourceType_MAX = - ClientDownloadRequest_ResourceType_ResourceType_MAX; - static const int ResourceType_ARRAYSIZE = - ClientDownloadRequest_ResourceType_ResourceType_ARRAYSIZE; - - typedef ClientDownloadRequest_DownloadType DownloadType; - static const DownloadType WIN_EXECUTABLE = ClientDownloadRequest_DownloadType_WIN_EXECUTABLE; - static const DownloadType CHROME_EXTENSION = ClientDownloadRequest_DownloadType_CHROME_EXTENSION; - static const DownloadType ANDROID_APK = ClientDownloadRequest_DownloadType_ANDROID_APK; - static const DownloadType ZIPPED_EXECUTABLE = ClientDownloadRequest_DownloadType_ZIPPED_EXECUTABLE; - static const DownloadType MAC_EXECUTABLE = ClientDownloadRequest_DownloadType_MAC_EXECUTABLE; - static inline bool DownloadType_IsValid(int value) { - return ClientDownloadRequest_DownloadType_IsValid(value); - } - static const DownloadType DownloadType_MIN = - ClientDownloadRequest_DownloadType_DownloadType_MIN; - static const DownloadType DownloadType_MAX = - ClientDownloadRequest_DownloadType_DownloadType_MAX; - static const int DownloadType_ARRAYSIZE = - ClientDownloadRequest_DownloadType_DownloadType_ARRAYSIZE; - + // accessors ------------------------------------------------------- - - // required string url = 1; - inline bool has_url() const; - inline void clear_url(); - static const int kUrlFieldNumber = 1; - inline const ::std::string& url() const; - inline void set_url(const ::std::string& value); - inline void set_url(const char* value); - inline void set_url(const char* value, size_t size); - inline ::std::string* mutable_url(); - inline ::std::string* release_url(); - - // required .safe_browsing.ClientDownloadRequest.Digests digests = 2; - inline bool has_digests() const; - inline void clear_digests(); - static const int kDigestsFieldNumber = 2; - inline const ::safe_browsing::ClientDownloadRequest_Digests& digests() const; - inline ::safe_browsing::ClientDownloadRequest_Digests* mutable_digests(); - inline ::safe_browsing::ClientDownloadRequest_Digests* release_digests(); - - // required int64 length = 3; - inline bool has_length() const; - inline void clear_length(); - static const int kLengthFieldNumber = 3; - inline ::google::protobuf::int64 length() const; - inline void set_length(::google::protobuf::int64 value); - - // repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; - inline int resources_size() const; - inline void clear_resources(); - static const int kResourcesFieldNumber = 4; - inline const ::safe_browsing::ClientDownloadRequest_Resource& resources(int index) const; - inline ::safe_browsing::ClientDownloadRequest_Resource* mutable_resources(int index); - inline ::safe_browsing::ClientDownloadRequest_Resource* add_resources(); - inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource >& - resources() const; - inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource >* - mutable_resources(); - - // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; - inline bool has_signature() const; - inline void clear_signature(); - static const int kSignatureFieldNumber = 5; - inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& signature() const; - inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* mutable_signature(); - inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* release_signature(); - - // optional bool user_initiated = 6; - inline bool has_user_initiated() const; - inline void clear_user_initiated(); - static const int kUserInitiatedFieldNumber = 6; - inline bool user_initiated() const; - inline void set_user_initiated(bool value); - - // optional string file_basename = 9; - inline bool has_file_basename() const; - inline void clear_file_basename(); - static const int kFileBasenameFieldNumber = 9; - inline const ::std::string& file_basename() const; - inline void set_file_basename(const ::std::string& value); - inline void set_file_basename(const char* value); - inline void set_file_basename(const char* value, size_t size); - inline ::std::string* mutable_file_basename(); - inline ::std::string* release_file_basename(); - - // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; - inline bool has_download_type() const; - inline void clear_download_type(); - static const int kDownloadTypeFieldNumber = 10; - inline ::safe_browsing::ClientDownloadRequest_DownloadType download_type() const; - inline void set_download_type(::safe_browsing::ClientDownloadRequest_DownloadType value); - - // optional string locale = 11; - inline bool has_locale() const; - inline void clear_locale(); - static const int kLocaleFieldNumber = 11; - inline const ::std::string& locale() const; - inline void set_locale(const ::std::string& value); - inline void set_locale(const char* value); - inline void set_locale(const char* value, size_t size); - inline ::std::string* mutable_locale(); - inline ::std::string* release_locale(); - - // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; - inline bool has_image_headers() const; - inline void clear_image_headers(); - static const int kImageHeadersFieldNumber = 18; - inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& image_headers() const; - inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* mutable_image_headers(); - inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* release_image_headers(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest) + + // optional bytes certificate = 1; + inline bool has_certificate() const; + inline void clear_certificate(); + static const int kCertificateFieldNumber = 1; + inline const ::std::string& certificate() const; + inline void set_certificate(const ::std::string& value); + inline void set_certificate(const char* value); + inline void set_certificate(const void* value, size_t size); + inline ::std::string* mutable_certificate(); + inline ::std::string* release_certificate(); + inline void set_allocated_certificate(::std::string* certificate); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.CertificateChain.Element) private: - inline void set_has_url(); - inline void clear_has_url(); - inline void set_has_digests(); - inline void clear_has_digests(); - inline void set_has_length(); - inline void clear_has_length(); - inline void set_has_signature(); - inline void clear_has_signature(); - inline void set_has_user_initiated(); - inline void clear_has_user_initiated(); - inline void set_has_file_basename(); - inline void clear_has_file_basename(); - inline void set_has_download_type(); - inline void clear_has_download_type(); - inline void set_has_locale(); - inline void clear_has_locale(); - inline void set_has_image_headers(); - inline void clear_has_image_headers(); - - ::std::string* url_; - ::safe_browsing::ClientDownloadRequest_Digests* digests_; - ::google::protobuf::int64 length_; - ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource > resources_; - ::safe_browsing::ClientDownloadRequest_SignatureInfo* signature_; - ::std::string* file_basename_; - bool user_initiated_; - int download_type_; - ::std::string* locale_; - ::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers_; - + inline void set_has_certificate(); + inline void clear_has_certificate(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(10 + 31) / 32]; - + ::std::string* certificate_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else friend void protobuf_AddDesc_csd_2eproto(); + #endif friend void protobuf_AssignDesc_csd_2eproto(); friend void protobuf_ShutdownFile_csd_2eproto(); - + void InitAsDefaultInstance(); - static ClientDownloadRequest* default_instance_; + static ClientDownloadRequest_CertificateChain_Element* default_instance_; }; // ------------------------------------------------------------------- -class ClientDownloadResponse_MoreInfo : public ::google::protobuf::MessageLite { +class ClientDownloadRequest_CertificateChain : public ::google::protobuf::MessageLite { public: - ClientDownloadResponse_MoreInfo(); - virtual ~ClientDownloadResponse_MoreInfo(); - - ClientDownloadResponse_MoreInfo(const ClientDownloadResponse_MoreInfo& from); - - inline ClientDownloadResponse_MoreInfo& operator=(const ClientDownloadResponse_MoreInfo& from) { + ClientDownloadRequest_CertificateChain(); + virtual ~ClientDownloadRequest_CertificateChain(); + + ClientDownloadRequest_CertificateChain(const ClientDownloadRequest_CertificateChain& from); + + inline ClientDownloadRequest_CertificateChain& operator=(const ClientDownloadRequest_CertificateChain& from) { CopyFrom(from); return *this; } - - static const ClientDownloadResponse_MoreInfo& default_instance(); - - void Swap(ClientDownloadResponse_MoreInfo* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest_CertificateChain& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest_CertificateChain* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest_CertificateChain* other); + // implements Message ---------------------------------------------- - - ClientDownloadResponse_MoreInfo* New() const; + + ClientDownloadRequest_CertificateChain* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadResponse_MoreInfo& from); - void MergeFrom(const ClientDownloadResponse_MoreInfo& from); + void CopyFrom(const ClientDownloadRequest_CertificateChain& from); + void MergeFrom(const ClientDownloadRequest_CertificateChain& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - + + typedef ClientDownloadRequest_CertificateChain_Element Element; + // accessors ------------------------------------------------------- - - // optional string description = 1; - inline bool has_description() const; - inline void clear_description(); - static const int kDescriptionFieldNumber = 1; - inline const ::std::string& description() const; - inline void set_description(const ::std::string& value); - inline void set_description(const char* value); - inline void set_description(const char* value, size_t size); - inline ::std::string* mutable_description(); - inline ::std::string* release_description(); - - // optional string url = 2; - inline bool has_url() const; - inline void clear_url(); - static const int kUrlFieldNumber = 2; - inline const ::std::string& url() const; - inline void set_url(const ::std::string& value); - inline void set_url(const char* value); - inline void set_url(const char* value, size_t size); - inline ::std::string* mutable_url(); - inline ::std::string* release_url(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadResponse.MoreInfo) + + // repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; + inline int element_size() const; + inline void clear_element(); + static const int kElementFieldNumber = 1; + inline const ::safe_browsing::ClientDownloadRequest_CertificateChain_Element& element(int index) const; + inline ::safe_browsing::ClientDownloadRequest_CertificateChain_Element* mutable_element(int index); + inline ::safe_browsing::ClientDownloadRequest_CertificateChain_Element* add_element(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element >& + element() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element >* + mutable_element(); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.CertificateChain) private: - inline void set_has_description(); - inline void clear_has_description(); - inline void set_has_url(); - inline void clear_has_url(); - - ::std::string* description_; - ::std::string* url_; - + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; - + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element > element_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else friend void protobuf_AddDesc_csd_2eproto(); + #endif friend void protobuf_AssignDesc_csd_2eproto(); friend void protobuf_ShutdownFile_csd_2eproto(); - + void InitAsDefaultInstance(); - static ClientDownloadResponse_MoreInfo* default_instance_; + static ClientDownloadRequest_CertificateChain* default_instance_; }; // ------------------------------------------------------------------- -class ClientDownloadResponse : public ::google::protobuf::MessageLite { +class ClientDownloadRequest_SignatureInfo : public ::google::protobuf::MessageLite { public: - ClientDownloadResponse(); - virtual ~ClientDownloadResponse(); - - ClientDownloadResponse(const ClientDownloadResponse& from); - - inline ClientDownloadResponse& operator=(const ClientDownloadResponse& from) { + ClientDownloadRequest_SignatureInfo(); + virtual ~ClientDownloadRequest_SignatureInfo(); + + ClientDownloadRequest_SignatureInfo(const ClientDownloadRequest_SignatureInfo& from); + + inline ClientDownloadRequest_SignatureInfo& operator=(const ClientDownloadRequest_SignatureInfo& from) { CopyFrom(from); return *this; } - - static const ClientDownloadResponse& default_instance(); - - void Swap(ClientDownloadResponse* other); - + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest_SignatureInfo& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest_SignatureInfo* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest_SignatureInfo* other); + // implements Message ---------------------------------------------- - - ClientDownloadResponse* New() const; + + ClientDownloadRequest_SignatureInfo* New() const; void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); - void CopyFrom(const ClientDownloadResponse& from); - void MergeFrom(const ClientDownloadResponse& from); + void CopyFrom(const ClientDownloadRequest_SignatureInfo& from); + void MergeFrom(const ClientDownloadRequest_SignatureInfo& from); void Clear(); bool IsInitialized() const; - + int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: - ::std::string GetTypeName() const; - + // nested types ---------------------------------------------------- - - typedef ClientDownloadResponse_MoreInfo MoreInfo; - - typedef ClientDownloadResponse_Verdict Verdict; - static const Verdict SAFE = ClientDownloadResponse_Verdict_SAFE; + + // accessors ------------------------------------------------------- + + // repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; + inline int certificate_chain_size() const; + inline void clear_certificate_chain(); + static const int kCertificateChainFieldNumber = 1; + inline const ::safe_browsing::ClientDownloadRequest_CertificateChain& certificate_chain(int index) const; + inline ::safe_browsing::ClientDownloadRequest_CertificateChain* mutable_certificate_chain(int index); + inline ::safe_browsing::ClientDownloadRequest_CertificateChain* add_certificate_chain(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain >& + certificate_chain() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain >* + mutable_certificate_chain(); + + // optional bool trusted = 2; + inline bool has_trusted() const; + inline void clear_trusted(); + static const int kTrustedFieldNumber = 2; + inline bool trusted() const; + inline void set_trusted(bool value); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.SignatureInfo) + private: + inline void set_has_trusted(); + inline void clear_has_trusted(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain > certificate_chain_; + bool trusted_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadRequest_SignatureInfo* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientDownloadRequest_PEImageHeaders_DebugData : public ::google::protobuf::MessageLite { + public: + ClientDownloadRequest_PEImageHeaders_DebugData(); + virtual ~ClientDownloadRequest_PEImageHeaders_DebugData(); + + ClientDownloadRequest_PEImageHeaders_DebugData(const ClientDownloadRequest_PEImageHeaders_DebugData& from); + + inline ClientDownloadRequest_PEImageHeaders_DebugData& operator=(const ClientDownloadRequest_PEImageHeaders_DebugData& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest_PEImageHeaders_DebugData& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest_PEImageHeaders_DebugData* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest_PEImageHeaders_DebugData* other); + + // implements Message ---------------------------------------------- + + ClientDownloadRequest_PEImageHeaders_DebugData* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientDownloadRequest_PEImageHeaders_DebugData& from); + void MergeFrom(const ClientDownloadRequest_PEImageHeaders_DebugData& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bytes directory_entry = 1; + inline bool has_directory_entry() const; + inline void clear_directory_entry(); + static const int kDirectoryEntryFieldNumber = 1; + inline const ::std::string& directory_entry() const; + inline void set_directory_entry(const ::std::string& value); + inline void set_directory_entry(const char* value); + inline void set_directory_entry(const void* value, size_t size); + inline ::std::string* mutable_directory_entry(); + inline ::std::string* release_directory_entry(); + inline void set_allocated_directory_entry(::std::string* directory_entry); + + // optional bytes raw_data = 2; + inline bool has_raw_data() const; + inline void clear_raw_data(); + static const int kRawDataFieldNumber = 2; + inline const ::std::string& raw_data() const; + inline void set_raw_data(const ::std::string& value); + inline void set_raw_data(const char* value); + inline void set_raw_data(const void* value, size_t size); + inline ::std::string* mutable_raw_data(); + inline ::std::string* release_raw_data(); + inline void set_allocated_raw_data(::std::string* raw_data); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData) + private: + inline void set_has_directory_entry(); + inline void clear_has_directory_entry(); + inline void set_has_raw_data(); + inline void clear_has_raw_data(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* directory_entry_; + ::std::string* raw_data_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadRequest_PEImageHeaders_DebugData* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientDownloadRequest_PEImageHeaders : public ::google::protobuf::MessageLite { + public: + ClientDownloadRequest_PEImageHeaders(); + virtual ~ClientDownloadRequest_PEImageHeaders(); + + ClientDownloadRequest_PEImageHeaders(const ClientDownloadRequest_PEImageHeaders& from); + + inline ClientDownloadRequest_PEImageHeaders& operator=(const ClientDownloadRequest_PEImageHeaders& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest_PEImageHeaders& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest_PEImageHeaders* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest_PEImageHeaders* other); + + // implements Message ---------------------------------------------- + + ClientDownloadRequest_PEImageHeaders* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientDownloadRequest_PEImageHeaders& from); + void MergeFrom(const ClientDownloadRequest_PEImageHeaders& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientDownloadRequest_PEImageHeaders_DebugData DebugData; + + // accessors ------------------------------------------------------- + + // optional bytes dos_header = 1; + inline bool has_dos_header() const; + inline void clear_dos_header(); + static const int kDosHeaderFieldNumber = 1; + inline const ::std::string& dos_header() const; + inline void set_dos_header(const ::std::string& value); + inline void set_dos_header(const char* value); + inline void set_dos_header(const void* value, size_t size); + inline ::std::string* mutable_dos_header(); + inline ::std::string* release_dos_header(); + inline void set_allocated_dos_header(::std::string* dos_header); + + // optional bytes file_header = 2; + inline bool has_file_header() const; + inline void clear_file_header(); + static const int kFileHeaderFieldNumber = 2; + inline const ::std::string& file_header() const; + inline void set_file_header(const ::std::string& value); + inline void set_file_header(const char* value); + inline void set_file_header(const void* value, size_t size); + inline ::std::string* mutable_file_header(); + inline ::std::string* release_file_header(); + inline void set_allocated_file_header(::std::string* file_header); + + // optional bytes optional_headers32 = 3; + inline bool has_optional_headers32() const; + inline void clear_optional_headers32(); + static const int kOptionalHeaders32FieldNumber = 3; + inline const ::std::string& optional_headers32() const; + inline void set_optional_headers32(const ::std::string& value); + inline void set_optional_headers32(const char* value); + inline void set_optional_headers32(const void* value, size_t size); + inline ::std::string* mutable_optional_headers32(); + inline ::std::string* release_optional_headers32(); + inline void set_allocated_optional_headers32(::std::string* optional_headers32); + + // optional bytes optional_headers64 = 4; + inline bool has_optional_headers64() const; + inline void clear_optional_headers64(); + static const int kOptionalHeaders64FieldNumber = 4; + inline const ::std::string& optional_headers64() const; + inline void set_optional_headers64(const ::std::string& value); + inline void set_optional_headers64(const char* value); + inline void set_optional_headers64(const void* value, size_t size); + inline ::std::string* mutable_optional_headers64(); + inline ::std::string* release_optional_headers64(); + inline void set_allocated_optional_headers64(::std::string* optional_headers64); + + // repeated bytes section_header = 5; + inline int section_header_size() const; + inline void clear_section_header(); + static const int kSectionHeaderFieldNumber = 5; + inline const ::std::string& section_header(int index) const; + inline ::std::string* mutable_section_header(int index); + inline void set_section_header(int index, const ::std::string& value); + inline void set_section_header(int index, const char* value); + inline void set_section_header(int index, const void* value, size_t size); + inline ::std::string* add_section_header(); + inline void add_section_header(const ::std::string& value); + inline void add_section_header(const char* value); + inline void add_section_header(const void* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& section_header() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_section_header(); + + // optional bytes export_section_data = 6; + inline bool has_export_section_data() const; + inline void clear_export_section_data(); + static const int kExportSectionDataFieldNumber = 6; + inline const ::std::string& export_section_data() const; + inline void set_export_section_data(const ::std::string& value); + inline void set_export_section_data(const char* value); + inline void set_export_section_data(const void* value, size_t size); + inline ::std::string* mutable_export_section_data(); + inline ::std::string* release_export_section_data(); + inline void set_allocated_export_section_data(::std::string* export_section_data); + + // repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; + inline int debug_data_size() const; + inline void clear_debug_data(); + static const int kDebugDataFieldNumber = 7; + inline const ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData& debug_data(int index) const; + inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData* mutable_debug_data(int index); + inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData* add_debug_data(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData >& + debug_data() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData >* + mutable_debug_data(); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.PEImageHeaders) + private: + inline void set_has_dos_header(); + inline void clear_has_dos_header(); + inline void set_has_file_header(); + inline void clear_has_file_header(); + inline void set_has_optional_headers32(); + inline void clear_has_optional_headers32(); + inline void set_has_optional_headers64(); + inline void clear_has_optional_headers64(); + inline void set_has_export_section_data(); + inline void clear_has_export_section_data(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* dos_header_; + ::std::string* file_header_; + ::std::string* optional_headers32_; + ::std::string* optional_headers64_; + ::google::protobuf::RepeatedPtrField< ::std::string> section_header_; + ::std::string* export_section_data_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData > debug_data_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadRequest_PEImageHeaders* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientDownloadRequest_ImageHeaders : public ::google::protobuf::MessageLite { + public: + ClientDownloadRequest_ImageHeaders(); + virtual ~ClientDownloadRequest_ImageHeaders(); + + ClientDownloadRequest_ImageHeaders(const ClientDownloadRequest_ImageHeaders& from); + + inline ClientDownloadRequest_ImageHeaders& operator=(const ClientDownloadRequest_ImageHeaders& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest_ImageHeaders& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest_ImageHeaders* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest_ImageHeaders* other); + + // implements Message ---------------------------------------------- + + ClientDownloadRequest_ImageHeaders* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientDownloadRequest_ImageHeaders& from); + void MergeFrom(const ClientDownloadRequest_ImageHeaders& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; + inline bool has_pe_headers() const; + inline void clear_pe_headers(); + static const int kPeHeadersFieldNumber = 1; + inline const ::safe_browsing::ClientDownloadRequest_PEImageHeaders& pe_headers() const; + inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders* mutable_pe_headers(); + inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders* release_pe_headers(); + inline void set_allocated_pe_headers(::safe_browsing::ClientDownloadRequest_PEImageHeaders* pe_headers); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.ImageHeaders) + private: + inline void set_has_pe_headers(); + inline void clear_has_pe_headers(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::safe_browsing::ClientDownloadRequest_PEImageHeaders* pe_headers_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadRequest_ImageHeaders* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientDownloadRequest_ArchivedBinary : public ::google::protobuf::MessageLite { + public: + ClientDownloadRequest_ArchivedBinary(); + virtual ~ClientDownloadRequest_ArchivedBinary(); + + ClientDownloadRequest_ArchivedBinary(const ClientDownloadRequest_ArchivedBinary& from); + + inline ClientDownloadRequest_ArchivedBinary& operator=(const ClientDownloadRequest_ArchivedBinary& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest_ArchivedBinary& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest_ArchivedBinary* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest_ArchivedBinary* other); + + // implements Message ---------------------------------------------- + + ClientDownloadRequest_ArchivedBinary* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientDownloadRequest_ArchivedBinary& from); + void MergeFrom(const ClientDownloadRequest_ArchivedBinary& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string file_basename = 1; + inline bool has_file_basename() const; + inline void clear_file_basename(); + static const int kFileBasenameFieldNumber = 1; + inline const ::std::string& file_basename() const; + inline void set_file_basename(const ::std::string& value); + inline void set_file_basename(const char* value); + inline void set_file_basename(const char* value, size_t size); + inline ::std::string* mutable_file_basename(); + inline ::std::string* release_file_basename(); + inline void set_allocated_file_basename(::std::string* file_basename); + + // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 2; + inline bool has_download_type() const; + inline void clear_download_type(); + static const int kDownloadTypeFieldNumber = 2; + inline ::safe_browsing::ClientDownloadRequest_DownloadType download_type() const; + inline void set_download_type(::safe_browsing::ClientDownloadRequest_DownloadType value); + + // optional .safe_browsing.ClientDownloadRequest.Digests digests = 3; + inline bool has_digests() const; + inline void clear_digests(); + static const int kDigestsFieldNumber = 3; + inline const ::safe_browsing::ClientDownloadRequest_Digests& digests() const; + inline ::safe_browsing::ClientDownloadRequest_Digests* mutable_digests(); + inline ::safe_browsing::ClientDownloadRequest_Digests* release_digests(); + inline void set_allocated_digests(::safe_browsing::ClientDownloadRequest_Digests* digests); + + // optional int64 length = 4; + inline bool has_length() const; + inline void clear_length(); + static const int kLengthFieldNumber = 4; + inline ::google::protobuf::int64 length() const; + inline void set_length(::google::protobuf::int64 value); + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + inline bool has_signature() const; + inline void clear_signature(); + static const int kSignatureFieldNumber = 5; + inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& signature() const; + inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* mutable_signature(); + inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* release_signature(); + inline void set_allocated_signature(::safe_browsing::ClientDownloadRequest_SignatureInfo* signature); + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; + inline bool has_image_headers() const; + inline void clear_image_headers(); + static const int kImageHeadersFieldNumber = 6; + inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& image_headers() const; + inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* mutable_image_headers(); + inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* release_image_headers(); + inline void set_allocated_image_headers(::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest.ArchivedBinary) + private: + inline void set_has_file_basename(); + inline void clear_has_file_basename(); + inline void set_has_download_type(); + inline void clear_has_download_type(); + inline void set_has_digests(); + inline void clear_has_digests(); + inline void set_has_length(); + inline void clear_has_length(); + inline void set_has_signature(); + inline void clear_has_signature(); + inline void set_has_image_headers(); + inline void clear_has_image_headers(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* file_basename_; + ::safe_browsing::ClientDownloadRequest_Digests* digests_; + ::google::protobuf::int64 length_; + ::safe_browsing::ClientDownloadRequest_SignatureInfo* signature_; + ::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers_; + int download_type_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadRequest_ArchivedBinary* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientDownloadRequest : public ::google::protobuf::MessageLite { + public: + ClientDownloadRequest(); + virtual ~ClientDownloadRequest(); + + ClientDownloadRequest(const ClientDownloadRequest& from); + + inline ClientDownloadRequest& operator=(const ClientDownloadRequest& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadRequest& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadRequest* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadRequest* other); + + // implements Message ---------------------------------------------- + + ClientDownloadRequest* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientDownloadRequest& from); + void MergeFrom(const ClientDownloadRequest& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientDownloadRequest_Digests Digests; + typedef ClientDownloadRequest_Resource Resource; + typedef ClientDownloadRequest_CertificateChain CertificateChain; + typedef ClientDownloadRequest_SignatureInfo SignatureInfo; + typedef ClientDownloadRequest_PEImageHeaders PEImageHeaders; + typedef ClientDownloadRequest_ImageHeaders ImageHeaders; + typedef ClientDownloadRequest_ArchivedBinary ArchivedBinary; + + typedef ClientDownloadRequest_ResourceType ResourceType; + static const ResourceType DOWNLOAD_URL = ClientDownloadRequest_ResourceType_DOWNLOAD_URL; + static const ResourceType DOWNLOAD_REDIRECT = ClientDownloadRequest_ResourceType_DOWNLOAD_REDIRECT; + static const ResourceType TAB_URL = ClientDownloadRequest_ResourceType_TAB_URL; + static const ResourceType TAB_REDIRECT = ClientDownloadRequest_ResourceType_TAB_REDIRECT; + static inline bool ResourceType_IsValid(int value) { + return ClientDownloadRequest_ResourceType_IsValid(value); + } + static const ResourceType ResourceType_MIN = + ClientDownloadRequest_ResourceType_ResourceType_MIN; + static const ResourceType ResourceType_MAX = + ClientDownloadRequest_ResourceType_ResourceType_MAX; + static const int ResourceType_ARRAYSIZE = + ClientDownloadRequest_ResourceType_ResourceType_ARRAYSIZE; + + typedef ClientDownloadRequest_DownloadType DownloadType; + static const DownloadType WIN_EXECUTABLE = ClientDownloadRequest_DownloadType_WIN_EXECUTABLE; + static const DownloadType CHROME_EXTENSION = ClientDownloadRequest_DownloadType_CHROME_EXTENSION; + static const DownloadType ANDROID_APK = ClientDownloadRequest_DownloadType_ANDROID_APK; + static const DownloadType ZIPPED_EXECUTABLE = ClientDownloadRequest_DownloadType_ZIPPED_EXECUTABLE; + static const DownloadType MAC_EXECUTABLE = ClientDownloadRequest_DownloadType_MAC_EXECUTABLE; + static inline bool DownloadType_IsValid(int value) { + return ClientDownloadRequest_DownloadType_IsValid(value); + } + static const DownloadType DownloadType_MIN = + ClientDownloadRequest_DownloadType_DownloadType_MIN; + static const DownloadType DownloadType_MAX = + ClientDownloadRequest_DownloadType_DownloadType_MAX; + static const int DownloadType_ARRAYSIZE = + ClientDownloadRequest_DownloadType_DownloadType_ARRAYSIZE; + + // accessors ------------------------------------------------------- + + // required string url = 1; + inline bool has_url() const; + inline void clear_url(); + static const int kUrlFieldNumber = 1; + inline const ::std::string& url() const; + inline void set_url(const ::std::string& value); + inline void set_url(const char* value); + inline void set_url(const char* value, size_t size); + inline ::std::string* mutable_url(); + inline ::std::string* release_url(); + inline void set_allocated_url(::std::string* url); + + // required .safe_browsing.ClientDownloadRequest.Digests digests = 2; + inline bool has_digests() const; + inline void clear_digests(); + static const int kDigestsFieldNumber = 2; + inline const ::safe_browsing::ClientDownloadRequest_Digests& digests() const; + inline ::safe_browsing::ClientDownloadRequest_Digests* mutable_digests(); + inline ::safe_browsing::ClientDownloadRequest_Digests* release_digests(); + inline void set_allocated_digests(::safe_browsing::ClientDownloadRequest_Digests* digests); + + // required int64 length = 3; + inline bool has_length() const; + inline void clear_length(); + static const int kLengthFieldNumber = 3; + inline ::google::protobuf::int64 length() const; + inline void set_length(::google::protobuf::int64 value); + + // repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; + inline int resources_size() const; + inline void clear_resources(); + static const int kResourcesFieldNumber = 4; + inline const ::safe_browsing::ClientDownloadRequest_Resource& resources(int index) const; + inline ::safe_browsing::ClientDownloadRequest_Resource* mutable_resources(int index); + inline ::safe_browsing::ClientDownloadRequest_Resource* add_resources(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource >& + resources() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource >* + mutable_resources(); + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + inline bool has_signature() const; + inline void clear_signature(); + static const int kSignatureFieldNumber = 5; + inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& signature() const; + inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* mutable_signature(); + inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* release_signature(); + inline void set_allocated_signature(::safe_browsing::ClientDownloadRequest_SignatureInfo* signature); + + // optional bool user_initiated = 6; + inline bool has_user_initiated() const; + inline void clear_user_initiated(); + static const int kUserInitiatedFieldNumber = 6; + inline bool user_initiated() const; + inline void set_user_initiated(bool value); + + // optional string file_basename = 9; + inline bool has_file_basename() const; + inline void clear_file_basename(); + static const int kFileBasenameFieldNumber = 9; + inline const ::std::string& file_basename() const; + inline void set_file_basename(const ::std::string& value); + inline void set_file_basename(const char* value); + inline void set_file_basename(const char* value, size_t size); + inline ::std::string* mutable_file_basename(); + inline ::std::string* release_file_basename(); + inline void set_allocated_file_basename(::std::string* file_basename); + + // optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; + inline bool has_download_type() const; + inline void clear_download_type(); + static const int kDownloadTypeFieldNumber = 10; + inline ::safe_browsing::ClientDownloadRequest_DownloadType download_type() const; + inline void set_download_type(::safe_browsing::ClientDownloadRequest_DownloadType value); + + // optional string locale = 11; + inline bool has_locale() const; + inline void clear_locale(); + static const int kLocaleFieldNumber = 11; + inline const ::std::string& locale() const; + inline void set_locale(const ::std::string& value); + inline void set_locale(const char* value); + inline void set_locale(const char* value, size_t size); + inline ::std::string* mutable_locale(); + inline ::std::string* release_locale(); + inline void set_allocated_locale(::std::string* locale); + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; + inline bool has_image_headers() const; + inline void clear_image_headers(); + static const int kImageHeadersFieldNumber = 18; + inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& image_headers() const; + inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* mutable_image_headers(); + inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* release_image_headers(); + inline void set_allocated_image_headers(::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers); + + // repeated .safe_browsing.ClientDownloadRequest.ArchivedBinary archived_binary = 22; + inline int archived_binary_size() const; + inline void clear_archived_binary(); + static const int kArchivedBinaryFieldNumber = 22; + inline const ::safe_browsing::ClientDownloadRequest_ArchivedBinary& archived_binary(int index) const; + inline ::safe_browsing::ClientDownloadRequest_ArchivedBinary* mutable_archived_binary(int index); + inline ::safe_browsing::ClientDownloadRequest_ArchivedBinary* add_archived_binary(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_ArchivedBinary >& + archived_binary() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_ArchivedBinary >* + mutable_archived_binary(); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadRequest) + private: + inline void set_has_url(); + inline void clear_has_url(); + inline void set_has_digests(); + inline void clear_has_digests(); + inline void set_has_length(); + inline void clear_has_length(); + inline void set_has_signature(); + inline void clear_has_signature(); + inline void set_has_user_initiated(); + inline void clear_has_user_initiated(); + inline void set_has_file_basename(); + inline void clear_has_file_basename(); + inline void set_has_download_type(); + inline void clear_has_download_type(); + inline void set_has_locale(); + inline void clear_has_locale(); + inline void set_has_image_headers(); + inline void clear_has_image_headers(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* url_; + ::safe_browsing::ClientDownloadRequest_Digests* digests_; + ::google::protobuf::int64 length_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource > resources_; + ::safe_browsing::ClientDownloadRequest_SignatureInfo* signature_; + ::std::string* file_basename_; + bool user_initiated_; + int download_type_; + ::std::string* locale_; + ::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_ArchivedBinary > archived_binary_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadRequest* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientDownloadResponse_MoreInfo : public ::google::protobuf::MessageLite { + public: + ClientDownloadResponse_MoreInfo(); + virtual ~ClientDownloadResponse_MoreInfo(); + + ClientDownloadResponse_MoreInfo(const ClientDownloadResponse_MoreInfo& from); + + inline ClientDownloadResponse_MoreInfo& operator=(const ClientDownloadResponse_MoreInfo& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadResponse_MoreInfo& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadResponse_MoreInfo* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadResponse_MoreInfo* other); + + // implements Message ---------------------------------------------- + + ClientDownloadResponse_MoreInfo* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientDownloadResponse_MoreInfo& from); + void MergeFrom(const ClientDownloadResponse_MoreInfo& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string description = 1; + inline bool has_description() const; + inline void clear_description(); + static const int kDescriptionFieldNumber = 1; + inline const ::std::string& description() const; + inline void set_description(const ::std::string& value); + inline void set_description(const char* value); + inline void set_description(const char* value, size_t size); + inline ::std::string* mutable_description(); + inline ::std::string* release_description(); + inline void set_allocated_description(::std::string* description); + + // optional string url = 2; + inline bool has_url() const; + inline void clear_url(); + static const int kUrlFieldNumber = 2; + inline const ::std::string& url() const; + inline void set_url(const ::std::string& value); + inline void set_url(const char* value); + inline void set_url(const char* value, size_t size); + inline ::std::string* mutable_url(); + inline ::std::string* release_url(); + inline void set_allocated_url(::std::string* url); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadResponse.MoreInfo) + private: + inline void set_has_description(); + inline void clear_has_description(); + inline void set_has_url(); + inline void clear_has_url(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* description_; + ::std::string* url_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadResponse_MoreInfo* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientDownloadResponse : public ::google::protobuf::MessageLite { + public: + ClientDownloadResponse(); + virtual ~ClientDownloadResponse(); + + ClientDownloadResponse(const ClientDownloadResponse& from); + + inline ClientDownloadResponse& operator=(const ClientDownloadResponse& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadResponse& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadResponse* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadResponse* other); + + // implements Message ---------------------------------------------- + + ClientDownloadResponse* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientDownloadResponse& from); + void MergeFrom(const ClientDownloadResponse& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientDownloadResponse_MoreInfo MoreInfo; + + typedef ClientDownloadResponse_Verdict Verdict; + static const Verdict SAFE = ClientDownloadResponse_Verdict_SAFE; static const Verdict DANGEROUS = ClientDownloadResponse_Verdict_DANGEROUS; static const Verdict UNCOMMON = ClientDownloadResponse_Verdict_UNCOMMON; static const Verdict POTENTIALLY_UNWANTED = ClientDownloadResponse_Verdict_POTENTIALLY_UNWANTED; @@ -1193,1694 +2523,10078 @@ class ClientDownloadResponse : public ::google::protobuf::MessageLite { static inline bool Verdict_IsValid(int value) { return ClientDownloadResponse_Verdict_IsValid(value); } - static const Verdict Verdict_MIN = - ClientDownloadResponse_Verdict_Verdict_MIN; - static const Verdict Verdict_MAX = - ClientDownloadResponse_Verdict_Verdict_MAX; - static const int Verdict_ARRAYSIZE = - ClientDownloadResponse_Verdict_Verdict_ARRAYSIZE; - - // accessors ------------------------------------------------------- - - // required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; - inline bool has_verdict() const; - inline void clear_verdict(); - static const int kVerdictFieldNumber = 1; - inline ::safe_browsing::ClientDownloadResponse_Verdict verdict() const; - inline void set_verdict(::safe_browsing::ClientDownloadResponse_Verdict value); - - // optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; - inline bool has_more_info() const; - inline void clear_more_info(); - static const int kMoreInfoFieldNumber = 2; - inline const ::safe_browsing::ClientDownloadResponse_MoreInfo& more_info() const; - inline ::safe_browsing::ClientDownloadResponse_MoreInfo* mutable_more_info(); - inline ::safe_browsing::ClientDownloadResponse_MoreInfo* release_more_info(); - - // optional bytes token = 3; - inline bool has_token() const; - inline void clear_token(); - static const int kTokenFieldNumber = 3; - inline const ::std::string& token() const; - inline void set_token(const ::std::string& value); - inline void set_token(const char* value); - inline void set_token(const void* value, size_t size); - inline ::std::string* mutable_token(); - inline ::std::string* release_token(); - - // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadResponse) - private: - inline void set_has_verdict(); - inline void clear_has_verdict(); - inline void set_has_more_info(); - inline void clear_has_more_info(); - inline void set_has_token(); - inline void clear_has_token(); - - ::safe_browsing::ClientDownloadResponse_MoreInfo* more_info_; - ::std::string* token_; - int verdict_; - - mutable int _cached_size_; - ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; - - friend void protobuf_AddDesc_csd_2eproto(); - friend void protobuf_AssignDesc_csd_2eproto(); - friend void protobuf_ShutdownFile_csd_2eproto(); - - void InitAsDefaultInstance(); - static ClientDownloadResponse* default_instance_; -}; -// =================================================================== + static const Verdict Verdict_MIN = + ClientDownloadResponse_Verdict_Verdict_MIN; + static const Verdict Verdict_MAX = + ClientDownloadResponse_Verdict_Verdict_MAX; + static const int Verdict_ARRAYSIZE = + ClientDownloadResponse_Verdict_Verdict_ARRAYSIZE; + + // accessors ------------------------------------------------------- + + // required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; + inline bool has_verdict() const; + inline void clear_verdict(); + static const int kVerdictFieldNumber = 1; + inline ::safe_browsing::ClientDownloadResponse_Verdict verdict() const; + inline void set_verdict(::safe_browsing::ClientDownloadResponse_Verdict value); + + // optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; + inline bool has_more_info() const; + inline void clear_more_info(); + static const int kMoreInfoFieldNumber = 2; + inline const ::safe_browsing::ClientDownloadResponse_MoreInfo& more_info() const; + inline ::safe_browsing::ClientDownloadResponse_MoreInfo* mutable_more_info(); + inline ::safe_browsing::ClientDownloadResponse_MoreInfo* release_more_info(); + inline void set_allocated_more_info(::safe_browsing::ClientDownloadResponse_MoreInfo* more_info); + + // optional bytes token = 3; + inline bool has_token() const; + inline void clear_token(); + static const int kTokenFieldNumber = 3; + inline const ::std::string& token() const; + inline void set_token(const ::std::string& value); + inline void set_token(const char* value); + inline void set_token(const void* value, size_t size); + inline ::std::string* mutable_token(); + inline ::std::string* release_token(); + inline void set_allocated_token(::std::string* token); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadResponse) + private: + inline void set_has_verdict(); + inline void clear_has_verdict(); + inline void set_has_more_info(); + inline void clear_has_more_info(); + inline void set_has_token(); + inline void clear_has_token(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::safe_browsing::ClientDownloadResponse_MoreInfo* more_info_; + ::std::string* token_; + int verdict_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadResponse* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientDownloadReport_UserInformation : public ::google::protobuf::MessageLite { + public: + ClientDownloadReport_UserInformation(); + virtual ~ClientDownloadReport_UserInformation(); + + ClientDownloadReport_UserInformation(const ClientDownloadReport_UserInformation& from); + + inline ClientDownloadReport_UserInformation& operator=(const ClientDownloadReport_UserInformation& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadReport_UserInformation& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadReport_UserInformation* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadReport_UserInformation* other); + + // implements Message ---------------------------------------------- + + ClientDownloadReport_UserInformation* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientDownloadReport_UserInformation& from); + void MergeFrom(const ClientDownloadReport_UserInformation& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string email = 1; + inline bool has_email() const; + inline void clear_email(); + static const int kEmailFieldNumber = 1; + inline const ::std::string& email() const; + inline void set_email(const ::std::string& value); + inline void set_email(const char* value); + inline void set_email(const char* value, size_t size); + inline ::std::string* mutable_email(); + inline ::std::string* release_email(); + inline void set_allocated_email(::std::string* email); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadReport.UserInformation) + private: + inline void set_has_email(); + inline void clear_has_email(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* email_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadReport_UserInformation* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientDownloadReport : public ::google::protobuf::MessageLite { + public: + ClientDownloadReport(); + virtual ~ClientDownloadReport(); + + ClientDownloadReport(const ClientDownloadReport& from); + + inline ClientDownloadReport& operator=(const ClientDownloadReport& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientDownloadReport& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientDownloadReport* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientDownloadReport* other); + + // implements Message ---------------------------------------------- + + ClientDownloadReport* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientDownloadReport& from); + void MergeFrom(const ClientDownloadReport& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientDownloadReport_UserInformation UserInformation; + + typedef ClientDownloadReport_Reason Reason; + static const Reason SHARE = ClientDownloadReport_Reason_SHARE; + static const Reason FALSE_POSITIVE = ClientDownloadReport_Reason_FALSE_POSITIVE; + static const Reason APPEAL = ClientDownloadReport_Reason_APPEAL; + static inline bool Reason_IsValid(int value) { + return ClientDownloadReport_Reason_IsValid(value); + } + static const Reason Reason_MIN = + ClientDownloadReport_Reason_Reason_MIN; + static const Reason Reason_MAX = + ClientDownloadReport_Reason_Reason_MAX; + static const int Reason_ARRAYSIZE = + ClientDownloadReport_Reason_Reason_ARRAYSIZE; + + // accessors ------------------------------------------------------- + + // optional .safe_browsing.ClientDownloadReport.Reason reason = 1; + inline bool has_reason() const; + inline void clear_reason(); + static const int kReasonFieldNumber = 1; + inline ::safe_browsing::ClientDownloadReport_Reason reason() const; + inline void set_reason(::safe_browsing::ClientDownloadReport_Reason value); + + // optional .safe_browsing.ClientDownloadRequest download_request = 2; + inline bool has_download_request() const; + inline void clear_download_request(); + static const int kDownloadRequestFieldNumber = 2; + inline const ::safe_browsing::ClientDownloadRequest& download_request() const; + inline ::safe_browsing::ClientDownloadRequest* mutable_download_request(); + inline ::safe_browsing::ClientDownloadRequest* release_download_request(); + inline void set_allocated_download_request(::safe_browsing::ClientDownloadRequest* download_request); + + // optional .safe_browsing.ClientDownloadReport.UserInformation user_information = 3; + inline bool has_user_information() const; + inline void clear_user_information(); + static const int kUserInformationFieldNumber = 3; + inline const ::safe_browsing::ClientDownloadReport_UserInformation& user_information() const; + inline ::safe_browsing::ClientDownloadReport_UserInformation* mutable_user_information(); + inline ::safe_browsing::ClientDownloadReport_UserInformation* release_user_information(); + inline void set_allocated_user_information(::safe_browsing::ClientDownloadReport_UserInformation* user_information); + + // optional bytes comment = 4; + inline bool has_comment() const; + inline void clear_comment(); + static const int kCommentFieldNumber = 4; + inline const ::std::string& comment() const; + inline void set_comment(const ::std::string& value); + inline void set_comment(const char* value); + inline void set_comment(const void* value, size_t size); + inline ::std::string* mutable_comment(); + inline ::std::string* release_comment(); + inline void set_allocated_comment(::std::string* comment); + + // optional .safe_browsing.ClientDownloadResponse download_response = 5; + inline bool has_download_response() const; + inline void clear_download_response(); + static const int kDownloadResponseFieldNumber = 5; + inline const ::safe_browsing::ClientDownloadResponse& download_response() const; + inline ::safe_browsing::ClientDownloadResponse* mutable_download_response(); + inline ::safe_browsing::ClientDownloadResponse* release_download_response(); + inline void set_allocated_download_response(::safe_browsing::ClientDownloadResponse* download_response); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientDownloadReport) + private: + inline void set_has_reason(); + inline void clear_has_reason(); + inline void set_has_download_request(); + inline void clear_has_download_request(); + inline void set_has_user_information(); + inline void clear_has_user_information(); + inline void set_has_comment(); + inline void clear_has_comment(); + inline void set_has_download_response(); + inline void clear_has_download_response(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::safe_browsing::ClientDownloadRequest* download_request_; + ::safe_browsing::ClientDownloadReport_UserInformation* user_information_; + ::std::string* comment_; + ::safe_browsing::ClientDownloadResponse* download_response_; + int reason_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientDownloadReport* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientUploadResponse : public ::google::protobuf::MessageLite { + public: + ClientUploadResponse(); + virtual ~ClientUploadResponse(); + + ClientUploadResponse(const ClientUploadResponse& from); + + inline ClientUploadResponse& operator=(const ClientUploadResponse& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientUploadResponse& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientUploadResponse* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientUploadResponse* other); + + // implements Message ---------------------------------------------- + + ClientUploadResponse* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientUploadResponse& from); + void MergeFrom(const ClientUploadResponse& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientUploadResponse_UploadStatus UploadStatus; + static const UploadStatus SUCCESS = ClientUploadResponse_UploadStatus_SUCCESS; + static const UploadStatus UPLOAD_FAILURE = ClientUploadResponse_UploadStatus_UPLOAD_FAILURE; + static inline bool UploadStatus_IsValid(int value) { + return ClientUploadResponse_UploadStatus_IsValid(value); + } + static const UploadStatus UploadStatus_MIN = + ClientUploadResponse_UploadStatus_UploadStatus_MIN; + static const UploadStatus UploadStatus_MAX = + ClientUploadResponse_UploadStatus_UploadStatus_MAX; + static const int UploadStatus_ARRAYSIZE = + ClientUploadResponse_UploadStatus_UploadStatus_ARRAYSIZE; + + // accessors ------------------------------------------------------- + + // optional .safe_browsing.ClientUploadResponse.UploadStatus status = 1; + inline bool has_status() const; + inline void clear_status(); + static const int kStatusFieldNumber = 1; + inline ::safe_browsing::ClientUploadResponse_UploadStatus status() const; + inline void set_status(::safe_browsing::ClientUploadResponse_UploadStatus value); + + // optional string permalink = 2; + inline bool has_permalink() const; + inline void clear_permalink(); + static const int kPermalinkFieldNumber = 2; + inline const ::std::string& permalink() const; + inline void set_permalink(const ::std::string& value); + inline void set_permalink(const char* value); + inline void set_permalink(const char* value, size_t size); + inline ::std::string* mutable_permalink(); + inline ::std::string* release_permalink(); + inline void set_allocated_permalink(::std::string* permalink); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientUploadResponse) + private: + inline void set_has_status(); + inline void clear_has_status(); + inline void set_has_permalink(); + inline void clear_has_permalink(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* permalink_; + int status_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientUploadResponse* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_IncidentData_TrackedPreferenceIncident : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_IncidentData_TrackedPreferenceIncident(); + virtual ~ClientIncidentReport_IncidentData_TrackedPreferenceIncident(); + + ClientIncidentReport_IncidentData_TrackedPreferenceIncident(const ClientIncidentReport_IncidentData_TrackedPreferenceIncident& from); + + inline ClientIncidentReport_IncidentData_TrackedPreferenceIncident& operator=(const ClientIncidentReport_IncidentData_TrackedPreferenceIncident& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_IncidentData_TrackedPreferenceIncident& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_IncidentData_TrackedPreferenceIncident* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_IncidentData_TrackedPreferenceIncident* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_IncidentData_TrackedPreferenceIncident* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_IncidentData_TrackedPreferenceIncident& from); + void MergeFrom(const ClientIncidentReport_IncidentData_TrackedPreferenceIncident& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ValueState; + static const ValueState UNKNOWN = ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_UNKNOWN; + static const ValueState CLEARED = ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_CLEARED; + static const ValueState WEAK_LEGACY_OBSOLETE = ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_WEAK_LEGACY_OBSOLETE; + static const ValueState CHANGED = ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_CHANGED; + static const ValueState UNTRUSTED_UNKNOWN_VALUE = ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_UNTRUSTED_UNKNOWN_VALUE; + static inline bool ValueState_IsValid(int value) { + return ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_IsValid(value); + } + static const ValueState ValueState_MIN = + ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_ValueState_MIN; + static const ValueState ValueState_MAX = + ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_ValueState_MAX; + static const int ValueState_ARRAYSIZE = + ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_ValueState_ARRAYSIZE; + + // accessors ------------------------------------------------------- + + // optional string path = 1; + inline bool has_path() const; + inline void clear_path(); + static const int kPathFieldNumber = 1; + inline const ::std::string& path() const; + inline void set_path(const ::std::string& value); + inline void set_path(const char* value); + inline void set_path(const char* value, size_t size); + inline ::std::string* mutable_path(); + inline ::std::string* release_path(); + inline void set_allocated_path(::std::string* path); + + // optional string atomic_value = 2; + inline bool has_atomic_value() const; + inline void clear_atomic_value(); + static const int kAtomicValueFieldNumber = 2; + inline const ::std::string& atomic_value() const; + inline void set_atomic_value(const ::std::string& value); + inline void set_atomic_value(const char* value); + inline void set_atomic_value(const char* value, size_t size); + inline ::std::string* mutable_atomic_value(); + inline ::std::string* release_atomic_value(); + inline void set_allocated_atomic_value(::std::string* atomic_value); + + // repeated string split_key = 3; + inline int split_key_size() const; + inline void clear_split_key(); + static const int kSplitKeyFieldNumber = 3; + inline const ::std::string& split_key(int index) const; + inline ::std::string* mutable_split_key(int index); + inline void set_split_key(int index, const ::std::string& value); + inline void set_split_key(int index, const char* value); + inline void set_split_key(int index, const char* value, size_t size); + inline ::std::string* add_split_key(); + inline void add_split_key(const ::std::string& value); + inline void add_split_key(const char* value); + inline void add_split_key(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& split_key() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_split_key(); + + // optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.ValueState value_state = 4; + inline bool has_value_state() const; + inline void clear_value_state(); + static const int kValueStateFieldNumber = 4; + inline ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState value_state() const; + inline void set_value_state(::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState value); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident) + private: + inline void set_has_path(); + inline void clear_has_path(); + inline void set_has_atomic_value(); + inline void clear_has_atomic_value(); + inline void set_has_value_state(); + inline void clear_has_value_state(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* path_; + ::std::string* atomic_value_; + ::google::protobuf::RepeatedPtrField< ::std::string> split_key_; + int value_state_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_IncidentData_TrackedPreferenceIncident* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_IncidentData_BinaryIntegrityIncident : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_IncidentData_BinaryIntegrityIncident(); + virtual ~ClientIncidentReport_IncidentData_BinaryIntegrityIncident(); + + ClientIncidentReport_IncidentData_BinaryIntegrityIncident(const ClientIncidentReport_IncidentData_BinaryIntegrityIncident& from); + + inline ClientIncidentReport_IncidentData_BinaryIntegrityIncident& operator=(const ClientIncidentReport_IncidentData_BinaryIntegrityIncident& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_IncidentData_BinaryIntegrityIncident& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_IncidentData_BinaryIntegrityIncident* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_IncidentData_BinaryIntegrityIncident* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_IncidentData_BinaryIntegrityIncident* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_IncidentData_BinaryIntegrityIncident& from); + void MergeFrom(const ClientIncidentReport_IncidentData_BinaryIntegrityIncident& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string file_basename = 1; + inline bool has_file_basename() const; + inline void clear_file_basename(); + static const int kFileBasenameFieldNumber = 1; + inline const ::std::string& file_basename() const; + inline void set_file_basename(const ::std::string& value); + inline void set_file_basename(const char* value); + inline void set_file_basename(const char* value, size_t size); + inline ::std::string* mutable_file_basename(); + inline ::std::string* release_file_basename(); + inline void set_allocated_file_basename(::std::string* file_basename); + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 2; + inline bool has_signature() const; + inline void clear_signature(); + static const int kSignatureFieldNumber = 2; + inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& signature() const; + inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* mutable_signature(); + inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* release_signature(); + inline void set_allocated_signature(::safe_browsing::ClientDownloadRequest_SignatureInfo* signature); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident) + private: + inline void set_has_file_basename(); + inline void clear_has_file_basename(); + inline void set_has_signature(); + inline void clear_has_signature(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* file_basename_; + ::safe_browsing::ClientDownloadRequest_SignatureInfo* signature_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_IncidentData_BinaryIntegrityIncident* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_IncidentData_BlacklistLoadIncident : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_IncidentData_BlacklistLoadIncident(); + virtual ~ClientIncidentReport_IncidentData_BlacklistLoadIncident(); + + ClientIncidentReport_IncidentData_BlacklistLoadIncident(const ClientIncidentReport_IncidentData_BlacklistLoadIncident& from); + + inline ClientIncidentReport_IncidentData_BlacklistLoadIncident& operator=(const ClientIncidentReport_IncidentData_BlacklistLoadIncident& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_IncidentData_BlacklistLoadIncident& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_IncidentData_BlacklistLoadIncident* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_IncidentData_BlacklistLoadIncident* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_IncidentData_BlacklistLoadIncident* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_IncidentData_BlacklistLoadIncident& from); + void MergeFrom(const ClientIncidentReport_IncidentData_BlacklistLoadIncident& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string path = 1; + inline bool has_path() const; + inline void clear_path(); + static const int kPathFieldNumber = 1; + inline const ::std::string& path() const; + inline void set_path(const ::std::string& value); + inline void set_path(const char* value); + inline void set_path(const char* value, size_t size); + inline ::std::string* mutable_path(); + inline ::std::string* release_path(); + inline void set_allocated_path(::std::string* path); + + // optional .safe_browsing.ClientDownloadRequest.Digests digest = 2; + inline bool has_digest() const; + inline void clear_digest(); + static const int kDigestFieldNumber = 2; + inline const ::safe_browsing::ClientDownloadRequest_Digests& digest() const; + inline ::safe_browsing::ClientDownloadRequest_Digests* mutable_digest(); + inline ::safe_browsing::ClientDownloadRequest_Digests* release_digest(); + inline void set_allocated_digest(::safe_browsing::ClientDownloadRequest_Digests* digest); + + // optional string version = 3; + inline bool has_version() const; + inline void clear_version(); + static const int kVersionFieldNumber = 3; + inline const ::std::string& version() const; + inline void set_version(const ::std::string& value); + inline void set_version(const char* value); + inline void set_version(const char* value, size_t size); + inline ::std::string* mutable_version(); + inline ::std::string* release_version(); + inline void set_allocated_version(::std::string* version); + + // optional bool blacklist_initialized = 4; + inline bool has_blacklist_initialized() const; + inline void clear_blacklist_initialized(); + static const int kBlacklistInitializedFieldNumber = 4; + inline bool blacklist_initialized() const; + inline void set_blacklist_initialized(bool value); + + // optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; + inline bool has_signature() const; + inline void clear_signature(); + static const int kSignatureFieldNumber = 5; + inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& signature() const; + inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* mutable_signature(); + inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* release_signature(); + inline void set_allocated_signature(::safe_browsing::ClientDownloadRequest_SignatureInfo* signature); + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; + inline bool has_image_headers() const; + inline void clear_image_headers(); + static const int kImageHeadersFieldNumber = 6; + inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& image_headers() const; + inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* mutable_image_headers(); + inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* release_image_headers(); + inline void set_allocated_image_headers(::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident) + private: + inline void set_has_path(); + inline void clear_has_path(); + inline void set_has_digest(); + inline void clear_has_digest(); + inline void set_has_version(); + inline void clear_has_version(); + inline void set_has_blacklist_initialized(); + inline void clear_has_blacklist_initialized(); + inline void set_has_signature(); + inline void clear_has_signature(); + inline void set_has_image_headers(); + inline void clear_has_image_headers(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* path_; + ::safe_browsing::ClientDownloadRequest_Digests* digest_; + ::std::string* version_; + ::safe_browsing::ClientDownloadRequest_SignatureInfo* signature_; + ::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers_; + bool blacklist_initialized_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_IncidentData_BlacklistLoadIncident* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident(); + virtual ~ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident(); + + ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident(const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& from); + + inline ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& operator=(const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& from); + void MergeFrom(const ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string variations_seed_signature = 1; + inline bool has_variations_seed_signature() const; + inline void clear_variations_seed_signature(); + static const int kVariationsSeedSignatureFieldNumber = 1; + inline const ::std::string& variations_seed_signature() const; + inline void set_variations_seed_signature(const ::std::string& value); + inline void set_variations_seed_signature(const char* value); + inline void set_variations_seed_signature(const char* value, size_t size); + inline ::std::string* mutable_variations_seed_signature(); + inline ::std::string* release_variations_seed_signature(); + inline void set_allocated_variations_seed_signature(::std::string* variations_seed_signature); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident) + private: + inline void set_has_variations_seed_signature(); + inline void clear_has_variations_seed_signature(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* variations_seed_signature_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_IncidentData_ScriptRequestIncident : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_IncidentData_ScriptRequestIncident(); + virtual ~ClientIncidentReport_IncidentData_ScriptRequestIncident(); + + ClientIncidentReport_IncidentData_ScriptRequestIncident(const ClientIncidentReport_IncidentData_ScriptRequestIncident& from); + + inline ClientIncidentReport_IncidentData_ScriptRequestIncident& operator=(const ClientIncidentReport_IncidentData_ScriptRequestIncident& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_IncidentData_ScriptRequestIncident& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_IncidentData_ScriptRequestIncident* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_IncidentData_ScriptRequestIncident* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_IncidentData_ScriptRequestIncident* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_IncidentData_ScriptRequestIncident& from); + void MergeFrom(const ClientIncidentReport_IncidentData_ScriptRequestIncident& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string script_digest = 1; + inline bool has_script_digest() const; + inline void clear_script_digest(); + static const int kScriptDigestFieldNumber = 1; + inline const ::std::string& script_digest() const; + inline void set_script_digest(const ::std::string& value); + inline void set_script_digest(const char* value); + inline void set_script_digest(const char* value, size_t size); + inline ::std::string* mutable_script_digest(); + inline ::std::string* release_script_digest(); + inline void set_allocated_script_digest(::std::string* script_digest); + + // optional string inclusion_origin = 2; + inline bool has_inclusion_origin() const; + inline void clear_inclusion_origin(); + static const int kInclusionOriginFieldNumber = 2; + inline const ::std::string& inclusion_origin() const; + inline void set_inclusion_origin(const ::std::string& value); + inline void set_inclusion_origin(const char* value); + inline void set_inclusion_origin(const char* value, size_t size); + inline ::std::string* mutable_inclusion_origin(); + inline ::std::string* release_inclusion_origin(); + inline void set_allocated_inclusion_origin(::std::string* inclusion_origin); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident) + private: + inline void set_has_script_digest(); + inline void clear_has_script_digest(); + inline void set_has_inclusion_origin(); + inline void clear_has_inclusion_origin(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* script_digest_; + ::std::string* inclusion_origin_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_IncidentData_ScriptRequestIncident* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_IncidentData : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_IncidentData(); + virtual ~ClientIncidentReport_IncidentData(); + + ClientIncidentReport_IncidentData(const ClientIncidentReport_IncidentData& from); + + inline ClientIncidentReport_IncidentData& operator=(const ClientIncidentReport_IncidentData& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_IncidentData& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_IncidentData* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_IncidentData* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_IncidentData* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_IncidentData& from); + void MergeFrom(const ClientIncidentReport_IncidentData& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientIncidentReport_IncidentData_TrackedPreferenceIncident TrackedPreferenceIncident; + typedef ClientIncidentReport_IncidentData_BinaryIntegrityIncident BinaryIntegrityIncident; + typedef ClientIncidentReport_IncidentData_BlacklistLoadIncident BlacklistLoadIncident; + typedef ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident VariationsSeedSignatureIncident; + typedef ClientIncidentReport_IncidentData_ScriptRequestIncident ScriptRequestIncident; + + // accessors ------------------------------------------------------- + + // optional int64 incident_time_msec = 1; + inline bool has_incident_time_msec() const; + inline void clear_incident_time_msec(); + static const int kIncidentTimeMsecFieldNumber = 1; + inline ::google::protobuf::int64 incident_time_msec() const; + inline void set_incident_time_msec(::google::protobuf::int64 value); + + // optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident tracked_preference = 2; + inline bool has_tracked_preference() const; + inline void clear_tracked_preference(); + static const int kTrackedPreferenceFieldNumber = 2; + inline const ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident& tracked_preference() const; + inline ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident* mutable_tracked_preference(); + inline ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident* release_tracked_preference(); + inline void set_allocated_tracked_preference(::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident* tracked_preference); + + // optional .safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident binary_integrity = 3; + inline bool has_binary_integrity() const; + inline void clear_binary_integrity(); + static const int kBinaryIntegrityFieldNumber = 3; + inline const ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident& binary_integrity() const; + inline ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident* mutable_binary_integrity(); + inline ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident* release_binary_integrity(); + inline void set_allocated_binary_integrity(::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident* binary_integrity); + + // optional .safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident blacklist_load = 4; + inline bool has_blacklist_load() const; + inline void clear_blacklist_load(); + static const int kBlacklistLoadFieldNumber = 4; + inline const ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident& blacklist_load() const; + inline ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident* mutable_blacklist_load(); + inline ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident* release_blacklist_load(); + inline void set_allocated_blacklist_load(::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident* blacklist_load); + + // optional .safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident variations_seed_signature = 6; + inline bool has_variations_seed_signature() const; + inline void clear_variations_seed_signature(); + static const int kVariationsSeedSignatureFieldNumber = 6; + inline const ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& variations_seed_signature() const; + inline ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* mutable_variations_seed_signature(); + inline ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* release_variations_seed_signature(); + inline void set_allocated_variations_seed_signature(::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* variations_seed_signature); + + // optional .safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident script_request = 7; + inline bool has_script_request() const; + inline void clear_script_request(); + static const int kScriptRequestFieldNumber = 7; + inline const ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident& script_request() const; + inline ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident* mutable_script_request(); + inline ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident* release_script_request(); + inline void set_allocated_script_request(::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident* script_request); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.IncidentData) + private: + inline void set_has_incident_time_msec(); + inline void clear_has_incident_time_msec(); + inline void set_has_tracked_preference(); + inline void clear_has_tracked_preference(); + inline void set_has_binary_integrity(); + inline void clear_has_binary_integrity(); + inline void set_has_blacklist_load(); + inline void clear_has_blacklist_load(); + inline void set_has_variations_seed_signature(); + inline void clear_has_variations_seed_signature(); + inline void set_has_script_request(); + inline void clear_has_script_request(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::int64 incident_time_msec_; + ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident* tracked_preference_; + ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident* binary_integrity_; + ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident* blacklist_load_; + ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* variations_seed_signature_; + ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident* script_request_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_IncidentData* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_DownloadDetails : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_DownloadDetails(); + virtual ~ClientIncidentReport_DownloadDetails(); + + ClientIncidentReport_DownloadDetails(const ClientIncidentReport_DownloadDetails& from); + + inline ClientIncidentReport_DownloadDetails& operator=(const ClientIncidentReport_DownloadDetails& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_DownloadDetails& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_DownloadDetails* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_DownloadDetails* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_DownloadDetails* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_DownloadDetails& from); + void MergeFrom(const ClientIncidentReport_DownloadDetails& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bytes token = 1; + inline bool has_token() const; + inline void clear_token(); + static const int kTokenFieldNumber = 1; + inline const ::std::string& token() const; + inline void set_token(const ::std::string& value); + inline void set_token(const char* value); + inline void set_token(const void* value, size_t size); + inline ::std::string* mutable_token(); + inline ::std::string* release_token(); + inline void set_allocated_token(::std::string* token); + + // optional .safe_browsing.ClientDownloadRequest download = 2; + inline bool has_download() const; + inline void clear_download(); + static const int kDownloadFieldNumber = 2; + inline const ::safe_browsing::ClientDownloadRequest& download() const; + inline ::safe_browsing::ClientDownloadRequest* mutable_download(); + inline ::safe_browsing::ClientDownloadRequest* release_download(); + inline void set_allocated_download(::safe_browsing::ClientDownloadRequest* download); + + // optional int64 download_time_msec = 3; + inline bool has_download_time_msec() const; + inline void clear_download_time_msec(); + static const int kDownloadTimeMsecFieldNumber = 3; + inline ::google::protobuf::int64 download_time_msec() const; + inline void set_download_time_msec(::google::protobuf::int64 value); + + // optional int64 open_time_msec = 4; + inline bool has_open_time_msec() const; + inline void clear_open_time_msec(); + static const int kOpenTimeMsecFieldNumber = 4; + inline ::google::protobuf::int64 open_time_msec() const; + inline void set_open_time_msec(::google::protobuf::int64 value); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.DownloadDetails) + private: + inline void set_has_token(); + inline void clear_has_token(); + inline void set_has_download(); + inline void clear_has_download(); + inline void set_has_download_time_msec(); + inline void clear_has_download_time_msec(); + inline void set_has_open_time_msec(); + inline void clear_has_open_time_msec(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* token_; + ::safe_browsing::ClientDownloadRequest* download_; + ::google::protobuf::int64 download_time_msec_; + ::google::protobuf::int64 open_time_msec_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_DownloadDetails* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_EnvironmentData_OS : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_EnvironmentData_OS(); + virtual ~ClientIncidentReport_EnvironmentData_OS(); + + ClientIncidentReport_EnvironmentData_OS(const ClientIncidentReport_EnvironmentData_OS& from); + + inline ClientIncidentReport_EnvironmentData_OS& operator=(const ClientIncidentReport_EnvironmentData_OS& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_EnvironmentData_OS& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_EnvironmentData_OS* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_EnvironmentData_OS* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_EnvironmentData_OS* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_EnvironmentData_OS& from); + void MergeFrom(const ClientIncidentReport_EnvironmentData_OS& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string os_name = 1; + inline bool has_os_name() const; + inline void clear_os_name(); + static const int kOsNameFieldNumber = 1; + inline const ::std::string& os_name() const; + inline void set_os_name(const ::std::string& value); + inline void set_os_name(const char* value); + inline void set_os_name(const char* value, size_t size); + inline ::std::string* mutable_os_name(); + inline ::std::string* release_os_name(); + inline void set_allocated_os_name(::std::string* os_name); + + // optional string os_version = 2; + inline bool has_os_version() const; + inline void clear_os_version(); + static const int kOsVersionFieldNumber = 2; + inline const ::std::string& os_version() const; + inline void set_os_version(const ::std::string& value); + inline void set_os_version(const char* value); + inline void set_os_version(const char* value, size_t size); + inline ::std::string* mutable_os_version(); + inline ::std::string* release_os_version(); + inline void set_allocated_os_version(::std::string* os_version); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.EnvironmentData.OS) + private: + inline void set_has_os_name(); + inline void clear_has_os_name(); + inline void set_has_os_version(); + inline void clear_has_os_version(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* os_name_; + ::std::string* os_version_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_EnvironmentData_OS* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_EnvironmentData_Machine : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_EnvironmentData_Machine(); + virtual ~ClientIncidentReport_EnvironmentData_Machine(); + + ClientIncidentReport_EnvironmentData_Machine(const ClientIncidentReport_EnvironmentData_Machine& from); + + inline ClientIncidentReport_EnvironmentData_Machine& operator=(const ClientIncidentReport_EnvironmentData_Machine& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_EnvironmentData_Machine& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_EnvironmentData_Machine* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_EnvironmentData_Machine* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_EnvironmentData_Machine* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_EnvironmentData_Machine& from); + void MergeFrom(const ClientIncidentReport_EnvironmentData_Machine& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string cpu_architecture = 1; + inline bool has_cpu_architecture() const; + inline void clear_cpu_architecture(); + static const int kCpuArchitectureFieldNumber = 1; + inline const ::std::string& cpu_architecture() const; + inline void set_cpu_architecture(const ::std::string& value); + inline void set_cpu_architecture(const char* value); + inline void set_cpu_architecture(const char* value, size_t size); + inline ::std::string* mutable_cpu_architecture(); + inline ::std::string* release_cpu_architecture(); + inline void set_allocated_cpu_architecture(::std::string* cpu_architecture); + + // optional string cpu_vendor = 2; + inline bool has_cpu_vendor() const; + inline void clear_cpu_vendor(); + static const int kCpuVendorFieldNumber = 2; + inline const ::std::string& cpu_vendor() const; + inline void set_cpu_vendor(const ::std::string& value); + inline void set_cpu_vendor(const char* value); + inline void set_cpu_vendor(const char* value, size_t size); + inline ::std::string* mutable_cpu_vendor(); + inline ::std::string* release_cpu_vendor(); + inline void set_allocated_cpu_vendor(::std::string* cpu_vendor); + + // optional uint32 cpuid = 3; + inline bool has_cpuid() const; + inline void clear_cpuid(); + static const int kCpuidFieldNumber = 3; + inline ::google::protobuf::uint32 cpuid() const; + inline void set_cpuid(::google::protobuf::uint32 value); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.EnvironmentData.Machine) + private: + inline void set_has_cpu_architecture(); + inline void clear_has_cpu_architecture(); + inline void set_has_cpu_vendor(); + inline void clear_has_cpu_vendor(); + inline void set_has_cpuid(); + inline void clear_has_cpuid(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* cpu_architecture_; + ::std::string* cpu_vendor_; + ::google::protobuf::uint32 cpuid_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_EnvironmentData_Machine* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_EnvironmentData_Process_Patch : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_EnvironmentData_Process_Patch(); + virtual ~ClientIncidentReport_EnvironmentData_Process_Patch(); + + ClientIncidentReport_EnvironmentData_Process_Patch(const ClientIncidentReport_EnvironmentData_Process_Patch& from); + + inline ClientIncidentReport_EnvironmentData_Process_Patch& operator=(const ClientIncidentReport_EnvironmentData_Process_Patch& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_EnvironmentData_Process_Patch& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_EnvironmentData_Process_Patch* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_EnvironmentData_Process_Patch* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_EnvironmentData_Process_Patch* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_EnvironmentData_Process_Patch& from); + void MergeFrom(const ClientIncidentReport_EnvironmentData_Process_Patch& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string function = 1; + inline bool has_function() const; + inline void clear_function(); + static const int kFunctionFieldNumber = 1; + inline const ::std::string& function() const; + inline void set_function(const ::std::string& value); + inline void set_function(const char* value); + inline void set_function(const char* value, size_t size); + inline ::std::string* mutable_function(); + inline ::std::string* release_function(); + inline void set_allocated_function(::std::string* function); + + // optional string target_dll = 2; + inline bool has_target_dll() const; + inline void clear_target_dll(); + static const int kTargetDllFieldNumber = 2; + inline const ::std::string& target_dll() const; + inline void set_target_dll(const ::std::string& value); + inline void set_target_dll(const char* value); + inline void set_target_dll(const char* value, size_t size); + inline ::std::string* mutable_target_dll(); + inline ::std::string* release_target_dll(); + inline void set_allocated_target_dll(::std::string* target_dll); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch) + private: + inline void set_has_function(); + inline void clear_has_function(); + inline void set_has_target_dll(); + inline void clear_has_target_dll(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* function_; + ::std::string* target_dll_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_EnvironmentData_Process_Patch* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_EnvironmentData_Process_NetworkProvider : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_EnvironmentData_Process_NetworkProvider(); + virtual ~ClientIncidentReport_EnvironmentData_Process_NetworkProvider(); + + ClientIncidentReport_EnvironmentData_Process_NetworkProvider(const ClientIncidentReport_EnvironmentData_Process_NetworkProvider& from); + + inline ClientIncidentReport_EnvironmentData_Process_NetworkProvider& operator=(const ClientIncidentReport_EnvironmentData_Process_NetworkProvider& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_EnvironmentData_Process_NetworkProvider& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_EnvironmentData_Process_NetworkProvider* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_EnvironmentData_Process_NetworkProvider* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_EnvironmentData_Process_NetworkProvider* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_EnvironmentData_Process_NetworkProvider& from); + void MergeFrom(const ClientIncidentReport_EnvironmentData_Process_NetworkProvider& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider) + private: + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_EnvironmentData_Process_NetworkProvider* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_EnvironmentData_Process_Dll : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_EnvironmentData_Process_Dll(); + virtual ~ClientIncidentReport_EnvironmentData_Process_Dll(); + + ClientIncidentReport_EnvironmentData_Process_Dll(const ClientIncidentReport_EnvironmentData_Process_Dll& from); + + inline ClientIncidentReport_EnvironmentData_Process_Dll& operator=(const ClientIncidentReport_EnvironmentData_Process_Dll& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_EnvironmentData_Process_Dll& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_EnvironmentData_Process_Dll* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_EnvironmentData_Process_Dll* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_EnvironmentData_Process_Dll* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_EnvironmentData_Process_Dll& from); + void MergeFrom(const ClientIncidentReport_EnvironmentData_Process_Dll& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientIncidentReport_EnvironmentData_Process_Dll_Feature Feature; + static const Feature UNKNOWN = ClientIncidentReport_EnvironmentData_Process_Dll_Feature_UNKNOWN; + static const Feature LSP = ClientIncidentReport_EnvironmentData_Process_Dll_Feature_LSP; + static inline bool Feature_IsValid(int value) { + return ClientIncidentReport_EnvironmentData_Process_Dll_Feature_IsValid(value); + } + static const Feature Feature_MIN = + ClientIncidentReport_EnvironmentData_Process_Dll_Feature_Feature_MIN; + static const Feature Feature_MAX = + ClientIncidentReport_EnvironmentData_Process_Dll_Feature_Feature_MAX; + static const int Feature_ARRAYSIZE = + ClientIncidentReport_EnvironmentData_Process_Dll_Feature_Feature_ARRAYSIZE; + + // accessors ------------------------------------------------------- + + // optional string path = 1; + inline bool has_path() const; + inline void clear_path(); + static const int kPathFieldNumber = 1; + inline const ::std::string& path() const; + inline void set_path(const ::std::string& value); + inline void set_path(const char* value); + inline void set_path(const char* value, size_t size); + inline ::std::string* mutable_path(); + inline ::std::string* release_path(); + inline void set_allocated_path(::std::string* path); + + // optional uint64 base_address = 2; + inline bool has_base_address() const; + inline void clear_base_address(); + static const int kBaseAddressFieldNumber = 2; + inline ::google::protobuf::uint64 base_address() const; + inline void set_base_address(::google::protobuf::uint64 value); + + // optional uint32 length = 3; + inline bool has_length() const; + inline void clear_length(); + static const int kLengthFieldNumber = 3; + inline ::google::protobuf::uint32 length() const; + inline void set_length(::google::protobuf::uint32 value); + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.Feature feature = 4; + inline int feature_size() const; + inline void clear_feature(); + static const int kFeatureFieldNumber = 4; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature feature(int index) const; + inline void set_feature(int index, ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature value); + inline void add_feature(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature value); + inline const ::google::protobuf::RepeatedField& feature() const; + inline ::google::protobuf::RepeatedField* mutable_feature(); + + // optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 5; + inline bool has_image_headers() const; + inline void clear_image_headers(); + static const int kImageHeadersFieldNumber = 5; + inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& image_headers() const; + inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* mutable_image_headers(); + inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* release_image_headers(); + inline void set_allocated_image_headers(::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll) + private: + inline void set_has_path(); + inline void clear_has_path(); + inline void set_has_base_address(); + inline void clear_has_base_address(); + inline void set_has_length(); + inline void clear_has_length(); + inline void set_has_image_headers(); + inline void clear_has_image_headers(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* path_; + ::google::protobuf::uint64 base_address_; + ::google::protobuf::RepeatedField feature_; + ::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers_; + ::google::protobuf::uint32 length_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_EnvironmentData_Process_Dll* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_EnvironmentData_Process_ModuleState : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_EnvironmentData_Process_ModuleState(); + virtual ~ClientIncidentReport_EnvironmentData_Process_ModuleState(); + + ClientIncidentReport_EnvironmentData_Process_ModuleState(const ClientIncidentReport_EnvironmentData_Process_ModuleState& from); + + inline ClientIncidentReport_EnvironmentData_Process_ModuleState& operator=(const ClientIncidentReport_EnvironmentData_Process_ModuleState& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_EnvironmentData_Process_ModuleState& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_EnvironmentData_Process_ModuleState* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_EnvironmentData_Process_ModuleState* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_EnvironmentData_Process_ModuleState* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_EnvironmentData_Process_ModuleState& from); + void MergeFrom(const ClientIncidentReport_EnvironmentData_Process_ModuleState& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ModifiedState; + static const ModifiedState UNKNOWN = ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_UNKNOWN; + static const ModifiedState MODULE_STATE_UNKNOWN = ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_MODULE_STATE_UNKNOWN; + static const ModifiedState MODULE_STATE_UNMODIFIED = ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_MODULE_STATE_UNMODIFIED; + static const ModifiedState MODULE_STATE_MODIFIED = ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_MODULE_STATE_MODIFIED; + static inline bool ModifiedState_IsValid(int value) { + return ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_IsValid(value); + } + static const ModifiedState ModifiedState_MIN = + ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_ModifiedState_MIN; + static const ModifiedState ModifiedState_MAX = + ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_ModifiedState_MAX; + static const int ModifiedState_ARRAYSIZE = + ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_ModifiedState_ARRAYSIZE; + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.ModifiedState modified_state = 2; + inline bool has_modified_state() const; + inline void clear_modified_state(); + static const int kModifiedStateFieldNumber = 2; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState modified_state() const; + inline void set_modified_state(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState value); + + // repeated string modified_export = 3; + inline int modified_export_size() const; + inline void clear_modified_export(); + static const int kModifiedExportFieldNumber = 3; + inline const ::std::string& modified_export(int index) const; + inline ::std::string* mutable_modified_export(int index); + inline void set_modified_export(int index, const ::std::string& value); + inline void set_modified_export(int index, const char* value); + inline void set_modified_export(int index, const char* value, size_t size); + inline ::std::string* add_modified_export(); + inline void add_modified_export(const ::std::string& value); + inline void add_modified_export(const char* value); + inline void add_modified_export(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& modified_export() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_modified_export(); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_modified_state(); + inline void clear_has_modified_state(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::google::protobuf::RepeatedPtrField< ::std::string> modified_export_; + int modified_state_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_EnvironmentData_Process_ModuleState* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_EnvironmentData_Process : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_EnvironmentData_Process(); + virtual ~ClientIncidentReport_EnvironmentData_Process(); + + ClientIncidentReport_EnvironmentData_Process(const ClientIncidentReport_EnvironmentData_Process& from); + + inline ClientIncidentReport_EnvironmentData_Process& operator=(const ClientIncidentReport_EnvironmentData_Process& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_EnvironmentData_Process& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_EnvironmentData_Process* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_EnvironmentData_Process* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_EnvironmentData_Process* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_EnvironmentData_Process& from); + void MergeFrom(const ClientIncidentReport_EnvironmentData_Process& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientIncidentReport_EnvironmentData_Process_Patch Patch; + typedef ClientIncidentReport_EnvironmentData_Process_NetworkProvider NetworkProvider; + typedef ClientIncidentReport_EnvironmentData_Process_Dll Dll; + typedef ClientIncidentReport_EnvironmentData_Process_ModuleState ModuleState; + + typedef ClientIncidentReport_EnvironmentData_Process_Channel Channel; + static const Channel CHANNEL_UNKNOWN = ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_UNKNOWN; + static const Channel CHANNEL_CANARY = ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_CANARY; + static const Channel CHANNEL_DEV = ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_DEV; + static const Channel CHANNEL_BETA = ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_BETA; + static const Channel CHANNEL_STABLE = ClientIncidentReport_EnvironmentData_Process_Channel_CHANNEL_STABLE; + static inline bool Channel_IsValid(int value) { + return ClientIncidentReport_EnvironmentData_Process_Channel_IsValid(value); + } + static const Channel Channel_MIN = + ClientIncidentReport_EnvironmentData_Process_Channel_Channel_MIN; + static const Channel Channel_MAX = + ClientIncidentReport_EnvironmentData_Process_Channel_Channel_MAX; + static const int Channel_ARRAYSIZE = + ClientIncidentReport_EnvironmentData_Process_Channel_Channel_ARRAYSIZE; + + // accessors ------------------------------------------------------- + + // optional string version = 1; + inline bool has_version() const; + inline void clear_version(); + static const int kVersionFieldNumber = 1; + inline const ::std::string& version() const; + inline void set_version(const ::std::string& value); + inline void set_version(const char* value); + inline void set_version(const char* value, size_t size); + inline ::std::string* mutable_version(); + inline ::std::string* release_version(); + inline void set_allocated_version(::std::string* version); + + // repeated string OBSOLETE_dlls = 2; + inline int obsolete_dlls_size() const; + inline void clear_obsolete_dlls(); + static const int kOBSOLETEDllsFieldNumber = 2; + inline const ::std::string& obsolete_dlls(int index) const; + inline ::std::string* mutable_obsolete_dlls(int index); + inline void set_obsolete_dlls(int index, const ::std::string& value); + inline void set_obsolete_dlls(int index, const char* value); + inline void set_obsolete_dlls(int index, const char* value, size_t size); + inline ::std::string* add_obsolete_dlls(); + inline void add_obsolete_dlls(const ::std::string& value); + inline void add_obsolete_dlls(const char* value); + inline void add_obsolete_dlls(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& obsolete_dlls() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_obsolete_dlls(); + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch patches = 3; + inline int patches_size() const; + inline void clear_patches(); + static const int kPatchesFieldNumber = 3; + inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch& patches(int index) const; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch* mutable_patches(int index); + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch* add_patches(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch >& + patches() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch >* + mutable_patches(); + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider network_providers = 4; + inline int network_providers_size() const; + inline void clear_network_providers(); + static const int kNetworkProvidersFieldNumber = 4; + inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider& network_providers(int index) const; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider* mutable_network_providers(int index); + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider* add_network_providers(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider >& + network_providers() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider >* + mutable_network_providers(); + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Channel chrome_update_channel = 5; + inline bool has_chrome_update_channel() const; + inline void clear_chrome_update_channel(); + static const int kChromeUpdateChannelFieldNumber = 5; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Channel chrome_update_channel() const; + inline void set_chrome_update_channel(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Channel value); + + // optional int64 uptime_msec = 6; + inline bool has_uptime_msec() const; + inline void clear_uptime_msec(); + static const int kUptimeMsecFieldNumber = 6; + inline ::google::protobuf::int64 uptime_msec() const; + inline void set_uptime_msec(::google::protobuf::int64 value); + + // optional bool metrics_consent = 7; + inline bool has_metrics_consent() const; + inline void clear_metrics_consent(); + static const int kMetricsConsentFieldNumber = 7; + inline bool metrics_consent() const; + inline void set_metrics_consent(bool value); + + // optional bool extended_consent = 8; + inline bool has_extended_consent() const; + inline void clear_extended_consent(); + static const int kExtendedConsentFieldNumber = 8; + inline bool extended_consent() const; + inline void set_extended_consent(bool value); + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll dll = 9; + inline int dll_size() const; + inline void clear_dll(); + static const int kDllFieldNumber = 9; + inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll& dll(int index) const; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll* mutable_dll(int index); + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll* add_dll(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll >& + dll() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll >* + mutable_dll(); + + // repeated string blacklisted_dll = 10; + inline int blacklisted_dll_size() const; + inline void clear_blacklisted_dll(); + static const int kBlacklistedDllFieldNumber = 10; + inline const ::std::string& blacklisted_dll(int index) const; + inline ::std::string* mutable_blacklisted_dll(int index); + inline void set_blacklisted_dll(int index, const ::std::string& value); + inline void set_blacklisted_dll(int index, const char* value); + inline void set_blacklisted_dll(int index, const char* value, size_t size); + inline ::std::string* add_blacklisted_dll(); + inline void add_blacklisted_dll(const ::std::string& value); + inline void add_blacklisted_dll(const char* value); + inline void add_blacklisted_dll(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& blacklisted_dll() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_blacklisted_dll(); + + // repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState module_state = 11; + inline int module_state_size() const; + inline void clear_module_state(); + static const int kModuleStateFieldNumber = 11; + inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState& module_state(int index) const; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState* mutable_module_state(int index); + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState* add_module_state(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState >& + module_state() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState >* + mutable_module_state(); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.EnvironmentData.Process) + private: + inline void set_has_version(); + inline void clear_has_version(); + inline void set_has_chrome_update_channel(); + inline void clear_has_chrome_update_channel(); + inline void set_has_uptime_msec(); + inline void clear_has_uptime_msec(); + inline void set_has_metrics_consent(); + inline void clear_has_metrics_consent(); + inline void set_has_extended_consent(); + inline void clear_has_extended_consent(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* version_; + ::google::protobuf::RepeatedPtrField< ::std::string> obsolete_dlls_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch > patches_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider > network_providers_; + ::google::protobuf::int64 uptime_msec_; + int chrome_update_channel_; + bool metrics_consent_; + bool extended_consent_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll > dll_; + ::google::protobuf::RepeatedPtrField< ::std::string> blacklisted_dll_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState > module_state_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_EnvironmentData_Process* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport_EnvironmentData : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport_EnvironmentData(); + virtual ~ClientIncidentReport_EnvironmentData(); + + ClientIncidentReport_EnvironmentData(const ClientIncidentReport_EnvironmentData& from); + + inline ClientIncidentReport_EnvironmentData& operator=(const ClientIncidentReport_EnvironmentData& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport_EnvironmentData& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport_EnvironmentData* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport_EnvironmentData* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport_EnvironmentData* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport_EnvironmentData& from); + void MergeFrom(const ClientIncidentReport_EnvironmentData& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientIncidentReport_EnvironmentData_OS OS; + typedef ClientIncidentReport_EnvironmentData_Machine Machine; + typedef ClientIncidentReport_EnvironmentData_Process Process; + + // accessors ------------------------------------------------------- + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.OS os = 1; + inline bool has_os() const; + inline void clear_os(); + static const int kOsFieldNumber = 1; + inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_OS& os() const; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_OS* mutable_os(); + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_OS* release_os(); + inline void set_allocated_os(::safe_browsing::ClientIncidentReport_EnvironmentData_OS* os); + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Machine machine = 2; + inline bool has_machine() const; + inline void clear_machine(); + static const int kMachineFieldNumber = 2; + inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine& machine() const; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine* mutable_machine(); + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine* release_machine(); + inline void set_allocated_machine(::safe_browsing::ClientIncidentReport_EnvironmentData_Machine* machine); + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process process = 3; + inline bool has_process() const; + inline void clear_process(); + static const int kProcessFieldNumber = 3; + inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process& process() const; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process* mutable_process(); + inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process* release_process(); + inline void set_allocated_process(::safe_browsing::ClientIncidentReport_EnvironmentData_Process* process); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport.EnvironmentData) + private: + inline void set_has_os(); + inline void clear_has_os(); + inline void set_has_machine(); + inline void clear_has_machine(); + inline void set_has_process(); + inline void clear_has_process(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::safe_browsing::ClientIncidentReport_EnvironmentData_OS* os_; + ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine* machine_; + ::safe_browsing::ClientIncidentReport_EnvironmentData_Process* process_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport_EnvironmentData* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentReport : public ::google::protobuf::MessageLite { + public: + ClientIncidentReport(); + virtual ~ClientIncidentReport(); + + ClientIncidentReport(const ClientIncidentReport& from); + + inline ClientIncidentReport& operator=(const ClientIncidentReport& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentReport& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentReport* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentReport* other); + + // implements Message ---------------------------------------------- + + ClientIncidentReport* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentReport& from); + void MergeFrom(const ClientIncidentReport& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientIncidentReport_IncidentData IncidentData; + typedef ClientIncidentReport_DownloadDetails DownloadDetails; + typedef ClientIncidentReport_EnvironmentData EnvironmentData; + + // accessors ------------------------------------------------------- + + // repeated .safe_browsing.ClientIncidentReport.IncidentData incident = 1; + inline int incident_size() const; + inline void clear_incident(); + static const int kIncidentFieldNumber = 1; + inline const ::safe_browsing::ClientIncidentReport_IncidentData& incident(int index) const; + inline ::safe_browsing::ClientIncidentReport_IncidentData* mutable_incident(int index); + inline ::safe_browsing::ClientIncidentReport_IncidentData* add_incident(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_IncidentData >& + incident() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_IncidentData >* + mutable_incident(); + + // optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; + inline bool has_download() const; + inline void clear_download(); + static const int kDownloadFieldNumber = 2; + inline const ::safe_browsing::ClientIncidentReport_DownloadDetails& download() const; + inline ::safe_browsing::ClientIncidentReport_DownloadDetails* mutable_download(); + inline ::safe_browsing::ClientIncidentReport_DownloadDetails* release_download(); + inline void set_allocated_download(::safe_browsing::ClientIncidentReport_DownloadDetails* download); + + // optional .safe_browsing.ClientIncidentReport.EnvironmentData environment = 3; + inline bool has_environment() const; + inline void clear_environment(); + static const int kEnvironmentFieldNumber = 3; + inline const ::safe_browsing::ClientIncidentReport_EnvironmentData& environment() const; + inline ::safe_browsing::ClientIncidentReport_EnvironmentData* mutable_environment(); + inline ::safe_browsing::ClientIncidentReport_EnvironmentData* release_environment(); + inline void set_allocated_environment(::safe_browsing::ClientIncidentReport_EnvironmentData* environment); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentReport) + private: + inline void set_has_download(); + inline void clear_has_download(); + inline void set_has_environment(); + inline void clear_has_environment(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_IncidentData > incident_; + ::safe_browsing::ClientIncidentReport_DownloadDetails* download_; + ::safe_browsing::ClientIncidentReport_EnvironmentData* environment_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentReport* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentResponse_EnvironmentRequest : public ::google::protobuf::MessageLite { + public: + ClientIncidentResponse_EnvironmentRequest(); + virtual ~ClientIncidentResponse_EnvironmentRequest(); + + ClientIncidentResponse_EnvironmentRequest(const ClientIncidentResponse_EnvironmentRequest& from); + + inline ClientIncidentResponse_EnvironmentRequest& operator=(const ClientIncidentResponse_EnvironmentRequest& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentResponse_EnvironmentRequest& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentResponse_EnvironmentRequest* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentResponse_EnvironmentRequest* other); + + // implements Message ---------------------------------------------- + + ClientIncidentResponse_EnvironmentRequest* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentResponse_EnvironmentRequest& from); + void MergeFrom(const ClientIncidentResponse_EnvironmentRequest& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional int32 dll_index = 1; + inline bool has_dll_index() const; + inline void clear_dll_index(); + static const int kDllIndexFieldNumber = 1; + inline ::google::protobuf::int32 dll_index() const; + inline void set_dll_index(::google::protobuf::int32 value); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentResponse.EnvironmentRequest) + private: + inline void set_has_dll_index(); + inline void clear_has_dll_index(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::int32 dll_index_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentResponse_EnvironmentRequest* default_instance_; +}; +// ------------------------------------------------------------------- + +class ClientIncidentResponse : public ::google::protobuf::MessageLite { + public: + ClientIncidentResponse(); + virtual ~ClientIncidentResponse(); + + ClientIncidentResponse(const ClientIncidentResponse& from); + + inline ClientIncidentResponse& operator=(const ClientIncidentResponse& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ClientIncidentResponse& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const ClientIncidentResponse* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(ClientIncidentResponse* other); + + // implements Message ---------------------------------------------- + + ClientIncidentResponse* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const ClientIncidentResponse& from); + void MergeFrom(const ClientIncidentResponse& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + typedef ClientIncidentResponse_EnvironmentRequest EnvironmentRequest; + + // accessors ------------------------------------------------------- + + // optional bytes token = 1; + inline bool has_token() const; + inline void clear_token(); + static const int kTokenFieldNumber = 1; + inline const ::std::string& token() const; + inline void set_token(const ::std::string& value); + inline void set_token(const char* value); + inline void set_token(const void* value, size_t size); + inline ::std::string* mutable_token(); + inline ::std::string* release_token(); + inline void set_allocated_token(::std::string* token); + + // optional bool download_requested = 2; + inline bool has_download_requested() const; + inline void clear_download_requested(); + static const int kDownloadRequestedFieldNumber = 2; + inline bool download_requested() const; + inline void set_download_requested(bool value); + + // repeated .safe_browsing.ClientIncidentResponse.EnvironmentRequest environment_requests = 3; + inline int environment_requests_size() const; + inline void clear_environment_requests(); + static const int kEnvironmentRequestsFieldNumber = 3; + inline const ::safe_browsing::ClientIncidentResponse_EnvironmentRequest& environment_requests(int index) const; + inline ::safe_browsing::ClientIncidentResponse_EnvironmentRequest* mutable_environment_requests(int index); + inline ::safe_browsing::ClientIncidentResponse_EnvironmentRequest* add_environment_requests(); + inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentResponse_EnvironmentRequest >& + environment_requests() const; + inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentResponse_EnvironmentRequest >* + mutable_environment_requests(); + + // @@protoc_insertion_point(class_scope:safe_browsing.ClientIncidentResponse) + private: + inline void set_has_token(); + inline void clear_has_token(); + inline void set_has_download_requested(); + inline void clear_has_download_requested(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* token_; + ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentResponse_EnvironmentRequest > environment_requests_; + bool download_requested_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static ClientIncidentResponse* default_instance_; +}; +// ------------------------------------------------------------------- + +class DownloadMetadata : public ::google::protobuf::MessageLite { + public: + DownloadMetadata(); + virtual ~DownloadMetadata(); + + DownloadMetadata(const DownloadMetadata& from); + + inline DownloadMetadata& operator=(const DownloadMetadata& from) { + CopyFrom(from); + return *this; + } + + inline const ::std::string& unknown_fields() const { + return _unknown_fields_; + } + + inline ::std::string* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const DownloadMetadata& default_instance(); + + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + // Returns the internal default instance pointer. This function can + // return NULL thus should not be used by the user. This is intended + // for Protobuf internal code. Please use default_instance() declared + // above instead. + static inline const DownloadMetadata* internal_default_instance() { + return default_instance_; + } + #endif + + void Swap(DownloadMetadata* other); + + // implements Message ---------------------------------------------- + + DownloadMetadata* New() const; + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from); + void CopyFrom(const DownloadMetadata& from); + void MergeFrom(const DownloadMetadata& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + void DiscardUnknownFields(); + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::std::string GetTypeName() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint32 download_id = 1; + inline bool has_download_id() const; + inline void clear_download_id(); + static const int kDownloadIdFieldNumber = 1; + inline ::google::protobuf::uint32 download_id() const; + inline void set_download_id(::google::protobuf::uint32 value); + + // optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; + inline bool has_download() const; + inline void clear_download(); + static const int kDownloadFieldNumber = 2; + inline const ::safe_browsing::ClientIncidentReport_DownloadDetails& download() const; + inline ::safe_browsing::ClientIncidentReport_DownloadDetails* mutable_download(); + inline ::safe_browsing::ClientIncidentReport_DownloadDetails* release_download(); + inline void set_allocated_download(::safe_browsing::ClientIncidentReport_DownloadDetails* download); + + // @@protoc_insertion_point(class_scope:safe_browsing.DownloadMetadata) + private: + inline void set_has_download_id(); + inline void clear_has_download_id(); + inline void set_has_download(); + inline void clear_has_download(); + + ::std::string _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::safe_browsing::ClientIncidentReport_DownloadDetails* download_; + ::google::protobuf::uint32 download_id_; + #ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + friend void protobuf_AddDesc_csd_2eproto_impl(); + #else + friend void protobuf_AddDesc_csd_2eproto(); + #endif + friend void protobuf_AssignDesc_csd_2eproto(); + friend void protobuf_ShutdownFile_csd_2eproto(); + + void InitAsDefaultInstance(); + static DownloadMetadata* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// ClientPhishingRequest_Feature + +// required string name = 1; +inline bool ClientPhishingRequest_Feature::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientPhishingRequest_Feature::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientPhishingRequest_Feature::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientPhishingRequest_Feature::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& ClientPhishingRequest_Feature::name() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.Feature.name) + return *name_; +} +inline void ClientPhishingRequest_Feature::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingRequest.Feature.name) +} +inline void ClientPhishingRequest_Feature::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientPhishingRequest.Feature.name) +} +inline void ClientPhishingRequest_Feature::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientPhishingRequest.Feature.name) +} +inline ::std::string* ClientPhishingRequest_Feature::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientPhishingRequest.Feature.name) + return name_; +} +inline ::std::string* ClientPhishingRequest_Feature::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientPhishingRequest_Feature::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientPhishingRequest.Feature.name) +} + +// required double value = 2; +inline bool ClientPhishingRequest_Feature::has_value() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientPhishingRequest_Feature::set_has_value() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientPhishingRequest_Feature::clear_has_value() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientPhishingRequest_Feature::clear_value() { + value_ = 0; + clear_has_value(); +} +inline double ClientPhishingRequest_Feature::value() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.Feature.value) + return value_; +} +inline void ClientPhishingRequest_Feature::set_value(double value) { + set_has_value(); + value_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingRequest.Feature.value) +} + +// ------------------------------------------------------------------- + +// ClientPhishingRequest + +// optional string url = 1; +inline bool ClientPhishingRequest::has_url() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientPhishingRequest::set_has_url() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientPhishingRequest::clear_has_url() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientPhishingRequest::clear_url() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + clear_has_url(); +} +inline const ::std::string& ClientPhishingRequest::url() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.url) + return *url_; +} +inline void ClientPhishingRequest::set_url(const ::std::string& value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingRequest.url) +} +inline void ClientPhishingRequest::set_url(const char* value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientPhishingRequest.url) +} +inline void ClientPhishingRequest::set_url(const char* value, size_t size) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientPhishingRequest.url) +} +inline ::std::string* ClientPhishingRequest::mutable_url() { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientPhishingRequest.url) + return url_; +} +inline ::std::string* ClientPhishingRequest::release_url() { + clear_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = url_; + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientPhishingRequest::set_allocated_url(::std::string* url) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (url) { + set_has_url(); + url_ = url; + } else { + clear_has_url(); + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientPhishingRequest.url) +} + +// optional bytes OBSOLETE_hash_prefix = 10; +inline bool ClientPhishingRequest::has_obsolete_hash_prefix() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientPhishingRequest::set_has_obsolete_hash_prefix() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientPhishingRequest::clear_has_obsolete_hash_prefix() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientPhishingRequest::clear_obsolete_hash_prefix() { + if (obsolete_hash_prefix_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_hash_prefix_->clear(); + } + clear_has_obsolete_hash_prefix(); +} +inline const ::std::string& ClientPhishingRequest::obsolete_hash_prefix() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.OBSOLETE_hash_prefix) + return *obsolete_hash_prefix_; +} +inline void ClientPhishingRequest::set_obsolete_hash_prefix(const ::std::string& value) { + set_has_obsolete_hash_prefix(); + if (obsolete_hash_prefix_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_hash_prefix_ = new ::std::string; + } + obsolete_hash_prefix_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingRequest.OBSOLETE_hash_prefix) +} +inline void ClientPhishingRequest::set_obsolete_hash_prefix(const char* value) { + set_has_obsolete_hash_prefix(); + if (obsolete_hash_prefix_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_hash_prefix_ = new ::std::string; + } + obsolete_hash_prefix_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientPhishingRequest.OBSOLETE_hash_prefix) +} +inline void ClientPhishingRequest::set_obsolete_hash_prefix(const void* value, size_t size) { + set_has_obsolete_hash_prefix(); + if (obsolete_hash_prefix_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_hash_prefix_ = new ::std::string; + } + obsolete_hash_prefix_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientPhishingRequest.OBSOLETE_hash_prefix) +} +inline ::std::string* ClientPhishingRequest::mutable_obsolete_hash_prefix() { + set_has_obsolete_hash_prefix(); + if (obsolete_hash_prefix_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_hash_prefix_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientPhishingRequest.OBSOLETE_hash_prefix) + return obsolete_hash_prefix_; +} +inline ::std::string* ClientPhishingRequest::release_obsolete_hash_prefix() { + clear_has_obsolete_hash_prefix(); + if (obsolete_hash_prefix_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = obsolete_hash_prefix_; + obsolete_hash_prefix_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientPhishingRequest::set_allocated_obsolete_hash_prefix(::std::string* obsolete_hash_prefix) { + if (obsolete_hash_prefix_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete obsolete_hash_prefix_; + } + if (obsolete_hash_prefix) { + set_has_obsolete_hash_prefix(); + obsolete_hash_prefix_ = obsolete_hash_prefix; + } else { + clear_has_obsolete_hash_prefix(); + obsolete_hash_prefix_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientPhishingRequest.OBSOLETE_hash_prefix) +} + +// required float client_score = 2; +inline bool ClientPhishingRequest::has_client_score() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientPhishingRequest::set_has_client_score() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientPhishingRequest::clear_has_client_score() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientPhishingRequest::clear_client_score() { + client_score_ = 0; + clear_has_client_score(); +} +inline float ClientPhishingRequest::client_score() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.client_score) + return client_score_; +} +inline void ClientPhishingRequest::set_client_score(float value) { + set_has_client_score(); + client_score_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingRequest.client_score) +} + +// optional bool is_phishing = 4; +inline bool ClientPhishingRequest::has_is_phishing() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ClientPhishingRequest::set_has_is_phishing() { + _has_bits_[0] |= 0x00000008u; +} +inline void ClientPhishingRequest::clear_has_is_phishing() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ClientPhishingRequest::clear_is_phishing() { + is_phishing_ = false; + clear_has_is_phishing(); +} +inline bool ClientPhishingRequest::is_phishing() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.is_phishing) + return is_phishing_; +} +inline void ClientPhishingRequest::set_is_phishing(bool value) { + set_has_is_phishing(); + is_phishing_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingRequest.is_phishing) +} + +// repeated .safe_browsing.ClientPhishingRequest.Feature feature_map = 5; +inline int ClientPhishingRequest::feature_map_size() const { + return feature_map_.size(); +} +inline void ClientPhishingRequest::clear_feature_map() { + feature_map_.Clear(); +} +inline const ::safe_browsing::ClientPhishingRequest_Feature& ClientPhishingRequest::feature_map(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.feature_map) + return feature_map_.Get(index); +} +inline ::safe_browsing::ClientPhishingRequest_Feature* ClientPhishingRequest::mutable_feature_map(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientPhishingRequest.feature_map) + return feature_map_.Mutable(index); +} +inline ::safe_browsing::ClientPhishingRequest_Feature* ClientPhishingRequest::add_feature_map() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientPhishingRequest.feature_map) + return feature_map_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature >& +ClientPhishingRequest::feature_map() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientPhishingRequest.feature_map) + return feature_map_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature >* +ClientPhishingRequest::mutable_feature_map() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientPhishingRequest.feature_map) + return &feature_map_; +} + +// optional int32 model_version = 6; +inline bool ClientPhishingRequest::has_model_version() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void ClientPhishingRequest::set_has_model_version() { + _has_bits_[0] |= 0x00000020u; +} +inline void ClientPhishingRequest::clear_has_model_version() { + _has_bits_[0] &= ~0x00000020u; +} +inline void ClientPhishingRequest::clear_model_version() { + model_version_ = 0; + clear_has_model_version(); +} +inline ::google::protobuf::int32 ClientPhishingRequest::model_version() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.model_version) + return model_version_; +} +inline void ClientPhishingRequest::set_model_version(::google::protobuf::int32 value) { + set_has_model_version(); + model_version_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingRequest.model_version) +} + +// repeated .safe_browsing.ClientPhishingRequest.Feature non_model_feature_map = 8; +inline int ClientPhishingRequest::non_model_feature_map_size() const { + return non_model_feature_map_.size(); +} +inline void ClientPhishingRequest::clear_non_model_feature_map() { + non_model_feature_map_.Clear(); +} +inline const ::safe_browsing::ClientPhishingRequest_Feature& ClientPhishingRequest::non_model_feature_map(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.non_model_feature_map) + return non_model_feature_map_.Get(index); +} +inline ::safe_browsing::ClientPhishingRequest_Feature* ClientPhishingRequest::mutable_non_model_feature_map(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientPhishingRequest.non_model_feature_map) + return non_model_feature_map_.Mutable(index); +} +inline ::safe_browsing::ClientPhishingRequest_Feature* ClientPhishingRequest::add_non_model_feature_map() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientPhishingRequest.non_model_feature_map) + return non_model_feature_map_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature >& +ClientPhishingRequest::non_model_feature_map() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientPhishingRequest.non_model_feature_map) + return non_model_feature_map_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientPhishingRequest_Feature >* +ClientPhishingRequest::mutable_non_model_feature_map() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientPhishingRequest.non_model_feature_map) + return &non_model_feature_map_; +} + +// optional string OBSOLETE_referrer_url = 9; +inline bool ClientPhishingRequest::has_obsolete_referrer_url() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void ClientPhishingRequest::set_has_obsolete_referrer_url() { + _has_bits_[0] |= 0x00000080u; +} +inline void ClientPhishingRequest::clear_has_obsolete_referrer_url() { + _has_bits_[0] &= ~0x00000080u; +} +inline void ClientPhishingRequest::clear_obsolete_referrer_url() { + if (obsolete_referrer_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_referrer_url_->clear(); + } + clear_has_obsolete_referrer_url(); +} +inline const ::std::string& ClientPhishingRequest::obsolete_referrer_url() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.OBSOLETE_referrer_url) + return *obsolete_referrer_url_; +} +inline void ClientPhishingRequest::set_obsolete_referrer_url(const ::std::string& value) { + set_has_obsolete_referrer_url(); + if (obsolete_referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_referrer_url_ = new ::std::string; + } + obsolete_referrer_url_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingRequest.OBSOLETE_referrer_url) +} +inline void ClientPhishingRequest::set_obsolete_referrer_url(const char* value) { + set_has_obsolete_referrer_url(); + if (obsolete_referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_referrer_url_ = new ::std::string; + } + obsolete_referrer_url_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientPhishingRequest.OBSOLETE_referrer_url) +} +inline void ClientPhishingRequest::set_obsolete_referrer_url(const char* value, size_t size) { + set_has_obsolete_referrer_url(); + if (obsolete_referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_referrer_url_ = new ::std::string; + } + obsolete_referrer_url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientPhishingRequest.OBSOLETE_referrer_url) +} +inline ::std::string* ClientPhishingRequest::mutable_obsolete_referrer_url() { + set_has_obsolete_referrer_url(); + if (obsolete_referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + obsolete_referrer_url_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientPhishingRequest.OBSOLETE_referrer_url) + return obsolete_referrer_url_; +} +inline ::std::string* ClientPhishingRequest::release_obsolete_referrer_url() { + clear_has_obsolete_referrer_url(); + if (obsolete_referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = obsolete_referrer_url_; + obsolete_referrer_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientPhishingRequest::set_allocated_obsolete_referrer_url(::std::string* obsolete_referrer_url) { + if (obsolete_referrer_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete obsolete_referrer_url_; + } + if (obsolete_referrer_url) { + set_has_obsolete_referrer_url(); + obsolete_referrer_url_ = obsolete_referrer_url; + } else { + clear_has_obsolete_referrer_url(); + obsolete_referrer_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientPhishingRequest.OBSOLETE_referrer_url) +} + +// repeated uint32 shingle_hashes = 12 [packed = true]; +inline int ClientPhishingRequest::shingle_hashes_size() const { + return shingle_hashes_.size(); +} +inline void ClientPhishingRequest::clear_shingle_hashes() { + shingle_hashes_.Clear(); +} +inline ::google::protobuf::uint32 ClientPhishingRequest::shingle_hashes(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingRequest.shingle_hashes) + return shingle_hashes_.Get(index); +} +inline void ClientPhishingRequest::set_shingle_hashes(int index, ::google::protobuf::uint32 value) { + shingle_hashes_.Set(index, value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingRequest.shingle_hashes) +} +inline void ClientPhishingRequest::add_shingle_hashes(::google::protobuf::uint32 value) { + shingle_hashes_.Add(value); + // @@protoc_insertion_point(field_add:safe_browsing.ClientPhishingRequest.shingle_hashes) +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >& +ClientPhishingRequest::shingle_hashes() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientPhishingRequest.shingle_hashes) + return shingle_hashes_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::uint32 >* +ClientPhishingRequest::mutable_shingle_hashes() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientPhishingRequest.shingle_hashes) + return &shingle_hashes_; +} + +// ------------------------------------------------------------------- + +// ClientPhishingResponse + +// required bool phishy = 1; +inline bool ClientPhishingResponse::has_phishy() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientPhishingResponse::set_has_phishy() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientPhishingResponse::clear_has_phishy() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientPhishingResponse::clear_phishy() { + phishy_ = false; + clear_has_phishy(); +} +inline bool ClientPhishingResponse::phishy() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingResponse.phishy) + return phishy_; +} +inline void ClientPhishingResponse::set_phishy(bool value) { + set_has_phishy(); + phishy_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingResponse.phishy) +} + +// repeated string OBSOLETE_whitelist_expression = 2; +inline int ClientPhishingResponse::obsolete_whitelist_expression_size() const { + return obsolete_whitelist_expression_.size(); +} +inline void ClientPhishingResponse::clear_obsolete_whitelist_expression() { + obsolete_whitelist_expression_.Clear(); +} +inline const ::std::string& ClientPhishingResponse::obsolete_whitelist_expression(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) + return obsolete_whitelist_expression_.Get(index); +} +inline ::std::string* ClientPhishingResponse::mutable_obsolete_whitelist_expression(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) + return obsolete_whitelist_expression_.Mutable(index); +} +inline void ClientPhishingResponse::set_obsolete_whitelist_expression(int index, const ::std::string& value) { + // @@protoc_insertion_point(field_set:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) + obsolete_whitelist_expression_.Mutable(index)->assign(value); +} +inline void ClientPhishingResponse::set_obsolete_whitelist_expression(int index, const char* value) { + obsolete_whitelist_expression_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) +} +inline void ClientPhishingResponse::set_obsolete_whitelist_expression(int index, const char* value, size_t size) { + obsolete_whitelist_expression_.Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) +} +inline ::std::string* ClientPhishingResponse::add_obsolete_whitelist_expression() { + return obsolete_whitelist_expression_.Add(); +} +inline void ClientPhishingResponse::add_obsolete_whitelist_expression(const ::std::string& value) { + obsolete_whitelist_expression_.Add()->assign(value); + // @@protoc_insertion_point(field_add:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) +} +inline void ClientPhishingResponse::add_obsolete_whitelist_expression(const char* value) { + obsolete_whitelist_expression_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) +} +inline void ClientPhishingResponse::add_obsolete_whitelist_expression(const char* value, size_t size) { + obsolete_whitelist_expression_.Add()->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +ClientPhishingResponse::obsolete_whitelist_expression() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) + return obsolete_whitelist_expression_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +ClientPhishingResponse::mutable_obsolete_whitelist_expression() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientPhishingResponse.OBSOLETE_whitelist_expression) + return &obsolete_whitelist_expression_; +} + +// ------------------------------------------------------------------- + +// ClientMalwareRequest_UrlInfo + +// required string ip = 1; +inline bool ClientMalwareRequest_UrlInfo::has_ip() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientMalwareRequest_UrlInfo::set_has_ip() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientMalwareRequest_UrlInfo::clear_has_ip() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientMalwareRequest_UrlInfo::clear_ip() { + if (ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + ip_->clear(); + } + clear_has_ip(); +} +inline const ::std::string& ClientMalwareRequest_UrlInfo::ip() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareRequest.UrlInfo.ip) + return *ip_; +} +inline void ClientMalwareRequest_UrlInfo::set_ip(const ::std::string& value) { + set_has_ip(); + if (ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + ip_ = new ::std::string; + } + ip_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareRequest.UrlInfo.ip) +} +inline void ClientMalwareRequest_UrlInfo::set_ip(const char* value) { + set_has_ip(); + if (ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + ip_ = new ::std::string; + } + ip_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientMalwareRequest.UrlInfo.ip) +} +inline void ClientMalwareRequest_UrlInfo::set_ip(const char* value, size_t size) { + set_has_ip(); + if (ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + ip_ = new ::std::string; + } + ip_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientMalwareRequest.UrlInfo.ip) +} +inline ::std::string* ClientMalwareRequest_UrlInfo::mutable_ip() { + set_has_ip(); + if (ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + ip_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientMalwareRequest.UrlInfo.ip) + return ip_; +} +inline ::std::string* ClientMalwareRequest_UrlInfo::release_ip() { + clear_has_ip(); + if (ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = ip_; + ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientMalwareRequest_UrlInfo::set_allocated_ip(::std::string* ip) { + if (ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete ip_; + } + if (ip) { + set_has_ip(); + ip_ = ip; + } else { + clear_has_ip(); + ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientMalwareRequest.UrlInfo.ip) +} + +// required string url = 2; +inline bool ClientMalwareRequest_UrlInfo::has_url() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientMalwareRequest_UrlInfo::set_has_url() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientMalwareRequest_UrlInfo::clear_has_url() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientMalwareRequest_UrlInfo::clear_url() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + clear_has_url(); +} +inline const ::std::string& ClientMalwareRequest_UrlInfo::url() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareRequest.UrlInfo.url) + return *url_; +} +inline void ClientMalwareRequest_UrlInfo::set_url(const ::std::string& value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareRequest.UrlInfo.url) +} +inline void ClientMalwareRequest_UrlInfo::set_url(const char* value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientMalwareRequest.UrlInfo.url) +} +inline void ClientMalwareRequest_UrlInfo::set_url(const char* value, size_t size) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientMalwareRequest.UrlInfo.url) +} +inline ::std::string* ClientMalwareRequest_UrlInfo::mutable_url() { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientMalwareRequest.UrlInfo.url) + return url_; +} +inline ::std::string* ClientMalwareRequest_UrlInfo::release_url() { + clear_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = url_; + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientMalwareRequest_UrlInfo::set_allocated_url(::std::string* url) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (url) { + set_has_url(); + url_ = url; + } else { + clear_has_url(); + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientMalwareRequest.UrlInfo.url) +} + +// optional string method = 3; +inline bool ClientMalwareRequest_UrlInfo::has_method() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientMalwareRequest_UrlInfo::set_has_method() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientMalwareRequest_UrlInfo::clear_has_method() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientMalwareRequest_UrlInfo::clear_method() { + if (method_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + method_->clear(); + } + clear_has_method(); +} +inline const ::std::string& ClientMalwareRequest_UrlInfo::method() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareRequest.UrlInfo.method) + return *method_; +} +inline void ClientMalwareRequest_UrlInfo::set_method(const ::std::string& value) { + set_has_method(); + if (method_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + method_ = new ::std::string; + } + method_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareRequest.UrlInfo.method) +} +inline void ClientMalwareRequest_UrlInfo::set_method(const char* value) { + set_has_method(); + if (method_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + method_ = new ::std::string; + } + method_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientMalwareRequest.UrlInfo.method) +} +inline void ClientMalwareRequest_UrlInfo::set_method(const char* value, size_t size) { + set_has_method(); + if (method_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + method_ = new ::std::string; + } + method_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientMalwareRequest.UrlInfo.method) +} +inline ::std::string* ClientMalwareRequest_UrlInfo::mutable_method() { + set_has_method(); + if (method_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + method_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientMalwareRequest.UrlInfo.method) + return method_; +} +inline ::std::string* ClientMalwareRequest_UrlInfo::release_method() { + clear_has_method(); + if (method_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = method_; + method_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientMalwareRequest_UrlInfo::set_allocated_method(::std::string* method) { + if (method_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete method_; + } + if (method) { + set_has_method(); + method_ = method; + } else { + clear_has_method(); + method_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientMalwareRequest.UrlInfo.method) +} + +// optional string referrer = 4; +inline bool ClientMalwareRequest_UrlInfo::has_referrer() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ClientMalwareRequest_UrlInfo::set_has_referrer() { + _has_bits_[0] |= 0x00000008u; +} +inline void ClientMalwareRequest_UrlInfo::clear_has_referrer() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ClientMalwareRequest_UrlInfo::clear_referrer() { + if (referrer_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_->clear(); + } + clear_has_referrer(); +} +inline const ::std::string& ClientMalwareRequest_UrlInfo::referrer() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareRequest.UrlInfo.referrer) + return *referrer_; +} +inline void ClientMalwareRequest_UrlInfo::set_referrer(const ::std::string& value) { + set_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_ = new ::std::string; + } + referrer_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareRequest.UrlInfo.referrer) +} +inline void ClientMalwareRequest_UrlInfo::set_referrer(const char* value) { + set_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_ = new ::std::string; + } + referrer_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientMalwareRequest.UrlInfo.referrer) +} +inline void ClientMalwareRequest_UrlInfo::set_referrer(const char* value, size_t size) { + set_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_ = new ::std::string; + } + referrer_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientMalwareRequest.UrlInfo.referrer) +} +inline ::std::string* ClientMalwareRequest_UrlInfo::mutable_referrer() { + set_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientMalwareRequest.UrlInfo.referrer) + return referrer_; +} +inline ::std::string* ClientMalwareRequest_UrlInfo::release_referrer() { + clear_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = referrer_; + referrer_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientMalwareRequest_UrlInfo::set_allocated_referrer(::std::string* referrer) { + if (referrer_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete referrer_; + } + if (referrer) { + set_has_referrer(); + referrer_ = referrer; + } else { + clear_has_referrer(); + referrer_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientMalwareRequest.UrlInfo.referrer) +} + +// optional int32 resource_type = 5; +inline bool ClientMalwareRequest_UrlInfo::has_resource_type() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void ClientMalwareRequest_UrlInfo::set_has_resource_type() { + _has_bits_[0] |= 0x00000010u; +} +inline void ClientMalwareRequest_UrlInfo::clear_has_resource_type() { + _has_bits_[0] &= ~0x00000010u; +} +inline void ClientMalwareRequest_UrlInfo::clear_resource_type() { + resource_type_ = 0; + clear_has_resource_type(); +} +inline ::google::protobuf::int32 ClientMalwareRequest_UrlInfo::resource_type() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareRequest.UrlInfo.resource_type) + return resource_type_; +} +inline void ClientMalwareRequest_UrlInfo::set_resource_type(::google::protobuf::int32 value) { + set_has_resource_type(); + resource_type_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareRequest.UrlInfo.resource_type) +} + +// ------------------------------------------------------------------- + +// ClientMalwareRequest + +// required string url = 1; +inline bool ClientMalwareRequest::has_url() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientMalwareRequest::set_has_url() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientMalwareRequest::clear_has_url() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientMalwareRequest::clear_url() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + clear_has_url(); +} +inline const ::std::string& ClientMalwareRequest::url() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareRequest.url) + return *url_; +} +inline void ClientMalwareRequest::set_url(const ::std::string& value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareRequest.url) +} +inline void ClientMalwareRequest::set_url(const char* value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientMalwareRequest.url) +} +inline void ClientMalwareRequest::set_url(const char* value, size_t size) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientMalwareRequest.url) +} +inline ::std::string* ClientMalwareRequest::mutable_url() { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientMalwareRequest.url) + return url_; +} +inline ::std::string* ClientMalwareRequest::release_url() { + clear_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = url_; + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientMalwareRequest::set_allocated_url(::std::string* url) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (url) { + set_has_url(); + url_ = url; + } else { + clear_has_url(); + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientMalwareRequest.url) +} + +// optional string referrer_url = 4; +inline bool ClientMalwareRequest::has_referrer_url() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientMalwareRequest::set_has_referrer_url() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientMalwareRequest::clear_has_referrer_url() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientMalwareRequest::clear_referrer_url() { + if (referrer_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_url_->clear(); + } + clear_has_referrer_url(); +} +inline const ::std::string& ClientMalwareRequest::referrer_url() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareRequest.referrer_url) + return *referrer_url_; +} +inline void ClientMalwareRequest::set_referrer_url(const ::std::string& value) { + set_has_referrer_url(); + if (referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_url_ = new ::std::string; + } + referrer_url_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareRequest.referrer_url) +} +inline void ClientMalwareRequest::set_referrer_url(const char* value) { + set_has_referrer_url(); + if (referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_url_ = new ::std::string; + } + referrer_url_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientMalwareRequest.referrer_url) +} +inline void ClientMalwareRequest::set_referrer_url(const char* value, size_t size) { + set_has_referrer_url(); + if (referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_url_ = new ::std::string; + } + referrer_url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientMalwareRequest.referrer_url) +} +inline ::std::string* ClientMalwareRequest::mutable_referrer_url() { + set_has_referrer_url(); + if (referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_url_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientMalwareRequest.referrer_url) + return referrer_url_; +} +inline ::std::string* ClientMalwareRequest::release_referrer_url() { + clear_has_referrer_url(); + if (referrer_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = referrer_url_; + referrer_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientMalwareRequest::set_allocated_referrer_url(::std::string* referrer_url) { + if (referrer_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete referrer_url_; + } + if (referrer_url) { + set_has_referrer_url(); + referrer_url_ = referrer_url; + } else { + clear_has_referrer_url(); + referrer_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientMalwareRequest.referrer_url) +} + +// repeated .safe_browsing.ClientMalwareRequest.UrlInfo bad_ip_url_info = 7; +inline int ClientMalwareRequest::bad_ip_url_info_size() const { + return bad_ip_url_info_.size(); +} +inline void ClientMalwareRequest::clear_bad_ip_url_info() { + bad_ip_url_info_.Clear(); +} +inline const ::safe_browsing::ClientMalwareRequest_UrlInfo& ClientMalwareRequest::bad_ip_url_info(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareRequest.bad_ip_url_info) + return bad_ip_url_info_.Get(index); +} +inline ::safe_browsing::ClientMalwareRequest_UrlInfo* ClientMalwareRequest::mutable_bad_ip_url_info(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientMalwareRequest.bad_ip_url_info) + return bad_ip_url_info_.Mutable(index); +} +inline ::safe_browsing::ClientMalwareRequest_UrlInfo* ClientMalwareRequest::add_bad_ip_url_info() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientMalwareRequest.bad_ip_url_info) + return bad_ip_url_info_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientMalwareRequest_UrlInfo >& +ClientMalwareRequest::bad_ip_url_info() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientMalwareRequest.bad_ip_url_info) + return bad_ip_url_info_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientMalwareRequest_UrlInfo >* +ClientMalwareRequest::mutable_bad_ip_url_info() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientMalwareRequest.bad_ip_url_info) + return &bad_ip_url_info_; +} + +// ------------------------------------------------------------------- + +// ClientMalwareResponse + +// required bool blacklist = 1; +inline bool ClientMalwareResponse::has_blacklist() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientMalwareResponse::set_has_blacklist() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientMalwareResponse::clear_has_blacklist() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientMalwareResponse::clear_blacklist() { + blacklist_ = false; + clear_has_blacklist(); +} +inline bool ClientMalwareResponse::blacklist() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareResponse.blacklist) + return blacklist_; +} +inline void ClientMalwareResponse::set_blacklist(bool value) { + set_has_blacklist(); + blacklist_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareResponse.blacklist) +} + +// optional string bad_ip = 2; +inline bool ClientMalwareResponse::has_bad_ip() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientMalwareResponse::set_has_bad_ip() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientMalwareResponse::clear_has_bad_ip() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientMalwareResponse::clear_bad_ip() { + if (bad_ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_ip_->clear(); + } + clear_has_bad_ip(); +} +inline const ::std::string& ClientMalwareResponse::bad_ip() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareResponse.bad_ip) + return *bad_ip_; +} +inline void ClientMalwareResponse::set_bad_ip(const ::std::string& value) { + set_has_bad_ip(); + if (bad_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_ip_ = new ::std::string; + } + bad_ip_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareResponse.bad_ip) +} +inline void ClientMalwareResponse::set_bad_ip(const char* value) { + set_has_bad_ip(); + if (bad_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_ip_ = new ::std::string; + } + bad_ip_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientMalwareResponse.bad_ip) +} +inline void ClientMalwareResponse::set_bad_ip(const char* value, size_t size) { + set_has_bad_ip(); + if (bad_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_ip_ = new ::std::string; + } + bad_ip_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientMalwareResponse.bad_ip) +} +inline ::std::string* ClientMalwareResponse::mutable_bad_ip() { + set_has_bad_ip(); + if (bad_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_ip_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientMalwareResponse.bad_ip) + return bad_ip_; +} +inline ::std::string* ClientMalwareResponse::release_bad_ip() { + clear_has_bad_ip(); + if (bad_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = bad_ip_; + bad_ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientMalwareResponse::set_allocated_bad_ip(::std::string* bad_ip) { + if (bad_ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete bad_ip_; + } + if (bad_ip) { + set_has_bad_ip(); + bad_ip_ = bad_ip; + } else { + clear_has_bad_ip(); + bad_ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientMalwareResponse.bad_ip) +} + +// optional string bad_url = 3; +inline bool ClientMalwareResponse::has_bad_url() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientMalwareResponse::set_has_bad_url() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientMalwareResponse::clear_has_bad_url() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientMalwareResponse::clear_bad_url() { + if (bad_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_url_->clear(); + } + clear_has_bad_url(); +} +inline const ::std::string& ClientMalwareResponse::bad_url() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientMalwareResponse.bad_url) + return *bad_url_; +} +inline void ClientMalwareResponse::set_bad_url(const ::std::string& value) { + set_has_bad_url(); + if (bad_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_url_ = new ::std::string; + } + bad_url_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientMalwareResponse.bad_url) +} +inline void ClientMalwareResponse::set_bad_url(const char* value) { + set_has_bad_url(); + if (bad_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_url_ = new ::std::string; + } + bad_url_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientMalwareResponse.bad_url) +} +inline void ClientMalwareResponse::set_bad_url(const char* value, size_t size) { + set_has_bad_url(); + if (bad_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_url_ = new ::std::string; + } + bad_url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientMalwareResponse.bad_url) +} +inline ::std::string* ClientMalwareResponse::mutable_bad_url() { + set_has_bad_url(); + if (bad_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + bad_url_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientMalwareResponse.bad_url) + return bad_url_; +} +inline ::std::string* ClientMalwareResponse::release_bad_url() { + clear_has_bad_url(); + if (bad_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = bad_url_; + bad_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientMalwareResponse::set_allocated_bad_url(::std::string* bad_url) { + if (bad_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete bad_url_; + } + if (bad_url) { + set_has_bad_url(); + bad_url_ = bad_url; + } else { + clear_has_bad_url(); + bad_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientMalwareResponse.bad_url) +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest_Digests + +// optional bytes sha256 = 1; +inline bool ClientDownloadRequest_Digests::has_sha256() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadRequest_Digests::set_has_sha256() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadRequest_Digests::clear_has_sha256() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadRequest_Digests::clear_sha256() { + if (sha256_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha256_->clear(); + } + clear_has_sha256(); +} +inline const ::std::string& ClientDownloadRequest_Digests::sha256() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.Digests.sha256) + return *sha256_; +} +inline void ClientDownloadRequest_Digests::set_sha256(const ::std::string& value) { + set_has_sha256(); + if (sha256_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha256_ = new ::std::string; + } + sha256_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.Digests.sha256) +} +inline void ClientDownloadRequest_Digests::set_sha256(const char* value) { + set_has_sha256(); + if (sha256_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha256_ = new ::std::string; + } + sha256_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.Digests.sha256) +} +inline void ClientDownloadRequest_Digests::set_sha256(const void* value, size_t size) { + set_has_sha256(); + if (sha256_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha256_ = new ::std::string; + } + sha256_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.Digests.sha256) +} +inline ::std::string* ClientDownloadRequest_Digests::mutable_sha256() { + set_has_sha256(); + if (sha256_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha256_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.Digests.sha256) + return sha256_; +} +inline ::std::string* ClientDownloadRequest_Digests::release_sha256() { + clear_has_sha256(); + if (sha256_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = sha256_; + sha256_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_Digests::set_allocated_sha256(::std::string* sha256) { + if (sha256_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete sha256_; + } + if (sha256) { + set_has_sha256(); + sha256_ = sha256; + } else { + clear_has_sha256(); + sha256_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.Digests.sha256) +} + +// optional bytes sha1 = 2; +inline bool ClientDownloadRequest_Digests::has_sha1() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadRequest_Digests::set_has_sha1() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadRequest_Digests::clear_has_sha1() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadRequest_Digests::clear_sha1() { + if (sha1_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha1_->clear(); + } + clear_has_sha1(); +} +inline const ::std::string& ClientDownloadRequest_Digests::sha1() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.Digests.sha1) + return *sha1_; +} +inline void ClientDownloadRequest_Digests::set_sha1(const ::std::string& value) { + set_has_sha1(); + if (sha1_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha1_ = new ::std::string; + } + sha1_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.Digests.sha1) +} +inline void ClientDownloadRequest_Digests::set_sha1(const char* value) { + set_has_sha1(); + if (sha1_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha1_ = new ::std::string; + } + sha1_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.Digests.sha1) +} +inline void ClientDownloadRequest_Digests::set_sha1(const void* value, size_t size) { + set_has_sha1(); + if (sha1_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha1_ = new ::std::string; + } + sha1_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.Digests.sha1) +} +inline ::std::string* ClientDownloadRequest_Digests::mutable_sha1() { + set_has_sha1(); + if (sha1_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + sha1_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.Digests.sha1) + return sha1_; +} +inline ::std::string* ClientDownloadRequest_Digests::release_sha1() { + clear_has_sha1(); + if (sha1_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = sha1_; + sha1_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_Digests::set_allocated_sha1(::std::string* sha1) { + if (sha1_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete sha1_; + } + if (sha1) { + set_has_sha1(); + sha1_ = sha1; + } else { + clear_has_sha1(); + sha1_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.Digests.sha1) +} + +// optional bytes md5 = 3; +inline bool ClientDownloadRequest_Digests::has_md5() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientDownloadRequest_Digests::set_has_md5() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientDownloadRequest_Digests::clear_has_md5() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientDownloadRequest_Digests::clear_md5() { + if (md5_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + md5_->clear(); + } + clear_has_md5(); +} +inline const ::std::string& ClientDownloadRequest_Digests::md5() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.Digests.md5) + return *md5_; +} +inline void ClientDownloadRequest_Digests::set_md5(const ::std::string& value) { + set_has_md5(); + if (md5_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + md5_ = new ::std::string; + } + md5_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.Digests.md5) +} +inline void ClientDownloadRequest_Digests::set_md5(const char* value) { + set_has_md5(); + if (md5_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + md5_ = new ::std::string; + } + md5_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.Digests.md5) +} +inline void ClientDownloadRequest_Digests::set_md5(const void* value, size_t size) { + set_has_md5(); + if (md5_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + md5_ = new ::std::string; + } + md5_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.Digests.md5) +} +inline ::std::string* ClientDownloadRequest_Digests::mutable_md5() { + set_has_md5(); + if (md5_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + md5_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.Digests.md5) + return md5_; +} +inline ::std::string* ClientDownloadRequest_Digests::release_md5() { + clear_has_md5(); + if (md5_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = md5_; + md5_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_Digests::set_allocated_md5(::std::string* md5) { + if (md5_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete md5_; + } + if (md5) { + set_has_md5(); + md5_ = md5; + } else { + clear_has_md5(); + md5_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.Digests.md5) +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest_Resource + +// required string url = 1; +inline bool ClientDownloadRequest_Resource::has_url() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadRequest_Resource::set_has_url() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadRequest_Resource::clear_has_url() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadRequest_Resource::clear_url() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + clear_has_url(); +} +inline const ::std::string& ClientDownloadRequest_Resource::url() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.Resource.url) + return *url_; +} +inline void ClientDownloadRequest_Resource::set_url(const ::std::string& value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.Resource.url) +} +inline void ClientDownloadRequest_Resource::set_url(const char* value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.Resource.url) +} +inline void ClientDownloadRequest_Resource::set_url(const char* value, size_t size) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.Resource.url) +} +inline ::std::string* ClientDownloadRequest_Resource::mutable_url() { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.Resource.url) + return url_; +} +inline ::std::string* ClientDownloadRequest_Resource::release_url() { + clear_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = url_; + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_Resource::set_allocated_url(::std::string* url) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (url) { + set_has_url(); + url_ = url; + } else { + clear_has_url(); + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.Resource.url) +} + +// required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; +inline bool ClientDownloadRequest_Resource::has_type() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadRequest_Resource::set_has_type() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadRequest_Resource::clear_has_type() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadRequest_Resource::clear_type() { + type_ = 0; + clear_has_type(); +} +inline ::safe_browsing::ClientDownloadRequest_ResourceType ClientDownloadRequest_Resource::type() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.Resource.type) + return static_cast< ::safe_browsing::ClientDownloadRequest_ResourceType >(type_); +} +inline void ClientDownloadRequest_Resource::set_type(::safe_browsing::ClientDownloadRequest_ResourceType value) { + assert(::safe_browsing::ClientDownloadRequest_ResourceType_IsValid(value)); + set_has_type(); + type_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.Resource.type) +} + +// optional bytes remote_ip = 3; +inline bool ClientDownloadRequest_Resource::has_remote_ip() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientDownloadRequest_Resource::set_has_remote_ip() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientDownloadRequest_Resource::clear_has_remote_ip() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientDownloadRequest_Resource::clear_remote_ip() { + if (remote_ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + remote_ip_->clear(); + } + clear_has_remote_ip(); +} +inline const ::std::string& ClientDownloadRequest_Resource::remote_ip() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.Resource.remote_ip) + return *remote_ip_; +} +inline void ClientDownloadRequest_Resource::set_remote_ip(const ::std::string& value) { + set_has_remote_ip(); + if (remote_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + remote_ip_ = new ::std::string; + } + remote_ip_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.Resource.remote_ip) +} +inline void ClientDownloadRequest_Resource::set_remote_ip(const char* value) { + set_has_remote_ip(); + if (remote_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + remote_ip_ = new ::std::string; + } + remote_ip_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.Resource.remote_ip) +} +inline void ClientDownloadRequest_Resource::set_remote_ip(const void* value, size_t size) { + set_has_remote_ip(); + if (remote_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + remote_ip_ = new ::std::string; + } + remote_ip_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.Resource.remote_ip) +} +inline ::std::string* ClientDownloadRequest_Resource::mutable_remote_ip() { + set_has_remote_ip(); + if (remote_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + remote_ip_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.Resource.remote_ip) + return remote_ip_; +} +inline ::std::string* ClientDownloadRequest_Resource::release_remote_ip() { + clear_has_remote_ip(); + if (remote_ip_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = remote_ip_; + remote_ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_Resource::set_allocated_remote_ip(::std::string* remote_ip) { + if (remote_ip_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete remote_ip_; + } + if (remote_ip) { + set_has_remote_ip(); + remote_ip_ = remote_ip; + } else { + clear_has_remote_ip(); + remote_ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.Resource.remote_ip) +} + +// optional string referrer = 4; +inline bool ClientDownloadRequest_Resource::has_referrer() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ClientDownloadRequest_Resource::set_has_referrer() { + _has_bits_[0] |= 0x00000008u; +} +inline void ClientDownloadRequest_Resource::clear_has_referrer() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ClientDownloadRequest_Resource::clear_referrer() { + if (referrer_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_->clear(); + } + clear_has_referrer(); +} +inline const ::std::string& ClientDownloadRequest_Resource::referrer() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.Resource.referrer) + return *referrer_; +} +inline void ClientDownloadRequest_Resource::set_referrer(const ::std::string& value) { + set_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_ = new ::std::string; + } + referrer_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.Resource.referrer) +} +inline void ClientDownloadRequest_Resource::set_referrer(const char* value) { + set_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_ = new ::std::string; + } + referrer_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.Resource.referrer) +} +inline void ClientDownloadRequest_Resource::set_referrer(const char* value, size_t size) { + set_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_ = new ::std::string; + } + referrer_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.Resource.referrer) +} +inline ::std::string* ClientDownloadRequest_Resource::mutable_referrer() { + set_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + referrer_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.Resource.referrer) + return referrer_; +} +inline ::std::string* ClientDownloadRequest_Resource::release_referrer() { + clear_has_referrer(); + if (referrer_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = referrer_; + referrer_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_Resource::set_allocated_referrer(::std::string* referrer) { + if (referrer_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete referrer_; + } + if (referrer) { + set_has_referrer(); + referrer_ = referrer; + } else { + clear_has_referrer(); + referrer_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.Resource.referrer) +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest_CertificateChain_Element + +// optional bytes certificate = 1; +inline bool ClientDownloadRequest_CertificateChain_Element::has_certificate() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadRequest_CertificateChain_Element::set_has_certificate() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadRequest_CertificateChain_Element::clear_has_certificate() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadRequest_CertificateChain_Element::clear_certificate() { + if (certificate_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + certificate_->clear(); + } + clear_has_certificate(); +} +inline const ::std::string& ClientDownloadRequest_CertificateChain_Element::certificate() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.CertificateChain.Element.certificate) + return *certificate_; +} +inline void ClientDownloadRequest_CertificateChain_Element::set_certificate(const ::std::string& value) { + set_has_certificate(); + if (certificate_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + certificate_ = new ::std::string; + } + certificate_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.CertificateChain.Element.certificate) +} +inline void ClientDownloadRequest_CertificateChain_Element::set_certificate(const char* value) { + set_has_certificate(); + if (certificate_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + certificate_ = new ::std::string; + } + certificate_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.CertificateChain.Element.certificate) +} +inline void ClientDownloadRequest_CertificateChain_Element::set_certificate(const void* value, size_t size) { + set_has_certificate(); + if (certificate_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + certificate_ = new ::std::string; + } + certificate_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.CertificateChain.Element.certificate) +} +inline ::std::string* ClientDownloadRequest_CertificateChain_Element::mutable_certificate() { + set_has_certificate(); + if (certificate_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + certificate_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.CertificateChain.Element.certificate) + return certificate_; +} +inline ::std::string* ClientDownloadRequest_CertificateChain_Element::release_certificate() { + clear_has_certificate(); + if (certificate_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = certificate_; + certificate_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_CertificateChain_Element::set_allocated_certificate(::std::string* certificate) { + if (certificate_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete certificate_; + } + if (certificate) { + set_has_certificate(); + certificate_ = certificate; + } else { + clear_has_certificate(); + certificate_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.CertificateChain.Element.certificate) +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest_CertificateChain + +// repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; +inline int ClientDownloadRequest_CertificateChain::element_size() const { + return element_.size(); +} +inline void ClientDownloadRequest_CertificateChain::clear_element() { + element_.Clear(); +} +inline const ::safe_browsing::ClientDownloadRequest_CertificateChain_Element& ClientDownloadRequest_CertificateChain::element(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.CertificateChain.element) + return element_.Get(index); +} +inline ::safe_browsing::ClientDownloadRequest_CertificateChain_Element* ClientDownloadRequest_CertificateChain::mutable_element(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.CertificateChain.element) + return element_.Mutable(index); +} +inline ::safe_browsing::ClientDownloadRequest_CertificateChain_Element* ClientDownloadRequest_CertificateChain::add_element() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientDownloadRequest.CertificateChain.element) + return element_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element >& +ClientDownloadRequest_CertificateChain::element() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientDownloadRequest.CertificateChain.element) + return element_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element >* +ClientDownloadRequest_CertificateChain::mutable_element() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientDownloadRequest.CertificateChain.element) + return &element_; +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest_SignatureInfo + +// repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; +inline int ClientDownloadRequest_SignatureInfo::certificate_chain_size() const { + return certificate_chain_.size(); +} +inline void ClientDownloadRequest_SignatureInfo::clear_certificate_chain() { + certificate_chain_.Clear(); +} +inline const ::safe_browsing::ClientDownloadRequest_CertificateChain& ClientDownloadRequest_SignatureInfo::certificate_chain(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.SignatureInfo.certificate_chain) + return certificate_chain_.Get(index); +} +inline ::safe_browsing::ClientDownloadRequest_CertificateChain* ClientDownloadRequest_SignatureInfo::mutable_certificate_chain(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.SignatureInfo.certificate_chain) + return certificate_chain_.Mutable(index); +} +inline ::safe_browsing::ClientDownloadRequest_CertificateChain* ClientDownloadRequest_SignatureInfo::add_certificate_chain() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientDownloadRequest.SignatureInfo.certificate_chain) + return certificate_chain_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain >& +ClientDownloadRequest_SignatureInfo::certificate_chain() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientDownloadRequest.SignatureInfo.certificate_chain) + return certificate_chain_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain >* +ClientDownloadRequest_SignatureInfo::mutable_certificate_chain() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientDownloadRequest.SignatureInfo.certificate_chain) + return &certificate_chain_; +} + +// optional bool trusted = 2; +inline bool ClientDownloadRequest_SignatureInfo::has_trusted() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadRequest_SignatureInfo::set_has_trusted() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadRequest_SignatureInfo::clear_has_trusted() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadRequest_SignatureInfo::clear_trusted() { + trusted_ = false; + clear_has_trusted(); +} +inline bool ClientDownloadRequest_SignatureInfo::trusted() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.SignatureInfo.trusted) + return trusted_; +} +inline void ClientDownloadRequest_SignatureInfo::set_trusted(bool value) { + set_has_trusted(); + trusted_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.SignatureInfo.trusted) +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest_PEImageHeaders_DebugData + +// optional bytes directory_entry = 1; +inline bool ClientDownloadRequest_PEImageHeaders_DebugData::has_directory_entry() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_has_directory_entry() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::clear_has_directory_entry() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::clear_directory_entry() { + if (directory_entry_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + directory_entry_->clear(); + } + clear_has_directory_entry(); +} +inline const ::std::string& ClientDownloadRequest_PEImageHeaders_DebugData::directory_entry() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.directory_entry) + return *directory_entry_; +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_directory_entry(const ::std::string& value) { + set_has_directory_entry(); + if (directory_entry_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + directory_entry_ = new ::std::string; + } + directory_entry_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.directory_entry) +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_directory_entry(const char* value) { + set_has_directory_entry(); + if (directory_entry_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + directory_entry_ = new ::std::string; + } + directory_entry_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.directory_entry) +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_directory_entry(const void* value, size_t size) { + set_has_directory_entry(); + if (directory_entry_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + directory_entry_ = new ::std::string; + } + directory_entry_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.directory_entry) +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders_DebugData::mutable_directory_entry() { + set_has_directory_entry(); + if (directory_entry_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + directory_entry_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.directory_entry) + return directory_entry_; +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders_DebugData::release_directory_entry() { + clear_has_directory_entry(); + if (directory_entry_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = directory_entry_; + directory_entry_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_allocated_directory_entry(::std::string* directory_entry) { + if (directory_entry_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete directory_entry_; + } + if (directory_entry) { + set_has_directory_entry(); + directory_entry_ = directory_entry; + } else { + clear_has_directory_entry(); + directory_entry_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.directory_entry) +} + +// optional bytes raw_data = 2; +inline bool ClientDownloadRequest_PEImageHeaders_DebugData::has_raw_data() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_has_raw_data() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::clear_has_raw_data() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::clear_raw_data() { + if (raw_data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + raw_data_->clear(); + } + clear_has_raw_data(); +} +inline const ::std::string& ClientDownloadRequest_PEImageHeaders_DebugData::raw_data() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.raw_data) + return *raw_data_; +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_raw_data(const ::std::string& value) { + set_has_raw_data(); + if (raw_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + raw_data_ = new ::std::string; + } + raw_data_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.raw_data) +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_raw_data(const char* value) { + set_has_raw_data(); + if (raw_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + raw_data_ = new ::std::string; + } + raw_data_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.raw_data) +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_raw_data(const void* value, size_t size) { + set_has_raw_data(); + if (raw_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + raw_data_ = new ::std::string; + } + raw_data_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.raw_data) +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders_DebugData::mutable_raw_data() { + set_has_raw_data(); + if (raw_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + raw_data_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.raw_data) + return raw_data_; +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders_DebugData::release_raw_data() { + clear_has_raw_data(); + if (raw_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = raw_data_; + raw_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_allocated_raw_data(::std::string* raw_data) { + if (raw_data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete raw_data_; + } + if (raw_data) { + set_has_raw_data(); + raw_data_ = raw_data; + } else { + clear_has_raw_data(); + raw_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData.raw_data) +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest_PEImageHeaders + +// optional bytes dos_header = 1; +inline bool ClientDownloadRequest_PEImageHeaders::has_dos_header() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadRequest_PEImageHeaders::set_has_dos_header() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_has_dos_header() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_dos_header() { + if (dos_header_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + dos_header_->clear(); + } + clear_has_dos_header(); +} +inline const ::std::string& ClientDownloadRequest_PEImageHeaders::dos_header() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.PEImageHeaders.dos_header) + return *dos_header_; +} +inline void ClientDownloadRequest_PEImageHeaders::set_dos_header(const ::std::string& value) { + set_has_dos_header(); + if (dos_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + dos_header_ = new ::std::string; + } + dos_header_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.PEImageHeaders.dos_header) +} +inline void ClientDownloadRequest_PEImageHeaders::set_dos_header(const char* value) { + set_has_dos_header(); + if (dos_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + dos_header_ = new ::std::string; + } + dos_header_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.PEImageHeaders.dos_header) +} +inline void ClientDownloadRequest_PEImageHeaders::set_dos_header(const void* value, size_t size) { + set_has_dos_header(); + if (dos_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + dos_header_ = new ::std::string; + } + dos_header_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.PEImageHeaders.dos_header) +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_dos_header() { + set_has_dos_header(); + if (dos_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + dos_header_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.PEImageHeaders.dos_header) + return dos_header_; +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_dos_header() { + clear_has_dos_header(); + if (dos_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = dos_header_; + dos_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_PEImageHeaders::set_allocated_dos_header(::std::string* dos_header) { + if (dos_header_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete dos_header_; + } + if (dos_header) { + set_has_dos_header(); + dos_header_ = dos_header; + } else { + clear_has_dos_header(); + dos_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.PEImageHeaders.dos_header) +} + +// optional bytes file_header = 2; +inline bool ClientDownloadRequest_PEImageHeaders::has_file_header() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadRequest_PEImageHeaders::set_has_file_header() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_has_file_header() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_file_header() { + if (file_header_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_header_->clear(); + } + clear_has_file_header(); +} +inline const ::std::string& ClientDownloadRequest_PEImageHeaders::file_header() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.PEImageHeaders.file_header) + return *file_header_; +} +inline void ClientDownloadRequest_PEImageHeaders::set_file_header(const ::std::string& value) { + set_has_file_header(); + if (file_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_header_ = new ::std::string; + } + file_header_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.PEImageHeaders.file_header) +} +inline void ClientDownloadRequest_PEImageHeaders::set_file_header(const char* value) { + set_has_file_header(); + if (file_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_header_ = new ::std::string; + } + file_header_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.PEImageHeaders.file_header) +} +inline void ClientDownloadRequest_PEImageHeaders::set_file_header(const void* value, size_t size) { + set_has_file_header(); + if (file_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_header_ = new ::std::string; + } + file_header_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.PEImageHeaders.file_header) +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_file_header() { + set_has_file_header(); + if (file_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_header_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.PEImageHeaders.file_header) + return file_header_; +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_file_header() { + clear_has_file_header(); + if (file_header_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = file_header_; + file_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_PEImageHeaders::set_allocated_file_header(::std::string* file_header) { + if (file_header_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete file_header_; + } + if (file_header) { + set_has_file_header(); + file_header_ = file_header; + } else { + clear_has_file_header(); + file_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.PEImageHeaders.file_header) +} + +// optional bytes optional_headers32 = 3; +inline bool ClientDownloadRequest_PEImageHeaders::has_optional_headers32() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientDownloadRequest_PEImageHeaders::set_has_optional_headers32() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_has_optional_headers32() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_optional_headers32() { + if (optional_headers32_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers32_->clear(); + } + clear_has_optional_headers32(); +} +inline const ::std::string& ClientDownloadRequest_PEImageHeaders::optional_headers32() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers32) + return *optional_headers32_; +} +inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers32(const ::std::string& value) { + set_has_optional_headers32(); + if (optional_headers32_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers32_ = new ::std::string; + } + optional_headers32_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers32) +} +inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers32(const char* value) { + set_has_optional_headers32(); + if (optional_headers32_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers32_ = new ::std::string; + } + optional_headers32_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers32) +} +inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers32(const void* value, size_t size) { + set_has_optional_headers32(); + if (optional_headers32_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers32_ = new ::std::string; + } + optional_headers32_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers32) +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_optional_headers32() { + set_has_optional_headers32(); + if (optional_headers32_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers32_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers32) + return optional_headers32_; +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_optional_headers32() { + clear_has_optional_headers32(); + if (optional_headers32_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = optional_headers32_; + optional_headers32_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_PEImageHeaders::set_allocated_optional_headers32(::std::string* optional_headers32) { + if (optional_headers32_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete optional_headers32_; + } + if (optional_headers32) { + set_has_optional_headers32(); + optional_headers32_ = optional_headers32; + } else { + clear_has_optional_headers32(); + optional_headers32_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers32) +} + +// optional bytes optional_headers64 = 4; +inline bool ClientDownloadRequest_PEImageHeaders::has_optional_headers64() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ClientDownloadRequest_PEImageHeaders::set_has_optional_headers64() { + _has_bits_[0] |= 0x00000008u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_has_optional_headers64() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_optional_headers64() { + if (optional_headers64_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers64_->clear(); + } + clear_has_optional_headers64(); +} +inline const ::std::string& ClientDownloadRequest_PEImageHeaders::optional_headers64() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers64) + return *optional_headers64_; +} +inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers64(const ::std::string& value) { + set_has_optional_headers64(); + if (optional_headers64_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers64_ = new ::std::string; + } + optional_headers64_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers64) +} +inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers64(const char* value) { + set_has_optional_headers64(); + if (optional_headers64_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers64_ = new ::std::string; + } + optional_headers64_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers64) +} +inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers64(const void* value, size_t size) { + set_has_optional_headers64(); + if (optional_headers64_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers64_ = new ::std::string; + } + optional_headers64_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers64) +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_optional_headers64() { + set_has_optional_headers64(); + if (optional_headers64_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + optional_headers64_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers64) + return optional_headers64_; +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_optional_headers64() { + clear_has_optional_headers64(); + if (optional_headers64_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = optional_headers64_; + optional_headers64_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_PEImageHeaders::set_allocated_optional_headers64(::std::string* optional_headers64) { + if (optional_headers64_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete optional_headers64_; + } + if (optional_headers64) { + set_has_optional_headers64(); + optional_headers64_ = optional_headers64; + } else { + clear_has_optional_headers64(); + optional_headers64_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.PEImageHeaders.optional_headers64) +} + +// repeated bytes section_header = 5; +inline int ClientDownloadRequest_PEImageHeaders::section_header_size() const { + return section_header_.size(); +} +inline void ClientDownloadRequest_PEImageHeaders::clear_section_header() { + section_header_.Clear(); +} +inline const ::std::string& ClientDownloadRequest_PEImageHeaders::section_header(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) + return section_header_.Get(index); +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_section_header(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) + return section_header_.Mutable(index); +} +inline void ClientDownloadRequest_PEImageHeaders::set_section_header(int index, const ::std::string& value) { + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) + section_header_.Mutable(index)->assign(value); +} +inline void ClientDownloadRequest_PEImageHeaders::set_section_header(int index, const char* value) { + section_header_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) +} +inline void ClientDownloadRequest_PEImageHeaders::set_section_header(int index, const void* value, size_t size) { + section_header_.Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::add_section_header() { + return section_header_.Add(); +} +inline void ClientDownloadRequest_PEImageHeaders::add_section_header(const ::std::string& value) { + section_header_.Add()->assign(value); + // @@protoc_insertion_point(field_add:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) +} +inline void ClientDownloadRequest_PEImageHeaders::add_section_header(const char* value) { + section_header_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) +} +inline void ClientDownloadRequest_PEImageHeaders::add_section_header(const void* value, size_t size) { + section_header_.Add()->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +ClientDownloadRequest_PEImageHeaders::section_header() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) + return section_header_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +ClientDownloadRequest_PEImageHeaders::mutable_section_header() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientDownloadRequest.PEImageHeaders.section_header) + return §ion_header_; +} + +// optional bytes export_section_data = 6; +inline bool ClientDownloadRequest_PEImageHeaders::has_export_section_data() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void ClientDownloadRequest_PEImageHeaders::set_has_export_section_data() { + _has_bits_[0] |= 0x00000020u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_has_export_section_data() { + _has_bits_[0] &= ~0x00000020u; +} +inline void ClientDownloadRequest_PEImageHeaders::clear_export_section_data() { + if (export_section_data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + export_section_data_->clear(); + } + clear_has_export_section_data(); +} +inline const ::std::string& ClientDownloadRequest_PEImageHeaders::export_section_data() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.PEImageHeaders.export_section_data) + return *export_section_data_; +} +inline void ClientDownloadRequest_PEImageHeaders::set_export_section_data(const ::std::string& value) { + set_has_export_section_data(); + if (export_section_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + export_section_data_ = new ::std::string; + } + export_section_data_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.PEImageHeaders.export_section_data) +} +inline void ClientDownloadRequest_PEImageHeaders::set_export_section_data(const char* value) { + set_has_export_section_data(); + if (export_section_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + export_section_data_ = new ::std::string; + } + export_section_data_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.PEImageHeaders.export_section_data) +} +inline void ClientDownloadRequest_PEImageHeaders::set_export_section_data(const void* value, size_t size) { + set_has_export_section_data(); + if (export_section_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + export_section_data_ = new ::std::string; + } + export_section_data_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.PEImageHeaders.export_section_data) +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_export_section_data() { + set_has_export_section_data(); + if (export_section_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + export_section_data_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.PEImageHeaders.export_section_data) + return export_section_data_; +} +inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_export_section_data() { + clear_has_export_section_data(); + if (export_section_data_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = export_section_data_; + export_section_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_PEImageHeaders::set_allocated_export_section_data(::std::string* export_section_data) { + if (export_section_data_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete export_section_data_; + } + if (export_section_data) { + set_has_export_section_data(); + export_section_data_ = export_section_data; + } else { + clear_has_export_section_data(); + export_section_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.PEImageHeaders.export_section_data) +} + +// repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; +inline int ClientDownloadRequest_PEImageHeaders::debug_data_size() const { + return debug_data_.size(); +} +inline void ClientDownloadRequest_PEImageHeaders::clear_debug_data() { + debug_data_.Clear(); +} +inline const ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData& ClientDownloadRequest_PEImageHeaders::debug_data(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.PEImageHeaders.debug_data) + return debug_data_.Get(index); +} +inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData* ClientDownloadRequest_PEImageHeaders::mutable_debug_data(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.PEImageHeaders.debug_data) + return debug_data_.Mutable(index); +} +inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData* ClientDownloadRequest_PEImageHeaders::add_debug_data() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientDownloadRequest.PEImageHeaders.debug_data) + return debug_data_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData >& +ClientDownloadRequest_PEImageHeaders::debug_data() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientDownloadRequest.PEImageHeaders.debug_data) + return debug_data_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData >* +ClientDownloadRequest_PEImageHeaders::mutable_debug_data() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientDownloadRequest.PEImageHeaders.debug_data) + return &debug_data_; +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest_ImageHeaders + +// optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; +inline bool ClientDownloadRequest_ImageHeaders::has_pe_headers() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadRequest_ImageHeaders::set_has_pe_headers() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadRequest_ImageHeaders::clear_has_pe_headers() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadRequest_ImageHeaders::clear_pe_headers() { + if (pe_headers_ != NULL) pe_headers_->::safe_browsing::ClientDownloadRequest_PEImageHeaders::Clear(); + clear_has_pe_headers(); +} +inline const ::safe_browsing::ClientDownloadRequest_PEImageHeaders& ClientDownloadRequest_ImageHeaders::pe_headers() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.ImageHeaders.pe_headers) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return pe_headers_ != NULL ? *pe_headers_ : *default_instance().pe_headers_; +#else + return pe_headers_ != NULL ? *pe_headers_ : *default_instance_->pe_headers_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders* ClientDownloadRequest_ImageHeaders::mutable_pe_headers() { + set_has_pe_headers(); + if (pe_headers_ == NULL) pe_headers_ = new ::safe_browsing::ClientDownloadRequest_PEImageHeaders; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.ImageHeaders.pe_headers) + return pe_headers_; +} +inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders* ClientDownloadRequest_ImageHeaders::release_pe_headers() { + clear_has_pe_headers(); + ::safe_browsing::ClientDownloadRequest_PEImageHeaders* temp = pe_headers_; + pe_headers_ = NULL; + return temp; +} +inline void ClientDownloadRequest_ImageHeaders::set_allocated_pe_headers(::safe_browsing::ClientDownloadRequest_PEImageHeaders* pe_headers) { + delete pe_headers_; + pe_headers_ = pe_headers; + if (pe_headers) { + set_has_pe_headers(); + } else { + clear_has_pe_headers(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.ImageHeaders.pe_headers) +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest_ArchivedBinary + +// optional string file_basename = 1; +inline bool ClientDownloadRequest_ArchivedBinary::has_file_basename() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadRequest_ArchivedBinary::set_has_file_basename() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_has_file_basename() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_file_basename() { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_->clear(); + } + clear_has_file_basename(); +} +inline const ::std::string& ClientDownloadRequest_ArchivedBinary::file_basename() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.ArchivedBinary.file_basename) + return *file_basename_; +} +inline void ClientDownloadRequest_ArchivedBinary::set_file_basename(const ::std::string& value) { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + file_basename_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.ArchivedBinary.file_basename) +} +inline void ClientDownloadRequest_ArchivedBinary::set_file_basename(const char* value) { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + file_basename_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.ArchivedBinary.file_basename) +} +inline void ClientDownloadRequest_ArchivedBinary::set_file_basename(const char* value, size_t size) { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + file_basename_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.ArchivedBinary.file_basename) +} +inline ::std::string* ClientDownloadRequest_ArchivedBinary::mutable_file_basename() { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.ArchivedBinary.file_basename) + return file_basename_; +} +inline ::std::string* ClientDownloadRequest_ArchivedBinary::release_file_basename() { + clear_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = file_basename_; + file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest_ArchivedBinary::set_allocated_file_basename(::std::string* file_basename) { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete file_basename_; + } + if (file_basename) { + set_has_file_basename(); + file_basename_ = file_basename; + } else { + clear_has_file_basename(); + file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.ArchivedBinary.file_basename) +} + +// optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 2; +inline bool ClientDownloadRequest_ArchivedBinary::has_download_type() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadRequest_ArchivedBinary::set_has_download_type() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_has_download_type() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_download_type() { + download_type_ = 0; + clear_has_download_type(); +} +inline ::safe_browsing::ClientDownloadRequest_DownloadType ClientDownloadRequest_ArchivedBinary::download_type() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.ArchivedBinary.download_type) + return static_cast< ::safe_browsing::ClientDownloadRequest_DownloadType >(download_type_); +} +inline void ClientDownloadRequest_ArchivedBinary::set_download_type(::safe_browsing::ClientDownloadRequest_DownloadType value) { + assert(::safe_browsing::ClientDownloadRequest_DownloadType_IsValid(value)); + set_has_download_type(); + download_type_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.ArchivedBinary.download_type) +} + +// optional .safe_browsing.ClientDownloadRequest.Digests digests = 3; +inline bool ClientDownloadRequest_ArchivedBinary::has_digests() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientDownloadRequest_ArchivedBinary::set_has_digests() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_has_digests() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_digests() { + if (digests_ != NULL) digests_->::safe_browsing::ClientDownloadRequest_Digests::Clear(); + clear_has_digests(); +} +inline const ::safe_browsing::ClientDownloadRequest_Digests& ClientDownloadRequest_ArchivedBinary::digests() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.ArchivedBinary.digests) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return digests_ != NULL ? *digests_ : *default_instance().digests_; +#else + return digests_ != NULL ? *digests_ : *default_instance_->digests_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_Digests* ClientDownloadRequest_ArchivedBinary::mutable_digests() { + set_has_digests(); + if (digests_ == NULL) digests_ = new ::safe_browsing::ClientDownloadRequest_Digests; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.ArchivedBinary.digests) + return digests_; +} +inline ::safe_browsing::ClientDownloadRequest_Digests* ClientDownloadRequest_ArchivedBinary::release_digests() { + clear_has_digests(); + ::safe_browsing::ClientDownloadRequest_Digests* temp = digests_; + digests_ = NULL; + return temp; +} +inline void ClientDownloadRequest_ArchivedBinary::set_allocated_digests(::safe_browsing::ClientDownloadRequest_Digests* digests) { + delete digests_; + digests_ = digests; + if (digests) { + set_has_digests(); + } else { + clear_has_digests(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.ArchivedBinary.digests) +} + +// optional int64 length = 4; +inline bool ClientDownloadRequest_ArchivedBinary::has_length() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ClientDownloadRequest_ArchivedBinary::set_has_length() { + _has_bits_[0] |= 0x00000008u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_has_length() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_length() { + length_ = GOOGLE_LONGLONG(0); + clear_has_length(); +} +inline ::google::protobuf::int64 ClientDownloadRequest_ArchivedBinary::length() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.ArchivedBinary.length) + return length_; +} +inline void ClientDownloadRequest_ArchivedBinary::set_length(::google::protobuf::int64 value) { + set_has_length(); + length_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.ArchivedBinary.length) +} + +// optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; +inline bool ClientDownloadRequest_ArchivedBinary::has_signature() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void ClientDownloadRequest_ArchivedBinary::set_has_signature() { + _has_bits_[0] |= 0x00000010u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_has_signature() { + _has_bits_[0] &= ~0x00000010u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_signature() { + if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); + clear_has_signature(); +} +inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& ClientDownloadRequest_ArchivedBinary::signature() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.ArchivedBinary.signature) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return signature_ != NULL ? *signature_ : *default_instance().signature_; +#else + return signature_ != NULL ? *signature_ : *default_instance_->signature_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientDownloadRequest_ArchivedBinary::mutable_signature() { + set_has_signature(); + if (signature_ == NULL) signature_ = new ::safe_browsing::ClientDownloadRequest_SignatureInfo; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.ArchivedBinary.signature) + return signature_; +} +inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientDownloadRequest_ArchivedBinary::release_signature() { + clear_has_signature(); + ::safe_browsing::ClientDownloadRequest_SignatureInfo* temp = signature_; + signature_ = NULL; + return temp; +} +inline void ClientDownloadRequest_ArchivedBinary::set_allocated_signature(::safe_browsing::ClientDownloadRequest_SignatureInfo* signature) { + delete signature_; + signature_ = signature; + if (signature) { + set_has_signature(); + } else { + clear_has_signature(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.ArchivedBinary.signature) +} + +// optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; +inline bool ClientDownloadRequest_ArchivedBinary::has_image_headers() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void ClientDownloadRequest_ArchivedBinary::set_has_image_headers() { + _has_bits_[0] |= 0x00000020u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_has_image_headers() { + _has_bits_[0] &= ~0x00000020u; +} +inline void ClientDownloadRequest_ArchivedBinary::clear_image_headers() { + if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); + clear_has_image_headers(); +} +inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& ClientDownloadRequest_ArchivedBinary::image_headers() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.ArchivedBinary.image_headers) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return image_headers_ != NULL ? *image_headers_ : *default_instance().image_headers_; +#else + return image_headers_ != NULL ? *image_headers_ : *default_instance_->image_headers_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientDownloadRequest_ArchivedBinary::mutable_image_headers() { + set_has_image_headers(); + if (image_headers_ == NULL) image_headers_ = new ::safe_browsing::ClientDownloadRequest_ImageHeaders; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.ArchivedBinary.image_headers) + return image_headers_; +} +inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientDownloadRequest_ArchivedBinary::release_image_headers() { + clear_has_image_headers(); + ::safe_browsing::ClientDownloadRequest_ImageHeaders* temp = image_headers_; + image_headers_ = NULL; + return temp; +} +inline void ClientDownloadRequest_ArchivedBinary::set_allocated_image_headers(::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers) { + delete image_headers_; + image_headers_ = image_headers; + if (image_headers) { + set_has_image_headers(); + } else { + clear_has_image_headers(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.ArchivedBinary.image_headers) +} + +// ------------------------------------------------------------------- + +// ClientDownloadRequest + +// required string url = 1; +inline bool ClientDownloadRequest::has_url() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadRequest::set_has_url() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadRequest::clear_has_url() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadRequest::clear_url() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + clear_has_url(); +} +inline const ::std::string& ClientDownloadRequest::url() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.url) + return *url_; +} +inline void ClientDownloadRequest::set_url(const ::std::string& value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.url) +} +inline void ClientDownloadRequest::set_url(const char* value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.url) +} +inline void ClientDownloadRequest::set_url(const char* value, size_t size) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.url) +} +inline ::std::string* ClientDownloadRequest::mutable_url() { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.url) + return url_; +} +inline ::std::string* ClientDownloadRequest::release_url() { + clear_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = url_; + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest::set_allocated_url(::std::string* url) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (url) { + set_has_url(); + url_ = url; + } else { + clear_has_url(); + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.url) +} + +// required .safe_browsing.ClientDownloadRequest.Digests digests = 2; +inline bool ClientDownloadRequest::has_digests() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadRequest::set_has_digests() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadRequest::clear_has_digests() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadRequest::clear_digests() { + if (digests_ != NULL) digests_->::safe_browsing::ClientDownloadRequest_Digests::Clear(); + clear_has_digests(); +} +inline const ::safe_browsing::ClientDownloadRequest_Digests& ClientDownloadRequest::digests() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.digests) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return digests_ != NULL ? *digests_ : *default_instance().digests_; +#else + return digests_ != NULL ? *digests_ : *default_instance_->digests_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_Digests* ClientDownloadRequest::mutable_digests() { + set_has_digests(); + if (digests_ == NULL) digests_ = new ::safe_browsing::ClientDownloadRequest_Digests; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.digests) + return digests_; +} +inline ::safe_browsing::ClientDownloadRequest_Digests* ClientDownloadRequest::release_digests() { + clear_has_digests(); + ::safe_browsing::ClientDownloadRequest_Digests* temp = digests_; + digests_ = NULL; + return temp; +} +inline void ClientDownloadRequest::set_allocated_digests(::safe_browsing::ClientDownloadRequest_Digests* digests) { + delete digests_; + digests_ = digests; + if (digests) { + set_has_digests(); + } else { + clear_has_digests(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.digests) +} + +// required int64 length = 3; +inline bool ClientDownloadRequest::has_length() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientDownloadRequest::set_has_length() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientDownloadRequest::clear_has_length() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientDownloadRequest::clear_length() { + length_ = GOOGLE_LONGLONG(0); + clear_has_length(); +} +inline ::google::protobuf::int64 ClientDownloadRequest::length() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.length) + return length_; +} +inline void ClientDownloadRequest::set_length(::google::protobuf::int64 value) { + set_has_length(); + length_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.length) +} + +// repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; +inline int ClientDownloadRequest::resources_size() const { + return resources_.size(); +} +inline void ClientDownloadRequest::clear_resources() { + resources_.Clear(); +} +inline const ::safe_browsing::ClientDownloadRequest_Resource& ClientDownloadRequest::resources(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.resources) + return resources_.Get(index); +} +inline ::safe_browsing::ClientDownloadRequest_Resource* ClientDownloadRequest::mutable_resources(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.resources) + return resources_.Mutable(index); +} +inline ::safe_browsing::ClientDownloadRequest_Resource* ClientDownloadRequest::add_resources() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientDownloadRequest.resources) + return resources_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource >& +ClientDownloadRequest::resources() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientDownloadRequest.resources) + return resources_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource >* +ClientDownloadRequest::mutable_resources() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientDownloadRequest.resources) + return &resources_; +} + +// optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; +inline bool ClientDownloadRequest::has_signature() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void ClientDownloadRequest::set_has_signature() { + _has_bits_[0] |= 0x00000010u; +} +inline void ClientDownloadRequest::clear_has_signature() { + _has_bits_[0] &= ~0x00000010u; +} +inline void ClientDownloadRequest::clear_signature() { + if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); + clear_has_signature(); +} +inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& ClientDownloadRequest::signature() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.signature) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return signature_ != NULL ? *signature_ : *default_instance().signature_; +#else + return signature_ != NULL ? *signature_ : *default_instance_->signature_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientDownloadRequest::mutable_signature() { + set_has_signature(); + if (signature_ == NULL) signature_ = new ::safe_browsing::ClientDownloadRequest_SignatureInfo; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.signature) + return signature_; +} +inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientDownloadRequest::release_signature() { + clear_has_signature(); + ::safe_browsing::ClientDownloadRequest_SignatureInfo* temp = signature_; + signature_ = NULL; + return temp; +} +inline void ClientDownloadRequest::set_allocated_signature(::safe_browsing::ClientDownloadRequest_SignatureInfo* signature) { + delete signature_; + signature_ = signature; + if (signature) { + set_has_signature(); + } else { + clear_has_signature(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.signature) +} + +// optional bool user_initiated = 6; +inline bool ClientDownloadRequest::has_user_initiated() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void ClientDownloadRequest::set_has_user_initiated() { + _has_bits_[0] |= 0x00000020u; +} +inline void ClientDownloadRequest::clear_has_user_initiated() { + _has_bits_[0] &= ~0x00000020u; +} +inline void ClientDownloadRequest::clear_user_initiated() { + user_initiated_ = false; + clear_has_user_initiated(); +} +inline bool ClientDownloadRequest::user_initiated() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.user_initiated) + return user_initiated_; +} +inline void ClientDownloadRequest::set_user_initiated(bool value) { + set_has_user_initiated(); + user_initiated_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.user_initiated) +} + +// optional string file_basename = 9; +inline bool ClientDownloadRequest::has_file_basename() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void ClientDownloadRequest::set_has_file_basename() { + _has_bits_[0] |= 0x00000040u; +} +inline void ClientDownloadRequest::clear_has_file_basename() { + _has_bits_[0] &= ~0x00000040u; +} +inline void ClientDownloadRequest::clear_file_basename() { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_->clear(); + } + clear_has_file_basename(); +} +inline const ::std::string& ClientDownloadRequest::file_basename() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.file_basename) + return *file_basename_; +} +inline void ClientDownloadRequest::set_file_basename(const ::std::string& value) { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + file_basename_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.file_basename) +} +inline void ClientDownloadRequest::set_file_basename(const char* value) { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + file_basename_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.file_basename) +} +inline void ClientDownloadRequest::set_file_basename(const char* value, size_t size) { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + file_basename_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.file_basename) +} +inline ::std::string* ClientDownloadRequest::mutable_file_basename() { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.file_basename) + return file_basename_; +} +inline ::std::string* ClientDownloadRequest::release_file_basename() { + clear_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = file_basename_; + file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest::set_allocated_file_basename(::std::string* file_basename) { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete file_basename_; + } + if (file_basename) { + set_has_file_basename(); + file_basename_ = file_basename; + } else { + clear_has_file_basename(); + file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.file_basename) +} + +// optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; +inline bool ClientDownloadRequest::has_download_type() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void ClientDownloadRequest::set_has_download_type() { + _has_bits_[0] |= 0x00000080u; +} +inline void ClientDownloadRequest::clear_has_download_type() { + _has_bits_[0] &= ~0x00000080u; +} +inline void ClientDownloadRequest::clear_download_type() { + download_type_ = 0; + clear_has_download_type(); +} +inline ::safe_browsing::ClientDownloadRequest_DownloadType ClientDownloadRequest::download_type() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.download_type) + return static_cast< ::safe_browsing::ClientDownloadRequest_DownloadType >(download_type_); +} +inline void ClientDownloadRequest::set_download_type(::safe_browsing::ClientDownloadRequest_DownloadType value) { + assert(::safe_browsing::ClientDownloadRequest_DownloadType_IsValid(value)); + set_has_download_type(); + download_type_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.download_type) +} + +// optional string locale = 11; +inline bool ClientDownloadRequest::has_locale() const { + return (_has_bits_[0] & 0x00000100u) != 0; +} +inline void ClientDownloadRequest::set_has_locale() { + _has_bits_[0] |= 0x00000100u; +} +inline void ClientDownloadRequest::clear_has_locale() { + _has_bits_[0] &= ~0x00000100u; +} +inline void ClientDownloadRequest::clear_locale() { + if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + locale_->clear(); + } + clear_has_locale(); +} +inline const ::std::string& ClientDownloadRequest::locale() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.locale) + return *locale_; +} +inline void ClientDownloadRequest::set_locale(const ::std::string& value) { + set_has_locale(); + if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + locale_ = new ::std::string; + } + locale_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadRequest.locale) +} +inline void ClientDownloadRequest::set_locale(const char* value) { + set_has_locale(); + if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + locale_ = new ::std::string; + } + locale_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadRequest.locale) +} +inline void ClientDownloadRequest::set_locale(const char* value, size_t size) { + set_has_locale(); + if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + locale_ = new ::std::string; + } + locale_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadRequest.locale) +} +inline ::std::string* ClientDownloadRequest::mutable_locale() { + set_has_locale(); + if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + locale_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.locale) + return locale_; +} +inline ::std::string* ClientDownloadRequest::release_locale() { + clear_has_locale(); + if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = locale_; + locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadRequest::set_allocated_locale(::std::string* locale) { + if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete locale_; + } + if (locale) { + set_has_locale(); + locale_ = locale; + } else { + clear_has_locale(); + locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.locale) +} + +// optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; +inline bool ClientDownloadRequest::has_image_headers() const { + return (_has_bits_[0] & 0x00000200u) != 0; +} +inline void ClientDownloadRequest::set_has_image_headers() { + _has_bits_[0] |= 0x00000200u; +} +inline void ClientDownloadRequest::clear_has_image_headers() { + _has_bits_[0] &= ~0x00000200u; +} +inline void ClientDownloadRequest::clear_image_headers() { + if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); + clear_has_image_headers(); +} +inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& ClientDownloadRequest::image_headers() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.image_headers) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return image_headers_ != NULL ? *image_headers_ : *default_instance().image_headers_; +#else + return image_headers_ != NULL ? *image_headers_ : *default_instance_->image_headers_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientDownloadRequest::mutable_image_headers() { + set_has_image_headers(); + if (image_headers_ == NULL) image_headers_ = new ::safe_browsing::ClientDownloadRequest_ImageHeaders; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.image_headers) + return image_headers_; +} +inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientDownloadRequest::release_image_headers() { + clear_has_image_headers(); + ::safe_browsing::ClientDownloadRequest_ImageHeaders* temp = image_headers_; + image_headers_ = NULL; + return temp; +} +inline void ClientDownloadRequest::set_allocated_image_headers(::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers) { + delete image_headers_; + image_headers_ = image_headers; + if (image_headers) { + set_has_image_headers(); + } else { + clear_has_image_headers(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadRequest.image_headers) +} + +// repeated .safe_browsing.ClientDownloadRequest.ArchivedBinary archived_binary = 22; +inline int ClientDownloadRequest::archived_binary_size() const { + return archived_binary_.size(); +} +inline void ClientDownloadRequest::clear_archived_binary() { + archived_binary_.Clear(); +} +inline const ::safe_browsing::ClientDownloadRequest_ArchivedBinary& ClientDownloadRequest::archived_binary(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadRequest.archived_binary) + return archived_binary_.Get(index); +} +inline ::safe_browsing::ClientDownloadRequest_ArchivedBinary* ClientDownloadRequest::mutable_archived_binary(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadRequest.archived_binary) + return archived_binary_.Mutable(index); +} +inline ::safe_browsing::ClientDownloadRequest_ArchivedBinary* ClientDownloadRequest::add_archived_binary() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientDownloadRequest.archived_binary) + return archived_binary_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_ArchivedBinary >& +ClientDownloadRequest::archived_binary() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientDownloadRequest.archived_binary) + return archived_binary_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_ArchivedBinary >* +ClientDownloadRequest::mutable_archived_binary() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientDownloadRequest.archived_binary) + return &archived_binary_; +} + +// ------------------------------------------------------------------- + +// ClientDownloadResponse_MoreInfo + +// optional string description = 1; +inline bool ClientDownloadResponse_MoreInfo::has_description() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadResponse_MoreInfo::set_has_description() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadResponse_MoreInfo::clear_has_description() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadResponse_MoreInfo::clear_description() { + if (description_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + description_->clear(); + } + clear_has_description(); +} +inline const ::std::string& ClientDownloadResponse_MoreInfo::description() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadResponse.MoreInfo.description) + return *description_; +} +inline void ClientDownloadResponse_MoreInfo::set_description(const ::std::string& value) { + set_has_description(); + if (description_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + description_ = new ::std::string; + } + description_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadResponse.MoreInfo.description) +} +inline void ClientDownloadResponse_MoreInfo::set_description(const char* value) { + set_has_description(); + if (description_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + description_ = new ::std::string; + } + description_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadResponse.MoreInfo.description) +} +inline void ClientDownloadResponse_MoreInfo::set_description(const char* value, size_t size) { + set_has_description(); + if (description_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + description_ = new ::std::string; + } + description_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadResponse.MoreInfo.description) +} +inline ::std::string* ClientDownloadResponse_MoreInfo::mutable_description() { + set_has_description(); + if (description_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + description_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadResponse.MoreInfo.description) + return description_; +} +inline ::std::string* ClientDownloadResponse_MoreInfo::release_description() { + clear_has_description(); + if (description_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = description_; + description_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadResponse_MoreInfo::set_allocated_description(::std::string* description) { + if (description_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete description_; + } + if (description) { + set_has_description(); + description_ = description; + } else { + clear_has_description(); + description_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadResponse.MoreInfo.description) +} + +// optional string url = 2; +inline bool ClientDownloadResponse_MoreInfo::has_url() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadResponse_MoreInfo::set_has_url() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadResponse_MoreInfo::clear_has_url() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadResponse_MoreInfo::clear_url() { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_->clear(); + } + clear_has_url(); +} +inline const ::std::string& ClientDownloadResponse_MoreInfo::url() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadResponse.MoreInfo.url) + return *url_; +} +inline void ClientDownloadResponse_MoreInfo::set_url(const ::std::string& value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadResponse.MoreInfo.url) +} +inline void ClientDownloadResponse_MoreInfo::set_url(const char* value) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadResponse.MoreInfo.url) +} +inline void ClientDownloadResponse_MoreInfo::set_url(const char* value, size_t size) { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadResponse.MoreInfo.url) +} +inline ::std::string* ClientDownloadResponse_MoreInfo::mutable_url() { + set_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + url_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadResponse.MoreInfo.url) + return url_; +} +inline ::std::string* ClientDownloadResponse_MoreInfo::release_url() { + clear_has_url(); + if (url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = url_; + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadResponse_MoreInfo::set_allocated_url(::std::string* url) { + if (url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete url_; + } + if (url) { + set_has_url(); + url_ = url; + } else { + clear_has_url(); + url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadResponse.MoreInfo.url) +} + +// ------------------------------------------------------------------- + +// ClientDownloadResponse + +// required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; +inline bool ClientDownloadResponse::has_verdict() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadResponse::set_has_verdict() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadResponse::clear_has_verdict() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadResponse::clear_verdict() { + verdict_ = 0; + clear_has_verdict(); +} +inline ::safe_browsing::ClientDownloadResponse_Verdict ClientDownloadResponse::verdict() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadResponse.verdict) + return static_cast< ::safe_browsing::ClientDownloadResponse_Verdict >(verdict_); +} +inline void ClientDownloadResponse::set_verdict(::safe_browsing::ClientDownloadResponse_Verdict value) { + assert(::safe_browsing::ClientDownloadResponse_Verdict_IsValid(value)); + set_has_verdict(); + verdict_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadResponse.verdict) +} + +// optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; +inline bool ClientDownloadResponse::has_more_info() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadResponse::set_has_more_info() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadResponse::clear_has_more_info() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadResponse::clear_more_info() { + if (more_info_ != NULL) more_info_->::safe_browsing::ClientDownloadResponse_MoreInfo::Clear(); + clear_has_more_info(); +} +inline const ::safe_browsing::ClientDownloadResponse_MoreInfo& ClientDownloadResponse::more_info() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadResponse.more_info) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return more_info_ != NULL ? *more_info_ : *default_instance().more_info_; +#else + return more_info_ != NULL ? *more_info_ : *default_instance_->more_info_; +#endif +} +inline ::safe_browsing::ClientDownloadResponse_MoreInfo* ClientDownloadResponse::mutable_more_info() { + set_has_more_info(); + if (more_info_ == NULL) more_info_ = new ::safe_browsing::ClientDownloadResponse_MoreInfo; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadResponse.more_info) + return more_info_; +} +inline ::safe_browsing::ClientDownloadResponse_MoreInfo* ClientDownloadResponse::release_more_info() { + clear_has_more_info(); + ::safe_browsing::ClientDownloadResponse_MoreInfo* temp = more_info_; + more_info_ = NULL; + return temp; +} +inline void ClientDownloadResponse::set_allocated_more_info(::safe_browsing::ClientDownloadResponse_MoreInfo* more_info) { + delete more_info_; + more_info_ = more_info; + if (more_info) { + set_has_more_info(); + } else { + clear_has_more_info(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadResponse.more_info) +} + +// optional bytes token = 3; +inline bool ClientDownloadResponse::has_token() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientDownloadResponse::set_has_token() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientDownloadResponse::clear_has_token() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientDownloadResponse::clear_token() { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_->clear(); + } + clear_has_token(); +} +inline const ::std::string& ClientDownloadResponse::token() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadResponse.token) + return *token_; +} +inline void ClientDownloadResponse::set_token(const ::std::string& value) { + set_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_ = new ::std::string; + } + token_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadResponse.token) +} +inline void ClientDownloadResponse::set_token(const char* value) { + set_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_ = new ::std::string; + } + token_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadResponse.token) +} +inline void ClientDownloadResponse::set_token(const void* value, size_t size) { + set_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_ = new ::std::string; + } + token_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadResponse.token) +} +inline ::std::string* ClientDownloadResponse::mutable_token() { + set_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadResponse.token) + return token_; +} +inline ::std::string* ClientDownloadResponse::release_token() { + clear_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = token_; + token_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadResponse::set_allocated_token(::std::string* token) { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete token_; + } + if (token) { + set_has_token(); + token_ = token; + } else { + clear_has_token(); + token_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadResponse.token) +} + +// ------------------------------------------------------------------- + +// ClientDownloadReport_UserInformation + +// optional string email = 1; +inline bool ClientDownloadReport_UserInformation::has_email() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadReport_UserInformation::set_has_email() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadReport_UserInformation::clear_has_email() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadReport_UserInformation::clear_email() { + if (email_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + email_->clear(); + } + clear_has_email(); +} +inline const ::std::string& ClientDownloadReport_UserInformation::email() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadReport.UserInformation.email) + return *email_; +} +inline void ClientDownloadReport_UserInformation::set_email(const ::std::string& value) { + set_has_email(); + if (email_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + email_ = new ::std::string; + } + email_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadReport.UserInformation.email) +} +inline void ClientDownloadReport_UserInformation::set_email(const char* value) { + set_has_email(); + if (email_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + email_ = new ::std::string; + } + email_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadReport.UserInformation.email) +} +inline void ClientDownloadReport_UserInformation::set_email(const char* value, size_t size) { + set_has_email(); + if (email_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + email_ = new ::std::string; + } + email_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadReport.UserInformation.email) +} +inline ::std::string* ClientDownloadReport_UserInformation::mutable_email() { + set_has_email(); + if (email_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + email_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadReport.UserInformation.email) + return email_; +} +inline ::std::string* ClientDownloadReport_UserInformation::release_email() { + clear_has_email(); + if (email_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = email_; + email_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadReport_UserInformation::set_allocated_email(::std::string* email) { + if (email_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete email_; + } + if (email) { + set_has_email(); + email_ = email; + } else { + clear_has_email(); + email_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadReport.UserInformation.email) +} + +// ------------------------------------------------------------------- + +// ClientDownloadReport + +// optional .safe_browsing.ClientDownloadReport.Reason reason = 1; +inline bool ClientDownloadReport::has_reason() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientDownloadReport::set_has_reason() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientDownloadReport::clear_has_reason() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientDownloadReport::clear_reason() { + reason_ = 0; + clear_has_reason(); +} +inline ::safe_browsing::ClientDownloadReport_Reason ClientDownloadReport::reason() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadReport.reason) + return static_cast< ::safe_browsing::ClientDownloadReport_Reason >(reason_); +} +inline void ClientDownloadReport::set_reason(::safe_browsing::ClientDownloadReport_Reason value) { + assert(::safe_browsing::ClientDownloadReport_Reason_IsValid(value)); + set_has_reason(); + reason_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadReport.reason) +} + +// optional .safe_browsing.ClientDownloadRequest download_request = 2; +inline bool ClientDownloadReport::has_download_request() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientDownloadReport::set_has_download_request() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientDownloadReport::clear_has_download_request() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientDownloadReport::clear_download_request() { + if (download_request_ != NULL) download_request_->::safe_browsing::ClientDownloadRequest::Clear(); + clear_has_download_request(); +} +inline const ::safe_browsing::ClientDownloadRequest& ClientDownloadReport::download_request() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadReport.download_request) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return download_request_ != NULL ? *download_request_ : *default_instance().download_request_; +#else + return download_request_ != NULL ? *download_request_ : *default_instance_->download_request_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest* ClientDownloadReport::mutable_download_request() { + set_has_download_request(); + if (download_request_ == NULL) download_request_ = new ::safe_browsing::ClientDownloadRequest; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadReport.download_request) + return download_request_; +} +inline ::safe_browsing::ClientDownloadRequest* ClientDownloadReport::release_download_request() { + clear_has_download_request(); + ::safe_browsing::ClientDownloadRequest* temp = download_request_; + download_request_ = NULL; + return temp; +} +inline void ClientDownloadReport::set_allocated_download_request(::safe_browsing::ClientDownloadRequest* download_request) { + delete download_request_; + download_request_ = download_request; + if (download_request) { + set_has_download_request(); + } else { + clear_has_download_request(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadReport.download_request) +} + +// optional .safe_browsing.ClientDownloadReport.UserInformation user_information = 3; +inline bool ClientDownloadReport::has_user_information() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientDownloadReport::set_has_user_information() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientDownloadReport::clear_has_user_information() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientDownloadReport::clear_user_information() { + if (user_information_ != NULL) user_information_->::safe_browsing::ClientDownloadReport_UserInformation::Clear(); + clear_has_user_information(); +} +inline const ::safe_browsing::ClientDownloadReport_UserInformation& ClientDownloadReport::user_information() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadReport.user_information) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return user_information_ != NULL ? *user_information_ : *default_instance().user_information_; +#else + return user_information_ != NULL ? *user_information_ : *default_instance_->user_information_; +#endif +} +inline ::safe_browsing::ClientDownloadReport_UserInformation* ClientDownloadReport::mutable_user_information() { + set_has_user_information(); + if (user_information_ == NULL) user_information_ = new ::safe_browsing::ClientDownloadReport_UserInformation; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadReport.user_information) + return user_information_; +} +inline ::safe_browsing::ClientDownloadReport_UserInformation* ClientDownloadReport::release_user_information() { + clear_has_user_information(); + ::safe_browsing::ClientDownloadReport_UserInformation* temp = user_information_; + user_information_ = NULL; + return temp; +} +inline void ClientDownloadReport::set_allocated_user_information(::safe_browsing::ClientDownloadReport_UserInformation* user_information) { + delete user_information_; + user_information_ = user_information; + if (user_information) { + set_has_user_information(); + } else { + clear_has_user_information(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadReport.user_information) +} + +// optional bytes comment = 4; +inline bool ClientDownloadReport::has_comment() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ClientDownloadReport::set_has_comment() { + _has_bits_[0] |= 0x00000008u; +} +inline void ClientDownloadReport::clear_has_comment() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ClientDownloadReport::clear_comment() { + if (comment_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + comment_->clear(); + } + clear_has_comment(); +} +inline const ::std::string& ClientDownloadReport::comment() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadReport.comment) + return *comment_; +} +inline void ClientDownloadReport::set_comment(const ::std::string& value) { + set_has_comment(); + if (comment_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + comment_ = new ::std::string; + } + comment_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientDownloadReport.comment) +} +inline void ClientDownloadReport::set_comment(const char* value) { + set_has_comment(); + if (comment_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + comment_ = new ::std::string; + } + comment_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientDownloadReport.comment) +} +inline void ClientDownloadReport::set_comment(const void* value, size_t size) { + set_has_comment(); + if (comment_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + comment_ = new ::std::string; + } + comment_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientDownloadReport.comment) +} +inline ::std::string* ClientDownloadReport::mutable_comment() { + set_has_comment(); + if (comment_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + comment_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadReport.comment) + return comment_; +} +inline ::std::string* ClientDownloadReport::release_comment() { + clear_has_comment(); + if (comment_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = comment_; + comment_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientDownloadReport::set_allocated_comment(::std::string* comment) { + if (comment_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete comment_; + } + if (comment) { + set_has_comment(); + comment_ = comment; + } else { + clear_has_comment(); + comment_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadReport.comment) +} + +// optional .safe_browsing.ClientDownloadResponse download_response = 5; +inline bool ClientDownloadReport::has_download_response() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void ClientDownloadReport::set_has_download_response() { + _has_bits_[0] |= 0x00000010u; +} +inline void ClientDownloadReport::clear_has_download_response() { + _has_bits_[0] &= ~0x00000010u; +} +inline void ClientDownloadReport::clear_download_response() { + if (download_response_ != NULL) download_response_->::safe_browsing::ClientDownloadResponse::Clear(); + clear_has_download_response(); +} +inline const ::safe_browsing::ClientDownloadResponse& ClientDownloadReport::download_response() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientDownloadReport.download_response) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return download_response_ != NULL ? *download_response_ : *default_instance().download_response_; +#else + return download_response_ != NULL ? *download_response_ : *default_instance_->download_response_; +#endif +} +inline ::safe_browsing::ClientDownloadResponse* ClientDownloadReport::mutable_download_response() { + set_has_download_response(); + if (download_response_ == NULL) download_response_ = new ::safe_browsing::ClientDownloadResponse; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientDownloadReport.download_response) + return download_response_; +} +inline ::safe_browsing::ClientDownloadResponse* ClientDownloadReport::release_download_response() { + clear_has_download_response(); + ::safe_browsing::ClientDownloadResponse* temp = download_response_; + download_response_ = NULL; + return temp; +} +inline void ClientDownloadReport::set_allocated_download_response(::safe_browsing::ClientDownloadResponse* download_response) { + delete download_response_; + download_response_ = download_response; + if (download_response) { + set_has_download_response(); + } else { + clear_has_download_response(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientDownloadReport.download_response) +} + +// ------------------------------------------------------------------- + +// ClientUploadResponse + +// optional .safe_browsing.ClientUploadResponse.UploadStatus status = 1; +inline bool ClientUploadResponse::has_status() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientUploadResponse::set_has_status() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientUploadResponse::clear_has_status() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientUploadResponse::clear_status() { + status_ = 0; + clear_has_status(); +} +inline ::safe_browsing::ClientUploadResponse_UploadStatus ClientUploadResponse::status() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientUploadResponse.status) + return static_cast< ::safe_browsing::ClientUploadResponse_UploadStatus >(status_); +} +inline void ClientUploadResponse::set_status(::safe_browsing::ClientUploadResponse_UploadStatus value) { + assert(::safe_browsing::ClientUploadResponse_UploadStatus_IsValid(value)); + set_has_status(); + status_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientUploadResponse.status) +} + +// optional string permalink = 2; +inline bool ClientUploadResponse::has_permalink() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientUploadResponse::set_has_permalink() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientUploadResponse::clear_has_permalink() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientUploadResponse::clear_permalink() { + if (permalink_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + permalink_->clear(); + } + clear_has_permalink(); +} +inline const ::std::string& ClientUploadResponse::permalink() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientUploadResponse.permalink) + return *permalink_; +} +inline void ClientUploadResponse::set_permalink(const ::std::string& value) { + set_has_permalink(); + if (permalink_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + permalink_ = new ::std::string; + } + permalink_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientUploadResponse.permalink) +} +inline void ClientUploadResponse::set_permalink(const char* value) { + set_has_permalink(); + if (permalink_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + permalink_ = new ::std::string; + } + permalink_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientUploadResponse.permalink) +} +inline void ClientUploadResponse::set_permalink(const char* value, size_t size) { + set_has_permalink(); + if (permalink_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + permalink_ = new ::std::string; + } + permalink_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientUploadResponse.permalink) +} +inline ::std::string* ClientUploadResponse::mutable_permalink() { + set_has_permalink(); + if (permalink_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + permalink_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientUploadResponse.permalink) + return permalink_; +} +inline ::std::string* ClientUploadResponse::release_permalink() { + clear_has_permalink(); + if (permalink_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = permalink_; + permalink_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientUploadResponse::set_allocated_permalink(::std::string* permalink) { + if (permalink_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete permalink_; + } + if (permalink) { + set_has_permalink(); + permalink_ = permalink; + } else { + clear_has_permalink(); + permalink_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientUploadResponse.permalink) +} + +// ------------------------------------------------------------------- + +// ClientIncidentReport_IncidentData_TrackedPreferenceIncident + +// optional string path = 1; +inline bool ClientIncidentReport_IncidentData_TrackedPreferenceIncident::has_path() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_has_path() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::clear_has_path() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::clear_path() { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_->clear(); + } + clear_has_path(); +} +inline const ::std::string& ClientIncidentReport_IncidentData_TrackedPreferenceIncident::path() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.path) + return *path_; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_path(const ::std::string& value) { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; + } + path_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.path) +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_path(const char* value) { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; + } + path_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.path) +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_path(const char* value, size_t size) { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; + } + path_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.path) +} +inline ::std::string* ClientIncidentReport_IncidentData_TrackedPreferenceIncident::mutable_path() { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.path) + return path_; +} +inline ::std::string* ClientIncidentReport_IncidentData_TrackedPreferenceIncident::release_path() { + clear_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = path_; + path_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_allocated_path(::std::string* path) { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete path_; + } + if (path) { + set_has_path(); + path_ = path; + } else { + clear_has_path(); + path_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.path) +} + +// optional string atomic_value = 2; +inline bool ClientIncidentReport_IncidentData_TrackedPreferenceIncident::has_atomic_value() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_has_atomic_value() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::clear_has_atomic_value() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::clear_atomic_value() { + if (atomic_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + atomic_value_->clear(); + } + clear_has_atomic_value(); +} +inline const ::std::string& ClientIncidentReport_IncidentData_TrackedPreferenceIncident::atomic_value() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.atomic_value) + return *atomic_value_; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_atomic_value(const ::std::string& value) { + set_has_atomic_value(); + if (atomic_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + atomic_value_ = new ::std::string; + } + atomic_value_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.atomic_value) +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_atomic_value(const char* value) { + set_has_atomic_value(); + if (atomic_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + atomic_value_ = new ::std::string; + } + atomic_value_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.atomic_value) +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_atomic_value(const char* value, size_t size) { + set_has_atomic_value(); + if (atomic_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + atomic_value_ = new ::std::string; + } + atomic_value_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.atomic_value) +} +inline ::std::string* ClientIncidentReport_IncidentData_TrackedPreferenceIncident::mutable_atomic_value() { + set_has_atomic_value(); + if (atomic_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + atomic_value_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.atomic_value) + return atomic_value_; +} +inline ::std::string* ClientIncidentReport_IncidentData_TrackedPreferenceIncident::release_atomic_value() { + clear_has_atomic_value(); + if (atomic_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = atomic_value_; + atomic_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_allocated_atomic_value(::std::string* atomic_value) { + if (atomic_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete atomic_value_; + } + if (atomic_value) { + set_has_atomic_value(); + atomic_value_ = atomic_value; + } else { + clear_has_atomic_value(); + atomic_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.atomic_value) +} + +// repeated string split_key = 3; +inline int ClientIncidentReport_IncidentData_TrackedPreferenceIncident::split_key_size() const { + return split_key_.size(); +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::clear_split_key() { + split_key_.Clear(); +} +inline const ::std::string& ClientIncidentReport_IncidentData_TrackedPreferenceIncident::split_key(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) + return split_key_.Get(index); +} +inline ::std::string* ClientIncidentReport_IncidentData_TrackedPreferenceIncident::mutable_split_key(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) + return split_key_.Mutable(index); +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_split_key(int index, const ::std::string& value) { + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) + split_key_.Mutable(index)->assign(value); +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_split_key(int index, const char* value) { + split_key_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_split_key(int index, const char* value, size_t size) { + split_key_.Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) +} +inline ::std::string* ClientIncidentReport_IncidentData_TrackedPreferenceIncident::add_split_key() { + return split_key_.Add(); +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::add_split_key(const ::std::string& value) { + split_key_.Add()->assign(value); + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::add_split_key(const char* value) { + split_key_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::add_split_key(const char* value, size_t size) { + split_key_.Add()->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +ClientIncidentReport_IncidentData_TrackedPreferenceIncident::split_key() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) + return split_key_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +ClientIncidentReport_IncidentData_TrackedPreferenceIncident::mutable_split_key() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.split_key) + return &split_key_; +} + +// optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.ValueState value_state = 4; +inline bool ClientIncidentReport_IncidentData_TrackedPreferenceIncident::has_value_state() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_has_value_state() { + _has_bits_[0] |= 0x00000008u; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::clear_has_value_state() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::clear_value_state() { + value_state_ = 0; + clear_has_value_state(); +} +inline ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState ClientIncidentReport_IncidentData_TrackedPreferenceIncident::value_state() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.value_state) + return static_cast< ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState >(value_state_); +} +inline void ClientIncidentReport_IncidentData_TrackedPreferenceIncident::set_value_state(::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState value) { + assert(::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState_IsValid(value)); + set_has_value_state(); + value_state_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident.value_state) +} + +// ------------------------------------------------------------------- + +// ClientIncidentReport_IncidentData_BinaryIntegrityIncident + +// optional string file_basename = 1; +inline bool ClientIncidentReport_IncidentData_BinaryIntegrityIncident::has_file_basename() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::set_has_file_basename() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::clear_has_file_basename() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::clear_file_basename() { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_->clear(); + } + clear_has_file_basename(); +} +inline const ::std::string& ClientIncidentReport_IncidentData_BinaryIntegrityIncident::file_basename() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident.file_basename) + return *file_basename_; +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::set_file_basename(const ::std::string& value) { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + file_basename_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident.file_basename) +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::set_file_basename(const char* value) { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + file_basename_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident.file_basename) +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::set_file_basename(const char* value, size_t size) { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + file_basename_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident.file_basename) +} +inline ::std::string* ClientIncidentReport_IncidentData_BinaryIntegrityIncident::mutable_file_basename() { + set_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + file_basename_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident.file_basename) + return file_basename_; +} +inline ::std::string* ClientIncidentReport_IncidentData_BinaryIntegrityIncident::release_file_basename() { + clear_has_file_basename(); + if (file_basename_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = file_basename_; + file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::set_allocated_file_basename(::std::string* file_basename) { + if (file_basename_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete file_basename_; + } + if (file_basename) { + set_has_file_basename(); + file_basename_ = file_basename; + } else { + clear_has_file_basename(); + file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident.file_basename) +} +// optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 2; +inline bool ClientIncidentReport_IncidentData_BinaryIntegrityIncident::has_signature() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::set_has_signature() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::clear_has_signature() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::clear_signature() { + if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); + clear_has_signature(); +} +inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& ClientIncidentReport_IncidentData_BinaryIntegrityIncident::signature() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident.signature) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return signature_ != NULL ? *signature_ : *default_instance().signature_; +#else + return signature_ != NULL ? *signature_ : *default_instance_->signature_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientIncidentReport_IncidentData_BinaryIntegrityIncident::mutable_signature() { + set_has_signature(); + if (signature_ == NULL) signature_ = new ::safe_browsing::ClientDownloadRequest_SignatureInfo; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident.signature) + return signature_; +} +inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientIncidentReport_IncidentData_BinaryIntegrityIncident::release_signature() { + clear_has_signature(); + ::safe_browsing::ClientDownloadRequest_SignatureInfo* temp = signature_; + signature_ = NULL; + return temp; +} +inline void ClientIncidentReport_IncidentData_BinaryIntegrityIncident::set_allocated_signature(::safe_browsing::ClientDownloadRequest_SignatureInfo* signature) { + delete signature_; + signature_ = signature; + if (signature) { + set_has_signature(); + } else { + clear_has_signature(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident.signature) +} -// =================================================================== +// ------------------------------------------------------------------- -// ClientDownloadRequest_Digests +// ClientIncidentReport_IncidentData_BlacklistLoadIncident -// optional bytes sha256 = 1; -inline bool ClientDownloadRequest_Digests::has_sha256() const { +// optional string path = 1; +inline bool ClientIncidentReport_IncidentData_BlacklistLoadIncident::has_path() const { return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest_Digests::set_has_sha256() { +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_has_path() { _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadRequest_Digests::clear_has_sha256() { +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_has_path() { _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadRequest_Digests::clear_sha256() { - if (sha256_ != &::google::protobuf::internal::kEmptyString) { - sha256_->clear(); +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_path() { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_->clear(); } - clear_has_sha256(); + clear_has_path(); } -inline const ::std::string& ClientDownloadRequest_Digests::sha256() const { - return *sha256_; +inline const ::std::string& ClientIncidentReport_IncidentData_BlacklistLoadIncident::path() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.path) + return *path_; } -inline void ClientDownloadRequest_Digests::set_sha256(const ::std::string& value) { - set_has_sha256(); - if (sha256_ == &::google::protobuf::internal::kEmptyString) { - sha256_ = new ::std::string; +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_path(const ::std::string& value) { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; + } + path_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.path) +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_path(const char* value) { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; + } + path_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.path) +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_path(const char* value, size_t size) { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; + } + path_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.path) +} +inline ::std::string* ClientIncidentReport_IncidentData_BlacklistLoadIncident::mutable_path() { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.path) + return path_; +} +inline ::std::string* ClientIncidentReport_IncidentData_BlacklistLoadIncident::release_path() { + clear_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = path_; + path_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_allocated_path(::std::string* path) { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete path_; + } + if (path) { + set_has_path(); + path_ = path; + } else { + clear_has_path(); + path_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.path) +} + +// optional .safe_browsing.ClientDownloadRequest.Digests digest = 2; +inline bool ClientIncidentReport_IncidentData_BlacklistLoadIncident::has_digest() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_has_digest() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_has_digest() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_digest() { + if (digest_ != NULL) digest_->::safe_browsing::ClientDownloadRequest_Digests::Clear(); + clear_has_digest(); +} +inline const ::safe_browsing::ClientDownloadRequest_Digests& ClientIncidentReport_IncidentData_BlacklistLoadIncident::digest() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.digest) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return digest_ != NULL ? *digest_ : *default_instance().digest_; +#else + return digest_ != NULL ? *digest_ : *default_instance_->digest_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_Digests* ClientIncidentReport_IncidentData_BlacklistLoadIncident::mutable_digest() { + set_has_digest(); + if (digest_ == NULL) digest_ = new ::safe_browsing::ClientDownloadRequest_Digests; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.digest) + return digest_; +} +inline ::safe_browsing::ClientDownloadRequest_Digests* ClientIncidentReport_IncidentData_BlacklistLoadIncident::release_digest() { + clear_has_digest(); + ::safe_browsing::ClientDownloadRequest_Digests* temp = digest_; + digest_ = NULL; + return temp; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_allocated_digest(::safe_browsing::ClientDownloadRequest_Digests* digest) { + delete digest_; + digest_ = digest; + if (digest) { + set_has_digest(); + } else { + clear_has_digest(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.digest) +} + +// optional string version = 3; +inline bool ClientIncidentReport_IncidentData_BlacklistLoadIncident::has_version() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_has_version() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_has_version() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_version() { + if (version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_->clear(); + } + clear_has_version(); +} +inline const ::std::string& ClientIncidentReport_IncidentData_BlacklistLoadIncident::version() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.version) + return *version_; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_version(const ::std::string& value) { + set_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_ = new ::std::string; + } + version_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.version) +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_version(const char* value) { + set_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_ = new ::std::string; + } + version_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.version) +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_version(const char* value, size_t size) { + set_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_ = new ::std::string; + } + version_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.version) +} +inline ::std::string* ClientIncidentReport_IncidentData_BlacklistLoadIncident::mutable_version() { + set_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.version) + return version_; +} +inline ::std::string* ClientIncidentReport_IncidentData_BlacklistLoadIncident::release_version() { + clear_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = version_; + version_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_allocated_version(::std::string* version) { + if (version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete version_; + } + if (version) { + set_has_version(); + version_ = version; + } else { + clear_has_version(); + version_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.version) +} + +// optional bool blacklist_initialized = 4; +inline bool ClientIncidentReport_IncidentData_BlacklistLoadIncident::has_blacklist_initialized() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_has_blacklist_initialized() { + _has_bits_[0] |= 0x00000008u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_has_blacklist_initialized() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_blacklist_initialized() { + blacklist_initialized_ = false; + clear_has_blacklist_initialized(); +} +inline bool ClientIncidentReport_IncidentData_BlacklistLoadIncident::blacklist_initialized() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.blacklist_initialized) + return blacklist_initialized_; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_blacklist_initialized(bool value) { + set_has_blacklist_initialized(); + blacklist_initialized_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.blacklist_initialized) +} + +// optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; +inline bool ClientIncidentReport_IncidentData_BlacklistLoadIncident::has_signature() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_has_signature() { + _has_bits_[0] |= 0x00000010u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_has_signature() { + _has_bits_[0] &= ~0x00000010u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_signature() { + if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); + clear_has_signature(); +} +inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& ClientIncidentReport_IncidentData_BlacklistLoadIncident::signature() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.signature) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return signature_ != NULL ? *signature_ : *default_instance().signature_; +#else + return signature_ != NULL ? *signature_ : *default_instance_->signature_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientIncidentReport_IncidentData_BlacklistLoadIncident::mutable_signature() { + set_has_signature(); + if (signature_ == NULL) signature_ = new ::safe_browsing::ClientDownloadRequest_SignatureInfo; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.signature) + return signature_; +} +inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientIncidentReport_IncidentData_BlacklistLoadIncident::release_signature() { + clear_has_signature(); + ::safe_browsing::ClientDownloadRequest_SignatureInfo* temp = signature_; + signature_ = NULL; + return temp; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_allocated_signature(::safe_browsing::ClientDownloadRequest_SignatureInfo* signature) { + delete signature_; + signature_ = signature; + if (signature) { + set_has_signature(); + } else { + clear_has_signature(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.signature) +} + +// optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 6; +inline bool ClientIncidentReport_IncidentData_BlacklistLoadIncident::has_image_headers() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_has_image_headers() { + _has_bits_[0] |= 0x00000020u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_has_image_headers() { + _has_bits_[0] &= ~0x00000020u; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::clear_image_headers() { + if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); + clear_has_image_headers(); +} +inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& ClientIncidentReport_IncidentData_BlacklistLoadIncident::image_headers() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.image_headers) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return image_headers_ != NULL ? *image_headers_ : *default_instance().image_headers_; +#else + return image_headers_ != NULL ? *image_headers_ : *default_instance_->image_headers_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientIncidentReport_IncidentData_BlacklistLoadIncident::mutable_image_headers() { + set_has_image_headers(); + if (image_headers_ == NULL) image_headers_ = new ::safe_browsing::ClientDownloadRequest_ImageHeaders; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.image_headers) + return image_headers_; +} +inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientIncidentReport_IncidentData_BlacklistLoadIncident::release_image_headers() { + clear_has_image_headers(); + ::safe_browsing::ClientDownloadRequest_ImageHeaders* temp = image_headers_; + image_headers_ = NULL; + return temp; +} +inline void ClientIncidentReport_IncidentData_BlacklistLoadIncident::set_allocated_image_headers(::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers) { + delete image_headers_; + image_headers_ = image_headers; + if (image_headers) { + set_has_image_headers(); + } else { + clear_has_image_headers(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident.image_headers) +} + +// ------------------------------------------------------------------- + +// ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident + +// optional string variations_seed_signature = 1; +inline bool ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::has_variations_seed_signature() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::set_has_variations_seed_signature() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::clear_has_variations_seed_signature() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::clear_variations_seed_signature() { + if (variations_seed_signature_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + variations_seed_signature_->clear(); + } + clear_has_variations_seed_signature(); +} +inline const ::std::string& ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::variations_seed_signature() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident.variations_seed_signature) + return *variations_seed_signature_; +} +inline void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::set_variations_seed_signature(const ::std::string& value) { + set_has_variations_seed_signature(); + if (variations_seed_signature_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + variations_seed_signature_ = new ::std::string; } - sha256_->assign(value); + variations_seed_signature_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident.variations_seed_signature) } -inline void ClientDownloadRequest_Digests::set_sha256(const char* value) { - set_has_sha256(); - if (sha256_ == &::google::protobuf::internal::kEmptyString) { - sha256_ = new ::std::string; +inline void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::set_variations_seed_signature(const char* value) { + set_has_variations_seed_signature(); + if (variations_seed_signature_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + variations_seed_signature_ = new ::std::string; } - sha256_->assign(value); + variations_seed_signature_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident.variations_seed_signature) } -inline void ClientDownloadRequest_Digests::set_sha256(const void* value, size_t size) { - set_has_sha256(); - if (sha256_ == &::google::protobuf::internal::kEmptyString) { - sha256_ = new ::std::string; +inline void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::set_variations_seed_signature(const char* value, size_t size) { + set_has_variations_seed_signature(); + if (variations_seed_signature_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + variations_seed_signature_ = new ::std::string; } - sha256_->assign(reinterpret_cast(value), size); + variations_seed_signature_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident.variations_seed_signature) } -inline ::std::string* ClientDownloadRequest_Digests::mutable_sha256() { - set_has_sha256(); - if (sha256_ == &::google::protobuf::internal::kEmptyString) { - sha256_ = new ::std::string; +inline ::std::string* ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::mutable_variations_seed_signature() { + set_has_variations_seed_signature(); + if (variations_seed_signature_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + variations_seed_signature_ = new ::std::string; } - return sha256_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident.variations_seed_signature) + return variations_seed_signature_; } -inline ::std::string* ClientDownloadRequest_Digests::release_sha256() { - clear_has_sha256(); - if (sha256_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::release_variations_seed_signature() { + clear_has_variations_seed_signature(); + if (variations_seed_signature_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = sha256_; - sha256_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = variations_seed_signature_; + variations_seed_signature_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::set_allocated_variations_seed_signature(::std::string* variations_seed_signature) { + if (variations_seed_signature_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete variations_seed_signature_; + } + if (variations_seed_signature) { + set_has_variations_seed_signature(); + variations_seed_signature_ = variations_seed_signature; + } else { + clear_has_variations_seed_signature(); + variations_seed_signature_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident.variations_seed_signature) +} -// optional bytes sha1 = 2; -inline bool ClientDownloadRequest_Digests::has_sha1() const { - return (_has_bits_[0] & 0x00000002u) != 0; +// ------------------------------------------------------------------- + +// ClientIncidentReport_IncidentData_ScriptRequestIncident + +// optional string script_digest = 1; +inline bool ClientIncidentReport_IncidentData_ScriptRequestIncident::has_script_digest() const { + return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest_Digests::set_has_sha1() { - _has_bits_[0] |= 0x00000002u; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_has_script_digest() { + _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadRequest_Digests::clear_has_sha1() { - _has_bits_[0] &= ~0x00000002u; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::clear_has_script_digest() { + _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadRequest_Digests::clear_sha1() { - if (sha1_ != &::google::protobuf::internal::kEmptyString) { - sha1_->clear(); +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::clear_script_digest() { + if (script_digest_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + script_digest_->clear(); } - clear_has_sha1(); + clear_has_script_digest(); } -inline const ::std::string& ClientDownloadRequest_Digests::sha1() const { - return *sha1_; +inline const ::std::string& ClientIncidentReport_IncidentData_ScriptRequestIncident::script_digest() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.script_digest) + return *script_digest_; } -inline void ClientDownloadRequest_Digests::set_sha1(const ::std::string& value) { - set_has_sha1(); - if (sha1_ == &::google::protobuf::internal::kEmptyString) { - sha1_ = new ::std::string; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_script_digest(const ::std::string& value) { + set_has_script_digest(); + if (script_digest_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + script_digest_ = new ::std::string; } - sha1_->assign(value); + script_digest_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.script_digest) } -inline void ClientDownloadRequest_Digests::set_sha1(const char* value) { - set_has_sha1(); - if (sha1_ == &::google::protobuf::internal::kEmptyString) { - sha1_ = new ::std::string; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_script_digest(const char* value) { + set_has_script_digest(); + if (script_digest_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + script_digest_ = new ::std::string; } - sha1_->assign(value); + script_digest_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.script_digest) } -inline void ClientDownloadRequest_Digests::set_sha1(const void* value, size_t size) { - set_has_sha1(); - if (sha1_ == &::google::protobuf::internal::kEmptyString) { - sha1_ = new ::std::string; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_script_digest(const char* value, size_t size) { + set_has_script_digest(); + if (script_digest_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + script_digest_ = new ::std::string; } - sha1_->assign(reinterpret_cast(value), size); + script_digest_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.script_digest) } -inline ::std::string* ClientDownloadRequest_Digests::mutable_sha1() { - set_has_sha1(); - if (sha1_ == &::google::protobuf::internal::kEmptyString) { - sha1_ = new ::std::string; +inline ::std::string* ClientIncidentReport_IncidentData_ScriptRequestIncident::mutable_script_digest() { + set_has_script_digest(); + if (script_digest_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + script_digest_ = new ::std::string; } - return sha1_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.script_digest) + return script_digest_; } -inline ::std::string* ClientDownloadRequest_Digests::release_sha1() { - clear_has_sha1(); - if (sha1_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_IncidentData_ScriptRequestIncident::release_script_digest() { + clear_has_script_digest(); + if (script_digest_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = sha1_; - sha1_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = script_digest_; + script_digest_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_allocated_script_digest(::std::string* script_digest) { + if (script_digest_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete script_digest_; + } + if (script_digest) { + set_has_script_digest(); + script_digest_ = script_digest; + } else { + clear_has_script_digest(); + script_digest_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.script_digest) +} -// optional bytes md5 = 3; -inline bool ClientDownloadRequest_Digests::has_md5() const { - return (_has_bits_[0] & 0x00000004u) != 0; +// optional string inclusion_origin = 2; +inline bool ClientIncidentReport_IncidentData_ScriptRequestIncident::has_inclusion_origin() const { + return (_has_bits_[0] & 0x00000002u) != 0; } -inline void ClientDownloadRequest_Digests::set_has_md5() { - _has_bits_[0] |= 0x00000004u; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_has_inclusion_origin() { + _has_bits_[0] |= 0x00000002u; } -inline void ClientDownloadRequest_Digests::clear_has_md5() { - _has_bits_[0] &= ~0x00000004u; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::clear_has_inclusion_origin() { + _has_bits_[0] &= ~0x00000002u; } -inline void ClientDownloadRequest_Digests::clear_md5() { - if (md5_ != &::google::protobuf::internal::kEmptyString) { - md5_->clear(); +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::clear_inclusion_origin() { + if (inclusion_origin_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + inclusion_origin_->clear(); } - clear_has_md5(); + clear_has_inclusion_origin(); } -inline const ::std::string& ClientDownloadRequest_Digests::md5() const { - return *md5_; +inline const ::std::string& ClientIncidentReport_IncidentData_ScriptRequestIncident::inclusion_origin() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.inclusion_origin) + return *inclusion_origin_; } -inline void ClientDownloadRequest_Digests::set_md5(const ::std::string& value) { - set_has_md5(); - if (md5_ == &::google::protobuf::internal::kEmptyString) { - md5_ = new ::std::string; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_inclusion_origin(const ::std::string& value) { + set_has_inclusion_origin(); + if (inclusion_origin_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + inclusion_origin_ = new ::std::string; } - md5_->assign(value); + inclusion_origin_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.inclusion_origin) } -inline void ClientDownloadRequest_Digests::set_md5(const char* value) { - set_has_md5(); - if (md5_ == &::google::protobuf::internal::kEmptyString) { - md5_ = new ::std::string; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_inclusion_origin(const char* value) { + set_has_inclusion_origin(); + if (inclusion_origin_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + inclusion_origin_ = new ::std::string; } - md5_->assign(value); + inclusion_origin_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.inclusion_origin) } -inline void ClientDownloadRequest_Digests::set_md5(const void* value, size_t size) { - set_has_md5(); - if (md5_ == &::google::protobuf::internal::kEmptyString) { - md5_ = new ::std::string; +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_inclusion_origin(const char* value, size_t size) { + set_has_inclusion_origin(); + if (inclusion_origin_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + inclusion_origin_ = new ::std::string; } - md5_->assign(reinterpret_cast(value), size); + inclusion_origin_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.inclusion_origin) } -inline ::std::string* ClientDownloadRequest_Digests::mutable_md5() { - set_has_md5(); - if (md5_ == &::google::protobuf::internal::kEmptyString) { - md5_ = new ::std::string; +inline ::std::string* ClientIncidentReport_IncidentData_ScriptRequestIncident::mutable_inclusion_origin() { + set_has_inclusion_origin(); + if (inclusion_origin_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + inclusion_origin_ = new ::std::string; } - return md5_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.inclusion_origin) + return inclusion_origin_; } -inline ::std::string* ClientDownloadRequest_Digests::release_md5() { - clear_has_md5(); - if (md5_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_IncidentData_ScriptRequestIncident::release_inclusion_origin() { + clear_has_inclusion_origin(); + if (inclusion_origin_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = md5_; - md5_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = inclusion_origin_; + inclusion_origin_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_IncidentData_ScriptRequestIncident::set_allocated_inclusion_origin(::std::string* inclusion_origin) { + if (inclusion_origin_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete inclusion_origin_; + } + if (inclusion_origin) { + set_has_inclusion_origin(); + inclusion_origin_ = inclusion_origin; + } else { + clear_has_inclusion_origin(); + inclusion_origin_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident.inclusion_origin) +} // ------------------------------------------------------------------- -// ClientDownloadRequest_Resource +// ClientIncidentReport_IncidentData -// required string url = 1; -inline bool ClientDownloadRequest_Resource::has_url() const { +// optional int64 incident_time_msec = 1; +inline bool ClientIncidentReport_IncidentData::has_incident_time_msec() const { return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest_Resource::set_has_url() { +inline void ClientIncidentReport_IncidentData::set_has_incident_time_msec() { _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadRequest_Resource::clear_has_url() { +inline void ClientIncidentReport_IncidentData::clear_has_incident_time_msec() { _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadRequest_Resource::clear_url() { - if (url_ != &::google::protobuf::internal::kEmptyString) { - url_->clear(); - } - clear_has_url(); -} -inline const ::std::string& ClientDownloadRequest_Resource::url() const { - return *url_; -} -inline void ClientDownloadRequest_Resource::set_url(const ::std::string& value) { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; - } - url_->assign(value); -} -inline void ClientDownloadRequest_Resource::set_url(const char* value) { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; - } - url_->assign(value); -} -inline void ClientDownloadRequest_Resource::set_url(const char* value, size_t size) { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; - } - url_->assign(reinterpret_cast(value), size); +inline void ClientIncidentReport_IncidentData::clear_incident_time_msec() { + incident_time_msec_ = GOOGLE_LONGLONG(0); + clear_has_incident_time_msec(); } -inline ::std::string* ClientDownloadRequest_Resource::mutable_url() { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; - } - return url_; +inline ::google::protobuf::int64 ClientIncidentReport_IncidentData::incident_time_msec() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.incident_time_msec) + return incident_time_msec_; } -inline ::std::string* ClientDownloadRequest_Resource::release_url() { - clear_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - return NULL; - } else { - ::std::string* temp = url_; - url_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; - } +inline void ClientIncidentReport_IncidentData::set_incident_time_msec(::google::protobuf::int64 value) { + set_has_incident_time_msec(); + incident_time_msec_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.IncidentData.incident_time_msec) } -// required .safe_browsing.ClientDownloadRequest.ResourceType type = 2; -inline bool ClientDownloadRequest_Resource::has_type() const { +// optional .safe_browsing.ClientIncidentReport.IncidentData.TrackedPreferenceIncident tracked_preference = 2; +inline bool ClientIncidentReport_IncidentData::has_tracked_preference() const { return (_has_bits_[0] & 0x00000002u) != 0; } -inline void ClientDownloadRequest_Resource::set_has_type() { +inline void ClientIncidentReport_IncidentData::set_has_tracked_preference() { _has_bits_[0] |= 0x00000002u; } -inline void ClientDownloadRequest_Resource::clear_has_type() { +inline void ClientIncidentReport_IncidentData::clear_has_tracked_preference() { _has_bits_[0] &= ~0x00000002u; } -inline void ClientDownloadRequest_Resource::clear_type() { - type_ = 0; - clear_has_type(); +inline void ClientIncidentReport_IncidentData::clear_tracked_preference() { + if (tracked_preference_ != NULL) tracked_preference_->::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident::Clear(); + clear_has_tracked_preference(); } -inline ::safe_browsing::ClientDownloadRequest_ResourceType ClientDownloadRequest_Resource::type() const { - return static_cast< ::safe_browsing::ClientDownloadRequest_ResourceType >(type_); +inline const ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident& ClientIncidentReport_IncidentData::tracked_preference() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.tracked_preference) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return tracked_preference_ != NULL ? *tracked_preference_ : *default_instance().tracked_preference_; +#else + return tracked_preference_ != NULL ? *tracked_preference_ : *default_instance_->tracked_preference_; +#endif } -inline void ClientDownloadRequest_Resource::set_type(::safe_browsing::ClientDownloadRequest_ResourceType value) { - GOOGLE_DCHECK(::safe_browsing::ClientDownloadRequest_ResourceType_IsValid(value)); - set_has_type(); - type_ = value; +inline ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident* ClientIncidentReport_IncidentData::mutable_tracked_preference() { + set_has_tracked_preference(); + if (tracked_preference_ == NULL) tracked_preference_ = new ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.tracked_preference) + return tracked_preference_; +} +inline ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident* ClientIncidentReport_IncidentData::release_tracked_preference() { + clear_has_tracked_preference(); + ::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident* temp = tracked_preference_; + tracked_preference_ = NULL; + return temp; +} +inline void ClientIncidentReport_IncidentData::set_allocated_tracked_preference(::safe_browsing::ClientIncidentReport_IncidentData_TrackedPreferenceIncident* tracked_preference) { + delete tracked_preference_; + tracked_preference_ = tracked_preference; + if (tracked_preference) { + set_has_tracked_preference(); + } else { + clear_has_tracked_preference(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.tracked_preference) } -// optional bytes remote_ip = 3; -inline bool ClientDownloadRequest_Resource::has_remote_ip() const { +// optional .safe_browsing.ClientIncidentReport.IncidentData.BinaryIntegrityIncident binary_integrity = 3; +inline bool ClientIncidentReport_IncidentData::has_binary_integrity() const { return (_has_bits_[0] & 0x00000004u) != 0; } -inline void ClientDownloadRequest_Resource::set_has_remote_ip() { +inline void ClientIncidentReport_IncidentData::set_has_binary_integrity() { _has_bits_[0] |= 0x00000004u; } -inline void ClientDownloadRequest_Resource::clear_has_remote_ip() { +inline void ClientIncidentReport_IncidentData::clear_has_binary_integrity() { _has_bits_[0] &= ~0x00000004u; } -inline void ClientDownloadRequest_Resource::clear_remote_ip() { - if (remote_ip_ != &::google::protobuf::internal::kEmptyString) { - remote_ip_->clear(); - } - clear_has_remote_ip(); -} -inline const ::std::string& ClientDownloadRequest_Resource::remote_ip() const { - return *remote_ip_; -} -inline void ClientDownloadRequest_Resource::set_remote_ip(const ::std::string& value) { - set_has_remote_ip(); - if (remote_ip_ == &::google::protobuf::internal::kEmptyString) { - remote_ip_ = new ::std::string; - } - remote_ip_->assign(value); +inline void ClientIncidentReport_IncidentData::clear_binary_integrity() { + if (binary_integrity_ != NULL) binary_integrity_->::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident::Clear(); + clear_has_binary_integrity(); } -inline void ClientDownloadRequest_Resource::set_remote_ip(const char* value) { - set_has_remote_ip(); - if (remote_ip_ == &::google::protobuf::internal::kEmptyString) { - remote_ip_ = new ::std::string; - } - remote_ip_->assign(value); +inline const ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident& ClientIncidentReport_IncidentData::binary_integrity() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.binary_integrity) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return binary_integrity_ != NULL ? *binary_integrity_ : *default_instance().binary_integrity_; +#else + return binary_integrity_ != NULL ? *binary_integrity_ : *default_instance_->binary_integrity_; +#endif } -inline void ClientDownloadRequest_Resource::set_remote_ip(const void* value, size_t size) { - set_has_remote_ip(); - if (remote_ip_ == &::google::protobuf::internal::kEmptyString) { - remote_ip_ = new ::std::string; - } - remote_ip_->assign(reinterpret_cast(value), size); +inline ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident* ClientIncidentReport_IncidentData::mutable_binary_integrity() { + set_has_binary_integrity(); + if (binary_integrity_ == NULL) binary_integrity_ = new ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.binary_integrity) + return binary_integrity_; } -inline ::std::string* ClientDownloadRequest_Resource::mutable_remote_ip() { - set_has_remote_ip(); - if (remote_ip_ == &::google::protobuf::internal::kEmptyString) { - remote_ip_ = new ::std::string; - } - return remote_ip_; +inline ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident* ClientIncidentReport_IncidentData::release_binary_integrity() { + clear_has_binary_integrity(); + ::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident* temp = binary_integrity_; + binary_integrity_ = NULL; + return temp; } -inline ::std::string* ClientDownloadRequest_Resource::release_remote_ip() { - clear_has_remote_ip(); - if (remote_ip_ == &::google::protobuf::internal::kEmptyString) { - return NULL; +inline void ClientIncidentReport_IncidentData::set_allocated_binary_integrity(::safe_browsing::ClientIncidentReport_IncidentData_BinaryIntegrityIncident* binary_integrity) { + delete binary_integrity_; + binary_integrity_ = binary_integrity; + if (binary_integrity) { + set_has_binary_integrity(); } else { - ::std::string* temp = remote_ip_; - remote_ip_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; + clear_has_binary_integrity(); } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.binary_integrity) } -// optional string referrer = 4; -inline bool ClientDownloadRequest_Resource::has_referrer() const { +// optional .safe_browsing.ClientIncidentReport.IncidentData.BlacklistLoadIncident blacklist_load = 4; +inline bool ClientIncidentReport_IncidentData::has_blacklist_load() const { return (_has_bits_[0] & 0x00000008u) != 0; } -inline void ClientDownloadRequest_Resource::set_has_referrer() { +inline void ClientIncidentReport_IncidentData::set_has_blacklist_load() { _has_bits_[0] |= 0x00000008u; } -inline void ClientDownloadRequest_Resource::clear_has_referrer() { +inline void ClientIncidentReport_IncidentData::clear_has_blacklist_load() { _has_bits_[0] &= ~0x00000008u; } -inline void ClientDownloadRequest_Resource::clear_referrer() { - if (referrer_ != &::google::protobuf::internal::kEmptyString) { - referrer_->clear(); - } - clear_has_referrer(); +inline void ClientIncidentReport_IncidentData::clear_blacklist_load() { + if (blacklist_load_ != NULL) blacklist_load_->::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident::Clear(); + clear_has_blacklist_load(); } -inline const ::std::string& ClientDownloadRequest_Resource::referrer() const { - return *referrer_; +inline const ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident& ClientIncidentReport_IncidentData::blacklist_load() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.blacklist_load) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return blacklist_load_ != NULL ? *blacklist_load_ : *default_instance().blacklist_load_; +#else + return blacklist_load_ != NULL ? *blacklist_load_ : *default_instance_->blacklist_load_; +#endif } -inline void ClientDownloadRequest_Resource::set_referrer(const ::std::string& value) { - set_has_referrer(); - if (referrer_ == &::google::protobuf::internal::kEmptyString) { - referrer_ = new ::std::string; - } - referrer_->assign(value); +inline ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident* ClientIncidentReport_IncidentData::mutable_blacklist_load() { + set_has_blacklist_load(); + if (blacklist_load_ == NULL) blacklist_load_ = new ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.blacklist_load) + return blacklist_load_; } -inline void ClientDownloadRequest_Resource::set_referrer(const char* value) { - set_has_referrer(); - if (referrer_ == &::google::protobuf::internal::kEmptyString) { - referrer_ = new ::std::string; - } - referrer_->assign(value); +inline ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident* ClientIncidentReport_IncidentData::release_blacklist_load() { + clear_has_blacklist_load(); + ::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident* temp = blacklist_load_; + blacklist_load_ = NULL; + return temp; } -inline void ClientDownloadRequest_Resource::set_referrer(const char* value, size_t size) { - set_has_referrer(); - if (referrer_ == &::google::protobuf::internal::kEmptyString) { - referrer_ = new ::std::string; +inline void ClientIncidentReport_IncidentData::set_allocated_blacklist_load(::safe_browsing::ClientIncidentReport_IncidentData_BlacklistLoadIncident* blacklist_load) { + delete blacklist_load_; + blacklist_load_ = blacklist_load; + if (blacklist_load) { + set_has_blacklist_load(); + } else { + clear_has_blacklist_load(); } - referrer_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.blacklist_load) } -inline ::std::string* ClientDownloadRequest_Resource::mutable_referrer() { - set_has_referrer(); - if (referrer_ == &::google::protobuf::internal::kEmptyString) { - referrer_ = new ::std::string; + +// optional .safe_browsing.ClientIncidentReport.IncidentData.VariationsSeedSignatureIncident variations_seed_signature = 6; +inline bool ClientIncidentReport_IncidentData::has_variations_seed_signature() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void ClientIncidentReport_IncidentData::set_has_variations_seed_signature() { + _has_bits_[0] |= 0x00000010u; +} +inline void ClientIncidentReport_IncidentData::clear_has_variations_seed_signature() { + _has_bits_[0] &= ~0x00000010u; +} +inline void ClientIncidentReport_IncidentData::clear_variations_seed_signature() { + if (variations_seed_signature_ != NULL) variations_seed_signature_->::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident::Clear(); + clear_has_variations_seed_signature(); +} +inline const ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident& ClientIncidentReport_IncidentData::variations_seed_signature() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.variations_seed_signature) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return variations_seed_signature_ != NULL ? *variations_seed_signature_ : *default_instance().variations_seed_signature_; +#else + return variations_seed_signature_ != NULL ? *variations_seed_signature_ : *default_instance_->variations_seed_signature_; +#endif +} +inline ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* ClientIncidentReport_IncidentData::mutable_variations_seed_signature() { + set_has_variations_seed_signature(); + if (variations_seed_signature_ == NULL) variations_seed_signature_ = new ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.variations_seed_signature) + return variations_seed_signature_; +} +inline ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* ClientIncidentReport_IncidentData::release_variations_seed_signature() { + clear_has_variations_seed_signature(); + ::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* temp = variations_seed_signature_; + variations_seed_signature_ = NULL; + return temp; +} +inline void ClientIncidentReport_IncidentData::set_allocated_variations_seed_signature(::safe_browsing::ClientIncidentReport_IncidentData_VariationsSeedSignatureIncident* variations_seed_signature) { + delete variations_seed_signature_; + variations_seed_signature_ = variations_seed_signature; + if (variations_seed_signature) { + set_has_variations_seed_signature(); + } else { + clear_has_variations_seed_signature(); } - return referrer_; + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.variations_seed_signature) +} + +// optional .safe_browsing.ClientIncidentReport.IncidentData.ScriptRequestIncident script_request = 7; +inline bool ClientIncidentReport_IncidentData::has_script_request() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void ClientIncidentReport_IncidentData::set_has_script_request() { + _has_bits_[0] |= 0x00000020u; +} +inline void ClientIncidentReport_IncidentData::clear_has_script_request() { + _has_bits_[0] &= ~0x00000020u; +} +inline void ClientIncidentReport_IncidentData::clear_script_request() { + if (script_request_ != NULL) script_request_->::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident::Clear(); + clear_has_script_request(); +} +inline const ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident& ClientIncidentReport_IncidentData::script_request() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.IncidentData.script_request) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return script_request_ != NULL ? *script_request_ : *default_instance().script_request_; +#else + return script_request_ != NULL ? *script_request_ : *default_instance_->script_request_; +#endif +} +inline ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident* ClientIncidentReport_IncidentData::mutable_script_request() { + set_has_script_request(); + if (script_request_ == NULL) script_request_ = new ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.IncidentData.script_request) + return script_request_; +} +inline ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident* ClientIncidentReport_IncidentData::release_script_request() { + clear_has_script_request(); + ::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident* temp = script_request_; + script_request_ = NULL; + return temp; } -inline ::std::string* ClientDownloadRequest_Resource::release_referrer() { - clear_has_referrer(); - if (referrer_ == &::google::protobuf::internal::kEmptyString) { - return NULL; +inline void ClientIncidentReport_IncidentData::set_allocated_script_request(::safe_browsing::ClientIncidentReport_IncidentData_ScriptRequestIncident* script_request) { + delete script_request_; + script_request_ = script_request; + if (script_request) { + set_has_script_request(); } else { - ::std::string* temp = referrer_; - referrer_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; + clear_has_script_request(); } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.IncidentData.script_request) } // ------------------------------------------------------------------- -// ClientDownloadRequest_CertificateChain_Element +// ClientIncidentReport_DownloadDetails -// optional bytes certificate = 1; -inline bool ClientDownloadRequest_CertificateChain_Element::has_certificate() const { +// optional bytes token = 1; +inline bool ClientIncidentReport_DownloadDetails::has_token() const { return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest_CertificateChain_Element::set_has_certificate() { +inline void ClientIncidentReport_DownloadDetails::set_has_token() { _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadRequest_CertificateChain_Element::clear_has_certificate() { +inline void ClientIncidentReport_DownloadDetails::clear_has_token() { _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadRequest_CertificateChain_Element::clear_certificate() { - if (certificate_ != &::google::protobuf::internal::kEmptyString) { - certificate_->clear(); +inline void ClientIncidentReport_DownloadDetails::clear_token() { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_->clear(); } - clear_has_certificate(); + clear_has_token(); } -inline const ::std::string& ClientDownloadRequest_CertificateChain_Element::certificate() const { - return *certificate_; +inline const ::std::string& ClientIncidentReport_DownloadDetails::token() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.DownloadDetails.token) + return *token_; } -inline void ClientDownloadRequest_CertificateChain_Element::set_certificate(const ::std::string& value) { - set_has_certificate(); - if (certificate_ == &::google::protobuf::internal::kEmptyString) { - certificate_ = new ::std::string; +inline void ClientIncidentReport_DownloadDetails::set_token(const ::std::string& value) { + set_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_ = new ::std::string; } - certificate_->assign(value); + token_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.DownloadDetails.token) } -inline void ClientDownloadRequest_CertificateChain_Element::set_certificate(const char* value) { - set_has_certificate(); - if (certificate_ == &::google::protobuf::internal::kEmptyString) { - certificate_ = new ::std::string; +inline void ClientIncidentReport_DownloadDetails::set_token(const char* value) { + set_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_ = new ::std::string; } - certificate_->assign(value); + token_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.DownloadDetails.token) } -inline void ClientDownloadRequest_CertificateChain_Element::set_certificate(const void* value, size_t size) { - set_has_certificate(); - if (certificate_ == &::google::protobuf::internal::kEmptyString) { - certificate_ = new ::std::string; +inline void ClientIncidentReport_DownloadDetails::set_token(const void* value, size_t size) { + set_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_ = new ::std::string; } - certificate_->assign(reinterpret_cast(value), size); + token_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.DownloadDetails.token) } -inline ::std::string* ClientDownloadRequest_CertificateChain_Element::mutable_certificate() { - set_has_certificate(); - if (certificate_ == &::google::protobuf::internal::kEmptyString) { - certificate_ = new ::std::string; +inline ::std::string* ClientIncidentReport_DownloadDetails::mutable_token() { + set_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + token_ = new ::std::string; } - return certificate_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.DownloadDetails.token) + return token_; } -inline ::std::string* ClientDownloadRequest_CertificateChain_Element::release_certificate() { - clear_has_certificate(); - if (certificate_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_DownloadDetails::release_token() { + clear_has_token(); + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = certificate_; - certificate_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = token_; + token_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_DownloadDetails::set_allocated_token(::std::string* token) { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete token_; + } + if (token) { + set_has_token(); + token_ = token; + } else { + clear_has_token(); + token_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.DownloadDetails.token) +} -// ------------------------------------------------------------------- - -// ClientDownloadRequest_CertificateChain +// optional .safe_browsing.ClientDownloadRequest download = 2; +inline bool ClientIncidentReport_DownloadDetails::has_download() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientIncidentReport_DownloadDetails::set_has_download() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientIncidentReport_DownloadDetails::clear_has_download() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientIncidentReport_DownloadDetails::clear_download() { + if (download_ != NULL) download_->::safe_browsing::ClientDownloadRequest::Clear(); + clear_has_download(); +} +inline const ::safe_browsing::ClientDownloadRequest& ClientIncidentReport_DownloadDetails::download() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.DownloadDetails.download) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return download_ != NULL ? *download_ : *default_instance().download_; +#else + return download_ != NULL ? *download_ : *default_instance_->download_; +#endif +} +inline ::safe_browsing::ClientDownloadRequest* ClientIncidentReport_DownloadDetails::mutable_download() { + set_has_download(); + if (download_ == NULL) download_ = new ::safe_browsing::ClientDownloadRequest; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.DownloadDetails.download) + return download_; +} +inline ::safe_browsing::ClientDownloadRequest* ClientIncidentReport_DownloadDetails::release_download() { + clear_has_download(); + ::safe_browsing::ClientDownloadRequest* temp = download_; + download_ = NULL; + return temp; +} +inline void ClientIncidentReport_DownloadDetails::set_allocated_download(::safe_browsing::ClientDownloadRequest* download) { + delete download_; + download_ = download; + if (download) { + set_has_download(); + } else { + clear_has_download(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.DownloadDetails.download) +} -// repeated .safe_browsing.ClientDownloadRequest.CertificateChain.Element element = 1; -inline int ClientDownloadRequest_CertificateChain::element_size() const { - return element_.size(); +// optional int64 download_time_msec = 3; +inline bool ClientIncidentReport_DownloadDetails::has_download_time_msec() const { + return (_has_bits_[0] & 0x00000004u) != 0; } -inline void ClientDownloadRequest_CertificateChain::clear_element() { - element_.Clear(); +inline void ClientIncidentReport_DownloadDetails::set_has_download_time_msec() { + _has_bits_[0] |= 0x00000004u; } -inline const ::safe_browsing::ClientDownloadRequest_CertificateChain_Element& ClientDownloadRequest_CertificateChain::element(int index) const { - return element_.Get(index); +inline void ClientIncidentReport_DownloadDetails::clear_has_download_time_msec() { + _has_bits_[0] &= ~0x00000004u; } -inline ::safe_browsing::ClientDownloadRequest_CertificateChain_Element* ClientDownloadRequest_CertificateChain::mutable_element(int index) { - return element_.Mutable(index); +inline void ClientIncidentReport_DownloadDetails::clear_download_time_msec() { + download_time_msec_ = GOOGLE_LONGLONG(0); + clear_has_download_time_msec(); } -inline ::safe_browsing::ClientDownloadRequest_CertificateChain_Element* ClientDownloadRequest_CertificateChain::add_element() { - return element_.Add(); +inline ::google::protobuf::int64 ClientIncidentReport_DownloadDetails::download_time_msec() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.DownloadDetails.download_time_msec) + return download_time_msec_; } -inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element >& -ClientDownloadRequest_CertificateChain::element() const { - return element_; +inline void ClientIncidentReport_DownloadDetails::set_download_time_msec(::google::protobuf::int64 value) { + set_has_download_time_msec(); + download_time_msec_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.DownloadDetails.download_time_msec) } -inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain_Element >* -ClientDownloadRequest_CertificateChain::mutable_element() { - return &element_; + +// optional int64 open_time_msec = 4; +inline bool ClientIncidentReport_DownloadDetails::has_open_time_msec() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ClientIncidentReport_DownloadDetails::set_has_open_time_msec() { + _has_bits_[0] |= 0x00000008u; +} +inline void ClientIncidentReport_DownloadDetails::clear_has_open_time_msec() { + _has_bits_[0] &= ~0x00000008u; +} +inline void ClientIncidentReport_DownloadDetails::clear_open_time_msec() { + open_time_msec_ = GOOGLE_LONGLONG(0); + clear_has_open_time_msec(); +} +inline ::google::protobuf::int64 ClientIncidentReport_DownloadDetails::open_time_msec() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.DownloadDetails.open_time_msec) + return open_time_msec_; +} +inline void ClientIncidentReport_DownloadDetails::set_open_time_msec(::google::protobuf::int64 value) { + set_has_open_time_msec(); + open_time_msec_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.DownloadDetails.open_time_msec) } // ------------------------------------------------------------------- -// ClientDownloadRequest_SignatureInfo +// ClientIncidentReport_EnvironmentData_OS -// repeated .safe_browsing.ClientDownloadRequest.CertificateChain certificate_chain = 1; -inline int ClientDownloadRequest_SignatureInfo::certificate_chain_size() const { - return certificate_chain_.size(); +// optional string os_name = 1; +inline bool ClientIncidentReport_EnvironmentData_OS::has_os_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest_SignatureInfo::clear_certificate_chain() { - certificate_chain_.Clear(); +inline void ClientIncidentReport_EnvironmentData_OS::set_has_os_name() { + _has_bits_[0] |= 0x00000001u; } -inline const ::safe_browsing::ClientDownloadRequest_CertificateChain& ClientDownloadRequest_SignatureInfo::certificate_chain(int index) const { - return certificate_chain_.Get(index); +inline void ClientIncidentReport_EnvironmentData_OS::clear_has_os_name() { + _has_bits_[0] &= ~0x00000001u; } -inline ::safe_browsing::ClientDownloadRequest_CertificateChain* ClientDownloadRequest_SignatureInfo::mutable_certificate_chain(int index) { - return certificate_chain_.Mutable(index); +inline void ClientIncidentReport_EnvironmentData_OS::clear_os_name() { + if (os_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_name_->clear(); + } + clear_has_os_name(); } -inline ::safe_browsing::ClientDownloadRequest_CertificateChain* ClientDownloadRequest_SignatureInfo::add_certificate_chain() { - return certificate_chain_.Add(); +inline const ::std::string& ClientIncidentReport_EnvironmentData_OS::os_name() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_name) + return *os_name_; } -inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain >& -ClientDownloadRequest_SignatureInfo::certificate_chain() const { - return certificate_chain_; +inline void ClientIncidentReport_EnvironmentData_OS::set_os_name(const ::std::string& value) { + set_has_os_name(); + if (os_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_name_ = new ::std::string; + } + os_name_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_name) } -inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_CertificateChain >* -ClientDownloadRequest_SignatureInfo::mutable_certificate_chain() { - return &certificate_chain_; +inline void ClientIncidentReport_EnvironmentData_OS::set_os_name(const char* value) { + set_has_os_name(); + if (os_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_name_ = new ::std::string; + } + os_name_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_name) +} +inline void ClientIncidentReport_EnvironmentData_OS::set_os_name(const char* value, size_t size) { + set_has_os_name(); + if (os_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_name_ = new ::std::string; + } + os_name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_name) +} +inline ::std::string* ClientIncidentReport_EnvironmentData_OS::mutable_os_name() { + set_has_os_name(); + if (os_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_name) + return os_name_; +} +inline ::std::string* ClientIncidentReport_EnvironmentData_OS::release_os_name() { + clear_has_os_name(); + if (os_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = os_name_; + os_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientIncidentReport_EnvironmentData_OS::set_allocated_os_name(::std::string* os_name) { + if (os_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete os_name_; + } + if (os_name) { + set_has_os_name(); + os_name_ = os_name; + } else { + clear_has_os_name(); + os_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_name) } -// optional bool trusted = 2; -inline bool ClientDownloadRequest_SignatureInfo::has_trusted() const { +// optional string os_version = 2; +inline bool ClientIncidentReport_EnvironmentData_OS::has_os_version() const { return (_has_bits_[0] & 0x00000002u) != 0; } -inline void ClientDownloadRequest_SignatureInfo::set_has_trusted() { +inline void ClientIncidentReport_EnvironmentData_OS::set_has_os_version() { _has_bits_[0] |= 0x00000002u; } -inline void ClientDownloadRequest_SignatureInfo::clear_has_trusted() { +inline void ClientIncidentReport_EnvironmentData_OS::clear_has_os_version() { _has_bits_[0] &= ~0x00000002u; } -inline void ClientDownloadRequest_SignatureInfo::clear_trusted() { - trusted_ = false; - clear_has_trusted(); +inline void ClientIncidentReport_EnvironmentData_OS::clear_os_version() { + if (os_version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_version_->clear(); + } + clear_has_os_version(); } -inline bool ClientDownloadRequest_SignatureInfo::trusted() const { - return trusted_; +inline const ::std::string& ClientIncidentReport_EnvironmentData_OS::os_version() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_version) + return *os_version_; } -inline void ClientDownloadRequest_SignatureInfo::set_trusted(bool value) { - set_has_trusted(); - trusted_ = value; +inline void ClientIncidentReport_EnvironmentData_OS::set_os_version(const ::std::string& value) { + set_has_os_version(); + if (os_version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_version_ = new ::std::string; + } + os_version_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_version) +} +inline void ClientIncidentReport_EnvironmentData_OS::set_os_version(const char* value) { + set_has_os_version(); + if (os_version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_version_ = new ::std::string; + } + os_version_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_version) +} +inline void ClientIncidentReport_EnvironmentData_OS::set_os_version(const char* value, size_t size) { + set_has_os_version(); + if (os_version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_version_ = new ::std::string; + } + os_version_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_version) +} +inline ::std::string* ClientIncidentReport_EnvironmentData_OS::mutable_os_version() { + set_has_os_version(); + if (os_version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + os_version_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_version) + return os_version_; +} +inline ::std::string* ClientIncidentReport_EnvironmentData_OS::release_os_version() { + clear_has_os_version(); + if (os_version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = os_version_; + os_version_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ClientIncidentReport_EnvironmentData_OS::set_allocated_os_version(::std::string* os_version) { + if (os_version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete os_version_; + } + if (os_version) { + set_has_os_version(); + os_version_ = os_version; + } else { + clear_has_os_version(); + os_version_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.OS.os_version) } // ------------------------------------------------------------------- -// ClientDownloadRequest_PEImageHeaders_DebugData +// ClientIncidentReport_EnvironmentData_Machine -// optional bytes directory_entry = 1; -inline bool ClientDownloadRequest_PEImageHeaders_DebugData::has_directory_entry() const { +// optional string cpu_architecture = 1; +inline bool ClientIncidentReport_EnvironmentData_Machine::has_cpu_architecture() const { return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_has_directory_entry() { +inline void ClientIncidentReport_EnvironmentData_Machine::set_has_cpu_architecture() { _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::clear_has_directory_entry() { +inline void ClientIncidentReport_EnvironmentData_Machine::clear_has_cpu_architecture() { _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::clear_directory_entry() { - if (directory_entry_ != &::google::protobuf::internal::kEmptyString) { - directory_entry_->clear(); +inline void ClientIncidentReport_EnvironmentData_Machine::clear_cpu_architecture() { + if (cpu_architecture_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_architecture_->clear(); } - clear_has_directory_entry(); + clear_has_cpu_architecture(); } -inline const ::std::string& ClientDownloadRequest_PEImageHeaders_DebugData::directory_entry() const { - return *directory_entry_; +inline const ::std::string& ClientIncidentReport_EnvironmentData_Machine::cpu_architecture() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_architecture) + return *cpu_architecture_; } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_directory_entry(const ::std::string& value) { - set_has_directory_entry(); - if (directory_entry_ == &::google::protobuf::internal::kEmptyString) { - directory_entry_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Machine::set_cpu_architecture(const ::std::string& value) { + set_has_cpu_architecture(); + if (cpu_architecture_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_architecture_ = new ::std::string; } - directory_entry_->assign(value); + cpu_architecture_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_architecture) } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_directory_entry(const char* value) { - set_has_directory_entry(); - if (directory_entry_ == &::google::protobuf::internal::kEmptyString) { - directory_entry_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Machine::set_cpu_architecture(const char* value) { + set_has_cpu_architecture(); + if (cpu_architecture_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_architecture_ = new ::std::string; } - directory_entry_->assign(value); + cpu_architecture_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_architecture) } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_directory_entry(const void* value, size_t size) { - set_has_directory_entry(); - if (directory_entry_ == &::google::protobuf::internal::kEmptyString) { - directory_entry_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Machine::set_cpu_architecture(const char* value, size_t size) { + set_has_cpu_architecture(); + if (cpu_architecture_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_architecture_ = new ::std::string; } - directory_entry_->assign(reinterpret_cast(value), size); + cpu_architecture_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_architecture) } -inline ::std::string* ClientDownloadRequest_PEImageHeaders_DebugData::mutable_directory_entry() { - set_has_directory_entry(); - if (directory_entry_ == &::google::protobuf::internal::kEmptyString) { - directory_entry_ = new ::std::string; +inline ::std::string* ClientIncidentReport_EnvironmentData_Machine::mutable_cpu_architecture() { + set_has_cpu_architecture(); + if (cpu_architecture_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_architecture_ = new ::std::string; } - return directory_entry_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_architecture) + return cpu_architecture_; } -inline ::std::string* ClientDownloadRequest_PEImageHeaders_DebugData::release_directory_entry() { - clear_has_directory_entry(); - if (directory_entry_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_EnvironmentData_Machine::release_cpu_architecture() { + clear_has_cpu_architecture(); + if (cpu_architecture_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = directory_entry_; - directory_entry_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = cpu_architecture_; + cpu_architecture_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_EnvironmentData_Machine::set_allocated_cpu_architecture(::std::string* cpu_architecture) { + if (cpu_architecture_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete cpu_architecture_; + } + if (cpu_architecture) { + set_has_cpu_architecture(); + cpu_architecture_ = cpu_architecture; + } else { + clear_has_cpu_architecture(); + cpu_architecture_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_architecture) +} -// optional bytes raw_data = 2; -inline bool ClientDownloadRequest_PEImageHeaders_DebugData::has_raw_data() const { +// optional string cpu_vendor = 2; +inline bool ClientIncidentReport_EnvironmentData_Machine::has_cpu_vendor() const { return (_has_bits_[0] & 0x00000002u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_has_raw_data() { +inline void ClientIncidentReport_EnvironmentData_Machine::set_has_cpu_vendor() { _has_bits_[0] |= 0x00000002u; } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::clear_has_raw_data() { +inline void ClientIncidentReport_EnvironmentData_Machine::clear_has_cpu_vendor() { _has_bits_[0] &= ~0x00000002u; } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::clear_raw_data() { - if (raw_data_ != &::google::protobuf::internal::kEmptyString) { - raw_data_->clear(); +inline void ClientIncidentReport_EnvironmentData_Machine::clear_cpu_vendor() { + if (cpu_vendor_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_vendor_->clear(); } - clear_has_raw_data(); + clear_has_cpu_vendor(); } -inline const ::std::string& ClientDownloadRequest_PEImageHeaders_DebugData::raw_data() const { - return *raw_data_; +inline const ::std::string& ClientIncidentReport_EnvironmentData_Machine::cpu_vendor() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_vendor) + return *cpu_vendor_; } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_raw_data(const ::std::string& value) { - set_has_raw_data(); - if (raw_data_ == &::google::protobuf::internal::kEmptyString) { - raw_data_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Machine::set_cpu_vendor(const ::std::string& value) { + set_has_cpu_vendor(); + if (cpu_vendor_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_vendor_ = new ::std::string; } - raw_data_->assign(value); + cpu_vendor_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_vendor) } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_raw_data(const char* value) { - set_has_raw_data(); - if (raw_data_ == &::google::protobuf::internal::kEmptyString) { - raw_data_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Machine::set_cpu_vendor(const char* value) { + set_has_cpu_vendor(); + if (cpu_vendor_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_vendor_ = new ::std::string; } - raw_data_->assign(value); + cpu_vendor_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_vendor) } -inline void ClientDownloadRequest_PEImageHeaders_DebugData::set_raw_data(const void* value, size_t size) { - set_has_raw_data(); - if (raw_data_ == &::google::protobuf::internal::kEmptyString) { - raw_data_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Machine::set_cpu_vendor(const char* value, size_t size) { + set_has_cpu_vendor(); + if (cpu_vendor_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_vendor_ = new ::std::string; } - raw_data_->assign(reinterpret_cast(value), size); + cpu_vendor_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_vendor) } -inline ::std::string* ClientDownloadRequest_PEImageHeaders_DebugData::mutable_raw_data() { - set_has_raw_data(); - if (raw_data_ == &::google::protobuf::internal::kEmptyString) { - raw_data_ = new ::std::string; +inline ::std::string* ClientIncidentReport_EnvironmentData_Machine::mutable_cpu_vendor() { + set_has_cpu_vendor(); + if (cpu_vendor_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + cpu_vendor_ = new ::std::string; } - return raw_data_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_vendor) + return cpu_vendor_; } -inline ::std::string* ClientDownloadRequest_PEImageHeaders_DebugData::release_raw_data() { - clear_has_raw_data(); - if (raw_data_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_EnvironmentData_Machine::release_cpu_vendor() { + clear_has_cpu_vendor(); + if (cpu_vendor_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = raw_data_; - raw_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = cpu_vendor_; + cpu_vendor_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_EnvironmentData_Machine::set_allocated_cpu_vendor(::std::string* cpu_vendor) { + if (cpu_vendor_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete cpu_vendor_; + } + if (cpu_vendor) { + set_has_cpu_vendor(); + cpu_vendor_ = cpu_vendor; + } else { + clear_has_cpu_vendor(); + cpu_vendor_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpu_vendor) +} + +// optional uint32 cpuid = 3; +inline bool ClientIncidentReport_EnvironmentData_Machine::has_cpuid() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ClientIncidentReport_EnvironmentData_Machine::set_has_cpuid() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientIncidentReport_EnvironmentData_Machine::clear_has_cpuid() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientIncidentReport_EnvironmentData_Machine::clear_cpuid() { + cpuid_ = 0u; + clear_has_cpuid(); +} +inline ::google::protobuf::uint32 ClientIncidentReport_EnvironmentData_Machine::cpuid() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpuid) + return cpuid_; +} +inline void ClientIncidentReport_EnvironmentData_Machine::set_cpuid(::google::protobuf::uint32 value) { + set_has_cpuid(); + cpuid_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Machine.cpuid) +} // ------------------------------------------------------------------- -// ClientDownloadRequest_PEImageHeaders +// ClientIncidentReport_EnvironmentData_Process_Patch -// optional bytes dos_header = 1; -inline bool ClientDownloadRequest_PEImageHeaders::has_dos_header() const { +// optional string function = 1; +inline bool ClientIncidentReport_EnvironmentData_Process_Patch::has_function() const { return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders::set_has_dos_header() { +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_has_function() { _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_has_dos_header() { +inline void ClientIncidentReport_EnvironmentData_Process_Patch::clear_has_function() { _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_dos_header() { - if (dos_header_ != &::google::protobuf::internal::kEmptyString) { - dos_header_->clear(); +inline void ClientIncidentReport_EnvironmentData_Process_Patch::clear_function() { + if (function_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + function_->clear(); } - clear_has_dos_header(); + clear_has_function(); } -inline const ::std::string& ClientDownloadRequest_PEImageHeaders::dos_header() const { - return *dos_header_; +inline const ::std::string& ClientIncidentReport_EnvironmentData_Process_Patch::function() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.function) + return *function_; } -inline void ClientDownloadRequest_PEImageHeaders::set_dos_header(const ::std::string& value) { - set_has_dos_header(); - if (dos_header_ == &::google::protobuf::internal::kEmptyString) { - dos_header_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_function(const ::std::string& value) { + set_has_function(); + if (function_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + function_ = new ::std::string; } - dos_header_->assign(value); + function_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.function) } -inline void ClientDownloadRequest_PEImageHeaders::set_dos_header(const char* value) { - set_has_dos_header(); - if (dos_header_ == &::google::protobuf::internal::kEmptyString) { - dos_header_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_function(const char* value) { + set_has_function(); + if (function_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + function_ = new ::std::string; } - dos_header_->assign(value); + function_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.function) } -inline void ClientDownloadRequest_PEImageHeaders::set_dos_header(const void* value, size_t size) { - set_has_dos_header(); - if (dos_header_ == &::google::protobuf::internal::kEmptyString) { - dos_header_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_function(const char* value, size_t size) { + set_has_function(); + if (function_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + function_ = new ::std::string; } - dos_header_->assign(reinterpret_cast(value), size); + function_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.function) } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_dos_header() { - set_has_dos_header(); - if (dos_header_ == &::google::protobuf::internal::kEmptyString) { - dos_header_ = new ::std::string; +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_Patch::mutable_function() { + set_has_function(); + if (function_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + function_ = new ::std::string; } - return dos_header_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.function) + return function_; } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_dos_header() { - clear_has_dos_header(); - if (dos_header_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_Patch::release_function() { + clear_has_function(); + if (function_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = dos_header_; - dos_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = function_; + function_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_allocated_function(::std::string* function) { + if (function_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete function_; + } + if (function) { + set_has_function(); + function_ = function; + } else { + clear_has_function(); + function_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.function) +} -// optional bytes file_header = 2; -inline bool ClientDownloadRequest_PEImageHeaders::has_file_header() const { +// optional string target_dll = 2; +inline bool ClientIncidentReport_EnvironmentData_Process_Patch::has_target_dll() const { return (_has_bits_[0] & 0x00000002u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders::set_has_file_header() { +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_has_target_dll() { _has_bits_[0] |= 0x00000002u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_has_file_header() { +inline void ClientIncidentReport_EnvironmentData_Process_Patch::clear_has_target_dll() { _has_bits_[0] &= ~0x00000002u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_file_header() { - if (file_header_ != &::google::protobuf::internal::kEmptyString) { - file_header_->clear(); +inline void ClientIncidentReport_EnvironmentData_Process_Patch::clear_target_dll() { + if (target_dll_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + target_dll_->clear(); } - clear_has_file_header(); + clear_has_target_dll(); } -inline const ::std::string& ClientDownloadRequest_PEImageHeaders::file_header() const { - return *file_header_; +inline const ::std::string& ClientIncidentReport_EnvironmentData_Process_Patch::target_dll() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.target_dll) + return *target_dll_; } -inline void ClientDownloadRequest_PEImageHeaders::set_file_header(const ::std::string& value) { - set_has_file_header(); - if (file_header_ == &::google::protobuf::internal::kEmptyString) { - file_header_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_target_dll(const ::std::string& value) { + set_has_target_dll(); + if (target_dll_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + target_dll_ = new ::std::string; } - file_header_->assign(value); + target_dll_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.target_dll) } -inline void ClientDownloadRequest_PEImageHeaders::set_file_header(const char* value) { - set_has_file_header(); - if (file_header_ == &::google::protobuf::internal::kEmptyString) { - file_header_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_target_dll(const char* value) { + set_has_target_dll(); + if (target_dll_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + target_dll_ = new ::std::string; } - file_header_->assign(value); + target_dll_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.target_dll) } -inline void ClientDownloadRequest_PEImageHeaders::set_file_header(const void* value, size_t size) { - set_has_file_header(); - if (file_header_ == &::google::protobuf::internal::kEmptyString) { - file_header_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_target_dll(const char* value, size_t size) { + set_has_target_dll(); + if (target_dll_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + target_dll_ = new ::std::string; } - file_header_->assign(reinterpret_cast(value), size); + target_dll_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.target_dll) } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_file_header() { - set_has_file_header(); - if (file_header_ == &::google::protobuf::internal::kEmptyString) { - file_header_ = new ::std::string; +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_Patch::mutable_target_dll() { + set_has_target_dll(); + if (target_dll_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + target_dll_ = new ::std::string; } - return file_header_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.target_dll) + return target_dll_; } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_file_header() { - clear_has_file_header(); - if (file_header_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_Patch::release_target_dll() { + clear_has_target_dll(); + if (target_dll_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = file_header_; - file_header_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = target_dll_; + target_dll_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_EnvironmentData_Process_Patch::set_allocated_target_dll(::std::string* target_dll) { + if (target_dll_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete target_dll_; + } + if (target_dll) { + set_has_target_dll(); + target_dll_ = target_dll; + } else { + clear_has_target_dll(); + target_dll_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch.target_dll) +} -// optional bytes optional_headers32 = 3; -inline bool ClientDownloadRequest_PEImageHeaders::has_optional_headers32() const { - return (_has_bits_[0] & 0x00000004u) != 0; +// ------------------------------------------------------------------- + +// ClientIncidentReport_EnvironmentData_Process_NetworkProvider + +// ------------------------------------------------------------------- + +// ClientIncidentReport_EnvironmentData_Process_Dll + +// optional string path = 1; +inline bool ClientIncidentReport_EnvironmentData_Process_Dll::has_path() const { + return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders::set_has_optional_headers32() { - _has_bits_[0] |= 0x00000004u; +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_has_path() { + _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_has_optional_headers32() { - _has_bits_[0] &= ~0x00000004u; +inline void ClientIncidentReport_EnvironmentData_Process_Dll::clear_has_path() { + _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_optional_headers32() { - if (optional_headers32_ != &::google::protobuf::internal::kEmptyString) { - optional_headers32_->clear(); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::clear_path() { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_->clear(); } - clear_has_optional_headers32(); + clear_has_path(); } -inline const ::std::string& ClientDownloadRequest_PEImageHeaders::optional_headers32() const { - return *optional_headers32_; +inline const ::std::string& ClientIncidentReport_EnvironmentData_Process_Dll::path() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.path) + return *path_; } -inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers32(const ::std::string& value) { - set_has_optional_headers32(); - if (optional_headers32_ == &::google::protobuf::internal::kEmptyString) { - optional_headers32_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_path(const ::std::string& value) { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; } - optional_headers32_->assign(value); + path_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.path) } -inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers32(const char* value) { - set_has_optional_headers32(); - if (optional_headers32_ == &::google::protobuf::internal::kEmptyString) { - optional_headers32_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_path(const char* value) { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; } - optional_headers32_->assign(value); + path_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.path) } -inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers32(const void* value, size_t size) { - set_has_optional_headers32(); - if (optional_headers32_ == &::google::protobuf::internal::kEmptyString) { - optional_headers32_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_path(const char* value, size_t size) { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; } - optional_headers32_->assign(reinterpret_cast(value), size); + path_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.path) } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_optional_headers32() { - set_has_optional_headers32(); - if (optional_headers32_ == &::google::protobuf::internal::kEmptyString) { - optional_headers32_ = new ::std::string; +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_Dll::mutable_path() { + set_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + path_ = new ::std::string; } - return optional_headers32_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.path) + return path_; } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_optional_headers32() { - clear_has_optional_headers32(); - if (optional_headers32_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_Dll::release_path() { + clear_has_path(); + if (path_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = optional_headers32_; - optional_headers32_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = path_; + path_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_allocated_path(::std::string* path) { + if (path_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete path_; + } + if (path) { + set_has_path(); + path_ = path; + } else { + clear_has_path(); + path_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.path) +} -// optional bytes optional_headers64 = 4; -inline bool ClientDownloadRequest_PEImageHeaders::has_optional_headers64() const { - return (_has_bits_[0] & 0x00000008u) != 0; +// optional uint64 base_address = 2; +inline bool ClientIncidentReport_EnvironmentData_Process_Dll::has_base_address() const { + return (_has_bits_[0] & 0x00000002u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders::set_has_optional_headers64() { - _has_bits_[0] |= 0x00000008u; +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_has_base_address() { + _has_bits_[0] |= 0x00000002u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_has_optional_headers64() { - _has_bits_[0] &= ~0x00000008u; +inline void ClientIncidentReport_EnvironmentData_Process_Dll::clear_has_base_address() { + _has_bits_[0] &= ~0x00000002u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_optional_headers64() { - if (optional_headers64_ != &::google::protobuf::internal::kEmptyString) { - optional_headers64_->clear(); - } - clear_has_optional_headers64(); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::clear_base_address() { + base_address_ = GOOGLE_ULONGLONG(0); + clear_has_base_address(); } -inline const ::std::string& ClientDownloadRequest_PEImageHeaders::optional_headers64() const { - return *optional_headers64_; +inline ::google::protobuf::uint64 ClientIncidentReport_EnvironmentData_Process_Dll::base_address() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.base_address) + return base_address_; } -inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers64(const ::std::string& value) { - set_has_optional_headers64(); - if (optional_headers64_ == &::google::protobuf::internal::kEmptyString) { - optional_headers64_ = new ::std::string; - } - optional_headers64_->assign(value); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_base_address(::google::protobuf::uint64 value) { + set_has_base_address(); + base_address_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.base_address) } -inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers64(const char* value) { - set_has_optional_headers64(); - if (optional_headers64_ == &::google::protobuf::internal::kEmptyString) { - optional_headers64_ = new ::std::string; - } - optional_headers64_->assign(value); + +// optional uint32 length = 3; +inline bool ClientIncidentReport_EnvironmentData_Process_Dll::has_length() const { + return (_has_bits_[0] & 0x00000004u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders::set_optional_headers64(const void* value, size_t size) { - set_has_optional_headers64(); - if (optional_headers64_ == &::google::protobuf::internal::kEmptyString) { - optional_headers64_ = new ::std::string; - } - optional_headers64_->assign(reinterpret_cast(value), size); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_has_length() { + _has_bits_[0] |= 0x00000004u; } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_optional_headers64() { - set_has_optional_headers64(); - if (optional_headers64_ == &::google::protobuf::internal::kEmptyString) { - optional_headers64_ = new ::std::string; - } - return optional_headers64_; +inline void ClientIncidentReport_EnvironmentData_Process_Dll::clear_has_length() { + _has_bits_[0] &= ~0x00000004u; } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_optional_headers64() { - clear_has_optional_headers64(); - if (optional_headers64_ == &::google::protobuf::internal::kEmptyString) { - return NULL; - } else { - ::std::string* temp = optional_headers64_; - optional_headers64_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; - } +inline void ClientIncidentReport_EnvironmentData_Process_Dll::clear_length() { + length_ = 0u; + clear_has_length(); +} +inline ::google::protobuf::uint32 ClientIncidentReport_EnvironmentData_Process_Dll::length() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.length) + return length_; +} +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_length(::google::protobuf::uint32 value) { + set_has_length(); + length_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.length) } -// repeated bytes section_header = 5; -inline int ClientDownloadRequest_PEImageHeaders::section_header_size() const { - return section_header_.size(); +// repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.Feature feature = 4; +inline int ClientIncidentReport_EnvironmentData_Process_Dll::feature_size() const { + return feature_.size(); } -inline void ClientDownloadRequest_PEImageHeaders::clear_section_header() { - section_header_.Clear(); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::clear_feature() { + feature_.Clear(); } -inline const ::std::string& ClientDownloadRequest_PEImageHeaders::section_header(int index) const { - return section_header_.Get(index); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature ClientIncidentReport_EnvironmentData_Process_Dll::feature(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.feature) + return static_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature >(feature_.Get(index)); } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_section_header(int index) { - return section_header_.Mutable(index); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_feature(int index, ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature value) { + assert(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature_IsValid(value)); + feature_.Set(index, value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.feature) } -inline void ClientDownloadRequest_PEImageHeaders::set_section_header(int index, const ::std::string& value) { - section_header_.Mutable(index)->assign(value); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::add_feature(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature value) { + assert(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll_Feature_IsValid(value)); + feature_.Add(value); + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.feature) } -inline void ClientDownloadRequest_PEImageHeaders::set_section_header(int index, const char* value) { - section_header_.Mutable(index)->assign(value); +inline const ::google::protobuf::RepeatedField& +ClientIncidentReport_EnvironmentData_Process_Dll::feature() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.feature) + return feature_; } -inline void ClientDownloadRequest_PEImageHeaders::set_section_header(int index, const void* value, size_t size) { - section_header_.Mutable(index)->assign( - reinterpret_cast(value), size); +inline ::google::protobuf::RepeatedField* +ClientIncidentReport_EnvironmentData_Process_Dll::mutable_feature() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.feature) + return &feature_; } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::add_section_header() { - return section_header_.Add(); + +// optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 5; +inline bool ClientIncidentReport_EnvironmentData_Process_Dll::has_image_headers() const { + return (_has_bits_[0] & 0x00000010u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders::add_section_header(const ::std::string& value) { - section_header_.Add()->assign(value); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_has_image_headers() { + _has_bits_[0] |= 0x00000010u; } -inline void ClientDownloadRequest_PEImageHeaders::add_section_header(const char* value) { - section_header_.Add()->assign(value); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::clear_has_image_headers() { + _has_bits_[0] &= ~0x00000010u; } -inline void ClientDownloadRequest_PEImageHeaders::add_section_header(const void* value, size_t size) { - section_header_.Add()->assign(reinterpret_cast(value), size); +inline void ClientIncidentReport_EnvironmentData_Process_Dll::clear_image_headers() { + if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); + clear_has_image_headers(); } -inline const ::google::protobuf::RepeatedPtrField< ::std::string>& -ClientDownloadRequest_PEImageHeaders::section_header() const { - return section_header_; +inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& ClientIncidentReport_EnvironmentData_Process_Dll::image_headers() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.image_headers) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return image_headers_ != NULL ? *image_headers_ : *default_instance().image_headers_; +#else + return image_headers_ != NULL ? *image_headers_ : *default_instance_->image_headers_; +#endif } -inline ::google::protobuf::RepeatedPtrField< ::std::string>* -ClientDownloadRequest_PEImageHeaders::mutable_section_header() { - return §ion_header_; +inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientIncidentReport_EnvironmentData_Process_Dll::mutable_image_headers() { + set_has_image_headers(); + if (image_headers_ == NULL) image_headers_ = new ::safe_browsing::ClientDownloadRequest_ImageHeaders; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.image_headers) + return image_headers_; +} +inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientIncidentReport_EnvironmentData_Process_Dll::release_image_headers() { + clear_has_image_headers(); + ::safe_browsing::ClientDownloadRequest_ImageHeaders* temp = image_headers_; + image_headers_ = NULL; + return temp; +} +inline void ClientIncidentReport_EnvironmentData_Process_Dll::set_allocated_image_headers(::safe_browsing::ClientDownloadRequest_ImageHeaders* image_headers) { + delete image_headers_; + image_headers_ = image_headers; + if (image_headers) { + set_has_image_headers(); + } else { + clear_has_image_headers(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll.image_headers) } -// optional bytes export_section_data = 6; -inline bool ClientDownloadRequest_PEImageHeaders::has_export_section_data() const { - return (_has_bits_[0] & 0x00000020u) != 0; +// ------------------------------------------------------------------- + +// ClientIncidentReport_EnvironmentData_Process_ModuleState + +// optional string name = 1; +inline bool ClientIncidentReport_EnvironmentData_Process_ModuleState::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders::set_has_export_section_data() { - _has_bits_[0] |= 0x00000020u; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_has_name() { + _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_has_export_section_data() { - _has_bits_[0] &= ~0x00000020u; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadRequest_PEImageHeaders::clear_export_section_data() { - if (export_section_data_ != &::google::protobuf::internal::kEmptyString) { - export_section_data_->clear(); +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); } - clear_has_export_section_data(); + clear_has_name(); } -inline const ::std::string& ClientDownloadRequest_PEImageHeaders::export_section_data() const { - return *export_section_data_; +inline const ::std::string& ClientIncidentReport_EnvironmentData_Process_ModuleState::name() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.name) + return *name_; } -inline void ClientDownloadRequest_PEImageHeaders::set_export_section_data(const ::std::string& value) { - set_has_export_section_data(); - if (export_section_data_ == &::google::protobuf::internal::kEmptyString) { - export_section_data_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; } - export_section_data_->assign(value); + name_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.name) } -inline void ClientDownloadRequest_PEImageHeaders::set_export_section_data(const char* value) { - set_has_export_section_data(); - if (export_section_data_ == &::google::protobuf::internal::kEmptyString) { - export_section_data_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; } - export_section_data_->assign(value); + name_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.name) } -inline void ClientDownloadRequest_PEImageHeaders::set_export_section_data(const void* value, size_t size) { - set_has_export_section_data(); - if (export_section_data_ == &::google::protobuf::internal::kEmptyString) { - export_section_data_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; } - export_section_data_->assign(reinterpret_cast(value), size); + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.name) } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::mutable_export_section_data() { - set_has_export_section_data(); - if (export_section_data_ == &::google::protobuf::internal::kEmptyString) { - export_section_data_ = new ::std::string; +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_ModuleState::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; } - return export_section_data_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.name) + return name_; } -inline ::std::string* ClientDownloadRequest_PEImageHeaders::release_export_section_data() { - clear_has_export_section_data(); - if (export_section_data_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_ModuleState::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = export_section_data_; - export_section_data_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.name) +} -// repeated .safe_browsing.ClientDownloadRequest.PEImageHeaders.DebugData debug_data = 7; -inline int ClientDownloadRequest_PEImageHeaders::debug_data_size() const { - return debug_data_.size(); +// optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.ModifiedState modified_state = 2; +inline bool ClientIncidentReport_EnvironmentData_Process_ModuleState::has_modified_state() const { + return (_has_bits_[0] & 0x00000002u) != 0; } -inline void ClientDownloadRequest_PEImageHeaders::clear_debug_data() { - debug_data_.Clear(); +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_has_modified_state() { + _has_bits_[0] |= 0x00000002u; } -inline const ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData& ClientDownloadRequest_PEImageHeaders::debug_data(int index) const { - return debug_data_.Get(index); +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::clear_has_modified_state() { + _has_bits_[0] &= ~0x00000002u; } -inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData* ClientDownloadRequest_PEImageHeaders::mutable_debug_data(int index) { - return debug_data_.Mutable(index); +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::clear_modified_state() { + modified_state_ = 0; + clear_has_modified_state(); +} +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState ClientIncidentReport_EnvironmentData_Process_ModuleState::modified_state() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_state) + return static_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState >(modified_state_); +} +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_modified_state(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState value) { + assert(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState_ModifiedState_IsValid(value)); + set_has_modified_state(); + modified_state_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_state) +} + +// repeated string modified_export = 3; +inline int ClientIncidentReport_EnvironmentData_Process_ModuleState::modified_export_size() const { + return modified_export_.size(); +} +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::clear_modified_export() { + modified_export_.Clear(); } -inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData* ClientDownloadRequest_PEImageHeaders::add_debug_data() { - return debug_data_.Add(); +inline const ::std::string& ClientIncidentReport_EnvironmentData_Process_ModuleState::modified_export(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) + return modified_export_.Get(index); } -inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData >& -ClientDownloadRequest_PEImageHeaders::debug_data() const { - return debug_data_; +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_ModuleState::mutable_modified_export(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) + return modified_export_.Mutable(index); } -inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_PEImageHeaders_DebugData >* -ClientDownloadRequest_PEImageHeaders::mutable_debug_data() { - return &debug_data_; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_modified_export(int index, const ::std::string& value) { + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) + modified_export_.Mutable(index)->assign(value); } - -// ------------------------------------------------------------------- - -// ClientDownloadRequest_ImageHeaders - -// optional .safe_browsing.ClientDownloadRequest.PEImageHeaders pe_headers = 1; -inline bool ClientDownloadRequest_ImageHeaders::has_pe_headers() const { - return (_has_bits_[0] & 0x00000001u) != 0; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_modified_export(int index, const char* value) { + modified_export_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) } -inline void ClientDownloadRequest_ImageHeaders::set_has_pe_headers() { - _has_bits_[0] |= 0x00000001u; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::set_modified_export(int index, const char* value, size_t size) { + modified_export_.Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) } -inline void ClientDownloadRequest_ImageHeaders::clear_has_pe_headers() { - _has_bits_[0] &= ~0x00000001u; +inline ::std::string* ClientIncidentReport_EnvironmentData_Process_ModuleState::add_modified_export() { + return modified_export_.Add(); } -inline void ClientDownloadRequest_ImageHeaders::clear_pe_headers() { - if (pe_headers_ != NULL) pe_headers_->::safe_browsing::ClientDownloadRequest_PEImageHeaders::Clear(); - clear_has_pe_headers(); +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::add_modified_export(const ::std::string& value) { + modified_export_.Add()->assign(value); + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) } -inline const ::safe_browsing::ClientDownloadRequest_PEImageHeaders& ClientDownloadRequest_ImageHeaders::pe_headers() const { - return pe_headers_ != NULL ? *pe_headers_ : *default_instance_->pe_headers_; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::add_modified_export(const char* value) { + modified_export_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) } -inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders* ClientDownloadRequest_ImageHeaders::mutable_pe_headers() { - set_has_pe_headers(); - if (pe_headers_ == NULL) pe_headers_ = new ::safe_browsing::ClientDownloadRequest_PEImageHeaders; - return pe_headers_; +inline void ClientIncidentReport_EnvironmentData_Process_ModuleState::add_modified_export(const char* value, size_t size) { + modified_export_.Add()->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) } -inline ::safe_browsing::ClientDownloadRequest_PEImageHeaders* ClientDownloadRequest_ImageHeaders::release_pe_headers() { - clear_has_pe_headers(); - ::safe_browsing::ClientDownloadRequest_PEImageHeaders* temp = pe_headers_; - pe_headers_ = NULL; - return temp; +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +ClientIncidentReport_EnvironmentData_Process_ModuleState::modified_export() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) + return modified_export_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +ClientIncidentReport_EnvironmentData_Process_ModuleState::mutable_modified_export() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState.modified_export) + return &modified_export_; } // ------------------------------------------------------------------- -// ClientDownloadRequest +// ClientIncidentReport_EnvironmentData_Process -// required string url = 1; -inline bool ClientDownloadRequest::has_url() const { +// optional string version = 1; +inline bool ClientIncidentReport_EnvironmentData_Process::has_version() const { return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadRequest::set_has_url() { +inline void ClientIncidentReport_EnvironmentData_Process::set_has_version() { _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadRequest::clear_has_url() { +inline void ClientIncidentReport_EnvironmentData_Process::clear_has_version() { _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadRequest::clear_url() { - if (url_ != &::google::protobuf::internal::kEmptyString) { - url_->clear(); +inline void ClientIncidentReport_EnvironmentData_Process::clear_version() { + if (version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_->clear(); } - clear_has_url(); + clear_has_version(); } -inline const ::std::string& ClientDownloadRequest::url() const { - return *url_; +inline const ::std::string& ClientIncidentReport_EnvironmentData_Process::version() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.version) + return *version_; } -inline void ClientDownloadRequest::set_url(const ::std::string& value) { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process::set_version(const ::std::string& value) { + set_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_ = new ::std::string; } - url_->assign(value); + version_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.version) } -inline void ClientDownloadRequest::set_url(const char* value) { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process::set_version(const char* value) { + set_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_ = new ::std::string; } - url_->assign(value); + version_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.version) } -inline void ClientDownloadRequest::set_url(const char* value, size_t size) { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData_Process::set_version(const char* value, size_t size) { + set_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_ = new ::std::string; } - url_->assign(reinterpret_cast(value), size); + version_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.version) } -inline ::std::string* ClientDownloadRequest::mutable_url() { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; +inline ::std::string* ClientIncidentReport_EnvironmentData_Process::mutable_version() { + set_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + version_ = new ::std::string; } - return url_; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.version) + return version_; } -inline ::std::string* ClientDownloadRequest::release_url() { - clear_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { +inline ::std::string* ClientIncidentReport_EnvironmentData_Process::release_version() { + clear_has_version(); + if (version_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { - ::std::string* temp = url_; - url_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::std::string* temp = version_; + version_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentReport_EnvironmentData_Process::set_allocated_version(::std::string* version) { + if (version_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete version_; + } + if (version) { + set_has_version(); + version_ = version; + } else { + clear_has_version(); + version_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.Process.version) +} -// required .safe_browsing.ClientDownloadRequest.Digests digests = 2; -inline bool ClientDownloadRequest::has_digests() const { - return (_has_bits_[0] & 0x00000002u) != 0; +// repeated string OBSOLETE_dlls = 2; +inline int ClientIncidentReport_EnvironmentData_Process::obsolete_dlls_size() const { + return obsolete_dlls_.size(); } -inline void ClientDownloadRequest::set_has_digests() { - _has_bits_[0] |= 0x00000002u; +inline void ClientIncidentReport_EnvironmentData_Process::clear_obsolete_dlls() { + obsolete_dlls_.Clear(); } -inline void ClientDownloadRequest::clear_has_digests() { - _has_bits_[0] &= ~0x00000002u; +inline const ::std::string& ClientIncidentReport_EnvironmentData_Process::obsolete_dlls(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) + return obsolete_dlls_.Get(index); } -inline void ClientDownloadRequest::clear_digests() { - if (digests_ != NULL) digests_->::safe_browsing::ClientDownloadRequest_Digests::Clear(); - clear_has_digests(); +inline ::std::string* ClientIncidentReport_EnvironmentData_Process::mutable_obsolete_dlls(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) + return obsolete_dlls_.Mutable(index); } -inline const ::safe_browsing::ClientDownloadRequest_Digests& ClientDownloadRequest::digests() const { - return digests_ != NULL ? *digests_ : *default_instance_->digests_; +inline void ClientIncidentReport_EnvironmentData_Process::set_obsolete_dlls(int index, const ::std::string& value) { + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) + obsolete_dlls_.Mutable(index)->assign(value); } -inline ::safe_browsing::ClientDownloadRequest_Digests* ClientDownloadRequest::mutable_digests() { - set_has_digests(); - if (digests_ == NULL) digests_ = new ::safe_browsing::ClientDownloadRequest_Digests; - return digests_; +inline void ClientIncidentReport_EnvironmentData_Process::set_obsolete_dlls(int index, const char* value) { + obsolete_dlls_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) } -inline ::safe_browsing::ClientDownloadRequest_Digests* ClientDownloadRequest::release_digests() { - clear_has_digests(); - ::safe_browsing::ClientDownloadRequest_Digests* temp = digests_; - digests_ = NULL; - return temp; +inline void ClientIncidentReport_EnvironmentData_Process::set_obsolete_dlls(int index, const char* value, size_t size) { + obsolete_dlls_.Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) +} +inline ::std::string* ClientIncidentReport_EnvironmentData_Process::add_obsolete_dlls() { + return obsolete_dlls_.Add(); +} +inline void ClientIncidentReport_EnvironmentData_Process::add_obsolete_dlls(const ::std::string& value) { + obsolete_dlls_.Add()->assign(value); + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) +} +inline void ClientIncidentReport_EnvironmentData_Process::add_obsolete_dlls(const char* value) { + obsolete_dlls_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) +} +inline void ClientIncidentReport_EnvironmentData_Process::add_obsolete_dlls(const char* value, size_t size) { + obsolete_dlls_.Add()->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +ClientIncidentReport_EnvironmentData_Process::obsolete_dlls() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) + return obsolete_dlls_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +ClientIncidentReport_EnvironmentData_Process::mutable_obsolete_dlls() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.OBSOLETE_dlls) + return &obsolete_dlls_; } -// required int64 length = 3; -inline bool ClientDownloadRequest::has_length() const { - return (_has_bits_[0] & 0x00000004u) != 0; +// repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Patch patches = 3; +inline int ClientIncidentReport_EnvironmentData_Process::patches_size() const { + return patches_.size(); } -inline void ClientDownloadRequest::set_has_length() { - _has_bits_[0] |= 0x00000004u; +inline void ClientIncidentReport_EnvironmentData_Process::clear_patches() { + patches_.Clear(); } -inline void ClientDownloadRequest::clear_has_length() { - _has_bits_[0] &= ~0x00000004u; +inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch& ClientIncidentReport_EnvironmentData_Process::patches(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.patches) + return patches_.Get(index); } -inline void ClientDownloadRequest::clear_length() { - length_ = GOOGLE_LONGLONG(0); - clear_has_length(); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch* ClientIncidentReport_EnvironmentData_Process::mutable_patches(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.patches) + return patches_.Mutable(index); } -inline ::google::protobuf::int64 ClientDownloadRequest::length() const { - return length_; +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch* ClientIncidentReport_EnvironmentData_Process::add_patches() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.EnvironmentData.Process.patches) + return patches_.Add(); } -inline void ClientDownloadRequest::set_length(::google::protobuf::int64 value) { - set_has_length(); - length_ = value; +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch >& +ClientIncidentReport_EnvironmentData_Process::patches() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.patches) + return patches_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Patch >* +ClientIncidentReport_EnvironmentData_Process::mutable_patches() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.patches) + return &patches_; } -// repeated .safe_browsing.ClientDownloadRequest.Resource resources = 4; -inline int ClientDownloadRequest::resources_size() const { - return resources_.size(); +// repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.NetworkProvider network_providers = 4; +inline int ClientIncidentReport_EnvironmentData_Process::network_providers_size() const { + return network_providers_.size(); } -inline void ClientDownloadRequest::clear_resources() { - resources_.Clear(); +inline void ClientIncidentReport_EnvironmentData_Process::clear_network_providers() { + network_providers_.Clear(); } -inline const ::safe_browsing::ClientDownloadRequest_Resource& ClientDownloadRequest::resources(int index) const { - return resources_.Get(index); +inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider& ClientIncidentReport_EnvironmentData_Process::network_providers(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.network_providers) + return network_providers_.Get(index); } -inline ::safe_browsing::ClientDownloadRequest_Resource* ClientDownloadRequest::mutable_resources(int index) { - return resources_.Mutable(index); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider* ClientIncidentReport_EnvironmentData_Process::mutable_network_providers(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.network_providers) + return network_providers_.Mutable(index); } -inline ::safe_browsing::ClientDownloadRequest_Resource* ClientDownloadRequest::add_resources() { - return resources_.Add(); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider* ClientIncidentReport_EnvironmentData_Process::add_network_providers() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.EnvironmentData.Process.network_providers) + return network_providers_.Add(); } -inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource >& -ClientDownloadRequest::resources() const { - return resources_; +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider >& +ClientIncidentReport_EnvironmentData_Process::network_providers() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.network_providers) + return network_providers_; } -inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientDownloadRequest_Resource >* -ClientDownloadRequest::mutable_resources() { - return &resources_; +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_NetworkProvider >* +ClientIncidentReport_EnvironmentData_Process::mutable_network_providers() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.network_providers) + return &network_providers_; } -// optional .safe_browsing.ClientDownloadRequest.SignatureInfo signature = 5; -inline bool ClientDownloadRequest::has_signature() const { +// optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Channel chrome_update_channel = 5; +inline bool ClientIncidentReport_EnvironmentData_Process::has_chrome_update_channel() const { return (_has_bits_[0] & 0x00000010u) != 0; } -inline void ClientDownloadRequest::set_has_signature() { +inline void ClientIncidentReport_EnvironmentData_Process::set_has_chrome_update_channel() { _has_bits_[0] |= 0x00000010u; } -inline void ClientDownloadRequest::clear_has_signature() { +inline void ClientIncidentReport_EnvironmentData_Process::clear_has_chrome_update_channel() { _has_bits_[0] &= ~0x00000010u; } -inline void ClientDownloadRequest::clear_signature() { - if (signature_ != NULL) signature_->::safe_browsing::ClientDownloadRequest_SignatureInfo::Clear(); - clear_has_signature(); -} -inline const ::safe_browsing::ClientDownloadRequest_SignatureInfo& ClientDownloadRequest::signature() const { - return signature_ != NULL ? *signature_ : *default_instance_->signature_; +inline void ClientIncidentReport_EnvironmentData_Process::clear_chrome_update_channel() { + chrome_update_channel_ = 0; + clear_has_chrome_update_channel(); } -inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientDownloadRequest::mutable_signature() { - set_has_signature(); - if (signature_ == NULL) signature_ = new ::safe_browsing::ClientDownloadRequest_SignatureInfo; - return signature_; +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Channel ClientIncidentReport_EnvironmentData_Process::chrome_update_channel() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.chrome_update_channel) + return static_cast< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Channel >(chrome_update_channel_); } -inline ::safe_browsing::ClientDownloadRequest_SignatureInfo* ClientDownloadRequest::release_signature() { - clear_has_signature(); - ::safe_browsing::ClientDownloadRequest_SignatureInfo* temp = signature_; - signature_ = NULL; - return temp; +inline void ClientIncidentReport_EnvironmentData_Process::set_chrome_update_channel(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Channel value) { + assert(::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Channel_IsValid(value)); + set_has_chrome_update_channel(); + chrome_update_channel_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.chrome_update_channel) } -// optional bool user_initiated = 6; -inline bool ClientDownloadRequest::has_user_initiated() const { +// optional int64 uptime_msec = 6; +inline bool ClientIncidentReport_EnvironmentData_Process::has_uptime_msec() const { return (_has_bits_[0] & 0x00000020u) != 0; } -inline void ClientDownloadRequest::set_has_user_initiated() { +inline void ClientIncidentReport_EnvironmentData_Process::set_has_uptime_msec() { _has_bits_[0] |= 0x00000020u; } -inline void ClientDownloadRequest::clear_has_user_initiated() { +inline void ClientIncidentReport_EnvironmentData_Process::clear_has_uptime_msec() { _has_bits_[0] &= ~0x00000020u; } -inline void ClientDownloadRequest::clear_user_initiated() { - user_initiated_ = false; - clear_has_user_initiated(); +inline void ClientIncidentReport_EnvironmentData_Process::clear_uptime_msec() { + uptime_msec_ = GOOGLE_LONGLONG(0); + clear_has_uptime_msec(); } -inline bool ClientDownloadRequest::user_initiated() const { - return user_initiated_; +inline ::google::protobuf::int64 ClientIncidentReport_EnvironmentData_Process::uptime_msec() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.uptime_msec) + return uptime_msec_; } -inline void ClientDownloadRequest::set_user_initiated(bool value) { - set_has_user_initiated(); - user_initiated_ = value; +inline void ClientIncidentReport_EnvironmentData_Process::set_uptime_msec(::google::protobuf::int64 value) { + set_has_uptime_msec(); + uptime_msec_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.uptime_msec) } -// optional string file_basename = 9; -inline bool ClientDownloadRequest::has_file_basename() const { +// optional bool metrics_consent = 7; +inline bool ClientIncidentReport_EnvironmentData_Process::has_metrics_consent() const { return (_has_bits_[0] & 0x00000040u) != 0; } -inline void ClientDownloadRequest::set_has_file_basename() { +inline void ClientIncidentReport_EnvironmentData_Process::set_has_metrics_consent() { _has_bits_[0] |= 0x00000040u; } -inline void ClientDownloadRequest::clear_has_file_basename() { +inline void ClientIncidentReport_EnvironmentData_Process::clear_has_metrics_consent() { _has_bits_[0] &= ~0x00000040u; } -inline void ClientDownloadRequest::clear_file_basename() { - if (file_basename_ != &::google::protobuf::internal::kEmptyString) { - file_basename_->clear(); - } - clear_has_file_basename(); +inline void ClientIncidentReport_EnvironmentData_Process::clear_metrics_consent() { + metrics_consent_ = false; + clear_has_metrics_consent(); } -inline const ::std::string& ClientDownloadRequest::file_basename() const { - return *file_basename_; +inline bool ClientIncidentReport_EnvironmentData_Process::metrics_consent() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.metrics_consent) + return metrics_consent_; } -inline void ClientDownloadRequest::set_file_basename(const ::std::string& value) { - set_has_file_basename(); - if (file_basename_ == &::google::protobuf::internal::kEmptyString) { - file_basename_ = new ::std::string; - } - file_basename_->assign(value); +inline void ClientIncidentReport_EnvironmentData_Process::set_metrics_consent(bool value) { + set_has_metrics_consent(); + metrics_consent_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.metrics_consent) } -inline void ClientDownloadRequest::set_file_basename(const char* value) { - set_has_file_basename(); - if (file_basename_ == &::google::protobuf::internal::kEmptyString) { - file_basename_ = new ::std::string; - } - file_basename_->assign(value); + +// optional bool extended_consent = 8; +inline bool ClientIncidentReport_EnvironmentData_Process::has_extended_consent() const { + return (_has_bits_[0] & 0x00000080u) != 0; } -inline void ClientDownloadRequest::set_file_basename(const char* value, size_t size) { - set_has_file_basename(); - if (file_basename_ == &::google::protobuf::internal::kEmptyString) { - file_basename_ = new ::std::string; - } - file_basename_->assign(reinterpret_cast(value), size); +inline void ClientIncidentReport_EnvironmentData_Process::set_has_extended_consent() { + _has_bits_[0] |= 0x00000080u; } -inline ::std::string* ClientDownloadRequest::mutable_file_basename() { - set_has_file_basename(); - if (file_basename_ == &::google::protobuf::internal::kEmptyString) { - file_basename_ = new ::std::string; - } - return file_basename_; +inline void ClientIncidentReport_EnvironmentData_Process::clear_has_extended_consent() { + _has_bits_[0] &= ~0x00000080u; } -inline ::std::string* ClientDownloadRequest::release_file_basename() { - clear_has_file_basename(); - if (file_basename_ == &::google::protobuf::internal::kEmptyString) { - return NULL; - } else { - ::std::string* temp = file_basename_; - file_basename_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; - } +inline void ClientIncidentReport_EnvironmentData_Process::clear_extended_consent() { + extended_consent_ = false; + clear_has_extended_consent(); +} +inline bool ClientIncidentReport_EnvironmentData_Process::extended_consent() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.extended_consent) + return extended_consent_; +} +inline void ClientIncidentReport_EnvironmentData_Process::set_extended_consent(bool value) { + set_has_extended_consent(); + extended_consent_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.extended_consent) } -// optional .safe_browsing.ClientDownloadRequest.DownloadType download_type = 10 [default = WIN_EXECUTABLE]; -inline bool ClientDownloadRequest::has_download_type() const { - return (_has_bits_[0] & 0x00000080u) != 0; +// repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.Dll dll = 9; +inline int ClientIncidentReport_EnvironmentData_Process::dll_size() const { + return dll_.size(); } -inline void ClientDownloadRequest::set_has_download_type() { - _has_bits_[0] |= 0x00000080u; +inline void ClientIncidentReport_EnvironmentData_Process::clear_dll() { + dll_.Clear(); } -inline void ClientDownloadRequest::clear_has_download_type() { - _has_bits_[0] &= ~0x00000080u; +inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll& ClientIncidentReport_EnvironmentData_Process::dll(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.dll) + return dll_.Get(index); } -inline void ClientDownloadRequest::clear_download_type() { - download_type_ = 0; - clear_has_download_type(); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll* ClientIncidentReport_EnvironmentData_Process::mutable_dll(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.dll) + return dll_.Mutable(index); } -inline ::safe_browsing::ClientDownloadRequest_DownloadType ClientDownloadRequest::download_type() const { - return static_cast< ::safe_browsing::ClientDownloadRequest_DownloadType >(download_type_); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll* ClientIncidentReport_EnvironmentData_Process::add_dll() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.EnvironmentData.Process.dll) + return dll_.Add(); } -inline void ClientDownloadRequest::set_download_type(::safe_browsing::ClientDownloadRequest_DownloadType value) { - GOOGLE_DCHECK(::safe_browsing::ClientDownloadRequest_DownloadType_IsValid(value)); - set_has_download_type(); - download_type_ = value; +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll >& +ClientIncidentReport_EnvironmentData_Process::dll() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.dll) + return dll_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_Dll >* +ClientIncidentReport_EnvironmentData_Process::mutable_dll() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.dll) + return &dll_; } -// optional string locale = 11; -inline bool ClientDownloadRequest::has_locale() const { - return (_has_bits_[0] & 0x00000100u) != 0; +// repeated string blacklisted_dll = 10; +inline int ClientIncidentReport_EnvironmentData_Process::blacklisted_dll_size() const { + return blacklisted_dll_.size(); } -inline void ClientDownloadRequest::set_has_locale() { - _has_bits_[0] |= 0x00000100u; +inline void ClientIncidentReport_EnvironmentData_Process::clear_blacklisted_dll() { + blacklisted_dll_.Clear(); } -inline void ClientDownloadRequest::clear_has_locale() { - _has_bits_[0] &= ~0x00000100u; +inline const ::std::string& ClientIncidentReport_EnvironmentData_Process::blacklisted_dll(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) + return blacklisted_dll_.Get(index); } -inline void ClientDownloadRequest::clear_locale() { - if (locale_ != &::google::protobuf::internal::kEmptyString) { - locale_->clear(); - } - clear_has_locale(); +inline ::std::string* ClientIncidentReport_EnvironmentData_Process::mutable_blacklisted_dll(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) + return blacklisted_dll_.Mutable(index); } -inline const ::std::string& ClientDownloadRequest::locale() const { - return *locale_; +inline void ClientIncidentReport_EnvironmentData_Process::set_blacklisted_dll(int index, const ::std::string& value) { + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) + blacklisted_dll_.Mutable(index)->assign(value); } -inline void ClientDownloadRequest::set_locale(const ::std::string& value) { - set_has_locale(); - if (locale_ == &::google::protobuf::internal::kEmptyString) { - locale_ = new ::std::string; - } - locale_->assign(value); +inline void ClientIncidentReport_EnvironmentData_Process::set_blacklisted_dll(int index, const char* value) { + blacklisted_dll_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) } -inline void ClientDownloadRequest::set_locale(const char* value) { - set_has_locale(); - if (locale_ == &::google::protobuf::internal::kEmptyString) { - locale_ = new ::std::string; - } - locale_->assign(value); +inline void ClientIncidentReport_EnvironmentData_Process::set_blacklisted_dll(int index, const char* value, size_t size) { + blacklisted_dll_.Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) } -inline void ClientDownloadRequest::set_locale(const char* value, size_t size) { - set_has_locale(); - if (locale_ == &::google::protobuf::internal::kEmptyString) { - locale_ = new ::std::string; - } - locale_->assign(reinterpret_cast(value), size); +inline ::std::string* ClientIncidentReport_EnvironmentData_Process::add_blacklisted_dll() { + return blacklisted_dll_.Add(); +} +inline void ClientIncidentReport_EnvironmentData_Process::add_blacklisted_dll(const ::std::string& value) { + blacklisted_dll_.Add()->assign(value); + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) +} +inline void ClientIncidentReport_EnvironmentData_Process::add_blacklisted_dll(const char* value) { + blacklisted_dll_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) +} +inline void ClientIncidentReport_EnvironmentData_Process::add_blacklisted_dll(const char* value, size_t size) { + blacklisted_dll_.Add()->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) } -inline ::std::string* ClientDownloadRequest::mutable_locale() { - set_has_locale(); - if (locale_ == &::google::protobuf::internal::kEmptyString) { - locale_ = new ::std::string; - } - return locale_; +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +ClientIncidentReport_EnvironmentData_Process::blacklisted_dll() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) + return blacklisted_dll_; } -inline ::std::string* ClientDownloadRequest::release_locale() { - clear_has_locale(); - if (locale_ == &::google::protobuf::internal::kEmptyString) { - return NULL; - } else { - ::std::string* temp = locale_; - locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; - } +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +ClientIncidentReport_EnvironmentData_Process::mutable_blacklisted_dll() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.blacklisted_dll) + return &blacklisted_dll_; } -// optional .safe_browsing.ClientDownloadRequest.ImageHeaders image_headers = 18; -inline bool ClientDownloadRequest::has_image_headers() const { - return (_has_bits_[0] & 0x00000200u) != 0; +// repeated .safe_browsing.ClientIncidentReport.EnvironmentData.Process.ModuleState module_state = 11; +inline int ClientIncidentReport_EnvironmentData_Process::module_state_size() const { + return module_state_.size(); } -inline void ClientDownloadRequest::set_has_image_headers() { - _has_bits_[0] |= 0x00000200u; +inline void ClientIncidentReport_EnvironmentData_Process::clear_module_state() { + module_state_.Clear(); } -inline void ClientDownloadRequest::clear_has_image_headers() { - _has_bits_[0] &= ~0x00000200u; +inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState& ClientIncidentReport_EnvironmentData_Process::module_state(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.Process.module_state) + return module_state_.Get(index); } -inline void ClientDownloadRequest::clear_image_headers() { - if (image_headers_ != NULL) image_headers_->::safe_browsing::ClientDownloadRequest_ImageHeaders::Clear(); - clear_has_image_headers(); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState* ClientIncidentReport_EnvironmentData_Process::mutable_module_state(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.Process.module_state) + return module_state_.Mutable(index); } -inline const ::safe_browsing::ClientDownloadRequest_ImageHeaders& ClientDownloadRequest::image_headers() const { - return image_headers_ != NULL ? *image_headers_ : *default_instance_->image_headers_; +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState* ClientIncidentReport_EnvironmentData_Process::add_module_state() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.EnvironmentData.Process.module_state) + return module_state_.Add(); } -inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientDownloadRequest::mutable_image_headers() { - set_has_image_headers(); - if (image_headers_ == NULL) image_headers_ = new ::safe_browsing::ClientDownloadRequest_ImageHeaders; - return image_headers_; +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState >& +ClientIncidentReport_EnvironmentData_Process::module_state() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.module_state) + return module_state_; } -inline ::safe_browsing::ClientDownloadRequest_ImageHeaders* ClientDownloadRequest::release_image_headers() { - clear_has_image_headers(); - ::safe_browsing::ClientDownloadRequest_ImageHeaders* temp = image_headers_; - image_headers_ = NULL; - return temp; +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_EnvironmentData_Process_ModuleState >* +ClientIncidentReport_EnvironmentData_Process::mutable_module_state() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.EnvironmentData.Process.module_state) + return &module_state_; } // ------------------------------------------------------------------- -// ClientDownloadResponse_MoreInfo +// ClientIncidentReport_EnvironmentData -// optional string description = 1; -inline bool ClientDownloadResponse_MoreInfo::has_description() const { +// optional .safe_browsing.ClientIncidentReport.EnvironmentData.OS os = 1; +inline bool ClientIncidentReport_EnvironmentData::has_os() const { return (_has_bits_[0] & 0x00000001u) != 0; } -inline void ClientDownloadResponse_MoreInfo::set_has_description() { +inline void ClientIncidentReport_EnvironmentData::set_has_os() { _has_bits_[0] |= 0x00000001u; } -inline void ClientDownloadResponse_MoreInfo::clear_has_description() { +inline void ClientIncidentReport_EnvironmentData::clear_has_os() { _has_bits_[0] &= ~0x00000001u; } -inline void ClientDownloadResponse_MoreInfo::clear_description() { - if (description_ != &::google::protobuf::internal::kEmptyString) { - description_->clear(); - } - clear_has_description(); -} -inline const ::std::string& ClientDownloadResponse_MoreInfo::description() const { - return *description_; -} -inline void ClientDownloadResponse_MoreInfo::set_description(const ::std::string& value) { - set_has_description(); - if (description_ == &::google::protobuf::internal::kEmptyString) { - description_ = new ::std::string; - } - description_->assign(value); +inline void ClientIncidentReport_EnvironmentData::clear_os() { + if (os_ != NULL) os_->::safe_browsing::ClientIncidentReport_EnvironmentData_OS::Clear(); + clear_has_os(); } -inline void ClientDownloadResponse_MoreInfo::set_description(const char* value) { - set_has_description(); - if (description_ == &::google::protobuf::internal::kEmptyString) { - description_ = new ::std::string; - } - description_->assign(value); +inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_OS& ClientIncidentReport_EnvironmentData::os() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.os) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return os_ != NULL ? *os_ : *default_instance().os_; +#else + return os_ != NULL ? *os_ : *default_instance_->os_; +#endif } -inline void ClientDownloadResponse_MoreInfo::set_description(const char* value, size_t size) { - set_has_description(); - if (description_ == &::google::protobuf::internal::kEmptyString) { - description_ = new ::std::string; - } - description_->assign(reinterpret_cast(value), size); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_OS* ClientIncidentReport_EnvironmentData::mutable_os() { + set_has_os(); + if (os_ == NULL) os_ = new ::safe_browsing::ClientIncidentReport_EnvironmentData_OS; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.os) + return os_; } -inline ::std::string* ClientDownloadResponse_MoreInfo::mutable_description() { - set_has_description(); - if (description_ == &::google::protobuf::internal::kEmptyString) { - description_ = new ::std::string; - } - return description_; +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_OS* ClientIncidentReport_EnvironmentData::release_os() { + clear_has_os(); + ::safe_browsing::ClientIncidentReport_EnvironmentData_OS* temp = os_; + os_ = NULL; + return temp; } -inline ::std::string* ClientDownloadResponse_MoreInfo::release_description() { - clear_has_description(); - if (description_ == &::google::protobuf::internal::kEmptyString) { - return NULL; +inline void ClientIncidentReport_EnvironmentData::set_allocated_os(::safe_browsing::ClientIncidentReport_EnvironmentData_OS* os) { + delete os_; + os_ = os; + if (os) { + set_has_os(); } else { - ::std::string* temp = description_; - description_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; + clear_has_os(); } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.os) } -// optional string url = 2; -inline bool ClientDownloadResponse_MoreInfo::has_url() const { +// optional .safe_browsing.ClientIncidentReport.EnvironmentData.Machine machine = 2; +inline bool ClientIncidentReport_EnvironmentData::has_machine() const { return (_has_bits_[0] & 0x00000002u) != 0; } -inline void ClientDownloadResponse_MoreInfo::set_has_url() { +inline void ClientIncidentReport_EnvironmentData::set_has_machine() { _has_bits_[0] |= 0x00000002u; } -inline void ClientDownloadResponse_MoreInfo::clear_has_url() { +inline void ClientIncidentReport_EnvironmentData::clear_has_machine() { _has_bits_[0] &= ~0x00000002u; } -inline void ClientDownloadResponse_MoreInfo::clear_url() { - if (url_ != &::google::protobuf::internal::kEmptyString) { - url_->clear(); - } - clear_has_url(); +inline void ClientIncidentReport_EnvironmentData::clear_machine() { + if (machine_ != NULL) machine_->::safe_browsing::ClientIncidentReport_EnvironmentData_Machine::Clear(); + clear_has_machine(); } -inline const ::std::string& ClientDownloadResponse_MoreInfo::url() const { - return *url_; +inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine& ClientIncidentReport_EnvironmentData::machine() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.machine) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return machine_ != NULL ? *machine_ : *default_instance().machine_; +#else + return machine_ != NULL ? *machine_ : *default_instance_->machine_; +#endif } -inline void ClientDownloadResponse_MoreInfo::set_url(const ::std::string& value) { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; - } - url_->assign(value); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine* ClientIncidentReport_EnvironmentData::mutable_machine() { + set_has_machine(); + if (machine_ == NULL) machine_ = new ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.machine) + return machine_; } -inline void ClientDownloadResponse_MoreInfo::set_url(const char* value) { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; - } - url_->assign(value); +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine* ClientIncidentReport_EnvironmentData::release_machine() { + clear_has_machine(); + ::safe_browsing::ClientIncidentReport_EnvironmentData_Machine* temp = machine_; + machine_ = NULL; + return temp; } -inline void ClientDownloadResponse_MoreInfo::set_url(const char* value, size_t size) { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; +inline void ClientIncidentReport_EnvironmentData::set_allocated_machine(::safe_browsing::ClientIncidentReport_EnvironmentData_Machine* machine) { + delete machine_; + machine_ = machine; + if (machine) { + set_has_machine(); + } else { + clear_has_machine(); } - url_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.machine) } -inline ::std::string* ClientDownloadResponse_MoreInfo::mutable_url() { - set_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - url_ = new ::std::string; - } - return url_; + +// optional .safe_browsing.ClientIncidentReport.EnvironmentData.Process process = 3; +inline bool ClientIncidentReport_EnvironmentData::has_process() const { + return (_has_bits_[0] & 0x00000004u) != 0; } -inline ::std::string* ClientDownloadResponse_MoreInfo::release_url() { - clear_has_url(); - if (url_ == &::google::protobuf::internal::kEmptyString) { - return NULL; +inline void ClientIncidentReport_EnvironmentData::set_has_process() { + _has_bits_[0] |= 0x00000004u; +} +inline void ClientIncidentReport_EnvironmentData::clear_has_process() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ClientIncidentReport_EnvironmentData::clear_process() { + if (process_ != NULL) process_->::safe_browsing::ClientIncidentReport_EnvironmentData_Process::Clear(); + clear_has_process(); +} +inline const ::safe_browsing::ClientIncidentReport_EnvironmentData_Process& ClientIncidentReport_EnvironmentData::process() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.EnvironmentData.process) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return process_ != NULL ? *process_ : *default_instance().process_; +#else + return process_ != NULL ? *process_ : *default_instance_->process_; +#endif +} +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process* ClientIncidentReport_EnvironmentData::mutable_process() { + set_has_process(); + if (process_ == NULL) process_ = new ::safe_browsing::ClientIncidentReport_EnvironmentData_Process; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.EnvironmentData.process) + return process_; +} +inline ::safe_browsing::ClientIncidentReport_EnvironmentData_Process* ClientIncidentReport_EnvironmentData::release_process() { + clear_has_process(); + ::safe_browsing::ClientIncidentReport_EnvironmentData_Process* temp = process_; + process_ = NULL; + return temp; +} +inline void ClientIncidentReport_EnvironmentData::set_allocated_process(::safe_browsing::ClientIncidentReport_EnvironmentData_Process* process) { + delete process_; + process_ = process; + if (process) { + set_has_process(); } else { - ::std::string* temp = url_; - url_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); - return temp; + clear_has_process(); } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.EnvironmentData.process) } // ------------------------------------------------------------------- -// ClientDownloadResponse +// ClientIncidentReport -// required .safe_browsing.ClientDownloadResponse.Verdict verdict = 1; -inline bool ClientDownloadResponse::has_verdict() const { - return (_has_bits_[0] & 0x00000001u) != 0; +// repeated .safe_browsing.ClientIncidentReport.IncidentData incident = 1; +inline int ClientIncidentReport::incident_size() const { + return incident_.size(); } -inline void ClientDownloadResponse::set_has_verdict() { - _has_bits_[0] |= 0x00000001u; +inline void ClientIncidentReport::clear_incident() { + incident_.Clear(); } -inline void ClientDownloadResponse::clear_has_verdict() { - _has_bits_[0] &= ~0x00000001u; +inline const ::safe_browsing::ClientIncidentReport_IncidentData& ClientIncidentReport::incident(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.incident) + return incident_.Get(index); } -inline void ClientDownloadResponse::clear_verdict() { - verdict_ = 0; - clear_has_verdict(); +inline ::safe_browsing::ClientIncidentReport_IncidentData* ClientIncidentReport::mutable_incident(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.incident) + return incident_.Mutable(index); } -inline ::safe_browsing::ClientDownloadResponse_Verdict ClientDownloadResponse::verdict() const { - return static_cast< ::safe_browsing::ClientDownloadResponse_Verdict >(verdict_); +inline ::safe_browsing::ClientIncidentReport_IncidentData* ClientIncidentReport::add_incident() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentReport.incident) + return incident_.Add(); } -inline void ClientDownloadResponse::set_verdict(::safe_browsing::ClientDownloadResponse_Verdict value) { - GOOGLE_DCHECK(::safe_browsing::ClientDownloadResponse_Verdict_IsValid(value)); - set_has_verdict(); - verdict_ = value; +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_IncidentData >& +ClientIncidentReport::incident() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentReport.incident) + return incident_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentReport_IncidentData >* +ClientIncidentReport::mutable_incident() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentReport.incident) + return &incident_; } -// optional .safe_browsing.ClientDownloadResponse.MoreInfo more_info = 2; -inline bool ClientDownloadResponse::has_more_info() const { +// optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; +inline bool ClientIncidentReport::has_download() const { return (_has_bits_[0] & 0x00000002u) != 0; } -inline void ClientDownloadResponse::set_has_more_info() { +inline void ClientIncidentReport::set_has_download() { _has_bits_[0] |= 0x00000002u; } -inline void ClientDownloadResponse::clear_has_more_info() { +inline void ClientIncidentReport::clear_has_download() { _has_bits_[0] &= ~0x00000002u; } -inline void ClientDownloadResponse::clear_more_info() { - if (more_info_ != NULL) more_info_->::safe_browsing::ClientDownloadResponse_MoreInfo::Clear(); - clear_has_more_info(); +inline void ClientIncidentReport::clear_download() { + if (download_ != NULL) download_->::safe_browsing::ClientIncidentReport_DownloadDetails::Clear(); + clear_has_download(); } -inline const ::safe_browsing::ClientDownloadResponse_MoreInfo& ClientDownloadResponse::more_info() const { - return more_info_ != NULL ? *more_info_ : *default_instance_->more_info_; +inline const ::safe_browsing::ClientIncidentReport_DownloadDetails& ClientIncidentReport::download() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.download) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return download_ != NULL ? *download_ : *default_instance().download_; +#else + return download_ != NULL ? *download_ : *default_instance_->download_; +#endif } -inline ::safe_browsing::ClientDownloadResponse_MoreInfo* ClientDownloadResponse::mutable_more_info() { - set_has_more_info(); - if (more_info_ == NULL) more_info_ = new ::safe_browsing::ClientDownloadResponse_MoreInfo; - return more_info_; +inline ::safe_browsing::ClientIncidentReport_DownloadDetails* ClientIncidentReport::mutable_download() { + set_has_download(); + if (download_ == NULL) download_ = new ::safe_browsing::ClientIncidentReport_DownloadDetails; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.download) + return download_; } -inline ::safe_browsing::ClientDownloadResponse_MoreInfo* ClientDownloadResponse::release_more_info() { - clear_has_more_info(); - ::safe_browsing::ClientDownloadResponse_MoreInfo* temp = more_info_; - more_info_ = NULL; +inline ::safe_browsing::ClientIncidentReport_DownloadDetails* ClientIncidentReport::release_download() { + clear_has_download(); + ::safe_browsing::ClientIncidentReport_DownloadDetails* temp = download_; + download_ = NULL; return temp; } +inline void ClientIncidentReport::set_allocated_download(::safe_browsing::ClientIncidentReport_DownloadDetails* download) { + delete download_; + download_ = download; + if (download) { + set_has_download(); + } else { + clear_has_download(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.download) +} -// optional bytes token = 3; -inline bool ClientDownloadResponse::has_token() const { +// optional .safe_browsing.ClientIncidentReport.EnvironmentData environment = 3; +inline bool ClientIncidentReport::has_environment() const { return (_has_bits_[0] & 0x00000004u) != 0; } -inline void ClientDownloadResponse::set_has_token() { +inline void ClientIncidentReport::set_has_environment() { _has_bits_[0] |= 0x00000004u; } -inline void ClientDownloadResponse::clear_has_token() { +inline void ClientIncidentReport::clear_has_environment() { _has_bits_[0] &= ~0x00000004u; } -inline void ClientDownloadResponse::clear_token() { - if (token_ != &::google::protobuf::internal::kEmptyString) { +inline void ClientIncidentReport::clear_environment() { + if (environment_ != NULL) environment_->::safe_browsing::ClientIncidentReport_EnvironmentData::Clear(); + clear_has_environment(); +} +inline const ::safe_browsing::ClientIncidentReport_EnvironmentData& ClientIncidentReport::environment() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentReport.environment) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return environment_ != NULL ? *environment_ : *default_instance().environment_; +#else + return environment_ != NULL ? *environment_ : *default_instance_->environment_; +#endif +} +inline ::safe_browsing::ClientIncidentReport_EnvironmentData* ClientIncidentReport::mutable_environment() { + set_has_environment(); + if (environment_ == NULL) environment_ = new ::safe_browsing::ClientIncidentReport_EnvironmentData; + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentReport.environment) + return environment_; +} +inline ::safe_browsing::ClientIncidentReport_EnvironmentData* ClientIncidentReport::release_environment() { + clear_has_environment(); + ::safe_browsing::ClientIncidentReport_EnvironmentData* temp = environment_; + environment_ = NULL; + return temp; +} +inline void ClientIncidentReport::set_allocated_environment(::safe_browsing::ClientIncidentReport_EnvironmentData* environment) { + delete environment_; + environment_ = environment; + if (environment) { + set_has_environment(); + } else { + clear_has_environment(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentReport.environment) +} + +// ------------------------------------------------------------------- + +// ClientIncidentResponse_EnvironmentRequest + +// optional int32 dll_index = 1; +inline bool ClientIncidentResponse_EnvironmentRequest::has_dll_index() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientIncidentResponse_EnvironmentRequest::set_has_dll_index() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientIncidentResponse_EnvironmentRequest::clear_has_dll_index() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientIncidentResponse_EnvironmentRequest::clear_dll_index() { + dll_index_ = 0; + clear_has_dll_index(); +} +inline ::google::protobuf::int32 ClientIncidentResponse_EnvironmentRequest::dll_index() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentResponse.EnvironmentRequest.dll_index) + return dll_index_; +} +inline void ClientIncidentResponse_EnvironmentRequest::set_dll_index(::google::protobuf::int32 value) { + set_has_dll_index(); + dll_index_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentResponse.EnvironmentRequest.dll_index) +} + +// ------------------------------------------------------------------- + +// ClientIncidentResponse + +// optional bytes token = 1; +inline bool ClientIncidentResponse::has_token() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ClientIncidentResponse::set_has_token() { + _has_bits_[0] |= 0x00000001u; +} +inline void ClientIncidentResponse::clear_has_token() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ClientIncidentResponse::clear_token() { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { token_->clear(); } clear_has_token(); } -inline const ::std::string& ClientDownloadResponse::token() const { +inline const ::std::string& ClientIncidentResponse::token() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentResponse.token) return *token_; } -inline void ClientDownloadResponse::set_token(const ::std::string& value) { +inline void ClientIncidentResponse::set_token(const ::std::string& value) { set_has_token(); - if (token_ == &::google::protobuf::internal::kEmptyString) { + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { token_ = new ::std::string; } token_->assign(value); + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentResponse.token) } -inline void ClientDownloadResponse::set_token(const char* value) { +inline void ClientIncidentResponse::set_token(const char* value) { set_has_token(); - if (token_ == &::google::protobuf::internal::kEmptyString) { + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { token_ = new ::std::string; } token_->assign(value); + // @@protoc_insertion_point(field_set_char:safe_browsing.ClientIncidentResponse.token) } -inline void ClientDownloadResponse::set_token(const void* value, size_t size) { +inline void ClientIncidentResponse::set_token(const void* value, size_t size) { set_has_token(); - if (token_ == &::google::protobuf::internal::kEmptyString) { + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { token_ = new ::std::string; } token_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:safe_browsing.ClientIncidentResponse.token) } -inline ::std::string* ClientDownloadResponse::mutable_token() { +inline ::std::string* ClientIncidentResponse::mutable_token() { set_has_token(); - if (token_ == &::google::protobuf::internal::kEmptyString) { + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { token_ = new ::std::string; } + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentResponse.token) return token_; } -inline ::std::string* ClientDownloadResponse::release_token() { +inline ::std::string* ClientIncidentResponse::release_token() { clear_has_token(); - if (token_ == &::google::protobuf::internal::kEmptyString) { + if (token_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { return NULL; } else { ::std::string* temp = token_; - token_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + token_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); return temp; } } +inline void ClientIncidentResponse::set_allocated_token(::std::string* token) { + if (token_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete token_; + } + if (token) { + set_has_token(); + token_ = token; + } else { + clear_has_token(); + token_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.ClientIncidentResponse.token) +} + +// optional bool download_requested = 2; +inline bool ClientIncidentResponse::has_download_requested() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ClientIncidentResponse::set_has_download_requested() { + _has_bits_[0] |= 0x00000002u; +} +inline void ClientIncidentResponse::clear_has_download_requested() { + _has_bits_[0] &= ~0x00000002u; +} +inline void ClientIncidentResponse::clear_download_requested() { + download_requested_ = false; + clear_has_download_requested(); +} +inline bool ClientIncidentResponse::download_requested() const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentResponse.download_requested) + return download_requested_; +} +inline void ClientIncidentResponse::set_download_requested(bool value) { + set_has_download_requested(); + download_requested_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.ClientIncidentResponse.download_requested) +} + +// repeated .safe_browsing.ClientIncidentResponse.EnvironmentRequest environment_requests = 3; +inline int ClientIncidentResponse::environment_requests_size() const { + return environment_requests_.size(); +} +inline void ClientIncidentResponse::clear_environment_requests() { + environment_requests_.Clear(); +} +inline const ::safe_browsing::ClientIncidentResponse_EnvironmentRequest& ClientIncidentResponse::environment_requests(int index) const { + // @@protoc_insertion_point(field_get:safe_browsing.ClientIncidentResponse.environment_requests) + return environment_requests_.Get(index); +} +inline ::safe_browsing::ClientIncidentResponse_EnvironmentRequest* ClientIncidentResponse::mutable_environment_requests(int index) { + // @@protoc_insertion_point(field_mutable:safe_browsing.ClientIncidentResponse.environment_requests) + return environment_requests_.Mutable(index); +} +inline ::safe_browsing::ClientIncidentResponse_EnvironmentRequest* ClientIncidentResponse::add_environment_requests() { + // @@protoc_insertion_point(field_add:safe_browsing.ClientIncidentResponse.environment_requests) + return environment_requests_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentResponse_EnvironmentRequest >& +ClientIncidentResponse::environment_requests() const { + // @@protoc_insertion_point(field_list:safe_browsing.ClientIncidentResponse.environment_requests) + return environment_requests_; +} +inline ::google::protobuf::RepeatedPtrField< ::safe_browsing::ClientIncidentResponse_EnvironmentRequest >* +ClientIncidentResponse::mutable_environment_requests() { + // @@protoc_insertion_point(field_mutable_list:safe_browsing.ClientIncidentResponse.environment_requests) + return &environment_requests_; +} + +// ------------------------------------------------------------------- + +// DownloadMetadata + +// optional uint32 download_id = 1; +inline bool DownloadMetadata::has_download_id() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void DownloadMetadata::set_has_download_id() { + _has_bits_[0] |= 0x00000001u; +} +inline void DownloadMetadata::clear_has_download_id() { + _has_bits_[0] &= ~0x00000001u; +} +inline void DownloadMetadata::clear_download_id() { + download_id_ = 0u; + clear_has_download_id(); +} +inline ::google::protobuf::uint32 DownloadMetadata::download_id() const { + // @@protoc_insertion_point(field_get:safe_browsing.DownloadMetadata.download_id) + return download_id_; +} +inline void DownloadMetadata::set_download_id(::google::protobuf::uint32 value) { + set_has_download_id(); + download_id_ = value; + // @@protoc_insertion_point(field_set:safe_browsing.DownloadMetadata.download_id) +} + +// optional .safe_browsing.ClientIncidentReport.DownloadDetails download = 2; +inline bool DownloadMetadata::has_download() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void DownloadMetadata::set_has_download() { + _has_bits_[0] |= 0x00000002u; +} +inline void DownloadMetadata::clear_has_download() { + _has_bits_[0] &= ~0x00000002u; +} +inline void DownloadMetadata::clear_download() { + if (download_ != NULL) download_->::safe_browsing::ClientIncidentReport_DownloadDetails::Clear(); + clear_has_download(); +} +inline const ::safe_browsing::ClientIncidentReport_DownloadDetails& DownloadMetadata::download() const { + // @@protoc_insertion_point(field_get:safe_browsing.DownloadMetadata.download) +#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER + return download_ != NULL ? *download_ : *default_instance().download_; +#else + return download_ != NULL ? *download_ : *default_instance_->download_; +#endif +} +inline ::safe_browsing::ClientIncidentReport_DownloadDetails* DownloadMetadata::mutable_download() { + set_has_download(); + if (download_ == NULL) download_ = new ::safe_browsing::ClientIncidentReport_DownloadDetails; + // @@protoc_insertion_point(field_mutable:safe_browsing.DownloadMetadata.download) + return download_; +} +inline ::safe_browsing::ClientIncidentReport_DownloadDetails* DownloadMetadata::release_download() { + clear_has_download(); + ::safe_browsing::ClientIncidentReport_DownloadDetails* temp = download_; + download_ = NULL; + return temp; +} +inline void DownloadMetadata::set_allocated_download(::safe_browsing::ClientIncidentReport_DownloadDetails* download) { + delete download_; + download_ = download; + if (download) { + set_has_download(); + } else { + clear_has_download(); + } + // @@protoc_insertion_point(field_set_allocated:safe_browsing.DownloadMetadata.download) +} // @@protoc_insertion_point(namespace_scope) diff --git a/toolkit/components/downloads/csd.proto b/toolkit/components/downloads/csd.proto new file mode 100644 index 0000000000000..ae0e7b906ae3c --- /dev/null +++ b/toolkit/components/downloads/csd.proto @@ -0,0 +1,487 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Client side phishing and malware detection request and response +// protocol buffers. Those protocol messages should be kept in sync +// with the server implementation. +// +// If you want to change this protocol definition or you have questions +// regarding its format please contact chrome-anti-phishing@googlegroups.com. + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package safe_browsing; + +message ClientPhishingRequest { + // URL that the client visited. The CGI parameters are stripped by the + // client. + optional string url = 1; + + // A 5-byte SHA-256 hash prefix of the URL. Before hashing the URL is + // canonicalized, converted to a suffix-prefix expression and broadened + // (www prefix is removed and everything past the last '/' is stripped). + // + // Marked OBSOLETE because the URL is sent for all users, making the hash + // prefix unnecessary. + optional bytes OBSOLETE_hash_prefix = 10; + + // Score that was computed on the client. Value is between 0.0 and 1.0. + // The larger the value the more likely the url is phishing. + required float client_score = 2; + + // Note: we're skipping tag 3 because it was previously used. + + // Is true if the features for this URL were classified as phishing. + // Currently, this will always be true for all client-phishing requests + // that are sent to the server. + optional bool is_phishing = 4; + + message Feature { + // Feature name. E.g., 'PageHasForms'. + required string name = 1; + + // Feature value is always in the range [0.0, 1.0]. Boolean features + // have value 1.0. + required double value = 2; + } + + // List of features that were extracted. Those are the features that were + // sent to the scorer and which resulted in client_score being computed. + repeated Feature feature_map = 5; + + // The version number of the model that was used to compute the client-score. + // Copied from ClientSideModel.version(). + optional int32 model_version = 6; + + // Field 7 is only used on the server. + + // List of features that are extracted in the client but are not used in the + // machine learning model. + repeated Feature non_model_feature_map = 8; + + // The referrer URL. This field might not be set, for example, in the case + // where the referrer uses HTTPs. + // OBSOLETE: Use feature 'Referrer=' instead. + optional string OBSOLETE_referrer_url = 9; + + // Field 11 is only used on the server. + + // List of shingle hashes we extracted. + repeated uint32 shingle_hashes = 12 [packed = true]; +} + +message ClientPhishingResponse { + required bool phishy = 1; + + // A list of SafeBrowsing host-suffix / path-prefix expressions that + // are whitelisted. The client must match the current top-level URL + // against these whitelisted expressions and only apply a positive + // phishing verdict above if the URL does not match any expression + // on this whitelist. The client must not cache these whitelisted + // expressions. This whitelist will be empty for the vast majority + // of the responses but might contain up to 100 entries in emergency + // situations. + // + // Marked OBSOLETE because the URL is sent for all users, so the server + // can do whitelist matching. + repeated string OBSOLETE_whitelist_expression = 2; +} + +message ClientMalwareRequest { + // URL that the client visited. The CGI parameters are stripped by the + // client. + required string url = 1; + + // Field 2 is deleted and no longer in use. + + // Field 3 is only used on the server. + + // The referrer URL. This field might not be set, for example, in the case + // where the referrer uses HTTPS. + optional string referrer_url = 4; + + // Field 5 and 6 are only used on the server. + + message UrlInfo { + required string ip = 1; + required string url = 2; + optional string method = 3; + optional string referrer = 4; + // Resource type, the int value is a direct cast from the Type enum + // of ResourceType class defined in //src/webkit/commom/resource_type.h + optional int32 resource_type = 5; + } + + // List of resource urls that match the malware IP list. + repeated UrlInfo bad_ip_url_info = 7; +} + +message ClientMalwareResponse { + required bool blacklist = 1; + // The confirmed blacklisted bad IP and its url, which will be shown in + // malware warning, if the blacklist verdict is true. + // This IP string could be either in IPv4 or IPv6 format, which is the same + // as the ones client sent to server. + optional string bad_ip = 2; + optional string bad_url = 3; +} + +message ClientDownloadRequest { + // The final URL of the download (after all redirects). + required string url = 1; + + // This message contains various binary digests of the download payload. + message Digests { + optional bytes sha256 = 1; + optional bytes sha1 = 2; + optional bytes md5 = 3; + } + required Digests digests = 2; + + // This is the length in bytes of the download payload. + required int64 length = 3; + + // Type of the resources stored below. + enum ResourceType { + // The final URL of the download payload. The resource URL should + // correspond to the URL field above. + DOWNLOAD_URL = 0; + // A redirect URL that was fetched before hitting the final DOWNLOAD_URL. + DOWNLOAD_REDIRECT = 1; + // The final top-level URL of the tab that triggered the download. + TAB_URL = 2; + // A redirect URL thas was fetched before hitting the final TAB_URL. + TAB_REDIRECT = 3; + } + + message Resource { + required string url = 1; + required ResourceType type = 2; + optional bytes remote_ip = 3; + // This will only be set if the referrer is available and if the + // resource type is either TAB_URL or DOWNLOAD_URL. + optional string referrer = 4; + + // TODO(noelutz): add the transition type? + } + + // This repeated field will store all the redirects as well as the + // final URLs for the top-level tab URL (i.e., the URL that + // triggered the download) as well as for the download URL itself. + repeated Resource resources = 4; + + // A trust chain of certificates. Each chain begins with the signing + // certificate of the binary, and ends with a self-signed certificate, + // typically from a trusted root CA. This structure is analogous to + // CERT_CHAIN_CONTEXT on Windows. + message CertificateChain { + // A single link in the chain. + message Element { + // DER-encoded X.509 representation of the certificate. + optional bytes certificate = 1; + // Fields 2 - 7 are only used on the server. + } + repeated Element element = 1; + } + + message SignatureInfo { + // All of the certificate chains for the binary's signing certificate. + // If no chains are present, the binary is not signed. Multiple chains + // may be present if any certificate has multiple signers. + repeated CertificateChain certificate_chain = 1; + + // True if the signature was trusted on the client. + optional bool trusted = 2; + } + + // This field will only be set if the binary is signed. + optional SignatureInfo signature = 5; + + // True if the download was user initiated. + optional bool user_initiated = 6; + + // Fields 7 and 8 are only used on the server. + + // Name of the file where the download would be stored if the + // download completes. E.g., "bla.exe". + optional string file_basename = 9; + + // Starting with Chrome M19 we're also sending back pings for Chrome + // extensions that get downloaded by users. + enum DownloadType { + WIN_EXECUTABLE = 0; // Currently all .exe, .cab and .msi files. + CHROME_EXTENSION = 1; // .crx files. + ANDROID_APK = 2; // .apk files. + // .zip files containing one of the other executable types. + ZIPPED_EXECUTABLE = 3; + MAC_EXECUTABLE = 4; // .dmg, .pkg, etc. + } + optional DownloadType download_type = 10 [default = WIN_EXECUTABLE]; + + // Locale of the device, eg en, en_US. + optional string locale = 11; + + message PEImageHeaders { + // IMAGE_DOS_HEADER. + optional bytes dos_header = 1; + // IMAGE_FILE_HEADER. + optional bytes file_header = 2; + // IMAGE_OPTIONAL_HEADER32. Present only for 32-bit PE images. + optional bytes optional_headers32 = 3; + // IMAGE_OPTIONAL_HEADER64. Present only for 64-bit PE images. + optional bytes optional_headers64 = 4; + // IMAGE_SECTION_HEADER. + repeated bytes section_header = 5; + // Contents of the .edata section. + optional bytes export_section_data = 6; + + message DebugData { + // IMAGE_DEBUG_DIRECTORY. + optional bytes directory_entry = 1; + optional bytes raw_data = 2; + } + + repeated DebugData debug_data = 7; + } + + message ImageHeaders { + // Windows Portable Executable image headers. + optional PEImageHeaders pe_headers = 1; + }; + + // Fields 12-17 are reserved for server-side use and are never sent by the + // client. + + optional ImageHeaders image_headers = 18; + + // Fields 19-21 are reserved for server-side use and are never sent by the + // client. + + // A binary contained in an archive (e.g., a .zip archive). + message ArchivedBinary { + optional string file_basename = 1; + optional DownloadType download_type = 2; + optional Digests digests = 3; + optional int64 length = 4; + optional SignatureInfo signature = 5; + optional ImageHeaders image_headers = 6; + } + + repeated ArchivedBinary archived_binary = 22; +} + +message ClientDownloadResponse { + enum Verdict { + // Download is considered safe. + SAFE = 0; + // Download is considered dangerous. Chrome should show a warning to the + // user. + DANGEROUS = 1; + // Download is unknown. Chrome should display a less severe warning. + UNCOMMON = 2; + // The download is potentially unwanted. + POTENTIALLY_UNWANTED = 3; + // The download is from a dangerous host. + DANGEROUS_HOST = 4; + } + required Verdict verdict = 1; + + message MoreInfo { + // A human-readable string describing the nature of the warning. + // Only if verdict != SAFE. Localized based on request.locale. + optional string description = 1; + + // A URL to get more information about this warning, if available. + optional string url = 2; + } + optional MoreInfo more_info = 2; + + // An arbitrary token that should be sent along for further server requests. + optional bytes token = 3; +} + +// The following protocol buffer holds the feedback report gathered +// from the user regarding the download. +message ClientDownloadReport { + // The information of user who provided the feedback. + // This is going to be useful for handling appeals. + message UserInformation { + optional string email = 1; + } + + enum Reason { + SHARE = 0; + FALSE_POSITIVE = 1; + APPEAL = 2; + } + + // The type of feedback for this report. + optional Reason reason = 1; + + // The original download ping + optional ClientDownloadRequest download_request = 2; + + // Stores the information of the user who provided the feedback. + optional UserInformation user_information = 3; + + // Unstructed comments provided by the user. + optional bytes comment = 4; + + // The original download response sent from the verdict server. + optional ClientDownloadResponse download_response = 5; +} + +// This is used to send back upload status to the client after upload completion +message ClientUploadResponse { + enum UploadStatus { + // The upload was successful and a complete response can be expected + SUCCESS = 0; + + // The upload was unsuccessful and the response is incomplete. + UPLOAD_FAILURE = 1; + } + + // Holds the upload status + optional UploadStatus status = 1; + + // Holds the permalink where the results of scanning the binary are available + optional string permalink = 2; +} + +message ClientIncidentReport { + message IncidentData { + message TrackedPreferenceIncident { + enum ValueState { + UNKNOWN = 0; + CLEARED = 1; + WEAK_LEGACY_OBSOLETE = 2; + CHANGED = 3; + UNTRUSTED_UNKNOWN_VALUE = 4; + } + + optional string path = 1; + optional string atomic_value = 2; + repeated string split_key = 3; + optional ValueState value_state = 4; + } + message BinaryIntegrityIncident { + optional string file_basename = 1; + optional ClientDownloadRequest.SignatureInfo signature = 2; + } + message BlacklistLoadIncident { + optional string path = 1; + optional ClientDownloadRequest.Digests digest = 2; + optional string version = 3; + optional bool blacklist_initialized = 4; + optional ClientDownloadRequest.SignatureInfo signature = 5; + optional ClientDownloadRequest.ImageHeaders image_headers = 6; + } + message VariationsSeedSignatureIncident { + optional string variations_seed_signature = 1; + } + message ScriptRequestIncident { + optional string script_digest = 1; + optional string inclusion_origin = 2; + } + optional int64 incident_time_msec = 1; + optional TrackedPreferenceIncident tracked_preference = 2; + optional BinaryIntegrityIncident binary_integrity = 3; + optional BlacklistLoadIncident blacklist_load = 4; + // Note: skip tag 5 because it was previously used. + optional VariationsSeedSignatureIncident variations_seed_signature = 6; + optional ScriptRequestIncident script_request = 7; + } + + repeated IncidentData incident = 1; + + message DownloadDetails { + optional bytes token = 1; + optional ClientDownloadRequest download = 2; + optional int64 download_time_msec = 3; + optional int64 open_time_msec = 4; + } + + optional DownloadDetails download = 2; + + message EnvironmentData { + message OS { + optional string os_name = 1; + optional string os_version = 2; + } + optional OS os = 1; + message Machine { + optional string cpu_architecture = 1; + optional string cpu_vendor = 2; + optional uint32 cpuid = 3; + } + optional Machine machine = 2; + message Process { + optional string version = 1; + repeated string OBSOLETE_dlls = 2; + message Patch { + optional string function = 1; + optional string target_dll = 2; + } + repeated Patch patches = 3; + message NetworkProvider {} + repeated NetworkProvider network_providers = 4; + enum Channel { + CHANNEL_UNKNOWN = 0; + CHANNEL_CANARY = 1; + CHANNEL_DEV = 2; + CHANNEL_BETA = 3; + CHANNEL_STABLE = 4; + } + optional Channel chrome_update_channel = 5; + optional int64 uptime_msec = 6; + optional bool metrics_consent = 7; + optional bool extended_consent = 8; + message Dll { + enum Feature { + UNKNOWN = 0; + LSP = 1; + } + optional string path = 1; + optional uint64 base_address = 2; + optional uint32 length = 3; + repeated Feature feature = 4; + optional ClientDownloadRequest.ImageHeaders image_headers = 5; + } + repeated Dll dll = 9; + repeated string blacklisted_dll = 10; + message ModuleState { + enum ModifiedState { + UNKNOWN = 0; + MODULE_STATE_UNKNOWN = 1; + MODULE_STATE_UNMODIFIED = 2; + MODULE_STATE_MODIFIED = 3; + } + optional string name = 1; + optional ModifiedState modified_state = 2; + repeated string modified_export = 3; + } + repeated ModuleState module_state = 11; + } + optional Process process = 3; + } + + optional EnvironmentData environment = 3; +} + +message ClientIncidentResponse { + optional bytes token = 1; + optional bool download_requested = 2; + + message EnvironmentRequest { optional int32 dll_index = 1; } + + repeated EnvironmentRequest environment_requests = 3; +} + +message DownloadMetadata { + optional uint32 download_id = 1; + + optional ClientIncidentReport.DownloadDetails download = 2; +} diff --git a/toolkit/components/downloads/generate_csd.sh b/toolkit/components/downloads/generate_csd.sh index a0eba711ae772..213ea179e49ff 100755 --- a/toolkit/components/downloads/generate_csd.sh +++ b/toolkit/components/downloads/generate_csd.sh @@ -1,11 +1,15 @@ -#!/bin/bash +#!/usr/bin/env bash + # A script to generate toolkit/components/downloads/csd.pb.{cc,h} for use in # nsIApplicationReputationQuery. This script assumes you have downloaded and # installed the protocol buffer compiler. # As of June 26 2014, csd.proto contains many protobufs that are currently # unused by ApplicationReputation. You may want to strip csd.proto of these # before running the protocol compiler on it. -if [ -n $PROTOC_PATH ]; then + +set -e + +if [ "${PROTOC_PATH:+set}" != "set" ]; then PROTOC_PATH=/usr/local/bin/protoc fi @@ -17,9 +21,14 @@ if [ ! -e $PROTOC_PATH ]; then exit 1 fi +if [ ! -f nsDownloadManager.cpp ]; then + echo "You must run this script in the toolkit/components/downloads" >&2 + echo "directory of the source tree." >&2 + exit 1 +fi + # Get the protocol buffer and compile it -CMD='wget http://src.chromium.org/chrome/trunk/src/chrome/common/safe_browsing/csd.proto -O csd.proto' -OUTPUT_PATH=toolkit/components/downloads +CSD_PROTO_URL="https://chromium.googlesource.com/playground/chromium-blink-merge/+/master/chrome/common/safe_browsing/csd.proto?format=TEXT" -$CMD -$PROTOC_PATH csd.proto --cpp_out=$OUTPUT_PATH +curl $CSD_PROTO_URL | base64 --decode > csd.proto +$PROTOC_PATH csd.proto --cpp_out=. diff --git a/toolkit/components/downloads/moz.build b/toolkit/components/downloads/moz.build index cca94b367bbe8..6aa5a8f268915 100644 --- a/toolkit/components/downloads/moz.build +++ b/toolkit/components/downloads/moz.build @@ -76,5 +76,6 @@ LOCAL_INCLUDES += [ ] DEFINES['GOOGLE_PROTOBUF_NO_RTTI'] = True +DEFINES['GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER'] = True CXXFLAGS += CONFIG['TK_CFLAGS'] diff --git a/toolkit/components/protobuf/README.txt b/toolkit/components/protobuf/README.txt index 822ae96cdf296..c63704ac50ace 100644 --- a/toolkit/components/protobuf/README.txt +++ b/toolkit/components/protobuf/README.txt @@ -1,19 +1,25 @@ -This library has been updated to protobuf-2.4.1 as of 11/30/12. - Protocol Buffers (protobuf) source is available (via svn) at: -svn checkout http://protobuf.googlecode.com/svn/trunk/ protobuf-read-only + + svn checkout http://protobuf.googlecode.com/svn/trunk/ protobuf-read-only + +Or via git at: + + https://github.com/google/protobuf This code is covered under the BSD license (see COPYING.txt). Documentation is available at http://code.google.com/p/protobuf. -This import includes only files in protobuf-lite, a lighter-weight library that -does not support reflection or descriptors. Manual changes include removing all -tests, testdata, config.h, and all files not used in protobuf-lite. +The tree's current version of the protobuf library is 2.6.1. + +We do not include the protobuf tests or the protoc compiler. + +-------------------------------------------------------------------------------- + +# Upgrading the Protobuf Library + +1. Get a new protobuf release from https://github.com/google/protobuf/releases -Applied Patches -=============== -r512.patch: - Support VS2013 (from revision r512) +2. Run `$ ./toolkit/components/protobuf/upgrade_protobuf.sh ~/path/to/release/checkout/of/protobuf`. -vs2013.patch - Additional changes to support VS2013 missed from revision r512. +3. Update the moz.build to export the new set of headers and add any new .cc + files to the unified sources and remove old ones. diff --git a/toolkit/components/protobuf/google/protobuf/stubs/map-util.h b/toolkit/components/protobuf/google/protobuf/stubs/map-util.h deleted file mode 100644 index f5c9d6b6d9bc2..0000000000000 --- a/toolkit/components/protobuf/google/protobuf/stubs/map-util.h +++ /dev/null @@ -1,119 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// from google3/util/gtl/map-util.h -// Author: Anton Carver - -#ifndef GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__ -#define GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__ - -#include - -namespace google { -namespace protobuf { - -// Perform a lookup in a map or hash_map. -// If the key is present in the map then the value associated with that -// key is returned, otherwise the value passed as a default is returned. -template -const typename Collection::value_type::second_type& -FindWithDefault(const Collection& collection, - const typename Collection::value_type::first_type& key, - const typename Collection::value_type::second_type& value) { - typename Collection::const_iterator it = collection.find(key); - if (it == collection.end()) { - return value; - } - return it->second; -} - -// Perform a lookup in a map or hash_map. -// If the key is present a const pointer to the associated value is returned, -// otherwise a NULL pointer is returned. -template -const typename Collection::value_type::second_type* -FindOrNull(const Collection& collection, - const typename Collection::value_type::first_type& key) { - typename Collection::const_iterator it = collection.find(key); - if (it == collection.end()) { - return 0; - } - return &it->second; -} - -// Perform a lookup in a map or hash_map whose values are pointers. -// If the key is present a const pointer to the associated value is returned, -// otherwise a NULL pointer is returned. -// This function does not distinguish between a missing key and a key mapped -// to a NULL value. -template -const typename Collection::value_type::second_type -FindPtrOrNull(const Collection& collection, - const typename Collection::value_type::first_type& key) { - typename Collection::const_iterator it = collection.find(key); - if (it == collection.end()) { - return 0; - } - return it->second; -} - -// Change the value associated with a particular key in a map or hash_map. -// If the key is not present in the map the key and value are inserted, -// otherwise the value is updated to be a copy of the value provided. -// True indicates that an insert took place, false indicates an update. -template -bool InsertOrUpdate(Collection * const collection, - const Key& key, const Value& value) { - pair ret = - collection->insert(typename Collection::value_type(key, value)); - if (!ret.second) { - // update - ret.first->second = value; - return false; - } - return true; -} - -// Insert a new key and value into a map or hash_map. -// If the key is not present in the map the key and value are -// inserted, otherwise nothing happens. True indicates that an insert -// took place, false indicates the key was already present. -template -bool InsertIfNotPresent(Collection * const collection, - const Key& key, const Value& value) { - pair ret = - collection->insert(typename Collection::value_type(key, value)); - return ret.second; -} - -} // namespace protobuf -} // namespace google - -#endif // GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__ diff --git a/toolkit/components/protobuf/m-c-changes.patch b/toolkit/components/protobuf/m-c-changes.patch new file mode 100644 index 0000000000000..20a1368a4c2d6 --- /dev/null +++ b/toolkit/components/protobuf/m-c-changes.patch @@ -0,0 +1,365 @@ +--- a/toolkit/components/protobuf/src/google/protobuf/wire_format_lite.h ++++ b/toolkit/components/protobuf/src/google/protobuf/wire_format_lite.h +@@ -35,16 +35,17 @@ + // Sanjay Ghemawat, Jeff Dean, and others. + // + // This header is logically internal, but is made public because it is used + // from protocol-compiler-generated code, which may reside in other components. + + #ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ + #define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ + ++#include + #include + #include + #include + #include // for CodedOutputStream::Varint32Size + + namespace google { + + namespace protobuf { +--- a/toolkit/components/protobuf/src/google/protobuf/wire_format.cc ++++ b/toolkit/components/protobuf/src/google/protobuf/wire_format.cc +@@ -819,30 +819,35 @@ void WireFormat::SerializeFieldWithCachedSizes( + HANDLE_PRIMITIVE_TYPE(SFIXED64, int64, SFixed64, Int64) + + HANDLE_PRIMITIVE_TYPE(FLOAT , float , Float , Float ) + HANDLE_PRIMITIVE_TYPE(DOUBLE, double, Double, Double) + + HANDLE_PRIMITIVE_TYPE(BOOL, bool, Bool, Bool) + #undef HANDLE_PRIMITIVE_TYPE + +-#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD) \ +- case FieldDescriptor::TYPE_##TYPE: \ +- WireFormatLite::Write##TYPE_METHOD( \ +- field->number(), \ +- field->is_repeated() ? \ +- message_reflection->GetRepeated##CPPTYPE_METHOD( \ +- message, field, j) : \ +- message_reflection->Get##CPPTYPE_METHOD(message, field), \ +- output); \ ++ case FieldDescriptor::TYPE_GROUP: ++ WireFormatLite::WriteGroup( ++ field->number(), ++ field->is_repeated() ? ++ message_reflection->GetRepeatedMessage( ++ message, field, j) : ++ message_reflection->GetMessage(message, field), ++ output); + break; + +- HANDLE_TYPE(GROUP , Group , Message) +- HANDLE_TYPE(MESSAGE, Message, Message) +-#undef HANDLE_TYPE ++ case FieldDescriptor::TYPE_MESSAGE: ++ WireFormatLite::WriteMessage( ++ field->number(), ++ field->is_repeated() ? ++ message_reflection->GetRepeatedMessage( ++ message, field, j) : ++ message_reflection->GetMessage(message, field), ++ output); ++ break; + + case FieldDescriptor::TYPE_ENUM: { + const EnumValueDescriptor* value = field->is_repeated() ? + message_reflection->GetRepeatedEnum(message, field, j) : + message_reflection->GetEnum(message, field); + if (is_packed) { + WireFormatLite::WriteEnumNoTag(value->number(), output); + } else { +--- b/toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.cc ++++ a/toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.cc +@@ -28,17 +28,16 @@ + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + // Author: brianolson@google.com (Brian Olson) + // + // This file contains the implementation of classes GzipInputStream and + // GzipOutputStream. + +-#include "config.h" + + #if HAVE_ZLIB + #include + + #include + + namespace google { + namespace protobuf { +--- b/toolkit/components/protobuf/src/google/protobuf/stubs/common.cc ++++ a/toolkit/components/protobuf/src/google/protobuf/stubs/common.cc +@@ -31,23 +31,22 @@ + // Author: kenton@google.com (Kenton Varda) + + #include + #include + #include + #include + #include + +-#include "config.h" + + #ifdef _WIN32 + #define WIN32_LEAN_AND_MEAN // We only need minimal includes + #include + #define snprintf _snprintf // see comment in strutil.cc ++#elif defined(HAVE_PTHREAD_H) +-#elif defined(HAVE_PTHREAD) + #include + #else + #error "No suitable threading library available." + #endif + + namespace google { + namespace protobuf { + +--- b/toolkit/components/protobuf/src/google/protobuf/stubs/common.h ++++ a/toolkit/components/protobuf/src/google/protobuf/stubs/common.h +@@ -363,71 +363,20 @@ + // or to make sure a struct is smaller than a certain size: + // + // COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large); + // + // The second argument to the macro is the name of the variable. If + // the expression is false, most compilers will issue a warning/error + // containing the name of the variable. + ++#define GOOGLE_COMPILE_ASSERT(expr, msg) static_assert(expr, #msg) +-namespace internal { +- +-template +-struct CompileAssert { +-}; +- +-} // namespace internal + +-#undef GOOGLE_COMPILE_ASSERT +-#define GOOGLE_COMPILE_ASSERT(expr, msg) \ +- typedef ::google::protobuf::internal::CompileAssert<(bool(expr))> \ +- msg[bool(expr) ? 1 : -1] + + +-// Implementation details of COMPILE_ASSERT: +-// +-// - COMPILE_ASSERT works by defining an array type that has -1 +-// elements (and thus is invalid) when the expression is false. +-// +-// - The simpler definition +-// +-// #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1] +-// +-// does not work, as gcc supports variable-length arrays whose sizes +-// are determined at run-time (this is gcc's extension and not part +-// of the C++ standard). As a result, gcc fails to reject the +-// following code with the simple definition: +-// +-// int foo; +-// COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is +-// // not a compile-time constant. +-// +-// - By using the type CompileAssert<(bool(expr))>, we ensures that +-// expr is a compile-time constant. (Template arguments must be +-// determined at compile-time.) +-// +-// - The outter parentheses in CompileAssert<(bool(expr))> are necessary +-// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written +-// +-// CompileAssert +-// +-// instead, these compilers will refuse to compile +-// +-// COMPILE_ASSERT(5 > 0, some_message); +-// +-// (They seem to think the ">" in "5 > 0" marks the end of the +-// template argument list.) +-// +-// - The array size is (bool(expr) ? 1 : -1), instead of simply +-// +-// ((expr) ? 1 : -1). +-// +-// This is to avoid running into a bug in MS VC 7.1, which +-// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. +- + // =================================================================== + // from google3/base/scoped_ptr.h + + namespace internal { + + // This is an implementation designed to match the anticipated future TR2 + // implementation of the scoped_ptr class, and its closely-related brethren, + // scoped_array, scoped_ptr_malloc, and make_scoped_ptr. +@@ -582,16 +582,27 @@ enum LogLevel { + // in the code which calls the library, especially when + // compiled in debug mode. + + #ifdef NDEBUG + LOGLEVEL_DFATAL = LOGLEVEL_ERROR + #else + LOGLEVEL_DFATAL = LOGLEVEL_FATAL + #endif ++ ++#ifdef ERROR ++ // ERROR is defined as 0 on some windows builds, so `GOOGLE_LOG(ERROR, ...)` ++ // expands into `GOOGLE_LOG(0, ...)` which then expands into ++ // `someGoogleLogging(LOGLEVEL_0, ...)`. This is not ideal, because the ++ // GOOGLE_LOG macro expects to expand itself into ++ // `someGoogleLogging(LOGLEVEL_ERROR, ...)` instead. The workaround to get ++ // everything building is to simply define LOGLEVEL_0 as LOGLEVEL_ERROR and ++ // move on with our lives. ++ , LOGLEVEL_0 = LOGLEVEL_ERROR ++#endif + }; + + namespace internal { + + class LogFinisher; + + class LIBPROTOBUF_EXPORT LogMessage { + public: +--- b/toolkit/components/protobuf/src/google/protobuf/stubs/hash.h ++++ a/toolkit/components/protobuf/src/google/protobuf/stubs/hash.h +@@ -32,17 +32,16 @@ + // + // Deals with the fact that hash_map is not defined everywhere. + + #ifndef GOOGLE_PROTOBUF_STUBS_HASH_H__ + #define GOOGLE_PROTOBUF_STUBS_HASH_H__ + + #include + #include +-#include "config.h" + + #if defined(HAVE_HASH_MAP) && defined(HAVE_HASH_SET) + #include HASH_MAP_H + #include HASH_SET_H + #else + #define MISSING_HASH + #include + #include +--- b/toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.cc ++++ a/toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.cc +@@ -32,17 +32,16 @@ + + #include + + #include + #include // For va_list and related operations + #include // MSVC requires this for _vsnprintf + #include + #include +-#include + + namespace google { + namespace protobuf { + + #ifdef _MSC_VER + enum { IS_COMPILER_MSVC = 1 }; + #ifndef va_copy + // Define va_copy for MSVC. This is a hack, assuming va_list is simply a +--- b/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.h ++++ a/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.h +@@ -332,16 +332,17 @@ + return strtoul(nptr, endptr, base); + else + return strtou32_adaptor(nptr, endptr, base); + } + + // For now, long long is 64-bit on all the platforms we care about, so these + // functions can simply pass the call to strto[u]ll. + inline int64 strto64(const char *nptr, char **endptr, int base) { ++ static_assert(sizeof(int64) == sizeof(long long), "Protobuf needs sizeof(int64) == sizeof(long long)"); + GOOGLE_COMPILE_ASSERT(sizeof(int64) == sizeof(long long), + sizeof_int64_is_not_sizeof_long_long); + return strtoll(nptr, endptr, base); + } + + inline uint64 strtou64(const char *nptr, char **endptr, int base) { + GOOGLE_COMPILE_ASSERT(sizeof(uint64) == sizeof(unsigned long long), + sizeof_uint64_is_not_sizeof_long_long); +--- a/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.cc ++++ b/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.cc +@@ -33,16 +33,18 @@ + #include + #include + #include // FLT_DIG and DBL_DIG + #include + #include + #include + #include + ++#include "mozilla/FloatingPoint.h" ++ + #ifdef _WIN32 + // MSVC has only _snprintf, not snprintf. + // + // MinGW has both snprintf and _snprintf, but they appear to be different + // functions. The former is buggy. When invoked like so: + // char buffer[32]; + // snprintf(buffer, 32, "%.*g\n", FLT_DIG, 1.23e10f); + // it prints "1.23000e+10". This is plainly wrong: %g should never print +@@ -51,18 +53,17 @@ + // right thing, so we use it. + #define snprintf _snprintf + #endif + + namespace google { + namespace protobuf { + + inline bool IsNaN(double value) { +- // NaN is never equal to anything, even itself. +- return value != value; ++ return ::mozilla::IsNaN(value); + } + + // These are defined as macros on some platforms. #undef them so that we can + // redefine them. + #undef isxdigit + #undef isprint + + // The definitions of these in ctype.h change based on locale. Since our +--- b/toolkit/components/protobuf/src/google/protobuf/stubs/type_traits.h ++++ a/toolkit/components/protobuf/src/google/protobuf/stubs/type_traits.h +@@ -107,20 +107,18 @@ + template<> struct is_integral : true_type { }; + #endif + template<> struct is_integral : true_type { }; + template<> struct is_integral : true_type { }; + template<> struct is_integral : true_type { }; + template<> struct is_integral : true_type { }; + template<> struct is_integral : true_type { }; + template<> struct is_integral : true_type { }; +-#ifdef HAVE_LONG_LONG + template<> struct is_integral : true_type { }; + template<> struct is_integral : true_type { }; +-#endif + template struct is_integral : is_integral { }; + template struct is_integral : is_integral { }; + template struct is_integral : is_integral { }; + + // is_floating_point is false except for the built-in floating-point types. + // A cv-qualified type is integral if and only if the underlying type is. + template struct is_floating_point : false_type { }; + template<> struct is_floating_point : true_type { }; +--- a/toolkit/components/protobuf/src/google/protobuf/wire_format_lite_inl.h ++++ b/toolkit/components/protobuf/src/google/protobuf/wire_format_lite_inl.h +@@ -375,17 +375,17 @@ inline bool WireFormatLite::ReadPackedFixedSizePrimitive( + void* dest = reinterpret_cast(values->mutable_data() + old_entries); + if (!input->ReadRaw(dest, new_bytes)) { + values->Truncate(old_entries); + return false; + } + #else + values->Reserve(old_entries + new_entries); + CType value; +- for (int i = 0; i < new_entries; ++i) { ++ for (uint32 i = 0; i < new_entries; ++i) { + if (!ReadPrimitive(input, &value)) return false; + values->AddAlreadyReserved(value); + } + #endif + } else { + // This is the slow-path case where "length" may be too large to + // safely allocate. We read as much as we can into *values + // without pre-allocating "length" bytes. diff --git a/toolkit/components/protobuf/moz.build b/toolkit/components/protobuf/moz.build index a7b1bd41cce07..9a65cc284d23c 100644 --- a/toolkit/components/protobuf/moz.build +++ b/toolkit/components/protobuf/moz.build @@ -5,52 +5,117 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. EXPORTS.google.protobuf += [ - 'google/protobuf/extension_set.h', - 'google/protobuf/generated_message_util.h', - 'google/protobuf/message_lite.h', - 'google/protobuf/repeated_field.h', - 'google/protobuf/wire_format_lite.h', - 'google/protobuf/wire_format_lite_inl.h', + 'src/google/protobuf/descriptor.h', + 'src/google/protobuf/descriptor.pb.h', + 'src/google/protobuf/descriptor_database.h', + 'src/google/protobuf/dynamic_message.h', + 'src/google/protobuf/extension_set.h', + 'src/google/protobuf/generated_enum_reflection.h', + 'src/google/protobuf/generated_message_reflection.h', + 'src/google/protobuf/generated_message_util.h', + 'src/google/protobuf/message.h', + 'src/google/protobuf/message_lite.h', + 'src/google/protobuf/package_info.h', + 'src/google/protobuf/reflection_ops.h', + 'src/google/protobuf/repeated_field.h', + 'src/google/protobuf/service.h', + 'src/google/protobuf/text_format.h', + 'src/google/protobuf/unknown_field_set.h', + 'src/google/protobuf/wire_format.h', + 'src/google/protobuf/wire_format_lite.h', + 'src/google/protobuf/wire_format_lite_inl.h', ] -EXPORTS.google.protobuf.stubs += [ - 'google/protobuf/stubs/common.h', - 'google/protobuf/stubs/hash.h', - 'google/protobuf/stubs/map-util.h', - 'google/protobuf/stubs/once.h', - 'google/protobuf/stubs/stl_util-inl.h', +EXPORTS.google.protobuf.io += [ + 'src/google/protobuf/io/coded_stream.h', + 'src/google/protobuf/io/coded_stream_inl.h', + 'src/google/protobuf/io/gzip_stream.h', + 'src/google/protobuf/io/package_info.h', + 'src/google/protobuf/io/printer.h', + 'src/google/protobuf/io/strtod.h', + 'src/google/protobuf/io/tokenizer.h', + 'src/google/protobuf/io/zero_copy_stream.h', + 'src/google/protobuf/io/zero_copy_stream_impl.h', + 'src/google/protobuf/io/zero_copy_stream_impl_lite.h', ] -EXPORTS.google.protobuf.io += [ - 'google/protobuf/io/coded_stream.h', - 'google/protobuf/io/coded_stream_inl.h', - 'google/protobuf/io/zero_copy_stream.h', - 'google/protobuf/io/zero_copy_stream_impl.h', - 'google/protobuf/io/zero_copy_stream_impl_lite.h', - 'google/protobuf/package_info.h', +EXPORTS.google.protobuf.stubs += [ + 'src/google/protobuf/stubs/atomicops.h', + 'src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h', + 'src/google/protobuf/stubs/atomicops_internals_arm_gcc.h', + 'src/google/protobuf/stubs/atomicops_internals_arm_qnx.h', + 'src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h', + 'src/google/protobuf/stubs/atomicops_internals_generic_gcc.h', + 'src/google/protobuf/stubs/atomicops_internals_macosx.h', + 'src/google/protobuf/stubs/atomicops_internals_mips_gcc.h', + 'src/google/protobuf/stubs/atomicops_internals_pnacl.h', + 'src/google/protobuf/stubs/atomicops_internals_solaris.h', + 'src/google/protobuf/stubs/atomicops_internals_tsan.h', + 'src/google/protobuf/stubs/atomicops_internals_x86_gcc.h', + 'src/google/protobuf/stubs/atomicops_internals_x86_msvc.h', + 'src/google/protobuf/stubs/common.h', + 'src/google/protobuf/stubs/hash.h', + 'src/google/protobuf/stubs/map_util.h', + 'src/google/protobuf/stubs/once.h', + 'src/google/protobuf/stubs/platform_macros.h', + 'src/google/protobuf/stubs/shared_ptr.h', + 'src/google/protobuf/stubs/stl_util.h', + 'src/google/protobuf/stubs/stringprintf.h', + 'src/google/protobuf/stubs/strutil.h', + 'src/google/protobuf/stubs/substitute.h', + 'src/google/protobuf/stubs/template_util.h', + 'src/google/protobuf/stubs/type_traits.h', ] UNIFIED_SOURCES += [ - 'google/protobuf/extension_set.cc', - 'google/protobuf/generated_message_util.cc', - 'google/protobuf/io/coded_stream.cc', - 'google/protobuf/io/zero_copy_stream.cc', - 'google/protobuf/io/zero_copy_stream_impl_lite.cc', - 'google/protobuf/message_lite.cc', - 'google/protobuf/repeated_field.cc', - 'google/protobuf/stubs/common.cc', - 'google/protobuf/stubs/once.cc', - 'google/protobuf/wire_format_lite.cc', + 'src/google/protobuf/descriptor.cc', + 'src/google/protobuf/descriptor.pb.cc', + 'src/google/protobuf/descriptor_database.cc', + 'src/google/protobuf/dynamic_message.cc', + 'src/google/protobuf/extension_set.cc', + 'src/google/protobuf/generated_message_reflection.cc', + 'src/google/protobuf/generated_message_util.cc', + 'src/google/protobuf/io/coded_stream.cc', + 'src/google/protobuf/io/gzip_stream.cc', + 'src/google/protobuf/io/printer.cc', + 'src/google/protobuf/io/strtod.cc', + 'src/google/protobuf/io/tokenizer.cc', + 'src/google/protobuf/io/zero_copy_stream.cc', + 'src/google/protobuf/io/zero_copy_stream_impl.cc', + 'src/google/protobuf/io/zero_copy_stream_impl_lite.cc', + 'src/google/protobuf/message.cc', + 'src/google/protobuf/message_lite.cc', + 'src/google/protobuf/reflection_ops.cc', + 'src/google/protobuf/repeated_field.cc', + 'src/google/protobuf/service.cc', + 'src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc', + 'src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc', + 'src/google/protobuf/stubs/common.cc', + 'src/google/protobuf/stubs/once.cc', + 'src/google/protobuf/stubs/stringprintf.cc', + 'src/google/protobuf/stubs/structurally_valid.cc', + 'src/google/protobuf/stubs/strutil.cc', + 'src/google/protobuf/stubs/substitute.cc', + 'src/google/protobuf/unknown_field_set.cc', + 'src/google/protobuf/wire_format_lite.cc', +] + +SOURCES += [ + 'src/google/protobuf/extension_set_heavy.cc', + 'src/google/protobuf/text_format.cc', + 'src/google/protobuf/wire_format.cc', ] FINAL_LIBRARY = 'xul' DEFINES['GOOGLE_PROTOBUF_NO_RTTI'] = True +DEFINES['GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER'] = True # Suppress warnings in third-party code. if CONFIG['GNU_CXX']: CXXFLAGS += [ '-Wno-null-conversion', + '-Wno-return-type', '-Wno-sign-compare', ] elif CONFIG['_MSC_VER']: @@ -60,4 +125,10 @@ elif CONFIG['_MSC_VER']: '-wd4099', # mismatched class/struct tags ] +if CONFIG['MOZ_USE_PTHREADS']: + DEFINES['HAVE_PTHREAD'] = True + +# Needed for the gzip streams. +DEFINES['HAVE_ZLIB'] = True + CXXFLAGS += CONFIG['TK_CFLAGS'] diff --git a/toolkit/components/protobuf/r512.patch b/toolkit/components/protobuf/r512.patch deleted file mode 100644 index 235db7017d551..0000000000000 --- a/toolkit/components/protobuf/r512.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: src/google/protobuf/io/zero_copy_stream_impl_lite.cc -=================================================================== ---- src/google/protobuf/io/zero_copy_stream_impl_lite.cc (revision 511) -+++ src/google/protobuf/io/zero_copy_stream_impl_lite.cc (revision 512) -@@ -36,6 +36,8 @@ - #include - #include - -+#include -+ - namespace google { - namespace protobuf { - namespace io { diff --git a/toolkit/components/protobuf/src/google/protobuf/descriptor.cc b/toolkit/components/protobuf/src/google/protobuf/descriptor.cc new file mode 100644 index 0000000000000..21dda5987f7fe --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/descriptor.cc @@ -0,0 +1,5420 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef PACKAGE // autoheader #defines this. :( + +namespace google { +namespace protobuf { + +const FieldDescriptor::CppType +FieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = { + static_cast(0), // 0 is reserved for errors + + CPPTYPE_DOUBLE, // TYPE_DOUBLE + CPPTYPE_FLOAT, // TYPE_FLOAT + CPPTYPE_INT64, // TYPE_INT64 + CPPTYPE_UINT64, // TYPE_UINT64 + CPPTYPE_INT32, // TYPE_INT32 + CPPTYPE_UINT64, // TYPE_FIXED64 + CPPTYPE_UINT32, // TYPE_FIXED32 + CPPTYPE_BOOL, // TYPE_BOOL + CPPTYPE_STRING, // TYPE_STRING + CPPTYPE_MESSAGE, // TYPE_GROUP + CPPTYPE_MESSAGE, // TYPE_MESSAGE + CPPTYPE_STRING, // TYPE_BYTES + CPPTYPE_UINT32, // TYPE_UINT32 + CPPTYPE_ENUM, // TYPE_ENUM + CPPTYPE_INT32, // TYPE_SFIXED32 + CPPTYPE_INT64, // TYPE_SFIXED64 + CPPTYPE_INT32, // TYPE_SINT32 + CPPTYPE_INT64, // TYPE_SINT64 +}; + +const char * const FieldDescriptor::kTypeToName[MAX_TYPE + 1] = { + "ERROR", // 0 is reserved for errors + + "double", // TYPE_DOUBLE + "float", // TYPE_FLOAT + "int64", // TYPE_INT64 + "uint64", // TYPE_UINT64 + "int32", // TYPE_INT32 + "fixed64", // TYPE_FIXED64 + "fixed32", // TYPE_FIXED32 + "bool", // TYPE_BOOL + "string", // TYPE_STRING + "group", // TYPE_GROUP + "message", // TYPE_MESSAGE + "bytes", // TYPE_BYTES + "uint32", // TYPE_UINT32 + "enum", // TYPE_ENUM + "sfixed32", // TYPE_SFIXED32 + "sfixed64", // TYPE_SFIXED64 + "sint32", // TYPE_SINT32 + "sint64", // TYPE_SINT64 +}; + +const char * const FieldDescriptor::kCppTypeToName[MAX_CPPTYPE + 1] = { + "ERROR", // 0 is reserved for errors + + "int32", // CPPTYPE_INT32 + "int64", // CPPTYPE_INT64 + "uint32", // CPPTYPE_UINT32 + "uint64", // CPPTYPE_UINT64 + "double", // CPPTYPE_DOUBLE + "float", // CPPTYPE_FLOAT + "bool", // CPPTYPE_BOOL + "enum", // CPPTYPE_ENUM + "string", // CPPTYPE_STRING + "message", // CPPTYPE_MESSAGE +}; + +const char * const FieldDescriptor::kLabelToName[MAX_LABEL + 1] = { + "ERROR", // 0 is reserved for errors + + "optional", // LABEL_OPTIONAL + "required", // LABEL_REQUIRED + "repeated", // LABEL_REPEATED +}; + +static const char * const kNonLinkedWeakMessageReplacementName = "google.protobuf.Empty"; + +#ifndef _MSC_VER // MSVC doesn't need these and won't even accept them. +const int FieldDescriptor::kMaxNumber; +const int FieldDescriptor::kFirstReservedNumber; +const int FieldDescriptor::kLastReservedNumber; +#endif + +namespace { + +string ToCamelCase(const string& input) { + bool capitalize_next = false; + string result; + result.reserve(input.size()); + + for (int i = 0; i < input.size(); i++) { + if (input[i] == '_') { + capitalize_next = true; + } else if (capitalize_next) { + // Note: I distrust ctype.h due to locales. + if ('a' <= input[i] && input[i] <= 'z') { + result.push_back(input[i] - 'a' + 'A'); + } else { + result.push_back(input[i]); + } + capitalize_next = false; + } else { + result.push_back(input[i]); + } + } + + // Lower-case the first letter. + if (!result.empty() && 'A' <= result[0] && result[0] <= 'Z') { + result[0] = result[0] - 'A' + 'a'; + } + + return result; +} + +// A DescriptorPool contains a bunch of hash_maps to implement the +// various Find*By*() methods. Since hashtable lookups are O(1), it's +// most efficient to construct a fixed set of large hash_maps used by +// all objects in the pool rather than construct one or more small +// hash_maps for each object. +// +// The keys to these hash_maps are (parent, name) or (parent, number) +// pairs. Unfortunately STL doesn't provide hash functions for pair<>, +// so we must invent our own. +// +// TODO(kenton): Use StringPiece rather than const char* in keys? It would +// be a lot cleaner but we'd just have to convert it back to const char* +// for the open source release. + +typedef pair PointerStringPair; + +struct PointerStringPairEqual { + inline bool operator()(const PointerStringPair& a, + const PointerStringPair& b) const { + return a.first == b.first && strcmp(a.second, b.second) == 0; + } +}; + +template +struct PointerIntegerPairHash { + size_t operator()(const PairType& p) const { + // FIXME(kenton): What is the best way to compute this hash? I have + // no idea! This seems a bit better than an XOR. + return reinterpret_cast(p.first) * ((1 << 16) - 1) + p.second; + } + +#ifdef _MSC_VER + // Used only by MSVC and platforms where hash_map is not available. + static const size_t bucket_size = 4; + static const size_t min_buckets = 8; +#endif + inline bool operator()(const PairType& a, const PairType& b) const { + return a.first < b.first || + (a.first == b.first && a.second < b.second); + } +}; + +typedef pair DescriptorIntPair; +typedef pair EnumIntPair; + +struct PointerStringPairHash { + size_t operator()(const PointerStringPair& p) const { + // FIXME(kenton): What is the best way to compute this hash? I have + // no idea! This seems a bit better than an XOR. + hash cstring_hash; + return reinterpret_cast(p.first) * ((1 << 16) - 1) + + cstring_hash(p.second); + } + +#ifdef _MSC_VER + // Used only by MSVC and platforms where hash_map is not available. + static const size_t bucket_size = 4; + static const size_t min_buckets = 8; +#endif + inline bool operator()(const PointerStringPair& a, + const PointerStringPair& b) const { + if (a.first < b.first) return true; + if (a.first > b.first) return false; + return strcmp(a.second, b.second) < 0; + } +}; + + +struct Symbol { + enum Type { + NULL_SYMBOL, MESSAGE, FIELD, ONEOF, ENUM, ENUM_VALUE, SERVICE, METHOD, + PACKAGE + }; + Type type; + union { + const Descriptor* descriptor; + const FieldDescriptor* field_descriptor; + const OneofDescriptor* oneof_descriptor; + const EnumDescriptor* enum_descriptor; + const EnumValueDescriptor* enum_value_descriptor; + const ServiceDescriptor* service_descriptor; + const MethodDescriptor* method_descriptor; + const FileDescriptor* package_file_descriptor; + }; + + inline Symbol() : type(NULL_SYMBOL) { descriptor = NULL; } + inline bool IsNull() const { return type == NULL_SYMBOL; } + inline bool IsType() const { + return type == MESSAGE || type == ENUM; + } + inline bool IsAggregate() const { + return type == MESSAGE || type == PACKAGE + || type == ENUM || type == SERVICE; + } + +#define CONSTRUCTOR(TYPE, TYPE_CONSTANT, FIELD) \ + inline explicit Symbol(const TYPE* value) { \ + type = TYPE_CONSTANT; \ + this->FIELD = value; \ + } + + CONSTRUCTOR(Descriptor , MESSAGE , descriptor ) + CONSTRUCTOR(FieldDescriptor , FIELD , field_descriptor ) + CONSTRUCTOR(OneofDescriptor , ONEOF , oneof_descriptor ) + CONSTRUCTOR(EnumDescriptor , ENUM , enum_descriptor ) + CONSTRUCTOR(EnumValueDescriptor, ENUM_VALUE, enum_value_descriptor ) + CONSTRUCTOR(ServiceDescriptor , SERVICE , service_descriptor ) + CONSTRUCTOR(MethodDescriptor , METHOD , method_descriptor ) + CONSTRUCTOR(FileDescriptor , PACKAGE , package_file_descriptor) +#undef CONSTRUCTOR + + const FileDescriptor* GetFile() const { + switch (type) { + case NULL_SYMBOL: return NULL; + case MESSAGE : return descriptor ->file(); + case FIELD : return field_descriptor ->file(); + case ONEOF : return oneof_descriptor ->containing_type()->file(); + case ENUM : return enum_descriptor ->file(); + case ENUM_VALUE : return enum_value_descriptor->type()->file(); + case SERVICE : return service_descriptor ->file(); + case METHOD : return method_descriptor ->service()->file(); + case PACKAGE : return package_file_descriptor; + } + return NULL; + } +}; + +const Symbol kNullSymbol; + +typedef hash_map, streq> + SymbolsByNameMap; +typedef hash_map + SymbolsByParentMap; +typedef hash_map, streq> + FilesByNameMap; +typedef hash_map + FieldsByNameMap; +typedef hash_map > + FieldsByNumberMap; +typedef hash_map > + EnumValuesByNumberMap; +// This is a map rather than a hash_map, since we use it to iterate +// through all the extensions that extend a given Descriptor, and an +// ordered data structure that implements lower_bound is convenient +// for that. +typedef map + ExtensionsGroupedByDescriptorMap; +typedef hash_map LocationsByPathMap; +} // anonymous namespace + +// =================================================================== +// DescriptorPool::Tables + +class DescriptorPool::Tables { + public: + Tables(); + ~Tables(); + + // Record the current state of the tables to the stack of checkpoints. + // Each call to AddCheckpoint() must be paired with exactly one call to either + // ClearLastCheckpoint() or RollbackToLastCheckpoint(). + // + // This is used when building files, since some kinds of validation errors + // cannot be detected until the file's descriptors have already been added to + // the tables. + // + // This supports recursive checkpoints, since building a file may trigger + // recursive building of other files. Note that recursive checkpoints are not + // normally necessary; explicit dependencies are built prior to checkpointing. + // So although we recursively build transitive imports, there is at most one + // checkpoint in the stack during dependency building. + // + // Recursive checkpoints only arise during cross-linking of the descriptors. + // Symbol references must be resolved, via DescriptorBuilder::FindSymbol and + // friends. If the pending file references an unknown symbol + // (e.g., it is not defined in the pending file's explicit dependencies), and + // the pool is using a fallback database, and that database contains a file + // defining that symbol, and that file has not yet been built by the pool, + // the pool builds the file during cross-linking, leading to another + // checkpoint. + void AddCheckpoint(); + + // Mark the last checkpoint as having cleared successfully, removing it from + // the stack. If the stack is empty, all pending symbols will be committed. + // + // Note that this does not guarantee that the symbols added since the last + // checkpoint won't be rolled back: if a checkpoint gets rolled back, + // everything past that point gets rolled back, including symbols added after + // checkpoints that were pushed onto the stack after it and marked as cleared. + void ClearLastCheckpoint(); + + // Roll back the Tables to the state of the checkpoint at the top of the + // stack, removing everything that was added after that point. + void RollbackToLastCheckpoint(); + + // The stack of files which are currently being built. Used to detect + // cyclic dependencies when loading files from a DescriptorDatabase. Not + // used when fallback_database_ == NULL. + vector pending_files_; + + // A set of files which we have tried to load from the fallback database + // and encountered errors. We will not attempt to load them again during + // execution of the current public API call, but for compatibility with + // legacy clients, this is cleared at the beginning of each public API call. + // Not used when fallback_database_ == NULL. + hash_set known_bad_files_; + + // A set of symbols which we have tried to load from the fallback database + // and encountered errors. We will not attempt to load them again during + // execution of the current public API call, but for compatibility with + // legacy clients, this is cleared at the beginning of each public API call. + hash_set known_bad_symbols_; + + // The set of descriptors for which we've already loaded the full + // set of extensions numbers from fallback_database_. + hash_set extensions_loaded_from_db_; + + // ----------------------------------------------------------------- + // Finding items. + + // Find symbols. This returns a null Symbol (symbol.IsNull() is true) + // if not found. + inline Symbol FindSymbol(const string& key) const; + + // This implements the body of DescriptorPool::Find*ByName(). It should + // really be a private method of DescriptorPool, but that would require + // declaring Symbol in descriptor.h, which would drag all kinds of other + // stuff into the header. Yay C++. + Symbol FindByNameHelper( + const DescriptorPool* pool, const string& name); + + // These return NULL if not found. + inline const FileDescriptor* FindFile(const string& key) const; + inline const FieldDescriptor* FindExtension(const Descriptor* extendee, + int number); + inline void FindAllExtensions(const Descriptor* extendee, + vector* out) const; + + // ----------------------------------------------------------------- + // Adding items. + + // These add items to the corresponding tables. They return false if + // the key already exists in the table. For AddSymbol(), the string passed + // in must be one that was constructed using AllocateString(), as it will + // be used as a key in the symbols_by_name_ map without copying. + bool AddSymbol(const string& full_name, Symbol symbol); + bool AddFile(const FileDescriptor* file); + bool AddExtension(const FieldDescriptor* field); + + // ----------------------------------------------------------------- + // Allocating memory. + + // Allocate an object which will be reclaimed when the pool is + // destroyed. Note that the object's destructor will never be called, + // so its fields must be plain old data (primitive data types and + // pointers). All of the descriptor types are such objects. + template Type* Allocate(); + + // Allocate an array of objects which will be reclaimed when the + // pool in destroyed. Again, destructors are never called. + template Type* AllocateArray(int count); + + // Allocate a string which will be destroyed when the pool is destroyed. + // The string is initialized to the given value for convenience. + string* AllocateString(const string& value); + + // Allocate a protocol message object. Some older versions of GCC have + // trouble understanding explicit template instantiations in some cases, so + // in those cases we have to pass a dummy pointer of the right type as the + // parameter instead of specifying the type explicitly. + template Type* AllocateMessage(Type* dummy = NULL); + + // Allocate a FileDescriptorTables object. + FileDescriptorTables* AllocateFileTables(); + + private: + vector strings_; // All strings in the pool. + vector messages_; // All messages in the pool. + vector file_tables_; // All file tables in the pool. + vector allocations_; // All other memory allocated in the pool. + + SymbolsByNameMap symbols_by_name_; + FilesByNameMap files_by_name_; + ExtensionsGroupedByDescriptorMap extensions_; + + struct CheckPoint { + explicit CheckPoint(const Tables* tables) + : strings_before_checkpoint(tables->strings_.size()), + messages_before_checkpoint(tables->messages_.size()), + file_tables_before_checkpoint(tables->file_tables_.size()), + allocations_before_checkpoint(tables->allocations_.size()), + pending_symbols_before_checkpoint( + tables->symbols_after_checkpoint_.size()), + pending_files_before_checkpoint( + tables->files_after_checkpoint_.size()), + pending_extensions_before_checkpoint( + tables->extensions_after_checkpoint_.size()) { + } + int strings_before_checkpoint; + int messages_before_checkpoint; + int file_tables_before_checkpoint; + int allocations_before_checkpoint; + int pending_symbols_before_checkpoint; + int pending_files_before_checkpoint; + int pending_extensions_before_checkpoint; + }; + vector checkpoints_; + vector symbols_after_checkpoint_; + vector files_after_checkpoint_; + vector extensions_after_checkpoint_; + + // Allocate some bytes which will be reclaimed when the pool is + // destroyed. + void* AllocateBytes(int size); +}; + +// Contains tables specific to a particular file. These tables are not +// modified once the file has been constructed, so they need not be +// protected by a mutex. This makes operations that depend only on the +// contents of a single file -- e.g. Descriptor::FindFieldByName() -- +// lock-free. +// +// For historical reasons, the definitions of the methods of +// FileDescriptorTables and DescriptorPool::Tables are interleaved below. +// These used to be a single class. +class FileDescriptorTables { + public: + FileDescriptorTables(); + ~FileDescriptorTables(); + + // Empty table, used with placeholder files. + static const FileDescriptorTables kEmpty; + + // ----------------------------------------------------------------- + // Finding items. + + // Find symbols. These return a null Symbol (symbol.IsNull() is true) + // if not found. + inline Symbol FindNestedSymbol(const void* parent, + const string& name) const; + inline Symbol FindNestedSymbolOfType(const void* parent, + const string& name, + const Symbol::Type type) const; + + // These return NULL if not found. + inline const FieldDescriptor* FindFieldByNumber( + const Descriptor* parent, int number) const; + inline const FieldDescriptor* FindFieldByLowercaseName( + const void* parent, const string& lowercase_name) const; + inline const FieldDescriptor* FindFieldByCamelcaseName( + const void* parent, const string& camelcase_name) const; + inline const EnumValueDescriptor* FindEnumValueByNumber( + const EnumDescriptor* parent, int number) const; + + // ----------------------------------------------------------------- + // Adding items. + + // These add items to the corresponding tables. They return false if + // the key already exists in the table. For AddAliasUnderParent(), the + // string passed in must be one that was constructed using AllocateString(), + // as it will be used as a key in the symbols_by_parent_ map without copying. + bool AddAliasUnderParent(const void* parent, const string& name, + Symbol symbol); + bool AddFieldByNumber(const FieldDescriptor* field); + bool AddEnumValueByNumber(const EnumValueDescriptor* value); + + // Adds the field to the lowercase_name and camelcase_name maps. Never + // fails because we allow duplicates; the first field by the name wins. + void AddFieldByStylizedNames(const FieldDescriptor* field); + + // Populates p->first->locations_by_path_ from p->second. + // Unusual signature dictated by GoogleOnceDynamic. + static void BuildLocationsByPath( + pair* p); + + // Returns the location denoted by the specified path through info, + // or NULL if not found. + // The value of info must be that of the corresponding FileDescriptor. + // (Conceptually a pure function, but stateful as an optimisation.) + const SourceCodeInfo_Location* GetSourceLocation( + const vector& path, const SourceCodeInfo* info) const; + + private: + SymbolsByParentMap symbols_by_parent_; + FieldsByNameMap fields_by_lowercase_name_; + FieldsByNameMap fields_by_camelcase_name_; + FieldsByNumberMap fields_by_number_; // Not including extensions. + EnumValuesByNumberMap enum_values_by_number_; + + // Populated on first request to save space, hence constness games. + mutable GoogleOnceDynamic locations_by_path_once_; + mutable LocationsByPathMap locations_by_path_; +}; + +DescriptorPool::Tables::Tables() + // Start some hash_map and hash_set objects with a small # of buckets + : known_bad_files_(3), + known_bad_symbols_(3), + extensions_loaded_from_db_(3), + symbols_by_name_(3), + files_by_name_(3) {} + + +DescriptorPool::Tables::~Tables() { + GOOGLE_DCHECK(checkpoints_.empty()); + // Note that the deletion order is important, since the destructors of some + // messages may refer to objects in allocations_. + STLDeleteElements(&messages_); + for (int i = 0; i < allocations_.size(); i++) { + operator delete(allocations_[i]); + } + STLDeleteElements(&strings_); + STLDeleteElements(&file_tables_); +} + +FileDescriptorTables::FileDescriptorTables() + // Initialize all the hash tables to start out with a small # of buckets + : symbols_by_parent_(3), + fields_by_lowercase_name_(3), + fields_by_camelcase_name_(3), + fields_by_number_(3), + enum_values_by_number_(3) { +} + +FileDescriptorTables::~FileDescriptorTables() {} + +const FileDescriptorTables FileDescriptorTables::kEmpty; + +void DescriptorPool::Tables::AddCheckpoint() { + checkpoints_.push_back(CheckPoint(this)); +} + +void DescriptorPool::Tables::ClearLastCheckpoint() { + GOOGLE_DCHECK(!checkpoints_.empty()); + checkpoints_.pop_back(); + if (checkpoints_.empty()) { + // All checkpoints have been cleared: we can now commit all of the pending + // data. + symbols_after_checkpoint_.clear(); + files_after_checkpoint_.clear(); + extensions_after_checkpoint_.clear(); + } +} + +void DescriptorPool::Tables::RollbackToLastCheckpoint() { + GOOGLE_DCHECK(!checkpoints_.empty()); + const CheckPoint& checkpoint = checkpoints_.back(); + + for (int i = checkpoint.pending_symbols_before_checkpoint; + i < symbols_after_checkpoint_.size(); + i++) { + symbols_by_name_.erase(symbols_after_checkpoint_[i]); + } + for (int i = checkpoint.pending_files_before_checkpoint; + i < files_after_checkpoint_.size(); + i++) { + files_by_name_.erase(files_after_checkpoint_[i]); + } + for (int i = checkpoint.pending_extensions_before_checkpoint; + i < extensions_after_checkpoint_.size(); + i++) { + extensions_.erase(extensions_after_checkpoint_[i]); + } + + symbols_after_checkpoint_.resize( + checkpoint.pending_symbols_before_checkpoint); + files_after_checkpoint_.resize(checkpoint.pending_files_before_checkpoint); + extensions_after_checkpoint_.resize( + checkpoint.pending_extensions_before_checkpoint); + + STLDeleteContainerPointers( + strings_.begin() + checkpoint.strings_before_checkpoint, strings_.end()); + STLDeleteContainerPointers( + messages_.begin() + checkpoint.messages_before_checkpoint, + messages_.end()); + STLDeleteContainerPointers( + file_tables_.begin() + checkpoint.file_tables_before_checkpoint, + file_tables_.end()); + for (int i = checkpoint.allocations_before_checkpoint; + i < allocations_.size(); + i++) { + operator delete(allocations_[i]); + } + + strings_.resize(checkpoint.strings_before_checkpoint); + messages_.resize(checkpoint.messages_before_checkpoint); + file_tables_.resize(checkpoint.file_tables_before_checkpoint); + allocations_.resize(checkpoint.allocations_before_checkpoint); + checkpoints_.pop_back(); +} + +// ------------------------------------------------------------------- + +inline Symbol DescriptorPool::Tables::FindSymbol(const string& key) const { + const Symbol* result = FindOrNull(symbols_by_name_, key.c_str()); + if (result == NULL) { + return kNullSymbol; + } else { + return *result; + } +} + +inline Symbol FileDescriptorTables::FindNestedSymbol( + const void* parent, const string& name) const { + const Symbol* result = + FindOrNull(symbols_by_parent_, PointerStringPair(parent, name.c_str())); + if (result == NULL) { + return kNullSymbol; + } else { + return *result; + } +} + +inline Symbol FileDescriptorTables::FindNestedSymbolOfType( + const void* parent, const string& name, const Symbol::Type type) const { + Symbol result = FindNestedSymbol(parent, name); + if (result.type != type) return kNullSymbol; + return result; +} + +Symbol DescriptorPool::Tables::FindByNameHelper( + const DescriptorPool* pool, const string& name) { + MutexLockMaybe lock(pool->mutex_); + known_bad_symbols_.clear(); + known_bad_files_.clear(); + Symbol result = FindSymbol(name); + + if (result.IsNull() && pool->underlay_ != NULL) { + // Symbol not found; check the underlay. + result = + pool->underlay_->tables_->FindByNameHelper(pool->underlay_, name); + } + + if (result.IsNull()) { + // Symbol still not found, so check fallback database. + if (pool->TryFindSymbolInFallbackDatabase(name)) { + result = FindSymbol(name); + } + } + + return result; +} + +inline const FileDescriptor* DescriptorPool::Tables::FindFile( + const string& key) const { + return FindPtrOrNull(files_by_name_, key.c_str()); +} + +inline const FieldDescriptor* FileDescriptorTables::FindFieldByNumber( + const Descriptor* parent, int number) const { + return FindPtrOrNull(fields_by_number_, make_pair(parent, number)); +} + +inline const FieldDescriptor* FileDescriptorTables::FindFieldByLowercaseName( + const void* parent, const string& lowercase_name) const { + return FindPtrOrNull(fields_by_lowercase_name_, + PointerStringPair(parent, lowercase_name.c_str())); +} + +inline const FieldDescriptor* FileDescriptorTables::FindFieldByCamelcaseName( + const void* parent, const string& camelcase_name) const { + return FindPtrOrNull(fields_by_camelcase_name_, + PointerStringPair(parent, camelcase_name.c_str())); +} + +inline const EnumValueDescriptor* FileDescriptorTables::FindEnumValueByNumber( + const EnumDescriptor* parent, int number) const { + return FindPtrOrNull(enum_values_by_number_, make_pair(parent, number)); +} + +inline const FieldDescriptor* DescriptorPool::Tables::FindExtension( + const Descriptor* extendee, int number) { + return FindPtrOrNull(extensions_, make_pair(extendee, number)); +} + +inline void DescriptorPool::Tables::FindAllExtensions( + const Descriptor* extendee, vector* out) const { + ExtensionsGroupedByDescriptorMap::const_iterator it = + extensions_.lower_bound(make_pair(extendee, 0)); + for (; it != extensions_.end() && it->first.first == extendee; ++it) { + out->push_back(it->second); + } +} + +// ------------------------------------------------------------------- + +bool DescriptorPool::Tables::AddSymbol( + const string& full_name, Symbol symbol) { + if (InsertIfNotPresent(&symbols_by_name_, full_name.c_str(), symbol)) { + symbols_after_checkpoint_.push_back(full_name.c_str()); + return true; + } else { + return false; + } +} + +bool FileDescriptorTables::AddAliasUnderParent( + const void* parent, const string& name, Symbol symbol) { + PointerStringPair by_parent_key(parent, name.c_str()); + return InsertIfNotPresent(&symbols_by_parent_, by_parent_key, symbol); +} + +bool DescriptorPool::Tables::AddFile(const FileDescriptor* file) { + if (InsertIfNotPresent(&files_by_name_, file->name().c_str(), file)) { + files_after_checkpoint_.push_back(file->name().c_str()); + return true; + } else { + return false; + } +} + +void FileDescriptorTables::AddFieldByStylizedNames( + const FieldDescriptor* field) { + const void* parent; + if (field->is_extension()) { + if (field->extension_scope() == NULL) { + parent = field->file(); + } else { + parent = field->extension_scope(); + } + } else { + parent = field->containing_type(); + } + + PointerStringPair lowercase_key(parent, field->lowercase_name().c_str()); + InsertIfNotPresent(&fields_by_lowercase_name_, lowercase_key, field); + + PointerStringPair camelcase_key(parent, field->camelcase_name().c_str()); + InsertIfNotPresent(&fields_by_camelcase_name_, camelcase_key, field); +} + +bool FileDescriptorTables::AddFieldByNumber(const FieldDescriptor* field) { + DescriptorIntPair key(field->containing_type(), field->number()); + return InsertIfNotPresent(&fields_by_number_, key, field); +} + +bool FileDescriptorTables::AddEnumValueByNumber( + const EnumValueDescriptor* value) { + EnumIntPair key(value->type(), value->number()); + return InsertIfNotPresent(&enum_values_by_number_, key, value); +} + +bool DescriptorPool::Tables::AddExtension(const FieldDescriptor* field) { + DescriptorIntPair key(field->containing_type(), field->number()); + if (InsertIfNotPresent(&extensions_, key, field)) { + extensions_after_checkpoint_.push_back(key); + return true; + } else { + return false; + } +} + +// ------------------------------------------------------------------- + +template +Type* DescriptorPool::Tables::Allocate() { + return reinterpret_cast(AllocateBytes(sizeof(Type))); +} + +template +Type* DescriptorPool::Tables::AllocateArray(int count) { + return reinterpret_cast(AllocateBytes(sizeof(Type) * count)); +} + +string* DescriptorPool::Tables::AllocateString(const string& value) { + string* result = new string(value); + strings_.push_back(result); + return result; +} + +template +Type* DescriptorPool::Tables::AllocateMessage(Type* /* dummy */) { + Type* result = new Type; + messages_.push_back(result); + return result; +} + +FileDescriptorTables* DescriptorPool::Tables::AllocateFileTables() { + FileDescriptorTables* result = new FileDescriptorTables; + file_tables_.push_back(result); + return result; +} + +void* DescriptorPool::Tables::AllocateBytes(int size) { + // TODO(kenton): Would it be worthwhile to implement this in some more + // sophisticated way? Probably not for the open source release, but for + // internal use we could easily plug in one of our existing memory pool + // allocators... + if (size == 0) return NULL; + + void* result = operator new(size); + allocations_.push_back(result); + return result; +} + +void FileDescriptorTables::BuildLocationsByPath( + pair* p) { + for (int i = 0, len = p->second->location_size(); i < len; ++i) { + const SourceCodeInfo_Location* loc = &p->second->location().Get(i); + p->first->locations_by_path_[Join(loc->path(), ",")] = loc; + } +} + +const SourceCodeInfo_Location* FileDescriptorTables::GetSourceLocation( + const vector& path, const SourceCodeInfo* info) const { + pair p( + make_pair(this, info)); + locations_by_path_once_.Init(&FileDescriptorTables::BuildLocationsByPath, &p); + return FindPtrOrNull(locations_by_path_, Join(path, ",")); +} + +// =================================================================== +// DescriptorPool + +DescriptorPool::ErrorCollector::~ErrorCollector() {} + +DescriptorPool::DescriptorPool() + : mutex_(NULL), + fallback_database_(NULL), + default_error_collector_(NULL), + underlay_(NULL), + tables_(new Tables), + enforce_dependencies_(true), + allow_unknown_(false), + enforce_weak_(false) {} + +DescriptorPool::DescriptorPool(DescriptorDatabase* fallback_database, + ErrorCollector* error_collector) + : mutex_(new Mutex), + fallback_database_(fallback_database), + default_error_collector_(error_collector), + underlay_(NULL), + tables_(new Tables), + enforce_dependencies_(true), + allow_unknown_(false), + enforce_weak_(false) { +} + +DescriptorPool::DescriptorPool(const DescriptorPool* underlay) + : mutex_(NULL), + fallback_database_(NULL), + default_error_collector_(NULL), + underlay_(underlay), + tables_(new Tables), + enforce_dependencies_(true), + allow_unknown_(false), + enforce_weak_(false) {} + +DescriptorPool::~DescriptorPool() { + if (mutex_ != NULL) delete mutex_; +} + +// DescriptorPool::BuildFile() defined later. +// DescriptorPool::BuildFileCollectingErrors() defined later. + +void DescriptorPool::InternalDontEnforceDependencies() { + enforce_dependencies_ = false; +} + +void DescriptorPool::AddUnusedImportTrackFile(const string& file_name) { + unused_import_track_files_.insert(file_name); +} + +void DescriptorPool::ClearUnusedImportTrackFiles() { + unused_import_track_files_.clear(); +} + +bool DescriptorPool::InternalIsFileLoaded(const string& filename) const { + MutexLockMaybe lock(mutex_); + return tables_->FindFile(filename) != NULL; +} + +// generated_pool ==================================================== + +namespace { + + +EncodedDescriptorDatabase* generated_database_ = NULL; +DescriptorPool* generated_pool_ = NULL; +GOOGLE_PROTOBUF_DECLARE_ONCE(generated_pool_init_); + +void DeleteGeneratedPool() { + delete generated_database_; + generated_database_ = NULL; + delete generated_pool_; + generated_pool_ = NULL; +} + +static void InitGeneratedPool() { + generated_database_ = new EncodedDescriptorDatabase; + generated_pool_ = new DescriptorPool(generated_database_); + + internal::OnShutdown(&DeleteGeneratedPool); +} + +inline void InitGeneratedPoolOnce() { + ::google::protobuf::GoogleOnceInit(&generated_pool_init_, &InitGeneratedPool); +} + +} // anonymous namespace + +const DescriptorPool* DescriptorPool::generated_pool() { + InitGeneratedPoolOnce(); + return generated_pool_; +} + +DescriptorPool* DescriptorPool::internal_generated_pool() { + InitGeneratedPoolOnce(); + return generated_pool_; +} + +void DescriptorPool::InternalAddGeneratedFile( + const void* encoded_file_descriptor, int size) { + // So, this function is called in the process of initializing the + // descriptors for generated proto classes. Each generated .pb.cc file + // has an internal procedure called AddDescriptors() which is called at + // process startup, and that function calls this one in order to register + // the raw bytes of the FileDescriptorProto representing the file. + // + // We do not actually construct the descriptor objects right away. We just + // hang on to the bytes until they are actually needed. We actually construct + // the descriptor the first time one of the following things happens: + // * Someone calls a method like descriptor(), GetDescriptor(), or + // GetReflection() on the generated types, which requires returning the + // descriptor or an object based on it. + // * Someone looks up the descriptor in DescriptorPool::generated_pool(). + // + // Once one of these happens, the DescriptorPool actually parses the + // FileDescriptorProto and generates a FileDescriptor (and all its children) + // based on it. + // + // Note that FileDescriptorProto is itself a generated protocol message. + // Therefore, when we parse one, we have to be very careful to avoid using + // any descriptor-based operations, since this might cause infinite recursion + // or deadlock. + InitGeneratedPoolOnce(); + GOOGLE_CHECK(generated_database_->Add(encoded_file_descriptor, size)); +} + + +// Find*By* methods ================================================== + +// TODO(kenton): There's a lot of repeated code here, but I'm not sure if +// there's any good way to factor it out. Think about this some time when +// there's nothing more important to do (read: never). + +const FileDescriptor* DescriptorPool::FindFileByName(const string& name) const { + MutexLockMaybe lock(mutex_); + tables_->known_bad_symbols_.clear(); + tables_->known_bad_files_.clear(); + const FileDescriptor* result = tables_->FindFile(name); + if (result != NULL) return result; + if (underlay_ != NULL) { + result = underlay_->FindFileByName(name); + if (result != NULL) return result; + } + if (TryFindFileInFallbackDatabase(name)) { + result = tables_->FindFile(name); + if (result != NULL) return result; + } + return NULL; +} + +const FileDescriptor* DescriptorPool::FindFileContainingSymbol( + const string& symbol_name) const { + MutexLockMaybe lock(mutex_); + tables_->known_bad_symbols_.clear(); + tables_->known_bad_files_.clear(); + Symbol result = tables_->FindSymbol(symbol_name); + if (!result.IsNull()) return result.GetFile(); + if (underlay_ != NULL) { + const FileDescriptor* file_result = + underlay_->FindFileContainingSymbol(symbol_name); + if (file_result != NULL) return file_result; + } + if (TryFindSymbolInFallbackDatabase(symbol_name)) { + result = tables_->FindSymbol(symbol_name); + if (!result.IsNull()) return result.GetFile(); + } + return NULL; +} + +const Descriptor* DescriptorPool::FindMessageTypeByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::MESSAGE) ? result.descriptor : NULL; +} + +const FieldDescriptor* DescriptorPool::FindFieldByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + if (result.type == Symbol::FIELD && + !result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* DescriptorPool::FindExtensionByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + if (result.type == Symbol::FIELD && + result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const OneofDescriptor* DescriptorPool::FindOneofByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::ONEOF) ? result.oneof_descriptor : NULL; +} + +const EnumDescriptor* DescriptorPool::FindEnumTypeByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::ENUM) ? result.enum_descriptor : NULL; +} + +const EnumValueDescriptor* DescriptorPool::FindEnumValueByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::ENUM_VALUE) ? + result.enum_value_descriptor : NULL; +} + +const ServiceDescriptor* DescriptorPool::FindServiceByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::SERVICE) ? result.service_descriptor : NULL; +} + +const MethodDescriptor* DescriptorPool::FindMethodByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::METHOD) ? result.method_descriptor : NULL; +} + +const FieldDescriptor* DescriptorPool::FindExtensionByNumber( + const Descriptor* extendee, int number) const { + MutexLockMaybe lock(mutex_); + tables_->known_bad_symbols_.clear(); + tables_->known_bad_files_.clear(); + const FieldDescriptor* result = tables_->FindExtension(extendee, number); + if (result != NULL) { + return result; + } + if (underlay_ != NULL) { + result = underlay_->FindExtensionByNumber(extendee, number); + if (result != NULL) return result; + } + if (TryFindExtensionInFallbackDatabase(extendee, number)) { + result = tables_->FindExtension(extendee, number); + if (result != NULL) { + return result; + } + } + return NULL; +} + +void DescriptorPool::FindAllExtensions( + const Descriptor* extendee, vector* out) const { + MutexLockMaybe lock(mutex_); + tables_->known_bad_symbols_.clear(); + tables_->known_bad_files_.clear(); + + // Initialize tables_->extensions_ from the fallback database first + // (but do this only once per descriptor). + if (fallback_database_ != NULL && + tables_->extensions_loaded_from_db_.count(extendee) == 0) { + vector numbers; + if (fallback_database_->FindAllExtensionNumbers(extendee->full_name(), + &numbers)) { + for (int i = 0; i < numbers.size(); ++i) { + int number = numbers[i]; + if (tables_->FindExtension(extendee, number) == NULL) { + TryFindExtensionInFallbackDatabase(extendee, number); + } + } + tables_->extensions_loaded_from_db_.insert(extendee); + } + } + + tables_->FindAllExtensions(extendee, out); + if (underlay_ != NULL) { + underlay_->FindAllExtensions(extendee, out); + } +} + + +// ------------------------------------------------------------------- + +const FieldDescriptor* +Descriptor::FindFieldByNumber(int key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByNumber(this, key); + if (result == NULL || result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +Descriptor::FindFieldByLowercaseName(const string& key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByLowercaseName(this, key); + if (result == NULL || result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +Descriptor::FindFieldByCamelcaseName(const string& key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByCamelcaseName(this, key); + if (result == NULL || result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +Descriptor::FindFieldByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD); + if (!result.IsNull() && !result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const OneofDescriptor* +Descriptor::FindOneofByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ONEOF); + if (!result.IsNull()) { + return result.oneof_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* +Descriptor::FindExtensionByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD); + if (!result.IsNull() && result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* +Descriptor::FindExtensionByLowercaseName(const string& key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByLowercaseName(this, key); + if (result == NULL || !result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +Descriptor::FindExtensionByCamelcaseName(const string& key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByCamelcaseName(this, key); + if (result == NULL || !result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const Descriptor* +Descriptor::FindNestedTypeByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE); + if (!result.IsNull()) { + return result.descriptor; + } else { + return NULL; + } +} + +const EnumDescriptor* +Descriptor::FindEnumTypeByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM); + if (!result.IsNull()) { + return result.enum_descriptor; + } else { + return NULL; + } +} + +const EnumValueDescriptor* +Descriptor::FindEnumValueByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE); + if (!result.IsNull()) { + return result.enum_value_descriptor; + } else { + return NULL; + } +} + +const EnumValueDescriptor* +EnumDescriptor::FindValueByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE); + if (!result.IsNull()) { + return result.enum_value_descriptor; + } else { + return NULL; + } +} + +const EnumValueDescriptor* +EnumDescriptor::FindValueByNumber(int key) const { + return file()->tables_->FindEnumValueByNumber(this, key); +} + +const MethodDescriptor* +ServiceDescriptor::FindMethodByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::METHOD); + if (!result.IsNull()) { + return result.method_descriptor; + } else { + return NULL; + } +} + +const Descriptor* +FileDescriptor::FindMessageTypeByName(const string& key) const { + Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE); + if (!result.IsNull()) { + return result.descriptor; + } else { + return NULL; + } +} + +const EnumDescriptor* +FileDescriptor::FindEnumTypeByName(const string& key) const { + Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM); + if (!result.IsNull()) { + return result.enum_descriptor; + } else { + return NULL; + } +} + +const EnumValueDescriptor* +FileDescriptor::FindEnumValueByName(const string& key) const { + Symbol result = + tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE); + if (!result.IsNull()) { + return result.enum_value_descriptor; + } else { + return NULL; + } +} + +const ServiceDescriptor* +FileDescriptor::FindServiceByName(const string& key) const { + Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::SERVICE); + if (!result.IsNull()) { + return result.service_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* +FileDescriptor::FindExtensionByName(const string& key) const { + Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD); + if (!result.IsNull() && result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* +FileDescriptor::FindExtensionByLowercaseName(const string& key) const { + const FieldDescriptor* result = tables_->FindFieldByLowercaseName(this, key); + if (result == NULL || !result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +FileDescriptor::FindExtensionByCamelcaseName(const string& key) const { + const FieldDescriptor* result = tables_->FindFieldByCamelcaseName(this, key); + if (result == NULL || !result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const Descriptor::ExtensionRange* +Descriptor::FindExtensionRangeContainingNumber(int number) const { + // Linear search should be fine because we don't expect a message to have + // more than a couple extension ranges. + for (int i = 0; i < extension_range_count(); i++) { + if (number >= extension_range(i)->start && + number < extension_range(i)->end) { + return extension_range(i); + } + } + return NULL; +} + +// ------------------------------------------------------------------- + +bool DescriptorPool::TryFindFileInFallbackDatabase(const string& name) const { + if (fallback_database_ == NULL) return false; + + if (tables_->known_bad_files_.count(name) > 0) return false; + + FileDescriptorProto file_proto; + if (!fallback_database_->FindFileByName(name, &file_proto) || + BuildFileFromDatabase(file_proto) == NULL) { + tables_->known_bad_files_.insert(name); + return false; + } + return true; +} + +bool DescriptorPool::IsSubSymbolOfBuiltType(const string& name) const { + string prefix = name; + for (;;) { + string::size_type dot_pos = prefix.find_last_of('.'); + if (dot_pos == string::npos) { + break; + } + prefix = prefix.substr(0, dot_pos); + Symbol symbol = tables_->FindSymbol(prefix); + // If the symbol type is anything other than PACKAGE, then its complete + // definition is already known. + if (!symbol.IsNull() && symbol.type != Symbol::PACKAGE) { + return true; + } + } + if (underlay_ != NULL) { + // Check to see if any prefix of this symbol exists in the underlay. + return underlay_->IsSubSymbolOfBuiltType(name); + } + return false; +} + +bool DescriptorPool::TryFindSymbolInFallbackDatabase(const string& name) const { + if (fallback_database_ == NULL) return false; + + if (tables_->known_bad_symbols_.count(name) > 0) return false; + + FileDescriptorProto file_proto; + if (// We skip looking in the fallback database if the name is a sub-symbol + // of any descriptor that already exists in the descriptor pool (except + // for package descriptors). This is valid because all symbols except + // for packages are defined in a single file, so if the symbol exists + // then we should already have its definition. + // + // The other reason to do this is to support "overriding" type + // definitions by merging two databases that define the same type. (Yes, + // people do this.) The main difficulty with making this work is that + // FindFileContainingSymbol() is allowed to return both false positives + // (e.g., SimpleDescriptorDatabase, UpgradedDescriptorDatabase) and false + // negatives (e.g. ProtoFileParser, SourceTreeDescriptorDatabase). + // When two such databases are merged, looking up a non-existent + // sub-symbol of a type that already exists in the descriptor pool can + // result in an attempt to load multiple definitions of the same type. + // The check below avoids this. + IsSubSymbolOfBuiltType(name) + + // Look up file containing this symbol in fallback database. + || !fallback_database_->FindFileContainingSymbol(name, &file_proto) + + // Check if we've already built this file. If so, it apparently doesn't + // contain the symbol we're looking for. Some DescriptorDatabases + // return false positives. + || tables_->FindFile(file_proto.name()) != NULL + + // Build the file. + || BuildFileFromDatabase(file_proto) == NULL) { + tables_->known_bad_symbols_.insert(name); + return false; + } + + return true; +} + +bool DescriptorPool::TryFindExtensionInFallbackDatabase( + const Descriptor* containing_type, int field_number) const { + if (fallback_database_ == NULL) return false; + + FileDescriptorProto file_proto; + if (!fallback_database_->FindFileContainingExtension( + containing_type->full_name(), field_number, &file_proto)) { + return false; + } + + if (tables_->FindFile(file_proto.name()) != NULL) { + // We've already loaded this file, and it apparently doesn't contain the + // extension we're looking for. Some DescriptorDatabases return false + // positives. + return false; + } + + if (BuildFileFromDatabase(file_proto) == NULL) { + return false; + } + + return true; +} + +// =================================================================== + +string FieldDescriptor::DefaultValueAsString(bool quote_string_type) const { + GOOGLE_CHECK(has_default_value()) << "No default value"; + switch (cpp_type()) { + case CPPTYPE_INT32: + return SimpleItoa(default_value_int32()); + break; + case CPPTYPE_INT64: + return SimpleItoa(default_value_int64()); + break; + case CPPTYPE_UINT32: + return SimpleItoa(default_value_uint32()); + break; + case CPPTYPE_UINT64: + return SimpleItoa(default_value_uint64()); + break; + case CPPTYPE_FLOAT: + return SimpleFtoa(default_value_float()); + break; + case CPPTYPE_DOUBLE: + return SimpleDtoa(default_value_double()); + break; + case CPPTYPE_BOOL: + return default_value_bool() ? "true" : "false"; + break; + case CPPTYPE_STRING: + if (quote_string_type) { + return "\"" + CEscape(default_value_string()) + "\""; + } else { + if (type() == TYPE_BYTES) { + return CEscape(default_value_string()); + } else { + return default_value_string(); + } + } + break; + case CPPTYPE_ENUM: + return default_value_enum()->name(); + break; + case CPPTYPE_MESSAGE: + GOOGLE_LOG(DFATAL) << "Messages can't have default values!"; + break; + } + GOOGLE_LOG(FATAL) << "Can't get here: failed to get default value as string"; + return ""; +} + +// CopyTo methods ==================================================== + +void FileDescriptor::CopyTo(FileDescriptorProto* proto) const { + proto->set_name(name()); + if (!package().empty()) proto->set_package(package()); + + for (int i = 0; i < dependency_count(); i++) { + proto->add_dependency(dependency(i)->name()); + } + + for (int i = 0; i < public_dependency_count(); i++) { + proto->add_public_dependency(public_dependencies_[i]); + } + + for (int i = 0; i < weak_dependency_count(); i++) { + proto->add_weak_dependency(weak_dependencies_[i]); + } + + for (int i = 0; i < message_type_count(); i++) { + message_type(i)->CopyTo(proto->add_message_type()); + } + for (int i = 0; i < enum_type_count(); i++) { + enum_type(i)->CopyTo(proto->add_enum_type()); + } + for (int i = 0; i < service_count(); i++) { + service(i)->CopyTo(proto->add_service()); + } + for (int i = 0; i < extension_count(); i++) { + extension(i)->CopyTo(proto->add_extension()); + } + + if (&options() != &FileOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void FileDescriptor::CopySourceCodeInfoTo(FileDescriptorProto* proto) const { + if (source_code_info_ != &SourceCodeInfo::default_instance()) { + proto->mutable_source_code_info()->CopyFrom(*source_code_info_); + } +} + +void Descriptor::CopyTo(DescriptorProto* proto) const { + proto->set_name(name()); + + for (int i = 0; i < field_count(); i++) { + field(i)->CopyTo(proto->add_field()); + } + for (int i = 0; i < oneof_decl_count(); i++) { + oneof_decl(i)->CopyTo(proto->add_oneof_decl()); + } + for (int i = 0; i < nested_type_count(); i++) { + nested_type(i)->CopyTo(proto->add_nested_type()); + } + for (int i = 0; i < enum_type_count(); i++) { + enum_type(i)->CopyTo(proto->add_enum_type()); + } + for (int i = 0; i < extension_range_count(); i++) { + DescriptorProto::ExtensionRange* range = proto->add_extension_range(); + range->set_start(extension_range(i)->start); + range->set_end(extension_range(i)->end); + } + for (int i = 0; i < extension_count(); i++) { + extension(i)->CopyTo(proto->add_extension()); + } + + if (&options() != &MessageOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void FieldDescriptor::CopyTo(FieldDescriptorProto* proto) const { + proto->set_name(name()); + proto->set_number(number()); + + // Some compilers do not allow static_cast directly between two enum types, + // so we must cast to int first. + proto->set_label(static_cast( + implicit_cast(label()))); + proto->set_type(static_cast( + implicit_cast(type()))); + + if (is_extension()) { + if (!containing_type()->is_unqualified_placeholder_) { + proto->set_extendee("."); + } + proto->mutable_extendee()->append(containing_type()->full_name()); + } + + if (cpp_type() == CPPTYPE_MESSAGE) { + if (message_type()->is_placeholder_) { + // We don't actually know if the type is a message type. It could be + // an enum. + proto->clear_type(); + } + + if (!message_type()->is_unqualified_placeholder_) { + proto->set_type_name("."); + } + proto->mutable_type_name()->append(message_type()->full_name()); + } else if (cpp_type() == CPPTYPE_ENUM) { + if (!enum_type()->is_unqualified_placeholder_) { + proto->set_type_name("."); + } + proto->mutable_type_name()->append(enum_type()->full_name()); + } + + if (has_default_value()) { + proto->set_default_value(DefaultValueAsString(false)); + } + + if (containing_oneof() != NULL && !is_extension()) { + proto->set_oneof_index(containing_oneof()->index()); + } + + if (&options() != &FieldOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void OneofDescriptor::CopyTo(OneofDescriptorProto* proto) const { + proto->set_name(name()); +} + +void EnumDescriptor::CopyTo(EnumDescriptorProto* proto) const { + proto->set_name(name()); + + for (int i = 0; i < value_count(); i++) { + value(i)->CopyTo(proto->add_value()); + } + + if (&options() != &EnumOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void EnumValueDescriptor::CopyTo(EnumValueDescriptorProto* proto) const { + proto->set_name(name()); + proto->set_number(number()); + + if (&options() != &EnumValueOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void ServiceDescriptor::CopyTo(ServiceDescriptorProto* proto) const { + proto->set_name(name()); + + for (int i = 0; i < method_count(); i++) { + method(i)->CopyTo(proto->add_method()); + } + + if (&options() != &ServiceOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void MethodDescriptor::CopyTo(MethodDescriptorProto* proto) const { + proto->set_name(name()); + + if (!input_type()->is_unqualified_placeholder_) { + proto->set_input_type("."); + } + proto->mutable_input_type()->append(input_type()->full_name()); + + if (!output_type()->is_unqualified_placeholder_) { + proto->set_output_type("."); + } + proto->mutable_output_type()->append(output_type()->full_name()); + + if (&options() != &MethodOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +// DebugString methods =============================================== + +namespace { + +// Used by each of the option formatters. +bool RetrieveOptions(int depth, + const Message &options, + vector *option_entries) { + option_entries->clear(); + const Reflection* reflection = options.GetReflection(); + vector fields; + reflection->ListFields(options, &fields); + for (int i = 0; i < fields.size(); i++) { + int count = 1; + bool repeated = false; + if (fields[i]->is_repeated()) { + count = reflection->FieldSize(options, fields[i]); + repeated = true; + } + for (int j = 0; j < count; j++) { + string fieldval; + if (fields[i]->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + string tmp; + TextFormat::Printer printer; + printer.SetInitialIndentLevel(depth + 1); + printer.PrintFieldValueToString(options, fields[i], + repeated ? j : -1, &tmp); + fieldval.append("{\n"); + fieldval.append(tmp); + fieldval.append(depth * 2, ' '); + fieldval.append("}"); + } else { + TextFormat::PrintFieldValueToString(options, fields[i], + repeated ? j : -1, &fieldval); + } + string name; + if (fields[i]->is_extension()) { + name = "(." + fields[i]->full_name() + ")"; + } else { + name = fields[i]->name(); + } + option_entries->push_back(name + " = " + fieldval); + } + } + return !option_entries->empty(); +} + +// Formats options that all appear together in brackets. Does not include +// brackets. +bool FormatBracketedOptions(int depth, const Message &options, string *output) { + vector all_options; + if (RetrieveOptions(depth, options, &all_options)) { + output->append(Join(all_options, ", ")); + } + return !all_options.empty(); +} + +// Formats options one per line +bool FormatLineOptions(int depth, const Message &options, string *output) { + string prefix(depth * 2, ' '); + vector all_options; + if (RetrieveOptions(depth, options, &all_options)) { + for (int i = 0; i < all_options.size(); i++) { + strings::SubstituteAndAppend(output, "$0option $1;\n", + prefix, all_options[i]); + } + } + return !all_options.empty(); +} + +} // anonymous namespace + +string FileDescriptor::DebugString() const { + string contents = "syntax = \"proto2\";\n\n"; + + set public_dependencies; + set weak_dependencies; + public_dependencies.insert(public_dependencies_, + public_dependencies_ + public_dependency_count_); + weak_dependencies.insert(weak_dependencies_, + weak_dependencies_ + weak_dependency_count_); + + for (int i = 0; i < dependency_count(); i++) { + if (public_dependencies.count(i) > 0) { + strings::SubstituteAndAppend(&contents, "import public \"$0\";\n", + dependency(i)->name()); + } else if (weak_dependencies.count(i) > 0) { + strings::SubstituteAndAppend(&contents, "import weak \"$0\";\n", + dependency(i)->name()); + } else { + strings::SubstituteAndAppend(&contents, "import \"$0\";\n", + dependency(i)->name()); + } + } + + if (!package().empty()) { + strings::SubstituteAndAppend(&contents, "package $0;\n\n", package()); + } + + if (FormatLineOptions(0, options(), &contents)) { + contents.append("\n"); // add some space if we had options + } + + for (int i = 0; i < enum_type_count(); i++) { + enum_type(i)->DebugString(0, &contents); + contents.append("\n"); + } + + // Find all the 'group' type extensions; we will not output their nested + // definitions (those will be done with their group field descriptor). + set groups; + for (int i = 0; i < extension_count(); i++) { + if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) { + groups.insert(extension(i)->message_type()); + } + } + + for (int i = 0; i < message_type_count(); i++) { + if (groups.count(message_type(i)) == 0) { + strings::SubstituteAndAppend(&contents, "message $0", + message_type(i)->name()); + message_type(i)->DebugString(0, &contents); + contents.append("\n"); + } + } + + for (int i = 0; i < service_count(); i++) { + service(i)->DebugString(&contents); + contents.append("\n"); + } + + const Descriptor* containing_type = NULL; + for (int i = 0; i < extension_count(); i++) { + if (extension(i)->containing_type() != containing_type) { + if (i > 0) contents.append("}\n\n"); + containing_type = extension(i)->containing_type(); + strings::SubstituteAndAppend(&contents, "extend .$0 {\n", + containing_type->full_name()); + } + extension(i)->DebugString(1, FieldDescriptor::PRINT_LABEL, &contents); + } + if (extension_count() > 0) contents.append("}\n\n"); + + return contents; +} + +string Descriptor::DebugString() const { + string contents; + strings::SubstituteAndAppend(&contents, "message $0", name()); + DebugString(0, &contents); + return contents; +} + +void Descriptor::DebugString(int depth, string *contents) const { + string prefix(depth * 2, ' '); + ++depth; + contents->append(" {\n"); + + FormatLineOptions(depth, options(), contents); + + // Find all the 'group' types for fields and extensions; we will not output + // their nested definitions (those will be done with their group field + // descriptor). + set groups; + for (int i = 0; i < field_count(); i++) { + if (field(i)->type() == FieldDescriptor::TYPE_GROUP) { + groups.insert(field(i)->message_type()); + } + } + for (int i = 0; i < extension_count(); i++) { + if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) { + groups.insert(extension(i)->message_type()); + } + } + + for (int i = 0; i < nested_type_count(); i++) { + if (groups.count(nested_type(i)) == 0) { + strings::SubstituteAndAppend(contents, "$0 message $1", + prefix, nested_type(i)->name()); + nested_type(i)->DebugString(depth, contents); + } + } + for (int i = 0; i < enum_type_count(); i++) { + enum_type(i)->DebugString(depth, contents); + } + for (int i = 0; i < field_count(); i++) { + if (field(i)->containing_oneof() == NULL) { + field(i)->DebugString(depth, FieldDescriptor::PRINT_LABEL, contents); + } else if (field(i)->containing_oneof()->field(0) == field(i)) { + // This is the first field in this oneof, so print the whole oneof. + field(i)->containing_oneof()->DebugString(depth, contents); + } + } + + for (int i = 0; i < extension_range_count(); i++) { + strings::SubstituteAndAppend(contents, "$0 extensions $1 to $2;\n", + prefix, + extension_range(i)->start, + extension_range(i)->end - 1); + } + + // Group extensions by what they extend, so they can be printed out together. + const Descriptor* containing_type = NULL; + for (int i = 0; i < extension_count(); i++) { + if (extension(i)->containing_type() != containing_type) { + if (i > 0) strings::SubstituteAndAppend(contents, "$0 }\n", prefix); + containing_type = extension(i)->containing_type(); + strings::SubstituteAndAppend(contents, "$0 extend .$1 {\n", + prefix, containing_type->full_name()); + } + extension(i)->DebugString( + depth + 1, FieldDescriptor::PRINT_LABEL, contents); + } + if (extension_count() > 0) + strings::SubstituteAndAppend(contents, "$0 }\n", prefix); + + strings::SubstituteAndAppend(contents, "$0}\n", prefix); +} + +string FieldDescriptor::DebugString() const { + string contents; + int depth = 0; + if (is_extension()) { + strings::SubstituteAndAppend(&contents, "extend .$0 {\n", + containing_type()->full_name()); + depth = 1; + } + DebugString(depth, PRINT_LABEL, &contents); + if (is_extension()) { + contents.append("}\n"); + } + return contents; +} + +void FieldDescriptor::DebugString(int depth, + PrintLabelFlag print_label_flag, + string *contents) const { + string prefix(depth * 2, ' '); + string field_type; + switch (type()) { + case TYPE_MESSAGE: + field_type = "." + message_type()->full_name(); + break; + case TYPE_ENUM: + field_type = "." + enum_type()->full_name(); + break; + default: + field_type = kTypeToName[type()]; + } + + string label; + if (print_label_flag == PRINT_LABEL) { + label = kLabelToName[this->label()]; + label.push_back(' '); + } + + strings::SubstituteAndAppend(contents, "$0$1$2 $3 = $4", + prefix, + label, + field_type, + type() == TYPE_GROUP ? message_type()->name() : + name(), + number()); + + bool bracketed = false; + if (has_default_value()) { + bracketed = true; + strings::SubstituteAndAppend(contents, " [default = $0", + DefaultValueAsString(true)); + } + + string formatted_options; + if (FormatBracketedOptions(depth, options(), &formatted_options)) { + contents->append(bracketed ? ", " : " ["); + bracketed = true; + contents->append(formatted_options); + } + + if (bracketed) { + contents->append("]"); + } + + if (type() == TYPE_GROUP) { + message_type()->DebugString(depth, contents); + } else { + contents->append(";\n"); + } +} + +string OneofDescriptor::DebugString() const { + string contents; + DebugString(0, &contents); + return contents; +} + +void OneofDescriptor::DebugString(int depth, string* contents) const { + string prefix(depth * 2, ' '); + ++depth; + strings::SubstituteAndAppend( + contents, "$0 oneof $1 {\n", prefix, name()); + for (int i = 0; i < field_count(); i++) { + field(i)->DebugString(depth, FieldDescriptor::OMIT_LABEL, contents); + } + strings::SubstituteAndAppend(contents, "$0}\n", prefix); +} + +string EnumDescriptor::DebugString() const { + string contents; + DebugString(0, &contents); + return contents; +} + +void EnumDescriptor::DebugString(int depth, string *contents) const { + string prefix(depth * 2, ' '); + ++depth; + strings::SubstituteAndAppend(contents, "$0enum $1 {\n", + prefix, name()); + + FormatLineOptions(depth, options(), contents); + + for (int i = 0; i < value_count(); i++) { + value(i)->DebugString(depth, contents); + } + strings::SubstituteAndAppend(contents, "$0}\n", prefix); +} + +string EnumValueDescriptor::DebugString() const { + string contents; + DebugString(0, &contents); + return contents; +} + +void EnumValueDescriptor::DebugString(int depth, string *contents) const { + string prefix(depth * 2, ' '); + strings::SubstituteAndAppend(contents, "$0$1 = $2", + prefix, name(), number()); + + string formatted_options; + if (FormatBracketedOptions(depth, options(), &formatted_options)) { + strings::SubstituteAndAppend(contents, " [$0]", formatted_options); + } + contents->append(";\n"); +} + +string ServiceDescriptor::DebugString() const { + string contents; + DebugString(&contents); + return contents; +} + +void ServiceDescriptor::DebugString(string *contents) const { + strings::SubstituteAndAppend(contents, "service $0 {\n", name()); + + FormatLineOptions(1, options(), contents); + + for (int i = 0; i < method_count(); i++) { + method(i)->DebugString(1, contents); + } + + contents->append("}\n"); +} + +string MethodDescriptor::DebugString() const { + string contents; + DebugString(0, &contents); + return contents; +} + +void MethodDescriptor::DebugString(int depth, string *contents) const { + string prefix(depth * 2, ' '); + ++depth; + strings::SubstituteAndAppend(contents, "$0rpc $1(.$2) returns (.$3)", + prefix, name(), + input_type()->full_name(), + output_type()->full_name()); + + string formatted_options; + if (FormatLineOptions(depth, options(), &formatted_options)) { + strings::SubstituteAndAppend(contents, " {\n$0$1}\n", + formatted_options, prefix); + } else { + contents->append(";\n"); + } +} + + +// Location methods =============================================== + +bool FileDescriptor::GetSourceLocation(const vector& path, + SourceLocation* out_location) const { + GOOGLE_CHECK_NOTNULL(out_location); + if (source_code_info_) { + if (const SourceCodeInfo_Location* loc = + tables_->GetSourceLocation(path, source_code_info_)) { + const RepeatedField& span = loc->span(); + if (span.size() == 3 || span.size() == 4) { + out_location->start_line = span.Get(0); + out_location->start_column = span.Get(1); + out_location->end_line = span.Get(span.size() == 3 ? 0 : 2); + out_location->end_column = span.Get(span.size() - 1); + + out_location->leading_comments = loc->leading_comments(); + out_location->trailing_comments = loc->trailing_comments(); + return true; + } + } + } + return false; +} + +bool FieldDescriptor::is_packed() const { + return is_packable() && (options_ != NULL) && options_->packed(); +} + +bool Descriptor::GetSourceLocation(SourceLocation* out_location) const { + vector path; + GetLocationPath(&path); + return file()->GetSourceLocation(path, out_location); +} + +bool FieldDescriptor::GetSourceLocation(SourceLocation* out_location) const { + vector path; + GetLocationPath(&path); + return file()->GetSourceLocation(path, out_location); +} + +bool OneofDescriptor::GetSourceLocation(SourceLocation* out_location) const { + vector path; + GetLocationPath(&path); + return containing_type()->file()->GetSourceLocation(path, out_location); +} + +bool EnumDescriptor::GetSourceLocation(SourceLocation* out_location) const { + vector path; + GetLocationPath(&path); + return file()->GetSourceLocation(path, out_location); +} + +bool MethodDescriptor::GetSourceLocation(SourceLocation* out_location) const { + vector path; + GetLocationPath(&path); + return service()->file()->GetSourceLocation(path, out_location); +} + +bool ServiceDescriptor::GetSourceLocation(SourceLocation* out_location) const { + vector path; + GetLocationPath(&path); + return file()->GetSourceLocation(path, out_location); +} + +bool EnumValueDescriptor::GetSourceLocation( + SourceLocation* out_location) const { + vector path; + GetLocationPath(&path); + return type()->file()->GetSourceLocation(path, out_location); +} + +void Descriptor::GetLocationPath(vector* output) const { + if (containing_type()) { + containing_type()->GetLocationPath(output); + output->push_back(DescriptorProto::kNestedTypeFieldNumber); + output->push_back(index()); + } else { + output->push_back(FileDescriptorProto::kMessageTypeFieldNumber); + output->push_back(index()); + } +} + +void FieldDescriptor::GetLocationPath(vector* output) const { + if (is_extension()) { + if (extension_scope() == NULL) { + output->push_back(FileDescriptorProto::kExtensionFieldNumber); + output->push_back(index()); + } else { + extension_scope()->GetLocationPath(output); + output->push_back(DescriptorProto::kExtensionFieldNumber); + output->push_back(index()); + } + } else { + containing_type()->GetLocationPath(output); + output->push_back(DescriptorProto::kFieldFieldNumber); + output->push_back(index()); + } +} + +void OneofDescriptor::GetLocationPath(vector* output) const { + containing_type()->GetLocationPath(output); + output->push_back(DescriptorProto::kOneofDeclFieldNumber); + output->push_back(index()); +} + +void EnumDescriptor::GetLocationPath(vector* output) const { + if (containing_type()) { + containing_type()->GetLocationPath(output); + output->push_back(DescriptorProto::kEnumTypeFieldNumber); + output->push_back(index()); + } else { + output->push_back(FileDescriptorProto::kEnumTypeFieldNumber); + output->push_back(index()); + } +} + +void EnumValueDescriptor::GetLocationPath(vector* output) const { + type()->GetLocationPath(output); + output->push_back(EnumDescriptorProto::kValueFieldNumber); + output->push_back(index()); +} + +void ServiceDescriptor::GetLocationPath(vector* output) const { + output->push_back(FileDescriptorProto::kServiceFieldNumber); + output->push_back(index()); +} + +void MethodDescriptor::GetLocationPath(vector* output) const { + service()->GetLocationPath(output); + output->push_back(ServiceDescriptorProto::kMethodFieldNumber); + output->push_back(index()); +} + +// =================================================================== + +namespace { + +// Represents an options message to interpret. Extension names in the option +// name are respolved relative to name_scope. element_name and orig_opt are +// used only for error reporting (since the parser records locations against +// pointers in the original options, not the mutable copy). The Message must be +// one of the Options messages in descriptor.proto. +struct OptionsToInterpret { + OptionsToInterpret(const string& ns, + const string& el, + const Message* orig_opt, + Message* opt) + : name_scope(ns), + element_name(el), + original_options(orig_opt), + options(opt) { + } + string name_scope; + string element_name; + const Message* original_options; + Message* options; +}; + +} // namespace + +class DescriptorBuilder { + public: + DescriptorBuilder(const DescriptorPool* pool, + DescriptorPool::Tables* tables, + DescriptorPool::ErrorCollector* error_collector); + ~DescriptorBuilder(); + + const FileDescriptor* BuildFile(const FileDescriptorProto& proto); + + private: + friend class OptionInterpreter; + + const DescriptorPool* pool_; + DescriptorPool::Tables* tables_; // for convenience + DescriptorPool::ErrorCollector* error_collector_; + + // As we build descriptors we store copies of the options messages in + // them. We put pointers to those copies in this vector, as we build, so we + // can later (after cross-linking) interpret those options. + vector options_to_interpret_; + + bool had_errors_; + string filename_; + FileDescriptor* file_; + FileDescriptorTables* file_tables_; + set dependencies_; + + // unused_dependency_ is used to record the unused imported files. + // Note: public import is not considered. + set unused_dependency_; + + // If LookupSymbol() finds a symbol that is in a file which is not a declared + // dependency of this file, it will fail, but will set + // possible_undeclared_dependency_ to point at that file. This is only used + // by AddNotDefinedError() to report a more useful error message. + // possible_undeclared_dependency_name_ is the name of the symbol that was + // actually found in possible_undeclared_dependency_, which may be a parent + // of the symbol actually looked for. + const FileDescriptor* possible_undeclared_dependency_; + string possible_undeclared_dependency_name_; + + // If LookupSymbol() could resolve a symbol which is not defined, + // record the resolved name. This is only used by AddNotDefinedError() + // to report a more useful error message. + string undefine_resolved_name_; + + void AddError(const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& error); + void AddError(const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const char* error); + void AddRecursiveImportError(const FileDescriptorProto& proto, int from_here); + void AddTwiceListedError(const FileDescriptorProto& proto, int index); + void AddImportError(const FileDescriptorProto& proto, int index); + + // Adds an error indicating that undefined_symbol was not defined. Must + // only be called after LookupSymbol() fails. + void AddNotDefinedError( + const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& undefined_symbol); + + void AddWarning(const string& element_name, const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& error); + + // Silly helper which determines if the given file is in the given package. + // I.e., either file->package() == package_name or file->package() is a + // nested package within package_name. + bool IsInPackage(const FileDescriptor* file, const string& package_name); + + // Helper function which finds all public dependencies of the given file, and + // stores the them in the dependencies_ set in the builder. + void RecordPublicDependencies(const FileDescriptor* file); + + // Like tables_->FindSymbol(), but additionally: + // - Search the pool's underlay if not found in tables_. + // - Insure that the resulting Symbol is from one of the file's declared + // dependencies. + Symbol FindSymbol(const string& name); + + // Like FindSymbol() but does not require that the symbol is in one of the + // file's declared dependencies. + Symbol FindSymbolNotEnforcingDeps(const string& name); + + // This implements the body of FindSymbolNotEnforcingDeps(). + Symbol FindSymbolNotEnforcingDepsHelper(const DescriptorPool* pool, + const string& name); + + // Like FindSymbol(), but looks up the name relative to some other symbol + // name. This first searches siblings of relative_to, then siblings of its + // parents, etc. For example, LookupSymbol("foo.bar", "baz.qux.corge") makes + // the following calls, returning the first non-null result: + // FindSymbol("baz.qux.foo.bar"), FindSymbol("baz.foo.bar"), + // FindSymbol("foo.bar"). If AllowUnknownDependencies() has been called + // on the DescriptorPool, this will generate a placeholder type if + // the name is not found (unless the name itself is malformed). The + // placeholder_type parameter indicates what kind of placeholder should be + // constructed in this case. The resolve_mode parameter determines whether + // any symbol is returned, or only symbols that are types. Note, however, + // that LookupSymbol may still return a non-type symbol in LOOKUP_TYPES mode, + // if it believes that's all it could refer to. The caller should always + // check that it receives the type of symbol it was expecting. + enum PlaceholderType { + PLACEHOLDER_MESSAGE, + PLACEHOLDER_ENUM, + PLACEHOLDER_EXTENDABLE_MESSAGE + }; + enum ResolveMode { + LOOKUP_ALL, LOOKUP_TYPES + }; + Symbol LookupSymbol(const string& name, const string& relative_to, + PlaceholderType placeholder_type = PLACEHOLDER_MESSAGE, + ResolveMode resolve_mode = LOOKUP_ALL); + + // Like LookupSymbol() but will not return a placeholder even if + // AllowUnknownDependencies() has been used. + Symbol LookupSymbolNoPlaceholder(const string& name, + const string& relative_to, + ResolveMode resolve_mode = LOOKUP_ALL); + + // Creates a placeholder type suitable for return from LookupSymbol(). May + // return kNullSymbol if the name is not a valid type name. + Symbol NewPlaceholder(const string& name, PlaceholderType placeholder_type); + + // Creates a placeholder file. Never returns NULL. This is used when an + // import is not found and AllowUnknownDependencies() is enabled. + const FileDescriptor* NewPlaceholderFile(const string& name); + + // Calls tables_->AddSymbol() and records an error if it fails. Returns + // true if successful or false if failed, though most callers can ignore + // the return value since an error has already been recorded. + bool AddSymbol(const string& full_name, + const void* parent, const string& name, + const Message& proto, Symbol symbol); + + // Like AddSymbol(), but succeeds if the symbol is already defined as long + // as the existing definition is also a package (because it's OK to define + // the same package in two different files). Also adds all parents of the + // packgae to the symbol table (e.g. AddPackage("foo.bar", ...) will add + // "foo.bar" and "foo" to the table). + void AddPackage(const string& name, const Message& proto, + const FileDescriptor* file); + + // Checks that the symbol name contains only alphanumeric characters and + // underscores. Records an error otherwise. + void ValidateSymbolName(const string& name, const string& full_name, + const Message& proto); + + // Like ValidateSymbolName(), but the name is allowed to contain periods and + // an error is indicated by returning false (not recording the error). + bool ValidateQualifiedName(const string& name); + + // Used by BUILD_ARRAY macro (below) to avoid having to have the type + // specified as a macro parameter. + template + inline void AllocateArray(int size, Type** output) { + *output = tables_->AllocateArray(size); + } + + // Allocates a copy of orig_options in tables_ and stores it in the + // descriptor. Remembers its uninterpreted options, to be interpreted + // later. DescriptorT must be one of the Descriptor messages from + // descriptor.proto. + template void AllocateOptions( + const typename DescriptorT::OptionsType& orig_options, + DescriptorT* descriptor); + // Specialization for FileOptions. + void AllocateOptions(const FileOptions& orig_options, + FileDescriptor* descriptor); + + // Implementation for AllocateOptions(). Don't call this directly. + template void AllocateOptionsImpl( + const string& name_scope, + const string& element_name, + const typename DescriptorT::OptionsType& orig_options, + DescriptorT* descriptor); + + // These methods all have the same signature for the sake of the BUILD_ARRAY + // macro, below. + void BuildMessage(const DescriptorProto& proto, + const Descriptor* parent, + Descriptor* result); + void BuildFieldOrExtension(const FieldDescriptorProto& proto, + const Descriptor* parent, + FieldDescriptor* result, + bool is_extension); + void BuildField(const FieldDescriptorProto& proto, + const Descriptor* parent, + FieldDescriptor* result) { + BuildFieldOrExtension(proto, parent, result, false); + } + void BuildExtension(const FieldDescriptorProto& proto, + const Descriptor* parent, + FieldDescriptor* result) { + BuildFieldOrExtension(proto, parent, result, true); + } + void BuildExtensionRange(const DescriptorProto::ExtensionRange& proto, + const Descriptor* parent, + Descriptor::ExtensionRange* result); + void BuildOneof(const OneofDescriptorProto& proto, + Descriptor* parent, + OneofDescriptor* result); + void BuildEnum(const EnumDescriptorProto& proto, + const Descriptor* parent, + EnumDescriptor* result); + void BuildEnumValue(const EnumValueDescriptorProto& proto, + const EnumDescriptor* parent, + EnumValueDescriptor* result); + void BuildService(const ServiceDescriptorProto& proto, + const void* dummy, + ServiceDescriptor* result); + void BuildMethod(const MethodDescriptorProto& proto, + const ServiceDescriptor* parent, + MethodDescriptor* result); + + void LogUnusedDependency(const FileDescriptor* result); + + // Must be run only after building. + // + // NOTE: Options will not be available during cross-linking, as they + // have not yet been interpreted. Defer any handling of options to the + // Validate*Options methods. + void CrossLinkFile(FileDescriptor* file, const FileDescriptorProto& proto); + void CrossLinkMessage(Descriptor* message, const DescriptorProto& proto); + void CrossLinkField(FieldDescriptor* field, + const FieldDescriptorProto& proto); + void CrossLinkEnum(EnumDescriptor* enum_type, + const EnumDescriptorProto& proto); + void CrossLinkEnumValue(EnumValueDescriptor* enum_value, + const EnumValueDescriptorProto& proto); + void CrossLinkService(ServiceDescriptor* service, + const ServiceDescriptorProto& proto); + void CrossLinkMethod(MethodDescriptor* method, + const MethodDescriptorProto& proto); + + // Must be run only after cross-linking. + void InterpretOptions(); + + // A helper class for interpreting options. + class OptionInterpreter { + public: + // Creates an interpreter that operates in the context of the pool of the + // specified builder, which must not be NULL. We don't take ownership of the + // builder. + explicit OptionInterpreter(DescriptorBuilder* builder); + + ~OptionInterpreter(); + + // Interprets the uninterpreted options in the specified Options message. + // On error, calls AddError() on the underlying builder and returns false. + // Otherwise returns true. + bool InterpretOptions(OptionsToInterpret* options_to_interpret); + + class AggregateOptionFinder; + + private: + // Interprets uninterpreted_option_ on the specified message, which + // must be the mutable copy of the original options message to which + // uninterpreted_option_ belongs. + bool InterpretSingleOption(Message* options); + + // Adds the uninterpreted_option to the given options message verbatim. + // Used when AllowUnknownDependencies() is in effect and we can't find + // the option's definition. + void AddWithoutInterpreting(const UninterpretedOption& uninterpreted_option, + Message* options); + + // A recursive helper function that drills into the intermediate fields + // in unknown_fields to check if field innermost_field is set on the + // innermost message. Returns false and sets an error if so. + bool ExamineIfOptionIsSet( + vector::const_iterator intermediate_fields_iter, + vector::const_iterator intermediate_fields_end, + const FieldDescriptor* innermost_field, const string& debug_msg_name, + const UnknownFieldSet& unknown_fields); + + // Validates the value for the option field of the currently interpreted + // option and then sets it on the unknown_field. + bool SetOptionValue(const FieldDescriptor* option_field, + UnknownFieldSet* unknown_fields); + + // Parses an aggregate value for a CPPTYPE_MESSAGE option and + // saves it into *unknown_fields. + bool SetAggregateOption(const FieldDescriptor* option_field, + UnknownFieldSet* unknown_fields); + + // Convenience functions to set an int field the right way, depending on + // its wire type (a single int CppType can represent multiple wire types). + void SetInt32(int number, int32 value, FieldDescriptor::Type type, + UnknownFieldSet* unknown_fields); + void SetInt64(int number, int64 value, FieldDescriptor::Type type, + UnknownFieldSet* unknown_fields); + void SetUInt32(int number, uint32 value, FieldDescriptor::Type type, + UnknownFieldSet* unknown_fields); + void SetUInt64(int number, uint64 value, FieldDescriptor::Type type, + UnknownFieldSet* unknown_fields); + + // A helper function that adds an error at the specified location of the + // option we're currently interpreting, and returns false. + bool AddOptionError(DescriptorPool::ErrorCollector::ErrorLocation location, + const string& msg) { + builder_->AddError(options_to_interpret_->element_name, + *uninterpreted_option_, location, msg); + return false; + } + + // A helper function that adds an error at the location of the option name + // and returns false. + bool AddNameError(const string& msg) { + return AddOptionError(DescriptorPool::ErrorCollector::OPTION_NAME, msg); + } + + // A helper function that adds an error at the location of the option name + // and returns false. + bool AddValueError(const string& msg) { + return AddOptionError(DescriptorPool::ErrorCollector::OPTION_VALUE, msg); + } + + // We interpret against this builder's pool. Is never NULL. We don't own + // this pointer. + DescriptorBuilder* builder_; + + // The options we're currently interpreting, or NULL if we're not in a call + // to InterpretOptions. + const OptionsToInterpret* options_to_interpret_; + + // The option we're currently interpreting within options_to_interpret_, or + // NULL if we're not in a call to InterpretOptions(). This points to a + // submessage of the original option, not the mutable copy. Therefore we + // can use it to find locations recorded by the parser. + const UninterpretedOption* uninterpreted_option_; + + // Factory used to create the dynamic messages we need to parse + // any aggregate option values we encounter. + DynamicMessageFactory dynamic_factory_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OptionInterpreter); + }; + + // Work-around for broken compilers: According to the C++ standard, + // OptionInterpreter should have access to the private members of any class + // which has declared DescriptorBuilder as a friend. Unfortunately some old + // versions of GCC and other compilers do not implement this correctly. So, + // we have to have these intermediate methods to provide access. We also + // redundantly declare OptionInterpreter a friend just to make things extra + // clear for these bad compilers. + friend class OptionInterpreter; + friend class OptionInterpreter::AggregateOptionFinder; + + static inline bool get_allow_unknown(const DescriptorPool* pool) { + return pool->allow_unknown_; + } + static inline bool get_enforce_weak(const DescriptorPool* pool) { + return pool->enforce_weak_; + } + static inline bool get_is_placeholder(const Descriptor* descriptor) { + return descriptor->is_placeholder_; + } + static inline void assert_mutex_held(const DescriptorPool* pool) { + if (pool->mutex_ != NULL) { + pool->mutex_->AssertHeld(); + } + } + + // Must be run only after options have been interpreted. + // + // NOTE: Validation code must only reference the options in the mutable + // descriptors, which are the ones that have been interpreted. The const + // proto references are passed in only so they can be provided to calls to + // AddError(). Do not look at their options, which have not been interpreted. + void ValidateFileOptions(FileDescriptor* file, + const FileDescriptorProto& proto); + void ValidateMessageOptions(Descriptor* message, + const DescriptorProto& proto); + void ValidateFieldOptions(FieldDescriptor* field, + const FieldDescriptorProto& proto); + void ValidateEnumOptions(EnumDescriptor* enm, + const EnumDescriptorProto& proto); + void ValidateEnumValueOptions(EnumValueDescriptor* enum_value, + const EnumValueDescriptorProto& proto); + void ValidateServiceOptions(ServiceDescriptor* service, + const ServiceDescriptorProto& proto); + void ValidateMethodOptions(MethodDescriptor* method, + const MethodDescriptorProto& proto); + + void ValidateMapKey(FieldDescriptor* field, + const FieldDescriptorProto& proto); + +}; + +const FileDescriptor* DescriptorPool::BuildFile( + const FileDescriptorProto& proto) { + GOOGLE_CHECK(fallback_database_ == NULL) + << "Cannot call BuildFile on a DescriptorPool that uses a " + "DescriptorDatabase. You must instead find a way to get your file " + "into the underlying database."; + GOOGLE_CHECK(mutex_ == NULL); // Implied by the above GOOGLE_CHECK. + tables_->known_bad_symbols_.clear(); + tables_->known_bad_files_.clear(); + return DescriptorBuilder(this, tables_.get(), NULL).BuildFile(proto); +} + +const FileDescriptor* DescriptorPool::BuildFileCollectingErrors( + const FileDescriptorProto& proto, + ErrorCollector* error_collector) { + GOOGLE_CHECK(fallback_database_ == NULL) + << "Cannot call BuildFile on a DescriptorPool that uses a " + "DescriptorDatabase. You must instead find a way to get your file " + "into the underlying database."; + GOOGLE_CHECK(mutex_ == NULL); // Implied by the above GOOGLE_CHECK. + tables_->known_bad_symbols_.clear(); + tables_->known_bad_files_.clear(); + return DescriptorBuilder(this, tables_.get(), + error_collector).BuildFile(proto); +} + +const FileDescriptor* DescriptorPool::BuildFileFromDatabase( + const FileDescriptorProto& proto) const { + mutex_->AssertHeld(); + if (tables_->known_bad_files_.count(proto.name()) > 0) { + return NULL; + } + const FileDescriptor* result = + DescriptorBuilder(this, tables_.get(), + default_error_collector_).BuildFile(proto); + if (result == NULL) { + tables_->known_bad_files_.insert(proto.name()); + } + return result; +} + +DescriptorBuilder::DescriptorBuilder( + const DescriptorPool* pool, + DescriptorPool::Tables* tables, + DescriptorPool::ErrorCollector* error_collector) + : pool_(pool), + tables_(tables), + error_collector_(error_collector), + had_errors_(false), + possible_undeclared_dependency_(NULL), + undefine_resolved_name_("") {} + +DescriptorBuilder::~DescriptorBuilder() {} + +void DescriptorBuilder::AddError( + const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& error) { + if (error_collector_ == NULL) { + if (!had_errors_) { + GOOGLE_LOG(ERROR) << "Invalid proto descriptor for file \"" << filename_ + << "\":"; + } + GOOGLE_LOG(ERROR) << " " << element_name << ": " << error; + } else { + error_collector_->AddError(filename_, element_name, + &descriptor, location, error); + } + had_errors_ = true; +} + +void DescriptorBuilder::AddError( + const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const char* error) { + AddError(element_name, descriptor, location, string(error)); +} + +void DescriptorBuilder::AddNotDefinedError( + const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& undefined_symbol) { + if (possible_undeclared_dependency_ == NULL && + undefine_resolved_name_.empty()) { + AddError(element_name, descriptor, location, + "\"" + undefined_symbol + "\" is not defined."); + } else { + if (possible_undeclared_dependency_ != NULL) { + AddError(element_name, descriptor, location, + "\"" + possible_undeclared_dependency_name_ + + "\" seems to be defined in \"" + + possible_undeclared_dependency_->name() + "\", which is not " + "imported by \"" + filename_ + "\". To use it here, please " + "add the necessary import."); + } + if (!undefine_resolved_name_.empty()) { + AddError(element_name, descriptor, location, + "\"" + undefined_symbol + "\" is resolved to \"" + + undefine_resolved_name_ + "\", which is not defined. " + "The innermost scope is searched first in name resolution. " + "Consider using a leading '.'(i.e., \"." + + undefined_symbol + + "\") to start from the outermost scope."); + } + } +} + +void DescriptorBuilder::AddWarning( + const string& element_name, const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& error) { + if (error_collector_ == NULL) { + GOOGLE_LOG(WARNING) << filename_ << " " << element_name << ": " << error; + } else { + error_collector_->AddWarning(filename_, element_name, &descriptor, location, + error); + } +} + +bool DescriptorBuilder::IsInPackage(const FileDescriptor* file, + const string& package_name) { + return HasPrefixString(file->package(), package_name) && + (file->package().size() == package_name.size() || + file->package()[package_name.size()] == '.'); +} + +void DescriptorBuilder::RecordPublicDependencies(const FileDescriptor* file) { + if (file == NULL || !dependencies_.insert(file).second) return; + for (int i = 0; file != NULL && i < file->public_dependency_count(); i++) { + RecordPublicDependencies(file->public_dependency(i)); + } +} + +Symbol DescriptorBuilder::FindSymbolNotEnforcingDepsHelper( + const DescriptorPool* pool, const string& name) { + // If we are looking at an underlay, we must lock its mutex_, since we are + // accessing the underlay's tables_ directly. + MutexLockMaybe lock((pool == pool_) ? NULL : pool->mutex_); + + Symbol result = pool->tables_->FindSymbol(name); + if (result.IsNull() && pool->underlay_ != NULL) { + // Symbol not found; check the underlay. + result = FindSymbolNotEnforcingDepsHelper(pool->underlay_, name); + } + + if (result.IsNull()) { + // In theory, we shouldn't need to check fallback_database_ because the + // symbol should be in one of its file's direct dependencies, and we have + // already loaded those by the time we get here. But we check anyway so + // that we can generate better error message when dependencies are missing + // (i.e., "missing dependency" rather than "type is not defined"). + if (pool->TryFindSymbolInFallbackDatabase(name)) { + result = pool->tables_->FindSymbol(name); + } + } + + return result; +} + +Symbol DescriptorBuilder::FindSymbolNotEnforcingDeps(const string& name) { + return FindSymbolNotEnforcingDepsHelper(pool_, name); +} + +Symbol DescriptorBuilder::FindSymbol(const string& name) { + Symbol result = FindSymbolNotEnforcingDeps(name); + + if (result.IsNull()) return result; + + if (!pool_->enforce_dependencies_) { + // Hack for CompilerUpgrader. + return result; + } + + // Only find symbols which were defined in this file or one of its + // dependencies. + const FileDescriptor* file = result.GetFile(); + if (file == file_ || dependencies_.count(file) > 0) { + unused_dependency_.erase(file); + return result; + } + + if (result.type == Symbol::PACKAGE) { + // Arg, this is overcomplicated. The symbol is a package name. It could + // be that the package was defined in multiple files. result.GetFile() + // returns the first file we saw that used this package. We've determined + // that that file is not a direct dependency of the file we are currently + // building, but it could be that some other file which *is* a direct + // dependency also defines the same package. We can't really rule out this + // symbol unless none of the dependencies define it. + if (IsInPackage(file_, name)) return result; + for (set::const_iterator it = dependencies_.begin(); + it != dependencies_.end(); ++it) { + // Note: A dependency may be NULL if it was not found or had errors. + if (*it != NULL && IsInPackage(*it, name)) return result; + } + } + + possible_undeclared_dependency_ = file; + possible_undeclared_dependency_name_ = name; + return kNullSymbol; +} + +Symbol DescriptorBuilder::LookupSymbolNoPlaceholder( + const string& name, const string& relative_to, ResolveMode resolve_mode) { + possible_undeclared_dependency_ = NULL; + undefine_resolved_name_.clear(); + + if (name.size() > 0 && name[0] == '.') { + // Fully-qualified name. + return FindSymbol(name.substr(1)); + } + + // If name is something like "Foo.Bar.baz", and symbols named "Foo" are + // defined in multiple parent scopes, we only want to find "Bar.baz" in the + // innermost one. E.g., the following should produce an error: + // message Bar { message Baz {} } + // message Foo { + // message Bar { + // } + // optional Bar.Baz baz = 1; + // } + // So, we look for just "Foo" first, then look for "Bar.baz" within it if + // found. + string::size_type name_dot_pos = name.find_first_of('.'); + string first_part_of_name; + if (name_dot_pos == string::npos) { + first_part_of_name = name; + } else { + first_part_of_name = name.substr(0, name_dot_pos); + } + + string scope_to_try(relative_to); + + while (true) { + // Chop off the last component of the scope. + string::size_type dot_pos = scope_to_try.find_last_of('.'); + if (dot_pos == string::npos) { + return FindSymbol(name); + } else { + scope_to_try.erase(dot_pos); + } + + // Append ".first_part_of_name" and try to find. + string::size_type old_size = scope_to_try.size(); + scope_to_try.append(1, '.'); + scope_to_try.append(first_part_of_name); + Symbol result = FindSymbol(scope_to_try); + if (!result.IsNull()) { + if (first_part_of_name.size() < name.size()) { + // name is a compound symbol, of which we only found the first part. + // Now try to look up the rest of it. + if (result.IsAggregate()) { + scope_to_try.append(name, first_part_of_name.size(), + name.size() - first_part_of_name.size()); + result = FindSymbol(scope_to_try); + if (result.IsNull()) { + undefine_resolved_name_ = scope_to_try; + } + return result; + } else { + // We found a symbol but it's not an aggregate. Continue the loop. + } + } else { + if (resolve_mode == LOOKUP_TYPES && !result.IsType()) { + // We found a symbol but it's not a type. Continue the loop. + } else { + return result; + } + } + } + + // Not found. Remove the name so we can try again. + scope_to_try.erase(old_size); + } +} + +Symbol DescriptorBuilder::LookupSymbol( + const string& name, const string& relative_to, + PlaceholderType placeholder_type, ResolveMode resolve_mode) { + Symbol result = LookupSymbolNoPlaceholder( + name, relative_to, resolve_mode); + if (result.IsNull() && pool_->allow_unknown_) { + // Not found, but AllowUnknownDependencies() is enabled. Return a + // placeholder instead. + result = NewPlaceholder(name, placeholder_type); + } + return result; +} + +Symbol DescriptorBuilder::NewPlaceholder(const string& name, + PlaceholderType placeholder_type) { + // Compute names. + const string* placeholder_full_name; + const string* placeholder_name; + const string* placeholder_package; + + if (!ValidateQualifiedName(name)) return kNullSymbol; + if (name[0] == '.') { + // Fully-qualified. + placeholder_full_name = tables_->AllocateString(name.substr(1)); + } else { + placeholder_full_name = tables_->AllocateString(name); + } + + string::size_type dotpos = placeholder_full_name->find_last_of('.'); + if (dotpos != string::npos) { + placeholder_package = tables_->AllocateString( + placeholder_full_name->substr(0, dotpos)); + placeholder_name = tables_->AllocateString( + placeholder_full_name->substr(dotpos + 1)); + } else { + placeholder_package = &internal::GetEmptyString(); + placeholder_name = placeholder_full_name; + } + + // Create the placeholders. + FileDescriptor* placeholder_file = tables_->Allocate(); + memset(placeholder_file, 0, sizeof(*placeholder_file)); + + placeholder_file->source_code_info_ = &SourceCodeInfo::default_instance(); + + placeholder_file->name_ = + tables_->AllocateString(*placeholder_full_name + ".placeholder.proto"); + placeholder_file->package_ = placeholder_package; + placeholder_file->pool_ = pool_; + placeholder_file->options_ = &FileOptions::default_instance(); + placeholder_file->tables_ = &FileDescriptorTables::kEmpty; + placeholder_file->is_placeholder_ = true; + // All other fields are zero or NULL. + + if (placeholder_type == PLACEHOLDER_ENUM) { + placeholder_file->enum_type_count_ = 1; + placeholder_file->enum_types_ = + tables_->AllocateArray(1); + + EnumDescriptor* placeholder_enum = &placeholder_file->enum_types_[0]; + memset(placeholder_enum, 0, sizeof(*placeholder_enum)); + + placeholder_enum->full_name_ = placeholder_full_name; + placeholder_enum->name_ = placeholder_name; + placeholder_enum->file_ = placeholder_file; + placeholder_enum->options_ = &EnumOptions::default_instance(); + placeholder_enum->is_placeholder_ = true; + placeholder_enum->is_unqualified_placeholder_ = (name[0] != '.'); + + // Enums must have at least one value. + placeholder_enum->value_count_ = 1; + placeholder_enum->values_ = tables_->AllocateArray(1); + + EnumValueDescriptor* placeholder_value = &placeholder_enum->values_[0]; + memset(placeholder_value, 0, sizeof(*placeholder_value)); + + placeholder_value->name_ = tables_->AllocateString("PLACEHOLDER_VALUE"); + // Note that enum value names are siblings of their type, not children. + placeholder_value->full_name_ = + placeholder_package->empty() ? placeholder_value->name_ : + tables_->AllocateString(*placeholder_package + ".PLACEHOLDER_VALUE"); + + placeholder_value->number_ = 0; + placeholder_value->type_ = placeholder_enum; + placeholder_value->options_ = &EnumValueOptions::default_instance(); + + return Symbol(placeholder_enum); + } else { + placeholder_file->message_type_count_ = 1; + placeholder_file->message_types_ = + tables_->AllocateArray(1); + + Descriptor* placeholder_message = &placeholder_file->message_types_[0]; + memset(placeholder_message, 0, sizeof(*placeholder_message)); + + placeholder_message->full_name_ = placeholder_full_name; + placeholder_message->name_ = placeholder_name; + placeholder_message->file_ = placeholder_file; + placeholder_message->options_ = &MessageOptions::default_instance(); + placeholder_message->is_placeholder_ = true; + placeholder_message->is_unqualified_placeholder_ = (name[0] != '.'); + + if (placeholder_type == PLACEHOLDER_EXTENDABLE_MESSAGE) { + placeholder_message->extension_range_count_ = 1; + placeholder_message->extension_ranges_ = + tables_->AllocateArray(1); + placeholder_message->extension_ranges_->start = 1; + // kMaxNumber + 1 because ExtensionRange::end is exclusive. + placeholder_message->extension_ranges_->end = + FieldDescriptor::kMaxNumber + 1; + } + + return Symbol(placeholder_message); + } +} + +const FileDescriptor* DescriptorBuilder::NewPlaceholderFile( + const string& name) { + FileDescriptor* placeholder = tables_->Allocate(); + memset(placeholder, 0, sizeof(*placeholder)); + + placeholder->name_ = tables_->AllocateString(name); + placeholder->package_ = &internal::GetEmptyString(); + placeholder->pool_ = pool_; + placeholder->options_ = &FileOptions::default_instance(); + placeholder->tables_ = &FileDescriptorTables::kEmpty; + placeholder->is_placeholder_ = true; + // All other fields are zero or NULL. + + return placeholder; +} + +bool DescriptorBuilder::AddSymbol( + const string& full_name, const void* parent, const string& name, + const Message& proto, Symbol symbol) { + // If the caller passed NULL for the parent, the symbol is at file scope. + // Use its file as the parent instead. + if (parent == NULL) parent = file_; + + if (tables_->AddSymbol(full_name, symbol)) { + if (!file_tables_->AddAliasUnderParent(parent, name, symbol)) { + GOOGLE_LOG(DFATAL) << "\"" << full_name << "\" not previously defined in " + "symbols_by_name_, but was defined in symbols_by_parent_; " + "this shouldn't be possible."; + return false; + } + return true; + } else { + const FileDescriptor* other_file = tables_->FindSymbol(full_name).GetFile(); + if (other_file == file_) { + string::size_type dot_pos = full_name.find_last_of('.'); + if (dot_pos == string::npos) { + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + full_name + "\" is already defined."); + } else { + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + full_name.substr(dot_pos + 1) + + "\" is already defined in \"" + + full_name.substr(0, dot_pos) + "\"."); + } + } else { + // Symbol seems to have been defined in a different file. + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + full_name + "\" is already defined in file \"" + + other_file->name() + "\"."); + } + return false; + } +} + +void DescriptorBuilder::AddPackage( + const string& name, const Message& proto, const FileDescriptor* file) { + if (tables_->AddSymbol(name, Symbol(file))) { + // Success. Also add parent package, if any. + string::size_type dot_pos = name.find_last_of('.'); + if (dot_pos == string::npos) { + // No parents. + ValidateSymbolName(name, name, proto); + } else { + // Has parent. + string* parent_name = tables_->AllocateString(name.substr(0, dot_pos)); + AddPackage(*parent_name, proto, file); + ValidateSymbolName(name.substr(dot_pos + 1), name, proto); + } + } else { + Symbol existing_symbol = tables_->FindSymbol(name); + // It's OK to redefine a package. + if (existing_symbol.type != Symbol::PACKAGE) { + // Symbol seems to have been defined in a different file. + AddError(name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + name + "\" is already defined (as something other than " + "a package) in file \"" + existing_symbol.GetFile()->name() + + "\"."); + } + } +} + +void DescriptorBuilder::ValidateSymbolName( + const string& name, const string& full_name, const Message& proto) { + if (name.empty()) { + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "Missing name."); + } else { + for (int i = 0; i < name.size(); i++) { + // I don't trust isalnum() due to locales. :( + if ((name[i] < 'a' || 'z' < name[i]) && + (name[i] < 'A' || 'Z' < name[i]) && + (name[i] < '0' || '9' < name[i]) && + (name[i] != '_')) { + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + name + "\" is not a valid identifier."); + } + } + } +} + +bool DescriptorBuilder::ValidateQualifiedName(const string& name) { + bool last_was_period = false; + + for (int i = 0; i < name.size(); i++) { + // I don't trust isalnum() due to locales. :( + if (('a' <= name[i] && name[i] <= 'z') || + ('A' <= name[i] && name[i] <= 'Z') || + ('0' <= name[i] && name[i] <= '9') || + (name[i] == '_')) { + last_was_period = false; + } else if (name[i] == '.') { + if (last_was_period) return false; + last_was_period = true; + } else { + return false; + } + } + + return !name.empty() && !last_was_period; +} + +// ------------------------------------------------------------------- + +// This generic implementation is good for all descriptors except +// FileDescriptor. +template void DescriptorBuilder::AllocateOptions( + const typename DescriptorT::OptionsType& orig_options, + DescriptorT* descriptor) { + AllocateOptionsImpl(descriptor->full_name(), descriptor->full_name(), + orig_options, descriptor); +} + +// We specialize for FileDescriptor. +void DescriptorBuilder::AllocateOptions(const FileOptions& orig_options, + FileDescriptor* descriptor) { + // We add the dummy token so that LookupSymbol does the right thing. + AllocateOptionsImpl(descriptor->package() + ".dummy", descriptor->name(), + orig_options, descriptor); +} + +template void DescriptorBuilder::AllocateOptionsImpl( + const string& name_scope, + const string& element_name, + const typename DescriptorT::OptionsType& orig_options, + DescriptorT* descriptor) { + // We need to use a dummy pointer to work around a bug in older versions of + // GCC. Otherwise, the following two lines could be replaced with: + // typename DescriptorT::OptionsType* options = + // tables_->AllocateMessage(); + typename DescriptorT::OptionsType* const dummy = NULL; + typename DescriptorT::OptionsType* options = tables_->AllocateMessage(dummy); + // Avoid using MergeFrom()/CopyFrom() in this class to make it -fno-rtti + // friendly. Without RTTI, MergeFrom() and CopyFrom() will fallback to the + // reflection based method, which requires the Descriptor. However, we are in + // the middle of building the descriptors, thus the deadlock. + options->ParseFromString(orig_options.SerializeAsString()); + descriptor->options_ = options; + + // Don't add to options_to_interpret_ unless there were uninterpreted + // options. This not only avoids unnecessary work, but prevents a + // bootstrapping problem when building descriptors for descriptor.proto. + // descriptor.proto does not contain any uninterpreted options, but + // attempting to interpret options anyway will cause + // OptionsType::GetDescriptor() to be called which may then deadlock since + // we're still trying to build it. + if (options->uninterpreted_option_size() > 0) { + options_to_interpret_.push_back( + OptionsToInterpret(name_scope, element_name, &orig_options, options)); + } +} + + +// A common pattern: We want to convert a repeated field in the descriptor +// to an array of values, calling some method to build each value. +#define BUILD_ARRAY(INPUT, OUTPUT, NAME, METHOD, PARENT) \ + OUTPUT->NAME##_count_ = INPUT.NAME##_size(); \ + AllocateArray(INPUT.NAME##_size(), &OUTPUT->NAME##s_); \ + for (int i = 0; i < INPUT.NAME##_size(); i++) { \ + METHOD(INPUT.NAME(i), PARENT, OUTPUT->NAME##s_ + i); \ + } + +void DescriptorBuilder::AddRecursiveImportError( + const FileDescriptorProto& proto, int from_here) { + string error_message("File recursively imports itself: "); + for (int i = from_here; i < tables_->pending_files_.size(); i++) { + error_message.append(tables_->pending_files_[i]); + error_message.append(" -> "); + } + error_message.append(proto.name()); + + AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, + error_message); +} + +void DescriptorBuilder::AddTwiceListedError(const FileDescriptorProto& proto, + int index) { + AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, + "Import \"" + proto.dependency(index) + "\" was listed twice."); +} + +void DescriptorBuilder::AddImportError(const FileDescriptorProto& proto, + int index) { + string message; + if (pool_->fallback_database_ == NULL) { + message = "Import \"" + proto.dependency(index) + + "\" has not been loaded."; + } else { + message = "Import \"" + proto.dependency(index) + + "\" was not found or had errors."; + } + AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, message); +} + +static bool ExistingFileMatchesProto(const FileDescriptor* existing_file, + const FileDescriptorProto& proto) { + FileDescriptorProto existing_proto; + existing_file->CopyTo(&existing_proto); + return existing_proto.SerializeAsString() == proto.SerializeAsString(); +} + +const FileDescriptor* DescriptorBuilder::BuildFile( + const FileDescriptorProto& proto) { + filename_ = proto.name(); + + // Check if the file already exists and is identical to the one being built. + // Note: This only works if the input is canonical -- that is, it + // fully-qualifies all type names, has no UninterpretedOptions, etc. + // This is fine, because this idempotency "feature" really only exists to + // accomodate one hack in the proto1->proto2 migration layer. + const FileDescriptor* existing_file = tables_->FindFile(filename_); + if (existing_file != NULL) { + // File already in pool. Compare the existing one to the input. + if (ExistingFileMatchesProto(existing_file, proto)) { + // They're identical. Return the existing descriptor. + return existing_file; + } + + // Not a match. The error will be detected and handled later. + } + + // Check to see if this file is already on the pending files list. + // TODO(kenton): Allow recursive imports? It may not work with some + // (most?) programming languages. E.g., in C++, a forward declaration + // of a type is not sufficient to allow it to be used even in a + // generated header file due to inlining. This could perhaps be + // worked around using tricks involving inserting #include statements + // mid-file, but that's pretty ugly, and I'm pretty sure there are + // some languages out there that do not allow recursive dependencies + // at all. + for (int i = 0; i < tables_->pending_files_.size(); i++) { + if (tables_->pending_files_[i] == proto.name()) { + AddRecursiveImportError(proto, i); + return NULL; + } + } + + // If we have a fallback_database_, attempt to load all dependencies now, + // before checkpointing tables_. This avoids confusion with recursive + // checkpoints. + if (pool_->fallback_database_ != NULL) { + tables_->pending_files_.push_back(proto.name()); + for (int i = 0; i < proto.dependency_size(); i++) { + if (tables_->FindFile(proto.dependency(i)) == NULL && + (pool_->underlay_ == NULL || + pool_->underlay_->FindFileByName(proto.dependency(i)) == NULL)) { + // We don't care what this returns since we'll find out below anyway. + pool_->TryFindFileInFallbackDatabase(proto.dependency(i)); + } + } + tables_->pending_files_.pop_back(); + } + + // Checkpoint the tables so that we can roll back if something goes wrong. + tables_->AddCheckpoint(); + + FileDescriptor* result = tables_->Allocate(); + file_ = result; + + result->is_placeholder_ = false; + if (proto.has_source_code_info()) { + SourceCodeInfo *info = tables_->AllocateMessage(); + info->CopyFrom(proto.source_code_info()); + result->source_code_info_ = info; + } else { + result->source_code_info_ = &SourceCodeInfo::default_instance(); + } + + file_tables_ = tables_->AllocateFileTables(); + file_->tables_ = file_tables_; + + if (!proto.has_name()) { + AddError("", proto, DescriptorPool::ErrorCollector::OTHER, + "Missing field: FileDescriptorProto.name."); + } + + result->name_ = tables_->AllocateString(proto.name()); + if (proto.has_package()) { + result->package_ = tables_->AllocateString(proto.package()); + } else { + // We cannot rely on proto.package() returning a valid string if + // proto.has_package() is false, because we might be running at static + // initialization time, in which case default values have not yet been + // initialized. + result->package_ = tables_->AllocateString(""); + } + result->pool_ = pool_; + + // Add to tables. + if (!tables_->AddFile(result)) { + AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, + "A file with this name is already in the pool."); + // Bail out early so that if this is actually the exact same file, we + // don't end up reporting that every single symbol is already defined. + tables_->RollbackToLastCheckpoint(); + return NULL; + } + if (!result->package().empty()) { + AddPackage(result->package(), proto, result); + } + + // Make sure all dependencies are loaded. + set seen_dependencies; + result->dependency_count_ = proto.dependency_size(); + result->dependencies_ = + tables_->AllocateArray(proto.dependency_size()); + unused_dependency_.clear(); + set weak_deps; + for (int i = 0; i < proto.weak_dependency_size(); ++i) { + weak_deps.insert(proto.weak_dependency(i)); + } + for (int i = 0; i < proto.dependency_size(); i++) { + if (!seen_dependencies.insert(proto.dependency(i)).second) { + AddTwiceListedError(proto, i); + } + + const FileDescriptor* dependency = tables_->FindFile(proto.dependency(i)); + if (dependency == NULL && pool_->underlay_ != NULL) { + dependency = pool_->underlay_->FindFileByName(proto.dependency(i)); + } + + if (dependency == NULL) { + if (pool_->allow_unknown_ || + (!pool_->enforce_weak_ && weak_deps.find(i) != weak_deps.end())) { + dependency = NewPlaceholderFile(proto.dependency(i)); + } else { + AddImportError(proto, i); + } + } else { + // Add to unused_dependency_ to track unused imported files. + // Note: do not track unused imported files for public import. + if (pool_->enforce_dependencies_ && + (pool_->unused_import_track_files_.find(proto.name()) != + pool_->unused_import_track_files_.end()) && + (dependency->public_dependency_count() == 0)) { + unused_dependency_.insert(dependency); + } + } + + result->dependencies_[i] = dependency; + } + + // Check public dependencies. + int public_dependency_count = 0; + result->public_dependencies_ = tables_->AllocateArray( + proto.public_dependency_size()); + for (int i = 0; i < proto.public_dependency_size(); i++) { + // Only put valid public dependency indexes. + int index = proto.public_dependency(i); + if (index >= 0 && index < proto.dependency_size()) { + result->public_dependencies_[public_dependency_count++] = index; + // Do not track unused imported files for public import. + unused_dependency_.erase(result->dependency(index)); + } else { + AddError(proto.name(), proto, + DescriptorPool::ErrorCollector::OTHER, + "Invalid public dependency index."); + } + } + result->public_dependency_count_ = public_dependency_count; + + // Build dependency set + dependencies_.clear(); + for (int i = 0; i < result->dependency_count(); i++) { + RecordPublicDependencies(result->dependency(i)); + } + + // Check weak dependencies. + int weak_dependency_count = 0; + result->weak_dependencies_ = tables_->AllocateArray( + proto.weak_dependency_size()); + for (int i = 0; i < proto.weak_dependency_size(); i++) { + int index = proto.weak_dependency(i); + if (index >= 0 && index < proto.dependency_size()) { + result->weak_dependencies_[weak_dependency_count++] = index; + } else { + AddError(proto.name(), proto, + DescriptorPool::ErrorCollector::OTHER, + "Invalid weak dependency index."); + } + } + result->weak_dependency_count_ = weak_dependency_count; + + // Convert children. + BUILD_ARRAY(proto, result, message_type, BuildMessage , NULL); + BUILD_ARRAY(proto, result, enum_type , BuildEnum , NULL); + BUILD_ARRAY(proto, result, service , BuildService , NULL); + BUILD_ARRAY(proto, result, extension , BuildExtension, NULL); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + // Note that the following steps must occur in exactly the specified order. + + // Cross-link. + CrossLinkFile(result, proto); + + // Interpret any remaining uninterpreted options gathered into + // options_to_interpret_ during descriptor building. Cross-linking has made + // extension options known, so all interpretations should now succeed. + if (!had_errors_) { + OptionInterpreter option_interpreter(this); + for (vector::iterator iter = + options_to_interpret_.begin(); + iter != options_to_interpret_.end(); ++iter) { + option_interpreter.InterpretOptions(&(*iter)); + } + options_to_interpret_.clear(); + } + + // Validate options. + if (!had_errors_) { + ValidateFileOptions(result, proto); + } + + + if (!unused_dependency_.empty()) { + LogUnusedDependency(result); + } + + if (had_errors_) { + tables_->RollbackToLastCheckpoint(); + return NULL; + } else { + tables_->ClearLastCheckpoint(); + return result; + } +} + +void DescriptorBuilder::BuildMessage(const DescriptorProto& proto, + const Descriptor* parent, + Descriptor* result) { + const string& scope = (parent == NULL) ? + file_->package() : parent->full_name(); + string* full_name = tables_->AllocateString(scope); + if (!full_name->empty()) full_name->append(1, '.'); + full_name->append(proto.name()); + + ValidateSymbolName(proto.name(), *full_name, proto); + + result->name_ = tables_->AllocateString(proto.name()); + result->full_name_ = full_name; + result->file_ = file_; + result->containing_type_ = parent; + result->is_placeholder_ = false; + result->is_unqualified_placeholder_ = false; + + // Build oneofs first so that fields and extension ranges can refer to them. + BUILD_ARRAY(proto, result, oneof_decl , BuildOneof , result); + BUILD_ARRAY(proto, result, field , BuildField , result); + BUILD_ARRAY(proto, result, nested_type , BuildMessage , result); + BUILD_ARRAY(proto, result, enum_type , BuildEnum , result); + BUILD_ARRAY(proto, result, extension_range, BuildExtensionRange, result); + BUILD_ARRAY(proto, result, extension , BuildExtension , result); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), parent, result->name(), + proto, Symbol(result)); + + // Check that no fields have numbers in extension ranges. + for (int i = 0; i < result->field_count(); i++) { + const FieldDescriptor* field = result->field(i); + for (int j = 0; j < result->extension_range_count(); j++) { + const Descriptor::ExtensionRange* range = result->extension_range(j); + if (range->start <= field->number() && field->number() < range->end) { + AddError(field->full_name(), proto.extension_range(j), + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute( + "Extension range $0 to $1 includes field \"$2\" ($3).", + range->start, range->end - 1, + field->name(), field->number())); + } + } + } + + // Check that extension ranges don't overlap. + for (int i = 0; i < result->extension_range_count(); i++) { + const Descriptor::ExtensionRange* range1 = result->extension_range(i); + for (int j = i + 1; j < result->extension_range_count(); j++) { + const Descriptor::ExtensionRange* range2 = result->extension_range(j); + if (range1->end > range2->start && range2->end > range1->start) { + AddError(result->full_name(), proto.extension_range(j), + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Extension range $0 to $1 overlaps with " + "already-defined range $2 to $3.", + range2->start, range2->end - 1, + range1->start, range1->end - 1)); + } + } + } +} + +void DescriptorBuilder::BuildFieldOrExtension(const FieldDescriptorProto& proto, + const Descriptor* parent, + FieldDescriptor* result, + bool is_extension) { + const string& scope = (parent == NULL) ? + file_->package() : parent->full_name(); + string* full_name = tables_->AllocateString(scope); + if (!full_name->empty()) full_name->append(1, '.'); + full_name->append(proto.name()); + + ValidateSymbolName(proto.name(), *full_name, proto); + + result->name_ = tables_->AllocateString(proto.name()); + result->full_name_ = full_name; + result->file_ = file_; + result->number_ = proto.number(); + result->is_extension_ = is_extension; + + // If .proto files follow the style guide then the name should already be + // lower-cased. If that's the case we can just reuse the string we already + // allocated rather than allocate a new one. + string lowercase_name(proto.name()); + LowerString(&lowercase_name); + if (lowercase_name == proto.name()) { + result->lowercase_name_ = result->name_; + } else { + result->lowercase_name_ = tables_->AllocateString(lowercase_name); + } + + // Don't bother with the above optimization for camel-case names since + // .proto files that follow the guide shouldn't be using names in this + // format, so the optimization wouldn't help much. + result->camelcase_name_ = tables_->AllocateString(ToCamelCase(proto.name())); + + // Some compilers do not allow static_cast directly between two enum types, + // so we must cast to int first. + result->type_ = static_cast( + implicit_cast(proto.type())); + result->label_ = static_cast( + implicit_cast(proto.label())); + + // An extension cannot have a required field (b/13365836). + if (result->is_extension_ && + result->label_ == FieldDescriptor::LABEL_REQUIRED) { + AddError(result->full_name(), proto, + // Error location `TYPE`: we would really like to indicate + // `LABEL`, but the `ErrorLocation` enum has no entry for this, and + // we don't necessarily know about all implementations of the + // `ErrorCollector` interface to extend them to handle the new + // error location type properly. + DescriptorPool::ErrorCollector::TYPE, + "Message extensions cannot have required fields."); + } + + // Some of these may be filled in when cross-linking. + result->containing_type_ = NULL; + result->extension_scope_ = NULL; + result->experimental_map_key_ = NULL; + result->message_type_ = NULL; + result->enum_type_ = NULL; + + result->has_default_value_ = proto.has_default_value(); + if (proto.has_default_value() && result->is_repeated()) { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Repeated fields can't have default values."); + } + + if (proto.has_type()) { + if (proto.has_default_value()) { + char* end_pos = NULL; + switch (result->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: + result->default_value_int32_ = + strtol(proto.default_value().c_str(), &end_pos, 0); + break; + case FieldDescriptor::CPPTYPE_INT64: + result->default_value_int64_ = + strto64(proto.default_value().c_str(), &end_pos, 0); + break; + case FieldDescriptor::CPPTYPE_UINT32: + result->default_value_uint32_ = + strtoul(proto.default_value().c_str(), &end_pos, 0); + break; + case FieldDescriptor::CPPTYPE_UINT64: + result->default_value_uint64_ = + strtou64(proto.default_value().c_str(), &end_pos, 0); + break; + case FieldDescriptor::CPPTYPE_FLOAT: + if (proto.default_value() == "inf") { + result->default_value_float_ = numeric_limits::infinity(); + } else if (proto.default_value() == "-inf") { + result->default_value_float_ = -numeric_limits::infinity(); + } else if (proto.default_value() == "nan") { + result->default_value_float_ = numeric_limits::quiet_NaN(); + } else { + result->default_value_float_ = + io::NoLocaleStrtod(proto.default_value().c_str(), &end_pos); + } + break; + case FieldDescriptor::CPPTYPE_DOUBLE: + if (proto.default_value() == "inf") { + result->default_value_double_ = numeric_limits::infinity(); + } else if (proto.default_value() == "-inf") { + result->default_value_double_ = -numeric_limits::infinity(); + } else if (proto.default_value() == "nan") { + result->default_value_double_ = numeric_limits::quiet_NaN(); + } else { + result->default_value_double_ = + io::NoLocaleStrtod(proto.default_value().c_str(), &end_pos); + } + break; + case FieldDescriptor::CPPTYPE_BOOL: + if (proto.default_value() == "true") { + result->default_value_bool_ = true; + } else if (proto.default_value() == "false") { + result->default_value_bool_ = false; + } else { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Boolean default must be true or false."); + } + break; + case FieldDescriptor::CPPTYPE_ENUM: + // This will be filled in when cross-linking. + result->default_value_enum_ = NULL; + break; + case FieldDescriptor::CPPTYPE_STRING: + if (result->type() == FieldDescriptor::TYPE_BYTES) { + result->default_value_string_ = tables_->AllocateString( + UnescapeCEscapeString(proto.default_value())); + } else { + result->default_value_string_ = + tables_->AllocateString(proto.default_value()); + } + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Messages can't have default values."); + result->has_default_value_ = false; + break; + } + + if (end_pos != NULL) { + // end_pos is only set non-NULL by the parsers for numeric types, above. + // This checks that the default was non-empty and had no extra junk + // after the end of the number. + if (proto.default_value().empty() || *end_pos != '\0') { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Couldn't parse default value \"" + proto.default_value() + + "\"."); + } + } + } else { + // No explicit default value + switch (result->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: + result->default_value_int32_ = 0; + break; + case FieldDescriptor::CPPTYPE_INT64: + result->default_value_int64_ = 0; + break; + case FieldDescriptor::CPPTYPE_UINT32: + result->default_value_uint32_ = 0; + break; + case FieldDescriptor::CPPTYPE_UINT64: + result->default_value_uint64_ = 0; + break; + case FieldDescriptor::CPPTYPE_FLOAT: + result->default_value_float_ = 0.0f; + break; + case FieldDescriptor::CPPTYPE_DOUBLE: + result->default_value_double_ = 0.0; + break; + case FieldDescriptor::CPPTYPE_BOOL: + result->default_value_bool_ = false; + break; + case FieldDescriptor::CPPTYPE_ENUM: + // This will be filled in when cross-linking. + result->default_value_enum_ = NULL; + break; + case FieldDescriptor::CPPTYPE_STRING: + result->default_value_string_ = &internal::GetEmptyString(); + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + break; + } + } + } + + if (result->number() <= 0) { + AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, + "Field numbers must be positive integers."); + } else if (!is_extension && result->number() > FieldDescriptor::kMaxNumber) { + // Only validate that the number is within the valid field range if it is + // not an extension. Since extension numbers are validated with the + // extendee's valid set of extension numbers, and those are in turn + // validated against the max allowed number, the check is unnecessary for + // extension fields. + // This avoids cross-linking issues that arise when attempting to check if + // the extendee is a message_set_wire_format message, which has a higher max + // on extension numbers. + AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Field numbers cannot be greater than $0.", + FieldDescriptor::kMaxNumber)); + } else if (result->number() >= FieldDescriptor::kFirstReservedNumber && + result->number() <= FieldDescriptor::kLastReservedNumber) { + AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute( + "Field numbers $0 through $1 are reserved for the protocol " + "buffer library implementation.", + FieldDescriptor::kFirstReservedNumber, + FieldDescriptor::kLastReservedNumber)); + } + + if (is_extension) { + if (!proto.has_extendee()) { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + "FieldDescriptorProto.extendee not set for extension field."); + } + + result->extension_scope_ = parent; + + if (proto.has_oneof_index()) { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::OTHER, + "FieldDescriptorProto.oneof_index should not be set for " + "extensions."); + } + + // Fill in later (maybe). + result->containing_oneof_ = NULL; + } else { + if (proto.has_extendee()) { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + "FieldDescriptorProto.extendee set for non-extension field."); + } + + result->containing_type_ = parent; + + if (proto.has_oneof_index()) { + if (proto.oneof_index() < 0 || + proto.oneof_index() >= parent->oneof_decl_count()) { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::OTHER, + strings::Substitute("FieldDescriptorProto.oneof_index $0 is " + "out of range for type \"$1\".", + proto.oneof_index(), + parent->name())); + result->containing_oneof_ = NULL; + } else { + result->containing_oneof_ = parent->oneof_decl(proto.oneof_index()); + } + } else { + result->containing_oneof_ = NULL; + } + } + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), parent, result->name(), + proto, Symbol(result)); +} + +void DescriptorBuilder::BuildExtensionRange( + const DescriptorProto::ExtensionRange& proto, + const Descriptor* parent, + Descriptor::ExtensionRange* result) { + result->start = proto.start(); + result->end = proto.end(); + if (result->start <= 0) { + AddError(parent->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + "Extension numbers must be positive integers."); + } + + // Checking of the upper bound of the extension range is deferred until after + // options interpreting. This allows messages with message_set_wire_format to + // have extensions beyond FieldDescriptor::kMaxNumber, since the extension + // numbers are actually used as int32s in the message_set_wire_format. + + if (result->start >= result->end) { + AddError(parent->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + "Extension range end number must be greater than start number."); + } +} + +void DescriptorBuilder::BuildOneof(const OneofDescriptorProto& proto, + Descriptor* parent, + OneofDescriptor* result) { + string* full_name = tables_->AllocateString(parent->full_name()); + full_name->append(1, '.'); + full_name->append(proto.name()); + + ValidateSymbolName(proto.name(), *full_name, proto); + + result->name_ = tables_->AllocateString(proto.name()); + result->full_name_ = full_name; + + result->containing_type_ = parent; + + // We need to fill these in later. + result->field_count_ = 0; + result->fields_ = NULL; + + AddSymbol(result->full_name(), parent, result->name(), + proto, Symbol(result)); +} + +void DescriptorBuilder::BuildEnum(const EnumDescriptorProto& proto, + const Descriptor* parent, + EnumDescriptor* result) { + const string& scope = (parent == NULL) ? + file_->package() : parent->full_name(); + string* full_name = tables_->AllocateString(scope); + if (!full_name->empty()) full_name->append(1, '.'); + full_name->append(proto.name()); + + ValidateSymbolName(proto.name(), *full_name, proto); + + result->name_ = tables_->AllocateString(proto.name()); + result->full_name_ = full_name; + result->file_ = file_; + result->containing_type_ = parent; + result->is_placeholder_ = false; + result->is_unqualified_placeholder_ = false; + + if (proto.value_size() == 0) { + // We cannot allow enums with no values because this would mean there + // would be no valid default value for fields of this type. + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::NAME, + "Enums must contain at least one value."); + } + + BUILD_ARRAY(proto, result, value, BuildEnumValue, result); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), parent, result->name(), + proto, Symbol(result)); +} + +void DescriptorBuilder::BuildEnumValue(const EnumValueDescriptorProto& proto, + const EnumDescriptor* parent, + EnumValueDescriptor* result) { + result->name_ = tables_->AllocateString(proto.name()); + result->number_ = proto.number(); + result->type_ = parent; + + // Note: full_name for enum values is a sibling to the parent's name, not a + // child of it. + string* full_name = tables_->AllocateString(*parent->full_name_); + full_name->resize(full_name->size() - parent->name_->size()); + full_name->append(*result->name_); + result->full_name_ = full_name; + + ValidateSymbolName(proto.name(), *full_name, proto); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + // Again, enum values are weird because we makes them appear as siblings + // of the enum type instead of children of it. So, we use + // parent->containing_type() as the value's parent. + bool added_to_outer_scope = + AddSymbol(result->full_name(), parent->containing_type(), result->name(), + proto, Symbol(result)); + + // However, we also want to be able to search for values within a single + // enum type, so we add it as a child of the enum type itself, too. + // Note: This could fail, but if it does, the error has already been + // reported by the above AddSymbol() call, so we ignore the return code. + bool added_to_inner_scope = + file_tables_->AddAliasUnderParent(parent, result->name(), Symbol(result)); + + if (added_to_inner_scope && !added_to_outer_scope) { + // This value did not conflict with any values defined in the same enum, + // but it did conflict with some other symbol defined in the enum type's + // scope. Let's print an additional error to explain this. + string outer_scope; + if (parent->containing_type() == NULL) { + outer_scope = file_->package(); + } else { + outer_scope = parent->containing_type()->full_name(); + } + + if (outer_scope.empty()) { + outer_scope = "the global scope"; + } else { + outer_scope = "\"" + outer_scope + "\""; + } + + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::NAME, + "Note that enum values use C++ scoping rules, meaning that " + "enum values are siblings of their type, not children of it. " + "Therefore, \"" + result->name() + "\" must be unique within " + + outer_scope + ", not just within \"" + parent->name() + "\"."); + } + + // An enum is allowed to define two numbers that refer to the same value. + // FindValueByNumber() should return the first such value, so we simply + // ignore AddEnumValueByNumber()'s return code. + file_tables_->AddEnumValueByNumber(result); +} + +void DescriptorBuilder::BuildService(const ServiceDescriptorProto& proto, + const void* /* dummy */, + ServiceDescriptor* result) { + string* full_name = tables_->AllocateString(file_->package()); + if (!full_name->empty()) full_name->append(1, '.'); + full_name->append(proto.name()); + + ValidateSymbolName(proto.name(), *full_name, proto); + + result->name_ = tables_->AllocateString(proto.name()); + result->full_name_ = full_name; + result->file_ = file_; + + BUILD_ARRAY(proto, result, method, BuildMethod, result); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), NULL, result->name(), + proto, Symbol(result)); +} + +void DescriptorBuilder::BuildMethod(const MethodDescriptorProto& proto, + const ServiceDescriptor* parent, + MethodDescriptor* result) { + result->name_ = tables_->AllocateString(proto.name()); + result->service_ = parent; + + string* full_name = tables_->AllocateString(parent->full_name()); + full_name->append(1, '.'); + full_name->append(*result->name_); + result->full_name_ = full_name; + + ValidateSymbolName(proto.name(), *full_name, proto); + + // These will be filled in when cross-linking. + result->input_type_ = NULL; + result->output_type_ = NULL; + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), parent, result->name(), + proto, Symbol(result)); +} + +#undef BUILD_ARRAY + +// ------------------------------------------------------------------- + +void DescriptorBuilder::CrossLinkFile( + FileDescriptor* file, const FileDescriptorProto& proto) { + if (file->options_ == NULL) { + file->options_ = &FileOptions::default_instance(); + } + + for (int i = 0; i < file->message_type_count(); i++) { + CrossLinkMessage(&file->message_types_[i], proto.message_type(i)); + } + + for (int i = 0; i < file->extension_count(); i++) { + CrossLinkField(&file->extensions_[i], proto.extension(i)); + } + + for (int i = 0; i < file->enum_type_count(); i++) { + CrossLinkEnum(&file->enum_types_[i], proto.enum_type(i)); + } + + for (int i = 0; i < file->service_count(); i++) { + CrossLinkService(&file->services_[i], proto.service(i)); + } +} + +void DescriptorBuilder::CrossLinkMessage( + Descriptor* message, const DescriptorProto& proto) { + if (message->options_ == NULL) { + message->options_ = &MessageOptions::default_instance(); + } + + for (int i = 0; i < message->nested_type_count(); i++) { + CrossLinkMessage(&message->nested_types_[i], proto.nested_type(i)); + } + + for (int i = 0; i < message->enum_type_count(); i++) { + CrossLinkEnum(&message->enum_types_[i], proto.enum_type(i)); + } + + for (int i = 0; i < message->field_count(); i++) { + CrossLinkField(&message->fields_[i], proto.field(i)); + } + + for (int i = 0; i < message->extension_count(); i++) { + CrossLinkField(&message->extensions_[i], proto.extension(i)); + } + + // Set up field array for each oneof. + + // First count the number of fields per oneof. + for (int i = 0; i < message->field_count(); i++) { + const OneofDescriptor* oneof_decl = message->field(i)->containing_oneof(); + if (oneof_decl != NULL) { + // Must go through oneof_decls_ array to get a non-const version of the + // OneofDescriptor. + ++message->oneof_decls_[oneof_decl->index()].field_count_; + } + } + + // Then allocate the arrays. + for (int i = 0; i < message->oneof_decl_count(); i++) { + OneofDescriptor* oneof_decl = &message->oneof_decls_[i]; + + if (oneof_decl->field_count() == 0) { + AddError(message->full_name() + "." + oneof_decl->name(), + proto.oneof_decl(i), + DescriptorPool::ErrorCollector::NAME, + "Oneof must have at least one field."); + } + + oneof_decl->fields_ = + tables_->AllocateArray(oneof_decl->field_count_); + oneof_decl->field_count_ = 0; + } + + // Then fill them in. + for (int i = 0; i < message->field_count(); i++) { + const OneofDescriptor* oneof_decl = message->field(i)->containing_oneof(); + if (oneof_decl != NULL) { + OneofDescriptor* mutable_oneof_decl = + &message->oneof_decls_[oneof_decl->index()]; + message->fields_[i].index_in_oneof_ = mutable_oneof_decl->field_count_; + mutable_oneof_decl->fields_[mutable_oneof_decl->field_count_++] = + message->field(i); + } + } +} + +void DescriptorBuilder::CrossLinkField( + FieldDescriptor* field, const FieldDescriptorProto& proto) { + if (field->options_ == NULL) { + field->options_ = &FieldOptions::default_instance(); + } + + if (proto.has_extendee()) { + Symbol extendee = LookupSymbol(proto.extendee(), field->full_name(), + PLACEHOLDER_EXTENDABLE_MESSAGE); + if (extendee.IsNull()) { + AddNotDefinedError(field->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + proto.extendee()); + return; + } else if (extendee.type != Symbol::MESSAGE) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + "\"" + proto.extendee() + "\" is not a message type."); + return; + } + field->containing_type_ = extendee.descriptor; + + const Descriptor::ExtensionRange* extension_range = field->containing_type() + ->FindExtensionRangeContainingNumber(field->number()); + + if (extension_range == NULL) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("\"$0\" does not declare $1 as an " + "extension number.", + field->containing_type()->full_name(), + field->number())); + } + } + + if (field->containing_oneof() != NULL) { + if (field->label() != FieldDescriptor::LABEL_OPTIONAL) { + // Note that this error will never happen when parsing .proto files. + // It can only happen if you manually construct a FileDescriptorProto + // that is incorrect. + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::NAME, + "Fields of oneofs must themselves have label LABEL_OPTIONAL."); + } + } + + if (proto.has_type_name()) { + // Assume we are expecting a message type unless the proto contains some + // evidence that it expects an enum type. This only makes a difference if + // we end up creating a placeholder. + bool expecting_enum = (proto.type() == FieldDescriptorProto::TYPE_ENUM) || + proto.has_default_value(); + + Symbol type = + LookupSymbol(proto.type_name(), field->full_name(), + expecting_enum ? PLACEHOLDER_ENUM : PLACEHOLDER_MESSAGE, + LOOKUP_TYPES); + + // If the type is a weak type, we change the type to a google.protobuf.Empty field. + if (type.IsNull() && !pool_->enforce_weak_ && proto.options().weak()) { + type = FindSymbol(kNonLinkedWeakMessageReplacementName); + } + + if (type.IsNull()) { + AddNotDefinedError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + proto.type_name()); + return; + } + + if (!proto.has_type()) { + // Choose field type based on symbol. + if (type.type == Symbol::MESSAGE) { + field->type_ = FieldDescriptor::TYPE_MESSAGE; + } else if (type.type == Symbol::ENUM) { + field->type_ = FieldDescriptor::TYPE_ENUM; + } else { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "\"" + proto.type_name() + "\" is not a type."); + return; + } + } + + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + if (type.type != Symbol::MESSAGE) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "\"" + proto.type_name() + "\" is not a message type."); + return; + } + field->message_type_ = type.descriptor; + + if (field->has_default_value()) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Messages can't have default values."); + } + } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { + if (type.type != Symbol::ENUM) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "\"" + proto.type_name() + "\" is not an enum type."); + return; + } + field->enum_type_ = type.enum_descriptor; + + if (field->enum_type()->is_placeholder_) { + // We can't look up default values for placeholder types. We'll have + // to just drop them. + field->has_default_value_ = false; + } + + if (field->has_default_value()) { + // Ensure that the default value is an identifier. Parser cannot always + // verify this because it does not have complete type information. + // N.B. that this check yields better error messages but is not + // necessary for correctness (an enum symbol must be a valid identifier + // anyway), only for better errors. + if (!io::Tokenizer::IsIdentifier(proto.default_value())) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Default value for an enum field must be an identifier."); + } else { + // We can't just use field->enum_type()->FindValueByName() here + // because that locks the pool's mutex, which we have already locked + // at this point. + Symbol default_value = + LookupSymbolNoPlaceholder(proto.default_value(), + field->enum_type()->full_name()); + + if (default_value.type == Symbol::ENUM_VALUE && + default_value.enum_value_descriptor->type() == + field->enum_type()) { + field->default_value_enum_ = default_value.enum_value_descriptor; + } else { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Enum type \"" + field->enum_type()->full_name() + + "\" has no value named \"" + proto.default_value() + + "\"."); + } + } + } else if (field->enum_type()->value_count() > 0) { + // All enums must have at least one value, or we would have reported + // an error elsewhere. We use the first defined value as the default + // if a default is not explicitly defined. + field->default_value_enum_ = field->enum_type()->value(0); + } + } else { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "Field with primitive type has type_name."); + } + } else { + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE || + field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "Field with message or enum type missing type_name."); + } + } + + // Add the field to the fields-by-number table. + // Note: We have to do this *after* cross-linking because extensions do not + // know their containing type until now. + if (!file_tables_->AddFieldByNumber(field)) { + const FieldDescriptor* conflicting_field = + file_tables_->FindFieldByNumber(field->containing_type(), + field->number()); + if (field->is_extension()) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Extension number $0 has already been used " + "in \"$1\" by extension \"$2\".", + field->number(), + field->containing_type()->full_name(), + conflicting_field->full_name())); + } else { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Field number $0 has already been used in " + "\"$1\" by field \"$2\".", + field->number(), + field->containing_type()->full_name(), + conflicting_field->name())); + } + } else { + if (field->is_extension()) { + if (!tables_->AddExtension(field)) { + const FieldDescriptor* conflicting_field = + tables_->FindExtension(field->containing_type(), field->number()); + string error_msg = strings::Substitute( + "Extension number $0 has already been used in \"$1\" by extension " + "\"$2\" defined in $3.", + field->number(), + field->containing_type()->full_name(), + conflicting_field->full_name(), + conflicting_field->file()->name()); + // Conflicting extension numbers should be an error. However, before + // turning this into an error we need to fix all existing broken + // protos first. + // TODO(xiaofeng): Change this to an error. + AddWarning(field->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, error_msg); + } + } + } + + // Add the field to the lowercase-name and camelcase-name tables. + file_tables_->AddFieldByStylizedNames(field); +} + +void DescriptorBuilder::CrossLinkEnum( + EnumDescriptor* enum_type, const EnumDescriptorProto& proto) { + if (enum_type->options_ == NULL) { + enum_type->options_ = &EnumOptions::default_instance(); + } + + for (int i = 0; i < enum_type->value_count(); i++) { + CrossLinkEnumValue(&enum_type->values_[i], proto.value(i)); + } +} + +void DescriptorBuilder::CrossLinkEnumValue( + EnumValueDescriptor* enum_value, + const EnumValueDescriptorProto& /* proto */) { + if (enum_value->options_ == NULL) { + enum_value->options_ = &EnumValueOptions::default_instance(); + } +} + +void DescriptorBuilder::CrossLinkService( + ServiceDescriptor* service, const ServiceDescriptorProto& proto) { + if (service->options_ == NULL) { + service->options_ = &ServiceOptions::default_instance(); + } + + for (int i = 0; i < service->method_count(); i++) { + CrossLinkMethod(&service->methods_[i], proto.method(i)); + } +} + +void DescriptorBuilder::CrossLinkMethod( + MethodDescriptor* method, const MethodDescriptorProto& proto) { + if (method->options_ == NULL) { + method->options_ = &MethodOptions::default_instance(); + } + + Symbol input_type = LookupSymbol(proto.input_type(), method->full_name()); + if (input_type.IsNull()) { + AddNotDefinedError(method->full_name(), proto, + DescriptorPool::ErrorCollector::INPUT_TYPE, + proto.input_type()); + } else if (input_type.type != Symbol::MESSAGE) { + AddError(method->full_name(), proto, + DescriptorPool::ErrorCollector::INPUT_TYPE, + "\"" + proto.input_type() + "\" is not a message type."); + } else { + method->input_type_ = input_type.descriptor; + } + + Symbol output_type = LookupSymbol(proto.output_type(), method->full_name()); + if (output_type.IsNull()) { + AddNotDefinedError(method->full_name(), proto, + DescriptorPool::ErrorCollector::OUTPUT_TYPE, + proto.output_type()); + } else if (output_type.type != Symbol::MESSAGE) { + AddError(method->full_name(), proto, + DescriptorPool::ErrorCollector::OUTPUT_TYPE, + "\"" + proto.output_type() + "\" is not a message type."); + } else { + method->output_type_ = output_type.descriptor; + } +} + +// ------------------------------------------------------------------- + +#define VALIDATE_OPTIONS_FROM_ARRAY(descriptor, array_name, type) \ + for (int i = 0; i < descriptor->array_name##_count(); ++i) { \ + Validate##type##Options(descriptor->array_name##s_ + i, \ + proto.array_name(i)); \ + } + +// Determine if the file uses optimize_for = LITE_RUNTIME, being careful to +// avoid problems that exist at init time. +static bool IsLite(const FileDescriptor* file) { + // TODO(kenton): I don't even remember how many of these conditions are + // actually possible. I'm just being super-safe. + return file != NULL && + &file->options() != &FileOptions::default_instance() && + file->options().optimize_for() == FileOptions::LITE_RUNTIME; +} + +void DescriptorBuilder::ValidateFileOptions(FileDescriptor* file, + const FileDescriptorProto& proto) { + VALIDATE_OPTIONS_FROM_ARRAY(file, message_type, Message); + VALIDATE_OPTIONS_FROM_ARRAY(file, enum_type, Enum); + VALIDATE_OPTIONS_FROM_ARRAY(file, service, Service); + VALIDATE_OPTIONS_FROM_ARRAY(file, extension, Field); + + // Lite files can only be imported by other Lite files. + if (!IsLite(file)) { + for (int i = 0; i < file->dependency_count(); i++) { + if (IsLite(file->dependency(i))) { + AddError( + file->name(), proto, + DescriptorPool::ErrorCollector::OTHER, + "Files that do not use optimize_for = LITE_RUNTIME cannot import " + "files which do use this option. This file is not lite, but it " + "imports \"" + file->dependency(i)->name() + "\" which is."); + break; + } + } + } +} + + +void DescriptorBuilder::ValidateMessageOptions(Descriptor* message, + const DescriptorProto& proto) { + VALIDATE_OPTIONS_FROM_ARRAY(message, field, Field); + VALIDATE_OPTIONS_FROM_ARRAY(message, nested_type, Message); + VALIDATE_OPTIONS_FROM_ARRAY(message, enum_type, Enum); + VALIDATE_OPTIONS_FROM_ARRAY(message, extension, Field); + + const int64 max_extension_range = + static_cast(message->options().message_set_wire_format() ? + kint32max : + FieldDescriptor::kMaxNumber); + for (int i = 0; i < message->extension_range_count(); ++i) { + if (message->extension_range(i)->end > max_extension_range + 1) { + AddError( + message->full_name(), proto.extension_range(i), + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Extension numbers cannot be greater than $0.", + max_extension_range)); + } + } +} + +void DescriptorBuilder::ValidateFieldOptions(FieldDescriptor* field, + const FieldDescriptorProto& proto) { + if (field->options().has_experimental_map_key()) { + ValidateMapKey(field, proto); + } + + // Only message type fields may be lazy. + if (field->options().lazy()) { + if (field->type() != FieldDescriptor::TYPE_MESSAGE) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "[lazy = true] can only be specified for submessage fields."); + } + } + + // Only repeated primitive fields may be packed. + if (field->options().packed() && !field->is_packable()) { + AddError( + field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "[packed = true] can only be specified for repeated primitive fields."); + } + + // Note: Default instance may not yet be initialized here, so we have to + // avoid reading from it. + if (field->containing_type_ != NULL && + &field->containing_type()->options() != + &MessageOptions::default_instance() && + field->containing_type()->options().message_set_wire_format()) { + if (field->is_extension()) { + if (!field->is_optional() || + field->type() != FieldDescriptor::TYPE_MESSAGE) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "Extensions of MessageSets must be optional messages."); + } + } else { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::NAME, + "MessageSets cannot have fields, only extensions."); + } + } + + // Lite extensions can only be of Lite types. + if (IsLite(field->file()) && + field->containing_type_ != NULL && + !IsLite(field->containing_type()->file())) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + "Extensions to non-lite types can only be declared in non-lite " + "files. Note that you cannot extend a non-lite type to contain " + "a lite type, but the reverse is allowed."); + } + +} + +void DescriptorBuilder::ValidateEnumOptions(EnumDescriptor* enm, + const EnumDescriptorProto& proto) { + VALIDATE_OPTIONS_FROM_ARRAY(enm, value, EnumValue); + if (!enm->options().has_allow_alias() || !enm->options().allow_alias()) { + map used_values; + for (int i = 0; i < enm->value_count(); ++i) { + const EnumValueDescriptor* enum_value = enm->value(i); + if (used_values.find(enum_value->number()) != used_values.end()) { + string error = + "\"" + enum_value->full_name() + + "\" uses the same enum value as \"" + + used_values[enum_value->number()] + "\". If this is intended, set " + "'option allow_alias = true;' to the enum definition."; + if (!enm->options().allow_alias()) { + // Generate error if duplicated enum values are explicitly disallowed. + AddError(enm->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + error); + } else { + // Generate warning if duplicated values are found but the option + // isn't set. + GOOGLE_LOG(ERROR) << error; + } + } else { + used_values[enum_value->number()] = enum_value->full_name(); + } + } + } +} + +void DescriptorBuilder::ValidateEnumValueOptions( + EnumValueDescriptor* /* enum_value */, + const EnumValueDescriptorProto& /* proto */) { + // Nothing to do so far. +} +void DescriptorBuilder::ValidateServiceOptions(ServiceDescriptor* service, + const ServiceDescriptorProto& proto) { + if (IsLite(service->file()) && + (service->file()->options().cc_generic_services() || + service->file()->options().java_generic_services())) { + AddError(service->full_name(), proto, + DescriptorPool::ErrorCollector::NAME, + "Files with optimize_for = LITE_RUNTIME cannot define services " + "unless you set both options cc_generic_services and " + "java_generic_sevices to false."); + } + + VALIDATE_OPTIONS_FROM_ARRAY(service, method, Method); +} + +void DescriptorBuilder::ValidateMethodOptions(MethodDescriptor* /* method */, + const MethodDescriptorProto& /* proto */) { + // Nothing to do so far. +} + +void DescriptorBuilder::ValidateMapKey(FieldDescriptor* field, + const FieldDescriptorProto& proto) { + if (!field->is_repeated()) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "map type is only allowed for repeated fields."); + return; + } + + if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "map type is only allowed for fields with a message type."); + return; + } + + const Descriptor* item_type = field->message_type(); + if (item_type == NULL) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "Could not find field type."); + return; + } + + // Find the field in item_type named by "experimental_map_key" + const string& key_name = field->options().experimental_map_key(); + const Symbol key_symbol = LookupSymbol( + key_name, + // We append ".key_name" to the containing type's name since + // LookupSymbol() searches for peers of the supplied name, not + // children of the supplied name. + item_type->full_name() + "." + key_name); + + if (key_symbol.IsNull() || key_symbol.field_descriptor->is_extension()) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "Could not find field named \"" + key_name + "\" in type \"" + + item_type->full_name() + "\"."); + return; + } + const FieldDescriptor* key_field = key_symbol.field_descriptor; + + if (key_field->is_repeated()) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "map_key must not name a repeated field."); + return; + } + + if (key_field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "map key must name a scalar or string field."); + return; + } + + field->experimental_map_key_ = key_field; +} + + +#undef VALIDATE_OPTIONS_FROM_ARRAY + +// ------------------------------------------------------------------- + +DescriptorBuilder::OptionInterpreter::OptionInterpreter( + DescriptorBuilder* builder) : builder_(builder) { + GOOGLE_CHECK(builder_); +} + +DescriptorBuilder::OptionInterpreter::~OptionInterpreter() { +} + +bool DescriptorBuilder::OptionInterpreter::InterpretOptions( + OptionsToInterpret* options_to_interpret) { + // Note that these may be in different pools, so we can't use the same + // descriptor and reflection objects on both. + Message* options = options_to_interpret->options; + const Message* original_options = options_to_interpret->original_options; + + bool failed = false; + options_to_interpret_ = options_to_interpret; + + // Find the uninterpreted_option field in the mutable copy of the options + // and clear them, since we're about to interpret them. + const FieldDescriptor* uninterpreted_options_field = + options->GetDescriptor()->FindFieldByName("uninterpreted_option"); + GOOGLE_CHECK(uninterpreted_options_field != NULL) + << "No field named \"uninterpreted_option\" in the Options proto."; + options->GetReflection()->ClearField(options, uninterpreted_options_field); + + // Find the uninterpreted_option field in the original options. + const FieldDescriptor* original_uninterpreted_options_field = + original_options->GetDescriptor()-> + FindFieldByName("uninterpreted_option"); + GOOGLE_CHECK(original_uninterpreted_options_field != NULL) + << "No field named \"uninterpreted_option\" in the Options proto."; + + const int num_uninterpreted_options = original_options->GetReflection()-> + FieldSize(*original_options, original_uninterpreted_options_field); + for (int i = 0; i < num_uninterpreted_options; ++i) { + uninterpreted_option_ = down_cast( + &original_options->GetReflection()->GetRepeatedMessage( + *original_options, original_uninterpreted_options_field, i)); + if (!InterpretSingleOption(options)) { + // Error already added by InterpretSingleOption(). + failed = true; + break; + } + } + // Reset these, so we don't have any dangling pointers. + uninterpreted_option_ = NULL; + options_to_interpret_ = NULL; + + if (!failed) { + // InterpretSingleOption() added the interpreted options in the + // UnknownFieldSet, in case the option isn't yet known to us. Now we + // serialize the options message and deserialize it back. That way, any + // option fields that we do happen to know about will get moved from the + // UnknownFieldSet into the real fields, and thus be available right away. + // If they are not known, that's OK too. They will get reparsed into the + // UnknownFieldSet and wait there until the message is parsed by something + // that does know about the options. + string buf; + options->AppendToString(&buf); + GOOGLE_CHECK(options->ParseFromString(buf)) + << "Protocol message serialized itself in invalid fashion."; + } + + return !failed; +} + +bool DescriptorBuilder::OptionInterpreter::InterpretSingleOption( + Message* options) { + // First do some basic validation. + if (uninterpreted_option_->name_size() == 0) { + // This should never happen unless the parser has gone seriously awry or + // someone has manually created the uninterpreted option badly. + return AddNameError("Option must have a name."); + } + if (uninterpreted_option_->name(0).name_part() == "uninterpreted_option") { + return AddNameError("Option must not use reserved name " + "\"uninterpreted_option\"."); + } + + const Descriptor* options_descriptor = NULL; + // Get the options message's descriptor from the builder's pool, so that we + // get the version that knows about any extension options declared in the + // file we're currently building. The descriptor should be there as long as + // the file we're building imported "google/protobuf/descriptors.proto". + + // Note that we use DescriptorBuilder::FindSymbolNotEnforcingDeps(), not + // DescriptorPool::FindMessageTypeByName() because we're already holding the + // pool's mutex, and the latter method locks it again. We don't use + // FindSymbol() because files that use custom options only need to depend on + // the file that defines the option, not descriptor.proto itself. + Symbol symbol = builder_->FindSymbolNotEnforcingDeps( + options->GetDescriptor()->full_name()); + if (!symbol.IsNull() && symbol.type == Symbol::MESSAGE) { + options_descriptor = symbol.descriptor; + } else { + // The options message's descriptor was not in the builder's pool, so use + // the standard version from the generated pool. We're not holding the + // generated pool's mutex, so we can search it the straightforward way. + options_descriptor = options->GetDescriptor(); + } + GOOGLE_CHECK(options_descriptor); + + // We iterate over the name parts to drill into the submessages until we find + // the leaf field for the option. As we drill down we remember the current + // submessage's descriptor in |descriptor| and the next field in that + // submessage in |field|. We also track the fields we're drilling down + // through in |intermediate_fields|. As we go, we reconstruct the full option + // name in |debug_msg_name|, for use in error messages. + const Descriptor* descriptor = options_descriptor; + const FieldDescriptor* field = NULL; + vector intermediate_fields; + string debug_msg_name = ""; + + for (int i = 0; i < uninterpreted_option_->name_size(); ++i) { + const string& name_part = uninterpreted_option_->name(i).name_part(); + if (debug_msg_name.size() > 0) { + debug_msg_name += "."; + } + if (uninterpreted_option_->name(i).is_extension()) { + debug_msg_name += "(" + name_part + ")"; + // Search for the extension's descriptor as an extension in the builder's + // pool. Note that we use DescriptorBuilder::LookupSymbol(), not + // DescriptorPool::FindExtensionByName(), for two reasons: 1) It allows + // relative lookups, and 2) because we're already holding the pool's + // mutex, and the latter method locks it again. + symbol = builder_->LookupSymbol(name_part, + options_to_interpret_->name_scope); + if (!symbol.IsNull() && symbol.type == Symbol::FIELD) { + field = symbol.field_descriptor; + } + // If we don't find the field then the field's descriptor was not in the + // builder's pool, but there's no point in looking in the generated + // pool. We require that you import the file that defines any extensions + // you use, so they must be present in the builder's pool. + } else { + debug_msg_name += name_part; + // Search for the field's descriptor as a regular field. + field = descriptor->FindFieldByName(name_part); + } + + if (field == NULL) { + if (get_allow_unknown(builder_->pool_)) { + // We can't find the option, but AllowUnknownDependencies() is enabled, + // so we will just leave it as uninterpreted. + AddWithoutInterpreting(*uninterpreted_option_, options); + return true; + } else if (!(builder_->undefine_resolved_name_).empty()) { + // Option is resolved to a name which is not defined. + return AddNameError( + "Option \"" + debug_msg_name + "\" is resolved to \"(" + + builder_->undefine_resolved_name_ + + ")\", which is not defined. The innermost scope is searched first " + "in name resolution. Consider using a leading '.'(i.e., \"(." + + debug_msg_name.substr(1) + + "\") to start from the outermost scope."); + } else { + return AddNameError("Option \"" + debug_msg_name + "\" unknown."); + } + } else if (field->containing_type() != descriptor) { + if (get_is_placeholder(field->containing_type())) { + // The field is an extension of a placeholder type, so we can't + // reliably verify whether it is a valid extension to use here (e.g. + // we don't know if it is an extension of the correct *Options message, + // or if it has a valid field number, etc.). Just leave it as + // uninterpreted instead. + AddWithoutInterpreting(*uninterpreted_option_, options); + return true; + } else { + // This can only happen if, due to some insane misconfiguration of the + // pools, we find the options message in one pool but the field in + // another. This would probably imply a hefty bug somewhere. + return AddNameError("Option field \"" + debug_msg_name + + "\" is not a field or extension of message \"" + + descriptor->name() + "\"."); + } + } else if (i < uninterpreted_option_->name_size() - 1) { + if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { + return AddNameError("Option \"" + debug_msg_name + + "\" is an atomic type, not a message."); + } else if (field->is_repeated()) { + return AddNameError("Option field \"" + debug_msg_name + + "\" is a repeated message. Repeated message " + "options must be initialized using an " + "aggregate value."); + } else { + // Drill down into the submessage. + intermediate_fields.push_back(field); + descriptor = field->message_type(); + } + } + } + + // We've found the leaf field. Now we use UnknownFieldSets to set its value + // on the options message. We do so because the message may not yet know + // about its extension fields, so we may not be able to set the fields + // directly. But the UnknownFieldSets will serialize to the same wire-format + // message, so reading that message back in once the extension fields are + // known will populate them correctly. + + // First see if the option is already set. + if (!field->is_repeated() && !ExamineIfOptionIsSet( + intermediate_fields.begin(), + intermediate_fields.end(), + field, debug_msg_name, + options->GetReflection()->GetUnknownFields(*options))) { + return false; // ExamineIfOptionIsSet() already added the error. + } + + + // First set the value on the UnknownFieldSet corresponding to the + // innermost message. + scoped_ptr unknown_fields(new UnknownFieldSet()); + if (!SetOptionValue(field, unknown_fields.get())) { + return false; // SetOptionValue() already added the error. + } + + // Now wrap the UnknownFieldSet with UnknownFieldSets corresponding to all + // the intermediate messages. + for (vector::reverse_iterator iter = + intermediate_fields.rbegin(); + iter != intermediate_fields.rend(); ++iter) { + scoped_ptr parent_unknown_fields(new UnknownFieldSet()); + switch ((*iter)->type()) { + case FieldDescriptor::TYPE_MESSAGE: { + io::StringOutputStream outstr( + parent_unknown_fields->AddLengthDelimited((*iter)->number())); + io::CodedOutputStream out(&outstr); + internal::WireFormat::SerializeUnknownFields(*unknown_fields, &out); + GOOGLE_CHECK(!out.HadError()) + << "Unexpected failure while serializing option submessage " + << debug_msg_name << "\"."; + break; + } + + case FieldDescriptor::TYPE_GROUP: { + parent_unknown_fields->AddGroup((*iter)->number()) + ->MergeFrom(*unknown_fields); + break; + } + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_MESSAGE: " + << (*iter)->type(); + return false; + } + unknown_fields.reset(parent_unknown_fields.release()); + } + + // Now merge the UnknownFieldSet corresponding to the top-level message into + // the options message. + options->GetReflection()->MutableUnknownFields(options)->MergeFrom( + *unknown_fields); + + return true; +} + +void DescriptorBuilder::OptionInterpreter::AddWithoutInterpreting( + const UninterpretedOption& uninterpreted_option, Message* options) { + const FieldDescriptor* field = + options->GetDescriptor()->FindFieldByName("uninterpreted_option"); + GOOGLE_CHECK(field != NULL); + + options->GetReflection()->AddMessage(options, field) + ->CopyFrom(uninterpreted_option); +} + +bool DescriptorBuilder::OptionInterpreter::ExamineIfOptionIsSet( + vector::const_iterator intermediate_fields_iter, + vector::const_iterator intermediate_fields_end, + const FieldDescriptor* innermost_field, const string& debug_msg_name, + const UnknownFieldSet& unknown_fields) { + // We do linear searches of the UnknownFieldSet and its sub-groups. This + // should be fine since it's unlikely that any one options structure will + // contain more than a handful of options. + + if (intermediate_fields_iter == intermediate_fields_end) { + // We're at the innermost submessage. + for (int i = 0; i < unknown_fields.field_count(); i++) { + if (unknown_fields.field(i).number() == innermost_field->number()) { + return AddNameError("Option \"" + debug_msg_name + + "\" was already set."); + } + } + return true; + } + + for (int i = 0; i < unknown_fields.field_count(); i++) { + if (unknown_fields.field(i).number() == + (*intermediate_fields_iter)->number()) { + const UnknownField* unknown_field = &unknown_fields.field(i); + FieldDescriptor::Type type = (*intermediate_fields_iter)->type(); + // Recurse into the next submessage. + switch (type) { + case FieldDescriptor::TYPE_MESSAGE: + if (unknown_field->type() == UnknownField::TYPE_LENGTH_DELIMITED) { + UnknownFieldSet intermediate_unknown_fields; + if (intermediate_unknown_fields.ParseFromString( + unknown_field->length_delimited()) && + !ExamineIfOptionIsSet(intermediate_fields_iter + 1, + intermediate_fields_end, + innermost_field, debug_msg_name, + intermediate_unknown_fields)) { + return false; // Error already added. + } + } + break; + + case FieldDescriptor::TYPE_GROUP: + if (unknown_field->type() == UnknownField::TYPE_GROUP) { + if (!ExamineIfOptionIsSet(intermediate_fields_iter + 1, + intermediate_fields_end, + innermost_field, debug_msg_name, + unknown_field->group())) { + return false; // Error already added. + } + } + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_MESSAGE: " << type; + return false; + } + } + } + return true; +} + +bool DescriptorBuilder::OptionInterpreter::SetOptionValue( + const FieldDescriptor* option_field, + UnknownFieldSet* unknown_fields) { + // We switch on the CppType to validate. + switch (option_field->cpp_type()) { + + case FieldDescriptor::CPPTYPE_INT32: + if (uninterpreted_option_->has_positive_int_value()) { + if (uninterpreted_option_->positive_int_value() > + static_cast(kint32max)) { + return AddValueError("Value out of range for int32 option \"" + + option_field->full_name() + "\"."); + } else { + SetInt32(option_field->number(), + uninterpreted_option_->positive_int_value(), + option_field->type(), unknown_fields); + } + } else if (uninterpreted_option_->has_negative_int_value()) { + if (uninterpreted_option_->negative_int_value() < + static_cast(kint32min)) { + return AddValueError("Value out of range for int32 option \"" + + option_field->full_name() + "\"."); + } else { + SetInt32(option_field->number(), + uninterpreted_option_->negative_int_value(), + option_field->type(), unknown_fields); + } + } else { + return AddValueError("Value must be integer for int32 option \"" + + option_field->full_name() + "\"."); + } + break; + + case FieldDescriptor::CPPTYPE_INT64: + if (uninterpreted_option_->has_positive_int_value()) { + if (uninterpreted_option_->positive_int_value() > + static_cast(kint64max)) { + return AddValueError("Value out of range for int64 option \"" + + option_field->full_name() + "\"."); + } else { + SetInt64(option_field->number(), + uninterpreted_option_->positive_int_value(), + option_field->type(), unknown_fields); + } + } else if (uninterpreted_option_->has_negative_int_value()) { + SetInt64(option_field->number(), + uninterpreted_option_->negative_int_value(), + option_field->type(), unknown_fields); + } else { + return AddValueError("Value must be integer for int64 option \"" + + option_field->full_name() + "\"."); + } + break; + + case FieldDescriptor::CPPTYPE_UINT32: + if (uninterpreted_option_->has_positive_int_value()) { + if (uninterpreted_option_->positive_int_value() > kuint32max) { + return AddValueError("Value out of range for uint32 option \"" + + option_field->name() + "\"."); + } else { + SetUInt32(option_field->number(), + uninterpreted_option_->positive_int_value(), + option_field->type(), unknown_fields); + } + } else { + return AddValueError("Value must be non-negative integer for uint32 " + "option \"" + option_field->full_name() + "\"."); + } + break; + + case FieldDescriptor::CPPTYPE_UINT64: + if (uninterpreted_option_->has_positive_int_value()) { + SetUInt64(option_field->number(), + uninterpreted_option_->positive_int_value(), + option_field->type(), unknown_fields); + } else { + return AddValueError("Value must be non-negative integer for uint64 " + "option \"" + option_field->full_name() + "\"."); + } + break; + + case FieldDescriptor::CPPTYPE_FLOAT: { + float value; + if (uninterpreted_option_->has_double_value()) { + value = uninterpreted_option_->double_value(); + } else if (uninterpreted_option_->has_positive_int_value()) { + value = uninterpreted_option_->positive_int_value(); + } else if (uninterpreted_option_->has_negative_int_value()) { + value = uninterpreted_option_->negative_int_value(); + } else { + return AddValueError("Value must be number for float option \"" + + option_field->full_name() + "\"."); + } + unknown_fields->AddFixed32(option_field->number(), + google::protobuf::internal::WireFormatLite::EncodeFloat(value)); + break; + } + + case FieldDescriptor::CPPTYPE_DOUBLE: { + double value; + if (uninterpreted_option_->has_double_value()) { + value = uninterpreted_option_->double_value(); + } else if (uninterpreted_option_->has_positive_int_value()) { + value = uninterpreted_option_->positive_int_value(); + } else if (uninterpreted_option_->has_negative_int_value()) { + value = uninterpreted_option_->negative_int_value(); + } else { + return AddValueError("Value must be number for double option \"" + + option_field->full_name() + "\"."); + } + unknown_fields->AddFixed64(option_field->number(), + google::protobuf::internal::WireFormatLite::EncodeDouble(value)); + break; + } + + case FieldDescriptor::CPPTYPE_BOOL: + uint64 value; + if (!uninterpreted_option_->has_identifier_value()) { + return AddValueError("Value must be identifier for boolean option " + "\"" + option_field->full_name() + "\"."); + } + if (uninterpreted_option_->identifier_value() == "true") { + value = 1; + } else if (uninterpreted_option_->identifier_value() == "false") { + value = 0; + } else { + return AddValueError("Value must be \"true\" or \"false\" for boolean " + "option \"" + option_field->full_name() + "\"."); + } + unknown_fields->AddVarint(option_field->number(), value); + break; + + case FieldDescriptor::CPPTYPE_ENUM: { + if (!uninterpreted_option_->has_identifier_value()) { + return AddValueError("Value must be identifier for enum-valued option " + "\"" + option_field->full_name() + "\"."); + } + const EnumDescriptor* enum_type = option_field->enum_type(); + const string& value_name = uninterpreted_option_->identifier_value(); + const EnumValueDescriptor* enum_value = NULL; + + if (enum_type->file()->pool() != DescriptorPool::generated_pool()) { + // Note that the enum value's fully-qualified name is a sibling of the + // enum's name, not a child of it. + string fully_qualified_name = enum_type->full_name(); + fully_qualified_name.resize(fully_qualified_name.size() - + enum_type->name().size()); + fully_qualified_name += value_name; + + // Search for the enum value's descriptor in the builder's pool. Note + // that we use DescriptorBuilder::FindSymbolNotEnforcingDeps(), not + // DescriptorPool::FindEnumValueByName() because we're already holding + // the pool's mutex, and the latter method locks it again. + Symbol symbol = + builder_->FindSymbolNotEnforcingDeps(fully_qualified_name); + if (!symbol.IsNull() && symbol.type == Symbol::ENUM_VALUE) { + if (symbol.enum_value_descriptor->type() != enum_type) { + return AddValueError("Enum type \"" + enum_type->full_name() + + "\" has no value named \"" + value_name + "\" for option \"" + + option_field->full_name() + + "\". This appears to be a value from a sibling type."); + } else { + enum_value = symbol.enum_value_descriptor; + } + } + } else { + // The enum type is in the generated pool, so we can search for the + // value there. + enum_value = enum_type->FindValueByName(value_name); + } + + if (enum_value == NULL) { + return AddValueError("Enum type \"" + + option_field->enum_type()->full_name() + + "\" has no value named \"" + value_name + "\" for " + "option \"" + option_field->full_name() + "\"."); + } else { + // Sign-extension is not a problem, since we cast directly from int32 to + // uint64, without first going through uint32. + unknown_fields->AddVarint(option_field->number(), + static_cast(static_cast(enum_value->number()))); + } + break; + } + + case FieldDescriptor::CPPTYPE_STRING: + if (!uninterpreted_option_->has_string_value()) { + return AddValueError("Value must be quoted string for string option " + "\"" + option_field->full_name() + "\"."); + } + // The string has already been unquoted and unescaped by the parser. + unknown_fields->AddLengthDelimited(option_field->number(), + uninterpreted_option_->string_value()); + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: + if (!SetAggregateOption(option_field, unknown_fields)) { + return false; + } + break; + } + + return true; +} + +class DescriptorBuilder::OptionInterpreter::AggregateOptionFinder + : public TextFormat::Finder { + public: + DescriptorBuilder* builder_; + + virtual const FieldDescriptor* FindExtension( + Message* message, const string& name) const { + assert_mutex_held(builder_->pool_); + const Descriptor* descriptor = message->GetDescriptor(); + Symbol result = builder_->LookupSymbolNoPlaceholder( + name, descriptor->full_name()); + if (result.type == Symbol::FIELD && + result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else if (result.type == Symbol::MESSAGE && + descriptor->options().message_set_wire_format()) { + const Descriptor* foreign_type = result.descriptor; + // The text format allows MessageSet items to be specified using + // the type name, rather than the extension identifier. If the symbol + // lookup returned a Message, and the enclosing Message has + // message_set_wire_format = true, then return the message set + // extension, if one exists. + for (int i = 0; i < foreign_type->extension_count(); i++) { + const FieldDescriptor* extension = foreign_type->extension(i); + if (extension->containing_type() == descriptor && + extension->type() == FieldDescriptor::TYPE_MESSAGE && + extension->is_optional() && + extension->message_type() == foreign_type) { + // Found it. + return extension; + } + } + } + return NULL; + } +}; + +// A custom error collector to record any text-format parsing errors +namespace { +class AggregateErrorCollector : public io::ErrorCollector { + public: + string error_; + + virtual void AddError(int /* line */, int /* column */, + const string& message) { + if (!error_.empty()) { + error_ += "; "; + } + error_ += message; + } + + virtual void AddWarning(int /* line */, int /* column */, + const string& /* message */) { + // Ignore warnings + } +}; +} + +// We construct a dynamic message of the type corresponding to +// option_field, parse the supplied text-format string into this +// message, and serialize the resulting message to produce the value. +bool DescriptorBuilder::OptionInterpreter::SetAggregateOption( + const FieldDescriptor* option_field, + UnknownFieldSet* unknown_fields) { + if (!uninterpreted_option_->has_aggregate_value()) { + return AddValueError("Option \"" + option_field->full_name() + + "\" is a message. To set the entire message, use " + "syntax like \"" + option_field->name() + + " = { }\". " + "To set fields within it, use " + "syntax like \"" + option_field->name() + + ".foo = value\"."); + } + + const Descriptor* type = option_field->message_type(); + scoped_ptr dynamic(dynamic_factory_.GetPrototype(type)->New()); + GOOGLE_CHECK(dynamic.get() != NULL) + << "Could not create an instance of " << option_field->DebugString(); + + AggregateErrorCollector collector; + AggregateOptionFinder finder; + finder.builder_ = builder_; + TextFormat::Parser parser; + parser.RecordErrorsTo(&collector); + parser.SetFinder(&finder); + if (!parser.ParseFromString(uninterpreted_option_->aggregate_value(), + dynamic.get())) { + AddValueError("Error while parsing option value for \"" + + option_field->name() + "\": " + collector.error_); + return false; + } else { + string serial; + dynamic->SerializeToString(&serial); // Never fails + if (option_field->type() == FieldDescriptor::TYPE_MESSAGE) { + unknown_fields->AddLengthDelimited(option_field->number(), serial); + } else { + GOOGLE_CHECK_EQ(option_field->type(), FieldDescriptor::TYPE_GROUP); + UnknownFieldSet* group = unknown_fields->AddGroup(option_field->number()); + group->ParseFromString(serial); + } + return true; + } +} + +void DescriptorBuilder::OptionInterpreter::SetInt32(int number, int32 value, + FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { + switch (type) { + case FieldDescriptor::TYPE_INT32: + unknown_fields->AddVarint(number, + static_cast(static_cast(value))); + break; + + case FieldDescriptor::TYPE_SFIXED32: + unknown_fields->AddFixed32(number, static_cast(value)); + break; + + case FieldDescriptor::TYPE_SINT32: + unknown_fields->AddVarint(number, + google::protobuf::internal::WireFormatLite::ZigZagEncode32(value)); + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_INT32: " << type; + break; + } +} + +void DescriptorBuilder::OptionInterpreter::SetInt64(int number, int64 value, + FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { + switch (type) { + case FieldDescriptor::TYPE_INT64: + unknown_fields->AddVarint(number, static_cast(value)); + break; + + case FieldDescriptor::TYPE_SFIXED64: + unknown_fields->AddFixed64(number, static_cast(value)); + break; + + case FieldDescriptor::TYPE_SINT64: + unknown_fields->AddVarint(number, + google::protobuf::internal::WireFormatLite::ZigZagEncode64(value)); + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_INT64: " << type; + break; + } +} + +void DescriptorBuilder::OptionInterpreter::SetUInt32(int number, uint32 value, + FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { + switch (type) { + case FieldDescriptor::TYPE_UINT32: + unknown_fields->AddVarint(number, static_cast(value)); + break; + + case FieldDescriptor::TYPE_FIXED32: + unknown_fields->AddFixed32(number, static_cast(value)); + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_UINT32: " << type; + break; + } +} + +void DescriptorBuilder::OptionInterpreter::SetUInt64(int number, uint64 value, + FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { + switch (type) { + case FieldDescriptor::TYPE_UINT64: + unknown_fields->AddVarint(number, value); + break; + + case FieldDescriptor::TYPE_FIXED64: + unknown_fields->AddFixed64(number, value); + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_UINT64: " << type; + break; + } +} + +void DescriptorBuilder::LogUnusedDependency(const FileDescriptor* result) { + + if (!unused_dependency_.empty()) { + std::set annotation_extensions; + annotation_extensions.insert("google.protobuf.MessageOptions"); + annotation_extensions.insert("google.protobuf.FileOptions"); + annotation_extensions.insert("google.protobuf.FieldOptions"); + annotation_extensions.insert("google.protobuf.EnumOptions"); + annotation_extensions.insert("google.protobuf.EnumValueOptions"); + annotation_extensions.insert("google.protobuf.ServiceOptions"); + annotation_extensions.insert("google.protobuf.MethodOptions"); + annotation_extensions.insert("google.protobuf.StreamOptions"); + for (set::const_iterator + it = unused_dependency_.begin(); + it != unused_dependency_.end(); ++it) { + // Do not log warnings for proto files which extend annotations. + int i; + for (i = 0 ; i < (*it)->extension_count(); ++i) { + if (annotation_extensions.find( + (*it)->extension(i)->containing_type()->full_name()) + != annotation_extensions.end()) { + break; + } + } + // Log warnings for unused imported files. + if (i == (*it)->extension_count()) { + GOOGLE_LOG(WARNING) << "Warning: Unused import: \"" << result->name() + << "\" imports \"" << (*it)->name() + << "\" which is not used."; + } + } + } +} + +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/descriptor.h b/toolkit/components/protobuf/src/google/protobuf/descriptor.h new file mode 100644 index 0000000000000..67afc774dbd00 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/descriptor.h @@ -0,0 +1,1691 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains classes which describe a type of protocol message. +// You can use a message's descriptor to learn at runtime what fields +// it contains and what the types of those fields are. The Message +// interface also allows you to dynamically access and modify individual +// fields by passing the FieldDescriptor of the field you are interested +// in. +// +// Most users will not care about descriptors, because they will write +// code specific to certain protocol types and will simply use the classes +// generated by the protocol compiler directly. Advanced users who want +// to operate on arbitrary types (not known at compile time) may want to +// read descriptors in order to learn about the contents of a message. +// A very small number of users will want to construct their own +// Descriptors, either because they are implementing Message manually or +// because they are writing something like the protocol compiler. +// +// For an example of how you might use descriptors, see the code example +// at the top of message.h. + +#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_H__ +#define GOOGLE_PROTOBUF_DESCRIPTOR_H__ + +#include +#include +#include +#include + + +namespace google { +namespace protobuf { + +// Defined in this file. +class Descriptor; +class FieldDescriptor; +class OneofDescriptor; +class EnumDescriptor; +class EnumValueDescriptor; +class ServiceDescriptor; +class MethodDescriptor; +class FileDescriptor; +class DescriptorDatabase; +class DescriptorPool; + +// Defined in descriptor.proto +class DescriptorProto; +class FieldDescriptorProto; +class OneofDescriptorProto; +class EnumDescriptorProto; +class EnumValueDescriptorProto; +class ServiceDescriptorProto; +class MethodDescriptorProto; +class FileDescriptorProto; +class MessageOptions; +class FieldOptions; +class EnumOptions; +class EnumValueOptions; +class ServiceOptions; +class MethodOptions; +class FileOptions; +class UninterpretedOption; +class SourceCodeInfo; + +// Defined in message.h +class Message; + +// Defined in descriptor.cc +class DescriptorBuilder; +class FileDescriptorTables; + +// Defined in unknown_field_set.h. +class UnknownField; + +// NB, all indices are zero-based. +struct SourceLocation { + int start_line; + int end_line; + int start_column; + int end_column; + + // Doc comments found at the source location. + // TODO(kenton): Maybe this struct should have been named SourceInfo or + // something instead. Oh well. + string leading_comments; + string trailing_comments; +}; + +// Describes a type of protocol message, or a particular group within a +// message. To obtain the Descriptor for a given message object, call +// Message::GetDescriptor(). Generated message classes also have a +// static method called descriptor() which returns the type's descriptor. +// Use DescriptorPool to construct your own descriptors. +class LIBPROTOBUF_EXPORT Descriptor { + public: + // The name of the message type, not including its scope. + const string& name() const; + + // The fully-qualified name of the message type, scope delimited by + // periods. For example, message type "Foo" which is declared in package + // "bar" has full name "bar.Foo". If a type "Baz" is nested within + // Foo, Baz's full_name is "bar.Foo.Baz". To get only the part that + // comes after the last '.', use name(). + const string& full_name() const; + + // Index of this descriptor within the file or containing type's message + // type array. + int index() const; + + // The .proto file in which this message type was defined. Never NULL. + const FileDescriptor* file() const; + + // If this Descriptor describes a nested type, this returns the type + // in which it is nested. Otherwise, returns NULL. + const Descriptor* containing_type() const; + + // Get options for this message type. These are specified in the .proto file + // by placing lines like "option foo = 1234;" in the message definition. + // Allowed options are defined by MessageOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const MessageOptions& options() const; + + // Write the contents of this Descriptor into the given DescriptorProto. + // The target DescriptorProto must be clear before calling this; if it + // isn't, the result may be garbage. + void CopyTo(DescriptorProto* proto) const; + + // Write the contents of this decriptor in a human-readable form. Output + // will be suitable for re-parsing. + string DebugString() const; + + // Returns true if this is a placeholder for an unknown type. This will + // only be the case if this descriptor comes from a DescriptorPool + // with AllowUnknownDependencies() set. + bool is_placeholder() const; + + // Field stuff ----------------------------------------------------- + + // The number of fields in this message type. + int field_count() const; + // Gets a field by index, where 0 <= index < field_count(). + // These are returned in the order they were defined in the .proto file. + const FieldDescriptor* field(int index) const; + + // Looks up a field by declared tag number. Returns NULL if no such field + // exists. + const FieldDescriptor* FindFieldByNumber(int number) const; + // Looks up a field by name. Returns NULL if no such field exists. + const FieldDescriptor* FindFieldByName(const string& name) const; + + // Looks up a field by lowercased name (as returned by lowercase_name()). + // This lookup may be ambiguous if multiple field names differ only by case, + // in which case the field returned is chosen arbitrarily from the matches. + const FieldDescriptor* FindFieldByLowercaseName( + const string& lowercase_name) const; + + // Looks up a field by camel-case name (as returned by camelcase_name()). + // This lookup may be ambiguous if multiple field names differ in a way that + // leads them to have identical camel-case names, in which case the field + // returned is chosen arbitrarily from the matches. + const FieldDescriptor* FindFieldByCamelcaseName( + const string& camelcase_name) const; + + // The number of oneofs in this message type. + int oneof_decl_count() const; + // Get a oneof by index, where 0 <= index < oneof_decl_count(). + // These are returned in the order they were defined in the .proto file. + const OneofDescriptor* oneof_decl(int index) const; + + // Looks up a oneof by name. Returns NULL if no such oneof exists. + const OneofDescriptor* FindOneofByName(const string& name) const; + + // Nested type stuff ----------------------------------------------- + + // The number of nested types in this message type. + int nested_type_count() const; + // Gets a nested type by index, where 0 <= index < nested_type_count(). + // These are returned in the order they were defined in the .proto file. + const Descriptor* nested_type(int index) const; + + // Looks up a nested type by name. Returns NULL if no such nested type + // exists. + const Descriptor* FindNestedTypeByName(const string& name) const; + + // Enum stuff ------------------------------------------------------ + + // The number of enum types in this message type. + int enum_type_count() const; + // Gets an enum type by index, where 0 <= index < enum_type_count(). + // These are returned in the order they were defined in the .proto file. + const EnumDescriptor* enum_type(int index) const; + + // Looks up an enum type by name. Returns NULL if no such enum type exists. + const EnumDescriptor* FindEnumTypeByName(const string& name) const; + + // Looks up an enum value by name, among all enum types in this message. + // Returns NULL if no such value exists. + const EnumValueDescriptor* FindEnumValueByName(const string& name) const; + + // Extensions ------------------------------------------------------ + + // A range of field numbers which are designated for third-party + // extensions. + struct ExtensionRange { + int start; // inclusive + int end; // exclusive + }; + + // The number of extension ranges in this message type. + int extension_range_count() const; + // Gets an extension range by index, where 0 <= index < + // extension_range_count(). These are returned in the order they were defined + // in the .proto file. + const ExtensionRange* extension_range(int index) const; + + // Returns true if the number is in one of the extension ranges. + bool IsExtensionNumber(int number) const; + + // Returns NULL if no extension range contains the given number. + const ExtensionRange* FindExtensionRangeContainingNumber(int number) const; + + // The number of extensions -- extending *other* messages -- that were + // defined nested within this message type's scope. + int extension_count() const; + // Get an extension by index, where 0 <= index < extension_count(). + // These are returned in the order they were defined in the .proto file. + const FieldDescriptor* extension(int index) const; + + // Looks up a named extension (which extends some *other* message type) + // defined within this message type's scope. + const FieldDescriptor* FindExtensionByName(const string& name) const; + + // Similar to FindFieldByLowercaseName(), but finds extensions defined within + // this message type's scope. + const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const; + + // Similar to FindFieldByCamelcaseName(), but finds extensions defined within + // this message type's scope. + const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const; + + // Source Location --------------------------------------------------- + + // Updates |*out_location| to the source location of the complete + // extent of this message declaration. Returns false and leaves + // |*out_location| unchanged iff location information was not available. + bool GetSourceLocation(SourceLocation* out_location) const; + + private: + typedef MessageOptions OptionsType; + + // Internal version of DebugString; controls the level of indenting for + // correct depth + void DebugString(int depth, string *contents) const; + + // Walks up the descriptor tree to generate the source location path + // to this descriptor from the file root. + void GetLocationPath(vector* output) const; + + const string* name_; + const string* full_name_; + const FileDescriptor* file_; + const Descriptor* containing_type_; + const MessageOptions* options_; + + // True if this is a placeholder for an unknown type. + bool is_placeholder_; + // True if this is a placeholder and the type name wasn't fully-qualified. + bool is_unqualified_placeholder_; + + int field_count_; + FieldDescriptor* fields_; + int oneof_decl_count_; + OneofDescriptor* oneof_decls_; + int nested_type_count_; + Descriptor* nested_types_; + int enum_type_count_; + EnumDescriptor* enum_types_; + int extension_range_count_; + ExtensionRange* extension_ranges_; + int extension_count_; + FieldDescriptor* extensions_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in descriptor.cc + // and update them to initialize the field. + + // Must be constructed using DescriptorPool. + Descriptor() {} + friend class DescriptorBuilder; + friend class EnumDescriptor; + friend class FieldDescriptor; + friend class OneofDescriptor; + friend class MethodDescriptor; + friend class FileDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Descriptor); +}; + +// Describes a single field of a message. To get the descriptor for a given +// field, first get the Descriptor for the message in which it is defined, +// then call Descriptor::FindFieldByName(). To get a FieldDescriptor for +// an extension, do one of the following: +// - Get the Descriptor or FileDescriptor for its containing scope, then +// call Descriptor::FindExtensionByName() or +// FileDescriptor::FindExtensionByName(). +// - Given a DescriptorPool, call DescriptorPool::FindExtensionByNumber(). +// - Given a Reflection for a message object, call +// Reflection::FindKnownExtensionByName() or +// Reflection::FindKnownExtensionByNumber(). +// Use DescriptorPool to construct your own descriptors. +class LIBPROTOBUF_EXPORT FieldDescriptor { + public: + // Identifies a field type. 0 is reserved for errors. The order is weird + // for historical reasons. Types 12 and up are new in proto2. + enum Type { + TYPE_DOUBLE = 1, // double, exactly eight bytes on the wire. + TYPE_FLOAT = 2, // float, exactly four bytes on the wire. + TYPE_INT64 = 3, // int64, varint on the wire. Negative numbers + // take 10 bytes. Use TYPE_SINT64 if negative + // values are likely. + TYPE_UINT64 = 4, // uint64, varint on the wire. + TYPE_INT32 = 5, // int32, varint on the wire. Negative numbers + // take 10 bytes. Use TYPE_SINT32 if negative + // values are likely. + TYPE_FIXED64 = 6, // uint64, exactly eight bytes on the wire. + TYPE_FIXED32 = 7, // uint32, exactly four bytes on the wire. + TYPE_BOOL = 8, // bool, varint on the wire. + TYPE_STRING = 9, // UTF-8 text. + TYPE_GROUP = 10, // Tag-delimited message. Deprecated. + TYPE_MESSAGE = 11, // Length-delimited message. + + TYPE_BYTES = 12, // Arbitrary byte array. + TYPE_UINT32 = 13, // uint32, varint on the wire + TYPE_ENUM = 14, // Enum, varint on the wire + TYPE_SFIXED32 = 15, // int32, exactly four bytes on the wire + TYPE_SFIXED64 = 16, // int64, exactly eight bytes on the wire + TYPE_SINT32 = 17, // int32, ZigZag-encoded varint on the wire + TYPE_SINT64 = 18, // int64, ZigZag-encoded varint on the wire + + MAX_TYPE = 18, // Constant useful for defining lookup tables + // indexed by Type. + }; + + // Specifies the C++ data type used to represent the field. There is a + // fixed mapping from Type to CppType where each Type maps to exactly one + // CppType. 0 is reserved for errors. + enum CppType { + CPPTYPE_INT32 = 1, // TYPE_INT32, TYPE_SINT32, TYPE_SFIXED32 + CPPTYPE_INT64 = 2, // TYPE_INT64, TYPE_SINT64, TYPE_SFIXED64 + CPPTYPE_UINT32 = 3, // TYPE_UINT32, TYPE_FIXED32 + CPPTYPE_UINT64 = 4, // TYPE_UINT64, TYPE_FIXED64 + CPPTYPE_DOUBLE = 5, // TYPE_DOUBLE + CPPTYPE_FLOAT = 6, // TYPE_FLOAT + CPPTYPE_BOOL = 7, // TYPE_BOOL + CPPTYPE_ENUM = 8, // TYPE_ENUM + CPPTYPE_STRING = 9, // TYPE_STRING, TYPE_BYTES + CPPTYPE_MESSAGE = 10, // TYPE_MESSAGE, TYPE_GROUP + + MAX_CPPTYPE = 10, // Constant useful for defining lookup tables + // indexed by CppType. + }; + + // Identifies whether the field is optional, required, or repeated. 0 is + // reserved for errors. + enum Label { + LABEL_OPTIONAL = 1, // optional + LABEL_REQUIRED = 2, // required + LABEL_REPEATED = 3, // repeated + + MAX_LABEL = 3, // Constant useful for defining lookup tables + // indexed by Label. + }; + + // Valid field numbers are positive integers up to kMaxNumber. + static const int kMaxNumber = (1 << 29) - 1; + + // First field number reserved for the protocol buffer library implementation. + // Users may not declare fields that use reserved numbers. + static const int kFirstReservedNumber = 19000; + // Last field number reserved for the protocol buffer library implementation. + // Users may not declare fields that use reserved numbers. + static const int kLastReservedNumber = 19999; + + const string& name() const; // Name of this field within the message. + const string& full_name() const; // Fully-qualified name of the field. + const FileDescriptor* file() const;// File in which this field was defined. + bool is_extension() const; // Is this an extension field? + int number() const; // Declared tag number. + + // Same as name() except converted to lower-case. This (and especially the + // FindFieldByLowercaseName() method) can be useful when parsing formats + // which prefer to use lowercase naming style. (Although, technically + // field names should be lowercased anyway according to the protobuf style + // guide, so this only makes a difference when dealing with old .proto files + // which do not follow the guide.) + const string& lowercase_name() const; + + // Same as name() except converted to camel-case. In this conversion, any + // time an underscore appears in the name, it is removed and the next + // letter is capitalized. Furthermore, the first letter of the name is + // lower-cased. Examples: + // FooBar -> fooBar + // foo_bar -> fooBar + // fooBar -> fooBar + // This (and especially the FindFieldByCamelcaseName() method) can be useful + // when parsing formats which prefer to use camel-case naming style. + const string& camelcase_name() const; + + Type type() const; // Declared type of this field. + const char* type_name() const; // Name of the declared type. + CppType cpp_type() const; // C++ type of this field. + const char* cpp_type_name() const; // Name of the C++ type. + Label label() const; // optional/required/repeated + + bool is_required() const; // shorthand for label() == LABEL_REQUIRED + bool is_optional() const; // shorthand for label() == LABEL_OPTIONAL + bool is_repeated() const; // shorthand for label() == LABEL_REPEATED + bool is_packable() const; // shorthand for is_repeated() && + // IsTypePackable(type()) + bool is_packed() const; // shorthand for is_packable() && + // options().packed() + + // Index of this field within the message's field array, or the file or + // extension scope's extensions array. + int index() const; + + // Does this field have an explicitly-declared default value? + bool has_default_value() const; + + // Get the field default value if cpp_type() == CPPTYPE_INT32. If no + // explicit default was defined, the default is 0. + int32 default_value_int32() const; + // Get the field default value if cpp_type() == CPPTYPE_INT64. If no + // explicit default was defined, the default is 0. + int64 default_value_int64() const; + // Get the field default value if cpp_type() == CPPTYPE_UINT32. If no + // explicit default was defined, the default is 0. + uint32 default_value_uint32() const; + // Get the field default value if cpp_type() == CPPTYPE_UINT64. If no + // explicit default was defined, the default is 0. + uint64 default_value_uint64() const; + // Get the field default value if cpp_type() == CPPTYPE_FLOAT. If no + // explicit default was defined, the default is 0.0. + float default_value_float() const; + // Get the field default value if cpp_type() == CPPTYPE_DOUBLE. If no + // explicit default was defined, the default is 0.0. + double default_value_double() const; + // Get the field default value if cpp_type() == CPPTYPE_BOOL. If no + // explicit default was defined, the default is false. + bool default_value_bool() const; + // Get the field default value if cpp_type() == CPPTYPE_ENUM. If no + // explicit default was defined, the default is the first value defined + // in the enum type (all enum types are required to have at least one value). + // This never returns NULL. + const EnumValueDescriptor* default_value_enum() const; + // Get the field default value if cpp_type() == CPPTYPE_STRING. If no + // explicit default was defined, the default is the empty string. + const string& default_value_string() const; + + // The Descriptor for the message of which this is a field. For extensions, + // this is the extended type. Never NULL. + const Descriptor* containing_type() const; + + // If the field is a member of a oneof, this is the one, otherwise this is + // NULL. + const OneofDescriptor* containing_oneof() const; + + // If the field is a member of a oneof, returns the index in that oneof. + int index_in_oneof() const; + + // An extension may be declared within the scope of another message. If this + // field is an extension (is_extension() is true), then extension_scope() + // returns that message, or NULL if the extension was declared at global + // scope. If this is not an extension, extension_scope() is undefined (may + // assert-fail). + const Descriptor* extension_scope() const; + + // If type is TYPE_MESSAGE or TYPE_GROUP, returns a descriptor for the + // message or the group type. Otherwise, returns null. + const Descriptor* message_type() const; + // If type is TYPE_ENUM, returns a descriptor for the enum. Otherwise, + // returns null. + const EnumDescriptor* enum_type() const; + + // EXPERIMENTAL; DO NOT USE. + // If this field is a map field, experimental_map_key() is the field + // that is the key for this map. + // experimental_map_key()->containing_type() is the same as message_type(). + const FieldDescriptor* experimental_map_key() const; + + // Get the FieldOptions for this field. This includes things listed in + // square brackets after the field definition. E.g., the field: + // optional string text = 1 [ctype=CORD]; + // has the "ctype" option set. Allowed options are defined by FieldOptions + // in google/protobuf/descriptor.proto, and any available extensions of that + // message. + const FieldOptions& options() const; + + // See Descriptor::CopyTo(). + void CopyTo(FieldDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + // Helper method to get the CppType for a particular Type. + static CppType TypeToCppType(Type type); + + // Helper method to get the name of a Type. + static const char* TypeName(Type type); + + // Helper method to get the name of a CppType. + static const char* CppTypeName(CppType cpp_type); + + // Return true iff [packed = true] is valid for fields of this type. + static inline bool IsTypePackable(Type field_type); + + // Source Location --------------------------------------------------- + + // Updates |*out_location| to the source location of the complete + // extent of this field declaration. Returns false and leaves + // |*out_location| unchanged iff location information was not available. + bool GetSourceLocation(SourceLocation* out_location) const; + + private: + typedef FieldOptions OptionsType; + + // See Descriptor::DebugString(). + enum PrintLabelFlag { PRINT_LABEL, OMIT_LABEL }; + void DebugString(int depth, PrintLabelFlag print_label_flag, + string* contents) const; + + // formats the default value appropriately and returns it as a string. + // Must have a default value to call this. If quote_string_type is true, then + // types of CPPTYPE_STRING whill be surrounded by quotes and CEscaped. + string DefaultValueAsString(bool quote_string_type) const; + + // Walks up the descriptor tree to generate the source location path + // to this descriptor from the file root. + void GetLocationPath(vector* output) const; + + const string* name_; + const string* full_name_; + const string* lowercase_name_; + const string* camelcase_name_; + const FileDescriptor* file_; + int number_; + Type type_; + Label label_; + bool is_extension_; + int index_in_oneof_; + const Descriptor* containing_type_; + const OneofDescriptor* containing_oneof_; + const Descriptor* extension_scope_; + const Descriptor* message_type_; + const EnumDescriptor* enum_type_; + const FieldDescriptor* experimental_map_key_; + const FieldOptions* options_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + bool has_default_value_; + union { + int32 default_value_int32_; + int64 default_value_int64_; + uint32 default_value_uint32_; + uint64 default_value_uint64_; + float default_value_float_; + double default_value_double_; + bool default_value_bool_; + + const EnumValueDescriptor* default_value_enum_; + const string* default_value_string_; + }; + + static const CppType kTypeToCppTypeMap[MAX_TYPE + 1]; + + static const char * const kTypeToName[MAX_TYPE + 1]; + + static const char * const kCppTypeToName[MAX_CPPTYPE + 1]; + + static const char * const kLabelToName[MAX_LABEL + 1]; + + // Must be constructed using DescriptorPool. + FieldDescriptor() {} + friend class DescriptorBuilder; + friend class FileDescriptor; + friend class Descriptor; + friend class OneofDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldDescriptor); +}; + +// Describes a oneof defined in a message type. +class LIBPROTOBUF_EXPORT OneofDescriptor { + public: + const string& name() const; // Name of this oneof. + const string& full_name() const; // Fully-qualified name of the oneof. + + // Index of this oneof within the message's oneof array. + int index() const; + + // The Descriptor for the message containing this oneof. + const Descriptor* containing_type() const; + + // The number of (non-extension) fields which are members of this oneof. + int field_count() const; + // Get a member of this oneof, in the order in which they were declared in the + // .proto file. Does not include extensions. + const FieldDescriptor* field(int index) const; + + // See Descriptor::CopyTo(). + void CopyTo(OneofDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + // Source Location --------------------------------------------------- + + // Updates |*out_location| to the source location of the complete + // extent of this oneof declaration. Returns false and leaves + // |*out_location| unchanged iff location information was not available. + bool GetSourceLocation(SourceLocation* out_location) const; + + private: + // See Descriptor::DebugString(). + void DebugString(int depth, string* contents) const; + + // Walks up the descriptor tree to generate the source location path + // to this descriptor from the file root. + void GetLocationPath(vector* output) const; + + const string* name_; + const string* full_name_; + const Descriptor* containing_type_; + bool is_extendable_; + int field_count_; + const FieldDescriptor** fields_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() + // in descriptor.cc and update them to initialize the field. + + // Must be constructed using DescriptorPool. + OneofDescriptor() {} + friend class DescriptorBuilder; + friend class Descriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OneofDescriptor); +}; + +// Describes an enum type defined in a .proto file. To get the EnumDescriptor +// for a generated enum type, call TypeName_descriptor(). Use DescriptorPool +// to construct your own descriptors. +class LIBPROTOBUF_EXPORT EnumDescriptor { + public: + // The name of this enum type in the containing scope. + const string& name() const; + + // The fully-qualified name of the enum type, scope delimited by periods. + const string& full_name() const; + + // Index of this enum within the file or containing message's enum array. + int index() const; + + // The .proto file in which this enum type was defined. Never NULL. + const FileDescriptor* file() const; + + // The number of values for this EnumDescriptor. Guaranteed to be greater + // than zero. + int value_count() const; + // Gets a value by index, where 0 <= index < value_count(). + // These are returned in the order they were defined in the .proto file. + const EnumValueDescriptor* value(int index) const; + + // Looks up a value by name. Returns NULL if no such value exists. + const EnumValueDescriptor* FindValueByName(const string& name) const; + // Looks up a value by number. Returns NULL if no such value exists. If + // multiple values have this number, the first one defined is returned. + const EnumValueDescriptor* FindValueByNumber(int number) const; + + // If this enum type is nested in a message type, this is that message type. + // Otherwise, NULL. + const Descriptor* containing_type() const; + + // Get options for this enum type. These are specified in the .proto file by + // placing lines like "option foo = 1234;" in the enum definition. Allowed + // options are defined by EnumOptions in google/protobuf/descriptor.proto, + // and any available extensions of that message. + const EnumOptions& options() const; + + // See Descriptor::CopyTo(). + void CopyTo(EnumDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + // Returns true if this is a placeholder for an unknown enum. This will + // only be the case if this descriptor comes from a DescriptorPool + // with AllowUnknownDependencies() set. + bool is_placeholder() const; + + // Source Location --------------------------------------------------- + + // Updates |*out_location| to the source location of the complete + // extent of this enum declaration. Returns false and leaves + // |*out_location| unchanged iff location information was not available. + bool GetSourceLocation(SourceLocation* out_location) const; + + private: + typedef EnumOptions OptionsType; + + // See Descriptor::DebugString(). + void DebugString(int depth, string *contents) const; + + // Walks up the descriptor tree to generate the source location path + // to this descriptor from the file root. + void GetLocationPath(vector* output) const; + + const string* name_; + const string* full_name_; + const FileDescriptor* file_; + const Descriptor* containing_type_; + const EnumOptions* options_; + + // True if this is a placeholder for an unknown type. + bool is_placeholder_; + // True if this is a placeholder and the type name wasn't fully-qualified. + bool is_unqualified_placeholder_; + + int value_count_; + EnumValueDescriptor* values_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + // Must be constructed using DescriptorPool. + EnumDescriptor() {} + friend class DescriptorBuilder; + friend class Descriptor; + friend class FieldDescriptor; + friend class EnumValueDescriptor; + friend class FileDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumDescriptor); +}; + +// Describes an individual enum constant of a particular type. To get the +// EnumValueDescriptor for a given enum value, first get the EnumDescriptor +// for its type, then use EnumDescriptor::FindValueByName() or +// EnumDescriptor::FindValueByNumber(). Use DescriptorPool to construct +// your own descriptors. +class LIBPROTOBUF_EXPORT EnumValueDescriptor { + public: + const string& name() const; // Name of this enum constant. + int index() const; // Index within the enums's Descriptor. + int number() const; // Numeric value of this enum constant. + + // The full_name of an enum value is a sibling symbol of the enum type. + // e.g. the full name of FieldDescriptorProto::TYPE_INT32 is actually + // "google.protobuf.FieldDescriptorProto.TYPE_INT32", NOT + // "google.protobuf.FieldDescriptorProto.Type.TYPE_INT32". This is to conform + // with C++ scoping rules for enums. + const string& full_name() const; + + // The type of this value. Never NULL. + const EnumDescriptor* type() const; + + // Get options for this enum value. These are specified in the .proto file + // by adding text like "[foo = 1234]" after an enum value definition. + // Allowed options are defined by EnumValueOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const EnumValueOptions& options() const; + + // See Descriptor::CopyTo(). + void CopyTo(EnumValueDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + // Source Location --------------------------------------------------- + + // Updates |*out_location| to the source location of the complete + // extent of this enum value declaration. Returns false and leaves + // |*out_location| unchanged iff location information was not available. + bool GetSourceLocation(SourceLocation* out_location) const; + + private: + typedef EnumValueOptions OptionsType; + + // See Descriptor::DebugString(). + void DebugString(int depth, string *contents) const; + + // Walks up the descriptor tree to generate the source location path + // to this descriptor from the file root. + void GetLocationPath(vector* output) const; + + const string* name_; + const string* full_name_; + int number_; + const EnumDescriptor* type_; + const EnumValueOptions* options_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() + // in descriptor.cc and update them to initialize the field. + + // Must be constructed using DescriptorPool. + EnumValueDescriptor() {} + friend class DescriptorBuilder; + friend class EnumDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumValueDescriptor); +}; + +// Describes an RPC service. To get the ServiceDescriptor for a service, +// call Service::GetDescriptor(). Generated service classes also have a +// static method called descriptor() which returns the type's +// ServiceDescriptor. Use DescriptorPool to construct your own descriptors. +class LIBPROTOBUF_EXPORT ServiceDescriptor { + public: + // The name of the service, not including its containing scope. + const string& name() const; + // The fully-qualified name of the service, scope delimited by periods. + const string& full_name() const; + // Index of this service within the file's services array. + int index() const; + + // The .proto file in which this service was defined. Never NULL. + const FileDescriptor* file() const; + + // Get options for this service type. These are specified in the .proto file + // by placing lines like "option foo = 1234;" in the service definition. + // Allowed options are defined by ServiceOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const ServiceOptions& options() const; + + // The number of methods this service defines. + int method_count() const; + // Gets a MethodDescriptor by index, where 0 <= index < method_count(). + // These are returned in the order they were defined in the .proto file. + const MethodDescriptor* method(int index) const; + + // Look up a MethodDescriptor by name. + const MethodDescriptor* FindMethodByName(const string& name) const; + // See Descriptor::CopyTo(). + void CopyTo(ServiceDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + // Source Location --------------------------------------------------- + + // Updates |*out_location| to the source location of the complete + // extent of this service declaration. Returns false and leaves + // |*out_location| unchanged iff location information was not available. + bool GetSourceLocation(SourceLocation* out_location) const; + + private: + typedef ServiceOptions OptionsType; + + // See Descriptor::DebugString(). + void DebugString(string *contents) const; + + // Walks up the descriptor tree to generate the source location path + // to this descriptor from the file root. + void GetLocationPath(vector* output) const; + + const string* name_; + const string* full_name_; + const FileDescriptor* file_; + const ServiceOptions* options_; + int method_count_; + MethodDescriptor* methods_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + // Must be constructed using DescriptorPool. + ServiceDescriptor() {} + friend class DescriptorBuilder; + friend class FileDescriptor; + friend class MethodDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceDescriptor); +}; + +// Describes an individual service method. To obtain a MethodDescriptor given +// a service, first get its ServiceDescriptor, then call +// ServiceDescriptor::FindMethodByName(). Use DescriptorPool to construct your +// own descriptors. +class LIBPROTOBUF_EXPORT MethodDescriptor { + public: + // Name of this method, not including containing scope. + const string& name() const; + // The fully-qualified name of the method, scope delimited by periods. + const string& full_name() const; + // Index within the service's Descriptor. + int index() const; + + // Gets the service to which this method belongs. Never NULL. + const ServiceDescriptor* service() const; + + // Gets the type of protocol message which this method accepts as input. + const Descriptor* input_type() const; + // Gets the type of protocol message which this message produces as output. + const Descriptor* output_type() const; + + // Get options for this method. These are specified in the .proto file by + // placing lines like "option foo = 1234;" in curly-braces after a method + // declaration. Allowed options are defined by MethodOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const MethodOptions& options() const; + + // See Descriptor::CopyTo(). + void CopyTo(MethodDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + // Source Location --------------------------------------------------- + + // Updates |*out_location| to the source location of the complete + // extent of this method declaration. Returns false and leaves + // |*out_location| unchanged iff location information was not available. + bool GetSourceLocation(SourceLocation* out_location) const; + + private: + typedef MethodOptions OptionsType; + + // See Descriptor::DebugString(). + void DebugString(int depth, string *contents) const; + + // Walks up the descriptor tree to generate the source location path + // to this descriptor from the file root. + void GetLocationPath(vector* output) const; + + const string* name_; + const string* full_name_; + const ServiceDescriptor* service_; + const Descriptor* input_type_; + const Descriptor* output_type_; + const MethodOptions* options_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + // Must be constructed using DescriptorPool. + MethodDescriptor() {} + friend class DescriptorBuilder; + friend class ServiceDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MethodDescriptor); +}; + + +// Describes a whole .proto file. To get the FileDescriptor for a compiled-in +// file, get the descriptor for something defined in that file and call +// descriptor->file(). Use DescriptorPool to construct your own descriptors. +class LIBPROTOBUF_EXPORT FileDescriptor { + public: + // The filename, relative to the source tree. + // e.g. "google/protobuf/descriptor.proto" + const string& name() const; + + // The package, e.g. "google.protobuf.compiler". + const string& package() const; + + // The DescriptorPool in which this FileDescriptor and all its contents were + // allocated. Never NULL. + const DescriptorPool* pool() const; + + // The number of files imported by this one. + int dependency_count() const; + // Gets an imported file by index, where 0 <= index < dependency_count(). + // These are returned in the order they were defined in the .proto file. + const FileDescriptor* dependency(int index) const; + + // The number of files public imported by this one. + // The public dependency list is a subset of the dependency list. + int public_dependency_count() const; + // Gets a public imported file by index, where 0 <= index < + // public_dependency_count(). + // These are returned in the order they were defined in the .proto file. + const FileDescriptor* public_dependency(int index) const; + + // The number of files that are imported for weak fields. + // The weak dependency list is a subset of the dependency list. + int weak_dependency_count() const; + // Gets a weak imported file by index, where 0 <= index < + // weak_dependency_count(). + // These are returned in the order they were defined in the .proto file. + const FileDescriptor* weak_dependency(int index) const; + + // Number of top-level message types defined in this file. (This does not + // include nested types.) + int message_type_count() const; + // Gets a top-level message type, where 0 <= index < message_type_count(). + // These are returned in the order they were defined in the .proto file. + const Descriptor* message_type(int index) const; + + // Number of top-level enum types defined in this file. (This does not + // include nested types.) + int enum_type_count() const; + // Gets a top-level enum type, where 0 <= index < enum_type_count(). + // These are returned in the order they were defined in the .proto file. + const EnumDescriptor* enum_type(int index) const; + + // Number of services defined in this file. + int service_count() const; + // Gets a service, where 0 <= index < service_count(). + // These are returned in the order they were defined in the .proto file. + const ServiceDescriptor* service(int index) const; + + // Number of extensions defined at file scope. (This does not include + // extensions nested within message types.) + int extension_count() const; + // Gets an extension's descriptor, where 0 <= index < extension_count(). + // These are returned in the order they were defined in the .proto file. + const FieldDescriptor* extension(int index) const; + + // Get options for this file. These are specified in the .proto file by + // placing lines like "option foo = 1234;" at the top level, outside of any + // other definitions. Allowed options are defined by FileOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const FileOptions& options() const; + + // Find a top-level message type by name. Returns NULL if not found. + const Descriptor* FindMessageTypeByName(const string& name) const; + // Find a top-level enum type by name. Returns NULL if not found. + const EnumDescriptor* FindEnumTypeByName(const string& name) const; + // Find an enum value defined in any top-level enum by name. Returns NULL if + // not found. + const EnumValueDescriptor* FindEnumValueByName(const string& name) const; + // Find a service definition by name. Returns NULL if not found. + const ServiceDescriptor* FindServiceByName(const string& name) const; + // Find a top-level extension definition by name. Returns NULL if not found. + const FieldDescriptor* FindExtensionByName(const string& name) const; + // Similar to FindExtensionByName(), but searches by lowercased-name. See + // Descriptor::FindFieldByLowercaseName(). + const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const; + // Similar to FindExtensionByName(), but searches by camelcased-name. See + // Descriptor::FindFieldByCamelcaseName(). + const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const; + + // See Descriptor::CopyTo(). + // Notes: + // - This method does NOT copy source code information since it is relatively + // large and rarely needed. See CopySourceCodeInfoTo() below. + void CopyTo(FileDescriptorProto* proto) const; + // Write the source code information of this FileDescriptor into the given + // FileDescriptorProto. See CopyTo() above. + void CopySourceCodeInfoTo(FileDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + // Returns true if this is a placeholder for an unknown file. This will + // only be the case if this descriptor comes from a DescriptorPool + // with AllowUnknownDependencies() set. + bool is_placeholder() const; + + private: + // Source Location --------------------------------------------------- + + // Updates |*out_location| to the source location of the complete + // extent of the declaration or declaration-part denoted by |path|. + // Returns false and leaves |*out_location| unchanged iff location + // information was not available. (See SourceCodeInfo for + // description of path encoding.) + bool GetSourceLocation(const vector& path, + SourceLocation* out_location) const; + + typedef FileOptions OptionsType; + + const string* name_; + const string* package_; + const DescriptorPool* pool_; + int dependency_count_; + const FileDescriptor** dependencies_; + int public_dependency_count_; + int* public_dependencies_; + int weak_dependency_count_; + int* weak_dependencies_; + int message_type_count_; + Descriptor* message_types_; + int enum_type_count_; + EnumDescriptor* enum_types_; + int service_count_; + ServiceDescriptor* services_; + int extension_count_; + bool is_placeholder_; + FieldDescriptor* extensions_; + const FileOptions* options_; + + const FileDescriptorTables* tables_; + const SourceCodeInfo* source_code_info_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + FileDescriptor() {} + friend class DescriptorBuilder; + friend class Descriptor; + friend class FieldDescriptor; + friend class OneofDescriptor; + friend class EnumDescriptor; + friend class EnumValueDescriptor; + friend class MethodDescriptor; + friend class ServiceDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileDescriptor); +}; + +// =================================================================== + +// Used to construct descriptors. +// +// Normally you won't want to build your own descriptors. Message classes +// constructed by the protocol compiler will provide them for you. However, +// if you are implementing Message on your own, or if you are writing a +// program which can operate on totally arbitrary types and needs to load +// them from some sort of database, you might need to. +// +// Since Descriptors are composed of a whole lot of cross-linked bits of +// data that would be a pain to put together manually, the +// DescriptorPool class is provided to make the process easier. It can +// take a FileDescriptorProto (defined in descriptor.proto), validate it, +// and convert it to a set of nicely cross-linked Descriptors. +// +// DescriptorPool also helps with memory management. Descriptors are +// composed of many objects containing static data and pointers to each +// other. In all likelihood, when it comes time to delete this data, +// you'll want to delete it all at once. In fact, it is not uncommon to +// have a whole pool of descriptors all cross-linked with each other which +// you wish to delete all at once. This class represents such a pool, and +// handles the memory management for you. +// +// You can also search for descriptors within a DescriptorPool by name, and +// extensions by number. +class LIBPROTOBUF_EXPORT DescriptorPool { + public: + // Create a normal, empty DescriptorPool. + DescriptorPool(); + + // Constructs a DescriptorPool that, when it can't find something among the + // descriptors already in the pool, looks for it in the given + // DescriptorDatabase. + // Notes: + // - If a DescriptorPool is constructed this way, its BuildFile*() methods + // must not be called (they will assert-fail). The only way to populate + // the pool with descriptors is to call the Find*By*() methods. + // - The Find*By*() methods may block the calling thread if the + // DescriptorDatabase blocks. This in turn means that parsing messages + // may block if they need to look up extensions. + // - The Find*By*() methods will use mutexes for thread-safety, thus making + // them slower even when they don't have to fall back to the database. + // In fact, even the Find*By*() methods of descriptor objects owned by + // this pool will be slower, since they will have to obtain locks too. + // - An ErrorCollector may optionally be given to collect validation errors + // in files loaded from the database. If not given, errors will be printed + // to GOOGLE_LOG(ERROR). Remember that files are built on-demand, so this + // ErrorCollector may be called from any thread that calls one of the + // Find*By*() methods. + // - The DescriptorDatabase must not be mutated during the lifetime of + // the DescriptorPool. Even if the client takes care to avoid data races, + // changes to the content of the DescriptorDatabase may not be reflected + // in subsequent lookups in the DescriptorPool. + class ErrorCollector; + explicit DescriptorPool(DescriptorDatabase* fallback_database, + ErrorCollector* error_collector = NULL); + + ~DescriptorPool(); + + // Get a pointer to the generated pool. Generated protocol message classes + // which are compiled into the binary will allocate their descriptors in + // this pool. Do not add your own descriptors to this pool. + static const DescriptorPool* generated_pool(); + + // Find a FileDescriptor in the pool by file name. Returns NULL if not + // found. + const FileDescriptor* FindFileByName(const string& name) const; + + // Find the FileDescriptor in the pool which defines the given symbol. + // If any of the Find*ByName() methods below would succeed, then this is + // equivalent to calling that method and calling the result's file() method. + // Otherwise this returns NULL. + const FileDescriptor* FindFileContainingSymbol( + const string& symbol_name) const; + + // Looking up descriptors ------------------------------------------ + // These find descriptors by fully-qualified name. These will find both + // top-level descriptors and nested descriptors. They return NULL if not + // found. + + const Descriptor* FindMessageTypeByName(const string& name) const; + const FieldDescriptor* FindFieldByName(const string& name) const; + const FieldDescriptor* FindExtensionByName(const string& name) const; + const OneofDescriptor* FindOneofByName(const string& name) const; + const EnumDescriptor* FindEnumTypeByName(const string& name) const; + const EnumValueDescriptor* FindEnumValueByName(const string& name) const; + const ServiceDescriptor* FindServiceByName(const string& name) const; + const MethodDescriptor* FindMethodByName(const string& name) const; + + // Finds an extension of the given type by number. The extendee must be + // a member of this DescriptorPool or one of its underlays. + const FieldDescriptor* FindExtensionByNumber(const Descriptor* extendee, + int number) const; + + // Finds extensions of extendee. The extensions will be appended to + // out in an undefined order. Only extensions defined directly in + // this DescriptorPool or one of its underlays are guaranteed to be + // found: extensions defined in the fallback database might not be found + // depending on the database implementation. + void FindAllExtensions(const Descriptor* extendee, + vector* out) const; + + // Building descriptors -------------------------------------------- + + // When converting a FileDescriptorProto to a FileDescriptor, various + // errors might be detected in the input. The caller may handle these + // programmatically by implementing an ErrorCollector. + class LIBPROTOBUF_EXPORT ErrorCollector { + public: + inline ErrorCollector() {} + virtual ~ErrorCollector(); + + // These constants specify what exact part of the construct is broken. + // This is useful e.g. for mapping the error back to an exact location + // in a .proto file. + enum ErrorLocation { + NAME, // the symbol name, or the package name for files + NUMBER, // field or extension range number + TYPE, // field type + EXTENDEE, // field extendee + DEFAULT_VALUE, // field default value + INPUT_TYPE, // method input type + OUTPUT_TYPE, // method output type + OPTION_NAME, // name in assignment + OPTION_VALUE, // value in option assignment + OTHER // some other problem + }; + + // Reports an error in the FileDescriptorProto. Use this function if the + // problem occured should interrupt building the FileDescriptorProto. + virtual void AddError( + const string& filename, // File name in which the error occurred. + const string& element_name, // Full name of the erroneous element. + const Message* descriptor, // Descriptor of the erroneous element. + ErrorLocation location, // One of the location constants, above. + const string& message // Human-readable error message. + ) = 0; + + // Reports a warning in the FileDescriptorProto. Use this function if the + // problem occured should NOT interrupt building the FileDescriptorProto. + virtual void AddWarning( + const string& filename, // File name in which the error occurred. + const string& element_name, // Full name of the erroneous element. + const Message* descriptor, // Descriptor of the erroneous element. + ErrorLocation location, // One of the location constants, above. + const string& message // Human-readable error message. + ) {} + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector); + }; + + // Convert the FileDescriptorProto to real descriptors and place them in + // this DescriptorPool. All dependencies of the file must already be in + // the pool. Returns the resulting FileDescriptor, or NULL if there were + // problems with the input (e.g. the message was invalid, or dependencies + // were missing). Details about the errors are written to GOOGLE_LOG(ERROR). + const FileDescriptor* BuildFile(const FileDescriptorProto& proto); + + // Same as BuildFile() except errors are sent to the given ErrorCollector. + const FileDescriptor* BuildFileCollectingErrors( + const FileDescriptorProto& proto, + ErrorCollector* error_collector); + + // By default, it is an error if a FileDescriptorProto contains references + // to types or other files that are not found in the DescriptorPool (or its + // backing DescriptorDatabase, if any). If you call + // AllowUnknownDependencies(), however, then unknown types and files + // will be replaced by placeholder descriptors (which can be identified by + // the is_placeholder() method). This can allow you to + // perform some useful operations with a .proto file even if you do not + // have access to other .proto files on which it depends. However, some + // heuristics must be used to fill in the gaps in information, and these + // can lead to descriptors which are inaccurate. For example, the + // DescriptorPool may be forced to guess whether an unknown type is a message + // or an enum, as well as what package it resides in. Furthermore, + // placeholder types will not be discoverable via FindMessageTypeByName() + // and similar methods, which could confuse some descriptor-based algorithms. + // Generally, the results of this option should be handled with extreme care. + void AllowUnknownDependencies() { allow_unknown_ = true; } + + // By default, weak imports are allowed to be missing, in which case we will + // use a placeholder for the dependency and convert the field to be an Empty + // message field. If you call EnforceWeakDependencies(true), however, the + // DescriptorPool will report a import not found error. + void EnforceWeakDependencies(bool enforce) { enforce_weak_ = enforce; } + + // Internal stuff -------------------------------------------------- + // These methods MUST NOT be called from outside the proto2 library. + // These methods may contain hidden pitfalls and may be removed in a + // future library version. + + // Create a DescriptorPool which is overlaid on top of some other pool. + // If you search for a descriptor in the overlay and it is not found, the + // underlay will be searched as a backup. If the underlay has its own + // underlay, that will be searched next, and so on. This also means that + // files built in the overlay will be cross-linked with the underlay's + // descriptors if necessary. The underlay remains property of the caller; + // it must remain valid for the lifetime of the newly-constructed pool. + // + // Example: Say you want to parse a .proto file at runtime in order to use + // its type with a DynamicMessage. Say this .proto file has dependencies, + // but you know that all the dependencies will be things that are already + // compiled into the binary. For ease of use, you'd like to load the types + // right out of generated_pool() rather than have to parse redundant copies + // of all these .protos and runtime. But, you don't want to add the parsed + // types directly into generated_pool(): this is not allowed, and would be + // bad design anyway. So, instead, you could use generated_pool() as an + // underlay for a new DescriptorPool in which you add only the new file. + // + // WARNING: Use of underlays can lead to many subtle gotchas. Instead, + // try to formulate what you want to do in terms of DescriptorDatabases. + explicit DescriptorPool(const DescriptorPool* underlay); + + // Called by generated classes at init time to add their descriptors to + // generated_pool. Do NOT call this in your own code! filename must be a + // permanent string (e.g. a string literal). + static void InternalAddGeneratedFile( + const void* encoded_file_descriptor, int size); + + + // For internal use only: Gets a non-const pointer to the generated pool. + // This is called at static-initialization time only, so thread-safety is + // not a concern. If both an underlay and a fallback database are present, + // the underlay takes precedence. + static DescriptorPool* internal_generated_pool(); + + // For internal use only: Changes the behavior of BuildFile() such that it + // allows the file to make reference to message types declared in other files + // which it did not officially declare as dependencies. + void InternalDontEnforceDependencies(); + + // For internal use only. + void internal_set_underlay(const DescriptorPool* underlay) { + underlay_ = underlay; + } + + // For internal (unit test) use only: Returns true if a FileDescriptor has + // been constructed for the given file, false otherwise. Useful for testing + // lazy descriptor initialization behavior. + bool InternalIsFileLoaded(const string& filename) const; + + + // Add a file to unused_import_track_files_. DescriptorBuilder will log + // warnings for those files if there is any unused import. + void AddUnusedImportTrackFile(const string& file_name); + void ClearUnusedImportTrackFiles(); + + private: + friend class Descriptor; + friend class FieldDescriptor; + friend class EnumDescriptor; + friend class ServiceDescriptor; + friend class FileDescriptor; + friend class DescriptorBuilder; + + // Return true if the given name is a sub-symbol of any non-package + // descriptor that already exists in the descriptor pool. (The full + // definition of such types is already known.) + bool IsSubSymbolOfBuiltType(const string& name) const; + + // Tries to find something in the fallback database and link in the + // corresponding proto file. Returns true if successful, in which case + // the caller should search for the thing again. These are declared + // const because they are called by (semantically) const methods. + bool TryFindFileInFallbackDatabase(const string& name) const; + bool TryFindSymbolInFallbackDatabase(const string& name) const; + bool TryFindExtensionInFallbackDatabase(const Descriptor* containing_type, + int field_number) const; + + // Like BuildFile() but called internally when the file has been loaded from + // fallback_database_. Declared const because it is called by (semantically) + // const methods. + const FileDescriptor* BuildFileFromDatabase( + const FileDescriptorProto& proto) const; + + // If fallback_database_ is NULL, this is NULL. Otherwise, this is a mutex + // which must be locked while accessing tables_. + Mutex* mutex_; + + // See constructor. + DescriptorDatabase* fallback_database_; + ErrorCollector* default_error_collector_; + const DescriptorPool* underlay_; + + // This class contains a lot of hash maps with complicated types that + // we'd like to keep out of the header. + class Tables; + scoped_ptr tables_; + + bool enforce_dependencies_; + bool allow_unknown_; + bool enforce_weak_; + std::set unused_import_track_files_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPool); +}; + +// inline methods ==================================================== + +// These macros makes this repetitive code more readable. +#define PROTOBUF_DEFINE_ACCESSOR(CLASS, FIELD, TYPE) \ + inline TYPE CLASS::FIELD() const { return FIELD##_; } + +// Strings fields are stored as pointers but returned as const references. +#define PROTOBUF_DEFINE_STRING_ACCESSOR(CLASS, FIELD) \ + inline const string& CLASS::FIELD() const { return *FIELD##_; } + +// Arrays take an index parameter, obviously. +#define PROTOBUF_DEFINE_ARRAY_ACCESSOR(CLASS, FIELD, TYPE) \ + inline TYPE CLASS::FIELD(int index) const { return FIELD##s_ + index; } + +#define PROTOBUF_DEFINE_OPTIONS_ACCESSOR(CLASS, TYPE) \ + inline const TYPE& CLASS::options() const { return *options_; } + +PROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, file, const FileDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, containing_type, const Descriptor*) + +PROTOBUF_DEFINE_ACCESSOR(Descriptor, field_count, int) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, oneof_decl_count, int) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, nested_type_count, int) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, enum_type_count, int) + +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, field, const FieldDescriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, oneof_decl, const OneofDescriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, nested_type, const Descriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, enum_type, const EnumDescriptor*) + +PROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_range_count, int) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_count, int) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension_range, + const Descriptor::ExtensionRange*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension, + const FieldDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(Descriptor, MessageOptions); +PROTOBUF_DEFINE_ACCESSOR(Descriptor, is_placeholder, bool) + +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, full_name) +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, lowercase_name) +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, camelcase_name) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, file, const FileDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, number, int) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, is_extension, bool) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, type, FieldDescriptor::Type) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, label, FieldDescriptor::Label) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_type, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_oneof, + const OneofDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, index_in_oneof, int) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, extension_scope, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, message_type, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, enum_type, const EnumDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, experimental_map_key, + const FieldDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 ) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64 , int64 ) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint32, uint32) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint64, uint64) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_float , float ) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_double, double) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_bool , bool ) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_enum, + const EnumValueDescriptor*) +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, default_value_string) + +PROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, containing_type, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, field_count, int) + +PROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, file, const FileDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, containing_type, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, value_count, int) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, value, + const EnumValueDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions); +PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, is_placeholder, bool) + +PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, number, int) +PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, type, const EnumDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumValueDescriptor, EnumValueOptions) + +PROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, file, const FileDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, method_count, int) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(ServiceDescriptor, method, + const MethodDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(ServiceDescriptor, ServiceOptions); + +PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, service, const ServiceDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, input_type, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, output_type, const Descriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions); +PROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, package) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, pool, const DescriptorPool*) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, dependency_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, public_dependency_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, weak_dependency_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, message_type_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, enum_type_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, service_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, extension_count, int) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FileDescriptor, FileOptions); +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, is_placeholder, bool) + +PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, message_type, const Descriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, enum_type, const EnumDescriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, service, + const ServiceDescriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, extension, + const FieldDescriptor*) + +#undef PROTOBUF_DEFINE_ACCESSOR +#undef PROTOBUF_DEFINE_STRING_ACCESSOR +#undef PROTOBUF_DEFINE_ARRAY_ACCESSOR + +// A few accessors differ from the macros... + +inline bool Descriptor::IsExtensionNumber(int number) const { + return FindExtensionRangeContainingNumber(number) != NULL; +} + +inline bool FieldDescriptor::is_required() const { + return label() == LABEL_REQUIRED; +} + +inline bool FieldDescriptor::is_optional() const { + return label() == LABEL_OPTIONAL; +} + +inline bool FieldDescriptor::is_repeated() const { + return label() == LABEL_REPEATED; +} + +inline bool FieldDescriptor::is_packable() const { + return is_repeated() && IsTypePackable(type()); +} + +// To save space, index() is computed by looking at the descriptor's position +// in the parent's array of children. +inline int FieldDescriptor::index() const { + if (!is_extension_) { + return static_cast(this - containing_type_->fields_); + } else if (extension_scope_ != NULL) { + return static_cast(this - extension_scope_->extensions_); + } else { + return static_cast(this - file_->extensions_); + } +} + +inline int Descriptor::index() const { + if (containing_type_ == NULL) { + return static_cast(this - file_->message_types_); + } else { + return static_cast(this - containing_type_->nested_types_); + } +} + +inline int OneofDescriptor::index() const { + return static_cast(this - containing_type_->oneof_decls_); +} + +inline int EnumDescriptor::index() const { + if (containing_type_ == NULL) { + return static_cast(this - file_->enum_types_); + } else { + return static_cast(this - containing_type_->enum_types_); + } +} + +inline int EnumValueDescriptor::index() const { + return static_cast(this - type_->values_); +} + +inline int ServiceDescriptor::index() const { + return static_cast(this - file_->services_); +} + +inline int MethodDescriptor::index() const { + return static_cast(this - service_->methods_); +} + +inline const char* FieldDescriptor::type_name() const { + return kTypeToName[type_]; +} + +inline FieldDescriptor::CppType FieldDescriptor::cpp_type() const { + return kTypeToCppTypeMap[type_]; +} + +inline const char* FieldDescriptor::cpp_type_name() const { + return kCppTypeToName[kTypeToCppTypeMap[type_]]; +} + +inline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) { + return kTypeToCppTypeMap[type]; +} + +inline const char* FieldDescriptor::TypeName(Type type) { + return kTypeToName[type]; +} + +inline const char* FieldDescriptor::CppTypeName(CppType cpp_type) { + return kCppTypeToName[cpp_type]; +} + +inline bool FieldDescriptor::IsTypePackable(Type field_type) { + return (field_type != FieldDescriptor::TYPE_STRING && + field_type != FieldDescriptor::TYPE_GROUP && + field_type != FieldDescriptor::TYPE_MESSAGE && + field_type != FieldDescriptor::TYPE_BYTES); +} + +inline const FileDescriptor* FileDescriptor::dependency(int index) const { + return dependencies_[index]; +} + +inline const FileDescriptor* FileDescriptor::public_dependency( + int index) const { + return dependencies_[public_dependencies_[index]]; +} + +inline const FileDescriptor* FileDescriptor::weak_dependency( + int index) const { + return dependencies_[weak_dependencies_[index]]; +} + +// Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because fields_ is actually an array +// of pointers rather than the usual array of objects. +inline const FieldDescriptor* OneofDescriptor::field(int index) const { + return fields_[index]; +} + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_DESCRIPTOR_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/descriptor.pb.cc b/toolkit/components/protobuf/src/google/protobuf/descriptor.pb.cc new file mode 100644 index 0000000000000..c3aa2fb68f0c8 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/descriptor.pb.cc @@ -0,0 +1,9135 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/protobuf/descriptor.proto + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "google/protobuf/descriptor.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace google { +namespace protobuf { + +namespace { + +const ::google::protobuf::Descriptor* FileDescriptorSet_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FileDescriptorSet_reflection_ = NULL; +const ::google::protobuf::Descriptor* FileDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FileDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* DescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + DescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + DescriptorProto_ExtensionRange_reflection_ = NULL; +const ::google::protobuf::Descriptor* FieldDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FieldDescriptorProto_reflection_ = NULL; +const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor_ = NULL; +const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor_ = NULL; +const ::google::protobuf::Descriptor* OneofDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + OneofDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* EnumDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + EnumDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* EnumValueDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + EnumValueDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* ServiceDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + ServiceDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* MethodDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MethodDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* FileOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FileOptions_reflection_ = NULL; +const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor_ = NULL; +const ::google::protobuf::Descriptor* MessageOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MessageOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* FieldOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FieldOptions_reflection_ = NULL; +const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor_ = NULL; +const ::google::protobuf::Descriptor* EnumOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + EnumOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* EnumValueOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + EnumValueOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* ServiceOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + ServiceOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* MethodOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MethodOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* UninterpretedOption_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + UninterpretedOption_reflection_ = NULL; +const ::google::protobuf::Descriptor* UninterpretedOption_NamePart_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + UninterpretedOption_NamePart_reflection_ = NULL; +const ::google::protobuf::Descriptor* SourceCodeInfo_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + SourceCodeInfo_reflection_ = NULL; +const ::google::protobuf::Descriptor* SourceCodeInfo_Location_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + SourceCodeInfo_Location_reflection_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto() { + protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "google/protobuf/descriptor.proto"); + GOOGLE_CHECK(file != NULL); + FileDescriptorSet_descriptor_ = file->message_type(0); + static const int FileDescriptorSet_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, file_), + }; + FileDescriptorSet_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FileDescriptorSet_descriptor_, + FileDescriptorSet::default_instance_, + FileDescriptorSet_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FileDescriptorSet)); + FileDescriptorProto_descriptor_ = file->message_type(1); + static const int FileDescriptorProto_offsets_[11] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, package_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, dependency_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, public_dependency_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, weak_dependency_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, message_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, enum_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, service_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, extension_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, options_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, source_code_info_), + }; + FileDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FileDescriptorProto_descriptor_, + FileDescriptorProto::default_instance_, + FileDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FileDescriptorProto)); + DescriptorProto_descriptor_ = file->message_type(2); + static const int DescriptorProto_offsets_[8] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, field_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, extension_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, nested_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, enum_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, extension_range_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, oneof_decl_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, options_), + }; + DescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + DescriptorProto_descriptor_, + DescriptorProto::default_instance_, + DescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(DescriptorProto)); + DescriptorProto_ExtensionRange_descriptor_ = DescriptorProto_descriptor_->nested_type(0); + static const int DescriptorProto_ExtensionRange_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, start_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, end_), + }; + DescriptorProto_ExtensionRange_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + DescriptorProto_ExtensionRange_descriptor_, + DescriptorProto_ExtensionRange::default_instance_, + DescriptorProto_ExtensionRange_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(DescriptorProto_ExtensionRange)); + FieldDescriptorProto_descriptor_ = file->message_type(3); + static const int FieldDescriptorProto_offsets_[9] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, number_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, type_name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, extendee_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, default_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, oneof_index_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, options_), + }; + FieldDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FieldDescriptorProto_descriptor_, + FieldDescriptorProto::default_instance_, + FieldDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FieldDescriptorProto)); + FieldDescriptorProto_Type_descriptor_ = FieldDescriptorProto_descriptor_->enum_type(0); + FieldDescriptorProto_Label_descriptor_ = FieldDescriptorProto_descriptor_->enum_type(1); + OneofDescriptorProto_descriptor_ = file->message_type(4); + static const int OneofDescriptorProto_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OneofDescriptorProto, name_), + }; + OneofDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + OneofDescriptorProto_descriptor_, + OneofDescriptorProto::default_instance_, + OneofDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OneofDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(OneofDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(OneofDescriptorProto)); + EnumDescriptorProto_descriptor_ = file->message_type(5); + static const int EnumDescriptorProto_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, options_), + }; + EnumDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + EnumDescriptorProto_descriptor_, + EnumDescriptorProto::default_instance_, + EnumDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(EnumDescriptorProto)); + EnumValueDescriptorProto_descriptor_ = file->message_type(6); + static const int EnumValueDescriptorProto_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, number_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, options_), + }; + EnumValueDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + EnumValueDescriptorProto_descriptor_, + EnumValueDescriptorProto::default_instance_, + EnumValueDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(EnumValueDescriptorProto)); + ServiceDescriptorProto_descriptor_ = file->message_type(7); + static const int ServiceDescriptorProto_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, method_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, options_), + }; + ServiceDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + ServiceDescriptorProto_descriptor_, + ServiceDescriptorProto::default_instance_, + ServiceDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(ServiceDescriptorProto)); + MethodDescriptorProto_descriptor_ = file->message_type(8); + static const int MethodDescriptorProto_offsets_[4] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, input_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, output_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, options_), + }; + MethodDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MethodDescriptorProto_descriptor_, + MethodDescriptorProto::default_instance_, + MethodDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MethodDescriptorProto)); + FileOptions_descriptor_ = file->message_type(9); + static const int FileOptions_offsets_[12] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_package_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_outer_classname_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_multiple_files_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_generate_equals_and_hash_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_string_check_utf8_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, optimize_for_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, go_package_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, cc_generic_services_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_generic_services_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, py_generic_services_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, deprecated_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, uninterpreted_option_), + }; + FileOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FileOptions_descriptor_, + FileOptions::default_instance_, + FileOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FileOptions)); + FileOptions_OptimizeMode_descriptor_ = FileOptions_descriptor_->enum_type(0); + MessageOptions_descriptor_ = file->message_type(10); + static const int MessageOptions_offsets_[4] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, message_set_wire_format_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, no_standard_descriptor_accessor_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, deprecated_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, uninterpreted_option_), + }; + MessageOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MessageOptions_descriptor_, + MessageOptions::default_instance_, + MessageOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MessageOptions)); + FieldOptions_descriptor_ = file->message_type(11); + static const int FieldOptions_offsets_[7] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, ctype_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, packed_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, lazy_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, deprecated_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, experimental_map_key_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, weak_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, uninterpreted_option_), + }; + FieldOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FieldOptions_descriptor_, + FieldOptions::default_instance_, + FieldOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FieldOptions)); + FieldOptions_CType_descriptor_ = FieldOptions_descriptor_->enum_type(0); + EnumOptions_descriptor_ = file->message_type(12); + static const int EnumOptions_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, allow_alias_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, deprecated_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, uninterpreted_option_), + }; + EnumOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + EnumOptions_descriptor_, + EnumOptions::default_instance_, + EnumOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(EnumOptions)); + EnumValueOptions_descriptor_ = file->message_type(13); + static const int EnumValueOptions_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, deprecated_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, uninterpreted_option_), + }; + EnumValueOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + EnumValueOptions_descriptor_, + EnumValueOptions::default_instance_, + EnumValueOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(EnumValueOptions)); + ServiceOptions_descriptor_ = file->message_type(14); + static const int ServiceOptions_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, deprecated_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, uninterpreted_option_), + }; + ServiceOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + ServiceOptions_descriptor_, + ServiceOptions::default_instance_, + ServiceOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(ServiceOptions)); + MethodOptions_descriptor_ = file->message_type(15); + static const int MethodOptions_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, deprecated_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, uninterpreted_option_), + }; + MethodOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MethodOptions_descriptor_, + MethodOptions::default_instance_, + MethodOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MethodOptions)); + UninterpretedOption_descriptor_ = file->message_type(16); + static const int UninterpretedOption_offsets_[7] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, identifier_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, positive_int_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, negative_int_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, double_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, string_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, aggregate_value_), + }; + UninterpretedOption_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + UninterpretedOption_descriptor_, + UninterpretedOption::default_instance_, + UninterpretedOption_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(UninterpretedOption)); + UninterpretedOption_NamePart_descriptor_ = UninterpretedOption_descriptor_->nested_type(0); + static const int UninterpretedOption_NamePart_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, name_part_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, is_extension_), + }; + UninterpretedOption_NamePart_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + UninterpretedOption_NamePart_descriptor_, + UninterpretedOption_NamePart::default_instance_, + UninterpretedOption_NamePart_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(UninterpretedOption_NamePart)); + SourceCodeInfo_descriptor_ = file->message_type(17); + static const int SourceCodeInfo_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, location_), + }; + SourceCodeInfo_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + SourceCodeInfo_descriptor_, + SourceCodeInfo::default_instance_, + SourceCodeInfo_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(SourceCodeInfo)); + SourceCodeInfo_Location_descriptor_ = SourceCodeInfo_descriptor_->nested_type(0); + static const int SourceCodeInfo_Location_offsets_[4] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, path_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, span_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, leading_comments_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, trailing_comments_), + }; + SourceCodeInfo_Location_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + SourceCodeInfo_Location_descriptor_, + SourceCodeInfo_Location::default_instance_, + SourceCodeInfo_Location_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(SourceCodeInfo_Location)); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FileDescriptorSet_descriptor_, &FileDescriptorSet::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FileDescriptorProto_descriptor_, &FileDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + DescriptorProto_descriptor_, &DescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + DescriptorProto_ExtensionRange_descriptor_, &DescriptorProto_ExtensionRange::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FieldDescriptorProto_descriptor_, &FieldDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + OneofDescriptorProto_descriptor_, &OneofDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + EnumDescriptorProto_descriptor_, &EnumDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + EnumValueDescriptorProto_descriptor_, &EnumValueDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + ServiceDescriptorProto_descriptor_, &ServiceDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MethodDescriptorProto_descriptor_, &MethodDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FileOptions_descriptor_, &FileOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MessageOptions_descriptor_, &MessageOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FieldOptions_descriptor_, &FieldOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + EnumOptions_descriptor_, &EnumOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + EnumValueOptions_descriptor_, &EnumValueOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + ServiceOptions_descriptor_, &ServiceOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MethodOptions_descriptor_, &MethodOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + UninterpretedOption_descriptor_, &UninterpretedOption::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + UninterpretedOption_NamePart_descriptor_, &UninterpretedOption_NamePart::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + SourceCodeInfo_descriptor_, &SourceCodeInfo::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + SourceCodeInfo_Location_descriptor_, &SourceCodeInfo_Location::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto() { + delete FileDescriptorSet::default_instance_; + delete FileDescriptorSet_reflection_; + delete FileDescriptorProto::default_instance_; + delete FileDescriptorProto_reflection_; + delete DescriptorProto::default_instance_; + delete DescriptorProto_reflection_; + delete DescriptorProto_ExtensionRange::default_instance_; + delete DescriptorProto_ExtensionRange_reflection_; + delete FieldDescriptorProto::default_instance_; + delete FieldDescriptorProto_reflection_; + delete OneofDescriptorProto::default_instance_; + delete OneofDescriptorProto_reflection_; + delete EnumDescriptorProto::default_instance_; + delete EnumDescriptorProto_reflection_; + delete EnumValueDescriptorProto::default_instance_; + delete EnumValueDescriptorProto_reflection_; + delete ServiceDescriptorProto::default_instance_; + delete ServiceDescriptorProto_reflection_; + delete MethodDescriptorProto::default_instance_; + delete MethodDescriptorProto_reflection_; + delete FileOptions::default_instance_; + delete FileOptions_reflection_; + delete MessageOptions::default_instance_; + delete MessageOptions_reflection_; + delete FieldOptions::default_instance_; + delete FieldOptions_reflection_; + delete EnumOptions::default_instance_; + delete EnumOptions_reflection_; + delete EnumValueOptions::default_instance_; + delete EnumValueOptions_reflection_; + delete ServiceOptions::default_instance_; + delete ServiceOptions_reflection_; + delete MethodOptions::default_instance_; + delete MethodOptions_reflection_; + delete UninterpretedOption::default_instance_; + delete UninterpretedOption_reflection_; + delete UninterpretedOption_NamePart::default_instance_; + delete UninterpretedOption_NamePart_reflection_; + delete SourceCodeInfo::default_instance_; + delete SourceCodeInfo_reflection_; + delete SourceCodeInfo_Location::default_instance_; + delete SourceCodeInfo_Location_reflection_; +} + +void protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n google/protobuf/descriptor.proto\022\017goog" + "le.protobuf\"G\n\021FileDescriptorSet\0222\n\004file" + "\030\001 \003(\0132$.google.protobuf.FileDescriptorP" + "roto\"\313\003\n\023FileDescriptorProto\022\014\n\004name\030\001 \001" + "(\t\022\017\n\007package\030\002 \001(\t\022\022\n\ndependency\030\003 \003(\t\022" + "\031\n\021public_dependency\030\n \003(\005\022\027\n\017weak_depen" + "dency\030\013 \003(\005\0226\n\014message_type\030\004 \003(\0132 .goog" + "le.protobuf.DescriptorProto\0227\n\tenum_type" + "\030\005 \003(\0132$.google.protobuf.EnumDescriptorP" + "roto\0228\n\007service\030\006 \003(\0132\'.google.protobuf." + "ServiceDescriptorProto\0228\n\textension\030\007 \003(" + "\0132%.google.protobuf.FieldDescriptorProto" + "\022-\n\007options\030\010 \001(\0132\034.google.protobuf.File" + "Options\0229\n\020source_code_info\030\t \001(\0132\037.goog" + "le.protobuf.SourceCodeInfo\"\344\003\n\017Descripto" + "rProto\022\014\n\004name\030\001 \001(\t\0224\n\005field\030\002 \003(\0132%.go" + "ogle.protobuf.FieldDescriptorProto\0228\n\tex" + "tension\030\006 \003(\0132%.google.protobuf.FieldDes" + "criptorProto\0225\n\013nested_type\030\003 \003(\0132 .goog" + "le.protobuf.DescriptorProto\0227\n\tenum_type" + "\030\004 \003(\0132$.google.protobuf.EnumDescriptorP" + "roto\022H\n\017extension_range\030\005 \003(\0132/.google.p" + "rotobuf.DescriptorProto.ExtensionRange\0229" + "\n\noneof_decl\030\010 \003(\0132%.google.protobuf.One" + "ofDescriptorProto\0220\n\007options\030\007 \001(\0132\037.goo" + "gle.protobuf.MessageOptions\032,\n\016Extension" + "Range\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\"\251\005\n\024Fi" + "eldDescriptorProto\022\014\n\004name\030\001 \001(\t\022\016\n\006numb" + "er\030\003 \001(\005\022:\n\005label\030\004 \001(\0162+.google.protobu" + "f.FieldDescriptorProto.Label\0228\n\004type\030\005 \001" + "(\0162*.google.protobuf.FieldDescriptorProt" + "o.Type\022\021\n\ttype_name\030\006 \001(\t\022\020\n\010extendee\030\002 " + "\001(\t\022\025\n\rdefault_value\030\007 \001(\t\022\023\n\013oneof_inde" + "x\030\t \001(\005\022.\n\007options\030\010 \001(\0132\035.google.protob" + "uf.FieldOptions\"\266\002\n\004Type\022\017\n\013TYPE_DOUBLE\020" + "\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTYPE_INT64\020\003\022\017\n\013TYP" + "E_UINT64\020\004\022\016\n\nTYPE_INT32\020\005\022\020\n\014TYPE_FIXED" + "64\020\006\022\020\n\014TYPE_FIXED32\020\007\022\r\n\tTYPE_BOOL\020\010\022\017\n" + "\013TYPE_STRING\020\t\022\016\n\nTYPE_GROUP\020\n\022\020\n\014TYPE_M" + "ESSAGE\020\013\022\016\n\nTYPE_BYTES\020\014\022\017\n\013TYPE_UINT32\020" + "\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYPE_SFIXED32\020\017\022\021\n\rT" + "YPE_SFIXED64\020\020\022\017\n\013TYPE_SINT32\020\021\022\017\n\013TYPE_" + "SINT64\020\022\"C\n\005Label\022\022\n\016LABEL_OPTIONAL\020\001\022\022\n" + "\016LABEL_REQUIRED\020\002\022\022\n\016LABEL_REPEATED\020\003\"$\n" + "\024OneofDescriptorProto\022\014\n\004name\030\001 \001(\t\"\214\001\n\023" + "EnumDescriptorProto\022\014\n\004name\030\001 \001(\t\0228\n\005val" + "ue\030\002 \003(\0132).google.protobuf.EnumValueDesc" + "riptorProto\022-\n\007options\030\003 \001(\0132\034.google.pr" + "otobuf.EnumOptions\"l\n\030EnumValueDescripto" + "rProto\022\014\n\004name\030\001 \001(\t\022\016\n\006number\030\002 \001(\005\0222\n\007" + "options\030\003 \001(\0132!.google.protobuf.EnumValu" + "eOptions\"\220\001\n\026ServiceDescriptorProto\022\014\n\004n" + "ame\030\001 \001(\t\0226\n\006method\030\002 \003(\0132&.google.proto" + "buf.MethodDescriptorProto\0220\n\007options\030\003 \001" + "(\0132\037.google.protobuf.ServiceOptions\"\177\n\025M" + "ethodDescriptorProto\022\014\n\004name\030\001 \001(\t\022\022\n\nin" + "put_type\030\002 \001(\t\022\023\n\013output_type\030\003 \001(\t\022/\n\007o" + "ptions\030\004 \001(\0132\036.google.protobuf.MethodOpt" + "ions\"\253\004\n\013FileOptions\022\024\n\014java_package\030\001 \001" + "(\t\022\034\n\024java_outer_classname\030\010 \001(\t\022\"\n\023java" + "_multiple_files\030\n \001(\010:\005false\022,\n\035java_gen" + "erate_equals_and_hash\030\024 \001(\010:\005false\022%\n\026ja" + "va_string_check_utf8\030\033 \001(\010:\005false\022F\n\014opt" + "imize_for\030\t \001(\0162).google.protobuf.FileOp" + "tions.OptimizeMode:\005SPEED\022\022\n\ngo_package\030" + "\013 \001(\t\022\"\n\023cc_generic_services\030\020 \001(\010:\005fals" + "e\022$\n\025java_generic_services\030\021 \001(\010:\005false\022" + "\"\n\023py_generic_services\030\022 \001(\010:\005false\022\031\n\nd" + "eprecated\030\027 \001(\010:\005false\022C\n\024uninterpreted_" + "option\030\347\007 \003(\0132$.google.protobuf.Uninterp" + "retedOption\":\n\014OptimizeMode\022\t\n\005SPEED\020\001\022\r" + "\n\tCODE_SIZE\020\002\022\020\n\014LITE_RUNTIME\020\003*\t\010\350\007\020\200\200\200" + "\200\002\"\323\001\n\016MessageOptions\022&\n\027message_set_wir" + "e_format\030\001 \001(\010:\005false\022.\n\037no_standard_des" + "criptor_accessor\030\002 \001(\010:\005false\022\031\n\ndepreca" + "ted\030\003 \001(\010:\005false\022C\n\024uninterpreted_option" + "\030\347\007 \003(\0132$.google.protobuf.UninterpretedO" + "ption*\t\010\350\007\020\200\200\200\200\002\"\276\002\n\014FieldOptions\022:\n\005cty" + "pe\030\001 \001(\0162#.google.protobuf.FieldOptions." + "CType:\006STRING\022\016\n\006packed\030\002 \001(\010\022\023\n\004lazy\030\005 " + "\001(\010:\005false\022\031\n\ndeprecated\030\003 \001(\010:\005false\022\034\n" + "\024experimental_map_key\030\t \001(\t\022\023\n\004weak\030\n \001(" + "\010:\005false\022C\n\024uninterpreted_option\030\347\007 \003(\0132" + "$.google.protobuf.UninterpretedOption\"/\n" + "\005CType\022\n\n\006STRING\020\000\022\010\n\004CORD\020\001\022\020\n\014STRING_P" + "IECE\020\002*\t\010\350\007\020\200\200\200\200\002\"\215\001\n\013EnumOptions\022\023\n\013all" + "ow_alias\030\002 \001(\010\022\031\n\ndeprecated\030\003 \001(\010:\005fals" + "e\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.googl" + "e.protobuf.UninterpretedOption*\t\010\350\007\020\200\200\200\200" + "\002\"}\n\020EnumValueOptions\022\031\n\ndeprecated\030\001 \001(" + "\010:\005false\022C\n\024uninterpreted_option\030\347\007 \003(\0132" + "$.google.protobuf.UninterpretedOption*\t\010" + "\350\007\020\200\200\200\200\002\"{\n\016ServiceOptions\022\031\n\ndeprecated" + "\030! \001(\010:\005false\022C\n\024uninterpreted_option\030\347\007" + " \003(\0132$.google.protobuf.UninterpretedOpti" + "on*\t\010\350\007\020\200\200\200\200\002\"z\n\rMethodOptions\022\031\n\ndeprec" + "ated\030! \001(\010:\005false\022C\n\024uninterpreted_optio" + "n\030\347\007 \003(\0132$.google.protobuf.Uninterpreted" + "Option*\t\010\350\007\020\200\200\200\200\002\"\236\002\n\023UninterpretedOptio" + "n\022;\n\004name\030\002 \003(\0132-.google.protobuf.Uninte" + "rpretedOption.NamePart\022\030\n\020identifier_val" + "ue\030\003 \001(\t\022\032\n\022positive_int_value\030\004 \001(\004\022\032\n\022" + "negative_int_value\030\005 \001(\003\022\024\n\014double_value" + "\030\006 \001(\001\022\024\n\014string_value\030\007 \001(\014\022\027\n\017aggregat" + "e_value\030\010 \001(\t\0323\n\010NamePart\022\021\n\tname_part\030\001" + " \002(\t\022\024\n\014is_extension\030\002 \002(\010\"\261\001\n\016SourceCod" + "eInfo\022:\n\010location\030\001 \003(\0132(.google.protobu" + "f.SourceCodeInfo.Location\032c\n\010Location\022\020\n" + "\004path\030\001 \003(\005B\002\020\001\022\020\n\004span\030\002 \003(\005B\002\020\001\022\030\n\020lea" + "ding_comments\030\003 \001(\t\022\031\n\021trailing_comments" + "\030\004 \001(\tB)\n\023com.google.protobufB\020Descripto" + "rProtosH\001", 4449); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "google/protobuf/descriptor.proto", &protobuf_RegisterTypes); + FileDescriptorSet::default_instance_ = new FileDescriptorSet(); + FileDescriptorProto::default_instance_ = new FileDescriptorProto(); + DescriptorProto::default_instance_ = new DescriptorProto(); + DescriptorProto_ExtensionRange::default_instance_ = new DescriptorProto_ExtensionRange(); + FieldDescriptorProto::default_instance_ = new FieldDescriptorProto(); + OneofDescriptorProto::default_instance_ = new OneofDescriptorProto(); + EnumDescriptorProto::default_instance_ = new EnumDescriptorProto(); + EnumValueDescriptorProto::default_instance_ = new EnumValueDescriptorProto(); + ServiceDescriptorProto::default_instance_ = new ServiceDescriptorProto(); + MethodDescriptorProto::default_instance_ = new MethodDescriptorProto(); + FileOptions::default_instance_ = new FileOptions(); + MessageOptions::default_instance_ = new MessageOptions(); + FieldOptions::default_instance_ = new FieldOptions(); + EnumOptions::default_instance_ = new EnumOptions(); + EnumValueOptions::default_instance_ = new EnumValueOptions(); + ServiceOptions::default_instance_ = new ServiceOptions(); + MethodOptions::default_instance_ = new MethodOptions(); + UninterpretedOption::default_instance_ = new UninterpretedOption(); + UninterpretedOption_NamePart::default_instance_ = new UninterpretedOption_NamePart(); + SourceCodeInfo::default_instance_ = new SourceCodeInfo(); + SourceCodeInfo_Location::default_instance_ = new SourceCodeInfo_Location(); + FileDescriptorSet::default_instance_->InitAsDefaultInstance(); + FileDescriptorProto::default_instance_->InitAsDefaultInstance(); + DescriptorProto::default_instance_->InitAsDefaultInstance(); + DescriptorProto_ExtensionRange::default_instance_->InitAsDefaultInstance(); + FieldDescriptorProto::default_instance_->InitAsDefaultInstance(); + OneofDescriptorProto::default_instance_->InitAsDefaultInstance(); + EnumDescriptorProto::default_instance_->InitAsDefaultInstance(); + EnumValueDescriptorProto::default_instance_->InitAsDefaultInstance(); + ServiceDescriptorProto::default_instance_->InitAsDefaultInstance(); + MethodDescriptorProto::default_instance_->InitAsDefaultInstance(); + FileOptions::default_instance_->InitAsDefaultInstance(); + MessageOptions::default_instance_->InitAsDefaultInstance(); + FieldOptions::default_instance_->InitAsDefaultInstance(); + EnumOptions::default_instance_->InitAsDefaultInstance(); + EnumValueOptions::default_instance_->InitAsDefaultInstance(); + ServiceOptions::default_instance_->InitAsDefaultInstance(); + MethodOptions::default_instance_->InitAsDefaultInstance(); + UninterpretedOption::default_instance_->InitAsDefaultInstance(); + UninterpretedOption_NamePart::default_instance_->InitAsDefaultInstance(); + SourceCodeInfo::default_instance_->InitAsDefaultInstance(); + SourceCodeInfo_Location::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_google_2fprotobuf_2fdescriptor_2eproto { + StaticDescriptorInitializer_google_2fprotobuf_2fdescriptor_2eproto() { + protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + } +} static_descriptor_initializer_google_2fprotobuf_2fdescriptor_2eproto_; + +// =================================================================== + +#ifndef _MSC_VER +const int FileDescriptorSet::kFileFieldNumber; +#endif // !_MSC_VER + +FileDescriptorSet::FileDescriptorSet() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.FileDescriptorSet) +} + +void FileDescriptorSet::InitAsDefaultInstance() { +} + +FileDescriptorSet::FileDescriptorSet(const FileDescriptorSet& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorSet) +} + +void FileDescriptorSet::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FileDescriptorSet::~FileDescriptorSet() { + // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorSet) + SharedDtor(); +} + +void FileDescriptorSet::SharedDtor() { + if (this != default_instance_) { + } +} + +void FileDescriptorSet::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FileDescriptorSet::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FileDescriptorSet_descriptor_; +} + +const FileDescriptorSet& FileDescriptorSet::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +FileDescriptorSet* FileDescriptorSet::default_instance_ = NULL; + +FileDescriptorSet* FileDescriptorSet::New() const { + return new FileDescriptorSet; +} + +void FileDescriptorSet::Clear() { + file_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FileDescriptorSet::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.FileDescriptorSet) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.FileDescriptorProto file = 1; + case 1: { + if (tag == 10) { + parse_file: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_file())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(10)) goto parse_file; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.FileDescriptorSet) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.FileDescriptorSet) + return false; +#undef DO_ +} + +void FileDescriptorSet::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.FileDescriptorSet) + // repeated .google.protobuf.FileDescriptorProto file = 1; + for (int i = 0; i < this->file_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->file(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.FileDescriptorSet) +} + +::google::protobuf::uint8* FileDescriptorSet::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorSet) + // repeated .google.protobuf.FileDescriptorProto file = 1; + for (int i = 0; i < this->file_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->file(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorSet) + return target; +} + +int FileDescriptorSet::ByteSize() const { + int total_size = 0; + + // repeated .google.protobuf.FileDescriptorProto file = 1; + total_size += 1 * this->file_size(); + for (int i = 0; i < this->file_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->file(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FileDescriptorSet::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FileDescriptorSet* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FileDescriptorSet::MergeFrom(const FileDescriptorSet& from) { + GOOGLE_CHECK_NE(&from, this); + file_.MergeFrom(from.file_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FileDescriptorSet::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FileDescriptorSet::CopyFrom(const FileDescriptorSet& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FileDescriptorSet::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->file())) return false; + return true; +} + +void FileDescriptorSet::Swap(FileDescriptorSet* other) { + if (other != this) { + file_.Swap(&other->file_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata FileDescriptorSet::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FileDescriptorSet_descriptor_; + metadata.reflection = FileDescriptorSet_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int FileDescriptorProto::kNameFieldNumber; +const int FileDescriptorProto::kPackageFieldNumber; +const int FileDescriptorProto::kDependencyFieldNumber; +const int FileDescriptorProto::kPublicDependencyFieldNumber; +const int FileDescriptorProto::kWeakDependencyFieldNumber; +const int FileDescriptorProto::kMessageTypeFieldNumber; +const int FileDescriptorProto::kEnumTypeFieldNumber; +const int FileDescriptorProto::kServiceFieldNumber; +const int FileDescriptorProto::kExtensionFieldNumber; +const int FileDescriptorProto::kOptionsFieldNumber; +const int FileDescriptorProto::kSourceCodeInfoFieldNumber; +#endif // !_MSC_VER + +FileDescriptorProto::FileDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.FileDescriptorProto) +} + +void FileDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::FileOptions*>(&::google::protobuf::FileOptions::default_instance()); + source_code_info_ = const_cast< ::google::protobuf::SourceCodeInfo*>(&::google::protobuf::SourceCodeInfo::default_instance()); +} + +FileDescriptorProto::FileDescriptorProto(const FileDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorProto) +} + +void FileDescriptorProto::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + options_ = NULL; + source_code_info_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FileDescriptorProto::~FileDescriptorProto() { + // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorProto) + SharedDtor(); +} + +void FileDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete package_; + } + if (this != default_instance_) { + delete options_; + delete source_code_info_; + } +} + +void FileDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FileDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FileDescriptorProto_descriptor_; +} + +const FileDescriptorProto& FileDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +FileDescriptorProto* FileDescriptorProto::default_instance_ = NULL; + +FileDescriptorProto* FileDescriptorProto::New() const { + return new FileDescriptorProto; +} + +void FileDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + if (has_package()) { + if (package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + package_->clear(); + } + } + } + if (_has_bits_[8 / 32] & 1536) { + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::FileOptions::Clear(); + } + if (has_source_code_info()) { + if (source_code_info_ != NULL) source_code_info_->::google::protobuf::SourceCodeInfo::Clear(); + } + } + dependency_.Clear(); + public_dependency_.Clear(); + weak_dependency_.Clear(); + message_type_.Clear(); + enum_type_.Clear(); + service_.Clear(); + extension_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FileDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.FileDescriptorProto) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_package; + break; + } + + // optional string package = 2; + case 2: { + if (tag == 18) { + parse_package: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_package())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->package().data(), this->package().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "package"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_dependency; + break; + } + + // repeated string dependency = 3; + case 3: { + if (tag == 26) { + parse_dependency: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_dependency())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->dependency(this->dependency_size() - 1).data(), + this->dependency(this->dependency_size() - 1).length(), + ::google::protobuf::internal::WireFormat::PARSE, + "dependency"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_dependency; + if (input->ExpectTag(34)) goto parse_message_type; + break; + } + + // repeated .google.protobuf.DescriptorProto message_type = 4; + case 4: { + if (tag == 34) { + parse_message_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_message_type())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_message_type; + if (input->ExpectTag(42)) goto parse_enum_type; + break; + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + case 5: { + if (tag == 42) { + parse_enum_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_enum_type())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_enum_type; + if (input->ExpectTag(50)) goto parse_service; + break; + } + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + case 6: { + if (tag == 50) { + parse_service: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_service())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(50)) goto parse_service; + if (input->ExpectTag(58)) goto parse_extension; + break; + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + case 7: { + if (tag == 58) { + parse_extension: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_extension())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(58)) goto parse_extension; + if (input->ExpectTag(66)) goto parse_options; + break; + } + + // optional .google.protobuf.FileOptions options = 8; + case 8: { + if (tag == 66) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(74)) goto parse_source_code_info; + break; + } + + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + case 9: { + if (tag == 74) { + parse_source_code_info: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_source_code_info())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(80)) goto parse_public_dependency; + break; + } + + // repeated int32 public_dependency = 10; + case 10: { + if (tag == 80) { + parse_public_dependency: + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + 1, 80, input, this->mutable_public_dependency()))); + } else if (tag == 82) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, this->mutable_public_dependency()))); + } else { + goto handle_unusual; + } + if (input->ExpectTag(80)) goto parse_public_dependency; + if (input->ExpectTag(88)) goto parse_weak_dependency; + break; + } + + // repeated int32 weak_dependency = 11; + case 11: { + if (tag == 88) { + parse_weak_dependency: + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + 1, 88, input, this->mutable_weak_dependency()))); + } else if (tag == 90) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, this->mutable_weak_dependency()))); + } else { + goto handle_unusual; + } + if (input->ExpectTag(88)) goto parse_weak_dependency; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.FileDescriptorProto) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.FileDescriptorProto) + return false; +#undef DO_ +} + +void FileDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.FileDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // optional string package = 2; + if (has_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->package().data(), this->package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "package"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->package(), output); + } + + // repeated string dependency = 3; + for (int i = 0; i < this->dependency_size(); i++) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->dependency(i).data(), this->dependency(i).length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "dependency"); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->dependency(i), output); + } + + // repeated .google.protobuf.DescriptorProto message_type = 4; + for (int i = 0; i < this->message_type_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->message_type(i), output); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + for (int i = 0; i < this->enum_type_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 5, this->enum_type(i), output); + } + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + for (int i = 0; i < this->service_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 6, this->service(i), output); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + for (int i = 0; i < this->extension_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 7, this->extension(i), output); + } + + // optional .google.protobuf.FileOptions options = 8; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 8, this->options(), output); + } + + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + if (has_source_code_info()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 9, this->source_code_info(), output); + } + + // repeated int32 public_dependency = 10; + for (int i = 0; i < this->public_dependency_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteInt32( + 10, this->public_dependency(i), output); + } + + // repeated int32 weak_dependency = 11; + for (int i = 0; i < this->weak_dependency_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteInt32( + 11, this->weak_dependency(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.FileDescriptorProto) +} + +::google::protobuf::uint8* FileDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string package = 2; + if (has_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->package().data(), this->package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "package"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->package(), target); + } + + // repeated string dependency = 3; + for (int i = 0; i < this->dependency_size(); i++) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->dependency(i).data(), this->dependency(i).length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "dependency"); + target = ::google::protobuf::internal::WireFormatLite:: + WriteStringToArray(3, this->dependency(i), target); + } + + // repeated .google.protobuf.DescriptorProto message_type = 4; + for (int i = 0; i < this->message_type_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->message_type(i), target); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + for (int i = 0; i < this->enum_type_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 5, this->enum_type(i), target); + } + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + for (int i = 0; i < this->service_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 6, this->service(i), target); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + for (int i = 0; i < this->extension_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 7, this->extension(i), target); + } + + // optional .google.protobuf.FileOptions options = 8; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 8, this->options(), target); + } + + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + if (has_source_code_info()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 9, this->source_code_info(), target); + } + + // repeated int32 public_dependency = 10; + for (int i = 0; i < this->public_dependency_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteInt32ToArray(10, this->public_dependency(i), target); + } + + // repeated int32 weak_dependency = 11; + for (int i = 0; i < this->weak_dependency_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteInt32ToArray(11, this->weak_dependency(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorProto) + return target; +} + +int FileDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional string package = 2; + if (has_package()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->package()); + } + + } + if (_has_bits_[9 / 32] & (0xffu << (9 % 32))) { + // optional .google.protobuf.FileOptions options = 8; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + if (has_source_code_info()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->source_code_info()); + } + + } + // repeated string dependency = 3; + total_size += 1 * this->dependency_size(); + for (int i = 0; i < this->dependency_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->dependency(i)); + } + + // repeated int32 public_dependency = 10; + { + int data_size = 0; + for (int i = 0; i < this->public_dependency_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + Int32Size(this->public_dependency(i)); + } + total_size += 1 * this->public_dependency_size() + data_size; + } + + // repeated int32 weak_dependency = 11; + { + int data_size = 0; + for (int i = 0; i < this->weak_dependency_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + Int32Size(this->weak_dependency(i)); + } + total_size += 1 * this->weak_dependency_size() + data_size; + } + + // repeated .google.protobuf.DescriptorProto message_type = 4; + total_size += 1 * this->message_type_size(); + for (int i = 0; i < this->message_type_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->message_type(i)); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + total_size += 1 * this->enum_type_size(); + for (int i = 0; i < this->enum_type_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->enum_type(i)); + } + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + total_size += 1 * this->service_size(); + for (int i = 0; i < this->service_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->service(i)); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + total_size += 1 * this->extension_size(); + for (int i = 0; i < this->extension_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->extension(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FileDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FileDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FileDescriptorProto::MergeFrom(const FileDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + dependency_.MergeFrom(from.dependency_); + public_dependency_.MergeFrom(from.public_dependency_); + weak_dependency_.MergeFrom(from.weak_dependency_); + message_type_.MergeFrom(from.message_type_); + enum_type_.MergeFrom(from.enum_type_); + service_.MergeFrom(from.service_); + extension_.MergeFrom(from.extension_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_package()) { + set_package(from.package()); + } + } + if (from._has_bits_[9 / 32] & (0xffu << (9 % 32))) { + if (from.has_options()) { + mutable_options()->::google::protobuf::FileOptions::MergeFrom(from.options()); + } + if (from.has_source_code_info()) { + mutable_source_code_info()->::google::protobuf::SourceCodeInfo::MergeFrom(from.source_code_info()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FileDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FileDescriptorProto::CopyFrom(const FileDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FileDescriptorProto::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->message_type())) return false; + if (!::google::protobuf::internal::AllAreInitialized(this->enum_type())) return false; + if (!::google::protobuf::internal::AllAreInitialized(this->service())) return false; + if (!::google::protobuf::internal::AllAreInitialized(this->extension())) return false; + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void FileDescriptorProto::Swap(FileDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(package_, other->package_); + dependency_.Swap(&other->dependency_); + public_dependency_.Swap(&other->public_dependency_); + weak_dependency_.Swap(&other->weak_dependency_); + message_type_.Swap(&other->message_type_); + enum_type_.Swap(&other->enum_type_); + service_.Swap(&other->service_); + extension_.Swap(&other->extension_); + std::swap(options_, other->options_); + std::swap(source_code_info_, other->source_code_info_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata FileDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FileDescriptorProto_descriptor_; + metadata.reflection = FileDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int DescriptorProto_ExtensionRange::kStartFieldNumber; +const int DescriptorProto_ExtensionRange::kEndFieldNumber; +#endif // !_MSC_VER + +DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto.ExtensionRange) +} + +void DescriptorProto_ExtensionRange::InitAsDefaultInstance() { +} + +DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto.ExtensionRange) +} + +void DescriptorProto_ExtensionRange::SharedCtor() { + _cached_size_ = 0; + start_ = 0; + end_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +DescriptorProto_ExtensionRange::~DescriptorProto_ExtensionRange() { + // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto.ExtensionRange) + SharedDtor(); +} + +void DescriptorProto_ExtensionRange::SharedDtor() { + if (this != default_instance_) { + } +} + +void DescriptorProto_ExtensionRange::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange::descriptor() { + protobuf_AssignDescriptorsOnce(); + return DescriptorProto_ExtensionRange_descriptor_; +} + +const DescriptorProto_ExtensionRange& DescriptorProto_ExtensionRange::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +DescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::default_instance_ = NULL; + +DescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::New() const { + return new DescriptorProto_ExtensionRange; +} + +void DescriptorProto_ExtensionRange::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(start_, end_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool DescriptorProto_ExtensionRange::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto.ExtensionRange) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional int32 start = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &start_))); + set_has_start(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(16)) goto parse_end; + break; + } + + // optional int32 end = 2; + case 2: { + if (tag == 16) { + parse_end: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &end_))); + set_has_end(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto.ExtensionRange) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto.ExtensionRange) + return false; +#undef DO_ +} + +void DescriptorProto_ExtensionRange::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto.ExtensionRange) + // optional int32 start = 1; + if (has_start()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output); + } + + // optional int32 end = 2; + if (has_end()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto.ExtensionRange) +} + +::google::protobuf::uint8* DescriptorProto_ExtensionRange::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ExtensionRange) + // optional int32 start = 1; + if (has_start()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target); + } + + // optional int32 end = 2; + if (has_end()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto.ExtensionRange) + return target; +} + +int DescriptorProto_ExtensionRange::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional int32 start = 1; + if (has_start()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->start()); + } + + // optional int32 end = 2; + if (has_end()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->end()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void DescriptorProto_ExtensionRange::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const DescriptorProto_ExtensionRange* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void DescriptorProto_ExtensionRange::MergeFrom(const DescriptorProto_ExtensionRange& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_start()) { + set_start(from.start()); + } + if (from.has_end()) { + set_end(from.end()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void DescriptorProto_ExtensionRange::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void DescriptorProto_ExtensionRange::CopyFrom(const DescriptorProto_ExtensionRange& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool DescriptorProto_ExtensionRange::IsInitialized() const { + + return true; +} + +void DescriptorProto_ExtensionRange::Swap(DescriptorProto_ExtensionRange* other) { + if (other != this) { + std::swap(start_, other->start_); + std::swap(end_, other->end_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata DescriptorProto_ExtensionRange::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = DescriptorProto_ExtensionRange_descriptor_; + metadata.reflection = DescriptorProto_ExtensionRange_reflection_; + return metadata; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int DescriptorProto::kNameFieldNumber; +const int DescriptorProto::kFieldFieldNumber; +const int DescriptorProto::kExtensionFieldNumber; +const int DescriptorProto::kNestedTypeFieldNumber; +const int DescriptorProto::kEnumTypeFieldNumber; +const int DescriptorProto::kExtensionRangeFieldNumber; +const int DescriptorProto::kOneofDeclFieldNumber; +const int DescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +DescriptorProto::DescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto) +} + +void DescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::MessageOptions*>(&::google::protobuf::MessageOptions::default_instance()); +} + +DescriptorProto::DescriptorProto(const DescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto) +} + +void DescriptorProto::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +DescriptorProto::~DescriptorProto() { + // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto) + SharedDtor(); +} + +void DescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (this != default_instance_) { + delete options_; + } +} + +void DescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* DescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return DescriptorProto_descriptor_; +} + +const DescriptorProto& DescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +DescriptorProto* DescriptorProto::default_instance_ = NULL; + +DescriptorProto* DescriptorProto::New() const { + return new DescriptorProto; +} + +void DescriptorProto::Clear() { + if (_has_bits_[0 / 32] & 129) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::MessageOptions::Clear(); + } + } + field_.Clear(); + extension_.Clear(); + nested_type_.Clear(); + enum_type_.Clear(); + extension_range_.Clear(); + oneof_decl_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool DescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_field; + break; + } + + // repeated .google.protobuf.FieldDescriptorProto field = 2; + case 2: { + if (tag == 18) { + parse_field: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_field())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_field; + if (input->ExpectTag(26)) goto parse_nested_type; + break; + } + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + case 3: { + if (tag == 26) { + parse_nested_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_nested_type())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_nested_type; + if (input->ExpectTag(34)) goto parse_enum_type; + break; + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + case 4: { + if (tag == 34) { + parse_enum_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_enum_type())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_enum_type; + if (input->ExpectTag(42)) goto parse_extension_range; + break; + } + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + case 5: { + if (tag == 42) { + parse_extension_range: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_extension_range())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(42)) goto parse_extension_range; + if (input->ExpectTag(50)) goto parse_extension; + break; + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + case 6: { + if (tag == 50) { + parse_extension: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_extension())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(50)) goto parse_extension; + if (input->ExpectTag(58)) goto parse_options; + break; + } + + // optional .google.protobuf.MessageOptions options = 7; + case 7: { + if (tag == 58) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(66)) goto parse_oneof_decl; + break; + } + + // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; + case 8: { + if (tag == 66) { + parse_oneof_decl: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_oneof_decl())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(66)) goto parse_oneof_decl; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto) + return false; +#undef DO_ +} + +void DescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // repeated .google.protobuf.FieldDescriptorProto field = 2; + for (int i = 0; i < this->field_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->field(i), output); + } + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + for (int i = 0; i < this->nested_type_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->nested_type(i), output); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + for (int i = 0; i < this->enum_type_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->enum_type(i), output); + } + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + for (int i = 0; i < this->extension_range_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 5, this->extension_range(i), output); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + for (int i = 0; i < this->extension_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 6, this->extension(i), output); + } + + // optional .google.protobuf.MessageOptions options = 7; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 7, this->options(), output); + } + + // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; + for (int i = 0; i < this->oneof_decl_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 8, this->oneof_decl(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto) +} + +::google::protobuf::uint8* DescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // repeated .google.protobuf.FieldDescriptorProto field = 2; + for (int i = 0; i < this->field_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->field(i), target); + } + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + for (int i = 0; i < this->nested_type_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->nested_type(i), target); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + for (int i = 0; i < this->enum_type_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->enum_type(i), target); + } + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + for (int i = 0; i < this->extension_range_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 5, this->extension_range(i), target); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + for (int i = 0; i < this->extension_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 6, this->extension(i), target); + } + + // optional .google.protobuf.MessageOptions options = 7; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 7, this->options(), target); + } + + // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; + for (int i = 0; i < this->oneof_decl_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 8, this->oneof_decl(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto) + return target; +} + +int DescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional .google.protobuf.MessageOptions options = 7; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + // repeated .google.protobuf.FieldDescriptorProto field = 2; + total_size += 1 * this->field_size(); + for (int i = 0; i < this->field_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->field(i)); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + total_size += 1 * this->extension_size(); + for (int i = 0; i < this->extension_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->extension(i)); + } + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + total_size += 1 * this->nested_type_size(); + for (int i = 0; i < this->nested_type_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->nested_type(i)); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + total_size += 1 * this->enum_type_size(); + for (int i = 0; i < this->enum_type_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->enum_type(i)); + } + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + total_size += 1 * this->extension_range_size(); + for (int i = 0; i < this->extension_range_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->extension_range(i)); + } + + // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; + total_size += 1 * this->oneof_decl_size(); + for (int i = 0; i < this->oneof_decl_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->oneof_decl(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void DescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const DescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void DescriptorProto::MergeFrom(const DescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + field_.MergeFrom(from.field_); + extension_.MergeFrom(from.extension_); + nested_type_.MergeFrom(from.nested_type_); + enum_type_.MergeFrom(from.enum_type_); + extension_range_.MergeFrom(from.extension_range_); + oneof_decl_.MergeFrom(from.oneof_decl_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::MessageOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void DescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void DescriptorProto::CopyFrom(const DescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool DescriptorProto::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->field())) return false; + if (!::google::protobuf::internal::AllAreInitialized(this->extension())) return false; + if (!::google::protobuf::internal::AllAreInitialized(this->nested_type())) return false; + if (!::google::protobuf::internal::AllAreInitialized(this->enum_type())) return false; + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void DescriptorProto::Swap(DescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + field_.Swap(&other->field_); + extension_.Swap(&other->extension_); + nested_type_.Swap(&other->nested_type_); + enum_type_.Swap(&other->enum_type_); + extension_range_.Swap(&other->extension_range_); + oneof_decl_.Swap(&other->oneof_decl_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata DescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = DescriptorProto_descriptor_; + metadata.reflection = DescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldDescriptorProto_Type_descriptor_; +} +bool FieldDescriptorProto_Type_IsValid(int value) { + switch(value) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_DOUBLE; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FLOAT; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_INT64; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_UINT64; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_INT32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FIXED64; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FIXED32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_BOOL; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_STRING; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_GROUP; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_MESSAGE; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_BYTES; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_UINT32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_ENUM; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SFIXED32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SFIXED64; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SINT32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SINT64; +const FieldDescriptorProto_Type FieldDescriptorProto::Type_MIN; +const FieldDescriptorProto_Type FieldDescriptorProto::Type_MAX; +const int FieldDescriptorProto::Type_ARRAYSIZE; +#endif // _MSC_VER +const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldDescriptorProto_Label_descriptor_; +} +bool FieldDescriptorProto_Label_IsValid(int value) { + switch(value) { + case 1: + case 2: + case 3: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const FieldDescriptorProto_Label FieldDescriptorProto::LABEL_OPTIONAL; +const FieldDescriptorProto_Label FieldDescriptorProto::LABEL_REQUIRED; +const FieldDescriptorProto_Label FieldDescriptorProto::LABEL_REPEATED; +const FieldDescriptorProto_Label FieldDescriptorProto::Label_MIN; +const FieldDescriptorProto_Label FieldDescriptorProto::Label_MAX; +const int FieldDescriptorProto::Label_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int FieldDescriptorProto::kNameFieldNumber; +const int FieldDescriptorProto::kNumberFieldNumber; +const int FieldDescriptorProto::kLabelFieldNumber; +const int FieldDescriptorProto::kTypeFieldNumber; +const int FieldDescriptorProto::kTypeNameFieldNumber; +const int FieldDescriptorProto::kExtendeeFieldNumber; +const int FieldDescriptorProto::kDefaultValueFieldNumber; +const int FieldDescriptorProto::kOneofIndexFieldNumber; +const int FieldDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +FieldDescriptorProto::FieldDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.FieldDescriptorProto) +} + +void FieldDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::FieldOptions*>(&::google::protobuf::FieldOptions::default_instance()); +} + +FieldDescriptorProto::FieldDescriptorProto(const FieldDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldDescriptorProto) +} + +void FieldDescriptorProto::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + number_ = 0; + label_ = 1; + type_ = 1; + type_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + extendee_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + default_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + oneof_index_ = 0; + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FieldDescriptorProto::~FieldDescriptorProto() { + // @@protoc_insertion_point(destructor:google.protobuf.FieldDescriptorProto) + SharedDtor(); +} + +void FieldDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (type_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete type_name_; + } + if (extendee_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete extendee_; + } + if (default_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete default_value_; + } + if (this != default_instance_) { + delete options_; + } +} + +void FieldDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FieldDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldDescriptorProto_descriptor_; +} + +const FieldDescriptorProto& FieldDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +FieldDescriptorProto* FieldDescriptorProto::default_instance_ = NULL; + +FieldDescriptorProto* FieldDescriptorProto::New() const { + return new FieldDescriptorProto; +} + +void FieldDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & 255) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + number_ = 0; + label_ = 1; + type_ = 1; + if (has_type_name()) { + if (type_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + type_name_->clear(); + } + } + if (has_extendee()) { + if (extendee_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + extendee_->clear(); + } + } + if (has_default_value()) { + if (default_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + default_value_->clear(); + } + } + oneof_index_ = 0; + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::FieldOptions::Clear(); + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FieldDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.FieldDescriptorProto) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_extendee; + break; + } + + // optional string extendee = 2; + case 2: { + if (tag == 18) { + parse_extendee: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_extendee())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->extendee().data(), this->extendee().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "extendee"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_number; + break; + } + + // optional int32 number = 3; + case 3: { + if (tag == 24) { + parse_number: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &number_))); + set_has_number(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(32)) goto parse_label; + break; + } + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + case 4: { + if (tag == 32) { + parse_label: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::google::protobuf::FieldDescriptorProto_Label_IsValid(value)) { + set_label(static_cast< ::google::protobuf::FieldDescriptorProto_Label >(value)); + } else { + mutable_unknown_fields()->AddVarint(4, value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(40)) goto parse_type; + break; + } + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + case 5: { + if (tag == 40) { + parse_type: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::google::protobuf::FieldDescriptorProto_Type_IsValid(value)) { + set_type(static_cast< ::google::protobuf::FieldDescriptorProto_Type >(value)); + } else { + mutable_unknown_fields()->AddVarint(5, value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(50)) goto parse_type_name; + break; + } + + // optional string type_name = 6; + case 6: { + if (tag == 50) { + parse_type_name: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_type_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->type_name().data(), this->type_name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "type_name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(58)) goto parse_default_value; + break; + } + + // optional string default_value = 7; + case 7: { + if (tag == 58) { + parse_default_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_default_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->default_value().data(), this->default_value().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "default_value"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(66)) goto parse_options; + break; + } + + // optional .google.protobuf.FieldOptions options = 8; + case 8: { + if (tag == 66) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(72)) goto parse_oneof_index; + break; + } + + // optional int32 oneof_index = 9; + case 9: { + if (tag == 72) { + parse_oneof_index: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &oneof_index_))); + set_has_oneof_index(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.FieldDescriptorProto) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.FieldDescriptorProto) + return false; +#undef DO_ +} + +void FieldDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.FieldDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // optional string extendee = 2; + if (has_extendee()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->extendee().data(), this->extendee().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "extendee"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->extendee(), output); + } + + // optional int32 number = 3; + if (has_number()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->number(), output); + } + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + if (has_label()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 4, this->label(), output); + } + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + if (has_type()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 5, this->type(), output); + } + + // optional string type_name = 6; + if (has_type_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->type_name().data(), this->type_name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "type_name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 6, this->type_name(), output); + } + + // optional string default_value = 7; + if (has_default_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->default_value().data(), this->default_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "default_value"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 7, this->default_value(), output); + } + + // optional .google.protobuf.FieldOptions options = 8; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 8, this->options(), output); + } + + // optional int32 oneof_index = 9; + if (has_oneof_index()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(9, this->oneof_index(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.FieldDescriptorProto) +} + +::google::protobuf::uint8* FieldDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string extendee = 2; + if (has_extendee()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->extendee().data(), this->extendee().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "extendee"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->extendee(), target); + } + + // optional int32 number = 3; + if (has_number()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->number(), target); + } + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + if (has_label()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 4, this->label(), target); + } + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + if (has_type()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 5, this->type(), target); + } + + // optional string type_name = 6; + if (has_type_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->type_name().data(), this->type_name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "type_name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 6, this->type_name(), target); + } + + // optional string default_value = 7; + if (has_default_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->default_value().data(), this->default_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "default_value"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 7, this->default_value(), target); + } + + // optional .google.protobuf.FieldOptions options = 8; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 8, this->options(), target); + } + + // optional int32 oneof_index = 9; + if (has_oneof_index()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(9, this->oneof_index(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldDescriptorProto) + return target; +} + +int FieldDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional int32 number = 3; + if (has_number()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->number()); + } + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + if (has_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->label()); + } + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + if (has_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); + } + + // optional string type_name = 6; + if (has_type_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->type_name()); + } + + // optional string extendee = 2; + if (has_extendee()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->extendee()); + } + + // optional string default_value = 7; + if (has_default_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->default_value()); + } + + // optional int32 oneof_index = 9; + if (has_oneof_index()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->oneof_index()); + } + + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + // optional .google.protobuf.FieldOptions options = 8; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FieldDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FieldDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FieldDescriptorProto::MergeFrom(const FieldDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_number()) { + set_number(from.number()); + } + if (from.has_label()) { + set_label(from.label()); + } + if (from.has_type()) { + set_type(from.type()); + } + if (from.has_type_name()) { + set_type_name(from.type_name()); + } + if (from.has_extendee()) { + set_extendee(from.extendee()); + } + if (from.has_default_value()) { + set_default_value(from.default_value()); + } + if (from.has_oneof_index()) { + set_oneof_index(from.oneof_index()); + } + } + if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (from.has_options()) { + mutable_options()->::google::protobuf::FieldOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FieldDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FieldDescriptorProto::CopyFrom(const FieldDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FieldDescriptorProto::IsInitialized() const { + + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void FieldDescriptorProto::Swap(FieldDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(number_, other->number_); + std::swap(label_, other->label_); + std::swap(type_, other->type_); + std::swap(type_name_, other->type_name_); + std::swap(extendee_, other->extendee_); + std::swap(default_value_, other->default_value_); + std::swap(oneof_index_, other->oneof_index_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata FieldDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FieldDescriptorProto_descriptor_; + metadata.reflection = FieldDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int OneofDescriptorProto::kNameFieldNumber; +#endif // !_MSC_VER + +OneofDescriptorProto::OneofDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.OneofDescriptorProto) +} + +void OneofDescriptorProto::InitAsDefaultInstance() { +} + +OneofDescriptorProto::OneofDescriptorProto(const OneofDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.OneofDescriptorProto) +} + +void OneofDescriptorProto::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +OneofDescriptorProto::~OneofDescriptorProto() { + // @@protoc_insertion_point(destructor:google.protobuf.OneofDescriptorProto) + SharedDtor(); +} + +void OneofDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (this != default_instance_) { + } +} + +void OneofDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* OneofDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return OneofDescriptorProto_descriptor_; +} + +const OneofDescriptorProto& OneofDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +OneofDescriptorProto* OneofDescriptorProto::default_instance_ = NULL; + +OneofDescriptorProto* OneofDescriptorProto::New() const { + return new OneofDescriptorProto; +} + +void OneofDescriptorProto::Clear() { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool OneofDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.OneofDescriptorProto) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.OneofDescriptorProto) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.OneofDescriptorProto) + return false; +#undef DO_ +} + +void OneofDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.OneofDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.OneofDescriptorProto) +} + +::google::protobuf::uint8* OneofDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.OneofDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.OneofDescriptorProto) + return target; +} + +int OneofDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void OneofDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const OneofDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void OneofDescriptorProto::MergeFrom(const OneofDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void OneofDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void OneofDescriptorProto::CopyFrom(const OneofDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool OneofDescriptorProto::IsInitialized() const { + + return true; +} + +void OneofDescriptorProto::Swap(OneofDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata OneofDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = OneofDescriptorProto_descriptor_; + metadata.reflection = OneofDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int EnumDescriptorProto::kNameFieldNumber; +const int EnumDescriptorProto::kValueFieldNumber; +const int EnumDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +EnumDescriptorProto::EnumDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.EnumDescriptorProto) +} + +void EnumDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::EnumOptions*>(&::google::protobuf::EnumOptions::default_instance()); +} + +EnumDescriptorProto::EnumDescriptorProto(const EnumDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumDescriptorProto) +} + +void EnumDescriptorProto::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +EnumDescriptorProto::~EnumDescriptorProto() { + // @@protoc_insertion_point(destructor:google.protobuf.EnumDescriptorProto) + SharedDtor(); +} + +void EnumDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (this != default_instance_) { + delete options_; + } +} + +void EnumDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* EnumDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return EnumDescriptorProto_descriptor_; +} + +const EnumDescriptorProto& EnumDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +EnumDescriptorProto* EnumDescriptorProto::default_instance_ = NULL; + +EnumDescriptorProto* EnumDescriptorProto::New() const { + return new EnumDescriptorProto; +} + +void EnumDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & 5) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::EnumOptions::Clear(); + } + } + value_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool EnumDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.EnumDescriptorProto) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_value; + break; + } + + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + case 2: { + if (tag == 18) { + parse_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_value())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_value; + if (input->ExpectTag(26)) goto parse_options; + break; + } + + // optional .google.protobuf.EnumOptions options = 3; + case 3: { + if (tag == 26) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.EnumDescriptorProto) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.EnumDescriptorProto) + return false; +#undef DO_ +} + +void EnumDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.EnumDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + for (int i = 0; i < this->value_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->value(i), output); + } + + // optional .google.protobuf.EnumOptions options = 3; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.EnumDescriptorProto) +} + +::google::protobuf::uint8* EnumDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + for (int i = 0; i < this->value_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->value(i), target); + } + + // optional .google.protobuf.EnumOptions options = 3; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumDescriptorProto) + return target; +} + +int EnumDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional .google.protobuf.EnumOptions options = 3; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + total_size += 1 * this->value_size(); + for (int i = 0; i < this->value_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->value(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void EnumDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const EnumDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void EnumDescriptorProto::MergeFrom(const EnumDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + value_.MergeFrom(from.value_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::EnumOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void EnumDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void EnumDescriptorProto::CopyFrom(const EnumDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool EnumDescriptorProto::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->value())) return false; + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void EnumDescriptorProto::Swap(EnumDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + value_.Swap(&other->value_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata EnumDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = EnumDescriptorProto_descriptor_; + metadata.reflection = EnumDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int EnumValueDescriptorProto::kNameFieldNumber; +const int EnumValueDescriptorProto::kNumberFieldNumber; +const int EnumValueDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +EnumValueDescriptorProto::EnumValueDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.EnumValueDescriptorProto) +} + +void EnumValueDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::EnumValueOptions*>(&::google::protobuf::EnumValueOptions::default_instance()); +} + +EnumValueDescriptorProto::EnumValueDescriptorProto(const EnumValueDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValueDescriptorProto) +} + +void EnumValueDescriptorProto::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + number_ = 0; + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +EnumValueDescriptorProto::~EnumValueDescriptorProto() { + // @@protoc_insertion_point(destructor:google.protobuf.EnumValueDescriptorProto) + SharedDtor(); +} + +void EnumValueDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (this != default_instance_) { + delete options_; + } +} + +void EnumValueDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* EnumValueDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return EnumValueDescriptorProto_descriptor_; +} + +const EnumValueDescriptorProto& EnumValueDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +EnumValueDescriptorProto* EnumValueDescriptorProto::default_instance_ = NULL; + +EnumValueDescriptorProto* EnumValueDescriptorProto::New() const { + return new EnumValueDescriptorProto; +} + +void EnumValueDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & 7) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + number_ = 0; + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::EnumValueOptions::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool EnumValueDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.EnumValueDescriptorProto) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(16)) goto parse_number; + break; + } + + // optional int32 number = 2; + case 2: { + if (tag == 16) { + parse_number: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &number_))); + set_has_number(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_options; + break; + } + + // optional .google.protobuf.EnumValueOptions options = 3; + case 3: { + if (tag == 26) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.EnumValueDescriptorProto) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.EnumValueDescriptorProto) + return false; +#undef DO_ +} + +void EnumValueDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.EnumValueDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // optional int32 number = 2; + if (has_number()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->number(), output); + } + + // optional .google.protobuf.EnumValueOptions options = 3; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.EnumValueDescriptorProto) +} + +::google::protobuf::uint8* EnumValueDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional int32 number = 2; + if (has_number()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->number(), target); + } + + // optional .google.protobuf.EnumValueOptions options = 3; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValueDescriptorProto) + return target; +} + +int EnumValueDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional int32 number = 2; + if (has_number()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->number()); + } + + // optional .google.protobuf.EnumValueOptions options = 3; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void EnumValueDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const EnumValueDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void EnumValueDescriptorProto::MergeFrom(const EnumValueDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_number()) { + set_number(from.number()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::EnumValueOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void EnumValueDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void EnumValueDescriptorProto::CopyFrom(const EnumValueDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool EnumValueDescriptorProto::IsInitialized() const { + + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void EnumValueDescriptorProto::Swap(EnumValueDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(number_, other->number_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata EnumValueDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = EnumValueDescriptorProto_descriptor_; + metadata.reflection = EnumValueDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int ServiceDescriptorProto::kNameFieldNumber; +const int ServiceDescriptorProto::kMethodFieldNumber; +const int ServiceDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +ServiceDescriptorProto::ServiceDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.ServiceDescriptorProto) +} + +void ServiceDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::ServiceOptions*>(&::google::protobuf::ServiceOptions::default_instance()); +} + +ServiceDescriptorProto::ServiceDescriptorProto(const ServiceDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.ServiceDescriptorProto) +} + +void ServiceDescriptorProto::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ServiceDescriptorProto::~ServiceDescriptorProto() { + // @@protoc_insertion_point(destructor:google.protobuf.ServiceDescriptorProto) + SharedDtor(); +} + +void ServiceDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (this != default_instance_) { + delete options_; + } +} + +void ServiceDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* ServiceDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return ServiceDescriptorProto_descriptor_; +} + +const ServiceDescriptorProto& ServiceDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +ServiceDescriptorProto* ServiceDescriptorProto::default_instance_ = NULL; + +ServiceDescriptorProto* ServiceDescriptorProto::New() const { + return new ServiceDescriptorProto; +} + +void ServiceDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & 5) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::ServiceOptions::Clear(); + } + } + method_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool ServiceDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.ServiceDescriptorProto) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_method; + break; + } + + // repeated .google.protobuf.MethodDescriptorProto method = 2; + case 2: { + if (tag == 18) { + parse_method: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_method())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_method; + if (input->ExpectTag(26)) goto parse_options; + break; + } + + // optional .google.protobuf.ServiceOptions options = 3; + case 3: { + if (tag == 26) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.ServiceDescriptorProto) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.ServiceDescriptorProto) + return false; +#undef DO_ +} + +void ServiceDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.ServiceDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // repeated .google.protobuf.MethodDescriptorProto method = 2; + for (int i = 0; i < this->method_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->method(i), output); + } + + // optional .google.protobuf.ServiceOptions options = 3; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.ServiceDescriptorProto) +} + +::google::protobuf::uint8* ServiceDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // repeated .google.protobuf.MethodDescriptorProto method = 2; + for (int i = 0; i < this->method_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->method(i), target); + } + + // optional .google.protobuf.ServiceOptions options = 3; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ServiceDescriptorProto) + return target; +} + +int ServiceDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional .google.protobuf.ServiceOptions options = 3; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + // repeated .google.protobuf.MethodDescriptorProto method = 2; + total_size += 1 * this->method_size(); + for (int i = 0; i < this->method_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->method(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ServiceDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const ServiceDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void ServiceDescriptorProto::MergeFrom(const ServiceDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + method_.MergeFrom(from.method_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::ServiceOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void ServiceDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void ServiceDescriptorProto::CopyFrom(const ServiceDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ServiceDescriptorProto::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->method())) return false; + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void ServiceDescriptorProto::Swap(ServiceDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + method_.Swap(&other->method_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata ServiceDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = ServiceDescriptorProto_descriptor_; + metadata.reflection = ServiceDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int MethodDescriptorProto::kNameFieldNumber; +const int MethodDescriptorProto::kInputTypeFieldNumber; +const int MethodDescriptorProto::kOutputTypeFieldNumber; +const int MethodDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +MethodDescriptorProto::MethodDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.MethodDescriptorProto) +} + +void MethodDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::MethodOptions*>(&::google::protobuf::MethodOptions::default_instance()); +} + +MethodDescriptorProto::MethodDescriptorProto(const MethodDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.MethodDescriptorProto) +} + +void MethodDescriptorProto::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + input_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + output_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MethodDescriptorProto::~MethodDescriptorProto() { + // @@protoc_insertion_point(destructor:google.protobuf.MethodDescriptorProto) + SharedDtor(); +} + +void MethodDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (input_type_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete input_type_; + } + if (output_type_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete output_type_; + } + if (this != default_instance_) { + delete options_; + } +} + +void MethodDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MethodDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MethodDescriptorProto_descriptor_; +} + +const MethodDescriptorProto& MethodDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +MethodDescriptorProto* MethodDescriptorProto::default_instance_ = NULL; + +MethodDescriptorProto* MethodDescriptorProto::New() const { + return new MethodDescriptorProto; +} + +void MethodDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & 15) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + if (has_input_type()) { + if (input_type_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + input_type_->clear(); + } + } + if (has_output_type()) { + if (output_type_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + output_type_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::MethodOptions::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MethodDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.MethodDescriptorProto) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_input_type; + break; + } + + // optional string input_type = 2; + case 2: { + if (tag == 18) { + parse_input_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_input_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->input_type().data(), this->input_type().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "input_type"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_output_type; + break; + } + + // optional string output_type = 3; + case 3: { + if (tag == 26) { + parse_output_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_output_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->output_type().data(), this->output_type().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "output_type"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_options; + break; + } + + // optional .google.protobuf.MethodOptions options = 4; + case 4: { + if (tag == 34) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.MethodDescriptorProto) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.MethodDescriptorProto) + return false; +#undef DO_ +} + +void MethodDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.MethodDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name(), output); + } + + // optional string input_type = 2; + if (has_input_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->input_type().data(), this->input_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "input_type"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->input_type(), output); + } + + // optional string output_type = 3; + if (has_output_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->output_type().data(), this->output_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "output_type"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 3, this->output_type(), output); + } + + // optional .google.protobuf.MethodOptions options = 4; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.MethodDescriptorProto) +} + +::google::protobuf::uint8* MethodDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodDescriptorProto) + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string input_type = 2; + if (has_input_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->input_type().data(), this->input_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "input_type"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->input_type(), target); + } + + // optional string output_type = 3; + if (has_output_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->output_type().data(), this->output_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "output_type"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->output_type(), target); + } + + // optional .google.protobuf.MethodOptions options = 4; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MethodDescriptorProto) + return target; +} + +int MethodDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional string input_type = 2; + if (has_input_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->input_type()); + } + + // optional string output_type = 3; + if (has_output_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->output_type()); + } + + // optional .google.protobuf.MethodOptions options = 4; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MethodDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MethodDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MethodDescriptorProto::MergeFrom(const MethodDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_input_type()) { + set_input_type(from.input_type()); + } + if (from.has_output_type()) { + set_output_type(from.output_type()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::MethodOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MethodDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MethodDescriptorProto::CopyFrom(const MethodDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MethodDescriptorProto::IsInitialized() const { + + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void MethodDescriptorProto::Swap(MethodDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(input_type_, other->input_type_); + std::swap(output_type_, other->output_type_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata MethodDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MethodDescriptorProto_descriptor_; + metadata.reflection = MethodDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor() { + protobuf_AssignDescriptorsOnce(); + return FileOptions_OptimizeMode_descriptor_; +} +bool FileOptions_OptimizeMode_IsValid(int value) { + switch(value) { + case 1: + case 2: + case 3: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const FileOptions_OptimizeMode FileOptions::SPEED; +const FileOptions_OptimizeMode FileOptions::CODE_SIZE; +const FileOptions_OptimizeMode FileOptions::LITE_RUNTIME; +const FileOptions_OptimizeMode FileOptions::OptimizeMode_MIN; +const FileOptions_OptimizeMode FileOptions::OptimizeMode_MAX; +const int FileOptions::OptimizeMode_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int FileOptions::kJavaPackageFieldNumber; +const int FileOptions::kJavaOuterClassnameFieldNumber; +const int FileOptions::kJavaMultipleFilesFieldNumber; +const int FileOptions::kJavaGenerateEqualsAndHashFieldNumber; +const int FileOptions::kJavaStringCheckUtf8FieldNumber; +const int FileOptions::kOptimizeForFieldNumber; +const int FileOptions::kGoPackageFieldNumber; +const int FileOptions::kCcGenericServicesFieldNumber; +const int FileOptions::kJavaGenericServicesFieldNumber; +const int FileOptions::kPyGenericServicesFieldNumber; +const int FileOptions::kDeprecatedFieldNumber; +const int FileOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +FileOptions::FileOptions() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.FileOptions) +} + +void FileOptions::InitAsDefaultInstance() { +} + +FileOptions::FileOptions(const FileOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.FileOptions) +} + +void FileOptions::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + java_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + java_outer_classname_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + java_multiple_files_ = false; + java_generate_equals_and_hash_ = false; + java_string_check_utf8_ = false; + optimize_for_ = 1; + go_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + cc_generic_services_ = false; + java_generic_services_ = false; + py_generic_services_ = false; + deprecated_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FileOptions::~FileOptions() { + // @@protoc_insertion_point(destructor:google.protobuf.FileOptions) + SharedDtor(); +} + +void FileOptions::SharedDtor() { + if (java_package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete java_package_; + } + if (java_outer_classname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete java_outer_classname_; + } + if (go_package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete go_package_; + } + if (this != default_instance_) { + } +} + +void FileOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FileOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FileOptions_descriptor_; +} + +const FileOptions& FileOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +FileOptions* FileOptions::default_instance_ = NULL; + +FileOptions* FileOptions::New() const { + return new FileOptions; +} + +void FileOptions::Clear() { + _extensions_.Clear(); +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + if (_has_bits_[0 / 32] & 255) { + ZR_(java_multiple_files_, cc_generic_services_); + if (has_java_package()) { + if (java_package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_package_->clear(); + } + } + if (has_java_outer_classname()) { + if (java_outer_classname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_outer_classname_->clear(); + } + } + optimize_for_ = 1; + if (has_go_package()) { + if (go_package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + go_package_->clear(); + } + } + } + ZR_(java_generic_services_, deprecated_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FileOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.FileOptions) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string java_package = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_java_package())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->java_package().data(), this->java_package().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "java_package"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(66)) goto parse_java_outer_classname; + break; + } + + // optional string java_outer_classname = 8; + case 8: { + if (tag == 66) { + parse_java_outer_classname: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_java_outer_classname())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->java_outer_classname().data(), this->java_outer_classname().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "java_outer_classname"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(72)) goto parse_optimize_for; + break; + } + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + case 9: { + if (tag == 72) { + parse_optimize_for: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::google::protobuf::FileOptions_OptimizeMode_IsValid(value)) { + set_optimize_for(static_cast< ::google::protobuf::FileOptions_OptimizeMode >(value)); + } else { + mutable_unknown_fields()->AddVarint(9, value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(80)) goto parse_java_multiple_files; + break; + } + + // optional bool java_multiple_files = 10 [default = false]; + case 10: { + if (tag == 80) { + parse_java_multiple_files: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &java_multiple_files_))); + set_has_java_multiple_files(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(90)) goto parse_go_package; + break; + } + + // optional string go_package = 11; + case 11: { + if (tag == 90) { + parse_go_package: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_go_package())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->go_package().data(), this->go_package().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "go_package"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(128)) goto parse_cc_generic_services; + break; + } + + // optional bool cc_generic_services = 16 [default = false]; + case 16: { + if (tag == 128) { + parse_cc_generic_services: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &cc_generic_services_))); + set_has_cc_generic_services(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(136)) goto parse_java_generic_services; + break; + } + + // optional bool java_generic_services = 17 [default = false]; + case 17: { + if (tag == 136) { + parse_java_generic_services: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &java_generic_services_))); + set_has_java_generic_services(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(144)) goto parse_py_generic_services; + break; + } + + // optional bool py_generic_services = 18 [default = false]; + case 18: { + if (tag == 144) { + parse_py_generic_services: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &py_generic_services_))); + set_has_py_generic_services(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(160)) goto parse_java_generate_equals_and_hash; + break; + } + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + case 20: { + if (tag == 160) { + parse_java_generate_equals_and_hash: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &java_generate_equals_and_hash_))); + set_has_java_generate_equals_and_hash(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(184)) goto parse_deprecated; + break; + } + + // optional bool deprecated = 23 [default = false]; + case 23: { + if (tag == 184) { + parse_deprecated: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &deprecated_))); + set_has_deprecated(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(216)) goto parse_java_string_check_utf8; + break; + } + + // optional bool java_string_check_utf8 = 27 [default = false]; + case 27: { + if (tag == 216) { + parse_java_string_check_utf8: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &java_string_check_utf8_))); + set_has_java_string_check_utf8(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (tag == 7994) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.FileOptions) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.FileOptions) + return false; +#undef DO_ +} + +void FileOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.FileOptions) + // optional string java_package = 1; + if (has_java_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->java_package().data(), this->java_package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "java_package"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->java_package(), output); + } + + // optional string java_outer_classname = 8; + if (has_java_outer_classname()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->java_outer_classname().data(), this->java_outer_classname().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "java_outer_classname"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 8, this->java_outer_classname(), output); + } + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + if (has_optimize_for()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 9, this->optimize_for(), output); + } + + // optional bool java_multiple_files = 10 [default = false]; + if (has_java_multiple_files()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(10, this->java_multiple_files(), output); + } + + // optional string go_package = 11; + if (has_go_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->go_package().data(), this->go_package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "go_package"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 11, this->go_package(), output); + } + + // optional bool cc_generic_services = 16 [default = false]; + if (has_cc_generic_services()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(16, this->cc_generic_services(), output); + } + + // optional bool java_generic_services = 17 [default = false]; + if (has_java_generic_services()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(17, this->java_generic_services(), output); + } + + // optional bool py_generic_services = 18 [default = false]; + if (has_py_generic_services()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(18, this->py_generic_services(), output); + } + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + if (has_java_generate_equals_and_hash()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(20, this->java_generate_equals_and_hash(), output); + } + + // optional bool deprecated = 23 [default = false]; + if (has_deprecated()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(23, this->deprecated(), output); + } + + // optional bool java_string_check_utf8 = 27 [default = false]; + if (has_java_string_check_utf8()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(27, this->java_string_check_utf8(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.FileOptions) +} + +::google::protobuf::uint8* FileOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileOptions) + // optional string java_package = 1; + if (has_java_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->java_package().data(), this->java_package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "java_package"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->java_package(), target); + } + + // optional string java_outer_classname = 8; + if (has_java_outer_classname()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->java_outer_classname().data(), this->java_outer_classname().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "java_outer_classname"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 8, this->java_outer_classname(), target); + } + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + if (has_optimize_for()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 9, this->optimize_for(), target); + } + + // optional bool java_multiple_files = 10 [default = false]; + if (has_java_multiple_files()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(10, this->java_multiple_files(), target); + } + + // optional string go_package = 11; + if (has_go_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->go_package().data(), this->go_package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "go_package"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 11, this->go_package(), target); + } + + // optional bool cc_generic_services = 16 [default = false]; + if (has_cc_generic_services()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(16, this->cc_generic_services(), target); + } + + // optional bool java_generic_services = 17 [default = false]; + if (has_java_generic_services()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(17, this->java_generic_services(), target); + } + + // optional bool py_generic_services = 18 [default = false]; + if (has_py_generic_services()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(18, this->py_generic_services(), target); + } + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + if (has_java_generate_equals_and_hash()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(20, this->java_generate_equals_and_hash(), target); + } + + // optional bool deprecated = 23 [default = false]; + if (has_deprecated()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(23, this->deprecated(), target); + } + + // optional bool java_string_check_utf8 = 27 [default = false]; + if (has_java_string_check_utf8()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(27, this->java_string_check_utf8(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileOptions) + return target; +} + +int FileOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string java_package = 1; + if (has_java_package()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->java_package()); + } + + // optional string java_outer_classname = 8; + if (has_java_outer_classname()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->java_outer_classname()); + } + + // optional bool java_multiple_files = 10 [default = false]; + if (has_java_multiple_files()) { + total_size += 1 + 1; + } + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + if (has_java_generate_equals_and_hash()) { + total_size += 2 + 1; + } + + // optional bool java_string_check_utf8 = 27 [default = false]; + if (has_java_string_check_utf8()) { + total_size += 2 + 1; + } + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + if (has_optimize_for()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->optimize_for()); + } + + // optional string go_package = 11; + if (has_go_package()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->go_package()); + } + + // optional bool cc_generic_services = 16 [default = false]; + if (has_cc_generic_services()) { + total_size += 2 + 1; + } + + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + // optional bool java_generic_services = 17 [default = false]; + if (has_java_generic_services()) { + total_size += 2 + 1; + } + + // optional bool py_generic_services = 18 [default = false]; + if (has_py_generic_services()) { + total_size += 2 + 1; + } + + // optional bool deprecated = 23 [default = false]; + if (has_deprecated()) { + total_size += 2 + 1; + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FileOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FileOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FileOptions::MergeFrom(const FileOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_java_package()) { + set_java_package(from.java_package()); + } + if (from.has_java_outer_classname()) { + set_java_outer_classname(from.java_outer_classname()); + } + if (from.has_java_multiple_files()) { + set_java_multiple_files(from.java_multiple_files()); + } + if (from.has_java_generate_equals_and_hash()) { + set_java_generate_equals_and_hash(from.java_generate_equals_and_hash()); + } + if (from.has_java_string_check_utf8()) { + set_java_string_check_utf8(from.java_string_check_utf8()); + } + if (from.has_optimize_for()) { + set_optimize_for(from.optimize_for()); + } + if (from.has_go_package()) { + set_go_package(from.go_package()); + } + if (from.has_cc_generic_services()) { + set_cc_generic_services(from.cc_generic_services()); + } + } + if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (from.has_java_generic_services()) { + set_java_generic_services(from.java_generic_services()); + } + if (from.has_py_generic_services()) { + set_py_generic_services(from.py_generic_services()); + } + if (from.has_deprecated()) { + set_deprecated(from.deprecated()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FileOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FileOptions::CopyFrom(const FileOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FileOptions::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void FileOptions::Swap(FileOptions* other) { + if (other != this) { + std::swap(java_package_, other->java_package_); + std::swap(java_outer_classname_, other->java_outer_classname_); + std::swap(java_multiple_files_, other->java_multiple_files_); + std::swap(java_generate_equals_and_hash_, other->java_generate_equals_and_hash_); + std::swap(java_string_check_utf8_, other->java_string_check_utf8_); + std::swap(optimize_for_, other->optimize_for_); + std::swap(go_package_, other->go_package_); + std::swap(cc_generic_services_, other->cc_generic_services_); + std::swap(java_generic_services_, other->java_generic_services_); + std::swap(py_generic_services_, other->py_generic_services_); + std::swap(deprecated_, other->deprecated_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata FileOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FileOptions_descriptor_; + metadata.reflection = FileOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int MessageOptions::kMessageSetWireFormatFieldNumber; +const int MessageOptions::kNoStandardDescriptorAccessorFieldNumber; +const int MessageOptions::kDeprecatedFieldNumber; +const int MessageOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +MessageOptions::MessageOptions() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.MessageOptions) +} + +void MessageOptions::InitAsDefaultInstance() { +} + +MessageOptions::MessageOptions(const MessageOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.MessageOptions) +} + +void MessageOptions::SharedCtor() { + _cached_size_ = 0; + message_set_wire_format_ = false; + no_standard_descriptor_accessor_ = false; + deprecated_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MessageOptions::~MessageOptions() { + // @@protoc_insertion_point(destructor:google.protobuf.MessageOptions) + SharedDtor(); +} + +void MessageOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void MessageOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MessageOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MessageOptions_descriptor_; +} + +const MessageOptions& MessageOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +MessageOptions* MessageOptions::default_instance_ = NULL; + +MessageOptions* MessageOptions::New() const { + return new MessageOptions; +} + +void MessageOptions::Clear() { + _extensions_.Clear(); +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(message_set_wire_format_, deprecated_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MessageOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.MessageOptions) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bool message_set_wire_format = 1 [default = false]; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &message_set_wire_format_))); + set_has_message_set_wire_format(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(16)) goto parse_no_standard_descriptor_accessor; + break; + } + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + case 2: { + if (tag == 16) { + parse_no_standard_descriptor_accessor: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &no_standard_descriptor_accessor_))); + set_has_no_standard_descriptor_accessor(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_deprecated; + break; + } + + // optional bool deprecated = 3 [default = false]; + case 3: { + if (tag == 24) { + parse_deprecated: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &deprecated_))); + set_has_deprecated(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (tag == 7994) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.MessageOptions) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.MessageOptions) + return false; +#undef DO_ +} + +void MessageOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.MessageOptions) + // optional bool message_set_wire_format = 1 [default = false]; + if (has_message_set_wire_format()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->message_set_wire_format(), output); + } + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + if (has_no_standard_descriptor_accessor()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->no_standard_descriptor_accessor(), output); + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.MessageOptions) +} + +::google::protobuf::uint8* MessageOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MessageOptions) + // optional bool message_set_wire_format = 1 [default = false]; + if (has_message_set_wire_format()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(1, this->message_set_wire_format(), target); + } + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + if (has_no_standard_descriptor_accessor()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->no_standard_descriptor_accessor(), target); + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MessageOptions) + return target; +} + +int MessageOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bool message_set_wire_format = 1 [default = false]; + if (has_message_set_wire_format()) { + total_size += 1 + 1; + } + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + if (has_no_standard_descriptor_accessor()) { + total_size += 1 + 1; + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + total_size += 1 + 1; + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MessageOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MessageOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MessageOptions::MergeFrom(const MessageOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_message_set_wire_format()) { + set_message_set_wire_format(from.message_set_wire_format()); + } + if (from.has_no_standard_descriptor_accessor()) { + set_no_standard_descriptor_accessor(from.no_standard_descriptor_accessor()); + } + if (from.has_deprecated()) { + set_deprecated(from.deprecated()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MessageOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MessageOptions::CopyFrom(const MessageOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MessageOptions::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void MessageOptions::Swap(MessageOptions* other) { + if (other != this) { + std::swap(message_set_wire_format_, other->message_set_wire_format_); + std::swap(no_standard_descriptor_accessor_, other->no_standard_descriptor_accessor_); + std::swap(deprecated_, other->deprecated_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata MessageOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MessageOptions_descriptor_; + metadata.reflection = MessageOptions_reflection_; + return metadata; +} + + +// =================================================================== + +const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldOptions_CType_descriptor_; +} +bool FieldOptions_CType_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const FieldOptions_CType FieldOptions::STRING; +const FieldOptions_CType FieldOptions::CORD; +const FieldOptions_CType FieldOptions::STRING_PIECE; +const FieldOptions_CType FieldOptions::CType_MIN; +const FieldOptions_CType FieldOptions::CType_MAX; +const int FieldOptions::CType_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int FieldOptions::kCtypeFieldNumber; +const int FieldOptions::kPackedFieldNumber; +const int FieldOptions::kLazyFieldNumber; +const int FieldOptions::kDeprecatedFieldNumber; +const int FieldOptions::kExperimentalMapKeyFieldNumber; +const int FieldOptions::kWeakFieldNumber; +const int FieldOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +FieldOptions::FieldOptions() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.FieldOptions) +} + +void FieldOptions::InitAsDefaultInstance() { +} + +FieldOptions::FieldOptions(const FieldOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldOptions) +} + +void FieldOptions::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + ctype_ = 0; + packed_ = false; + lazy_ = false; + deprecated_ = false; + experimental_map_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + weak_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FieldOptions::~FieldOptions() { + // @@protoc_insertion_point(destructor:google.protobuf.FieldOptions) + SharedDtor(); +} + +void FieldOptions::SharedDtor() { + if (experimental_map_key_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete experimental_map_key_; + } + if (this != default_instance_) { + } +} + +void FieldOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FieldOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldOptions_descriptor_; +} + +const FieldOptions& FieldOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +FieldOptions* FieldOptions::default_instance_ = NULL; + +FieldOptions* FieldOptions::New() const { + return new FieldOptions; +} + +void FieldOptions::Clear() { + _extensions_.Clear(); +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + if (_has_bits_[0 / 32] & 63) { + ZR_(ctype_, weak_); + if (has_experimental_map_key()) { + if (experimental_map_key_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + experimental_map_key_->clear(); + } + } + } + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FieldOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.FieldOptions) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + case 1: { + if (tag == 8) { + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::google::protobuf::FieldOptions_CType_IsValid(value)) { + set_ctype(static_cast< ::google::protobuf::FieldOptions_CType >(value)); + } else { + mutable_unknown_fields()->AddVarint(1, value); + } + } else { + goto handle_unusual; + } + if (input->ExpectTag(16)) goto parse_packed; + break; + } + + // optional bool packed = 2; + case 2: { + if (tag == 16) { + parse_packed: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &packed_))); + set_has_packed(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_deprecated; + break; + } + + // optional bool deprecated = 3 [default = false]; + case 3: { + if (tag == 24) { + parse_deprecated: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &deprecated_))); + set_has_deprecated(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(40)) goto parse_lazy; + break; + } + + // optional bool lazy = 5 [default = false]; + case 5: { + if (tag == 40) { + parse_lazy: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &lazy_))); + set_has_lazy(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(74)) goto parse_experimental_map_key; + break; + } + + // optional string experimental_map_key = 9; + case 9: { + if (tag == 74) { + parse_experimental_map_key: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_experimental_map_key())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->experimental_map_key().data(), this->experimental_map_key().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "experimental_map_key"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(80)) goto parse_weak; + break; + } + + // optional bool weak = 10 [default = false]; + case 10: { + if (tag == 80) { + parse_weak: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &weak_))); + set_has_weak(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (tag == 7994) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.FieldOptions) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.FieldOptions) + return false; +#undef DO_ +} + +void FieldOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.FieldOptions) + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + if (has_ctype()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 1, this->ctype(), output); + } + + // optional bool packed = 2; + if (has_packed()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->packed(), output); + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output); + } + + // optional bool lazy = 5 [default = false]; + if (has_lazy()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(5, this->lazy(), output); + } + + // optional string experimental_map_key = 9; + if (has_experimental_map_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->experimental_map_key().data(), this->experimental_map_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "experimental_map_key"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 9, this->experimental_map_key(), output); + } + + // optional bool weak = 10 [default = false]; + if (has_weak()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(10, this->weak(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.FieldOptions) +} + +::google::protobuf::uint8* FieldOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldOptions) + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + if (has_ctype()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 1, this->ctype(), target); + } + + // optional bool packed = 2; + if (has_packed()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->packed(), target); + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target); + } + + // optional bool lazy = 5 [default = false]; + if (has_lazy()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(5, this->lazy(), target); + } + + // optional string experimental_map_key = 9; + if (has_experimental_map_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->experimental_map_key().data(), this->experimental_map_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "experimental_map_key"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 9, this->experimental_map_key(), target); + } + + // optional bool weak = 10 [default = false]; + if (has_weak()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(10, this->weak(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldOptions) + return target; +} + +int FieldOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + if (has_ctype()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->ctype()); + } + + // optional bool packed = 2; + if (has_packed()) { + total_size += 1 + 1; + } + + // optional bool lazy = 5 [default = false]; + if (has_lazy()) { + total_size += 1 + 1; + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + total_size += 1 + 1; + } + + // optional string experimental_map_key = 9; + if (has_experimental_map_key()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->experimental_map_key()); + } + + // optional bool weak = 10 [default = false]; + if (has_weak()) { + total_size += 1 + 1; + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FieldOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FieldOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FieldOptions::MergeFrom(const FieldOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_ctype()) { + set_ctype(from.ctype()); + } + if (from.has_packed()) { + set_packed(from.packed()); + } + if (from.has_lazy()) { + set_lazy(from.lazy()); + } + if (from.has_deprecated()) { + set_deprecated(from.deprecated()); + } + if (from.has_experimental_map_key()) { + set_experimental_map_key(from.experimental_map_key()); + } + if (from.has_weak()) { + set_weak(from.weak()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FieldOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FieldOptions::CopyFrom(const FieldOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FieldOptions::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void FieldOptions::Swap(FieldOptions* other) { + if (other != this) { + std::swap(ctype_, other->ctype_); + std::swap(packed_, other->packed_); + std::swap(lazy_, other->lazy_); + std::swap(deprecated_, other->deprecated_); + std::swap(experimental_map_key_, other->experimental_map_key_); + std::swap(weak_, other->weak_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata FieldOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FieldOptions_descriptor_; + metadata.reflection = FieldOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int EnumOptions::kAllowAliasFieldNumber; +const int EnumOptions::kDeprecatedFieldNumber; +const int EnumOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +EnumOptions::EnumOptions() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.EnumOptions) +} + +void EnumOptions::InitAsDefaultInstance() { +} + +EnumOptions::EnumOptions(const EnumOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumOptions) +} + +void EnumOptions::SharedCtor() { + _cached_size_ = 0; + allow_alias_ = false; + deprecated_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +EnumOptions::~EnumOptions() { + // @@protoc_insertion_point(destructor:google.protobuf.EnumOptions) + SharedDtor(); +} + +void EnumOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void EnumOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* EnumOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return EnumOptions_descriptor_; +} + +const EnumOptions& EnumOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +EnumOptions* EnumOptions::default_instance_ = NULL; + +EnumOptions* EnumOptions::New() const { + return new EnumOptions; +} + +void EnumOptions::Clear() { + _extensions_.Clear(); +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + ZR_(allow_alias_, deprecated_); + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool EnumOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.EnumOptions) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bool allow_alias = 2; + case 2: { + if (tag == 16) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &allow_alias_))); + set_has_allow_alias(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_deprecated; + break; + } + + // optional bool deprecated = 3 [default = false]; + case 3: { + if (tag == 24) { + parse_deprecated: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &deprecated_))); + set_has_deprecated(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (tag == 7994) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.EnumOptions) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.EnumOptions) + return false; +#undef DO_ +} + +void EnumOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.EnumOptions) + // optional bool allow_alias = 2; + if (has_allow_alias()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->allow_alias(), output); + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.EnumOptions) +} + +::google::protobuf::uint8* EnumOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumOptions) + // optional bool allow_alias = 2; + if (has_allow_alias()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->allow_alias(), target); + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumOptions) + return target; +} + +int EnumOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bool allow_alias = 2; + if (has_allow_alias()) { + total_size += 1 + 1; + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + total_size += 1 + 1; + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void EnumOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const EnumOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void EnumOptions::MergeFrom(const EnumOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_allow_alias()) { + set_allow_alias(from.allow_alias()); + } + if (from.has_deprecated()) { + set_deprecated(from.deprecated()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void EnumOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void EnumOptions::CopyFrom(const EnumOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool EnumOptions::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void EnumOptions::Swap(EnumOptions* other) { + if (other != this) { + std::swap(allow_alias_, other->allow_alias_); + std::swap(deprecated_, other->deprecated_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata EnumOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = EnumOptions_descriptor_; + metadata.reflection = EnumOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int EnumValueOptions::kDeprecatedFieldNumber; +const int EnumValueOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +EnumValueOptions::EnumValueOptions() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.EnumValueOptions) +} + +void EnumValueOptions::InitAsDefaultInstance() { +} + +EnumValueOptions::EnumValueOptions(const EnumValueOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValueOptions) +} + +void EnumValueOptions::SharedCtor() { + _cached_size_ = 0; + deprecated_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +EnumValueOptions::~EnumValueOptions() { + // @@protoc_insertion_point(destructor:google.protobuf.EnumValueOptions) + SharedDtor(); +} + +void EnumValueOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void EnumValueOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* EnumValueOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return EnumValueOptions_descriptor_; +} + +const EnumValueOptions& EnumValueOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +EnumValueOptions* EnumValueOptions::default_instance_ = NULL; + +EnumValueOptions* EnumValueOptions::New() const { + return new EnumValueOptions; +} + +void EnumValueOptions::Clear() { + _extensions_.Clear(); + deprecated_ = false; + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool EnumValueOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.EnumValueOptions) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bool deprecated = 1 [default = false]; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &deprecated_))); + set_has_deprecated(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (tag == 7994) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.EnumValueOptions) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.EnumValueOptions) + return false; +#undef DO_ +} + +void EnumValueOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.EnumValueOptions) + // optional bool deprecated = 1 [default = false]; + if (has_deprecated()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->deprecated(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.EnumValueOptions) +} + +::google::protobuf::uint8* EnumValueOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueOptions) + // optional bool deprecated = 1 [default = false]; + if (has_deprecated()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(1, this->deprecated(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValueOptions) + return target; +} + +int EnumValueOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bool deprecated = 1 [default = false]; + if (has_deprecated()) { + total_size += 1 + 1; + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void EnumValueOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const EnumValueOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void EnumValueOptions::MergeFrom(const EnumValueOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_deprecated()) { + set_deprecated(from.deprecated()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void EnumValueOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void EnumValueOptions::CopyFrom(const EnumValueOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool EnumValueOptions::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void EnumValueOptions::Swap(EnumValueOptions* other) { + if (other != this) { + std::swap(deprecated_, other->deprecated_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata EnumValueOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = EnumValueOptions_descriptor_; + metadata.reflection = EnumValueOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int ServiceOptions::kDeprecatedFieldNumber; +const int ServiceOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +ServiceOptions::ServiceOptions() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.ServiceOptions) +} + +void ServiceOptions::InitAsDefaultInstance() { +} + +ServiceOptions::ServiceOptions(const ServiceOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.ServiceOptions) +} + +void ServiceOptions::SharedCtor() { + _cached_size_ = 0; + deprecated_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ServiceOptions::~ServiceOptions() { + // @@protoc_insertion_point(destructor:google.protobuf.ServiceOptions) + SharedDtor(); +} + +void ServiceOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void ServiceOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* ServiceOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return ServiceOptions_descriptor_; +} + +const ServiceOptions& ServiceOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +ServiceOptions* ServiceOptions::default_instance_ = NULL; + +ServiceOptions* ServiceOptions::New() const { + return new ServiceOptions; +} + +void ServiceOptions::Clear() { + _extensions_.Clear(); + deprecated_ = false; + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool ServiceOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.ServiceOptions) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bool deprecated = 33 [default = false]; + case 33: { + if (tag == 264) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &deprecated_))); + set_has_deprecated(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (tag == 7994) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.ServiceOptions) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.ServiceOptions) + return false; +#undef DO_ +} + +void ServiceOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.ServiceOptions) + // optional bool deprecated = 33 [default = false]; + if (has_deprecated()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(33, this->deprecated(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.ServiceOptions) +} + +::google::protobuf::uint8* ServiceOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceOptions) + // optional bool deprecated = 33 [default = false]; + if (has_deprecated()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(33, this->deprecated(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ServiceOptions) + return target; +} + +int ServiceOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bool deprecated = 33 [default = false]; + if (has_deprecated()) { + total_size += 2 + 1; + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ServiceOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const ServiceOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void ServiceOptions::MergeFrom(const ServiceOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_deprecated()) { + set_deprecated(from.deprecated()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void ServiceOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void ServiceOptions::CopyFrom(const ServiceOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ServiceOptions::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void ServiceOptions::Swap(ServiceOptions* other) { + if (other != this) { + std::swap(deprecated_, other->deprecated_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata ServiceOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = ServiceOptions_descriptor_; + metadata.reflection = ServiceOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int MethodOptions::kDeprecatedFieldNumber; +const int MethodOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +MethodOptions::MethodOptions() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.MethodOptions) +} + +void MethodOptions::InitAsDefaultInstance() { +} + +MethodOptions::MethodOptions(const MethodOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.MethodOptions) +} + +void MethodOptions::SharedCtor() { + _cached_size_ = 0; + deprecated_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MethodOptions::~MethodOptions() { + // @@protoc_insertion_point(destructor:google.protobuf.MethodOptions) + SharedDtor(); +} + +void MethodOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void MethodOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MethodOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MethodOptions_descriptor_; +} + +const MethodOptions& MethodOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +MethodOptions* MethodOptions::default_instance_ = NULL; + +MethodOptions* MethodOptions::New() const { + return new MethodOptions; +} + +void MethodOptions::Clear() { + _extensions_.Clear(); + deprecated_ = false; + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MethodOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.MethodOptions) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(16383); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bool deprecated = 33 [default = false]; + case 33: { + if (tag == 264) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &deprecated_))); + set_has_deprecated(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (tag == 7994) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.MethodOptions) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.MethodOptions) + return false; +#undef DO_ +} + +void MethodOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.MethodOptions) + // optional bool deprecated = 33 [default = false]; + if (has_deprecated()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(33, this->deprecated(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.MethodOptions) +} + +::google::protobuf::uint8* MethodOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodOptions) + // optional bool deprecated = 33 [default = false]; + if (has_deprecated()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(33, this->deprecated(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MethodOptions) + return target; +} + +int MethodOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bool deprecated = 33 [default = false]; + if (has_deprecated()) { + total_size += 2 + 1; + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MethodOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MethodOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MethodOptions::MergeFrom(const MethodOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_deprecated()) { + set_deprecated(from.deprecated()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MethodOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MethodOptions::CopyFrom(const MethodOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MethodOptions::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void MethodOptions::Swap(MethodOptions* other) { + if (other != this) { + std::swap(deprecated_, other->deprecated_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata MethodOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MethodOptions_descriptor_; + metadata.reflection = MethodOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int UninterpretedOption_NamePart::kNamePartFieldNumber; +const int UninterpretedOption_NamePart::kIsExtensionFieldNumber; +#endif // !_MSC_VER + +UninterpretedOption_NamePart::UninterpretedOption_NamePart() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.UninterpretedOption.NamePart) +} + +void UninterpretedOption_NamePart::InitAsDefaultInstance() { +} + +UninterpretedOption_NamePart::UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.UninterpretedOption.NamePart) +} + +void UninterpretedOption_NamePart::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + name_part_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + is_extension_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +UninterpretedOption_NamePart::~UninterpretedOption_NamePart() { + // @@protoc_insertion_point(destructor:google.protobuf.UninterpretedOption.NamePart) + SharedDtor(); +} + +void UninterpretedOption_NamePart::SharedDtor() { + if (name_part_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_part_; + } + if (this != default_instance_) { + } +} + +void UninterpretedOption_NamePart::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* UninterpretedOption_NamePart::descriptor() { + protobuf_AssignDescriptorsOnce(); + return UninterpretedOption_NamePart_descriptor_; +} + +const UninterpretedOption_NamePart& UninterpretedOption_NamePart::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +UninterpretedOption_NamePart* UninterpretedOption_NamePart::default_instance_ = NULL; + +UninterpretedOption_NamePart* UninterpretedOption_NamePart::New() const { + return new UninterpretedOption_NamePart; +} + +void UninterpretedOption_NamePart::Clear() { + if (_has_bits_[0 / 32] & 3) { + if (has_name_part()) { + if (name_part_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_part_->clear(); + } + } + is_extension_ = false; + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool UninterpretedOption_NamePart::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.UninterpretedOption.NamePart) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required string name_part = 1; + case 1: { + if (tag == 10) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name_part())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name_part().data(), this->name_part().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "name_part"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(16)) goto parse_is_extension; + break; + } + + // required bool is_extension = 2; + case 2: { + if (tag == 16) { + parse_is_extension: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &is_extension_))); + set_has_is_extension(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.UninterpretedOption.NamePart) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.UninterpretedOption.NamePart) + return false; +#undef DO_ +} + +void UninterpretedOption_NamePart::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.UninterpretedOption.NamePart) + // required string name_part = 1; + if (has_name_part()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name_part().data(), this->name_part().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name_part"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->name_part(), output); + } + + // required bool is_extension = 2; + if (has_is_extension()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->is_extension(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.UninterpretedOption.NamePart) +} + +::google::protobuf::uint8* UninterpretedOption_NamePart::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption.NamePart) + // required string name_part = 1; + if (has_name_part()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->name_part().data(), this->name_part().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "name_part"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name_part(), target); + } + + // required bool is_extension = 2; + if (has_is_extension()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->is_extension(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UninterpretedOption.NamePart) + return target; +} + +int UninterpretedOption_NamePart::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required string name_part = 1; + if (has_name_part()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name_part()); + } + + // required bool is_extension = 2; + if (has_is_extension()) { + total_size += 1 + 1; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void UninterpretedOption_NamePart::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const UninterpretedOption_NamePart* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void UninterpretedOption_NamePart::MergeFrom(const UninterpretedOption_NamePart& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name_part()) { + set_name_part(from.name_part()); + } + if (from.has_is_extension()) { + set_is_extension(from.is_extension()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void UninterpretedOption_NamePart::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void UninterpretedOption_NamePart::CopyFrom(const UninterpretedOption_NamePart& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool UninterpretedOption_NamePart::IsInitialized() const { + if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false; + + return true; +} + +void UninterpretedOption_NamePart::Swap(UninterpretedOption_NamePart* other) { + if (other != this) { + std::swap(name_part_, other->name_part_); + std::swap(is_extension_, other->is_extension_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata UninterpretedOption_NamePart::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = UninterpretedOption_NamePart_descriptor_; + metadata.reflection = UninterpretedOption_NamePart_reflection_; + return metadata; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int UninterpretedOption::kNameFieldNumber; +const int UninterpretedOption::kIdentifierValueFieldNumber; +const int UninterpretedOption::kPositiveIntValueFieldNumber; +const int UninterpretedOption::kNegativeIntValueFieldNumber; +const int UninterpretedOption::kDoubleValueFieldNumber; +const int UninterpretedOption::kStringValueFieldNumber; +const int UninterpretedOption::kAggregateValueFieldNumber; +#endif // !_MSC_VER + +UninterpretedOption::UninterpretedOption() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.UninterpretedOption) +} + +void UninterpretedOption::InitAsDefaultInstance() { +} + +UninterpretedOption::UninterpretedOption(const UninterpretedOption& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.UninterpretedOption) +} + +void UninterpretedOption::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + identifier_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + positive_int_value_ = GOOGLE_ULONGLONG(0); + negative_int_value_ = GOOGLE_LONGLONG(0); + double_value_ = 0; + string_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + aggregate_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +UninterpretedOption::~UninterpretedOption() { + // @@protoc_insertion_point(destructor:google.protobuf.UninterpretedOption) + SharedDtor(); +} + +void UninterpretedOption::SharedDtor() { + if (identifier_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete identifier_value_; + } + if (string_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete string_value_; + } + if (aggregate_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete aggregate_value_; + } + if (this != default_instance_) { + } +} + +void UninterpretedOption::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* UninterpretedOption::descriptor() { + protobuf_AssignDescriptorsOnce(); + return UninterpretedOption_descriptor_; +} + +const UninterpretedOption& UninterpretedOption::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +UninterpretedOption* UninterpretedOption::default_instance_ = NULL; + +UninterpretedOption* UninterpretedOption::New() const { + return new UninterpretedOption; +} + +void UninterpretedOption::Clear() { +#define OFFSET_OF_FIELD_(f) (reinterpret_cast( \ + &reinterpret_cast(16)->f) - \ + reinterpret_cast(16)) + +#define ZR_(first, last) do { \ + size_t f = OFFSET_OF_FIELD_(first); \ + size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \ + ::memset(&first, 0, n); \ + } while (0) + + if (_has_bits_[0 / 32] & 126) { + ZR_(positive_int_value_, double_value_); + if (has_identifier_value()) { + if (identifier_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + identifier_value_->clear(); + } + } + if (has_string_value()) { + if (string_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + string_value_->clear(); + } + } + if (has_aggregate_value()) { + if (aggregate_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + aggregate_value_->clear(); + } + } + } + +#undef OFFSET_OF_FIELD_ +#undef ZR_ + + name_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool UninterpretedOption::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.UninterpretedOption) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + case 2: { + if (tag == 18) { + parse_name: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_name())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_name; + if (input->ExpectTag(26)) goto parse_identifier_value; + break; + } + + // optional string identifier_value = 3; + case 3: { + if (tag == 26) { + parse_identifier_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_identifier_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->identifier_value().data(), this->identifier_value().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "identifier_value"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(32)) goto parse_positive_int_value; + break; + } + + // optional uint64 positive_int_value = 4; + case 4: { + if (tag == 32) { + parse_positive_int_value: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &positive_int_value_))); + set_has_positive_int_value(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(40)) goto parse_negative_int_value; + break; + } + + // optional int64 negative_int_value = 5; + case 5: { + if (tag == 40) { + parse_negative_int_value: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &negative_int_value_))); + set_has_negative_int_value(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(49)) goto parse_double_value; + break; + } + + // optional double double_value = 6; + case 6: { + if (tag == 49) { + parse_double_value: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &double_value_))); + set_has_double_value(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(58)) goto parse_string_value; + break; + } + + // optional bytes string_value = 7; + case 7: { + if (tag == 58) { + parse_string_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_string_value())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(66)) goto parse_aggregate_value; + break; + } + + // optional string aggregate_value = 8; + case 8: { + if (tag == 66) { + parse_aggregate_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_aggregate_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->aggregate_value().data(), this->aggregate_value().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "aggregate_value"); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.UninterpretedOption) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.UninterpretedOption) + return false; +#undef DO_ +} + +void UninterpretedOption::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.UninterpretedOption) + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + for (int i = 0; i < this->name_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->name(i), output); + } + + // optional string identifier_value = 3; + if (has_identifier_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->identifier_value().data(), this->identifier_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "identifier_value"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 3, this->identifier_value(), output); + } + + // optional uint64 positive_int_value = 4; + if (has_positive_int_value()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(4, this->positive_int_value(), output); + } + + // optional int64 negative_int_value = 5; + if (has_negative_int_value()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(5, this->negative_int_value(), output); + } + + // optional double double_value = 6; + if (has_double_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(6, this->double_value(), output); + } + + // optional bytes string_value = 7; + if (has_string_value()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 7, this->string_value(), output); + } + + // optional string aggregate_value = 8; + if (has_aggregate_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->aggregate_value().data(), this->aggregate_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "aggregate_value"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 8, this->aggregate_value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.UninterpretedOption) +} + +::google::protobuf::uint8* UninterpretedOption::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption) + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + for (int i = 0; i < this->name_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->name(i), target); + } + + // optional string identifier_value = 3; + if (has_identifier_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->identifier_value().data(), this->identifier_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "identifier_value"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->identifier_value(), target); + } + + // optional uint64 positive_int_value = 4; + if (has_positive_int_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(4, this->positive_int_value(), target); + } + + // optional int64 negative_int_value = 5; + if (has_negative_int_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(5, this->negative_int_value(), target); + } + + // optional double double_value = 6; + if (has_double_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(6, this->double_value(), target); + } + + // optional bytes string_value = 7; + if (has_string_value()) { + target = + ::google::protobuf::internal::WireFormatLite::WriteBytesToArray( + 7, this->string_value(), target); + } + + // optional string aggregate_value = 8; + if (has_aggregate_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->aggregate_value().data(), this->aggregate_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "aggregate_value"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 8, this->aggregate_value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UninterpretedOption) + return target; +} + +int UninterpretedOption::ByteSize() const { + int total_size = 0; + + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + // optional string identifier_value = 3; + if (has_identifier_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->identifier_value()); + } + + // optional uint64 positive_int_value = 4; + if (has_positive_int_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->positive_int_value()); + } + + // optional int64 negative_int_value = 5; + if (has_negative_int_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->negative_int_value()); + } + + // optional double double_value = 6; + if (has_double_value()) { + total_size += 1 + 8; + } + + // optional bytes string_value = 7; + if (has_string_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->string_value()); + } + + // optional string aggregate_value = 8; + if (has_aggregate_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->aggregate_value()); + } + + } + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + total_size += 1 * this->name_size(); + for (int i = 0; i < this->name_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->name(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void UninterpretedOption::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const UninterpretedOption* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void UninterpretedOption::MergeFrom(const UninterpretedOption& from) { + GOOGLE_CHECK_NE(&from, this); + name_.MergeFrom(from.name_); + if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (from.has_identifier_value()) { + set_identifier_value(from.identifier_value()); + } + if (from.has_positive_int_value()) { + set_positive_int_value(from.positive_int_value()); + } + if (from.has_negative_int_value()) { + set_negative_int_value(from.negative_int_value()); + } + if (from.has_double_value()) { + set_double_value(from.double_value()); + } + if (from.has_string_value()) { + set_string_value(from.string_value()); + } + if (from.has_aggregate_value()) { + set_aggregate_value(from.aggregate_value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void UninterpretedOption::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void UninterpretedOption::CopyFrom(const UninterpretedOption& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool UninterpretedOption::IsInitialized() const { + + if (!::google::protobuf::internal::AllAreInitialized(this->name())) return false; + return true; +} + +void UninterpretedOption::Swap(UninterpretedOption* other) { + if (other != this) { + name_.Swap(&other->name_); + std::swap(identifier_value_, other->identifier_value_); + std::swap(positive_int_value_, other->positive_int_value_); + std::swap(negative_int_value_, other->negative_int_value_); + std::swap(double_value_, other->double_value_); + std::swap(string_value_, other->string_value_); + std::swap(aggregate_value_, other->aggregate_value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata UninterpretedOption::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = UninterpretedOption_descriptor_; + metadata.reflection = UninterpretedOption_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int SourceCodeInfo_Location::kPathFieldNumber; +const int SourceCodeInfo_Location::kSpanFieldNumber; +const int SourceCodeInfo_Location::kLeadingCommentsFieldNumber; +const int SourceCodeInfo_Location::kTrailingCommentsFieldNumber; +#endif // !_MSC_VER + +SourceCodeInfo_Location::SourceCodeInfo_Location() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.SourceCodeInfo.Location) +} + +void SourceCodeInfo_Location::InitAsDefaultInstance() { +} + +SourceCodeInfo_Location::SourceCodeInfo_Location(const SourceCodeInfo_Location& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceCodeInfo.Location) +} + +void SourceCodeInfo_Location::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + leading_comments_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + trailing_comments_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +SourceCodeInfo_Location::~SourceCodeInfo_Location() { + // @@protoc_insertion_point(destructor:google.protobuf.SourceCodeInfo.Location) + SharedDtor(); +} + +void SourceCodeInfo_Location::SharedDtor() { + if (leading_comments_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete leading_comments_; + } + if (trailing_comments_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete trailing_comments_; + } + if (this != default_instance_) { + } +} + +void SourceCodeInfo_Location::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* SourceCodeInfo_Location::descriptor() { + protobuf_AssignDescriptorsOnce(); + return SourceCodeInfo_Location_descriptor_; +} + +const SourceCodeInfo_Location& SourceCodeInfo_Location::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +SourceCodeInfo_Location* SourceCodeInfo_Location::default_instance_ = NULL; + +SourceCodeInfo_Location* SourceCodeInfo_Location::New() const { + return new SourceCodeInfo_Location; +} + +void SourceCodeInfo_Location::Clear() { + if (_has_bits_[0 / 32] & 12) { + if (has_leading_comments()) { + if (leading_comments_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + leading_comments_->clear(); + } + } + if (has_trailing_comments()) { + if (trailing_comments_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + trailing_comments_->clear(); + } + } + } + path_.Clear(); + span_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool SourceCodeInfo_Location::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.SourceCodeInfo.Location) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated int32 path = 1 [packed = true]; + case 1: { + if (tag == 10) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, this->mutable_path()))); + } else if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + 1, 10, input, this->mutable_path()))); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_span; + break; + } + + // repeated int32 span = 2 [packed = true]; + case 2: { + if (tag == 18) { + parse_span: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, this->mutable_span()))); + } else if (tag == 16) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + 1, 18, input, this->mutable_span()))); + } else { + goto handle_unusual; + } + if (input->ExpectTag(26)) goto parse_leading_comments; + break; + } + + // optional string leading_comments = 3; + case 3: { + if (tag == 26) { + parse_leading_comments: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_leading_comments())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->leading_comments().data(), this->leading_comments().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "leading_comments"); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_trailing_comments; + break; + } + + // optional string trailing_comments = 4; + case 4: { + if (tag == 34) { + parse_trailing_comments: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_trailing_comments())); + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->trailing_comments().data(), this->trailing_comments().length(), + ::google::protobuf::internal::WireFormat::PARSE, + "trailing_comments"); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.SourceCodeInfo.Location) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.SourceCodeInfo.Location) + return false; +#undef DO_ +} + +void SourceCodeInfo_Location::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.SourceCodeInfo.Location) + // repeated int32 path = 1 [packed = true]; + if (this->path_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_path_cached_byte_size_); + } + for (int i = 0; i < this->path_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( + this->path(i), output); + } + + // repeated int32 span = 2 [packed = true]; + if (this->span_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_span_cached_byte_size_); + } + for (int i = 0; i < this->span_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( + this->span(i), output); + } + + // optional string leading_comments = 3; + if (has_leading_comments()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->leading_comments().data(), this->leading_comments().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "leading_comments"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 3, this->leading_comments(), output); + } + + // optional string trailing_comments = 4; + if (has_trailing_comments()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->trailing_comments().data(), this->trailing_comments().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "trailing_comments"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 4, this->trailing_comments(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.SourceCodeInfo.Location) +} + +::google::protobuf::uint8* SourceCodeInfo_Location::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo.Location) + // repeated int32 path = 1 [packed = true]; + if (this->path_size() > 0) { + target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray( + 1, + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, + target); + target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray( + _path_cached_byte_size_, target); + } + for (int i = 0; i < this->path_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteInt32NoTagToArray(this->path(i), target); + } + + // repeated int32 span = 2 [packed = true]; + if (this->span_size() > 0) { + target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray( + 2, + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, + target); + target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray( + _span_cached_byte_size_, target); + } + for (int i = 0; i < this->span_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteInt32NoTagToArray(this->span(i), target); + } + + // optional string leading_comments = 3; + if (has_leading_comments()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->leading_comments().data(), this->leading_comments().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "leading_comments"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->leading_comments(), target); + } + + // optional string trailing_comments = 4; + if (has_trailing_comments()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( + this->trailing_comments().data(), this->trailing_comments().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE, + "trailing_comments"); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 4, this->trailing_comments(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceCodeInfo.Location) + return target; +} + +int SourceCodeInfo_Location::ByteSize() const { + int total_size = 0; + + if (_has_bits_[2 / 32] & (0xffu << (2 % 32))) { + // optional string leading_comments = 3; + if (has_leading_comments()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->leading_comments()); + } + + // optional string trailing_comments = 4; + if (has_trailing_comments()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->trailing_comments()); + } + + } + // repeated int32 path = 1 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->path_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + Int32Size(this->path(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _path_cached_byte_size_ = data_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + total_size += data_size; + } + + // repeated int32 span = 2 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->span_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + Int32Size(this->span(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _span_cached_byte_size_ = data_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + total_size += data_size; + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void SourceCodeInfo_Location::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const SourceCodeInfo_Location* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void SourceCodeInfo_Location::MergeFrom(const SourceCodeInfo_Location& from) { + GOOGLE_CHECK_NE(&from, this); + path_.MergeFrom(from.path_); + span_.MergeFrom(from.span_); + if (from._has_bits_[2 / 32] & (0xffu << (2 % 32))) { + if (from.has_leading_comments()) { + set_leading_comments(from.leading_comments()); + } + if (from.has_trailing_comments()) { + set_trailing_comments(from.trailing_comments()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void SourceCodeInfo_Location::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void SourceCodeInfo_Location::CopyFrom(const SourceCodeInfo_Location& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool SourceCodeInfo_Location::IsInitialized() const { + + return true; +} + +void SourceCodeInfo_Location::Swap(SourceCodeInfo_Location* other) { + if (other != this) { + path_.Swap(&other->path_); + span_.Swap(&other->span_); + std::swap(leading_comments_, other->leading_comments_); + std::swap(trailing_comments_, other->trailing_comments_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata SourceCodeInfo_Location::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = SourceCodeInfo_Location_descriptor_; + metadata.reflection = SourceCodeInfo_Location_reflection_; + return metadata; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int SourceCodeInfo::kLocationFieldNumber; +#endif // !_MSC_VER + +SourceCodeInfo::SourceCodeInfo() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:google.protobuf.SourceCodeInfo) +} + +void SourceCodeInfo::InitAsDefaultInstance() { +} + +SourceCodeInfo::SourceCodeInfo(const SourceCodeInfo& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceCodeInfo) +} + +void SourceCodeInfo::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +SourceCodeInfo::~SourceCodeInfo() { + // @@protoc_insertion_point(destructor:google.protobuf.SourceCodeInfo) + SharedDtor(); +} + +void SourceCodeInfo::SharedDtor() { + if (this != default_instance_) { + } +} + +void SourceCodeInfo::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* SourceCodeInfo::descriptor() { + protobuf_AssignDescriptorsOnce(); + return SourceCodeInfo_descriptor_; +} + +const SourceCodeInfo& SourceCodeInfo::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + return *default_instance_; +} + +SourceCodeInfo* SourceCodeInfo::default_instance_ = NULL; + +SourceCodeInfo* SourceCodeInfo::New() const { + return new SourceCodeInfo; +} + +void SourceCodeInfo::Clear() { + location_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool SourceCodeInfo::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:google.protobuf.SourceCodeInfo) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + case 1: { + if (tag == 10) { + parse_location: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_location())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(10)) goto parse_location; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:google.protobuf.SourceCodeInfo) + return true; +failure: + // @@protoc_insertion_point(parse_failure:google.protobuf.SourceCodeInfo) + return false; +#undef DO_ +} + +void SourceCodeInfo::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:google.protobuf.SourceCodeInfo) + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + for (int i = 0; i < this->location_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->location(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:google.protobuf.SourceCodeInfo) +} + +::google::protobuf::uint8* SourceCodeInfo::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo) + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + for (int i = 0; i < this->location_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->location(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceCodeInfo) + return target; +} + +int SourceCodeInfo::ByteSize() const { + int total_size = 0; + + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + total_size += 1 * this->location_size(); + for (int i = 0; i < this->location_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->location(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void SourceCodeInfo::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const SourceCodeInfo* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void SourceCodeInfo::MergeFrom(const SourceCodeInfo& from) { + GOOGLE_CHECK_NE(&from, this); + location_.MergeFrom(from.location_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void SourceCodeInfo::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void SourceCodeInfo::CopyFrom(const SourceCodeInfo& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool SourceCodeInfo::IsInitialized() const { + + return true; +} + +void SourceCodeInfo::Swap(SourceCodeInfo* other) { + if (other != this) { + location_.Swap(&other->location_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata SourceCodeInfo::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = SourceCodeInfo_descriptor_; + metadata.reflection = SourceCodeInfo_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace protobuf +} // namespace google + +// @@protoc_insertion_point(global_scope) diff --git a/toolkit/components/protobuf/src/google/protobuf/descriptor.pb.h b/toolkit/components/protobuf/src/google/protobuf/descriptor.pb.h new file mode 100644 index 0000000000000..45521812c3596 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/descriptor.pb.h @@ -0,0 +1,6761 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/protobuf/descriptor.proto + +#ifndef PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED +#define PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2006000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2006001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace google { +namespace protobuf { + +// Internal implementation detail -- do not call these. +void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); +void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); +void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + +class FileDescriptorSet; +class FileDescriptorProto; +class DescriptorProto; +class DescriptorProto_ExtensionRange; +class FieldDescriptorProto; +class OneofDescriptorProto; +class EnumDescriptorProto; +class EnumValueDescriptorProto; +class ServiceDescriptorProto; +class MethodDescriptorProto; +class FileOptions; +class MessageOptions; +class FieldOptions; +class EnumOptions; +class EnumValueOptions; +class ServiceOptions; +class MethodOptions; +class UninterpretedOption; +class UninterpretedOption_NamePart; +class SourceCodeInfo; +class SourceCodeInfo_Location; + +enum FieldDescriptorProto_Type { + FieldDescriptorProto_Type_TYPE_DOUBLE = 1, + FieldDescriptorProto_Type_TYPE_FLOAT = 2, + FieldDescriptorProto_Type_TYPE_INT64 = 3, + FieldDescriptorProto_Type_TYPE_UINT64 = 4, + FieldDescriptorProto_Type_TYPE_INT32 = 5, + FieldDescriptorProto_Type_TYPE_FIXED64 = 6, + FieldDescriptorProto_Type_TYPE_FIXED32 = 7, + FieldDescriptorProto_Type_TYPE_BOOL = 8, + FieldDescriptorProto_Type_TYPE_STRING = 9, + FieldDescriptorProto_Type_TYPE_GROUP = 10, + FieldDescriptorProto_Type_TYPE_MESSAGE = 11, + FieldDescriptorProto_Type_TYPE_BYTES = 12, + FieldDescriptorProto_Type_TYPE_UINT32 = 13, + FieldDescriptorProto_Type_TYPE_ENUM = 14, + FieldDescriptorProto_Type_TYPE_SFIXED32 = 15, + FieldDescriptorProto_Type_TYPE_SFIXED64 = 16, + FieldDescriptorProto_Type_TYPE_SINT32 = 17, + FieldDescriptorProto_Type_TYPE_SINT64 = 18 +}; +LIBPROTOBUF_EXPORT bool FieldDescriptorProto_Type_IsValid(int value); +const FieldDescriptorProto_Type FieldDescriptorProto_Type_Type_MIN = FieldDescriptorProto_Type_TYPE_DOUBLE; +const FieldDescriptorProto_Type FieldDescriptorProto_Type_Type_MAX = FieldDescriptorProto_Type_TYPE_SINT64; +const int FieldDescriptorProto_Type_Type_ARRAYSIZE = FieldDescriptorProto_Type_Type_MAX + 1; + +LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor(); +inline const ::std::string& FieldDescriptorProto_Type_Name(FieldDescriptorProto_Type value) { + return ::google::protobuf::internal::NameOfEnum( + FieldDescriptorProto_Type_descriptor(), value); +} +inline bool FieldDescriptorProto_Type_Parse( + const ::std::string& name, FieldDescriptorProto_Type* value) { + return ::google::protobuf::internal::ParseNamedEnum( + FieldDescriptorProto_Type_descriptor(), name, value); +} +enum FieldDescriptorProto_Label { + FieldDescriptorProto_Label_LABEL_OPTIONAL = 1, + FieldDescriptorProto_Label_LABEL_REQUIRED = 2, + FieldDescriptorProto_Label_LABEL_REPEATED = 3 +}; +LIBPROTOBUF_EXPORT bool FieldDescriptorProto_Label_IsValid(int value); +const FieldDescriptorProto_Label FieldDescriptorProto_Label_Label_MIN = FieldDescriptorProto_Label_LABEL_OPTIONAL; +const FieldDescriptorProto_Label FieldDescriptorProto_Label_Label_MAX = FieldDescriptorProto_Label_LABEL_REPEATED; +const int FieldDescriptorProto_Label_Label_ARRAYSIZE = FieldDescriptorProto_Label_Label_MAX + 1; + +LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor(); +inline const ::std::string& FieldDescriptorProto_Label_Name(FieldDescriptorProto_Label value) { + return ::google::protobuf::internal::NameOfEnum( + FieldDescriptorProto_Label_descriptor(), value); +} +inline bool FieldDescriptorProto_Label_Parse( + const ::std::string& name, FieldDescriptorProto_Label* value) { + return ::google::protobuf::internal::ParseNamedEnum( + FieldDescriptorProto_Label_descriptor(), name, value); +} +enum FileOptions_OptimizeMode { + FileOptions_OptimizeMode_SPEED = 1, + FileOptions_OptimizeMode_CODE_SIZE = 2, + FileOptions_OptimizeMode_LITE_RUNTIME = 3 +}; +LIBPROTOBUF_EXPORT bool FileOptions_OptimizeMode_IsValid(int value); +const FileOptions_OptimizeMode FileOptions_OptimizeMode_OptimizeMode_MIN = FileOptions_OptimizeMode_SPEED; +const FileOptions_OptimizeMode FileOptions_OptimizeMode_OptimizeMode_MAX = FileOptions_OptimizeMode_LITE_RUNTIME; +const int FileOptions_OptimizeMode_OptimizeMode_ARRAYSIZE = FileOptions_OptimizeMode_OptimizeMode_MAX + 1; + +LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor(); +inline const ::std::string& FileOptions_OptimizeMode_Name(FileOptions_OptimizeMode value) { + return ::google::protobuf::internal::NameOfEnum( + FileOptions_OptimizeMode_descriptor(), value); +} +inline bool FileOptions_OptimizeMode_Parse( + const ::std::string& name, FileOptions_OptimizeMode* value) { + return ::google::protobuf::internal::ParseNamedEnum( + FileOptions_OptimizeMode_descriptor(), name, value); +} +enum FieldOptions_CType { + FieldOptions_CType_STRING = 0, + FieldOptions_CType_CORD = 1, + FieldOptions_CType_STRING_PIECE = 2 +}; +LIBPROTOBUF_EXPORT bool FieldOptions_CType_IsValid(int value); +const FieldOptions_CType FieldOptions_CType_CType_MIN = FieldOptions_CType_STRING; +const FieldOptions_CType FieldOptions_CType_CType_MAX = FieldOptions_CType_STRING_PIECE; +const int FieldOptions_CType_CType_ARRAYSIZE = FieldOptions_CType_CType_MAX + 1; + +LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor(); +inline const ::std::string& FieldOptions_CType_Name(FieldOptions_CType value) { + return ::google::protobuf::internal::NameOfEnum( + FieldOptions_CType_descriptor(), value); +} +inline bool FieldOptions_CType_Parse( + const ::std::string& name, FieldOptions_CType* value) { + return ::google::protobuf::internal::ParseNamedEnum( + FieldOptions_CType_descriptor(), name, value); +} +// =================================================================== + +class LIBPROTOBUF_EXPORT FileDescriptorSet : public ::google::protobuf::Message { + public: + FileDescriptorSet(); + virtual ~FileDescriptorSet(); + + FileDescriptorSet(const FileDescriptorSet& from); + + inline FileDescriptorSet& operator=(const FileDescriptorSet& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FileDescriptorSet& default_instance(); + + void Swap(FileDescriptorSet* other); + + // implements Message ---------------------------------------------- + + FileDescriptorSet* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FileDescriptorSet& from); + void MergeFrom(const FileDescriptorSet& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.FileDescriptorProto file = 1; + inline int file_size() const; + inline void clear_file(); + static const int kFileFieldNumber = 1; + inline const ::google::protobuf::FileDescriptorProto& file(int index) const; + inline ::google::protobuf::FileDescriptorProto* mutable_file(int index); + inline ::google::protobuf::FileDescriptorProto* add_file(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& + file() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* + mutable_file(); + + // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorSet) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > file_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FileDescriptorSet* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT FileDescriptorProto : public ::google::protobuf::Message { + public: + FileDescriptorProto(); + virtual ~FileDescriptorProto(); + + FileDescriptorProto(const FileDescriptorProto& from); + + inline FileDescriptorProto& operator=(const FileDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FileDescriptorProto& default_instance(); + + void Swap(FileDescriptorProto* other); + + // implements Message ---------------------------------------------- + + FileDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FileDescriptorProto& from); + void MergeFrom(const FileDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // optional string package = 2; + inline bool has_package() const; + inline void clear_package(); + static const int kPackageFieldNumber = 2; + inline const ::std::string& package() const; + inline void set_package(const ::std::string& value); + inline void set_package(const char* value); + inline void set_package(const char* value, size_t size); + inline ::std::string* mutable_package(); + inline ::std::string* release_package(); + inline void set_allocated_package(::std::string* package); + + // repeated string dependency = 3; + inline int dependency_size() const; + inline void clear_dependency(); + static const int kDependencyFieldNumber = 3; + inline const ::std::string& dependency(int index) const; + inline ::std::string* mutable_dependency(int index); + inline void set_dependency(int index, const ::std::string& value); + inline void set_dependency(int index, const char* value); + inline void set_dependency(int index, const char* value, size_t size); + inline ::std::string* add_dependency(); + inline void add_dependency(const ::std::string& value); + inline void add_dependency(const char* value); + inline void add_dependency(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& dependency() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_dependency(); + + // repeated int32 public_dependency = 10; + inline int public_dependency_size() const; + inline void clear_public_dependency(); + static const int kPublicDependencyFieldNumber = 10; + inline ::google::protobuf::int32 public_dependency(int index) const; + inline void set_public_dependency(int index, ::google::protobuf::int32 value); + inline void add_public_dependency(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + public_dependency() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_public_dependency(); + + // repeated int32 weak_dependency = 11; + inline int weak_dependency_size() const; + inline void clear_weak_dependency(); + static const int kWeakDependencyFieldNumber = 11; + inline ::google::protobuf::int32 weak_dependency(int index) const; + inline void set_weak_dependency(int index, ::google::protobuf::int32 value); + inline void add_weak_dependency(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + weak_dependency() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_weak_dependency(); + + // repeated .google.protobuf.DescriptorProto message_type = 4; + inline int message_type_size() const; + inline void clear_message_type(); + static const int kMessageTypeFieldNumber = 4; + inline const ::google::protobuf::DescriptorProto& message_type(int index) const; + inline ::google::protobuf::DescriptorProto* mutable_message_type(int index); + inline ::google::protobuf::DescriptorProto* add_message_type(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& + message_type() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* + mutable_message_type(); + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + inline int enum_type_size() const; + inline void clear_enum_type(); + static const int kEnumTypeFieldNumber = 5; + inline const ::google::protobuf::EnumDescriptorProto& enum_type(int index) const; + inline ::google::protobuf::EnumDescriptorProto* mutable_enum_type(int index); + inline ::google::protobuf::EnumDescriptorProto* add_enum_type(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& + enum_type() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* + mutable_enum_type(); + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + inline int service_size() const; + inline void clear_service(); + static const int kServiceFieldNumber = 6; + inline const ::google::protobuf::ServiceDescriptorProto& service(int index) const; + inline ::google::protobuf::ServiceDescriptorProto* mutable_service(int index); + inline ::google::protobuf::ServiceDescriptorProto* add_service(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >& + service() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >* + mutable_service(); + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + inline int extension_size() const; + inline void clear_extension(); + static const int kExtensionFieldNumber = 7; + inline const ::google::protobuf::FieldDescriptorProto& extension(int index) const; + inline ::google::protobuf::FieldDescriptorProto* mutable_extension(int index); + inline ::google::protobuf::FieldDescriptorProto* add_extension(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& + extension() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* + mutable_extension(); + + // optional .google.protobuf.FileOptions options = 8; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 8; + inline const ::google::protobuf::FileOptions& options() const; + inline ::google::protobuf::FileOptions* mutable_options(); + inline ::google::protobuf::FileOptions* release_options(); + inline void set_allocated_options(::google::protobuf::FileOptions* options); + + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + inline bool has_source_code_info() const; + inline void clear_source_code_info(); + static const int kSourceCodeInfoFieldNumber = 9; + inline const ::google::protobuf::SourceCodeInfo& source_code_info() const; + inline ::google::protobuf::SourceCodeInfo* mutable_source_code_info(); + inline ::google::protobuf::SourceCodeInfo* release_source_code_info(); + inline void set_allocated_source_code_info(::google::protobuf::SourceCodeInfo* source_code_info); + + // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_package(); + inline void clear_has_package(); + inline void set_has_options(); + inline void clear_has_options(); + inline void set_has_source_code_info(); + inline void clear_has_source_code_info(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::std::string* package_; + ::google::protobuf::RepeatedPtrField< ::std::string> dependency_; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > public_dependency_; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > weak_dependency_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > message_type_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto > service_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_; + ::google::protobuf::FileOptions* options_; + ::google::protobuf::SourceCodeInfo* source_code_info_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FileDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT DescriptorProto_ExtensionRange : public ::google::protobuf::Message { + public: + DescriptorProto_ExtensionRange(); + virtual ~DescriptorProto_ExtensionRange(); + + DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from); + + inline DescriptorProto_ExtensionRange& operator=(const DescriptorProto_ExtensionRange& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const DescriptorProto_ExtensionRange& default_instance(); + + void Swap(DescriptorProto_ExtensionRange* other); + + // implements Message ---------------------------------------------- + + DescriptorProto_ExtensionRange* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const DescriptorProto_ExtensionRange& from); + void MergeFrom(const DescriptorProto_ExtensionRange& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional int32 start = 1; + inline bool has_start() const; + inline void clear_start(); + static const int kStartFieldNumber = 1; + inline ::google::protobuf::int32 start() const; + inline void set_start(::google::protobuf::int32 value); + + // optional int32 end = 2; + inline bool has_end() const; + inline void clear_end(); + static const int kEndFieldNumber = 2; + inline ::google::protobuf::int32 end() const; + inline void set_end(::google::protobuf::int32 value); + + // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ExtensionRange) + private: + inline void set_has_start(); + inline void clear_has_start(); + inline void set_has_end(); + inline void clear_has_end(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::int32 start_; + ::google::protobuf::int32 end_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static DescriptorProto_ExtensionRange* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT DescriptorProto : public ::google::protobuf::Message { + public: + DescriptorProto(); + virtual ~DescriptorProto(); + + DescriptorProto(const DescriptorProto& from); + + inline DescriptorProto& operator=(const DescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const DescriptorProto& default_instance(); + + void Swap(DescriptorProto* other); + + // implements Message ---------------------------------------------- + + DescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const DescriptorProto& from); + void MergeFrom(const DescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef DescriptorProto_ExtensionRange ExtensionRange; + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // repeated .google.protobuf.FieldDescriptorProto field = 2; + inline int field_size() const; + inline void clear_field(); + static const int kFieldFieldNumber = 2; + inline const ::google::protobuf::FieldDescriptorProto& field(int index) const; + inline ::google::protobuf::FieldDescriptorProto* mutable_field(int index); + inline ::google::protobuf::FieldDescriptorProto* add_field(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& + field() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* + mutable_field(); + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + inline int extension_size() const; + inline void clear_extension(); + static const int kExtensionFieldNumber = 6; + inline const ::google::protobuf::FieldDescriptorProto& extension(int index) const; + inline ::google::protobuf::FieldDescriptorProto* mutable_extension(int index); + inline ::google::protobuf::FieldDescriptorProto* add_extension(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& + extension() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* + mutable_extension(); + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + inline int nested_type_size() const; + inline void clear_nested_type(); + static const int kNestedTypeFieldNumber = 3; + inline const ::google::protobuf::DescriptorProto& nested_type(int index) const; + inline ::google::protobuf::DescriptorProto* mutable_nested_type(int index); + inline ::google::protobuf::DescriptorProto* add_nested_type(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& + nested_type() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* + mutable_nested_type(); + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + inline int enum_type_size() const; + inline void clear_enum_type(); + static const int kEnumTypeFieldNumber = 4; + inline const ::google::protobuf::EnumDescriptorProto& enum_type(int index) const; + inline ::google::protobuf::EnumDescriptorProto* mutable_enum_type(int index); + inline ::google::protobuf::EnumDescriptorProto* add_enum_type(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& + enum_type() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* + mutable_enum_type(); + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + inline int extension_range_size() const; + inline void clear_extension_range(); + static const int kExtensionRangeFieldNumber = 5; + inline const ::google::protobuf::DescriptorProto_ExtensionRange& extension_range(int index) const; + inline ::google::protobuf::DescriptorProto_ExtensionRange* mutable_extension_range(int index); + inline ::google::protobuf::DescriptorProto_ExtensionRange* add_extension_range(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >& + extension_range() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >* + mutable_extension_range(); + + // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; + inline int oneof_decl_size() const; + inline void clear_oneof_decl(); + static const int kOneofDeclFieldNumber = 8; + inline const ::google::protobuf::OneofDescriptorProto& oneof_decl(int index) const; + inline ::google::protobuf::OneofDescriptorProto* mutable_oneof_decl(int index); + inline ::google::protobuf::OneofDescriptorProto* add_oneof_decl(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >& + oneof_decl() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >* + mutable_oneof_decl(); + + // optional .google.protobuf.MessageOptions options = 7; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 7; + inline const ::google::protobuf::MessageOptions& options() const; + inline ::google::protobuf::MessageOptions* mutable_options(); + inline ::google::protobuf::MessageOptions* release_options(); + inline void set_allocated_options(::google::protobuf::MessageOptions* options); + + // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > field_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > nested_type_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange > extension_range_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto > oneof_decl_; + ::google::protobuf::MessageOptions* options_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static DescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT FieldDescriptorProto : public ::google::protobuf::Message { + public: + FieldDescriptorProto(); + virtual ~FieldDescriptorProto(); + + FieldDescriptorProto(const FieldDescriptorProto& from); + + inline FieldDescriptorProto& operator=(const FieldDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FieldDescriptorProto& default_instance(); + + void Swap(FieldDescriptorProto* other); + + // implements Message ---------------------------------------------- + + FieldDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FieldDescriptorProto& from); + void MergeFrom(const FieldDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef FieldDescriptorProto_Type Type; + static const Type TYPE_DOUBLE = FieldDescriptorProto_Type_TYPE_DOUBLE; + static const Type TYPE_FLOAT = FieldDescriptorProto_Type_TYPE_FLOAT; + static const Type TYPE_INT64 = FieldDescriptorProto_Type_TYPE_INT64; + static const Type TYPE_UINT64 = FieldDescriptorProto_Type_TYPE_UINT64; + static const Type TYPE_INT32 = FieldDescriptorProto_Type_TYPE_INT32; + static const Type TYPE_FIXED64 = FieldDescriptorProto_Type_TYPE_FIXED64; + static const Type TYPE_FIXED32 = FieldDescriptorProto_Type_TYPE_FIXED32; + static const Type TYPE_BOOL = FieldDescriptorProto_Type_TYPE_BOOL; + static const Type TYPE_STRING = FieldDescriptorProto_Type_TYPE_STRING; + static const Type TYPE_GROUP = FieldDescriptorProto_Type_TYPE_GROUP; + static const Type TYPE_MESSAGE = FieldDescriptorProto_Type_TYPE_MESSAGE; + static const Type TYPE_BYTES = FieldDescriptorProto_Type_TYPE_BYTES; + static const Type TYPE_UINT32 = FieldDescriptorProto_Type_TYPE_UINT32; + static const Type TYPE_ENUM = FieldDescriptorProto_Type_TYPE_ENUM; + static const Type TYPE_SFIXED32 = FieldDescriptorProto_Type_TYPE_SFIXED32; + static const Type TYPE_SFIXED64 = FieldDescriptorProto_Type_TYPE_SFIXED64; + static const Type TYPE_SINT32 = FieldDescriptorProto_Type_TYPE_SINT32; + static const Type TYPE_SINT64 = FieldDescriptorProto_Type_TYPE_SINT64; + static inline bool Type_IsValid(int value) { + return FieldDescriptorProto_Type_IsValid(value); + } + static const Type Type_MIN = + FieldDescriptorProto_Type_Type_MIN; + static const Type Type_MAX = + FieldDescriptorProto_Type_Type_MAX; + static const int Type_ARRAYSIZE = + FieldDescriptorProto_Type_Type_ARRAYSIZE; + static inline const ::google::protobuf::EnumDescriptor* + Type_descriptor() { + return FieldDescriptorProto_Type_descriptor(); + } + static inline const ::std::string& Type_Name(Type value) { + return FieldDescriptorProto_Type_Name(value); + } + static inline bool Type_Parse(const ::std::string& name, + Type* value) { + return FieldDescriptorProto_Type_Parse(name, value); + } + + typedef FieldDescriptorProto_Label Label; + static const Label LABEL_OPTIONAL = FieldDescriptorProto_Label_LABEL_OPTIONAL; + static const Label LABEL_REQUIRED = FieldDescriptorProto_Label_LABEL_REQUIRED; + static const Label LABEL_REPEATED = FieldDescriptorProto_Label_LABEL_REPEATED; + static inline bool Label_IsValid(int value) { + return FieldDescriptorProto_Label_IsValid(value); + } + static const Label Label_MIN = + FieldDescriptorProto_Label_Label_MIN; + static const Label Label_MAX = + FieldDescriptorProto_Label_Label_MAX; + static const int Label_ARRAYSIZE = + FieldDescriptorProto_Label_Label_ARRAYSIZE; + static inline const ::google::protobuf::EnumDescriptor* + Label_descriptor() { + return FieldDescriptorProto_Label_descriptor(); + } + static inline const ::std::string& Label_Name(Label value) { + return FieldDescriptorProto_Label_Name(value); + } + static inline bool Label_Parse(const ::std::string& name, + Label* value) { + return FieldDescriptorProto_Label_Parse(name, value); + } + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // optional int32 number = 3; + inline bool has_number() const; + inline void clear_number(); + static const int kNumberFieldNumber = 3; + inline ::google::protobuf::int32 number() const; + inline void set_number(::google::protobuf::int32 value); + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + inline bool has_label() const; + inline void clear_label(); + static const int kLabelFieldNumber = 4; + inline ::google::protobuf::FieldDescriptorProto_Label label() const; + inline void set_label(::google::protobuf::FieldDescriptorProto_Label value); + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + inline bool has_type() const; + inline void clear_type(); + static const int kTypeFieldNumber = 5; + inline ::google::protobuf::FieldDescriptorProto_Type type() const; + inline void set_type(::google::protobuf::FieldDescriptorProto_Type value); + + // optional string type_name = 6; + inline bool has_type_name() const; + inline void clear_type_name(); + static const int kTypeNameFieldNumber = 6; + inline const ::std::string& type_name() const; + inline void set_type_name(const ::std::string& value); + inline void set_type_name(const char* value); + inline void set_type_name(const char* value, size_t size); + inline ::std::string* mutable_type_name(); + inline ::std::string* release_type_name(); + inline void set_allocated_type_name(::std::string* type_name); + + // optional string extendee = 2; + inline bool has_extendee() const; + inline void clear_extendee(); + static const int kExtendeeFieldNumber = 2; + inline const ::std::string& extendee() const; + inline void set_extendee(const ::std::string& value); + inline void set_extendee(const char* value); + inline void set_extendee(const char* value, size_t size); + inline ::std::string* mutable_extendee(); + inline ::std::string* release_extendee(); + inline void set_allocated_extendee(::std::string* extendee); + + // optional string default_value = 7; + inline bool has_default_value() const; + inline void clear_default_value(); + static const int kDefaultValueFieldNumber = 7; + inline const ::std::string& default_value() const; + inline void set_default_value(const ::std::string& value); + inline void set_default_value(const char* value); + inline void set_default_value(const char* value, size_t size); + inline ::std::string* mutable_default_value(); + inline ::std::string* release_default_value(); + inline void set_allocated_default_value(::std::string* default_value); + + // optional int32 oneof_index = 9; + inline bool has_oneof_index() const; + inline void clear_oneof_index(); + static const int kOneofIndexFieldNumber = 9; + inline ::google::protobuf::int32 oneof_index() const; + inline void set_oneof_index(::google::protobuf::int32 value); + + // optional .google.protobuf.FieldOptions options = 8; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 8; + inline const ::google::protobuf::FieldOptions& options() const; + inline ::google::protobuf::FieldOptions* mutable_options(); + inline ::google::protobuf::FieldOptions* release_options(); + inline void set_allocated_options(::google::protobuf::FieldOptions* options); + + // @@protoc_insertion_point(class_scope:google.protobuf.FieldDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_number(); + inline void clear_has_number(); + inline void set_has_label(); + inline void clear_has_label(); + inline void set_has_type(); + inline void clear_has_type(); + inline void set_has_type_name(); + inline void clear_has_type_name(); + inline void set_has_extendee(); + inline void clear_has_extendee(); + inline void set_has_default_value(); + inline void clear_has_default_value(); + inline void set_has_oneof_index(); + inline void clear_has_oneof_index(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::google::protobuf::int32 number_; + int label_; + ::std::string* type_name_; + ::std::string* extendee_; + int type_; + ::google::protobuf::int32 oneof_index_; + ::std::string* default_value_; + ::google::protobuf::FieldOptions* options_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FieldDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT OneofDescriptorProto : public ::google::protobuf::Message { + public: + OneofDescriptorProto(); + virtual ~OneofDescriptorProto(); + + OneofDescriptorProto(const OneofDescriptorProto& from); + + inline OneofDescriptorProto& operator=(const OneofDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const OneofDescriptorProto& default_instance(); + + void Swap(OneofDescriptorProto* other); + + // implements Message ---------------------------------------------- + + OneofDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const OneofDescriptorProto& from); + void MergeFrom(const OneofDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // @@protoc_insertion_point(class_scope:google.protobuf.OneofDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static OneofDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT EnumDescriptorProto : public ::google::protobuf::Message { + public: + EnumDescriptorProto(); + virtual ~EnumDescriptorProto(); + + EnumDescriptorProto(const EnumDescriptorProto& from); + + inline EnumDescriptorProto& operator=(const EnumDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const EnumDescriptorProto& default_instance(); + + void Swap(EnumDescriptorProto* other); + + // implements Message ---------------------------------------------- + + EnumDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const EnumDescriptorProto& from); + void MergeFrom(const EnumDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + inline int value_size() const; + inline void clear_value(); + static const int kValueFieldNumber = 2; + inline const ::google::protobuf::EnumValueDescriptorProto& value(int index) const; + inline ::google::protobuf::EnumValueDescriptorProto* mutable_value(int index); + inline ::google::protobuf::EnumValueDescriptorProto* add_value(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >& + value() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >* + mutable_value(); + + // optional .google.protobuf.EnumOptions options = 3; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 3; + inline const ::google::protobuf::EnumOptions& options() const; + inline ::google::protobuf::EnumOptions* mutable_options(); + inline ::google::protobuf::EnumOptions* release_options(); + inline void set_allocated_options(::google::protobuf::EnumOptions* options); + + // @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto > value_; + ::google::protobuf::EnumOptions* options_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static EnumDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT EnumValueDescriptorProto : public ::google::protobuf::Message { + public: + EnumValueDescriptorProto(); + virtual ~EnumValueDescriptorProto(); + + EnumValueDescriptorProto(const EnumValueDescriptorProto& from); + + inline EnumValueDescriptorProto& operator=(const EnumValueDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const EnumValueDescriptorProto& default_instance(); + + void Swap(EnumValueDescriptorProto* other); + + // implements Message ---------------------------------------------- + + EnumValueDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const EnumValueDescriptorProto& from); + void MergeFrom(const EnumValueDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // optional int32 number = 2; + inline bool has_number() const; + inline void clear_number(); + static const int kNumberFieldNumber = 2; + inline ::google::protobuf::int32 number() const; + inline void set_number(::google::protobuf::int32 value); + + // optional .google.protobuf.EnumValueOptions options = 3; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 3; + inline const ::google::protobuf::EnumValueOptions& options() const; + inline ::google::protobuf::EnumValueOptions* mutable_options(); + inline ::google::protobuf::EnumValueOptions* release_options(); + inline void set_allocated_options(::google::protobuf::EnumValueOptions* options); + + // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_number(); + inline void clear_has_number(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::google::protobuf::EnumValueOptions* options_; + ::google::protobuf::int32 number_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static EnumValueDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT ServiceDescriptorProto : public ::google::protobuf::Message { + public: + ServiceDescriptorProto(); + virtual ~ServiceDescriptorProto(); + + ServiceDescriptorProto(const ServiceDescriptorProto& from); + + inline ServiceDescriptorProto& operator=(const ServiceDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const ServiceDescriptorProto& default_instance(); + + void Swap(ServiceDescriptorProto* other); + + // implements Message ---------------------------------------------- + + ServiceDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const ServiceDescriptorProto& from); + void MergeFrom(const ServiceDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // repeated .google.protobuf.MethodDescriptorProto method = 2; + inline int method_size() const; + inline void clear_method(); + static const int kMethodFieldNumber = 2; + inline const ::google::protobuf::MethodDescriptorProto& method(int index) const; + inline ::google::protobuf::MethodDescriptorProto* mutable_method(int index); + inline ::google::protobuf::MethodDescriptorProto* add_method(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >& + method() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >* + mutable_method(); + + // optional .google.protobuf.ServiceOptions options = 3; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 3; + inline const ::google::protobuf::ServiceOptions& options() const; + inline ::google::protobuf::ServiceOptions* mutable_options(); + inline ::google::protobuf::ServiceOptions* release_options(); + inline void set_allocated_options(::google::protobuf::ServiceOptions* options); + + // @@protoc_insertion_point(class_scope:google.protobuf.ServiceDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto > method_; + ::google::protobuf::ServiceOptions* options_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static ServiceDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT MethodDescriptorProto : public ::google::protobuf::Message { + public: + MethodDescriptorProto(); + virtual ~MethodDescriptorProto(); + + MethodDescriptorProto(const MethodDescriptorProto& from); + + inline MethodDescriptorProto& operator=(const MethodDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MethodDescriptorProto& default_instance(); + + void Swap(MethodDescriptorProto* other); + + // implements Message ---------------------------------------------- + + MethodDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MethodDescriptorProto& from); + void MergeFrom(const MethodDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // optional string input_type = 2; + inline bool has_input_type() const; + inline void clear_input_type(); + static const int kInputTypeFieldNumber = 2; + inline const ::std::string& input_type() const; + inline void set_input_type(const ::std::string& value); + inline void set_input_type(const char* value); + inline void set_input_type(const char* value, size_t size); + inline ::std::string* mutable_input_type(); + inline ::std::string* release_input_type(); + inline void set_allocated_input_type(::std::string* input_type); + + // optional string output_type = 3; + inline bool has_output_type() const; + inline void clear_output_type(); + static const int kOutputTypeFieldNumber = 3; + inline const ::std::string& output_type() const; + inline void set_output_type(const ::std::string& value); + inline void set_output_type(const char* value); + inline void set_output_type(const char* value, size_t size); + inline ::std::string* mutable_output_type(); + inline ::std::string* release_output_type(); + inline void set_allocated_output_type(::std::string* output_type); + + // optional .google.protobuf.MethodOptions options = 4; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 4; + inline const ::google::protobuf::MethodOptions& options() const; + inline ::google::protobuf::MethodOptions* mutable_options(); + inline ::google::protobuf::MethodOptions* release_options(); + inline void set_allocated_options(::google::protobuf::MethodOptions* options); + + // @@protoc_insertion_point(class_scope:google.protobuf.MethodDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_input_type(); + inline void clear_has_input_type(); + inline void set_has_output_type(); + inline void clear_has_output_type(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_; + ::std::string* input_type_; + ::std::string* output_type_; + ::google::protobuf::MethodOptions* options_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static MethodDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT FileOptions : public ::google::protobuf::Message { + public: + FileOptions(); + virtual ~FileOptions(); + + FileOptions(const FileOptions& from); + + inline FileOptions& operator=(const FileOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FileOptions& default_instance(); + + void Swap(FileOptions* other); + + // implements Message ---------------------------------------------- + + FileOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FileOptions& from); + void MergeFrom(const FileOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef FileOptions_OptimizeMode OptimizeMode; + static const OptimizeMode SPEED = FileOptions_OptimizeMode_SPEED; + static const OptimizeMode CODE_SIZE = FileOptions_OptimizeMode_CODE_SIZE; + static const OptimizeMode LITE_RUNTIME = FileOptions_OptimizeMode_LITE_RUNTIME; + static inline bool OptimizeMode_IsValid(int value) { + return FileOptions_OptimizeMode_IsValid(value); + } + static const OptimizeMode OptimizeMode_MIN = + FileOptions_OptimizeMode_OptimizeMode_MIN; + static const OptimizeMode OptimizeMode_MAX = + FileOptions_OptimizeMode_OptimizeMode_MAX; + static const int OptimizeMode_ARRAYSIZE = + FileOptions_OptimizeMode_OptimizeMode_ARRAYSIZE; + static inline const ::google::protobuf::EnumDescriptor* + OptimizeMode_descriptor() { + return FileOptions_OptimizeMode_descriptor(); + } + static inline const ::std::string& OptimizeMode_Name(OptimizeMode value) { + return FileOptions_OptimizeMode_Name(value); + } + static inline bool OptimizeMode_Parse(const ::std::string& name, + OptimizeMode* value) { + return FileOptions_OptimizeMode_Parse(name, value); + } + + // accessors ------------------------------------------------------- + + // optional string java_package = 1; + inline bool has_java_package() const; + inline void clear_java_package(); + static const int kJavaPackageFieldNumber = 1; + inline const ::std::string& java_package() const; + inline void set_java_package(const ::std::string& value); + inline void set_java_package(const char* value); + inline void set_java_package(const char* value, size_t size); + inline ::std::string* mutable_java_package(); + inline ::std::string* release_java_package(); + inline void set_allocated_java_package(::std::string* java_package); + + // optional string java_outer_classname = 8; + inline bool has_java_outer_classname() const; + inline void clear_java_outer_classname(); + static const int kJavaOuterClassnameFieldNumber = 8; + inline const ::std::string& java_outer_classname() const; + inline void set_java_outer_classname(const ::std::string& value); + inline void set_java_outer_classname(const char* value); + inline void set_java_outer_classname(const char* value, size_t size); + inline ::std::string* mutable_java_outer_classname(); + inline ::std::string* release_java_outer_classname(); + inline void set_allocated_java_outer_classname(::std::string* java_outer_classname); + + // optional bool java_multiple_files = 10 [default = false]; + inline bool has_java_multiple_files() const; + inline void clear_java_multiple_files(); + static const int kJavaMultipleFilesFieldNumber = 10; + inline bool java_multiple_files() const; + inline void set_java_multiple_files(bool value); + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + inline bool has_java_generate_equals_and_hash() const; + inline void clear_java_generate_equals_and_hash(); + static const int kJavaGenerateEqualsAndHashFieldNumber = 20; + inline bool java_generate_equals_and_hash() const; + inline void set_java_generate_equals_and_hash(bool value); + + // optional bool java_string_check_utf8 = 27 [default = false]; + inline bool has_java_string_check_utf8() const; + inline void clear_java_string_check_utf8(); + static const int kJavaStringCheckUtf8FieldNumber = 27; + inline bool java_string_check_utf8() const; + inline void set_java_string_check_utf8(bool value); + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + inline bool has_optimize_for() const; + inline void clear_optimize_for(); + static const int kOptimizeForFieldNumber = 9; + inline ::google::protobuf::FileOptions_OptimizeMode optimize_for() const; + inline void set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value); + + // optional string go_package = 11; + inline bool has_go_package() const; + inline void clear_go_package(); + static const int kGoPackageFieldNumber = 11; + inline const ::std::string& go_package() const; + inline void set_go_package(const ::std::string& value); + inline void set_go_package(const char* value); + inline void set_go_package(const char* value, size_t size); + inline ::std::string* mutable_go_package(); + inline ::std::string* release_go_package(); + inline void set_allocated_go_package(::std::string* go_package); + + // optional bool cc_generic_services = 16 [default = false]; + inline bool has_cc_generic_services() const; + inline void clear_cc_generic_services(); + static const int kCcGenericServicesFieldNumber = 16; + inline bool cc_generic_services() const; + inline void set_cc_generic_services(bool value); + + // optional bool java_generic_services = 17 [default = false]; + inline bool has_java_generic_services() const; + inline void clear_java_generic_services(); + static const int kJavaGenericServicesFieldNumber = 17; + inline bool java_generic_services() const; + inline void set_java_generic_services(bool value); + + // optional bool py_generic_services = 18 [default = false]; + inline bool has_py_generic_services() const; + inline void clear_py_generic_services(); + static const int kPyGenericServicesFieldNumber = 18; + inline bool py_generic_services() const; + inline void set_py_generic_services(bool value); + + // optional bool deprecated = 23 [default = false]; + inline bool has_deprecated() const; + inline void clear_deprecated(); + static const int kDeprecatedFieldNumber = 23; + inline bool deprecated() const; + inline void set_deprecated(bool value); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FileOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.FileOptions) + private: + inline void set_has_java_package(); + inline void clear_has_java_package(); + inline void set_has_java_outer_classname(); + inline void clear_has_java_outer_classname(); + inline void set_has_java_multiple_files(); + inline void clear_has_java_multiple_files(); + inline void set_has_java_generate_equals_and_hash(); + inline void clear_has_java_generate_equals_and_hash(); + inline void set_has_java_string_check_utf8(); + inline void clear_has_java_string_check_utf8(); + inline void set_has_optimize_for(); + inline void clear_has_optimize_for(); + inline void set_has_go_package(); + inline void clear_has_go_package(); + inline void set_has_cc_generic_services(); + inline void clear_has_cc_generic_services(); + inline void set_has_java_generic_services(); + inline void clear_has_java_generic_services(); + inline void set_has_py_generic_services(); + inline void clear_has_py_generic_services(); + inline void set_has_deprecated(); + inline void clear_has_deprecated(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* java_package_; + ::std::string* java_outer_classname_; + bool java_multiple_files_; + bool java_generate_equals_and_hash_; + bool java_string_check_utf8_; + bool cc_generic_services_; + int optimize_for_; + ::std::string* go_package_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + bool java_generic_services_; + bool py_generic_services_; + bool deprecated_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FileOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT MessageOptions : public ::google::protobuf::Message { + public: + MessageOptions(); + virtual ~MessageOptions(); + + MessageOptions(const MessageOptions& from); + + inline MessageOptions& operator=(const MessageOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MessageOptions& default_instance(); + + void Swap(MessageOptions* other); + + // implements Message ---------------------------------------------- + + MessageOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MessageOptions& from); + void MergeFrom(const MessageOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bool message_set_wire_format = 1 [default = false]; + inline bool has_message_set_wire_format() const; + inline void clear_message_set_wire_format(); + static const int kMessageSetWireFormatFieldNumber = 1; + inline bool message_set_wire_format() const; + inline void set_message_set_wire_format(bool value); + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + inline bool has_no_standard_descriptor_accessor() const; + inline void clear_no_standard_descriptor_accessor(); + static const int kNoStandardDescriptorAccessorFieldNumber = 2; + inline bool no_standard_descriptor_accessor() const; + inline void set_no_standard_descriptor_accessor(bool value); + + // optional bool deprecated = 3 [default = false]; + inline bool has_deprecated() const; + inline void clear_deprecated(); + static const int kDeprecatedFieldNumber = 3; + inline bool deprecated() const; + inline void set_deprecated(bool value); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MessageOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.MessageOptions) + private: + inline void set_has_message_set_wire_format(); + inline void clear_has_message_set_wire_format(); + inline void set_has_no_standard_descriptor_accessor(); + inline void clear_has_no_standard_descriptor_accessor(); + inline void set_has_deprecated(); + inline void clear_has_deprecated(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + bool message_set_wire_format_; + bool no_standard_descriptor_accessor_; + bool deprecated_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static MessageOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT FieldOptions : public ::google::protobuf::Message { + public: + FieldOptions(); + virtual ~FieldOptions(); + + FieldOptions(const FieldOptions& from); + + inline FieldOptions& operator=(const FieldOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FieldOptions& default_instance(); + + void Swap(FieldOptions* other); + + // implements Message ---------------------------------------------- + + FieldOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FieldOptions& from); + void MergeFrom(const FieldOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef FieldOptions_CType CType; + static const CType STRING = FieldOptions_CType_STRING; + static const CType CORD = FieldOptions_CType_CORD; + static const CType STRING_PIECE = FieldOptions_CType_STRING_PIECE; + static inline bool CType_IsValid(int value) { + return FieldOptions_CType_IsValid(value); + } + static const CType CType_MIN = + FieldOptions_CType_CType_MIN; + static const CType CType_MAX = + FieldOptions_CType_CType_MAX; + static const int CType_ARRAYSIZE = + FieldOptions_CType_CType_ARRAYSIZE; + static inline const ::google::protobuf::EnumDescriptor* + CType_descriptor() { + return FieldOptions_CType_descriptor(); + } + static inline const ::std::string& CType_Name(CType value) { + return FieldOptions_CType_Name(value); + } + static inline bool CType_Parse(const ::std::string& name, + CType* value) { + return FieldOptions_CType_Parse(name, value); + } + + // accessors ------------------------------------------------------- + + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + inline bool has_ctype() const; + inline void clear_ctype(); + static const int kCtypeFieldNumber = 1; + inline ::google::protobuf::FieldOptions_CType ctype() const; + inline void set_ctype(::google::protobuf::FieldOptions_CType value); + + // optional bool packed = 2; + inline bool has_packed() const; + inline void clear_packed(); + static const int kPackedFieldNumber = 2; + inline bool packed() const; + inline void set_packed(bool value); + + // optional bool lazy = 5 [default = false]; + inline bool has_lazy() const; + inline void clear_lazy(); + static const int kLazyFieldNumber = 5; + inline bool lazy() const; + inline void set_lazy(bool value); + + // optional bool deprecated = 3 [default = false]; + inline bool has_deprecated() const; + inline void clear_deprecated(); + static const int kDeprecatedFieldNumber = 3; + inline bool deprecated() const; + inline void set_deprecated(bool value); + + // optional string experimental_map_key = 9; + inline bool has_experimental_map_key() const; + inline void clear_experimental_map_key(); + static const int kExperimentalMapKeyFieldNumber = 9; + inline const ::std::string& experimental_map_key() const; + inline void set_experimental_map_key(const ::std::string& value); + inline void set_experimental_map_key(const char* value); + inline void set_experimental_map_key(const char* value, size_t size); + inline ::std::string* mutable_experimental_map_key(); + inline ::std::string* release_experimental_map_key(); + inline void set_allocated_experimental_map_key(::std::string* experimental_map_key); + + // optional bool weak = 10 [default = false]; + inline bool has_weak() const; + inline void clear_weak(); + static const int kWeakFieldNumber = 10; + inline bool weak() const; + inline void set_weak(bool value); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FieldOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.FieldOptions) + private: + inline void set_has_ctype(); + inline void clear_has_ctype(); + inline void set_has_packed(); + inline void clear_has_packed(); + inline void set_has_lazy(); + inline void clear_has_lazy(); + inline void set_has_deprecated(); + inline void clear_has_deprecated(); + inline void set_has_experimental_map_key(); + inline void clear_has_experimental_map_key(); + inline void set_has_weak(); + inline void clear_has_weak(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + int ctype_; + bool packed_; + bool lazy_; + bool deprecated_; + bool weak_; + ::std::string* experimental_map_key_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FieldOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT EnumOptions : public ::google::protobuf::Message { + public: + EnumOptions(); + virtual ~EnumOptions(); + + EnumOptions(const EnumOptions& from); + + inline EnumOptions& operator=(const EnumOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const EnumOptions& default_instance(); + + void Swap(EnumOptions* other); + + // implements Message ---------------------------------------------- + + EnumOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const EnumOptions& from); + void MergeFrom(const EnumOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bool allow_alias = 2; + inline bool has_allow_alias() const; + inline void clear_allow_alias(); + static const int kAllowAliasFieldNumber = 2; + inline bool allow_alias() const; + inline void set_allow_alias(bool value); + + // optional bool deprecated = 3 [default = false]; + inline bool has_deprecated() const; + inline void clear_deprecated(); + static const int kDeprecatedFieldNumber = 3; + inline bool deprecated() const; + inline void set_deprecated(bool value); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.EnumOptions) + private: + inline void set_has_allow_alias(); + inline void clear_has_allow_alias(); + inline void set_has_deprecated(); + inline void clear_has_deprecated(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + bool allow_alias_; + bool deprecated_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static EnumOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT EnumValueOptions : public ::google::protobuf::Message { + public: + EnumValueOptions(); + virtual ~EnumValueOptions(); + + EnumValueOptions(const EnumValueOptions& from); + + inline EnumValueOptions& operator=(const EnumValueOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const EnumValueOptions& default_instance(); + + void Swap(EnumValueOptions* other); + + // implements Message ---------------------------------------------- + + EnumValueOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const EnumValueOptions& from); + void MergeFrom(const EnumValueOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bool deprecated = 1 [default = false]; + inline bool has_deprecated() const; + inline void clear_deprecated(); + static const int kDeprecatedFieldNumber = 1; + inline bool deprecated() const; + inline void set_deprecated(bool value); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumValueOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueOptions) + private: + inline void set_has_deprecated(); + inline void clear_has_deprecated(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + bool deprecated_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static EnumValueOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT ServiceOptions : public ::google::protobuf::Message { + public: + ServiceOptions(); + virtual ~ServiceOptions(); + + ServiceOptions(const ServiceOptions& from); + + inline ServiceOptions& operator=(const ServiceOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const ServiceOptions& default_instance(); + + void Swap(ServiceOptions* other); + + // implements Message ---------------------------------------------- + + ServiceOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const ServiceOptions& from); + void MergeFrom(const ServiceOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bool deprecated = 33 [default = false]; + inline bool has_deprecated() const; + inline void clear_deprecated(); + static const int kDeprecatedFieldNumber = 33; + inline bool deprecated() const; + inline void set_deprecated(bool value); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(ServiceOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.ServiceOptions) + private: + inline void set_has_deprecated(); + inline void clear_has_deprecated(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + bool deprecated_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static ServiceOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT MethodOptions : public ::google::protobuf::Message { + public: + MethodOptions(); + virtual ~MethodOptions(); + + MethodOptions(const MethodOptions& from); + + inline MethodOptions& operator=(const MethodOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MethodOptions& default_instance(); + + void Swap(MethodOptions* other); + + // implements Message ---------------------------------------------- + + MethodOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MethodOptions& from); + void MergeFrom(const MethodOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bool deprecated = 33 [default = false]; + inline bool has_deprecated() const; + inline void clear_deprecated(); + static const int kDeprecatedFieldNumber = 33; + inline bool deprecated() const; + inline void set_deprecated(bool value); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MethodOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.MethodOptions) + private: + inline void set_has_deprecated(); + inline void clear_has_deprecated(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + bool deprecated_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static MethodOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT UninterpretedOption_NamePart : public ::google::protobuf::Message { + public: + UninterpretedOption_NamePart(); + virtual ~UninterpretedOption_NamePart(); + + UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from); + + inline UninterpretedOption_NamePart& operator=(const UninterpretedOption_NamePart& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const UninterpretedOption_NamePart& default_instance(); + + void Swap(UninterpretedOption_NamePart* other); + + // implements Message ---------------------------------------------- + + UninterpretedOption_NamePart* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const UninterpretedOption_NamePart& from); + void MergeFrom(const UninterpretedOption_NamePart& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // required string name_part = 1; + inline bool has_name_part() const; + inline void clear_name_part(); + static const int kNamePartFieldNumber = 1; + inline const ::std::string& name_part() const; + inline void set_name_part(const ::std::string& value); + inline void set_name_part(const char* value); + inline void set_name_part(const char* value, size_t size); + inline ::std::string* mutable_name_part(); + inline ::std::string* release_name_part(); + inline void set_allocated_name_part(::std::string* name_part); + + // required bool is_extension = 2; + inline bool has_is_extension() const; + inline void clear_is_extension(); + static const int kIsExtensionFieldNumber = 2; + inline bool is_extension() const; + inline void set_is_extension(bool value); + + // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption.NamePart) + private: + inline void set_has_name_part(); + inline void clear_has_name_part(); + inline void set_has_is_extension(); + inline void clear_has_is_extension(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::std::string* name_part_; + bool is_extension_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static UninterpretedOption_NamePart* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT UninterpretedOption : public ::google::protobuf::Message { + public: + UninterpretedOption(); + virtual ~UninterpretedOption(); + + UninterpretedOption(const UninterpretedOption& from); + + inline UninterpretedOption& operator=(const UninterpretedOption& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const UninterpretedOption& default_instance(); + + void Swap(UninterpretedOption* other); + + // implements Message ---------------------------------------------- + + UninterpretedOption* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const UninterpretedOption& from); + void MergeFrom(const UninterpretedOption& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef UninterpretedOption_NamePart NamePart; + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + inline int name_size() const; + inline void clear_name(); + static const int kNameFieldNumber = 2; + inline const ::google::protobuf::UninterpretedOption_NamePart& name(int index) const; + inline ::google::protobuf::UninterpretedOption_NamePart* mutable_name(int index); + inline ::google::protobuf::UninterpretedOption_NamePart* add_name(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >& + name() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >* + mutable_name(); + + // optional string identifier_value = 3; + inline bool has_identifier_value() const; + inline void clear_identifier_value(); + static const int kIdentifierValueFieldNumber = 3; + inline const ::std::string& identifier_value() const; + inline void set_identifier_value(const ::std::string& value); + inline void set_identifier_value(const char* value); + inline void set_identifier_value(const char* value, size_t size); + inline ::std::string* mutable_identifier_value(); + inline ::std::string* release_identifier_value(); + inline void set_allocated_identifier_value(::std::string* identifier_value); + + // optional uint64 positive_int_value = 4; + inline bool has_positive_int_value() const; + inline void clear_positive_int_value(); + static const int kPositiveIntValueFieldNumber = 4; + inline ::google::protobuf::uint64 positive_int_value() const; + inline void set_positive_int_value(::google::protobuf::uint64 value); + + // optional int64 negative_int_value = 5; + inline bool has_negative_int_value() const; + inline void clear_negative_int_value(); + static const int kNegativeIntValueFieldNumber = 5; + inline ::google::protobuf::int64 negative_int_value() const; + inline void set_negative_int_value(::google::protobuf::int64 value); + + // optional double double_value = 6; + inline bool has_double_value() const; + inline void clear_double_value(); + static const int kDoubleValueFieldNumber = 6; + inline double double_value() const; + inline void set_double_value(double value); + + // optional bytes string_value = 7; + inline bool has_string_value() const; + inline void clear_string_value(); + static const int kStringValueFieldNumber = 7; + inline const ::std::string& string_value() const; + inline void set_string_value(const ::std::string& value); + inline void set_string_value(const char* value); + inline void set_string_value(const void* value, size_t size); + inline ::std::string* mutable_string_value(); + inline ::std::string* release_string_value(); + inline void set_allocated_string_value(::std::string* string_value); + + // optional string aggregate_value = 8; + inline bool has_aggregate_value() const; + inline void clear_aggregate_value(); + static const int kAggregateValueFieldNumber = 8; + inline const ::std::string& aggregate_value() const; + inline void set_aggregate_value(const ::std::string& value); + inline void set_aggregate_value(const char* value); + inline void set_aggregate_value(const char* value, size_t size); + inline ::std::string* mutable_aggregate_value(); + inline ::std::string* release_aggregate_value(); + inline void set_allocated_aggregate_value(::std::string* aggregate_value); + + // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption) + private: + inline void set_has_identifier_value(); + inline void clear_has_identifier_value(); + inline void set_has_positive_int_value(); + inline void clear_has_positive_int_value(); + inline void set_has_negative_int_value(); + inline void clear_has_negative_int_value(); + inline void set_has_double_value(); + inline void clear_has_double_value(); + inline void set_has_string_value(); + inline void clear_has_string_value(); + inline void set_has_aggregate_value(); + inline void clear_has_aggregate_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart > name_; + ::std::string* identifier_value_; + ::google::protobuf::uint64 positive_int_value_; + ::google::protobuf::int64 negative_int_value_; + double double_value_; + ::std::string* string_value_; + ::std::string* aggregate_value_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static UninterpretedOption* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT SourceCodeInfo_Location : public ::google::protobuf::Message { + public: + SourceCodeInfo_Location(); + virtual ~SourceCodeInfo_Location(); + + SourceCodeInfo_Location(const SourceCodeInfo_Location& from); + + inline SourceCodeInfo_Location& operator=(const SourceCodeInfo_Location& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const SourceCodeInfo_Location& default_instance(); + + void Swap(SourceCodeInfo_Location* other); + + // implements Message ---------------------------------------------- + + SourceCodeInfo_Location* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const SourceCodeInfo_Location& from); + void MergeFrom(const SourceCodeInfo_Location& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated int32 path = 1 [packed = true]; + inline int path_size() const; + inline void clear_path(); + static const int kPathFieldNumber = 1; + inline ::google::protobuf::int32 path(int index) const; + inline void set_path(int index, ::google::protobuf::int32 value); + inline void add_path(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + path() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_path(); + + // repeated int32 span = 2 [packed = true]; + inline int span_size() const; + inline void clear_span(); + static const int kSpanFieldNumber = 2; + inline ::google::protobuf::int32 span(int index) const; + inline void set_span(int index, ::google::protobuf::int32 value); + inline void add_span(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + span() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_span(); + + // optional string leading_comments = 3; + inline bool has_leading_comments() const; + inline void clear_leading_comments(); + static const int kLeadingCommentsFieldNumber = 3; + inline const ::std::string& leading_comments() const; + inline void set_leading_comments(const ::std::string& value); + inline void set_leading_comments(const char* value); + inline void set_leading_comments(const char* value, size_t size); + inline ::std::string* mutable_leading_comments(); + inline ::std::string* release_leading_comments(); + inline void set_allocated_leading_comments(::std::string* leading_comments); + + // optional string trailing_comments = 4; + inline bool has_trailing_comments() const; + inline void clear_trailing_comments(); + static const int kTrailingCommentsFieldNumber = 4; + inline const ::std::string& trailing_comments() const; + inline void set_trailing_comments(const ::std::string& value); + inline void set_trailing_comments(const char* value); + inline void set_trailing_comments(const char* value, size_t size); + inline ::std::string* mutable_trailing_comments(); + inline ::std::string* release_trailing_comments(); + inline void set_allocated_trailing_comments(::std::string* trailing_comments); + + // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo.Location) + private: + inline void set_has_leading_comments(); + inline void clear_has_leading_comments(); + inline void set_has_trailing_comments(); + inline void clear_has_trailing_comments(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > path_; + mutable int _path_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > span_; + mutable int _span_cached_byte_size_; + ::std::string* leading_comments_; + ::std::string* trailing_comments_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static SourceCodeInfo_Location* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT SourceCodeInfo : public ::google::protobuf::Message { + public: + SourceCodeInfo(); + virtual ~SourceCodeInfo(); + + SourceCodeInfo(const SourceCodeInfo& from); + + inline SourceCodeInfo& operator=(const SourceCodeInfo& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const SourceCodeInfo& default_instance(); + + void Swap(SourceCodeInfo* other); + + // implements Message ---------------------------------------------- + + SourceCodeInfo* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const SourceCodeInfo& from); + void MergeFrom(const SourceCodeInfo& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef SourceCodeInfo_Location Location; + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + inline int location_size() const; + inline void clear_location(); + static const int kLocationFieldNumber = 1; + inline const ::google::protobuf::SourceCodeInfo_Location& location(int index) const; + inline ::google::protobuf::SourceCodeInfo_Location* mutable_location(int index); + inline ::google::protobuf::SourceCodeInfo_Location* add_location(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >& + location() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >* + mutable_location(); + + // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location > location_; + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static SourceCodeInfo* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// FileDescriptorSet + +// repeated .google.protobuf.FileDescriptorProto file = 1; +inline int FileDescriptorSet::file_size() const { + return file_.size(); +} +inline void FileDescriptorSet::clear_file() { + file_.Clear(); +} +inline const ::google::protobuf::FileDescriptorProto& FileDescriptorSet::file(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorSet.file) + return file_.Get(index); +} +inline ::google::protobuf::FileDescriptorProto* FileDescriptorSet::mutable_file(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorSet.file) + return file_.Mutable(index); +} +inline ::google::protobuf::FileDescriptorProto* FileDescriptorSet::add_file() { + // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorSet.file) + return file_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& +FileDescriptorSet::file() const { + // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorSet.file) + return file_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* +FileDescriptorSet::mutable_file() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorSet.file) + return &file_; +} + +// ------------------------------------------------------------------- + +// FileDescriptorProto + +// optional string name = 1; +inline bool FileDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void FileDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void FileDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void FileDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& FileDescriptorProto::name() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.name) + return *name_; +} +inline void FileDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.name) +} +inline void FileDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.name) +} +inline void FileDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.name) +} +inline ::std::string* FileDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.name) + return name_; +} +inline ::std::string* FileDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FileDescriptorProto::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.name) +} + +// optional string package = 2; +inline bool FileDescriptorProto::has_package() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void FileDescriptorProto::set_has_package() { + _has_bits_[0] |= 0x00000002u; +} +inline void FileDescriptorProto::clear_has_package() { + _has_bits_[0] &= ~0x00000002u; +} +inline void FileDescriptorProto::clear_package() { + if (package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + package_->clear(); + } + clear_has_package(); +} +inline const ::std::string& FileDescriptorProto::package() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.package) + return *package_; +} +inline void FileDescriptorProto::set_package(const ::std::string& value) { + set_has_package(); + if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + package_ = new ::std::string; + } + package_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.package) +} +inline void FileDescriptorProto::set_package(const char* value) { + set_has_package(); + if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + package_ = new ::std::string; + } + package_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.package) +} +inline void FileDescriptorProto::set_package(const char* value, size_t size) { + set_has_package(); + if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + package_ = new ::std::string; + } + package_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.package) +} +inline ::std::string* FileDescriptorProto::mutable_package() { + set_has_package(); + if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + package_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.package) + return package_; +} +inline ::std::string* FileDescriptorProto::release_package() { + clear_has_package(); + if (package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = package_; + package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FileDescriptorProto::set_allocated_package(::std::string* package) { + if (package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete package_; + } + if (package) { + set_has_package(); + package_ = package; + } else { + clear_has_package(); + package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.package) +} + +// repeated string dependency = 3; +inline int FileDescriptorProto::dependency_size() const { + return dependency_.size(); +} +inline void FileDescriptorProto::clear_dependency() { + dependency_.Clear(); +} +inline const ::std::string& FileDescriptorProto::dependency(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.dependency) + return dependency_.Get(index); +} +inline ::std::string* FileDescriptorProto::mutable_dependency(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.dependency) + return dependency_.Mutable(index); +} +inline void FileDescriptorProto::set_dependency(int index, const ::std::string& value) { + // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.dependency) + dependency_.Mutable(index)->assign(value); +} +inline void FileDescriptorProto::set_dependency(int index, const char* value) { + dependency_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.dependency) +} +inline void FileDescriptorProto::set_dependency(int index, const char* value, size_t size) { + dependency_.Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.dependency) +} +inline ::std::string* FileDescriptorProto::add_dependency() { + return dependency_.Add(); +} +inline void FileDescriptorProto::add_dependency(const ::std::string& value) { + dependency_.Add()->assign(value); + // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.dependency) +} +inline void FileDescriptorProto::add_dependency(const char* value) { + dependency_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:google.protobuf.FileDescriptorProto.dependency) +} +inline void FileDescriptorProto::add_dependency(const char* value, size_t size) { + dependency_.Add()->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:google.protobuf.FileDescriptorProto.dependency) +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +FileDescriptorProto::dependency() const { + // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.dependency) + return dependency_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +FileDescriptorProto::mutable_dependency() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.dependency) + return &dependency_; +} + +// repeated int32 public_dependency = 10; +inline int FileDescriptorProto::public_dependency_size() const { + return public_dependency_.size(); +} +inline void FileDescriptorProto::clear_public_dependency() { + public_dependency_.Clear(); +} +inline ::google::protobuf::int32 FileDescriptorProto::public_dependency(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.public_dependency) + return public_dependency_.Get(index); +} +inline void FileDescriptorProto::set_public_dependency(int index, ::google::protobuf::int32 value) { + public_dependency_.Set(index, value); + // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.public_dependency) +} +inline void FileDescriptorProto::add_public_dependency(::google::protobuf::int32 value) { + public_dependency_.Add(value); + // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.public_dependency) +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +FileDescriptorProto::public_dependency() const { + // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.public_dependency) + return public_dependency_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +FileDescriptorProto::mutable_public_dependency() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.public_dependency) + return &public_dependency_; +} + +// repeated int32 weak_dependency = 11; +inline int FileDescriptorProto::weak_dependency_size() const { + return weak_dependency_.size(); +} +inline void FileDescriptorProto::clear_weak_dependency() { + weak_dependency_.Clear(); +} +inline ::google::protobuf::int32 FileDescriptorProto::weak_dependency(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.weak_dependency) + return weak_dependency_.Get(index); +} +inline void FileDescriptorProto::set_weak_dependency(int index, ::google::protobuf::int32 value) { + weak_dependency_.Set(index, value); + // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.weak_dependency) +} +inline void FileDescriptorProto::add_weak_dependency(::google::protobuf::int32 value) { + weak_dependency_.Add(value); + // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.weak_dependency) +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +FileDescriptorProto::weak_dependency() const { + // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.weak_dependency) + return weak_dependency_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +FileDescriptorProto::mutable_weak_dependency() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.weak_dependency) + return &weak_dependency_; +} + +// repeated .google.protobuf.DescriptorProto message_type = 4; +inline int FileDescriptorProto::message_type_size() const { + return message_type_.size(); +} +inline void FileDescriptorProto::clear_message_type() { + message_type_.Clear(); +} +inline const ::google::protobuf::DescriptorProto& FileDescriptorProto::message_type(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.message_type) + return message_type_.Get(index); +} +inline ::google::protobuf::DescriptorProto* FileDescriptorProto::mutable_message_type(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.message_type) + return message_type_.Mutable(index); +} +inline ::google::protobuf::DescriptorProto* FileDescriptorProto::add_message_type() { + // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.message_type) + return message_type_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& +FileDescriptorProto::message_type() const { + // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.message_type) + return message_type_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* +FileDescriptorProto::mutable_message_type() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.message_type) + return &message_type_; +} + +// repeated .google.protobuf.EnumDescriptorProto enum_type = 5; +inline int FileDescriptorProto::enum_type_size() const { + return enum_type_.size(); +} +inline void FileDescriptorProto::clear_enum_type() { + enum_type_.Clear(); +} +inline const ::google::protobuf::EnumDescriptorProto& FileDescriptorProto::enum_type(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.enum_type) + return enum_type_.Get(index); +} +inline ::google::protobuf::EnumDescriptorProto* FileDescriptorProto::mutable_enum_type(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.enum_type) + return enum_type_.Mutable(index); +} +inline ::google::protobuf::EnumDescriptorProto* FileDescriptorProto::add_enum_type() { + // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.enum_type) + return enum_type_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& +FileDescriptorProto::enum_type() const { + // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.enum_type) + return enum_type_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* +FileDescriptorProto::mutable_enum_type() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.enum_type) + return &enum_type_; +} + +// repeated .google.protobuf.ServiceDescriptorProto service = 6; +inline int FileDescriptorProto::service_size() const { + return service_.size(); +} +inline void FileDescriptorProto::clear_service() { + service_.Clear(); +} +inline const ::google::protobuf::ServiceDescriptorProto& FileDescriptorProto::service(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.service) + return service_.Get(index); +} +inline ::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::mutable_service(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.service) + return service_.Mutable(index); +} +inline ::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::add_service() { + // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.service) + return service_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >& +FileDescriptorProto::service() const { + // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.service) + return service_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >* +FileDescriptorProto::mutable_service() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.service) + return &service_; +} + +// repeated .google.protobuf.FieldDescriptorProto extension = 7; +inline int FileDescriptorProto::extension_size() const { + return extension_.size(); +} +inline void FileDescriptorProto::clear_extension() { + extension_.Clear(); +} +inline const ::google::protobuf::FieldDescriptorProto& FileDescriptorProto::extension(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.extension) + return extension_.Get(index); +} +inline ::google::protobuf::FieldDescriptorProto* FileDescriptorProto::mutable_extension(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.extension) + return extension_.Mutable(index); +} +inline ::google::protobuf::FieldDescriptorProto* FileDescriptorProto::add_extension() { + // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.extension) + return extension_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& +FileDescriptorProto::extension() const { + // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.extension) + return extension_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* +FileDescriptorProto::mutable_extension() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.extension) + return &extension_; +} + +// optional .google.protobuf.FileOptions options = 8; +inline bool FileDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000200u) != 0; +} +inline void FileDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000200u; +} +inline void FileDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000200u; +} +inline void FileDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::FileOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::FileOptions& FileDescriptorProto::options() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.options) + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::FileOptions* FileDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::FileOptions; + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.options) + return options_; +} +inline ::google::protobuf::FileOptions* FileDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::FileOptions* temp = options_; + options_ = NULL; + return temp; +} +inline void FileDescriptorProto::set_allocated_options(::google::protobuf::FileOptions* options) { + delete options_; + options_ = options; + if (options) { + set_has_options(); + } else { + clear_has_options(); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.options) +} + +// optional .google.protobuf.SourceCodeInfo source_code_info = 9; +inline bool FileDescriptorProto::has_source_code_info() const { + return (_has_bits_[0] & 0x00000400u) != 0; +} +inline void FileDescriptorProto::set_has_source_code_info() { + _has_bits_[0] |= 0x00000400u; +} +inline void FileDescriptorProto::clear_has_source_code_info() { + _has_bits_[0] &= ~0x00000400u; +} +inline void FileDescriptorProto::clear_source_code_info() { + if (source_code_info_ != NULL) source_code_info_->::google::protobuf::SourceCodeInfo::Clear(); + clear_has_source_code_info(); +} +inline const ::google::protobuf::SourceCodeInfo& FileDescriptorProto::source_code_info() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.source_code_info) + return source_code_info_ != NULL ? *source_code_info_ : *default_instance_->source_code_info_; +} +inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::mutable_source_code_info() { + set_has_source_code_info(); + if (source_code_info_ == NULL) source_code_info_ = new ::google::protobuf::SourceCodeInfo; + // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.source_code_info) + return source_code_info_; +} +inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::release_source_code_info() { + clear_has_source_code_info(); + ::google::protobuf::SourceCodeInfo* temp = source_code_info_; + source_code_info_ = NULL; + return temp; +} +inline void FileDescriptorProto::set_allocated_source_code_info(::google::protobuf::SourceCodeInfo* source_code_info) { + delete source_code_info_; + source_code_info_ = source_code_info; + if (source_code_info) { + set_has_source_code_info(); + } else { + clear_has_source_code_info(); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.source_code_info) +} + +// ------------------------------------------------------------------- + +// DescriptorProto_ExtensionRange + +// optional int32 start = 1; +inline bool DescriptorProto_ExtensionRange::has_start() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void DescriptorProto_ExtensionRange::set_has_start() { + _has_bits_[0] |= 0x00000001u; +} +inline void DescriptorProto_ExtensionRange::clear_has_start() { + _has_bits_[0] &= ~0x00000001u; +} +inline void DescriptorProto_ExtensionRange::clear_start() { + start_ = 0; + clear_has_start(); +} +inline ::google::protobuf::int32 DescriptorProto_ExtensionRange::start() const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ExtensionRange.start) + return start_; +} +inline void DescriptorProto_ExtensionRange::set_start(::google::protobuf::int32 value) { + set_has_start(); + start_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ExtensionRange.start) +} + +// optional int32 end = 2; +inline bool DescriptorProto_ExtensionRange::has_end() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void DescriptorProto_ExtensionRange::set_has_end() { + _has_bits_[0] |= 0x00000002u; +} +inline void DescriptorProto_ExtensionRange::clear_has_end() { + _has_bits_[0] &= ~0x00000002u; +} +inline void DescriptorProto_ExtensionRange::clear_end() { + end_ = 0; + clear_has_end(); +} +inline ::google::protobuf::int32 DescriptorProto_ExtensionRange::end() const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ExtensionRange.end) + return end_; +} +inline void DescriptorProto_ExtensionRange::set_end(::google::protobuf::int32 value) { + set_has_end(); + end_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ExtensionRange.end) +} + +// ------------------------------------------------------------------- + +// DescriptorProto + +// optional string name = 1; +inline bool DescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void DescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void DescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void DescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& DescriptorProto::name() const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.name) + return *name_; +} +inline void DescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.name) +} +inline void DescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.DescriptorProto.name) +} +inline void DescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.DescriptorProto.name) +} +inline ::std::string* DescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.name) + return name_; +} +inline ::std::string* DescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void DescriptorProto::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.name) +} + +// repeated .google.protobuf.FieldDescriptorProto field = 2; +inline int DescriptorProto::field_size() const { + return field_.size(); +} +inline void DescriptorProto::clear_field() { + field_.Clear(); +} +inline const ::google::protobuf::FieldDescriptorProto& DescriptorProto::field(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.field) + return field_.Get(index); +} +inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_field(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.field) + return field_.Mutable(index); +} +inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::add_field() { + // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.field) + return field_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& +DescriptorProto::field() const { + // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.field) + return field_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* +DescriptorProto::mutable_field() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.field) + return &field_; +} + +// repeated .google.protobuf.FieldDescriptorProto extension = 6; +inline int DescriptorProto::extension_size() const { + return extension_.size(); +} +inline void DescriptorProto::clear_extension() { + extension_.Clear(); +} +inline const ::google::protobuf::FieldDescriptorProto& DescriptorProto::extension(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.extension) + return extension_.Get(index); +} +inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_extension(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.extension) + return extension_.Mutable(index); +} +inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::add_extension() { + // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.extension) + return extension_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& +DescriptorProto::extension() const { + // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.extension) + return extension_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* +DescriptorProto::mutable_extension() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.extension) + return &extension_; +} + +// repeated .google.protobuf.DescriptorProto nested_type = 3; +inline int DescriptorProto::nested_type_size() const { + return nested_type_.size(); +} +inline void DescriptorProto::clear_nested_type() { + nested_type_.Clear(); +} +inline const ::google::protobuf::DescriptorProto& DescriptorProto::nested_type(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.nested_type) + return nested_type_.Get(index); +} +inline ::google::protobuf::DescriptorProto* DescriptorProto::mutable_nested_type(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.nested_type) + return nested_type_.Mutable(index); +} +inline ::google::protobuf::DescriptorProto* DescriptorProto::add_nested_type() { + // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.nested_type) + return nested_type_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& +DescriptorProto::nested_type() const { + // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.nested_type) + return nested_type_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* +DescriptorProto::mutable_nested_type() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.nested_type) + return &nested_type_; +} + +// repeated .google.protobuf.EnumDescriptorProto enum_type = 4; +inline int DescriptorProto::enum_type_size() const { + return enum_type_.size(); +} +inline void DescriptorProto::clear_enum_type() { + enum_type_.Clear(); +} +inline const ::google::protobuf::EnumDescriptorProto& DescriptorProto::enum_type(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.enum_type) + return enum_type_.Get(index); +} +inline ::google::protobuf::EnumDescriptorProto* DescriptorProto::mutable_enum_type(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.enum_type) + return enum_type_.Mutable(index); +} +inline ::google::protobuf::EnumDescriptorProto* DescriptorProto::add_enum_type() { + // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.enum_type) + return enum_type_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& +DescriptorProto::enum_type() const { + // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.enum_type) + return enum_type_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* +DescriptorProto::mutable_enum_type() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.enum_type) + return &enum_type_; +} + +// repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; +inline int DescriptorProto::extension_range_size() const { + return extension_range_.size(); +} +inline void DescriptorProto::clear_extension_range() { + extension_range_.Clear(); +} +inline const ::google::protobuf::DescriptorProto_ExtensionRange& DescriptorProto::extension_range(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.extension_range) + return extension_range_.Get(index); +} +inline ::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::mutable_extension_range(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.extension_range) + return extension_range_.Mutable(index); +} +inline ::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::add_extension_range() { + // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.extension_range) + return extension_range_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >& +DescriptorProto::extension_range() const { + // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.extension_range) + return extension_range_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >* +DescriptorProto::mutable_extension_range() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.extension_range) + return &extension_range_; +} + +// repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; +inline int DescriptorProto::oneof_decl_size() const { + return oneof_decl_.size(); +} +inline void DescriptorProto::clear_oneof_decl() { + oneof_decl_.Clear(); +} +inline const ::google::protobuf::OneofDescriptorProto& DescriptorProto::oneof_decl(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.oneof_decl) + return oneof_decl_.Get(index); +} +inline ::google::protobuf::OneofDescriptorProto* DescriptorProto::mutable_oneof_decl(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.oneof_decl) + return oneof_decl_.Mutable(index); +} +inline ::google::protobuf::OneofDescriptorProto* DescriptorProto::add_oneof_decl() { + // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.oneof_decl) + return oneof_decl_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >& +DescriptorProto::oneof_decl() const { + // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.oneof_decl) + return oneof_decl_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >* +DescriptorProto::mutable_oneof_decl() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.oneof_decl) + return &oneof_decl_; +} + +// optional .google.protobuf.MessageOptions options = 7; +inline bool DescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void DescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000080u; +} +inline void DescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000080u; +} +inline void DescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::MessageOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::MessageOptions& DescriptorProto::options() const { + // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.options) + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::MessageOptions* DescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::MessageOptions; + // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.options) + return options_; +} +inline ::google::protobuf::MessageOptions* DescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::MessageOptions* temp = options_; + options_ = NULL; + return temp; +} +inline void DescriptorProto::set_allocated_options(::google::protobuf::MessageOptions* options) { + delete options_; + options_ = options; + if (options) { + set_has_options(); + } else { + clear_has_options(); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.options) +} + +// ------------------------------------------------------------------- + +// FieldDescriptorProto + +// optional string name = 1; +inline bool FieldDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void FieldDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void FieldDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void FieldDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& FieldDescriptorProto::name() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.name) + return *name_; +} +inline void FieldDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.name) +} +inline void FieldDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.name) +} +inline void FieldDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.name) +} +inline ::std::string* FieldDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.name) + return name_; +} +inline ::std::string* FieldDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FieldDescriptorProto::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.name) +} + +// optional int32 number = 3; +inline bool FieldDescriptorProto::has_number() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void FieldDescriptorProto::set_has_number() { + _has_bits_[0] |= 0x00000002u; +} +inline void FieldDescriptorProto::clear_has_number() { + _has_bits_[0] &= ~0x00000002u; +} +inline void FieldDescriptorProto::clear_number() { + number_ = 0; + clear_has_number(); +} +inline ::google::protobuf::int32 FieldDescriptorProto::number() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.number) + return number_; +} +inline void FieldDescriptorProto::set_number(::google::protobuf::int32 value) { + set_has_number(); + number_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.number) +} + +// optional .google.protobuf.FieldDescriptorProto.Label label = 4; +inline bool FieldDescriptorProto::has_label() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void FieldDescriptorProto::set_has_label() { + _has_bits_[0] |= 0x00000004u; +} +inline void FieldDescriptorProto::clear_has_label() { + _has_bits_[0] &= ~0x00000004u; +} +inline void FieldDescriptorProto::clear_label() { + label_ = 1; + clear_has_label(); +} +inline ::google::protobuf::FieldDescriptorProto_Label FieldDescriptorProto::label() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.label) + return static_cast< ::google::protobuf::FieldDescriptorProto_Label >(label_); +} +inline void FieldDescriptorProto::set_label(::google::protobuf::FieldDescriptorProto_Label value) { + assert(::google::protobuf::FieldDescriptorProto_Label_IsValid(value)); + set_has_label(); + label_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.label) +} + +// optional .google.protobuf.FieldDescriptorProto.Type type = 5; +inline bool FieldDescriptorProto::has_type() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void FieldDescriptorProto::set_has_type() { + _has_bits_[0] |= 0x00000008u; +} +inline void FieldDescriptorProto::clear_has_type() { + _has_bits_[0] &= ~0x00000008u; +} +inline void FieldDescriptorProto::clear_type() { + type_ = 1; + clear_has_type(); +} +inline ::google::protobuf::FieldDescriptorProto_Type FieldDescriptorProto::type() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.type) + return static_cast< ::google::protobuf::FieldDescriptorProto_Type >(type_); +} +inline void FieldDescriptorProto::set_type(::google::protobuf::FieldDescriptorProto_Type value) { + assert(::google::protobuf::FieldDescriptorProto_Type_IsValid(value)); + set_has_type(); + type_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.type) +} + +// optional string type_name = 6; +inline bool FieldDescriptorProto::has_type_name() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void FieldDescriptorProto::set_has_type_name() { + _has_bits_[0] |= 0x00000010u; +} +inline void FieldDescriptorProto::clear_has_type_name() { + _has_bits_[0] &= ~0x00000010u; +} +inline void FieldDescriptorProto::clear_type_name() { + if (type_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + type_name_->clear(); + } + clear_has_type_name(); +} +inline const ::std::string& FieldDescriptorProto::type_name() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.type_name) + return *type_name_; +} +inline void FieldDescriptorProto::set_type_name(const ::std::string& value) { + set_has_type_name(); + if (type_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + type_name_ = new ::std::string; + } + type_name_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.type_name) +} +inline void FieldDescriptorProto::set_type_name(const char* value) { + set_has_type_name(); + if (type_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + type_name_ = new ::std::string; + } + type_name_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.type_name) +} +inline void FieldDescriptorProto::set_type_name(const char* value, size_t size) { + set_has_type_name(); + if (type_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + type_name_ = new ::std::string; + } + type_name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.type_name) +} +inline ::std::string* FieldDescriptorProto::mutable_type_name() { + set_has_type_name(); + if (type_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + type_name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.type_name) + return type_name_; +} +inline ::std::string* FieldDescriptorProto::release_type_name() { + clear_has_type_name(); + if (type_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = type_name_; + type_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FieldDescriptorProto::set_allocated_type_name(::std::string* type_name) { + if (type_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete type_name_; + } + if (type_name) { + set_has_type_name(); + type_name_ = type_name; + } else { + clear_has_type_name(); + type_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.type_name) +} + +// optional string extendee = 2; +inline bool FieldDescriptorProto::has_extendee() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void FieldDescriptorProto::set_has_extendee() { + _has_bits_[0] |= 0x00000020u; +} +inline void FieldDescriptorProto::clear_has_extendee() { + _has_bits_[0] &= ~0x00000020u; +} +inline void FieldDescriptorProto::clear_extendee() { + if (extendee_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + extendee_->clear(); + } + clear_has_extendee(); +} +inline const ::std::string& FieldDescriptorProto::extendee() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.extendee) + return *extendee_; +} +inline void FieldDescriptorProto::set_extendee(const ::std::string& value) { + set_has_extendee(); + if (extendee_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + extendee_ = new ::std::string; + } + extendee_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.extendee) +} +inline void FieldDescriptorProto::set_extendee(const char* value) { + set_has_extendee(); + if (extendee_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + extendee_ = new ::std::string; + } + extendee_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.extendee) +} +inline void FieldDescriptorProto::set_extendee(const char* value, size_t size) { + set_has_extendee(); + if (extendee_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + extendee_ = new ::std::string; + } + extendee_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.extendee) +} +inline ::std::string* FieldDescriptorProto::mutable_extendee() { + set_has_extendee(); + if (extendee_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + extendee_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.extendee) + return extendee_; +} +inline ::std::string* FieldDescriptorProto::release_extendee() { + clear_has_extendee(); + if (extendee_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = extendee_; + extendee_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FieldDescriptorProto::set_allocated_extendee(::std::string* extendee) { + if (extendee_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete extendee_; + } + if (extendee) { + set_has_extendee(); + extendee_ = extendee; + } else { + clear_has_extendee(); + extendee_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.extendee) +} + +// optional string default_value = 7; +inline bool FieldDescriptorProto::has_default_value() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void FieldDescriptorProto::set_has_default_value() { + _has_bits_[0] |= 0x00000040u; +} +inline void FieldDescriptorProto::clear_has_default_value() { + _has_bits_[0] &= ~0x00000040u; +} +inline void FieldDescriptorProto::clear_default_value() { + if (default_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + default_value_->clear(); + } + clear_has_default_value(); +} +inline const ::std::string& FieldDescriptorProto::default_value() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.default_value) + return *default_value_; +} +inline void FieldDescriptorProto::set_default_value(const ::std::string& value) { + set_has_default_value(); + if (default_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + default_value_ = new ::std::string; + } + default_value_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.default_value) +} +inline void FieldDescriptorProto::set_default_value(const char* value) { + set_has_default_value(); + if (default_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + default_value_ = new ::std::string; + } + default_value_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.default_value) +} +inline void FieldDescriptorProto::set_default_value(const char* value, size_t size) { + set_has_default_value(); + if (default_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + default_value_ = new ::std::string; + } + default_value_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.default_value) +} +inline ::std::string* FieldDescriptorProto::mutable_default_value() { + set_has_default_value(); + if (default_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + default_value_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.default_value) + return default_value_; +} +inline ::std::string* FieldDescriptorProto::release_default_value() { + clear_has_default_value(); + if (default_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = default_value_; + default_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FieldDescriptorProto::set_allocated_default_value(::std::string* default_value) { + if (default_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete default_value_; + } + if (default_value) { + set_has_default_value(); + default_value_ = default_value; + } else { + clear_has_default_value(); + default_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.default_value) +} + +// optional int32 oneof_index = 9; +inline bool FieldDescriptorProto::has_oneof_index() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void FieldDescriptorProto::set_has_oneof_index() { + _has_bits_[0] |= 0x00000080u; +} +inline void FieldDescriptorProto::clear_has_oneof_index() { + _has_bits_[0] &= ~0x00000080u; +} +inline void FieldDescriptorProto::clear_oneof_index() { + oneof_index_ = 0; + clear_has_oneof_index(); +} +inline ::google::protobuf::int32 FieldDescriptorProto::oneof_index() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.oneof_index) + return oneof_index_; +} +inline void FieldDescriptorProto::set_oneof_index(::google::protobuf::int32 value) { + set_has_oneof_index(); + oneof_index_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.oneof_index) +} + +// optional .google.protobuf.FieldOptions options = 8; +inline bool FieldDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000100u) != 0; +} +inline void FieldDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000100u; +} +inline void FieldDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000100u; +} +inline void FieldDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::FieldOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::FieldOptions& FieldDescriptorProto::options() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.options) + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::FieldOptions* FieldDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::FieldOptions; + // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.options) + return options_; +} +inline ::google::protobuf::FieldOptions* FieldDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::FieldOptions* temp = options_; + options_ = NULL; + return temp; +} +inline void FieldDescriptorProto::set_allocated_options(::google::protobuf::FieldOptions* options) { + delete options_; + options_ = options; + if (options) { + set_has_options(); + } else { + clear_has_options(); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.options) +} + +// ------------------------------------------------------------------- + +// OneofDescriptorProto + +// optional string name = 1; +inline bool OneofDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void OneofDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void OneofDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void OneofDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& OneofDescriptorProto::name() const { + // @@protoc_insertion_point(field_get:google.protobuf.OneofDescriptorProto.name) + return *name_; +} +inline void OneofDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.OneofDescriptorProto.name) +} +inline void OneofDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.OneofDescriptorProto.name) +} +inline void OneofDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.OneofDescriptorProto.name) +} +inline ::std::string* OneofDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.OneofDescriptorProto.name) + return name_; +} +inline ::std::string* OneofDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void OneofDescriptorProto::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.OneofDescriptorProto.name) +} + +// ------------------------------------------------------------------- + +// EnumDescriptorProto + +// optional string name = 1; +inline bool EnumDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void EnumDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void EnumDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void EnumDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& EnumDescriptorProto::name() const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.name) + return *name_; +} +inline void EnumDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.name) +} +inline void EnumDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.EnumDescriptorProto.name) +} +inline void EnumDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumDescriptorProto.name) +} +inline ::std::string* EnumDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.name) + return name_; +} +inline ::std::string* EnumDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void EnumDescriptorProto::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumDescriptorProto.name) +} + +// repeated .google.protobuf.EnumValueDescriptorProto value = 2; +inline int EnumDescriptorProto::value_size() const { + return value_.size(); +} +inline void EnumDescriptorProto::clear_value() { + value_.Clear(); +} +inline const ::google::protobuf::EnumValueDescriptorProto& EnumDescriptorProto::value(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.value) + return value_.Get(index); +} +inline ::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::mutable_value(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.value) + return value_.Mutable(index); +} +inline ::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::add_value() { + // @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.value) + return value_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >& +EnumDescriptorProto::value() const { + // @@protoc_insertion_point(field_list:google.protobuf.EnumDescriptorProto.value) + return value_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >* +EnumDescriptorProto::mutable_value() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumDescriptorProto.value) + return &value_; +} + +// optional .google.protobuf.EnumOptions options = 3; +inline bool EnumDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void EnumDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000004u; +} +inline void EnumDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000004u; +} +inline void EnumDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::EnumOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::EnumOptions& EnumDescriptorProto::options() const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.options) + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::EnumOptions* EnumDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::EnumOptions; + // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.options) + return options_; +} +inline ::google::protobuf::EnumOptions* EnumDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::EnumOptions* temp = options_; + options_ = NULL; + return temp; +} +inline void EnumDescriptorProto::set_allocated_options(::google::protobuf::EnumOptions* options) { + delete options_; + options_ = options; + if (options) { + set_has_options(); + } else { + clear_has_options(); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumDescriptorProto.options) +} + +// ------------------------------------------------------------------- + +// EnumValueDescriptorProto + +// optional string name = 1; +inline bool EnumValueDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void EnumValueDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void EnumValueDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void EnumValueDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& EnumValueDescriptorProto::name() const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.name) + return *name_; +} +inline void EnumValueDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.EnumValueDescriptorProto.name) +} +inline void EnumValueDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.EnumValueDescriptorProto.name) +} +inline void EnumValueDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumValueDescriptorProto.name) +} +inline ::std::string* EnumValueDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueDescriptorProto.name) + return name_; +} +inline ::std::string* EnumValueDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void EnumValueDescriptorProto::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValueDescriptorProto.name) +} + +// optional int32 number = 2; +inline bool EnumValueDescriptorProto::has_number() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void EnumValueDescriptorProto::set_has_number() { + _has_bits_[0] |= 0x00000002u; +} +inline void EnumValueDescriptorProto::clear_has_number() { + _has_bits_[0] &= ~0x00000002u; +} +inline void EnumValueDescriptorProto::clear_number() { + number_ = 0; + clear_has_number(); +} +inline ::google::protobuf::int32 EnumValueDescriptorProto::number() const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.number) + return number_; +} +inline void EnumValueDescriptorProto::set_number(::google::protobuf::int32 value) { + set_has_number(); + number_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.EnumValueDescriptorProto.number) +} + +// optional .google.protobuf.EnumValueOptions options = 3; +inline bool EnumValueDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void EnumValueDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000004u; +} +inline void EnumValueDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000004u; +} +inline void EnumValueDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::EnumValueOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::EnumValueOptions& EnumValueDescriptorProto::options() const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.options) + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::EnumValueOptions; + // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueDescriptorProto.options) + return options_; +} +inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::EnumValueOptions* temp = options_; + options_ = NULL; + return temp; +} +inline void EnumValueDescriptorProto::set_allocated_options(::google::protobuf::EnumValueOptions* options) { + delete options_; + options_ = options; + if (options) { + set_has_options(); + } else { + clear_has_options(); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValueDescriptorProto.options) +} + +// ------------------------------------------------------------------- + +// ServiceDescriptorProto + +// optional string name = 1; +inline bool ServiceDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ServiceDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void ServiceDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ServiceDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& ServiceDescriptorProto::name() const { + // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.name) + return *name_; +} +inline void ServiceDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.ServiceDescriptorProto.name) +} +inline void ServiceDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.ServiceDescriptorProto.name) +} +inline void ServiceDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.ServiceDescriptorProto.name) +} +inline ::std::string* ServiceDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.name) + return name_; +} +inline ::std::string* ServiceDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void ServiceDescriptorProto::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.ServiceDescriptorProto.name) +} + +// repeated .google.protobuf.MethodDescriptorProto method = 2; +inline int ServiceDescriptorProto::method_size() const { + return method_.size(); +} +inline void ServiceDescriptorProto::clear_method() { + method_.Clear(); +} +inline const ::google::protobuf::MethodDescriptorProto& ServiceDescriptorProto::method(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.method) + return method_.Get(index); +} +inline ::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::mutable_method(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.method) + return method_.Mutable(index); +} +inline ::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::add_method() { + // @@protoc_insertion_point(field_add:google.protobuf.ServiceDescriptorProto.method) + return method_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >& +ServiceDescriptorProto::method() const { + // @@protoc_insertion_point(field_list:google.protobuf.ServiceDescriptorProto.method) + return method_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >* +ServiceDescriptorProto::mutable_method() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.ServiceDescriptorProto.method) + return &method_; +} + +// optional .google.protobuf.ServiceOptions options = 3; +inline bool ServiceDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ServiceDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000004u; +} +inline void ServiceDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ServiceDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::ServiceOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::ServiceOptions& ServiceDescriptorProto::options() const { + // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.options) + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::ServiceOptions; + // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.options) + return options_; +} +inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::ServiceOptions* temp = options_; + options_ = NULL; + return temp; +} +inline void ServiceDescriptorProto::set_allocated_options(::google::protobuf::ServiceOptions* options) { + delete options_; + options_ = options; + if (options) { + set_has_options(); + } else { + clear_has_options(); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.ServiceDescriptorProto.options) +} + +// ------------------------------------------------------------------- + +// MethodDescriptorProto + +// optional string name = 1; +inline bool MethodDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void MethodDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void MethodDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void MethodDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& MethodDescriptorProto::name() const { + // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.name) + return *name_; +} +inline void MethodDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.name) +} +inline void MethodDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.name) +} +inline void MethodDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.name) +} +inline ::std::string* MethodDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.name) + return name_; +} +inline ::std::string* MethodDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void MethodDescriptorProto::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.name) +} + +// optional string input_type = 2; +inline bool MethodDescriptorProto::has_input_type() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void MethodDescriptorProto::set_has_input_type() { + _has_bits_[0] |= 0x00000002u; +} +inline void MethodDescriptorProto::clear_has_input_type() { + _has_bits_[0] &= ~0x00000002u; +} +inline void MethodDescriptorProto::clear_input_type() { + if (input_type_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + input_type_->clear(); + } + clear_has_input_type(); +} +inline const ::std::string& MethodDescriptorProto::input_type() const { + // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.input_type) + return *input_type_; +} +inline void MethodDescriptorProto::set_input_type(const ::std::string& value) { + set_has_input_type(); + if (input_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + input_type_ = new ::std::string; + } + input_type_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.input_type) +} +inline void MethodDescriptorProto::set_input_type(const char* value) { + set_has_input_type(); + if (input_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + input_type_ = new ::std::string; + } + input_type_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.input_type) +} +inline void MethodDescriptorProto::set_input_type(const char* value, size_t size) { + set_has_input_type(); + if (input_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + input_type_ = new ::std::string; + } + input_type_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.input_type) +} +inline ::std::string* MethodDescriptorProto::mutable_input_type() { + set_has_input_type(); + if (input_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + input_type_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.input_type) + return input_type_; +} +inline ::std::string* MethodDescriptorProto::release_input_type() { + clear_has_input_type(); + if (input_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = input_type_; + input_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void MethodDescriptorProto::set_allocated_input_type(::std::string* input_type) { + if (input_type_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete input_type_; + } + if (input_type) { + set_has_input_type(); + input_type_ = input_type; + } else { + clear_has_input_type(); + input_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.input_type) +} + +// optional string output_type = 3; +inline bool MethodDescriptorProto::has_output_type() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void MethodDescriptorProto::set_has_output_type() { + _has_bits_[0] |= 0x00000004u; +} +inline void MethodDescriptorProto::clear_has_output_type() { + _has_bits_[0] &= ~0x00000004u; +} +inline void MethodDescriptorProto::clear_output_type() { + if (output_type_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + output_type_->clear(); + } + clear_has_output_type(); +} +inline const ::std::string& MethodDescriptorProto::output_type() const { + // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.output_type) + return *output_type_; +} +inline void MethodDescriptorProto::set_output_type(const ::std::string& value) { + set_has_output_type(); + if (output_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + output_type_ = new ::std::string; + } + output_type_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.output_type) +} +inline void MethodDescriptorProto::set_output_type(const char* value) { + set_has_output_type(); + if (output_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + output_type_ = new ::std::string; + } + output_type_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.output_type) +} +inline void MethodDescriptorProto::set_output_type(const char* value, size_t size) { + set_has_output_type(); + if (output_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + output_type_ = new ::std::string; + } + output_type_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.output_type) +} +inline ::std::string* MethodDescriptorProto::mutable_output_type() { + set_has_output_type(); + if (output_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + output_type_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.output_type) + return output_type_; +} +inline ::std::string* MethodDescriptorProto::release_output_type() { + clear_has_output_type(); + if (output_type_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = output_type_; + output_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void MethodDescriptorProto::set_allocated_output_type(::std::string* output_type) { + if (output_type_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete output_type_; + } + if (output_type) { + set_has_output_type(); + output_type_ = output_type; + } else { + clear_has_output_type(); + output_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.output_type) +} + +// optional .google.protobuf.MethodOptions options = 4; +inline bool MethodDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void MethodDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000008u; +} +inline void MethodDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000008u; +} +inline void MethodDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::MethodOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::MethodOptions& MethodDescriptorProto::options() const { + // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.options) + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::MethodOptions* MethodDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::MethodOptions; + // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.options) + return options_; +} +inline ::google::protobuf::MethodOptions* MethodDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::MethodOptions* temp = options_; + options_ = NULL; + return temp; +} +inline void MethodDescriptorProto::set_allocated_options(::google::protobuf::MethodOptions* options) { + delete options_; + options_ = options; + if (options) { + set_has_options(); + } else { + clear_has_options(); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.options) +} + +// ------------------------------------------------------------------- + +// FileOptions + +// optional string java_package = 1; +inline bool FileOptions::has_java_package() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void FileOptions::set_has_java_package() { + _has_bits_[0] |= 0x00000001u; +} +inline void FileOptions::clear_has_java_package() { + _has_bits_[0] &= ~0x00000001u; +} +inline void FileOptions::clear_java_package() { + if (java_package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_package_->clear(); + } + clear_has_java_package(); +} +inline const ::std::string& FileOptions::java_package() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_package) + return *java_package_; +} +inline void FileOptions::set_java_package(const ::std::string& value) { + set_has_java_package(); + if (java_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_package_ = new ::std::string; + } + java_package_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_package) +} +inline void FileOptions::set_java_package(const char* value) { + set_has_java_package(); + if (java_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_package_ = new ::std::string; + } + java_package_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.java_package) +} +inline void FileOptions::set_java_package(const char* value, size_t size) { + set_has_java_package(); + if (java_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_package_ = new ::std::string; + } + java_package_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.java_package) +} +inline ::std::string* FileOptions::mutable_java_package() { + set_has_java_package(); + if (java_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_package_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.java_package) + return java_package_; +} +inline ::std::string* FileOptions::release_java_package() { + clear_has_java_package(); + if (java_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = java_package_; + java_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FileOptions::set_allocated_java_package(::std::string* java_package) { + if (java_package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete java_package_; + } + if (java_package) { + set_has_java_package(); + java_package_ = java_package; + } else { + clear_has_java_package(); + java_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.java_package) +} + +// optional string java_outer_classname = 8; +inline bool FileOptions::has_java_outer_classname() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void FileOptions::set_has_java_outer_classname() { + _has_bits_[0] |= 0x00000002u; +} +inline void FileOptions::clear_has_java_outer_classname() { + _has_bits_[0] &= ~0x00000002u; +} +inline void FileOptions::clear_java_outer_classname() { + if (java_outer_classname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_outer_classname_->clear(); + } + clear_has_java_outer_classname(); +} +inline const ::std::string& FileOptions::java_outer_classname() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_outer_classname) + return *java_outer_classname_; +} +inline void FileOptions::set_java_outer_classname(const ::std::string& value) { + set_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_outer_classname_ = new ::std::string; + } + java_outer_classname_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_outer_classname) +} +inline void FileOptions::set_java_outer_classname(const char* value) { + set_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_outer_classname_ = new ::std::string; + } + java_outer_classname_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.java_outer_classname) +} +inline void FileOptions::set_java_outer_classname(const char* value, size_t size) { + set_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_outer_classname_ = new ::std::string; + } + java_outer_classname_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.java_outer_classname) +} +inline ::std::string* FileOptions::mutable_java_outer_classname() { + set_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + java_outer_classname_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.java_outer_classname) + return java_outer_classname_; +} +inline ::std::string* FileOptions::release_java_outer_classname() { + clear_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = java_outer_classname_; + java_outer_classname_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FileOptions::set_allocated_java_outer_classname(::std::string* java_outer_classname) { + if (java_outer_classname_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete java_outer_classname_; + } + if (java_outer_classname) { + set_has_java_outer_classname(); + java_outer_classname_ = java_outer_classname; + } else { + clear_has_java_outer_classname(); + java_outer_classname_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.java_outer_classname) +} + +// optional bool java_multiple_files = 10 [default = false]; +inline bool FileOptions::has_java_multiple_files() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void FileOptions::set_has_java_multiple_files() { + _has_bits_[0] |= 0x00000004u; +} +inline void FileOptions::clear_has_java_multiple_files() { + _has_bits_[0] &= ~0x00000004u; +} +inline void FileOptions::clear_java_multiple_files() { + java_multiple_files_ = false; + clear_has_java_multiple_files(); +} +inline bool FileOptions::java_multiple_files() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_multiple_files) + return java_multiple_files_; +} +inline void FileOptions::set_java_multiple_files(bool value) { + set_has_java_multiple_files(); + java_multiple_files_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_multiple_files) +} + +// optional bool java_generate_equals_and_hash = 20 [default = false]; +inline bool FileOptions::has_java_generate_equals_and_hash() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void FileOptions::set_has_java_generate_equals_and_hash() { + _has_bits_[0] |= 0x00000008u; +} +inline void FileOptions::clear_has_java_generate_equals_and_hash() { + _has_bits_[0] &= ~0x00000008u; +} +inline void FileOptions::clear_java_generate_equals_and_hash() { + java_generate_equals_and_hash_ = false; + clear_has_java_generate_equals_and_hash(); +} +inline bool FileOptions::java_generate_equals_and_hash() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_generate_equals_and_hash) + return java_generate_equals_and_hash_; +} +inline void FileOptions::set_java_generate_equals_and_hash(bool value) { + set_has_java_generate_equals_and_hash(); + java_generate_equals_and_hash_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_generate_equals_and_hash) +} + +// optional bool java_string_check_utf8 = 27 [default = false]; +inline bool FileOptions::has_java_string_check_utf8() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void FileOptions::set_has_java_string_check_utf8() { + _has_bits_[0] |= 0x00000010u; +} +inline void FileOptions::clear_has_java_string_check_utf8() { + _has_bits_[0] &= ~0x00000010u; +} +inline void FileOptions::clear_java_string_check_utf8() { + java_string_check_utf8_ = false; + clear_has_java_string_check_utf8(); +} +inline bool FileOptions::java_string_check_utf8() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_string_check_utf8) + return java_string_check_utf8_; +} +inline void FileOptions::set_java_string_check_utf8(bool value) { + set_has_java_string_check_utf8(); + java_string_check_utf8_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_string_check_utf8) +} + +// optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; +inline bool FileOptions::has_optimize_for() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void FileOptions::set_has_optimize_for() { + _has_bits_[0] |= 0x00000020u; +} +inline void FileOptions::clear_has_optimize_for() { + _has_bits_[0] &= ~0x00000020u; +} +inline void FileOptions::clear_optimize_for() { + optimize_for_ = 1; + clear_has_optimize_for(); +} +inline ::google::protobuf::FileOptions_OptimizeMode FileOptions::optimize_for() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.optimize_for) + return static_cast< ::google::protobuf::FileOptions_OptimizeMode >(optimize_for_); +} +inline void FileOptions::set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value) { + assert(::google::protobuf::FileOptions_OptimizeMode_IsValid(value)); + set_has_optimize_for(); + optimize_for_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.optimize_for) +} + +// optional string go_package = 11; +inline bool FileOptions::has_go_package() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void FileOptions::set_has_go_package() { + _has_bits_[0] |= 0x00000040u; +} +inline void FileOptions::clear_has_go_package() { + _has_bits_[0] &= ~0x00000040u; +} +inline void FileOptions::clear_go_package() { + if (go_package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + go_package_->clear(); + } + clear_has_go_package(); +} +inline const ::std::string& FileOptions::go_package() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.go_package) + return *go_package_; +} +inline void FileOptions::set_go_package(const ::std::string& value) { + set_has_go_package(); + if (go_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + go_package_ = new ::std::string; + } + go_package_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.go_package) +} +inline void FileOptions::set_go_package(const char* value) { + set_has_go_package(); + if (go_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + go_package_ = new ::std::string; + } + go_package_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.go_package) +} +inline void FileOptions::set_go_package(const char* value, size_t size) { + set_has_go_package(); + if (go_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + go_package_ = new ::std::string; + } + go_package_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.go_package) +} +inline ::std::string* FileOptions::mutable_go_package() { + set_has_go_package(); + if (go_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + go_package_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.go_package) + return go_package_; +} +inline ::std::string* FileOptions::release_go_package() { + clear_has_go_package(); + if (go_package_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = go_package_; + go_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FileOptions::set_allocated_go_package(::std::string* go_package) { + if (go_package_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete go_package_; + } + if (go_package) { + set_has_go_package(); + go_package_ = go_package; + } else { + clear_has_go_package(); + go_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.go_package) +} + +// optional bool cc_generic_services = 16 [default = false]; +inline bool FileOptions::has_cc_generic_services() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void FileOptions::set_has_cc_generic_services() { + _has_bits_[0] |= 0x00000080u; +} +inline void FileOptions::clear_has_cc_generic_services() { + _has_bits_[0] &= ~0x00000080u; +} +inline void FileOptions::clear_cc_generic_services() { + cc_generic_services_ = false; + clear_has_cc_generic_services(); +} +inline bool FileOptions::cc_generic_services() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.cc_generic_services) + return cc_generic_services_; +} +inline void FileOptions::set_cc_generic_services(bool value) { + set_has_cc_generic_services(); + cc_generic_services_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.cc_generic_services) +} + +// optional bool java_generic_services = 17 [default = false]; +inline bool FileOptions::has_java_generic_services() const { + return (_has_bits_[0] & 0x00000100u) != 0; +} +inline void FileOptions::set_has_java_generic_services() { + _has_bits_[0] |= 0x00000100u; +} +inline void FileOptions::clear_has_java_generic_services() { + _has_bits_[0] &= ~0x00000100u; +} +inline void FileOptions::clear_java_generic_services() { + java_generic_services_ = false; + clear_has_java_generic_services(); +} +inline bool FileOptions::java_generic_services() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_generic_services) + return java_generic_services_; +} +inline void FileOptions::set_java_generic_services(bool value) { + set_has_java_generic_services(); + java_generic_services_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_generic_services) +} + +// optional bool py_generic_services = 18 [default = false]; +inline bool FileOptions::has_py_generic_services() const { + return (_has_bits_[0] & 0x00000200u) != 0; +} +inline void FileOptions::set_has_py_generic_services() { + _has_bits_[0] |= 0x00000200u; +} +inline void FileOptions::clear_has_py_generic_services() { + _has_bits_[0] &= ~0x00000200u; +} +inline void FileOptions::clear_py_generic_services() { + py_generic_services_ = false; + clear_has_py_generic_services(); +} +inline bool FileOptions::py_generic_services() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.py_generic_services) + return py_generic_services_; +} +inline void FileOptions::set_py_generic_services(bool value) { + set_has_py_generic_services(); + py_generic_services_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.py_generic_services) +} + +// optional bool deprecated = 23 [default = false]; +inline bool FileOptions::has_deprecated() const { + return (_has_bits_[0] & 0x00000400u) != 0; +} +inline void FileOptions::set_has_deprecated() { + _has_bits_[0] |= 0x00000400u; +} +inline void FileOptions::clear_has_deprecated() { + _has_bits_[0] &= ~0x00000400u; +} +inline void FileOptions::clear_deprecated() { + deprecated_ = false; + clear_has_deprecated(); +} +inline bool FileOptions::deprecated() const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.deprecated) + return deprecated_; +} +inline void FileOptions::set_deprecated(bool value) { + set_has_deprecated(); + deprecated_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.deprecated) +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int FileOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void FileOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& FileOptions::uninterpreted_option(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.uninterpreted_option) + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* FileOptions::mutable_uninterpreted_option(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.uninterpreted_option) + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* FileOptions::add_uninterpreted_option() { + // @@protoc_insertion_point(field_add:google.protobuf.FileOptions.uninterpreted_option) + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +FileOptions::uninterpreted_option() const { + // @@protoc_insertion_point(field_list:google.protobuf.FileOptions.uninterpreted_option) + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +FileOptions::mutable_uninterpreted_option() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileOptions.uninterpreted_option) + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// MessageOptions + +// optional bool message_set_wire_format = 1 [default = false]; +inline bool MessageOptions::has_message_set_wire_format() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void MessageOptions::set_has_message_set_wire_format() { + _has_bits_[0] |= 0x00000001u; +} +inline void MessageOptions::clear_has_message_set_wire_format() { + _has_bits_[0] &= ~0x00000001u; +} +inline void MessageOptions::clear_message_set_wire_format() { + message_set_wire_format_ = false; + clear_has_message_set_wire_format(); +} +inline bool MessageOptions::message_set_wire_format() const { + // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.message_set_wire_format) + return message_set_wire_format_; +} +inline void MessageOptions::set_message_set_wire_format(bool value) { + set_has_message_set_wire_format(); + message_set_wire_format_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.message_set_wire_format) +} + +// optional bool no_standard_descriptor_accessor = 2 [default = false]; +inline bool MessageOptions::has_no_standard_descriptor_accessor() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void MessageOptions::set_has_no_standard_descriptor_accessor() { + _has_bits_[0] |= 0x00000002u; +} +inline void MessageOptions::clear_has_no_standard_descriptor_accessor() { + _has_bits_[0] &= ~0x00000002u; +} +inline void MessageOptions::clear_no_standard_descriptor_accessor() { + no_standard_descriptor_accessor_ = false; + clear_has_no_standard_descriptor_accessor(); +} +inline bool MessageOptions::no_standard_descriptor_accessor() const { + // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.no_standard_descriptor_accessor) + return no_standard_descriptor_accessor_; +} +inline void MessageOptions::set_no_standard_descriptor_accessor(bool value) { + set_has_no_standard_descriptor_accessor(); + no_standard_descriptor_accessor_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.no_standard_descriptor_accessor) +} + +// optional bool deprecated = 3 [default = false]; +inline bool MessageOptions::has_deprecated() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void MessageOptions::set_has_deprecated() { + _has_bits_[0] |= 0x00000004u; +} +inline void MessageOptions::clear_has_deprecated() { + _has_bits_[0] &= ~0x00000004u; +} +inline void MessageOptions::clear_deprecated() { + deprecated_ = false; + clear_has_deprecated(); +} +inline bool MessageOptions::deprecated() const { + // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.deprecated) + return deprecated_; +} +inline void MessageOptions::set_deprecated(bool value) { + set_has_deprecated(); + deprecated_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.deprecated) +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int MessageOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void MessageOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& MessageOptions::uninterpreted_option(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.uninterpreted_option) + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* MessageOptions::mutable_uninterpreted_option(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.MessageOptions.uninterpreted_option) + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* MessageOptions::add_uninterpreted_option() { + // @@protoc_insertion_point(field_add:google.protobuf.MessageOptions.uninterpreted_option) + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +MessageOptions::uninterpreted_option() const { + // @@protoc_insertion_point(field_list:google.protobuf.MessageOptions.uninterpreted_option) + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +MessageOptions::mutable_uninterpreted_option() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.MessageOptions.uninterpreted_option) + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// FieldOptions + +// optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; +inline bool FieldOptions::has_ctype() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void FieldOptions::set_has_ctype() { + _has_bits_[0] |= 0x00000001u; +} +inline void FieldOptions::clear_has_ctype() { + _has_bits_[0] &= ~0x00000001u; +} +inline void FieldOptions::clear_ctype() { + ctype_ = 0; + clear_has_ctype(); +} +inline ::google::protobuf::FieldOptions_CType FieldOptions::ctype() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.ctype) + return static_cast< ::google::protobuf::FieldOptions_CType >(ctype_); +} +inline void FieldOptions::set_ctype(::google::protobuf::FieldOptions_CType value) { + assert(::google::protobuf::FieldOptions_CType_IsValid(value)); + set_has_ctype(); + ctype_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.ctype) +} + +// optional bool packed = 2; +inline bool FieldOptions::has_packed() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void FieldOptions::set_has_packed() { + _has_bits_[0] |= 0x00000002u; +} +inline void FieldOptions::clear_has_packed() { + _has_bits_[0] &= ~0x00000002u; +} +inline void FieldOptions::clear_packed() { + packed_ = false; + clear_has_packed(); +} +inline bool FieldOptions::packed() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.packed) + return packed_; +} +inline void FieldOptions::set_packed(bool value) { + set_has_packed(); + packed_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.packed) +} + +// optional bool lazy = 5 [default = false]; +inline bool FieldOptions::has_lazy() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void FieldOptions::set_has_lazy() { + _has_bits_[0] |= 0x00000004u; +} +inline void FieldOptions::clear_has_lazy() { + _has_bits_[0] &= ~0x00000004u; +} +inline void FieldOptions::clear_lazy() { + lazy_ = false; + clear_has_lazy(); +} +inline bool FieldOptions::lazy() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.lazy) + return lazy_; +} +inline void FieldOptions::set_lazy(bool value) { + set_has_lazy(); + lazy_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.lazy) +} + +// optional bool deprecated = 3 [default = false]; +inline bool FieldOptions::has_deprecated() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void FieldOptions::set_has_deprecated() { + _has_bits_[0] |= 0x00000008u; +} +inline void FieldOptions::clear_has_deprecated() { + _has_bits_[0] &= ~0x00000008u; +} +inline void FieldOptions::clear_deprecated() { + deprecated_ = false; + clear_has_deprecated(); +} +inline bool FieldOptions::deprecated() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.deprecated) + return deprecated_; +} +inline void FieldOptions::set_deprecated(bool value) { + set_has_deprecated(); + deprecated_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.deprecated) +} + +// optional string experimental_map_key = 9; +inline bool FieldOptions::has_experimental_map_key() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void FieldOptions::set_has_experimental_map_key() { + _has_bits_[0] |= 0x00000010u; +} +inline void FieldOptions::clear_has_experimental_map_key() { + _has_bits_[0] &= ~0x00000010u; +} +inline void FieldOptions::clear_experimental_map_key() { + if (experimental_map_key_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + experimental_map_key_->clear(); + } + clear_has_experimental_map_key(); +} +inline const ::std::string& FieldOptions::experimental_map_key() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.experimental_map_key) + return *experimental_map_key_; +} +inline void FieldOptions::set_experimental_map_key(const ::std::string& value) { + set_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + experimental_map_key_ = new ::std::string; + } + experimental_map_key_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.experimental_map_key) +} +inline void FieldOptions::set_experimental_map_key(const char* value) { + set_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + experimental_map_key_ = new ::std::string; + } + experimental_map_key_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.FieldOptions.experimental_map_key) +} +inline void FieldOptions::set_experimental_map_key(const char* value, size_t size) { + set_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + experimental_map_key_ = new ::std::string; + } + experimental_map_key_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldOptions.experimental_map_key) +} +inline ::std::string* FieldOptions::mutable_experimental_map_key() { + set_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + experimental_map_key_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.FieldOptions.experimental_map_key) + return experimental_map_key_; +} +inline ::std::string* FieldOptions::release_experimental_map_key() { + clear_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = experimental_map_key_; + experimental_map_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void FieldOptions::set_allocated_experimental_map_key(::std::string* experimental_map_key) { + if (experimental_map_key_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete experimental_map_key_; + } + if (experimental_map_key) { + set_has_experimental_map_key(); + experimental_map_key_ = experimental_map_key; + } else { + clear_has_experimental_map_key(); + experimental_map_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldOptions.experimental_map_key) +} + +// optional bool weak = 10 [default = false]; +inline bool FieldOptions::has_weak() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void FieldOptions::set_has_weak() { + _has_bits_[0] |= 0x00000020u; +} +inline void FieldOptions::clear_has_weak() { + _has_bits_[0] &= ~0x00000020u; +} +inline void FieldOptions::clear_weak() { + weak_ = false; + clear_has_weak(); +} +inline bool FieldOptions::weak() const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.weak) + return weak_; +} +inline void FieldOptions::set_weak(bool value) { + set_has_weak(); + weak_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.weak) +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int FieldOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void FieldOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& FieldOptions::uninterpreted_option(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.uninterpreted_option) + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* FieldOptions::mutable_uninterpreted_option(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.FieldOptions.uninterpreted_option) + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* FieldOptions::add_uninterpreted_option() { + // @@protoc_insertion_point(field_add:google.protobuf.FieldOptions.uninterpreted_option) + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +FieldOptions::uninterpreted_option() const { + // @@protoc_insertion_point(field_list:google.protobuf.FieldOptions.uninterpreted_option) + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +FieldOptions::mutable_uninterpreted_option() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.FieldOptions.uninterpreted_option) + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// EnumOptions + +// optional bool allow_alias = 2; +inline bool EnumOptions::has_allow_alias() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void EnumOptions::set_has_allow_alias() { + _has_bits_[0] |= 0x00000001u; +} +inline void EnumOptions::clear_has_allow_alias() { + _has_bits_[0] &= ~0x00000001u; +} +inline void EnumOptions::clear_allow_alias() { + allow_alias_ = false; + clear_has_allow_alias(); +} +inline bool EnumOptions::allow_alias() const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumOptions.allow_alias) + return allow_alias_; +} +inline void EnumOptions::set_allow_alias(bool value) { + set_has_allow_alias(); + allow_alias_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.EnumOptions.allow_alias) +} + +// optional bool deprecated = 3 [default = false]; +inline bool EnumOptions::has_deprecated() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void EnumOptions::set_has_deprecated() { + _has_bits_[0] |= 0x00000002u; +} +inline void EnumOptions::clear_has_deprecated() { + _has_bits_[0] &= ~0x00000002u; +} +inline void EnumOptions::clear_deprecated() { + deprecated_ = false; + clear_has_deprecated(); +} +inline bool EnumOptions::deprecated() const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumOptions.deprecated) + return deprecated_; +} +inline void EnumOptions::set_deprecated(bool value) { + set_has_deprecated(); + deprecated_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.EnumOptions.deprecated) +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int EnumOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void EnumOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& EnumOptions::uninterpreted_option(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumOptions.uninterpreted_option) + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* EnumOptions::mutable_uninterpreted_option(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.EnumOptions.uninterpreted_option) + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* EnumOptions::add_uninterpreted_option() { + // @@protoc_insertion_point(field_add:google.protobuf.EnumOptions.uninterpreted_option) + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +EnumOptions::uninterpreted_option() const { + // @@protoc_insertion_point(field_list:google.protobuf.EnumOptions.uninterpreted_option) + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +EnumOptions::mutable_uninterpreted_option() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumOptions.uninterpreted_option) + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// EnumValueOptions + +// optional bool deprecated = 1 [default = false]; +inline bool EnumValueOptions::has_deprecated() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void EnumValueOptions::set_has_deprecated() { + _has_bits_[0] |= 0x00000001u; +} +inline void EnumValueOptions::clear_has_deprecated() { + _has_bits_[0] &= ~0x00000001u; +} +inline void EnumValueOptions::clear_deprecated() { + deprecated_ = false; + clear_has_deprecated(); +} +inline bool EnumValueOptions::deprecated() const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumValueOptions.deprecated) + return deprecated_; +} +inline void EnumValueOptions::set_deprecated(bool value) { + set_has_deprecated(); + deprecated_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.EnumValueOptions.deprecated) +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int EnumValueOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void EnumValueOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& EnumValueOptions::uninterpreted_option(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.EnumValueOptions.uninterpreted_option) + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* EnumValueOptions::mutable_uninterpreted_option(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueOptions.uninterpreted_option) + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* EnumValueOptions::add_uninterpreted_option() { + // @@protoc_insertion_point(field_add:google.protobuf.EnumValueOptions.uninterpreted_option) + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +EnumValueOptions::uninterpreted_option() const { + // @@protoc_insertion_point(field_list:google.protobuf.EnumValueOptions.uninterpreted_option) + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +EnumValueOptions::mutable_uninterpreted_option() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumValueOptions.uninterpreted_option) + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// ServiceOptions + +// optional bool deprecated = 33 [default = false]; +inline bool ServiceOptions::has_deprecated() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ServiceOptions::set_has_deprecated() { + _has_bits_[0] |= 0x00000001u; +} +inline void ServiceOptions::clear_has_deprecated() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ServiceOptions::clear_deprecated() { + deprecated_ = false; + clear_has_deprecated(); +} +inline bool ServiceOptions::deprecated() const { + // @@protoc_insertion_point(field_get:google.protobuf.ServiceOptions.deprecated) + return deprecated_; +} +inline void ServiceOptions::set_deprecated(bool value) { + set_has_deprecated(); + deprecated_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.ServiceOptions.deprecated) +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int ServiceOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void ServiceOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& ServiceOptions::uninterpreted_option(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.ServiceOptions.uninterpreted_option) + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* ServiceOptions::mutable_uninterpreted_option(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceOptions.uninterpreted_option) + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* ServiceOptions::add_uninterpreted_option() { + // @@protoc_insertion_point(field_add:google.protobuf.ServiceOptions.uninterpreted_option) + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +ServiceOptions::uninterpreted_option() const { + // @@protoc_insertion_point(field_list:google.protobuf.ServiceOptions.uninterpreted_option) + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +ServiceOptions::mutable_uninterpreted_option() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.ServiceOptions.uninterpreted_option) + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// MethodOptions + +// optional bool deprecated = 33 [default = false]; +inline bool MethodOptions::has_deprecated() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void MethodOptions::set_has_deprecated() { + _has_bits_[0] |= 0x00000001u; +} +inline void MethodOptions::clear_has_deprecated() { + _has_bits_[0] &= ~0x00000001u; +} +inline void MethodOptions::clear_deprecated() { + deprecated_ = false; + clear_has_deprecated(); +} +inline bool MethodOptions::deprecated() const { + // @@protoc_insertion_point(field_get:google.protobuf.MethodOptions.deprecated) + return deprecated_; +} +inline void MethodOptions::set_deprecated(bool value) { + set_has_deprecated(); + deprecated_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.MethodOptions.deprecated) +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int MethodOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void MethodOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& MethodOptions::uninterpreted_option(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.MethodOptions.uninterpreted_option) + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* MethodOptions::mutable_uninterpreted_option(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.MethodOptions.uninterpreted_option) + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* MethodOptions::add_uninterpreted_option() { + // @@protoc_insertion_point(field_add:google.protobuf.MethodOptions.uninterpreted_option) + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +MethodOptions::uninterpreted_option() const { + // @@protoc_insertion_point(field_list:google.protobuf.MethodOptions.uninterpreted_option) + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +MethodOptions::mutable_uninterpreted_option() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.MethodOptions.uninterpreted_option) + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// UninterpretedOption_NamePart + +// required string name_part = 1; +inline bool UninterpretedOption_NamePart::has_name_part() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void UninterpretedOption_NamePart::set_has_name_part() { + _has_bits_[0] |= 0x00000001u; +} +inline void UninterpretedOption_NamePart::clear_has_name_part() { + _has_bits_[0] &= ~0x00000001u; +} +inline void UninterpretedOption_NamePart::clear_name_part() { + if (name_part_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_part_->clear(); + } + clear_has_name_part(); +} +inline const ::std::string& UninterpretedOption_NamePart::name_part() const { + // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.NamePart.name_part) + return *name_part_; +} +inline void UninterpretedOption_NamePart::set_name_part(const ::std::string& value) { + set_has_name_part(); + if (name_part_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_part_ = new ::std::string; + } + name_part_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.NamePart.name_part) +} +inline void UninterpretedOption_NamePart::set_name_part(const char* value) { + set_has_name_part(); + if (name_part_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_part_ = new ::std::string; + } + name_part_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.NamePart.name_part) +} +inline void UninterpretedOption_NamePart::set_name_part(const char* value, size_t size) { + set_has_name_part(); + if (name_part_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_part_ = new ::std::string; + } + name_part_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.NamePart.name_part) +} +inline ::std::string* UninterpretedOption_NamePart::mutable_name_part() { + set_has_name_part(); + if (name_part_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_part_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.NamePart.name_part) + return name_part_; +} +inline ::std::string* UninterpretedOption_NamePart::release_name_part() { + clear_has_name_part(); + if (name_part_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_part_; + name_part_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void UninterpretedOption_NamePart::set_allocated_name_part(::std::string* name_part) { + if (name_part_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_part_; + } + if (name_part) { + set_has_name_part(); + name_part_ = name_part; + } else { + clear_has_name_part(); + name_part_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.NamePart.name_part) +} + +// required bool is_extension = 2; +inline bool UninterpretedOption_NamePart::has_is_extension() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void UninterpretedOption_NamePart::set_has_is_extension() { + _has_bits_[0] |= 0x00000002u; +} +inline void UninterpretedOption_NamePart::clear_has_is_extension() { + _has_bits_[0] &= ~0x00000002u; +} +inline void UninterpretedOption_NamePart::clear_is_extension() { + is_extension_ = false; + clear_has_is_extension(); +} +inline bool UninterpretedOption_NamePart::is_extension() const { + // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.NamePart.is_extension) + return is_extension_; +} +inline void UninterpretedOption_NamePart::set_is_extension(bool value) { + set_has_is_extension(); + is_extension_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.NamePart.is_extension) +} + +// ------------------------------------------------------------------- + +// UninterpretedOption + +// repeated .google.protobuf.UninterpretedOption.NamePart name = 2; +inline int UninterpretedOption::name_size() const { + return name_.size(); +} +inline void UninterpretedOption::clear_name() { + name_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption_NamePart& UninterpretedOption::name(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.name) + return name_.Get(index); +} +inline ::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::mutable_name(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.name) + return name_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::add_name() { + // @@protoc_insertion_point(field_add:google.protobuf.UninterpretedOption.name) + return name_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >& +UninterpretedOption::name() const { + // @@protoc_insertion_point(field_list:google.protobuf.UninterpretedOption.name) + return name_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >* +UninterpretedOption::mutable_name() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.UninterpretedOption.name) + return &name_; +} + +// optional string identifier_value = 3; +inline bool UninterpretedOption::has_identifier_value() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void UninterpretedOption::set_has_identifier_value() { + _has_bits_[0] |= 0x00000002u; +} +inline void UninterpretedOption::clear_has_identifier_value() { + _has_bits_[0] &= ~0x00000002u; +} +inline void UninterpretedOption::clear_identifier_value() { + if (identifier_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + identifier_value_->clear(); + } + clear_has_identifier_value(); +} +inline const ::std::string& UninterpretedOption::identifier_value() const { + // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.identifier_value) + return *identifier_value_; +} +inline void UninterpretedOption::set_identifier_value(const ::std::string& value) { + set_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + identifier_value_ = new ::std::string; + } + identifier_value_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.identifier_value) +} +inline void UninterpretedOption::set_identifier_value(const char* value) { + set_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + identifier_value_ = new ::std::string; + } + identifier_value_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.identifier_value) +} +inline void UninterpretedOption::set_identifier_value(const char* value, size_t size) { + set_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + identifier_value_ = new ::std::string; + } + identifier_value_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.identifier_value) +} +inline ::std::string* UninterpretedOption::mutable_identifier_value() { + set_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + identifier_value_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.identifier_value) + return identifier_value_; +} +inline ::std::string* UninterpretedOption::release_identifier_value() { + clear_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = identifier_value_; + identifier_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void UninterpretedOption::set_allocated_identifier_value(::std::string* identifier_value) { + if (identifier_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete identifier_value_; + } + if (identifier_value) { + set_has_identifier_value(); + identifier_value_ = identifier_value; + } else { + clear_has_identifier_value(); + identifier_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.identifier_value) +} + +// optional uint64 positive_int_value = 4; +inline bool UninterpretedOption::has_positive_int_value() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void UninterpretedOption::set_has_positive_int_value() { + _has_bits_[0] |= 0x00000004u; +} +inline void UninterpretedOption::clear_has_positive_int_value() { + _has_bits_[0] &= ~0x00000004u; +} +inline void UninterpretedOption::clear_positive_int_value() { + positive_int_value_ = GOOGLE_ULONGLONG(0); + clear_has_positive_int_value(); +} +inline ::google::protobuf::uint64 UninterpretedOption::positive_int_value() const { + // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.positive_int_value) + return positive_int_value_; +} +inline void UninterpretedOption::set_positive_int_value(::google::protobuf::uint64 value) { + set_has_positive_int_value(); + positive_int_value_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.positive_int_value) +} + +// optional int64 negative_int_value = 5; +inline bool UninterpretedOption::has_negative_int_value() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void UninterpretedOption::set_has_negative_int_value() { + _has_bits_[0] |= 0x00000008u; +} +inline void UninterpretedOption::clear_has_negative_int_value() { + _has_bits_[0] &= ~0x00000008u; +} +inline void UninterpretedOption::clear_negative_int_value() { + negative_int_value_ = GOOGLE_LONGLONG(0); + clear_has_negative_int_value(); +} +inline ::google::protobuf::int64 UninterpretedOption::negative_int_value() const { + // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.negative_int_value) + return negative_int_value_; +} +inline void UninterpretedOption::set_negative_int_value(::google::protobuf::int64 value) { + set_has_negative_int_value(); + negative_int_value_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.negative_int_value) +} + +// optional double double_value = 6; +inline bool UninterpretedOption::has_double_value() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void UninterpretedOption::set_has_double_value() { + _has_bits_[0] |= 0x00000010u; +} +inline void UninterpretedOption::clear_has_double_value() { + _has_bits_[0] &= ~0x00000010u; +} +inline void UninterpretedOption::clear_double_value() { + double_value_ = 0; + clear_has_double_value(); +} +inline double UninterpretedOption::double_value() const { + // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.double_value) + return double_value_; +} +inline void UninterpretedOption::set_double_value(double value) { + set_has_double_value(); + double_value_ = value; + // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.double_value) +} + +// optional bytes string_value = 7; +inline bool UninterpretedOption::has_string_value() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void UninterpretedOption::set_has_string_value() { + _has_bits_[0] |= 0x00000020u; +} +inline void UninterpretedOption::clear_has_string_value() { + _has_bits_[0] &= ~0x00000020u; +} +inline void UninterpretedOption::clear_string_value() { + if (string_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + string_value_->clear(); + } + clear_has_string_value(); +} +inline const ::std::string& UninterpretedOption::string_value() const { + // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.string_value) + return *string_value_; +} +inline void UninterpretedOption::set_string_value(const ::std::string& value) { + set_has_string_value(); + if (string_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + string_value_ = new ::std::string; + } + string_value_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.string_value) +} +inline void UninterpretedOption::set_string_value(const char* value) { + set_has_string_value(); + if (string_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + string_value_ = new ::std::string; + } + string_value_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.string_value) +} +inline void UninterpretedOption::set_string_value(const void* value, size_t size) { + set_has_string_value(); + if (string_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + string_value_ = new ::std::string; + } + string_value_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.string_value) +} +inline ::std::string* UninterpretedOption::mutable_string_value() { + set_has_string_value(); + if (string_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + string_value_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.string_value) + return string_value_; +} +inline ::std::string* UninterpretedOption::release_string_value() { + clear_has_string_value(); + if (string_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = string_value_; + string_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void UninterpretedOption::set_allocated_string_value(::std::string* string_value) { + if (string_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete string_value_; + } + if (string_value) { + set_has_string_value(); + string_value_ = string_value; + } else { + clear_has_string_value(); + string_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.string_value) +} + +// optional string aggregate_value = 8; +inline bool UninterpretedOption::has_aggregate_value() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void UninterpretedOption::set_has_aggregate_value() { + _has_bits_[0] |= 0x00000040u; +} +inline void UninterpretedOption::clear_has_aggregate_value() { + _has_bits_[0] &= ~0x00000040u; +} +inline void UninterpretedOption::clear_aggregate_value() { + if (aggregate_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + aggregate_value_->clear(); + } + clear_has_aggregate_value(); +} +inline const ::std::string& UninterpretedOption::aggregate_value() const { + // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.aggregate_value) + return *aggregate_value_; +} +inline void UninterpretedOption::set_aggregate_value(const ::std::string& value) { + set_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + aggregate_value_ = new ::std::string; + } + aggregate_value_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.aggregate_value) +} +inline void UninterpretedOption::set_aggregate_value(const char* value) { + set_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + aggregate_value_ = new ::std::string; + } + aggregate_value_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.aggregate_value) +} +inline void UninterpretedOption::set_aggregate_value(const char* value, size_t size) { + set_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + aggregate_value_ = new ::std::string; + } + aggregate_value_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.aggregate_value) +} +inline ::std::string* UninterpretedOption::mutable_aggregate_value() { + set_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + aggregate_value_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.aggregate_value) + return aggregate_value_; +} +inline ::std::string* UninterpretedOption::release_aggregate_value() { + clear_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = aggregate_value_; + aggregate_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void UninterpretedOption::set_allocated_aggregate_value(::std::string* aggregate_value) { + if (aggregate_value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete aggregate_value_; + } + if (aggregate_value) { + set_has_aggregate_value(); + aggregate_value_ = aggregate_value; + } else { + clear_has_aggregate_value(); + aggregate_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.aggregate_value) +} + +// ------------------------------------------------------------------- + +// SourceCodeInfo_Location + +// repeated int32 path = 1 [packed = true]; +inline int SourceCodeInfo_Location::path_size() const { + return path_.size(); +} +inline void SourceCodeInfo_Location::clear_path() { + path_.Clear(); +} +inline ::google::protobuf::int32 SourceCodeInfo_Location::path(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.path) + return path_.Get(index); +} +inline void SourceCodeInfo_Location::set_path(int index, ::google::protobuf::int32 value) { + path_.Set(index, value); + // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.path) +} +inline void SourceCodeInfo_Location::add_path(::google::protobuf::int32 value) { + path_.Add(value); + // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.path) +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +SourceCodeInfo_Location::path() const { + // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.Location.path) + return path_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +SourceCodeInfo_Location::mutable_path() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.Location.path) + return &path_; +} + +// repeated int32 span = 2 [packed = true]; +inline int SourceCodeInfo_Location::span_size() const { + return span_.size(); +} +inline void SourceCodeInfo_Location::clear_span() { + span_.Clear(); +} +inline ::google::protobuf::int32 SourceCodeInfo_Location::span(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.span) + return span_.Get(index); +} +inline void SourceCodeInfo_Location::set_span(int index, ::google::protobuf::int32 value) { + span_.Set(index, value); + // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.span) +} +inline void SourceCodeInfo_Location::add_span(::google::protobuf::int32 value) { + span_.Add(value); + // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.span) +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +SourceCodeInfo_Location::span() const { + // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.Location.span) + return span_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +SourceCodeInfo_Location::mutable_span() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.Location.span) + return &span_; +} + +// optional string leading_comments = 3; +inline bool SourceCodeInfo_Location::has_leading_comments() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void SourceCodeInfo_Location::set_has_leading_comments() { + _has_bits_[0] |= 0x00000004u; +} +inline void SourceCodeInfo_Location::clear_has_leading_comments() { + _has_bits_[0] &= ~0x00000004u; +} +inline void SourceCodeInfo_Location::clear_leading_comments() { + if (leading_comments_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + leading_comments_->clear(); + } + clear_has_leading_comments(); +} +inline const ::std::string& SourceCodeInfo_Location::leading_comments() const { + // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.leading_comments) + return *leading_comments_; +} +inline void SourceCodeInfo_Location::set_leading_comments(const ::std::string& value) { + set_has_leading_comments(); + if (leading_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + leading_comments_ = new ::std::string; + } + leading_comments_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_comments) +} +inline void SourceCodeInfo_Location::set_leading_comments(const char* value) { + set_has_leading_comments(); + if (leading_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + leading_comments_ = new ::std::string; + } + leading_comments_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.leading_comments) +} +inline void SourceCodeInfo_Location::set_leading_comments(const char* value, size_t size) { + set_has_leading_comments(); + if (leading_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + leading_comments_ = new ::std::string; + } + leading_comments_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.leading_comments) +} +inline ::std::string* SourceCodeInfo_Location::mutable_leading_comments() { + set_has_leading_comments(); + if (leading_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + leading_comments_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.leading_comments) + return leading_comments_; +} +inline ::std::string* SourceCodeInfo_Location::release_leading_comments() { + clear_has_leading_comments(); + if (leading_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = leading_comments_; + leading_comments_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void SourceCodeInfo_Location::set_allocated_leading_comments(::std::string* leading_comments) { + if (leading_comments_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete leading_comments_; + } + if (leading_comments) { + set_has_leading_comments(); + leading_comments_ = leading_comments; + } else { + clear_has_leading_comments(); + leading_comments_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceCodeInfo.Location.leading_comments) +} + +// optional string trailing_comments = 4; +inline bool SourceCodeInfo_Location::has_trailing_comments() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void SourceCodeInfo_Location::set_has_trailing_comments() { + _has_bits_[0] |= 0x00000008u; +} +inline void SourceCodeInfo_Location::clear_has_trailing_comments() { + _has_bits_[0] &= ~0x00000008u; +} +inline void SourceCodeInfo_Location::clear_trailing_comments() { + if (trailing_comments_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + trailing_comments_->clear(); + } + clear_has_trailing_comments(); +} +inline const ::std::string& SourceCodeInfo_Location::trailing_comments() const { + // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.trailing_comments) + return *trailing_comments_; +} +inline void SourceCodeInfo_Location::set_trailing_comments(const ::std::string& value) { + set_has_trailing_comments(); + if (trailing_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + trailing_comments_ = new ::std::string; + } + trailing_comments_->assign(value); + // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.trailing_comments) +} +inline void SourceCodeInfo_Location::set_trailing_comments(const char* value) { + set_has_trailing_comments(); + if (trailing_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + trailing_comments_ = new ::std::string; + } + trailing_comments_->assign(value); + // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.trailing_comments) +} +inline void SourceCodeInfo_Location::set_trailing_comments(const char* value, size_t size) { + set_has_trailing_comments(); + if (trailing_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + trailing_comments_ = new ::std::string; + } + trailing_comments_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.trailing_comments) +} +inline ::std::string* SourceCodeInfo_Location::mutable_trailing_comments() { + set_has_trailing_comments(); + if (trailing_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + trailing_comments_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.trailing_comments) + return trailing_comments_; +} +inline ::std::string* SourceCodeInfo_Location::release_trailing_comments() { + clear_has_trailing_comments(); + if (trailing_comments_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = trailing_comments_; + trailing_comments_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void SourceCodeInfo_Location::set_allocated_trailing_comments(::std::string* trailing_comments) { + if (trailing_comments_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete trailing_comments_; + } + if (trailing_comments) { + set_has_trailing_comments(); + trailing_comments_ = trailing_comments; + } else { + clear_has_trailing_comments(); + trailing_comments_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceCodeInfo.Location.trailing_comments) +} + +// ------------------------------------------------------------------- + +// SourceCodeInfo + +// repeated .google.protobuf.SourceCodeInfo.Location location = 1; +inline int SourceCodeInfo::location_size() const { + return location_.size(); +} +inline void SourceCodeInfo::clear_location() { + location_.Clear(); +} +inline const ::google::protobuf::SourceCodeInfo_Location& SourceCodeInfo::location(int index) const { + // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.location) + return location_.Get(index); +} +inline ::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::mutable_location(int index) { + // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.location) + return location_.Mutable(index); +} +inline ::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::add_location() { + // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.location) + return location_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >& +SourceCodeInfo::location() const { + // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.location) + return location_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >* +SourceCodeInfo::mutable_location() { + // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.location) + return &location_; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace protobuf +} // namespace google + +#ifndef SWIG +namespace google { +namespace protobuf { + +template <> struct is_proto_enum< ::google::protobuf::FieldDescriptorProto_Type> : ::google::protobuf::internal::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldDescriptorProto_Type>() { + return ::google::protobuf::FieldDescriptorProto_Type_descriptor(); +} +template <> struct is_proto_enum< ::google::protobuf::FieldDescriptorProto_Label> : ::google::protobuf::internal::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldDescriptorProto_Label>() { + return ::google::protobuf::FieldDescriptorProto_Label_descriptor(); +} +template <> struct is_proto_enum< ::google::protobuf::FileOptions_OptimizeMode> : ::google::protobuf::internal::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FileOptions_OptimizeMode>() { + return ::google::protobuf::FileOptions_OptimizeMode_descriptor(); +} +template <> struct is_proto_enum< ::google::protobuf::FieldOptions_CType> : ::google::protobuf::internal::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldOptions_CType>() { + return ::google::protobuf::FieldOptions_CType_descriptor(); +} + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED diff --git a/toolkit/components/protobuf/src/google/protobuf/descriptor.proto b/toolkit/components/protobuf/src/google/protobuf/descriptor.proto new file mode 100644 index 0000000000000..a753601f39d52 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/descriptor.proto @@ -0,0 +1,687 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + + +package google.protobuf; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + // Indexes of the public imported files in the dependency list above. + repeated int32 public_dependency = 10; + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + repeated int32 weak_dependency = 11; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field whithout harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + } + repeated ExtensionRange extension_range = 5; + + repeated OneofDescriptorProto oneof_decl = 8; + + optional MessageOptions options = 7; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; // Tag-delimited aggregate. + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + // TODO(sanjay): Should we add LABEL_MAP? + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. Extensions of a oneof should + // not set this since the oneof to which they belong will be inferred based + // on the extension range containing the extension's field number. + optional int32 oneof_index = 9; + + optional FieldOptions options = 8; +} + +// Describes a oneof. +message OneofDescriptorProto { + optional string name = 1; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; +} + + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail protobuf-global-extension-registry@google.com +// to reserve extension numbers. Simply provide your project name (e.g. +// Object-C plugin) and your porject website (if available) -- there's no need +// to explain how you intend to use them. Usually you only need one extension +// number. You can declare multiple options with only one extension number by +// putting them in a sub-message. See the Custom Options section of the docs +// for examples: +// https://developers.google.com/protocol-buffers/docs/proto#options +// If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // If set true, then the Java code generator will generate equals() and + // hashCode() methods for all messages defined in the .proto file. + // - In the full runtime, this is purely a speed optimization, as the + // AbstractMessage base class includes reflection-based implementations of + // these methods. + //- In the lite runtime, setting this option changes the semantics of + // equals() and hashCode() to more closely match those of the full runtime; + // the generated methods compute their results based on field values rather + // than object identity. (Implementations should not assume that hashcodes + // will be consistent across runtimes or versions of the protocol compiler.) + optional bool java_generate_equals_and_hash = 20 [default=false]; + + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + optional bool java_string_check_utf8 = 27 [default=false]; + + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + // Sets the Go package where structs generated from this .proto will be + // placed. There is no default. + optional string go_package = 11; + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of proto2. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + optional bool deprecated = 23 [default=false]; + + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + optional bool deprecated = 3 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. + optional bool packed = 2; + + + + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outher message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + optional bool lazy = 5 [default=false]; + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // EXPERIMENTAL. DO NOT USE. + // For "map" fields, the name of the field in the enclosed type that + // is the key for this map. For example, suppose we have: + // message Item { + // required string name = 1; + // required string value = 2; + // } + // message Config { + // repeated Item items = 1 [experimental_map_key="name"]; + // } + // In this situation, the map key for Item will be set to "name". + // TODO: Fully-implement this, then remove the "experimental_" prefix. + optional string experimental_map_key = 9; + + // For Google-internal migration only. Do not use. + optional bool weak = 10 [default=false]; + + + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // Set this option to true to allow mapping different tag names to the same + // value. + optional bool allow_alias = 2; + + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + optional bool deprecated = 3 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + optional bool deprecated = 1 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + optional bool deprecated = 33 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + optional bool deprecated = 33 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + optional string leading_comments = 3; + optional string trailing_comments = 4; + } +} diff --git a/toolkit/components/protobuf/src/google/protobuf/descriptor_database.cc b/toolkit/components/protobuf/src/google/protobuf/descriptor_database.cc new file mode 100644 index 0000000000000..d024eab13a472 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/descriptor_database.cc @@ -0,0 +1,543 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +DescriptorDatabase::~DescriptorDatabase() {} + +// =================================================================== + +template +bool SimpleDescriptorDatabase::DescriptorIndex::AddFile( + const FileDescriptorProto& file, + Value value) { + if (!InsertIfNotPresent(&by_name_, file.name(), value)) { + GOOGLE_LOG(ERROR) << "File already exists in database: " << file.name(); + return false; + } + + // We must be careful here -- calling file.package() if file.has_package() is + // false could access an uninitialized static-storage variable if we are being + // run at startup time. + string path = file.has_package() ? file.package() : string(); + if (!path.empty()) path += '.'; + + for (int i = 0; i < file.message_type_size(); i++) { + if (!AddSymbol(path + file.message_type(i).name(), value)) return false; + if (!AddNestedExtensions(file.message_type(i), value)) return false; + } + for (int i = 0; i < file.enum_type_size(); i++) { + if (!AddSymbol(path + file.enum_type(i).name(), value)) return false; + } + for (int i = 0; i < file.extension_size(); i++) { + if (!AddSymbol(path + file.extension(i).name(), value)) return false; + if (!AddExtension(file.extension(i), value)) return false; + } + for (int i = 0; i < file.service_size(); i++) { + if (!AddSymbol(path + file.service(i).name(), value)) return false; + } + + return true; +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::AddSymbol( + const string& name, Value value) { + // We need to make sure not to violate our map invariant. + + // If the symbol name is invalid it could break our lookup algorithm (which + // relies on the fact that '.' sorts before all other characters that are + // valid in symbol names). + if (!ValidateSymbolName(name)) { + GOOGLE_LOG(ERROR) << "Invalid symbol name: " << name; + return false; + } + + // Try to look up the symbol to make sure a super-symbol doesn't already + // exist. + typename map::iterator iter = FindLastLessOrEqual(name); + + if (iter == by_symbol_.end()) { + // Apparently the map is currently empty. Just insert and be done with it. + by_symbol_.insert(typename map::value_type(name, value)); + return true; + } + + if (IsSubSymbol(iter->first, name)) { + GOOGLE_LOG(ERROR) << "Symbol name \"" << name << "\" conflicts with the existing " + "symbol \"" << iter->first << "\"."; + return false; + } + + // OK, that worked. Now we have to make sure that no symbol in the map is + // a sub-symbol of the one we are inserting. The only symbol which could + // be so is the first symbol that is greater than the new symbol. Since + // |iter| points at the last symbol that is less than or equal, we just have + // to increment it. + ++iter; + + if (iter != by_symbol_.end() && IsSubSymbol(name, iter->first)) { + GOOGLE_LOG(ERROR) << "Symbol name \"" << name << "\" conflicts with the existing " + "symbol \"" << iter->first << "\"."; + return false; + } + + // OK, no conflicts. + + // Insert the new symbol using the iterator as a hint, the new entry will + // appear immediately before the one the iterator is pointing at. + by_symbol_.insert(iter, typename map::value_type(name, value)); + + return true; +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::AddNestedExtensions( + const DescriptorProto& message_type, + Value value) { + for (int i = 0; i < message_type.nested_type_size(); i++) { + if (!AddNestedExtensions(message_type.nested_type(i), value)) return false; + } + for (int i = 0; i < message_type.extension_size(); i++) { + if (!AddExtension(message_type.extension(i), value)) return false; + } + return true; +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::AddExtension( + const FieldDescriptorProto& field, + Value value) { + if (!field.extendee().empty() && field.extendee()[0] == '.') { + // The extension is fully-qualified. We can use it as a lookup key in + // the by_symbol_ table. + if (!InsertIfNotPresent(&by_extension_, + make_pair(field.extendee().substr(1), + field.number()), + value)) { + GOOGLE_LOG(ERROR) << "Extension conflicts with extension already in database: " + "extend " << field.extendee() << " { " + << field.name() << " = " << field.number() << " }"; + return false; + } + } else { + // Not fully-qualified. We can't really do anything here, unfortunately. + // We don't consider this an error, though, because the descriptor is + // valid. + } + return true; +} + +template +Value SimpleDescriptorDatabase::DescriptorIndex::FindFile( + const string& filename) { + return FindWithDefault(by_name_, filename, Value()); +} + +template +Value SimpleDescriptorDatabase::DescriptorIndex::FindSymbol( + const string& name) { + typename map::iterator iter = FindLastLessOrEqual(name); + + return (iter != by_symbol_.end() && IsSubSymbol(iter->first, name)) ? + iter->second : Value(); +} + +template +Value SimpleDescriptorDatabase::DescriptorIndex::FindExtension( + const string& containing_type, + int field_number) { + return FindWithDefault(by_extension_, + make_pair(containing_type, field_number), + Value()); +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::FindAllExtensionNumbers( + const string& containing_type, + vector* output) { + typename map, Value >::const_iterator it = + by_extension_.lower_bound(make_pair(containing_type, 0)); + bool success = false; + + for (; it != by_extension_.end() && it->first.first == containing_type; + ++it) { + output->push_back(it->first.second); + success = true; + } + + return success; +} + +template +typename map::iterator +SimpleDescriptorDatabase::DescriptorIndex::FindLastLessOrEqual( + const string& name) { + // Find the last key in the map which sorts less than or equal to the + // symbol name. Since upper_bound() returns the *first* key that sorts + // *greater* than the input, we want the element immediately before that. + typename map::iterator iter = by_symbol_.upper_bound(name); + if (iter != by_symbol_.begin()) --iter; + return iter; +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::IsSubSymbol( + const string& sub_symbol, const string& super_symbol) { + return sub_symbol == super_symbol || + (HasPrefixString(super_symbol, sub_symbol) && + super_symbol[sub_symbol.size()] == '.'); +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::ValidateSymbolName( + const string& name) { + for (int i = 0; i < name.size(); i++) { + // I don't trust ctype.h due to locales. :( + if (name[i] != '.' && name[i] != '_' && + (name[i] < '0' || name[i] > '9') && + (name[i] < 'A' || name[i] > 'Z') && + (name[i] < 'a' || name[i] > 'z')) { + return false; + } + } + return true; +} + +// ------------------------------------------------------------------- + +SimpleDescriptorDatabase::SimpleDescriptorDatabase() {} +SimpleDescriptorDatabase::~SimpleDescriptorDatabase() { + STLDeleteElements(&files_to_delete_); +} + +bool SimpleDescriptorDatabase::Add(const FileDescriptorProto& file) { + FileDescriptorProto* new_file = new FileDescriptorProto; + new_file->CopyFrom(file); + return AddAndOwn(new_file); +} + +bool SimpleDescriptorDatabase::AddAndOwn(const FileDescriptorProto* file) { + files_to_delete_.push_back(file); + return index_.AddFile(*file, file); +} + +bool SimpleDescriptorDatabase::FindFileByName( + const string& filename, + FileDescriptorProto* output) { + return MaybeCopy(index_.FindFile(filename), output); +} + +bool SimpleDescriptorDatabase::FindFileContainingSymbol( + const string& symbol_name, + FileDescriptorProto* output) { + return MaybeCopy(index_.FindSymbol(symbol_name), output); +} + +bool SimpleDescriptorDatabase::FindFileContainingExtension( + const string& containing_type, + int field_number, + FileDescriptorProto* output) { + return MaybeCopy(index_.FindExtension(containing_type, field_number), output); +} + +bool SimpleDescriptorDatabase::FindAllExtensionNumbers( + const string& extendee_type, + vector* output) { + return index_.FindAllExtensionNumbers(extendee_type, output); +} + + +bool SimpleDescriptorDatabase::MaybeCopy(const FileDescriptorProto* file, + FileDescriptorProto* output) { + if (file == NULL) return false; + output->CopyFrom(*file); + return true; +} + +// ------------------------------------------------------------------- + +EncodedDescriptorDatabase::EncodedDescriptorDatabase() {} +EncodedDescriptorDatabase::~EncodedDescriptorDatabase() { + for (int i = 0; i < files_to_delete_.size(); i++) { + operator delete(files_to_delete_[i]); + } +} + +bool EncodedDescriptorDatabase::Add( + const void* encoded_file_descriptor, int size) { + FileDescriptorProto file; + if (file.ParseFromArray(encoded_file_descriptor, size)) { + return index_.AddFile(file, make_pair(encoded_file_descriptor, size)); + } else { + GOOGLE_LOG(ERROR) << "Invalid file descriptor data passed to " + "EncodedDescriptorDatabase::Add()."; + return false; + } +} + +bool EncodedDescriptorDatabase::AddCopy( + const void* encoded_file_descriptor, int size) { + void* copy = operator new(size); + memcpy(copy, encoded_file_descriptor, size); + files_to_delete_.push_back(copy); + return Add(copy, size); +} + +bool EncodedDescriptorDatabase::FindFileByName( + const string& filename, + FileDescriptorProto* output) { + return MaybeParse(index_.FindFile(filename), output); +} + +bool EncodedDescriptorDatabase::FindFileContainingSymbol( + const string& symbol_name, + FileDescriptorProto* output) { + return MaybeParse(index_.FindSymbol(symbol_name), output); +} + +bool EncodedDescriptorDatabase::FindNameOfFileContainingSymbol( + const string& symbol_name, + string* output) { + pair encoded_file = index_.FindSymbol(symbol_name); + if (encoded_file.first == NULL) return false; + + // Optimization: The name should be the first field in the encoded message. + // Try to just read it directly. + io::CodedInputStream input(reinterpret_cast(encoded_file.first), + encoded_file.second); + + const uint32 kNameTag = internal::WireFormatLite::MakeTag( + FileDescriptorProto::kNameFieldNumber, + internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED); + + if (input.ReadTag() == kNameTag) { + // Success! + return internal::WireFormatLite::ReadString(&input, output); + } else { + // Slow path. Parse whole message. + FileDescriptorProto file_proto; + if (!file_proto.ParseFromArray(encoded_file.first, encoded_file.second)) { + return false; + } + *output = file_proto.name(); + return true; + } +} + +bool EncodedDescriptorDatabase::FindFileContainingExtension( + const string& containing_type, + int field_number, + FileDescriptorProto* output) { + return MaybeParse(index_.FindExtension(containing_type, field_number), + output); +} + +bool EncodedDescriptorDatabase::FindAllExtensionNumbers( + const string& extendee_type, + vector* output) { + return index_.FindAllExtensionNumbers(extendee_type, output); +} + +bool EncodedDescriptorDatabase::MaybeParse( + pair encoded_file, + FileDescriptorProto* output) { + if (encoded_file.first == NULL) return false; + return output->ParseFromArray(encoded_file.first, encoded_file.second); +} + +// =================================================================== + +DescriptorPoolDatabase::DescriptorPoolDatabase(const DescriptorPool& pool) + : pool_(pool) {} +DescriptorPoolDatabase::~DescriptorPoolDatabase() {} + +bool DescriptorPoolDatabase::FindFileByName( + const string& filename, + FileDescriptorProto* output) { + const FileDescriptor* file = pool_.FindFileByName(filename); + if (file == NULL) return false; + output->Clear(); + file->CopyTo(output); + return true; +} + +bool DescriptorPoolDatabase::FindFileContainingSymbol( + const string& symbol_name, + FileDescriptorProto* output) { + const FileDescriptor* file = pool_.FindFileContainingSymbol(symbol_name); + if (file == NULL) return false; + output->Clear(); + file->CopyTo(output); + return true; +} + +bool DescriptorPoolDatabase::FindFileContainingExtension( + const string& containing_type, + int field_number, + FileDescriptorProto* output) { + const Descriptor* extendee = pool_.FindMessageTypeByName(containing_type); + if (extendee == NULL) return false; + + const FieldDescriptor* extension = + pool_.FindExtensionByNumber(extendee, field_number); + if (extension == NULL) return false; + + output->Clear(); + extension->file()->CopyTo(output); + return true; +} + +bool DescriptorPoolDatabase::FindAllExtensionNumbers( + const string& extendee_type, + vector* output) { + const Descriptor* extendee = pool_.FindMessageTypeByName(extendee_type); + if (extendee == NULL) return false; + + vector extensions; + pool_.FindAllExtensions(extendee, &extensions); + + for (int i = 0; i < extensions.size(); ++i) { + output->push_back(extensions[i]->number()); + } + + return true; +} + +// =================================================================== + +MergedDescriptorDatabase::MergedDescriptorDatabase( + DescriptorDatabase* source1, + DescriptorDatabase* source2) { + sources_.push_back(source1); + sources_.push_back(source2); +} +MergedDescriptorDatabase::MergedDescriptorDatabase( + const vector& sources) + : sources_(sources) {} +MergedDescriptorDatabase::~MergedDescriptorDatabase() {} + +bool MergedDescriptorDatabase::FindFileByName( + const string& filename, + FileDescriptorProto* output) { + for (int i = 0; i < sources_.size(); i++) { + if (sources_[i]->FindFileByName(filename, output)) { + return true; + } + } + return false; +} + +bool MergedDescriptorDatabase::FindFileContainingSymbol( + const string& symbol_name, + FileDescriptorProto* output) { + for (int i = 0; i < sources_.size(); i++) { + if (sources_[i]->FindFileContainingSymbol(symbol_name, output)) { + // The symbol was found in source i. However, if one of the previous + // sources defines a file with the same name (which presumably doesn't + // contain the symbol, since it wasn't found in that source), then we + // must hide it from the caller. + FileDescriptorProto temp; + for (int j = 0; j < i; j++) { + if (sources_[j]->FindFileByName(output->name(), &temp)) { + // Found conflicting file in a previous source. + return false; + } + } + return true; + } + } + return false; +} + +bool MergedDescriptorDatabase::FindFileContainingExtension( + const string& containing_type, + int field_number, + FileDescriptorProto* output) { + for (int i = 0; i < sources_.size(); i++) { + if (sources_[i]->FindFileContainingExtension( + containing_type, field_number, output)) { + // The symbol was found in source i. However, if one of the previous + // sources defines a file with the same name (which presumably doesn't + // contain the symbol, since it wasn't found in that source), then we + // must hide it from the caller. + FileDescriptorProto temp; + for (int j = 0; j < i; j++) { + if (sources_[j]->FindFileByName(output->name(), &temp)) { + // Found conflicting file in a previous source. + return false; + } + } + return true; + } + } + return false; +} + +bool MergedDescriptorDatabase::FindAllExtensionNumbers( + const string& extendee_type, + vector* output) { + set merged_results; + vector results; + bool success = false; + + for (int i = 0; i < sources_.size(); i++) { + if (sources_[i]->FindAllExtensionNumbers(extendee_type, &results)) { + copy(results.begin(), results.end(), + insert_iterator >(merged_results, merged_results.begin())); + success = true; + } + results.clear(); + } + + copy(merged_results.begin(), merged_results.end(), + insert_iterator >(*output, output->end())); + + return success; +} + + +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/descriptor_database.h b/toolkit/components/protobuf/src/google/protobuf/descriptor_database.h new file mode 100644 index 0000000000000..934e4022be74b --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/descriptor_database.h @@ -0,0 +1,369 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Interface for manipulating databases of descriptors. + +#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__ +#define GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__ + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +// Defined in this file. +class DescriptorDatabase; +class SimpleDescriptorDatabase; +class EncodedDescriptorDatabase; +class DescriptorPoolDatabase; +class MergedDescriptorDatabase; + +// Abstract interface for a database of descriptors. +// +// This is useful if you want to create a DescriptorPool which loads +// descriptors on-demand from some sort of large database. If the database +// is large, it may be inefficient to enumerate every .proto file inside it +// calling DescriptorPool::BuildFile() for each one. Instead, a DescriptorPool +// can be created which wraps a DescriptorDatabase and only builds particular +// descriptors when they are needed. +class LIBPROTOBUF_EXPORT DescriptorDatabase { + public: + inline DescriptorDatabase() {} + virtual ~DescriptorDatabase(); + + // Find a file by file name. Fills in in *output and returns true if found. + // Otherwise, returns false, leaving the contents of *output undefined. + virtual bool FindFileByName(const string& filename, + FileDescriptorProto* output) = 0; + + // Find the file that declares the given fully-qualified symbol name. + // If found, fills in *output and returns true, otherwise returns false + // and leaves *output undefined. + virtual bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output) = 0; + + // Find the file which defines an extension extending the given message type + // with the given field number. If found, fills in *output and returns true, + // otherwise returns false and leaves *output undefined. containing_type + // must be a fully-qualified type name. + virtual bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output) = 0; + + // Finds the tag numbers used by all known extensions of + // extendee_type, and appends them to output in an undefined + // order. This method is best-effort: it's not guaranteed that the + // database will find all extensions, and it's not guaranteed that + // FindFileContainingExtension will return true on all of the found + // numbers. Returns true if the search was successful, otherwise + // returns false and leaves output unchanged. + // + // This method has a default implementation that always returns + // false. + virtual bool FindAllExtensionNumbers(const string& /* extendee_type */, + vector* /* output */) { + return false; + } + + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorDatabase); +}; + +// A DescriptorDatabase into which you can insert files manually. +// +// FindFileContainingSymbol() is fully-implemented. When you add a file, its +// symbols will be indexed for this purpose. Note that the implementation +// may return false positives, but only if it isn't possible for the symbol +// to be defined in any other file. In particular, if a file defines a symbol +// "Foo", then searching for "Foo.[anything]" will match that file. This way, +// the database does not need to aggressively index all children of a symbol. +// +// FindFileContainingExtension() is mostly-implemented. It works if and only +// if the original FieldDescriptorProto defining the extension has a +// fully-qualified type name in its "extendee" field (i.e. starts with a '.'). +// If the extendee is a relative name, SimpleDescriptorDatabase will not +// attempt to resolve the type, so it will not know what type the extension is +// extending. Therefore, calling FindFileContainingExtension() with the +// extension's containing type will never actually find that extension. Note +// that this is an unlikely problem, as all FileDescriptorProtos created by the +// protocol compiler (as well as ones created by calling +// FileDescriptor::CopyTo()) will always use fully-qualified names for all +// types. You only need to worry if you are constructing FileDescriptorProtos +// yourself, or are calling compiler::Parser directly. +class LIBPROTOBUF_EXPORT SimpleDescriptorDatabase : public DescriptorDatabase { + public: + SimpleDescriptorDatabase(); + ~SimpleDescriptorDatabase(); + + // Adds the FileDescriptorProto to the database, making a copy. The object + // can be deleted after Add() returns. Returns false if the file conflicted + // with a file already in the database, in which case an error will have + // been written to GOOGLE_LOG(ERROR). + bool Add(const FileDescriptorProto& file); + + // Adds the FileDescriptorProto to the database and takes ownership of it. + bool AddAndOwn(const FileDescriptorProto* file); + + // implements DescriptorDatabase ----------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output); + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output); + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output); + bool FindAllExtensionNumbers(const string& extendee_type, + vector* output); + + private: + // So that it can use DescriptorIndex. + friend class EncodedDescriptorDatabase; + + // An index mapping file names, symbol names, and extension numbers to + // some sort of values. + template + class DescriptorIndex { + public: + // Helpers to recursively add particular descriptors and all their contents + // to the index. + bool AddFile(const FileDescriptorProto& file, + Value value); + bool AddSymbol(const string& name, Value value); + bool AddNestedExtensions(const DescriptorProto& message_type, + Value value); + bool AddExtension(const FieldDescriptorProto& field, + Value value); + + Value FindFile(const string& filename); + Value FindSymbol(const string& name); + Value FindExtension(const string& containing_type, int field_number); + bool FindAllExtensionNumbers(const string& containing_type, + vector* output); + + private: + map by_name_; + map by_symbol_; + map, Value> by_extension_; + + // Invariant: The by_symbol_ map does not contain any symbols which are + // prefixes of other symbols in the map. For example, "foo.bar" is a + // prefix of "foo.bar.baz" (but is not a prefix of "foo.barbaz"). + // + // This invariant is important because it means that given a symbol name, + // we can find a key in the map which is a prefix of the symbol in O(lg n) + // time, and we know that there is at most one such key. + // + // The prefix lookup algorithm works like so: + // 1) Find the last key in the map which is less than or equal to the + // search key. + // 2) If the found key is a prefix of the search key, then return it. + // Otherwise, there is no match. + // + // I am sure this algorithm has been described elsewhere, but since I + // wasn't able to find it quickly I will instead prove that it works + // myself. The key to the algorithm is that if a match exists, step (1) + // will find it. Proof: + // 1) Define the "search key" to be the key we are looking for, the "found + // key" to be the key found in step (1), and the "match key" to be the + // key which actually matches the serach key (i.e. the key we're trying + // to find). + // 2) The found key must be less than or equal to the search key by + // definition. + // 3) The match key must also be less than or equal to the search key + // (because it is a prefix). + // 4) The match key cannot be greater than the found key, because if it + // were, then step (1) of the algorithm would have returned the match + // key instead (since it finds the *greatest* key which is less than or + // equal to the search key). + // 5) Therefore, the found key must be between the match key and the search + // key, inclusive. + // 6) Since the search key must be a sub-symbol of the match key, if it is + // not equal to the match key, then search_key[match_key.size()] must + // be '.'. + // 7) Since '.' sorts before any other character that is valid in a symbol + // name, then if the found key is not equal to the match key, then + // found_key[match_key.size()] must also be '.', because any other value + // would make it sort after the search key. + // 8) Therefore, if the found key is not equal to the match key, then the + // found key must be a sub-symbol of the match key. However, this would + // contradict our map invariant which says that no symbol in the map is + // a sub-symbol of any other. + // 9) Therefore, the found key must match the match key. + // + // The above proof assumes the match key exists. In the case that the + // match key does not exist, then step (1) will return some other symbol. + // That symbol cannot be a super-symbol of the search key since if it were, + // then it would be a match, and we're assuming the match key doesn't exist. + // Therefore, step 2 will correctly return no match. + + // Find the last entry in the by_symbol_ map whose key is less than or + // equal to the given name. + typename map::iterator FindLastLessOrEqual( + const string& name); + + // True if either the arguments are equal or super_symbol identifies a + // parent symbol of sub_symbol (e.g. "foo.bar" is a parent of + // "foo.bar.baz", but not a parent of "foo.barbaz"). + bool IsSubSymbol(const string& sub_symbol, const string& super_symbol); + + // Returns true if and only if all characters in the name are alphanumerics, + // underscores, or periods. + bool ValidateSymbolName(const string& name); + }; + + + DescriptorIndex index_; + vector files_to_delete_; + + // If file is non-NULL, copy it into *output and return true, otherwise + // return false. + bool MaybeCopy(const FileDescriptorProto* file, + FileDescriptorProto* output); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SimpleDescriptorDatabase); +}; + +// Very similar to SimpleDescriptorDatabase, but stores all the descriptors +// as raw bytes and generally tries to use as little memory as possible. +// +// The same caveats regarding FindFileContainingExtension() apply as with +// SimpleDescriptorDatabase. +class LIBPROTOBUF_EXPORT EncodedDescriptorDatabase : public DescriptorDatabase { + public: + EncodedDescriptorDatabase(); + ~EncodedDescriptorDatabase(); + + // Adds the FileDescriptorProto to the database. The descriptor is provided + // in encoded form. The database does not make a copy of the bytes, nor + // does it take ownership; it's up to the caller to make sure the bytes + // remain valid for the life of the database. Returns false and logs an error + // if the bytes are not a valid FileDescriptorProto or if the file conflicted + // with a file already in the database. + bool Add(const void* encoded_file_descriptor, int size); + + // Like Add(), but makes a copy of the data, so that the caller does not + // need to keep it around. + bool AddCopy(const void* encoded_file_descriptor, int size); + + // Like FindFileContainingSymbol but returns only the name of the file. + bool FindNameOfFileContainingSymbol(const string& symbol_name, + string* output); + + // implements DescriptorDatabase ----------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output); + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output); + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output); + bool FindAllExtensionNumbers(const string& extendee_type, + vector* output); + + private: + SimpleDescriptorDatabase::DescriptorIndex > index_; + vector files_to_delete_; + + // If encoded_file.first is non-NULL, parse the data into *output and return + // true, otherwise return false. + bool MaybeParse(pair encoded_file, + FileDescriptorProto* output); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EncodedDescriptorDatabase); +}; + +// A DescriptorDatabase that fetches files from a given pool. +class LIBPROTOBUF_EXPORT DescriptorPoolDatabase : public DescriptorDatabase { + public: + DescriptorPoolDatabase(const DescriptorPool& pool); + ~DescriptorPoolDatabase(); + + // implements DescriptorDatabase ----------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output); + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output); + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output); + bool FindAllExtensionNumbers(const string& extendee_type, + vector* output); + + private: + const DescriptorPool& pool_; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPoolDatabase); +}; + +// A DescriptorDatabase that wraps two or more others. It first searches the +// first database and, if that fails, tries the second, and so on. +class LIBPROTOBUF_EXPORT MergedDescriptorDatabase : public DescriptorDatabase { + public: + // Merge just two databases. The sources remain property of the caller. + MergedDescriptorDatabase(DescriptorDatabase* source1, + DescriptorDatabase* source2); + // Merge more than two databases. The sources remain property of the caller. + // The vector may be deleted after the constructor returns but the + // DescriptorDatabases need to stick around. + MergedDescriptorDatabase(const vector& sources); + ~MergedDescriptorDatabase(); + + // implements DescriptorDatabase ----------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output); + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output); + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output); + // Merges the results of calling all databases. Returns true iff any + // of the databases returned true. + bool FindAllExtensionNumbers(const string& extendee_type, + vector* output); + + + private: + vector sources_; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MergedDescriptorDatabase); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/dynamic_message.cc b/toolkit/components/protobuf/src/google/protobuf/dynamic_message.cc new file mode 100644 index 0000000000000..4cca98691bfb0 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/dynamic_message.cc @@ -0,0 +1,764 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// DynamicMessage is implemented by constructing a data structure which +// has roughly the same memory layout as a generated message would have. +// Then, we use GeneratedMessageReflection to implement our reflection +// interface. All the other operations we need to implement (e.g. +// parsing, copying, etc.) are already implemented in terms of +// Reflection, so the rest is easy. +// +// The up side of this strategy is that it's very efficient. We don't +// need to use hash_maps or generic representations of fields. The +// down side is that this is a low-level memory management hack which +// can be tricky to get right. +// +// As mentioned in the header, we only expose a DynamicMessageFactory +// publicly, not the DynamicMessage class itself. This is because +// GenericMessageReflection wants to have a pointer to a "default" +// copy of the class, with all fields initialized to their default +// values. We only want to construct one of these per message type, +// so DynamicMessageFactory stores a cache of default messages for +// each type it sees (each unique Descriptor pointer). The code +// refers to the "default" copy of the class as the "prototype". +// +// Note on memory allocation: This module often calls "operator new()" +// to allocate untyped memory, rather than calling something like +// "new uint8[]". This is because "operator new()" means "Give me some +// space which I can use as I please." while "new uint8[]" means "Give +// me an array of 8-bit integers.". In practice, the later may return +// a pointer that is not aligned correctly for general use. I believe +// Item 8 of "More Effective C++" discusses this in more detail, though +// I don't have the book on me right now so I'm not sure. + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +using internal::WireFormat; +using internal::ExtensionSet; +using internal::GeneratedMessageReflection; + + +// =================================================================== +// Some helper tables and functions... + +namespace { + +// Compute the byte size of the in-memory representation of the field. +int FieldSpaceUsed(const FieldDescriptor* field) { + typedef FieldDescriptor FD; // avoid line wrapping + if (field->label() == FD::LABEL_REPEATED) { + switch (field->cpp_type()) { + case FD::CPPTYPE_INT32 : return sizeof(RepeatedField); + case FD::CPPTYPE_INT64 : return sizeof(RepeatedField); + case FD::CPPTYPE_UINT32 : return sizeof(RepeatedField); + case FD::CPPTYPE_UINT64 : return sizeof(RepeatedField); + case FD::CPPTYPE_DOUBLE : return sizeof(RepeatedField); + case FD::CPPTYPE_FLOAT : return sizeof(RepeatedField); + case FD::CPPTYPE_BOOL : return sizeof(RepeatedField); + case FD::CPPTYPE_ENUM : return sizeof(RepeatedField); + case FD::CPPTYPE_MESSAGE: return sizeof(RepeatedPtrField); + + case FD::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return sizeof(RepeatedPtrField); + } + break; + } + } else { + switch (field->cpp_type()) { + case FD::CPPTYPE_INT32 : return sizeof(int32 ); + case FD::CPPTYPE_INT64 : return sizeof(int64 ); + case FD::CPPTYPE_UINT32 : return sizeof(uint32 ); + case FD::CPPTYPE_UINT64 : return sizeof(uint64 ); + case FD::CPPTYPE_DOUBLE : return sizeof(double ); + case FD::CPPTYPE_FLOAT : return sizeof(float ); + case FD::CPPTYPE_BOOL : return sizeof(bool ); + case FD::CPPTYPE_ENUM : return sizeof(int ); + + case FD::CPPTYPE_MESSAGE: + return sizeof(Message*); + + case FD::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return sizeof(string*); + } + break; + } + } + + GOOGLE_LOG(DFATAL) << "Can't get here."; + return 0; +} + +// Compute the byte size of in-memory representation of the oneof fields +// in default oneof instance. +int OneofFieldSpaceUsed(const FieldDescriptor* field) { + typedef FieldDescriptor FD; // avoid line wrapping + switch (field->cpp_type()) { + case FD::CPPTYPE_INT32 : return sizeof(int32 ); + case FD::CPPTYPE_INT64 : return sizeof(int64 ); + case FD::CPPTYPE_UINT32 : return sizeof(uint32 ); + case FD::CPPTYPE_UINT64 : return sizeof(uint64 ); + case FD::CPPTYPE_DOUBLE : return sizeof(double ); + case FD::CPPTYPE_FLOAT : return sizeof(float ); + case FD::CPPTYPE_BOOL : return sizeof(bool ); + case FD::CPPTYPE_ENUM : return sizeof(int ); + + case FD::CPPTYPE_MESSAGE: + return sizeof(Message*); + + case FD::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: + case FieldOptions::STRING: + return sizeof(string*); + } + break; + } + + GOOGLE_LOG(DFATAL) << "Can't get here."; + return 0; +} + +inline int DivideRoundingUp(int i, int j) { + return (i + (j - 1)) / j; +} + +static const int kSafeAlignment = sizeof(uint64); +static const int kMaxOneofUnionSize = sizeof(uint64); + +inline int AlignTo(int offset, int alignment) { + return DivideRoundingUp(offset, alignment) * alignment; +} + +// Rounds the given byte offset up to the next offset aligned such that any +// type may be stored at it. +inline int AlignOffset(int offset) { + return AlignTo(offset, kSafeAlignment); +} + +#define bitsizeof(T) (sizeof(T) * 8) + +} // namespace + +// =================================================================== + +class DynamicMessage : public Message { + public: + struct TypeInfo { + int size; + int has_bits_offset; + int oneof_case_offset; + int unknown_fields_offset; + int extensions_offset; + + // Not owned by the TypeInfo. + DynamicMessageFactory* factory; // The factory that created this object. + const DescriptorPool* pool; // The factory's DescriptorPool. + const Descriptor* type; // Type of this DynamicMessage. + + // Warning: The order in which the following pointers are defined is + // important (the prototype must be deleted *before* the offsets). + scoped_array offsets; + scoped_ptr reflection; + // Don't use a scoped_ptr to hold the prototype: the destructor for + // DynamicMessage needs to know whether it is the prototype, and does so by + // looking back at this field. This would assume details about the + // implementation of scoped_ptr. + const DynamicMessage* prototype; + void* default_oneof_instance; + + TypeInfo() : prototype(NULL), default_oneof_instance(NULL) {} + + ~TypeInfo() { + delete prototype; + operator delete(default_oneof_instance); + } + }; + + DynamicMessage(const TypeInfo* type_info); + ~DynamicMessage(); + + // Called on the prototype after construction to initialize message fields. + void CrossLinkPrototypes(); + + // implements Message ---------------------------------------------- + + Message* New() const; + + int GetCachedSize() const; + void SetCachedSize(int size) const; + + Metadata GetMetadata() const; + + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessage); + + inline bool is_prototype() const { + return type_info_->prototype == this || + // If type_info_->prototype is NULL, then we must be constructing + // the prototype now, which means we must be the prototype. + type_info_->prototype == NULL; + } + + inline void* OffsetToPointer(int offset) { + return reinterpret_cast(this) + offset; + } + inline const void* OffsetToPointer(int offset) const { + return reinterpret_cast(this) + offset; + } + + const TypeInfo* type_info_; + + // TODO(kenton): Make this an atomic when C++ supports it. + mutable int cached_byte_size_; +}; + +DynamicMessage::DynamicMessage(const TypeInfo* type_info) + : type_info_(type_info), + cached_byte_size_(0) { + // We need to call constructors for various fields manually and set + // default values where appropriate. We use placement new to call + // constructors. If you haven't heard of placement new, I suggest Googling + // it now. We use placement new even for primitive types that don't have + // constructors for consistency. (In theory, placement new should be used + // any time you are trying to convert untyped memory to typed memory, though + // in practice that's not strictly necessary for types that don't have a + // constructor.) + + const Descriptor* descriptor = type_info_->type; + + // Initialize oneof cases. + for (int i = 0 ; i < descriptor->oneof_decl_count(); ++i) { + new(OffsetToPointer(type_info_->oneof_case_offset + sizeof(uint32) * i)) + uint32(0); + } + + new(OffsetToPointer(type_info_->unknown_fields_offset)) UnknownFieldSet; + + if (type_info_->extensions_offset != -1) { + new(OffsetToPointer(type_info_->extensions_offset)) ExtensionSet; + } + + for (int i = 0; i < descriptor->field_count(); i++) { + const FieldDescriptor* field = descriptor->field(i); + void* field_ptr = OffsetToPointer(type_info_->offsets[i]); + if (field->containing_oneof()) { + continue; + } + switch (field->cpp_type()) { +#define HANDLE_TYPE(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + if (!field->is_repeated()) { \ + new(field_ptr) TYPE(field->default_value_##TYPE()); \ + } else { \ + new(field_ptr) RepeatedField(); \ + } \ + break; + + HANDLE_TYPE(INT32 , int32 ); + HANDLE_TYPE(INT64 , int64 ); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE(FLOAT , float ); + HANDLE_TYPE(BOOL , bool ); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_ENUM: + if (!field->is_repeated()) { + new(field_ptr) int(field->default_value_enum()->number()); + } else { + new(field_ptr) RepeatedField(); + } + break; + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + if (!field->is_repeated()) { + if (is_prototype()) { + new(field_ptr) const string*(&field->default_value_string()); + } else { + string* default_value = + *reinterpret_cast( + type_info_->prototype->OffsetToPointer( + type_info_->offsets[i])); + new(field_ptr) string*(default_value); + } + } else { + new(field_ptr) RepeatedPtrField(); + } + break; + } + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: { + if (!field->is_repeated()) { + new(field_ptr) Message*(NULL); + } else { + new(field_ptr) RepeatedPtrField(); + } + break; + } + } + } +} + +DynamicMessage::~DynamicMessage() { + const Descriptor* descriptor = type_info_->type; + + reinterpret_cast( + OffsetToPointer(type_info_->unknown_fields_offset))->~UnknownFieldSet(); + + if (type_info_->extensions_offset != -1) { + reinterpret_cast( + OffsetToPointer(type_info_->extensions_offset))->~ExtensionSet(); + } + + // We need to manually run the destructors for repeated fields and strings, + // just as we ran their constructors in the the DynamicMessage constructor. + // We also need to manually delete oneof fields if it is set and is string + // or message. + // Additionally, if any singular embedded messages have been allocated, we + // need to delete them, UNLESS we are the prototype message of this type, + // in which case any embedded messages are other prototypes and shouldn't + // be touched. + for (int i = 0; i < descriptor->field_count(); i++) { + const FieldDescriptor* field = descriptor->field(i); + if (field->containing_oneof()) { + void* field_ptr = OffsetToPointer( + type_info_->oneof_case_offset + + sizeof(uint32) * field->containing_oneof()->index()); + if (*(reinterpret_cast(field_ptr)) == + field->number()) { + field_ptr = OffsetToPointer(type_info_->offsets[ + descriptor->field_count() + field->containing_oneof()->index()]); + if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { + switch (field->options().ctype()) { + default: + case FieldOptions::STRING: + delete *reinterpret_cast(field_ptr); + break; + } + } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + delete *reinterpret_cast(field_ptr); + } + } + continue; + } + void* field_ptr = OffsetToPointer(type_info_->offsets[i]); + + if (field->is_repeated()) { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + reinterpret_cast*>(field_ptr) \ + ->~RepeatedField(); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + reinterpret_cast*>(field_ptr) + ->~RepeatedPtrField(); + break; + } + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: + reinterpret_cast*>(field_ptr) + ->~RepeatedPtrField(); + break; + } + + } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: { + string* ptr = *reinterpret_cast(field_ptr); + if (ptr != &field->default_value_string()) { + delete ptr; + } + break; + } + } + } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + if (!is_prototype()) { + Message* message = *reinterpret_cast(field_ptr); + if (message != NULL) { + delete message; + } + } + } + } +} + +void DynamicMessage::CrossLinkPrototypes() { + // This should only be called on the prototype message. + GOOGLE_CHECK(is_prototype()); + + DynamicMessageFactory* factory = type_info_->factory; + const Descriptor* descriptor = type_info_->type; + + // Cross-link default messages. + for (int i = 0; i < descriptor->field_count(); i++) { + const FieldDescriptor* field = descriptor->field(i); + void* field_ptr = OffsetToPointer(type_info_->offsets[i]); + if (field->containing_oneof()) { + field_ptr = reinterpret_cast( + type_info_->default_oneof_instance) + type_info_->offsets[i]; + } + + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && + !field->is_repeated()) { + // For fields with message types, we need to cross-link with the + // prototype for the field's type. + // For singular fields, the field is just a pointer which should + // point to the prototype. + *reinterpret_cast(field_ptr) = + factory->GetPrototypeNoLock(field->message_type()); + } + } +} + +Message* DynamicMessage::New() const { + void* new_base = operator new(type_info_->size); + memset(new_base, 0, type_info_->size); + return new(new_base) DynamicMessage(type_info_); +} + +int DynamicMessage::GetCachedSize() const { + return cached_byte_size_; +} + +void DynamicMessage::SetCachedSize(int size) const { + // This is theoretically not thread-compatible, but in practice it works + // because if multiple threads write this simultaneously, they will be + // writing the exact same value. + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + cached_byte_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} + +Metadata DynamicMessage::GetMetadata() const { + Metadata metadata; + metadata.descriptor = type_info_->type; + metadata.reflection = type_info_->reflection.get(); + return metadata; +} + +// =================================================================== + +struct DynamicMessageFactory::PrototypeMap { + typedef hash_map Map; + Map map_; +}; + +DynamicMessageFactory::DynamicMessageFactory() + : pool_(NULL), delegate_to_generated_factory_(false), + prototypes_(new PrototypeMap) { +} + +DynamicMessageFactory::DynamicMessageFactory(const DescriptorPool* pool) + : pool_(pool), delegate_to_generated_factory_(false), + prototypes_(new PrototypeMap) { +} + +DynamicMessageFactory::~DynamicMessageFactory() { + for (PrototypeMap::Map::iterator iter = prototypes_->map_.begin(); + iter != prototypes_->map_.end(); ++iter) { + DeleteDefaultOneofInstance(iter->second->type, + iter->second->offsets.get(), + iter->second->default_oneof_instance); + delete iter->second; + } +} + +const Message* DynamicMessageFactory::GetPrototype(const Descriptor* type) { + MutexLock lock(&prototypes_mutex_); + return GetPrototypeNoLock(type); +} + +const Message* DynamicMessageFactory::GetPrototypeNoLock( + const Descriptor* type) { + if (delegate_to_generated_factory_ && + type->file()->pool() == DescriptorPool::generated_pool()) { + return MessageFactory::generated_factory()->GetPrototype(type); + } + + const DynamicMessage::TypeInfo** target = &prototypes_->map_[type]; + if (*target != NULL) { + // Already exists. + return (*target)->prototype; + } + + DynamicMessage::TypeInfo* type_info = new DynamicMessage::TypeInfo; + *target = type_info; + + type_info->type = type; + type_info->pool = (pool_ == NULL) ? type->file()->pool() : pool_; + type_info->factory = this; + + // We need to construct all the structures passed to + // GeneratedMessageReflection's constructor. This includes: + // - A block of memory that contains space for all the message's fields. + // - An array of integers indicating the byte offset of each field within + // this block. + // - A big bitfield containing a bit for each field indicating whether + // or not that field is set. + + // Compute size and offsets. + int* offsets = new int[type->field_count() + type->oneof_decl_count()]; + type_info->offsets.reset(offsets); + + // Decide all field offsets by packing in order. + // We place the DynamicMessage object itself at the beginning of the allocated + // space. + int size = sizeof(DynamicMessage); + size = AlignOffset(size); + + // Next the has_bits, which is an array of uint32s. + type_info->has_bits_offset = size; + int has_bits_array_size = + DivideRoundingUp(type->field_count(), bitsizeof(uint32)); + size += has_bits_array_size * sizeof(uint32); + size = AlignOffset(size); + + // The oneof_case, if any. It is an array of uint32s. + if (type->oneof_decl_count() > 0) { + type_info->oneof_case_offset = size; + size += type->oneof_decl_count() * sizeof(uint32); + size = AlignOffset(size); + } + + // The ExtensionSet, if any. + if (type->extension_range_count() > 0) { + type_info->extensions_offset = size; + size += sizeof(ExtensionSet); + size = AlignOffset(size); + } else { + // No extensions. + type_info->extensions_offset = -1; + } + + // All the fields. + for (int i = 0; i < type->field_count(); i++) { + // Make sure field is aligned to avoid bus errors. + // Oneof fields do not use any space. + if (!type->field(i)->containing_oneof()) { + int field_size = FieldSpaceUsed(type->field(i)); + size = AlignTo(size, min(kSafeAlignment, field_size)); + offsets[i] = size; + size += field_size; + } + } + + // The oneofs. + for (int i = 0; i < type->oneof_decl_count(); i++) { + size = AlignTo(size, kSafeAlignment); + offsets[type->field_count() + i] = size; + size += kMaxOneofUnionSize; + } + + // Add the UnknownFieldSet to the end. + size = AlignOffset(size); + type_info->unknown_fields_offset = size; + size += sizeof(UnknownFieldSet); + + // Align the final size to make sure no clever allocators think that + // alignment is not necessary. + size = AlignOffset(size); + type_info->size = size; + + // Allocate the prototype. + void* base = operator new(size); + memset(base, 0, size); + DynamicMessage* prototype = new(base) DynamicMessage(type_info); + type_info->prototype = prototype; + + // Construct the reflection object. + if (type->oneof_decl_count() > 0) { + // Compute the size of default oneof instance and offsets of default + // oneof fields. + int oneof_size = 0; + for (int i = 0; i < type->oneof_decl_count(); i++) { + for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) { + const FieldDescriptor* field = type->oneof_decl(i)->field(j); + int field_size = OneofFieldSpaceUsed(field); + oneof_size = AlignTo(oneof_size, min(kSafeAlignment, field_size)); + offsets[field->index()] = oneof_size; + oneof_size += field_size; + } + } + // Construct default oneof instance. + type_info->default_oneof_instance = ::operator new(oneof_size); + ConstructDefaultOneofInstance(type_info->type, + type_info->offsets.get(), + type_info->default_oneof_instance); + type_info->reflection.reset( + new GeneratedMessageReflection( + type_info->type, + type_info->prototype, + type_info->offsets.get(), + type_info->has_bits_offset, + type_info->unknown_fields_offset, + type_info->extensions_offset, + type_info->default_oneof_instance, + type_info->oneof_case_offset, + type_info->pool, + this, + type_info->size)); + } else { + type_info->reflection.reset( + new GeneratedMessageReflection( + type_info->type, + type_info->prototype, + type_info->offsets.get(), + type_info->has_bits_offset, + type_info->unknown_fields_offset, + type_info->extensions_offset, + type_info->pool, + this, + type_info->size)); + } + // Cross link prototypes. + prototype->CrossLinkPrototypes(); + + return prototype; +} + +void DynamicMessageFactory::ConstructDefaultOneofInstance( + const Descriptor* type, + const int offsets[], + void* default_oneof_instance) { + for (int i = 0; i < type->oneof_decl_count(); i++) { + for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) { + const FieldDescriptor* field = type->oneof_decl(i)->field(j); + void* field_ptr = reinterpret_cast( + default_oneof_instance) + offsets[field->index()]; + switch (field->cpp_type()) { +#define HANDLE_TYPE(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + new(field_ptr) TYPE(field->default_value_##TYPE()); \ + break; + + HANDLE_TYPE(INT32 , int32 ); + HANDLE_TYPE(INT64 , int64 ); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE(FLOAT , float ); + HANDLE_TYPE(BOOL , bool ); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_ENUM: + new(field_ptr) int(field->default_value_enum()->number()); + break; + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: + case FieldOptions::STRING: + if (field->has_default_value()) { + new(field_ptr) const string*(&field->default_value_string()); + } else { + new(field_ptr) string*( + const_cast(&internal::GetEmptyString())); + } + break; + } + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: { + new(field_ptr) Message*(NULL); + break; + } + } + } + } +} + +void DynamicMessageFactory::DeleteDefaultOneofInstance( + const Descriptor* type, + const int offsets[], + void* default_oneof_instance) { + for (int i = 0; i < type->oneof_decl_count(); i++) { + for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) { + const FieldDescriptor* field = type->oneof_decl(i)->field(j); + if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { + switch (field->options().ctype()) { + default: + case FieldOptions::STRING: + break; + } + } + } + } +} + +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/dynamic_message.h b/toolkit/components/protobuf/src/google/protobuf/dynamic_message.h new file mode 100644 index 0000000000000..10ed70051e0be --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/dynamic_message.h @@ -0,0 +1,148 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Defines an implementation of Message which can emulate types which are not +// known at compile-time. + +#ifndef GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__ +#define GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__ + +#include + +#include +#include + +namespace google { +namespace protobuf { + +// Defined in other files. +class Descriptor; // descriptor.h +class DescriptorPool; // descriptor.h + +// Constructs implementations of Message which can emulate types which are not +// known at compile-time. +// +// Sometimes you want to be able to manipulate protocol types that you don't +// know about at compile time. It would be nice to be able to construct +// a Message object which implements the message type given by any arbitrary +// Descriptor. DynamicMessage provides this. +// +// As it turns out, a DynamicMessage needs to construct extra +// information about its type in order to operate. Most of this information +// can be shared between all DynamicMessages of the same type. But, caching +// this information in some sort of global map would be a bad idea, since +// the cached information for a particular descriptor could outlive the +// descriptor itself. To avoid this problem, DynamicMessageFactory +// encapsulates this "cache". All DynamicMessages of the same type created +// from the same factory will share the same support data. Any Descriptors +// used with a particular factory must outlive the factory. +class LIBPROTOBUF_EXPORT DynamicMessageFactory : public MessageFactory { + public: + // Construct a DynamicMessageFactory that will search for extensions in + // the DescriptorPool in which the extendee is defined. + DynamicMessageFactory(); + + // Construct a DynamicMessageFactory that will search for extensions in + // the given DescriptorPool. + // + // DEPRECATED: Use CodedInputStream::SetExtensionRegistry() to tell the + // parser to look for extensions in an alternate pool. However, note that + // this is almost never what you want to do. Almost all users should use + // the zero-arg constructor. + DynamicMessageFactory(const DescriptorPool* pool); + + ~DynamicMessageFactory(); + + // Call this to tell the DynamicMessageFactory that if it is given a + // Descriptor d for which: + // d->file()->pool() == DescriptorPool::generated_pool(), + // then it should delegate to MessageFactory::generated_factory() instead + // of constructing a dynamic implementation of the message. In theory there + // is no down side to doing this, so it may become the default in the future. + void SetDelegateToGeneratedFactory(bool enable) { + delegate_to_generated_factory_ = enable; + } + + // implements MessageFactory --------------------------------------- + + // Given a Descriptor, constructs the default (prototype) Message of that + // type. You can then call that message's New() method to construct a + // mutable message of that type. + // + // Calling this method twice with the same Descriptor returns the same + // object. The returned object remains property of the factory and will + // be destroyed when the factory is destroyed. Also, any objects created + // by calling the prototype's New() method share some data with the + // prototype, so these must be destroyed before the DynamicMessageFactory + // is destroyed. + // + // The given descriptor must outlive the returned message, and hence must + // outlive the DynamicMessageFactory. + // + // The method is thread-safe. + const Message* GetPrototype(const Descriptor* type); + + private: + const DescriptorPool* pool_; + bool delegate_to_generated_factory_; + + // This struct just contains a hash_map. We can't #include from + // this header due to hacks needed for hash_map portability in the open source + // release. Namely, stubs/hash.h, which defines hash_map portably, is not a + // public header (for good reason), but dynamic_message.h is, and public + // headers may only #include other public headers. + struct PrototypeMap; + scoped_ptr prototypes_; + mutable Mutex prototypes_mutex_; + + friend class DynamicMessage; + const Message* GetPrototypeNoLock(const Descriptor* type); + + // Construct default oneof instance for reflection usage if oneof + // is defined. + static void ConstructDefaultOneofInstance(const Descriptor* type, + const int offsets[], + void* default_oneof_instance); + // Delete default oneof instance. Called by ~DynamicMessageFactory. + static void DeleteDefaultOneofInstance(const Descriptor* type, + const int offsets[], + void* default_oneof_instance); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessageFactory); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__ diff --git a/toolkit/components/protobuf/google/protobuf/extension_set.cc b/toolkit/components/protobuf/src/google/protobuf/extension_set.cc similarity index 76% rename from toolkit/components/protobuf/google/protobuf/extension_set.cc rename to toolkit/components/protobuf/src/google/protobuf/extension_set.cc index ba70f365f6435..274554b5f75f3 100644 --- a/toolkit/components/protobuf/google/protobuf/extension_set.cc +++ b/toolkit/components/protobuf/src/google/protobuf/extension_set.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -38,10 +38,9 @@ #include #include #include -#include #include #include -#include +#include namespace google { namespace protobuf { @@ -58,6 +57,22 @@ inline WireFormatLite::CppType cpp_type(FieldType type) { return WireFormatLite::FieldTypeToCppType(real_type(type)); } +inline bool is_packable(WireFormatLite::WireType type) { + switch (type) { + case WireFormatLite::WIRETYPE_VARINT: + case WireFormatLite::WIRETYPE_FIXED64: + case WireFormatLite::WIRETYPE_FIXED32: + return true; + case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: + case WireFormatLite::WIRETYPE_START_GROUP: + case WireFormatLite::WIRETYPE_END_GROUP: + return false; + + // Do not add a default statement. Let the compiler complain when someone + // adds a new wire type. + } +} + // Registry stuff. typedef hash_map, ExtensionInfo> ExtensionRegistry; @@ -71,7 +86,7 @@ void DeleteRegistry() { void InitRegistry() { registry_ = new ExtensionRegistry; - internal::OnShutdown(&DeleteRegistry); + OnShutdown(&DeleteRegistry); } // This function is only called at startup, so there is no need for thread- @@ -180,6 +195,17 @@ bool ExtensionSet::Has(int number) const { return !iter->second.is_cleared; } +int ExtensionSet::NumExtensions() const { + int result = 0; + for (map::const_iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + if (!iter->second.is_cleared) { + ++result; + } + } + return result; +} + int ExtensionSet::ExtensionSize(int number) const { map::const_iterator iter = extensions_.find(number); if (iter == extensions_.end()) return false; @@ -293,6 +319,80 @@ PRIMITIVE_ACCESSORS( BOOL, bool, Bool) #undef PRIMITIVE_ACCESSORS +const void* ExtensionSet::GetRawRepeatedField(int number, + const void* default_value) const { + map::const_iterator iter = extensions_.find(number); + if (iter == extensions_.end()) { + return default_value; + } + // We assume that all the RepeatedField<>* pointers have the same + // size and alignment within the anonymous union in Extension. + return iter->second.repeated_int32_value; +} + +void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type, + bool packed, + const FieldDescriptor* desc) { + Extension* extension; + + // We instantiate an empty Repeated{,Ptr}Field if one doesn't exist for this + // extension. + if (MaybeNewExtension(number, desc, &extension)) { + extension->is_repeated = true; + extension->type = field_type; + extension->is_packed = packed; + + switch (WireFormatLite::FieldTypeToCppType( + static_cast(field_type))) { + case WireFormatLite::CPPTYPE_INT32: + extension->repeated_int32_value = new RepeatedField(); + break; + case WireFormatLite::CPPTYPE_INT64: + extension->repeated_int64_value = new RepeatedField(); + break; + case WireFormatLite::CPPTYPE_UINT32: + extension->repeated_uint32_value = new RepeatedField(); + break; + case WireFormatLite::CPPTYPE_UINT64: + extension->repeated_uint64_value = new RepeatedField(); + break; + case WireFormatLite::CPPTYPE_DOUBLE: + extension->repeated_double_value = new RepeatedField(); + break; + case WireFormatLite::CPPTYPE_FLOAT: + extension->repeated_float_value = new RepeatedField(); + break; + case WireFormatLite::CPPTYPE_BOOL: + extension->repeated_bool_value = new RepeatedField(); + break; + case WireFormatLite::CPPTYPE_ENUM: + extension->repeated_enum_value = new RepeatedField(); + break; + case WireFormatLite::CPPTYPE_STRING: + extension->repeated_string_value = new RepeatedPtrField< ::std::string>(); + break; + case WireFormatLite::CPPTYPE_MESSAGE: + extension->repeated_message_value = new RepeatedPtrField(); + break; + } + } + + // We assume that all the RepeatedField<>* pointers have the same + // size and alignment within the anonymous union in Extension. + return extension->repeated_int32_value; +} + +// Compatible version using old call signature. Does not create extensions when +// the don't already exist; instead, just GOOGLE_CHECK-fails. +void* ExtensionSet::MutableRawRepeatedField(int number) { + map::iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found."; + // We assume that all the RepeatedField<>* pointers have the same + // size and alignment within the anonymous union in Extension. + return iter->second.repeated_int32_value; +} + + // ------------------------------------------------------------------- // Enums @@ -422,7 +522,11 @@ const MessageLite& ExtensionSet::GetMessage( return default_value; } else { GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); - return *iter->second.message_value; + if (iter->second.is_lazy) { + return iter->second.lazymessage_value->GetMessage(default_value); + } else { + return *iter->second.message_value; + } } } @@ -439,12 +543,19 @@ MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, extension->type = type; GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); extension->is_repeated = false; + extension->is_lazy = false; extension->message_value = prototype.New(); + extension->is_cleared = false; + return extension->message_value; } else { GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); + extension->is_cleared = false; + if (extension->is_lazy) { + return extension->lazymessage_value->MutableMessage(prototype); + } else { + return extension->message_value; + } } - extension->is_cleared = false; - return extension->message_value; } // Defined in extension_set_heavy.cc. @@ -452,6 +563,56 @@ MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, // const Descriptor* message_type, // MessageFactory* factory) +void ExtensionSet::SetAllocatedMessage(int number, FieldType type, + const FieldDescriptor* descriptor, + MessageLite* message) { + if (message == NULL) { + ClearExtension(number); + return; + } + Extension* extension; + if (MaybeNewExtension(number, descriptor, &extension)) { + extension->type = type; + GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); + extension->is_repeated = false; + extension->is_lazy = false; + extension->message_value = message; + } else { + GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); + if (extension->is_lazy) { + extension->lazymessage_value->SetAllocatedMessage(message); + } else { + delete extension->message_value; + extension->message_value = message; + } + } + extension->is_cleared = false; +} + +MessageLite* ExtensionSet::ReleaseMessage(int number, + const MessageLite& prototype) { + map::iterator iter = extensions_.find(number); + if (iter == extensions_.end()) { + // Not present. Return NULL. + return NULL; + } else { + GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); + MessageLite* ret = NULL; + if (iter->second.is_lazy) { + ret = iter->second.lazymessage_value->ReleaseMessage(prototype); + delete iter->second.lazymessage_value; + } else { + ret = iter->second.message_value; + } + extensions_.erase(number); + return ret; + } +} + +// Defined in extension_set_heavy.cc. +// MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, +// MessageFactory* factory); + const MessageLite& ExtensionSet::GetRepeatedMessage( int number, int index) const { map::const_iterator iter = extensions_.find(number); @@ -484,7 +645,7 @@ MessageLite* ExtensionSet::AddMessage(int number, FieldType type, // RepeatedPtrField does not know how to Add() since it cannot // allocate an abstract object, so we have to be tricky. MessageLite* result = extension->repeated_message_value - ->AddFromCleared >(); + ->AddFromCleared >(); if (result == NULL) { result = prototype.New(); extension->repeated_message_value->AddAllocated(result); @@ -540,6 +701,16 @@ void ExtensionSet::RemoveLast(int number) { } } +MessageLite* ExtensionSet::ReleaseLast(int number) { + map::iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + + Extension* extension = &iter->second; + GOOGLE_DCHECK(extension->is_repeated); + GOOGLE_DCHECK(cpp_type(extension->type) == WireFormatLite::CPPTYPE_MESSAGE); + return extension->repeated_message_value->ReleaseLast(); +} + void ExtensionSet::SwapElements(int number, int index1, int index2) { map::iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; @@ -602,9 +773,11 @@ void ExtensionSet::MergeFrom(const ExtensionSet& other) { if (is_new) { // Extension did not already exist in set. extension->type = other_extension.type; + extension->is_packed = other_extension.is_packed; extension->is_repeated = true; } else { GOOGLE_DCHECK_EQ(extension->type, other_extension.type); + GOOGLE_DCHECK_EQ(extension->is_packed, other_extension.is_packed); GOOGLE_DCHECK(extension->is_repeated); } @@ -675,12 +848,55 @@ void ExtensionSet::MergeFrom(const ExtensionSet& other) { *other_extension.string_value, other_extension.descriptor); break; - case WireFormatLite::CPPTYPE_MESSAGE: - MutableMessage(iter->first, other_extension.type, - *other_extension.message_value, - other_extension.descriptor) - ->CheckTypeAndMergeFrom(*other_extension.message_value); + case WireFormatLite::CPPTYPE_MESSAGE: { + Extension* extension; + bool is_new = MaybeNewExtension(iter->first, + other_extension.descriptor, + &extension); + if (is_new) { + extension->type = other_extension.type; + extension->is_packed = other_extension.is_packed; + extension->is_repeated = false; + if (other_extension.is_lazy) { + extension->is_lazy = true; + extension->lazymessage_value = + other_extension.lazymessage_value->New(); + extension->lazymessage_value->MergeFrom( + *other_extension.lazymessage_value); + } else { + extension->is_lazy = false; + extension->message_value = + other_extension.message_value->New(); + extension->message_value->CheckTypeAndMergeFrom( + *other_extension.message_value); + } + } else { + GOOGLE_DCHECK_EQ(extension->type, other_extension.type); + GOOGLE_DCHECK_EQ(extension->is_packed,other_extension.is_packed); + GOOGLE_DCHECK(!extension->is_repeated); + if (other_extension.is_lazy) { + if (extension->is_lazy) { + extension->lazymessage_value->MergeFrom( + *other_extension.lazymessage_value); + } else { + extension->message_value->CheckTypeAndMergeFrom( + other_extension.lazymessage_value->GetMessage( + *extension->message_value)); + } + } else { + if (extension->is_lazy) { + extension->lazymessage_value->MutableMessage( + *other_extension.message_value)->CheckTypeAndMergeFrom( + *other_extension.message_value); + } else { + extension->message_value->CheckTypeAndMergeFrom( + *other_extension.message_value); + } + } + } + extension->is_cleared = false; break; + } } } } @@ -691,6 +907,36 @@ void ExtensionSet::Swap(ExtensionSet* x) { extensions_.swap(x->extensions_); } +void ExtensionSet::SwapExtension(ExtensionSet* other, + int number) { + if (this == other) return; + map::iterator this_iter = extensions_.find(number); + map::iterator other_iter = other->extensions_.find(number); + + if (this_iter == extensions_.end() && + other_iter == other->extensions_.end()) { + return; + } + + if (this_iter != extensions_.end() && + other_iter != other->extensions_.end()) { + std::swap(this_iter->second, other_iter->second); + return; + } + + if (this_iter == extensions_.end()) { + extensions_.insert(make_pair(number, other_iter->second)); + other->extensions_.erase(number); + return; + } + + if (other_iter == other->extensions_.end()) { + other->extensions_.insert(make_pair(number, this_iter->second)); + extensions_.erase(number); + return; + } +} + bool ExtensionSet::IsInitialized() const { // Extensions are never required. However, we need to check that all // embedded messages are initialized. @@ -706,7 +952,11 @@ bool ExtensionSet::IsInitialized() const { } } else { if (!extension.is_cleared) { - if (!extension.message_value->IsInitialized()) return false; + if (extension.is_lazy) { + if (!extension.lazymessage_value->IsInitialized()) return false; + } else { + if (!extension.message_value->IsInitialized()) return false; + } } } } @@ -715,27 +965,60 @@ bool ExtensionSet::IsInitialized() const { return true; } +bool ExtensionSet::FindExtensionInfoFromTag( + uint32 tag, ExtensionFinder* extension_finder, int* field_number, + ExtensionInfo* extension, bool* was_packed_on_wire) { + *field_number = WireFormatLite::GetTagFieldNumber(tag); + WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); + return FindExtensionInfoFromFieldNumber(wire_type, *field_number, + extension_finder, extension, + was_packed_on_wire); +} + +bool ExtensionSet::FindExtensionInfoFromFieldNumber( + int wire_type, int field_number, ExtensionFinder* extension_finder, + ExtensionInfo* extension, bool* was_packed_on_wire) { + if (!extension_finder->Find(field_number, extension)) { + return false; + } + + WireFormatLite::WireType expected_wire_type = + WireFormatLite::WireTypeForFieldType(real_type(extension->type)); + + // Check if this is a packed field. + *was_packed_on_wire = false; + if (extension->is_repeated && + wire_type == WireFormatLite::WIRETYPE_LENGTH_DELIMITED && + is_packable(expected_wire_type)) { + *was_packed_on_wire = true; + return true; + } + // Otherwise the wire type must match. + return expected_wire_type == wire_type; +} + bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, ExtensionFinder* extension_finder, FieldSkipper* field_skipper) { - int number = WireFormatLite::GetTagFieldNumber(tag); - WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); - + int number; + bool was_packed_on_wire; ExtensionInfo extension; - bool is_unknown; - if (!extension_finder->Find(number, &extension)) { - is_unknown = true; - } else if (extension.is_packed) { - is_unknown = (wire_type != WireFormatLite::WIRETYPE_LENGTH_DELIMITED); + if (!FindExtensionInfoFromTag( + tag, extension_finder, &number, &extension, &was_packed_on_wire)) { + return field_skipper->SkipField(input, tag); } else { - WireFormatLite::WireType expected_wire_type = - WireFormatLite::WireTypeForFieldType(real_type(extension.type)); - is_unknown = (wire_type != expected_wire_type); + return ParseFieldWithExtensionInfo( + number, was_packed_on_wire, extension, input, field_skipper); } +} - if (is_unknown) { - field_skipper->SkipField(input, tag); - } else if (extension.is_packed) { +bool ExtensionSet::ParseFieldWithExtensionInfo( + int number, bool was_packed_on_wire, const ExtensionInfo& extension, + io::CodedInputStream* input, + FieldSkipper* field_skipper) { + // Explicitly not read extension.is_packed, instead check whether the field + // was encoded in packed form on the wire. + if (was_packed_on_wire) { uint32 size; if (!input->ReadVarint32(&size)) return false; io::CodedInputStream::Limit limit = input->PushLimit(size); @@ -749,7 +1032,8 @@ bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ input, &value)) return false; \ Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ - true, value, extension.descriptor); \ + extension.is_packed, value, \ + extension.descriptor); \ } \ break @@ -775,8 +1059,8 @@ bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, input, &value)) return false; if (extension.enum_validity_check.func( extension.enum_validity_check.arg, value)) { - AddEnum(number, WireFormatLite::TYPE_ENUM, true, value, - extension.descriptor); + AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed, + value, extension.descriptor); } } break; @@ -798,9 +1082,10 @@ bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, if (!WireFormatLite::ReadPrimitive< \ CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ input, &value)) return false; \ - if (extension.is_repeated) { \ + if (extension.is_repeated) { \ Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ - false, value, extension.descriptor); \ + extension.is_packed, value, \ + extension.descriptor); \ } else { \ Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value, \ extension.descriptor); \ @@ -832,7 +1117,7 @@ bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, // Invalid value. Treat as unknown. field_skipper->SkipUnknownEnum(number, value); } else if (extension.is_repeated) { - AddEnum(number, WireFormatLite::TYPE_ENUM, false, value, + AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed, value, extension.descriptor); } else { SetEnum(number, WireFormatLite::TYPE_ENUM, value, @@ -852,8 +1137,8 @@ bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, case WireFormatLite::TYPE_BYTES: { string* value = extension.is_repeated ? - AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) : - MutableString(number, WireFormatLite::TYPE_STRING, + AddString(number, WireFormatLite::TYPE_BYTES, extension.descriptor) : + MutableString(number, WireFormatLite::TYPE_BYTES, extension.descriptor); if (!WireFormatLite::ReadBytes(input, value)) return false; break; @@ -891,125 +1176,24 @@ bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, return ParseField(tag, input, &finder, &skipper); } +bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, + const MessageLite* containing_type, + io::CodedOutputStream* unknown_fields) { + CodedOutputStreamFieldSkipper skipper(unknown_fields); + GeneratedExtensionFinder finder(containing_type); + return ParseField(tag, input, &finder, &skipper); +} + // Defined in extension_set_heavy.cc. // bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, // const MessageLite* containing_type, // UnknownFieldSet* unknown_fields) -bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, - ExtensionFinder* extension_finder, - FieldSkipper* field_skipper) { - while (true) { - uint32 tag = input->ReadTag(); - switch (tag) { - case 0: - return true; - case WireFormatLite::kMessageSetItemStartTag: - if (!ParseMessageSetItem(input, extension_finder, field_skipper)) { - return false; - } - break; - default: - if (!ParseField(tag, input, extension_finder, field_skipper)) { - return false; - } - break; - } - } -} - -bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, - const MessageLite* containing_type) { - FieldSkipper skipper; - GeneratedExtensionFinder finder(containing_type); - return ParseMessageSet(input, &finder, &skipper); -} - // Defined in extension_set_heavy.cc. // bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, // const MessageLite* containing_type, // UnknownFieldSet* unknown_fields); -bool ExtensionSet::ParseMessageSetItem(io::CodedInputStream* input, - ExtensionFinder* extension_finder, - FieldSkipper* field_skipper) { - // TODO(kenton): It would be nice to share code between this and - // WireFormatLite::ParseAndMergeMessageSetItem(), but I think the - // differences would be hard to factor out. - - // This method parses a group which should contain two fields: - // required int32 type_id = 2; - // required data message = 3; - - // Once we see a type_id, we'll construct a fake tag for this extension - // which is the tag it would have had under the proto2 extensions wire - // format. - uint32 fake_tag = 0; - - // If we see message data before the type_id, we'll append it to this so - // we can parse it later. This will probably never happen in practice, - // as no MessageSet encoder I know of writes the message before the type ID. - // But, it's technically valid so we should allow it. - // TODO(kenton): Use a Cord instead? Do I care? - string message_data; - - while (true) { - uint32 tag = input->ReadTag(); - if (tag == 0) return false; - - switch (tag) { - case WireFormatLite::kMessageSetTypeIdTag: { - uint32 type_id; - if (!input->ReadVarint32(&type_id)) return false; - fake_tag = WireFormatLite::MakeTag(type_id, - WireFormatLite::WIRETYPE_LENGTH_DELIMITED); - - if (!message_data.empty()) { - // We saw some message data before the type_id. Have to parse it - // now. - io::CodedInputStream sub_input( - reinterpret_cast(message_data.data()), - message_data.size()); - if (!ParseField(fake_tag, &sub_input, - extension_finder, field_skipper)) { - return false; - } - message_data.clear(); - } - - break; - } - - case WireFormatLite::kMessageSetMessageTag: { - if (fake_tag == 0) { - // We haven't seen a type_id yet. Append this data to message_data. - string temp; - uint32 length; - if (!input->ReadVarint32(&length)) return false; - if (!input->ReadString(&temp, length)) return false; - message_data.append(temp); - } else { - // Already saw type_id, so we can parse this directly. - if (!ParseField(fake_tag, input, - extension_finder, field_skipper)) { - return false; - } - } - - break; - } - - case WireFormatLite::kMessageSetItemEndTag: { - return true; - } - - default: { - if (!field_skipper->SkipField(input, tag)) return false; - } - } - } -} - void ExtensionSet::SerializeWithCachedSizes( int start_field_number, int end_field_number, io::CodedOutputStream* output) const { @@ -1021,14 +1205,6 @@ void ExtensionSet::SerializeWithCachedSizes( } } -void ExtensionSet::SerializeMessageSetWithCachedSizes( - io::CodedOutputStream* output) const { - map::const_iterator iter; - for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) { - iter->second.SerializeMessageSetItemWithCachedSizes(iter->first, output); - } -} - int ExtensionSet::ByteSize() const { int total_size = 0; @@ -1040,17 +1216,6 @@ int ExtensionSet::ByteSize() const { return total_size; } -int ExtensionSet::MessageSetByteSize() const { - int total_size = 0; - - for (map::const_iterator iter = extensions_.begin(); - iter != extensions_.end(); ++iter) { - total_size += iter->second.MessageSetItemByteSize(iter->first); - } - - return total_size; -} - // Defined in extension_set_heavy.cc. // int ExtensionSet::SpaceUsedExcludingSelf() const @@ -1094,7 +1259,11 @@ void ExtensionSet::Extension::Clear() { string_value->clear(); break; case WireFormatLite::CPPTYPE_MESSAGE: - message_value->Clear(); + if (is_lazy) { + lazymessage_value->Clear(); + } else { + message_value->Clear(); + } break; default: // No need to do anything. Get*() will return the default value @@ -1206,40 +1375,18 @@ void ExtensionSet::Extension::SerializeFieldWithCachedSizes( HANDLE_TYPE( BYTES, Bytes, *string_value); HANDLE_TYPE( ENUM, Enum, enum_value); HANDLE_TYPE( GROUP, Group, *message_value); - HANDLE_TYPE( MESSAGE, Message, *message_value); #undef HANDLE_TYPE + case WireFormatLite::TYPE_MESSAGE: + if (is_lazy) { + lazymessage_value->WriteMessage(number, output); + } else { + WireFormatLite::WriteMessage(number, *message_value, output); + } + break; } } } -void ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizes( - int number, - io::CodedOutputStream* output) const { - if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { - // Not a valid MessageSet extension, but serialize it the normal way. - SerializeFieldWithCachedSizes(number, output); - return; - } - - if (is_cleared) return; - - // Start group. - output->WriteTag(WireFormatLite::kMessageSetItemStartTag); - - // Write type ID. - WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber, - number, - output); - // Write message. - WireFormatLite::WriteMessageMaybeToArray( - WireFormatLite::kMessageSetMessageNumber, - *message_value, - output); - - // End group. - output->WriteTag(WireFormatLite::kMessageSetItemEndTag); -} - int ExtensionSet::Extension::ByteSize(int number) const { int result = 0; @@ -1353,8 +1500,16 @@ int ExtensionSet::Extension::ByteSize(int number) const { HANDLE_TYPE( BYTES, Bytes, *string_value); HANDLE_TYPE( ENUM, Enum, enum_value); HANDLE_TYPE( GROUP, Group, *message_value); - HANDLE_TYPE( MESSAGE, Message, *message_value); #undef HANDLE_TYPE + case WireFormatLite::TYPE_MESSAGE: { + if (is_lazy) { + int size = lazymessage_value->ByteSize(); + result += io::CodedOutputStream::VarintSize32(size) + size; + } else { + result += WireFormatLite::MessageSize(*message_value); + } + break; + } // Stuff with fixed size. #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \ @@ -1375,29 +1530,6 @@ int ExtensionSet::Extension::ByteSize(int number) const { return result; } -int ExtensionSet::Extension::MessageSetItemByteSize(int number) const { - if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { - // Not a valid MessageSet extension, but compute the byte size for it the - // normal way. - return ByteSize(number); - } - - if (is_cleared) return 0; - - int our_size = WireFormatLite::kMessageSetItemTagsSize; - - // type_id - our_size += io::CodedOutputStream::VarintSize32(number); - - // message - int message_size = message_value->ByteSize(); - - our_size += io::CodedOutputStream::VarintSize32(message_size); - our_size += message_size; - - return our_size; -} - int ExtensionSet::Extension::GetSize() const { GOOGLE_DCHECK(is_repeated); switch (cpp_type(type)) { @@ -1448,7 +1580,11 @@ void ExtensionSet::Extension::Free() { delete string_value; break; case WireFormatLite::CPPTYPE_MESSAGE: - delete message_value; + if (is_lazy) { + delete lazymessage_value; + } else { + delete message_value; + } break; default: break; @@ -1459,6 +1595,69 @@ void ExtensionSet::Extension::Free() { // Defined in extension_set_heavy.cc. // int ExtensionSet::Extension::SpaceUsedExcludingSelf() const +// ================================================================== +// Default repeated field instances for iterator-compatible accessors + +const RepeatedStringTypeTraits::RepeatedFieldType* +RepeatedStringTypeTraits::default_repeated_field_ = NULL; + +const RepeatedMessageGenericTypeTraits::RepeatedFieldType* +RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL; + +#define PROTOBUF_DEFINE_DEFAULT_REPEATED(TYPE) \ + const RepeatedField* \ + RepeatedPrimitiveGenericTypeTraits::default_repeated_field_##TYPE##_ = NULL; + +PROTOBUF_DEFINE_DEFAULT_REPEATED(int32) +PROTOBUF_DEFINE_DEFAULT_REPEATED(int64) +PROTOBUF_DEFINE_DEFAULT_REPEATED(uint32) +PROTOBUF_DEFINE_DEFAULT_REPEATED(uint64) +PROTOBUF_DEFINE_DEFAULT_REPEATED(double) +PROTOBUF_DEFINE_DEFAULT_REPEATED(float) +PROTOBUF_DEFINE_DEFAULT_REPEATED(bool) + +#undef PROTOBUF_DEFINE_DEFAULT_REPEATED + +struct StaticDefaultRepeatedFieldsInitializer { + StaticDefaultRepeatedFieldsInitializer() { + InitializeDefaultRepeatedFields(); + OnShutdown(&DestroyDefaultRepeatedFields); + } +} static_repeated_fields_initializer; + +void InitializeDefaultRepeatedFields() { + RepeatedStringTypeTraits::default_repeated_field_ = + new RepeatedStringTypeTraits::RepeatedFieldType; + RepeatedMessageGenericTypeTraits::default_repeated_field_ = + new RepeatedMessageGenericTypeTraits::RepeatedFieldType; + RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_ = + new RepeatedField; + RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_ = + new RepeatedField; + RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_ = + new RepeatedField; + RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_ = + new RepeatedField; + RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_ = + new RepeatedField; + RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_ = + new RepeatedField; + RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ = + new RepeatedField; +} + +void DestroyDefaultRepeatedFields() { + delete RepeatedStringTypeTraits::default_repeated_field_; + delete RepeatedMessageGenericTypeTraits::default_repeated_field_; + delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_; + delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_; + delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_; + delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_; + delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_; + delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_; + delete RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_; +} + } // namespace internal } // namespace protobuf } // namespace google diff --git a/toolkit/components/protobuf/google/protobuf/extension_set.h b/toolkit/components/protobuf/src/google/protobuf/extension_set.h similarity index 63% rename from toolkit/components/protobuf/google/protobuf/extension_set.h rename to toolkit/components/protobuf/src/google/protobuf/extension_set.h index ac1ada029f1f5..d7ec519247052 100644 --- a/toolkit/components/protobuf/google/protobuf/extension_set.h +++ b/toolkit/components/protobuf/src/google/protobuf/extension_set.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -46,6 +46,8 @@ #include +#include + namespace google { namespace protobuf { @@ -62,10 +64,7 @@ namespace protobuf { } namespace internal { class FieldSkipper; // wire_format_lite.h - class RepeatedPtrFieldBase; // repeated_field.h } - template class RepeatedField; // repeated_field.h - template class RepeatedPtrField; // repeated_field.h } namespace protobuf { @@ -89,8 +88,8 @@ typedef bool EnumValidityFuncWithArg(const void* arg, int number); // Information about a registered extension. struct ExtensionInfo { inline ExtensionInfo() {} - inline ExtensionInfo(FieldType type, bool is_repeated, bool is_packed) - : type(type), is_repeated(is_repeated), is_packed(is_packed), + inline ExtensionInfo(FieldType type_param, bool isrepeated, bool ispacked) + : type(type_param), is_repeated(isrepeated), is_packed(ispacked), descriptor(NULL) {} FieldType type; @@ -138,6 +137,9 @@ class LIBPROTOBUF_EXPORT GeneratedExtensionFinder : public ExtensionFinder { const MessageLite* containing_type_; }; +// A FieldSkipper used for parsing MessageSet. +class MessageSetFieldSkipper; + // Note: extension_set_heavy.cc defines DescriptorPoolExtensionFinder for // finding extensions from a DescriptorPool. @@ -214,6 +216,7 @@ class LIBPROTOBUF_EXPORT ExtensionSet { bool Has(int number) const; int ExtensionSize(int number) const; // Size of a repeated extension. + int NumExtensions() const; // The number of extensions FieldType ExtensionType(int number) const; void ClearExtension(int number); @@ -251,10 +254,35 @@ class LIBPROTOBUF_EXPORT ExtensionSet { const MessageLite& prototype, desc); MessageLite* MutableMessage(const FieldDescriptor* decsriptor, MessageFactory* factory); + // Adds the given message to the ExtensionSet, taking ownership of the + // message object. Existing message with the same number will be deleted. + // If "message" is NULL, this is equivalent to "ClearExtension(number)". + void SetAllocatedMessage(int number, FieldType type, + const FieldDescriptor* descriptor, + MessageLite* message); + MessageLite* ReleaseMessage(int number, const MessageLite& prototype); + MessageLite* ReleaseMessage(const FieldDescriptor* descriptor, + MessageFactory* factory); #undef desc // repeated fields ------------------------------------------------- + // Fetches a RepeatedField extension by number; returns |default_value| + // if no such extension exists. User should not touch this directly; it is + // used by the GetRepeatedExtension() method. + const void* GetRawRepeatedField(int number, const void* default_value) const; + // Fetches a mutable version of a RepeatedField extension by number, + // instantiating one if none exists. Similar to above, user should not use + // this directly; it underlies MutableRepeatedExtension(). + void* MutableRawRepeatedField(int number, FieldType field_type, + bool packed, const FieldDescriptor* desc); + + // This is an overload of MutableRawRepeatedField to maintain compatibility + // with old code using a previous API. This version of + // MutableRawRepeatedField() will GOOGLE_CHECK-fail on a missing extension. + // (E.g.: borg/clients/internal/proto1/proto2_reflection.cc.) + void* MutableRawRepeatedField(int number); + int32 GetRepeatedInt32 (int number, int index) const; int64 GetRepeatedInt64 (int number, int index) const; uint32 GetRepeatedUInt32(int number, int index) const; @@ -296,6 +324,7 @@ class LIBPROTOBUF_EXPORT ExtensionSet { #undef desc void RemoveLast(int number); + MessageLite* ReleaseLast(int number); void SwapElements(int number, int index1, int index2); // ----------------------------------------------------------------- @@ -310,31 +339,35 @@ class LIBPROTOBUF_EXPORT ExtensionSet { void Clear(); void MergeFrom(const ExtensionSet& other); void Swap(ExtensionSet* other); + void SwapExtension(ExtensionSet* other, int number); bool IsInitialized() const; - // Parses a single extension from the input. The input should start out - // positioned immediately after the tag. |containing_type| is the default - // instance for the containing message; it is used only to look up the - // extension by number. See RegisterExtension(), above. Unlike the other - // methods of ExtensionSet, this only works for generated message types -- - // it looks up extensions registered using RegisterExtension(). + // Parses a single extension from the input. The input should start out + // positioned immediately after the tag. bool ParseField(uint32 tag, io::CodedInputStream* input, ExtensionFinder* extension_finder, FieldSkipper* field_skipper); // Specific versions for lite or full messages (constructs the appropriate - // FieldSkipper automatically). + // FieldSkipper automatically). |containing_type| is the default + // instance for the containing message; it is used only to look up the + // extension by number. See RegisterExtension(), above. Unlike the other + // methods of ExtensionSet, this only works for generated message types -- + // it looks up extensions registered using RegisterExtension(). bool ParseField(uint32 tag, io::CodedInputStream* input, const MessageLite* containing_type); bool ParseField(uint32 tag, io::CodedInputStream* input, const Message* containing_type, UnknownFieldSet* unknown_fields); + bool ParseField(uint32 tag, io::CodedInputStream* input, + const MessageLite* containing_type, + io::CodedOutputStream* unknown_fields); // Parse an entire message in MessageSet format. Such messages have no // fields, only extensions. bool ParseMessageSet(io::CodedInputStream* input, ExtensionFinder* extension_finder, - FieldSkipper* field_skipper); + MessageSetFieldSkipper* field_skipper); // Specific versions for lite or full messages (constructs the appropriate // FieldSkipper automatically). @@ -382,18 +415,49 @@ class LIBPROTOBUF_EXPORT ExtensionSet { private: + // Interface of a lazily parsed singular message extension. + class LIBPROTOBUF_EXPORT LazyMessageExtension { + public: + LazyMessageExtension() {} + virtual ~LazyMessageExtension() {} + + virtual LazyMessageExtension* New() const = 0; + virtual const MessageLite& GetMessage( + const MessageLite& prototype) const = 0; + virtual MessageLite* MutableMessage(const MessageLite& prototype) = 0; + virtual void SetAllocatedMessage(MessageLite *message) = 0; + virtual MessageLite* ReleaseMessage(const MessageLite& prototype) = 0; + + virtual bool IsInitialized() const = 0; + virtual int ByteSize() const = 0; + virtual int SpaceUsed() const = 0; + + virtual void MergeFrom(const LazyMessageExtension& other) = 0; + virtual void Clear() = 0; + + virtual bool ReadMessage(const MessageLite& prototype, + io::CodedInputStream* input) = 0; + virtual void WriteMessage(int number, + io::CodedOutputStream* output) const = 0; + virtual uint8* WriteMessageToArray(int number, uint8* target) const = 0; + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LazyMessageExtension); + }; struct Extension { + // The order of these fields packs Extension into 24 bytes when using 8 + // byte alignment. Consider this when adding or removing fields here. union { - int32 int32_value; - int64 int64_value; - uint32 uint32_value; - uint64 uint64_value; - float float_value; - double double_value; - bool bool_value; - int enum_value; - string* string_value; - MessageLite* message_value; + int32 int32_value; + int64 int64_value; + uint32 uint32_value; + uint64 uint64_value; + float float_value; + double double_value; + bool bool_value; + int enum_value; + string* string_value; + MessageLite* message_value; + LazyMessageExtension* lazymessage_value; RepeatedField * repeated_int32_value; RepeatedField * repeated_int64_value; @@ -416,21 +480,28 @@ class LIBPROTOBUF_EXPORT ExtensionSet { // removing it from the map, we just set is_cleared = true. This has no // meaning for repeated types; for those, the size of the RepeatedField // simply becomes zero when cleared. - bool is_cleared; + bool is_cleared : 4; + + // For singular message types, indicates whether lazy parsing is enabled + // for this extension. This field is only valid when type == TYPE_MESSAGE + // and !is_repeated because we only support lazy parsing for singular + // message types currently. If is_lazy = true, the extension is stored in + // lazymessage_value. Otherwise, the extension will be message_value. + bool is_lazy : 4; // For repeated types, this indicates if the [packed=true] option is set. bool is_packed; - // The descriptor for this extension, if one exists and is known. May be - // NULL. Must not be NULL if the descriptor for the extension does not - // live in the same pool as the descriptor for the containing type. - const FieldDescriptor* descriptor; - // For packed fields, the size of the packed data is recorded here when // ByteSize() is called then used during serialization. // TODO(kenton): Use atomic when C++ supports it. mutable int cached_size; + // The descriptor for this extension, if one exists and is known. May be + // NULL. Must not be NULL if the descriptor for the extension does not + // live in the same pool as the descriptor for the containing type. + const FieldDescriptor* descriptor; + // Some helper methods for operations on a single Extension. void SerializeFieldWithCachedSizes( int number, @@ -453,6 +524,40 @@ class LIBPROTOBUF_EXPORT ExtensionSet { }; + // Returns true and fills field_number and extension if extension is found. + // Note to support packed repeated field compatibility, it also fills whether + // the tag on wire is packed, which can be different from + // extension->is_packed (whether packed=true is specified). + bool FindExtensionInfoFromTag(uint32 tag, ExtensionFinder* extension_finder, + int* field_number, ExtensionInfo* extension, + bool* was_packed_on_wire); + + // Returns true and fills extension if extension is found. + // Note to support packed repeated field compatibility, it also fills whether + // the tag on wire is packed, which can be different from + // extension->is_packed (whether packed=true is specified). + bool FindExtensionInfoFromFieldNumber(int wire_type, int field_number, + ExtensionFinder* extension_finder, + ExtensionInfo* extension, + bool* was_packed_on_wire); + + // Parses a single extension from the input. The input should start out + // positioned immediately after the wire tag. This method is called in + // ParseField() after field number and was_packed_on_wire is extracted from + // the wire tag and ExtensionInfo is found by the field number. + bool ParseFieldWithExtensionInfo(int field_number, + bool was_packed_on_wire, + const ExtensionInfo& extension, + io::CodedInputStream* input, + FieldSkipper* field_skipper); + + // Like ParseField(), but this method may parse singular message extensions + // lazily depending on the value of FLAGS_eagerly_parse_message_sets. + bool ParseFieldMaybeLazily(int wire_type, int field_number, + io::CodedInputStream* input, + ExtensionFinder* extension_finder, + MessageSetFieldSkipper* field_skipper); + // Gets the extension with the given number, creating it if it does not // already exist. Returns true if the extension did not already exist. bool MaybeNewExtension(int number, const FieldDescriptor* descriptor, @@ -462,7 +567,7 @@ class LIBPROTOBUF_EXPORT ExtensionSet { // tag has been read. bool ParseMessageSetItem(io::CodedInputStream* input, ExtensionFinder* extension_finder, - FieldSkipper* field_skipper); + MessageSetFieldSkipper* field_skipper); // Hack: RepeatedPtrFieldBase declares ExtensionSet as a friend. This @@ -481,7 +586,7 @@ class LIBPROTOBUF_EXPORT ExtensionSet { // only contain a small number of extensions whereas hash_map is optimized // for 100 elements or more. Also, we want AppendToList() to order fields // by field number. - map extensions_; + std::map extensions_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionSet); }; @@ -517,6 +622,16 @@ inline void ExtensionSet::AddString(int number, FieldType type, // public: // typedef ? ConstType; // typedef ? MutableType; +// // TypeTraits for singular fields and repeated fields will define the +// // symbol "Singular" or "Repeated" respectively. These two symbols will +// // be used in extension accessors to distinguish between singular +// // extensions and repeated extensions. If the TypeTraits for the passed +// // in extension doesn't have the expected symbol defined, it means the +// // user is passing a repeated extension to a singular accessor, or the +// // opposite. In that case the C++ compiler will generate an error +// // message "no matching member function" to inform the user. +// typedef ? Singular +// typedef ? Repeated // // static inline ConstType Get(int number, const ExtensionSet& set); // static inline void Set(int number, ConstType value, ExtensionSet* set); @@ -555,6 +670,8 @@ template class PrimitiveTypeTraits { public: typedef Type ConstType; + typedef Type MutableType; + typedef PrimitiveTypeTraits Singular; static inline ConstType Get(int number, const ExtensionSet& set, ConstType default_value); @@ -566,11 +683,41 @@ template class RepeatedPrimitiveTypeTraits { public: typedef Type ConstType; + typedef Type MutableType; + typedef RepeatedPrimitiveTypeTraits Repeated; + + typedef RepeatedField RepeatedFieldType; static inline Type Get(int number, const ExtensionSet& set, int index); static inline void Set(int number, int index, Type value, ExtensionSet* set); static inline void Add(int number, FieldType field_type, bool is_packed, Type value, ExtensionSet* set); + + static inline const RepeatedField& + GetRepeated(int number, const ExtensionSet& set); + static inline RepeatedField* + MutableRepeated(int number, FieldType field_type, + bool is_packed, ExtensionSet* set); + + static const RepeatedFieldType* GetDefaultRepeatedField(); +}; + +// Declared here so that this can be friended below. +void InitializeDefaultRepeatedFields(); +void DestroyDefaultRepeatedFields(); + +class LIBPROTOBUF_EXPORT RepeatedPrimitiveGenericTypeTraits { + private: + template friend class RepeatedPrimitiveTypeTraits; + friend void InitializeDefaultRepeatedFields(); + friend void DestroyDefaultRepeatedFields(); + static const RepeatedField* default_repeated_field_int32_; + static const RepeatedField* default_repeated_field_int64_; + static const RepeatedField* default_repeated_field_uint32_; + static const RepeatedField* default_repeated_field_uint64_; + static const RepeatedField* default_repeated_field_double_; + static const RepeatedField* default_repeated_field_float_; + static const RepeatedField* default_repeated_field_bool_; }; #define PROTOBUF_DEFINE_PRIMITIVE_TYPE(TYPE, METHOD) \ @@ -595,6 +742,26 @@ template<> inline void RepeatedPrimitiveTypeTraits::Add( \ int number, FieldType field_type, bool is_packed, \ TYPE value, ExtensionSet* set) { \ set->Add##METHOD(number, field_type, is_packed, value, NULL); \ +} \ +template<> inline const RepeatedField* \ + RepeatedPrimitiveTypeTraits::GetDefaultRepeatedField() { \ + return RepeatedPrimitiveGenericTypeTraits:: \ + default_repeated_field_##TYPE##_; \ +} \ +template<> inline const RepeatedField& \ + RepeatedPrimitiveTypeTraits::GetRepeated(int number, \ + const ExtensionSet& set) { \ + return *reinterpret_cast*>( \ + set.GetRawRepeatedField( \ + number, GetDefaultRepeatedField())); \ +} \ +template<> inline RepeatedField* \ + RepeatedPrimitiveTypeTraits::MutableRepeated(int number, \ + FieldType field_type, \ + bool is_packed, \ + ExtensionSet* set) { \ + return reinterpret_cast*>( \ + set->MutableRawRepeatedField(number, field_type, is_packed, NULL)); \ } PROTOBUF_DEFINE_PRIMITIVE_TYPE( int32, Int32) @@ -615,6 +782,7 @@ class LIBPROTOBUF_EXPORT StringTypeTraits { public: typedef const string& ConstType; typedef string* MutableType; + typedef StringTypeTraits Singular; static inline const string& Get(int number, const ExtensionSet& set, ConstType default_value) { @@ -634,6 +802,9 @@ class LIBPROTOBUF_EXPORT RepeatedStringTypeTraits { public: typedef const string& ConstType; typedef string* MutableType; + typedef RepeatedStringTypeTraits Repeated; + + typedef RepeatedPtrField RepeatedFieldType; static inline const string& Get(int number, const ExtensionSet& set, int index) { @@ -655,6 +826,28 @@ class LIBPROTOBUF_EXPORT RepeatedStringTypeTraits { ExtensionSet* set) { return set->AddString(number, field_type, NULL); } + static inline const RepeatedPtrField& + GetRepeated(int number, const ExtensionSet& set) { + return *reinterpret_cast*>( + set.GetRawRepeatedField(number, GetDefaultRepeatedField())); + } + + static inline RepeatedPtrField* + MutableRepeated(int number, FieldType field_type, + bool is_packed, ExtensionSet* set) { + return reinterpret_cast*>( + set->MutableRawRepeatedField(number, field_type, + is_packed, NULL)); + } + + static const RepeatedFieldType* GetDefaultRepeatedField() { + return default_repeated_field_; + } + + private: + friend void InitializeDefaultRepeatedFields(); + friend void DestroyDefaultRepeatedFields(); + static const RepeatedFieldType *default_repeated_field_; }; // ------------------------------------------------------------------- @@ -666,6 +859,8 @@ template class EnumTypeTraits { public: typedef Type ConstType; + typedef Type MutableType; + typedef EnumTypeTraits Singular; static inline ConstType Get(int number, const ExtensionSet& set, ConstType default_value) { @@ -682,6 +877,10 @@ template class RepeatedEnumTypeTraits { public: typedef Type ConstType; + typedef Type MutableType; + typedef RepeatedEnumTypeTraits Repeated; + + typedef RepeatedField RepeatedFieldType; static inline ConstType Get(int number, const ExtensionSet& set, int index) { return static_cast(set.GetRepeatedEnum(number, index)); @@ -696,6 +895,35 @@ class RepeatedEnumTypeTraits { GOOGLE_DCHECK(IsValid(value)); set->AddEnum(number, field_type, is_packed, value, NULL); } + static inline const RepeatedField& GetRepeated(int number, + const ExtensionSet& + set) { + // Hack: the `Extension` struct stores a RepeatedField for enums. + // RepeatedField cannot implicitly convert to RepeatedField + // so we need to do some casting magic. See message.h for similar + // contortions for non-extension fields. + return *reinterpret_cast*>( + set.GetRawRepeatedField(number, GetDefaultRepeatedField())); + } + + static inline RepeatedField* MutableRepeated(int number, + FieldType field_type, + bool is_packed, + ExtensionSet* set) { + return reinterpret_cast*>( + set->MutableRawRepeatedField(number, field_type, is_packed, NULL)); + } + + static const RepeatedFieldType* GetDefaultRepeatedField() { + // Hack: as noted above, repeated enum fields are internally stored as a + // RepeatedField. We need to be able to instantiate global static + // objects to return as default (empty) repeated fields on non-existent + // extensions. We would not be able to know a-priori all of the enum types + // (values of |Type|) to instantiate all of these, so we just re-use int32's + // default repeated field object. + return reinterpret_cast*>( + RepeatedPrimitiveTypeTraits::GetDefaultRepeatedField()); + } }; // ------------------------------------------------------------------- @@ -709,6 +937,7 @@ class MessageTypeTraits { public: typedef const Type& ConstType; typedef Type* MutableType; + typedef MessageTypeTraits Singular; static inline ConstType Get(int number, const ExtensionSet& set, ConstType default_value) { @@ -720,13 +949,28 @@ class MessageTypeTraits { return static_cast( set->MutableMessage(number, field_type, Type::default_instance(), NULL)); } + static inline void SetAllocated(int number, FieldType field_type, + MutableType message, ExtensionSet* set) { + set->SetAllocatedMessage(number, field_type, NULL, message); + } + static inline MutableType Release(int number, FieldType /* field_type */, + ExtensionSet* set) { + return static_cast(set->ReleaseMessage( + number, Type::default_instance())); + } }; +// forward declaration +class RepeatedMessageGenericTypeTraits; + template class RepeatedMessageTypeTraits { public: typedef const Type& ConstType; typedef Type* MutableType; + typedef RepeatedMessageTypeTraits Repeated; + + typedef RepeatedPtrField RepeatedFieldType; static inline ConstType Get(int number, const ExtensionSet& set, int index) { return static_cast(set.GetRepeatedMessage(number, index)); @@ -739,8 +983,47 @@ class RepeatedMessageTypeTraits { return static_cast( set->AddMessage(number, field_type, Type::default_instance(), NULL)); } + static inline const RepeatedPtrField& GetRepeated(int number, + const ExtensionSet& + set) { + // See notes above in RepeatedEnumTypeTraits::GetRepeated(): same + // casting hack applies here, because a RepeatedPtrField + // cannot naturally become a RepeatedPtrType even though Type is + // presumably a message. google::protobuf::Message goes through similar contortions + // with a reinterpret_cast<>. + return *reinterpret_cast*>( + set.GetRawRepeatedField(number, GetDefaultRepeatedField())); + } + static inline RepeatedPtrField* MutableRepeated(int number, + FieldType field_type, + bool is_packed, + ExtensionSet* set) { + return reinterpret_cast*>( + set->MutableRawRepeatedField(number, field_type, is_packed, NULL)); + } + + static const RepeatedFieldType* GetDefaultRepeatedField(); }; +// This class exists only to hold a generic default empty repeated field for all +// message-type repeated field extensions. +class LIBPROTOBUF_EXPORT RepeatedMessageGenericTypeTraits { + public: + typedef RepeatedPtrField< ::google::protobuf::MessageLite*> RepeatedFieldType; + private: + template friend class RepeatedMessageTypeTraits; + friend void InitializeDefaultRepeatedFields(); + friend void DestroyDefaultRepeatedFields(); + static const RepeatedFieldType* default_repeated_field_; +}; + +template inline + const typename RepeatedMessageTypeTraits::RepeatedFieldType* + RepeatedMessageTypeTraits::GetDefaultRepeatedField() { + return reinterpret_cast( + RepeatedMessageGenericTypeTraits::default_repeated_field_); +} + // ------------------------------------------------------------------- // ExtensionIdentifier @@ -787,114 +1070,161 @@ class ExtensionIdentifier { // causes problems if the class has a nested message or enum type with that // name and "_TypeTraits" is technically reserved for the C++ library since // it starts with an underscore followed by a capital letter. +// +// For similar reason, we use "_field_type" and "_is_packed" as parameter names +// below, so that "field_type" and "is_packed" can be used as field names. #define GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(CLASSNAME) \ /* Has, Size, Clear */ \ template \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ inline bool HasExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ return _extensions_.Has(id.number()); \ } \ \ template \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ inline void ClearExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ _extensions_.ClearExtension(id.number()); \ } \ \ template \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ inline int ExtensionSize( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ return _extensions_.ExtensionSize(id.number()); \ } \ \ /* Singular accessors */ \ template \ - inline typename _proto_TypeTraits::ConstType GetExtension( \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ + inline typename _proto_TypeTraits::Singular::ConstType GetExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ return _proto_TypeTraits::Get(id.number(), _extensions_, \ id.default_value()); \ } \ \ template \ - inline typename _proto_TypeTraits::MutableType MutableExtension( \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ + inline typename _proto_TypeTraits::Singular::MutableType MutableExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ - return _proto_TypeTraits::Mutable(id.number(), field_type, &_extensions_);\ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ + return _proto_TypeTraits::Mutable(id.number(), _field_type, \ + &_extensions_); \ } \ \ template \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ inline void SetExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ - typename _proto_TypeTraits::ConstType value) { \ - _proto_TypeTraits::Set(id.number(), field_type, value, &_extensions_); \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ + typename _proto_TypeTraits::Singular::ConstType value) { \ + _proto_TypeTraits::Set(id.number(), _field_type, value, &_extensions_); \ + } \ + \ + template \ + inline void SetAllocatedExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ + typename _proto_TypeTraits::Singular::MutableType value) { \ + _proto_TypeTraits::SetAllocated(id.number(), _field_type, \ + value, &_extensions_); \ + } \ + template \ + inline typename _proto_TypeTraits::Singular::MutableType ReleaseExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ + return _proto_TypeTraits::Release(id.number(), _field_type, \ + &_extensions_); \ } \ \ /* Repeated accessors */ \ template \ - inline typename _proto_TypeTraits::ConstType GetExtension( \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ + inline typename _proto_TypeTraits::Repeated::ConstType GetExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ int index) const { \ return _proto_TypeTraits::Get(id.number(), _extensions_, index); \ } \ \ template \ - inline typename _proto_TypeTraits::MutableType MutableExtension( \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ + inline typename _proto_TypeTraits::Repeated::MutableType MutableExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ int index) { \ return _proto_TypeTraits::Mutable(id.number(), index, &_extensions_); \ } \ \ template \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ inline void SetExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ - int index, typename _proto_TypeTraits::ConstType value) { \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ + int index, typename _proto_TypeTraits::Repeated::ConstType value) { \ _proto_TypeTraits::Set(id.number(), index, value, &_extensions_); \ } \ \ template \ - inline typename _proto_TypeTraits::MutableType AddExtension( \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ + inline typename _proto_TypeTraits::Repeated::MutableType AddExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ - return _proto_TypeTraits::Add(id.number(), field_type, &_extensions_); \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ + return _proto_TypeTraits::Add(id.number(), _field_type, &_extensions_); \ } \ \ template \ + ::google::protobuf::internal::FieldType _field_type, \ + bool _is_packed> \ inline void AddExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ - CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ - typename _proto_TypeTraits::ConstType value) { \ - _proto_TypeTraits::Add(id.number(), field_type, is_packed, \ + CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ + typename _proto_TypeTraits::Repeated::ConstType value) { \ + _proto_TypeTraits::Add(id.number(), _field_type, _is_packed, \ value, &_extensions_); \ + } \ + \ + template \ + inline const typename _proto_TypeTraits::Repeated::RepeatedFieldType& \ + GetRepeatedExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, _field_type, \ + _is_packed>& id) const { \ + return _proto_TypeTraits::GetRepeated(id.number(), _extensions_); \ + } \ + \ + template \ + inline typename _proto_TypeTraits::Repeated::RepeatedFieldType* \ + MutableRepeatedExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, _field_type, \ + _is_packed>& id) { \ + return _proto_TypeTraits::MutableRepeated(id.number(), _field_type, \ + _is_packed, &_extensions_); \ } } // namespace internal diff --git a/toolkit/components/protobuf/src/google/protobuf/extension_set_heavy.cc b/toolkit/components/protobuf/src/google/protobuf/extension_set_heavy.cc new file mode 100644 index 0000000000000..eae4d574f8925 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/extension_set_heavy.cc @@ -0,0 +1,734 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Contains methods defined in extension_set.h which cannot be part of the +// lite library because they use descriptors or reflection. + +#include +#include +#include +#include +#include +#include +#include + +namespace google { + +namespace protobuf { +namespace internal { + +// A FieldSkipper used to store unknown MessageSet fields into UnknownFieldSet. +class MessageSetFieldSkipper + : public UnknownFieldSetFieldSkipper { + public: + explicit MessageSetFieldSkipper(UnknownFieldSet* unknown_fields) + : UnknownFieldSetFieldSkipper(unknown_fields) {} + virtual ~MessageSetFieldSkipper() {} + + virtual bool SkipMessageSetField(io::CodedInputStream* input, + int field_number); +}; +bool MessageSetFieldSkipper::SkipMessageSetField( + io::CodedInputStream* input, int field_number) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (unknown_fields_ == NULL) { + return input->Skip(length); + } else { + return input->ReadString( + unknown_fields_->AddLengthDelimited(field_number), length); + } +} + + +// Implementation of ExtensionFinder which finds extensions in a given +// DescriptorPool, using the given MessageFactory to construct sub-objects. +// This class is implemented in extension_set_heavy.cc. +class DescriptorPoolExtensionFinder : public ExtensionFinder { + public: + DescriptorPoolExtensionFinder(const DescriptorPool* pool, + MessageFactory* factory, + const Descriptor* containing_type) + : pool_(pool), factory_(factory), containing_type_(containing_type) {} + virtual ~DescriptorPoolExtensionFinder() {} + + virtual bool Find(int number, ExtensionInfo* output); + + private: + const DescriptorPool* pool_; + MessageFactory* factory_; + const Descriptor* containing_type_; +}; + +void ExtensionSet::AppendToList(const Descriptor* containing_type, + const DescriptorPool* pool, + vector* output) const { + for (map::const_iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + bool has = false; + if (iter->second.is_repeated) { + has = iter->second.GetSize() > 0; + } else { + has = !iter->second.is_cleared; + } + + if (has) { + // TODO(kenton): Looking up each field by number is somewhat unfortunate. + // Is there a better way? The problem is that descriptors are lazily- + // initialized, so they might not even be constructed until + // AppendToList() is called. + + if (iter->second.descriptor == NULL) { + output->push_back(pool->FindExtensionByNumber( + containing_type, iter->first)); + } else { + output->push_back(iter->second.descriptor); + } + } + } +} + +inline FieldDescriptor::Type real_type(FieldType type) { + GOOGLE_DCHECK(type > 0 && type <= FieldDescriptor::MAX_TYPE); + return static_cast(type); +} + +inline FieldDescriptor::CppType cpp_type(FieldType type) { + return FieldDescriptor::TypeToCppType( + static_cast(type)); +} + +inline WireFormatLite::FieldType field_type(FieldType type) { + GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE); + return static_cast(type); +} + +#define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \ + GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? FieldDescriptor::LABEL_REPEATED \ + : FieldDescriptor::LABEL_OPTIONAL, \ + FieldDescriptor::LABEL_##LABEL); \ + GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), FieldDescriptor::CPPTYPE_##CPPTYPE) + +const MessageLite& ExtensionSet::GetMessage(int number, + const Descriptor* message_type, + MessageFactory* factory) const { + map::const_iterator iter = extensions_.find(number); + if (iter == extensions_.end() || iter->second.is_cleared) { + // Not present. Return the default value. + return *factory->GetPrototype(message_type); + } else { + GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); + if (iter->second.is_lazy) { + return iter->second.lazymessage_value->GetMessage( + *factory->GetPrototype(message_type)); + } else { + return *iter->second.message_value; + } + } +} + +MessageLite* ExtensionSet::MutableMessage(const FieldDescriptor* descriptor, + MessageFactory* factory) { + Extension* extension; + if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) { + extension->type = descriptor->type(); + GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE); + extension->is_repeated = false; + extension->is_packed = false; + const MessageLite* prototype = + factory->GetPrototype(descriptor->message_type()); + extension->is_lazy = false; + extension->message_value = prototype->New(); + extension->is_cleared = false; + return extension->message_value; + } else { + GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); + extension->is_cleared = false; + if (extension->is_lazy) { + return extension->lazymessage_value->MutableMessage( + *factory->GetPrototype(descriptor->message_type())); + } else { + return extension->message_value; + } + } +} + +MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, + MessageFactory* factory) { + map::iterator iter = extensions_.find(descriptor->number()); + if (iter == extensions_.end()) { + // Not present. Return NULL. + return NULL; + } else { + GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); + MessageLite* ret = NULL; + if (iter->second.is_lazy) { + ret = iter->second.lazymessage_value->ReleaseMessage( + *factory->GetPrototype(descriptor->message_type())); + delete iter->second.lazymessage_value; + } else { + ret = iter->second.message_value; + } + extensions_.erase(descriptor->number()); + return ret; + } +} + +MessageLite* ExtensionSet::AddMessage(const FieldDescriptor* descriptor, + MessageFactory* factory) { + Extension* extension; + if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) { + extension->type = descriptor->type(); + GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE); + extension->is_repeated = true; + extension->repeated_message_value = + new RepeatedPtrField(); + } else { + GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); + } + + // RepeatedPtrField does not know how to Add() since it cannot + // allocate an abstract object, so we have to be tricky. + MessageLite* result = extension->repeated_message_value + ->AddFromCleared >(); + if (result == NULL) { + const MessageLite* prototype; + if (extension->repeated_message_value->size() == 0) { + prototype = factory->GetPrototype(descriptor->message_type()); + GOOGLE_CHECK(prototype != NULL); + } else { + prototype = &extension->repeated_message_value->Get(0); + } + result = prototype->New(); + extension->repeated_message_value->AddAllocated(result); + } + return result; +} + +static bool ValidateEnumUsingDescriptor(const void* arg, int number) { + return reinterpret_cast(arg) + ->FindValueByNumber(number) != NULL; +} + +bool DescriptorPoolExtensionFinder::Find(int number, ExtensionInfo* output) { + const FieldDescriptor* extension = + pool_->FindExtensionByNumber(containing_type_, number); + if (extension == NULL) { + return false; + } else { + output->type = extension->type(); + output->is_repeated = extension->is_repeated(); + output->is_packed = extension->options().packed(); + output->descriptor = extension; + if (extension->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + output->message_prototype = + factory_->GetPrototype(extension->message_type()); + GOOGLE_CHECK(output->message_prototype != NULL) + << "Extension factory's GetPrototype() returned NULL for extension: " + << extension->full_name(); + } else if (extension->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { + output->enum_validity_check.func = ValidateEnumUsingDescriptor; + output->enum_validity_check.arg = extension->enum_type(); + } + + return true; + } +} + +bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, + const Message* containing_type, + UnknownFieldSet* unknown_fields) { + UnknownFieldSetFieldSkipper skipper(unknown_fields); + if (input->GetExtensionPool() == NULL) { + GeneratedExtensionFinder finder(containing_type); + return ParseField(tag, input, &finder, &skipper); + } else { + DescriptorPoolExtensionFinder finder(input->GetExtensionPool(), + input->GetExtensionFactory(), + containing_type->GetDescriptor()); + return ParseField(tag, input, &finder, &skipper); + } +} + +bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, + const Message* containing_type, + UnknownFieldSet* unknown_fields) { + MessageSetFieldSkipper skipper(unknown_fields); + if (input->GetExtensionPool() == NULL) { + GeneratedExtensionFinder finder(containing_type); + return ParseMessageSet(input, &finder, &skipper); + } else { + DescriptorPoolExtensionFinder finder(input->GetExtensionPool(), + input->GetExtensionFactory(), + containing_type->GetDescriptor()); + return ParseMessageSet(input, &finder, &skipper); + } +} + +int ExtensionSet::SpaceUsedExcludingSelf() const { + int total_size = + extensions_.size() * sizeof(map::value_type); + for (map::const_iterator iter = extensions_.begin(), + end = extensions_.end(); + iter != end; + ++iter) { + total_size += iter->second.SpaceUsedExcludingSelf(); + } + return total_size; +} + +inline int ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelf( + RepeatedPtrFieldBase* field) { + return field->SpaceUsedExcludingSelf >(); +} + +int ExtensionSet::Extension::SpaceUsedExcludingSelf() const { + int total_size = 0; + if (is_repeated) { + switch (cpp_type(type)) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE: \ + total_size += sizeof(*repeated_##LOWERCASE##_value) + \ + repeated_##LOWERCASE##_value->SpaceUsedExcludingSelf();\ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE( UINT32, uint32); + HANDLE_TYPE( UINT64, uint64); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( DOUBLE, double); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, enum); + HANDLE_TYPE( STRING, string); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_MESSAGE: + // repeated_message_value is actually a RepeatedPtrField, + // but MessageLite has no SpaceUsed(), so we must directly call + // RepeatedPtrFieldBase::SpaceUsedExcludingSelf() with a different type + // handler. + total_size += sizeof(*repeated_message_value) + + RepeatedMessage_SpaceUsedExcludingSelf(repeated_message_value); + break; + } + } else { + switch (cpp_type(type)) { + case FieldDescriptor::CPPTYPE_STRING: + total_size += sizeof(*string_value) + + StringSpaceUsedExcludingSelf(*string_value); + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + if (is_lazy) { + total_size += lazymessage_value->SpaceUsed(); + } else { + total_size += down_cast(message_value)->SpaceUsed(); + } + break; + default: + // No extra storage costs for primitive types. + break; + } + } + return total_size; +} + +// The Serialize*ToArray methods are only needed in the heavy library, as +// the lite library only generates SerializeWithCachedSizes. +uint8* ExtensionSet::SerializeWithCachedSizesToArray( + int start_field_number, int end_field_number, + uint8* target) const { + map::const_iterator iter; + for (iter = extensions_.lower_bound(start_field_number); + iter != extensions_.end() && iter->first < end_field_number; + ++iter) { + target = iter->second.SerializeFieldWithCachedSizesToArray(iter->first, + target); + } + return target; +} + +uint8* ExtensionSet::SerializeMessageSetWithCachedSizesToArray( + uint8* target) const { + map::const_iterator iter; + for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) { + target = iter->second.SerializeMessageSetItemWithCachedSizesToArray( + iter->first, target); + } + return target; +} + +uint8* ExtensionSet::Extension::SerializeFieldWithCachedSizesToArray( + int number, uint8* target) const { + if (is_repeated) { + if (is_packed) { + if (cached_size == 0) return target; + + target = WireFormatLite::WriteTagToArray(number, + WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target); + target = WireFormatLite::WriteInt32NoTagToArray(cached_size, target); + + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case FieldDescriptor::TYPE_##UPPERCASE: \ + for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ + target = WireFormatLite::Write##CAMELCASE##NoTagToArray( \ + repeated_##LOWERCASE##_value->Get(i), target); \ + } \ + break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, SInt32, int32); + HANDLE_TYPE( SINT64, SInt64, int64); + HANDLE_TYPE( FIXED32, Fixed32, uint32); + HANDLE_TYPE( FIXED64, Fixed64, uint64); + HANDLE_TYPE(SFIXED32, SFixed32, int32); + HANDLE_TYPE(SFIXED64, SFixed64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); + HANDLE_TYPE( ENUM, Enum, enum); +#undef HANDLE_TYPE + + case WireFormatLite::TYPE_STRING: + case WireFormatLite::TYPE_BYTES: + case WireFormatLite::TYPE_GROUP: + case WireFormatLite::TYPE_MESSAGE: + GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; + break; + } + } else { + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case FieldDescriptor::TYPE_##UPPERCASE: \ + for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ + target = WireFormatLite::Write##CAMELCASE##ToArray(number, \ + repeated_##LOWERCASE##_value->Get(i), target); \ + } \ + break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, SInt32, int32); + HANDLE_TYPE( SINT64, SInt64, int64); + HANDLE_TYPE( FIXED32, Fixed32, uint32); + HANDLE_TYPE( FIXED64, Fixed64, uint64); + HANDLE_TYPE(SFIXED32, SFixed32, int32); + HANDLE_TYPE(SFIXED64, SFixed64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); + HANDLE_TYPE( STRING, String, string); + HANDLE_TYPE( BYTES, Bytes, string); + HANDLE_TYPE( ENUM, Enum, enum); + HANDLE_TYPE( GROUP, Group, message); + HANDLE_TYPE( MESSAGE, Message, message); +#undef HANDLE_TYPE + } + } + } else if (!is_cleared) { + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \ + case FieldDescriptor::TYPE_##UPPERCASE: \ + target = WireFormatLite::Write##CAMELCASE##ToArray( \ + number, VALUE, target); \ + break + + HANDLE_TYPE( INT32, Int32, int32_value); + HANDLE_TYPE( INT64, Int64, int64_value); + HANDLE_TYPE( UINT32, UInt32, uint32_value); + HANDLE_TYPE( UINT64, UInt64, uint64_value); + HANDLE_TYPE( SINT32, SInt32, int32_value); + HANDLE_TYPE( SINT64, SInt64, int64_value); + HANDLE_TYPE( FIXED32, Fixed32, uint32_value); + HANDLE_TYPE( FIXED64, Fixed64, uint64_value); + HANDLE_TYPE(SFIXED32, SFixed32, int32_value); + HANDLE_TYPE(SFIXED64, SFixed64, int64_value); + HANDLE_TYPE( FLOAT, Float, float_value); + HANDLE_TYPE( DOUBLE, Double, double_value); + HANDLE_TYPE( BOOL, Bool, bool_value); + HANDLE_TYPE( STRING, String, *string_value); + HANDLE_TYPE( BYTES, Bytes, *string_value); + HANDLE_TYPE( ENUM, Enum, enum_value); + HANDLE_TYPE( GROUP, Group, *message_value); +#undef HANDLE_TYPE + case FieldDescriptor::TYPE_MESSAGE: + if (is_lazy) { + target = lazymessage_value->WriteMessageToArray(number, target); + } else { + target = WireFormatLite::WriteMessageToArray( + number, *message_value, target); + } + break; + } + } + return target; +} + +uint8* ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizesToArray( + int number, + uint8* target) const { + if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { + // Not a valid MessageSet extension, but serialize it the normal way. + GOOGLE_LOG(WARNING) << "Invalid message set extension."; + return SerializeFieldWithCachedSizesToArray(number, target); + } + + if (is_cleared) return target; + + // Start group. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetItemStartTag, target); + // Write type ID. + target = WireFormatLite::WriteUInt32ToArray( + WireFormatLite::kMessageSetTypeIdNumber, number, target); + // Write message. + if (is_lazy) { + target = lazymessage_value->WriteMessageToArray( + WireFormatLite::kMessageSetMessageNumber, target); + } else { + target = WireFormatLite::WriteMessageToArray( + WireFormatLite::kMessageSetMessageNumber, *message_value, target); + } + // End group. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetItemEndTag, target); + return target; +} + + +bool ExtensionSet::ParseFieldMaybeLazily( + int wire_type, int field_number, io::CodedInputStream* input, + ExtensionFinder* extension_finder, + MessageSetFieldSkipper* field_skipper) { + return ParseField(WireFormatLite::MakeTag( + field_number, static_cast(wire_type)), + input, extension_finder, field_skipper); +} + +bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, + ExtensionFinder* extension_finder, + MessageSetFieldSkipper* field_skipper) { + while (true) { + const uint32 tag = input->ReadTag(); + switch (tag) { + case 0: + return true; + case WireFormatLite::kMessageSetItemStartTag: + if (!ParseMessageSetItem(input, extension_finder, field_skipper)) { + return false; + } + break; + default: + if (!ParseField(tag, input, extension_finder, field_skipper)) { + return false; + } + break; + } + } +} + +bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, + const MessageLite* containing_type) { + MessageSetFieldSkipper skipper(NULL); + GeneratedExtensionFinder finder(containing_type); + return ParseMessageSet(input, &finder, &skipper); +} + +bool ExtensionSet::ParseMessageSetItem(io::CodedInputStream* input, + ExtensionFinder* extension_finder, + MessageSetFieldSkipper* field_skipper) { + // TODO(kenton): It would be nice to share code between this and + // WireFormatLite::ParseAndMergeMessageSetItem(), but I think the + // differences would be hard to factor out. + + // This method parses a group which should contain two fields: + // required int32 type_id = 2; + // required data message = 3; + + uint32 last_type_id = 0; + + // If we see message data before the type_id, we'll append it to this so + // we can parse it later. + string message_data; + + while (true) { + const uint32 tag = input->ReadTag(); + if (tag == 0) return false; + + switch (tag) { + case WireFormatLite::kMessageSetTypeIdTag: { + uint32 type_id; + if (!input->ReadVarint32(&type_id)) return false; + last_type_id = type_id; + + if (!message_data.empty()) { + // We saw some message data before the type_id. Have to parse it + // now. + io::CodedInputStream sub_input( + reinterpret_cast(message_data.data()), + message_data.size()); + if (!ParseFieldMaybeLazily(WireFormatLite::WIRETYPE_LENGTH_DELIMITED, + last_type_id, &sub_input, + extension_finder, field_skipper)) { + return false; + } + message_data.clear(); + } + + break; + } + + case WireFormatLite::kMessageSetMessageTag: { + if (last_type_id == 0) { + // We haven't seen a type_id yet. Append this data to message_data. + string temp; + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (!input->ReadString(&temp, length)) return false; + io::StringOutputStream output_stream(&message_data); + io::CodedOutputStream coded_output(&output_stream); + coded_output.WriteVarint32(length); + coded_output.WriteString(temp); + } else { + // Already saw type_id, so we can parse this directly. + if (!ParseFieldMaybeLazily(WireFormatLite::WIRETYPE_LENGTH_DELIMITED, + last_type_id, input, + extension_finder, field_skipper)) { + return false; + } + } + + break; + } + + case WireFormatLite::kMessageSetItemEndTag: { + return true; + } + + default: { + if (!field_skipper->SkipField(input, tag)) return false; + } + } + } +} + +void ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizes( + int number, + io::CodedOutputStream* output) const { + if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { + // Not a valid MessageSet extension, but serialize it the normal way. + SerializeFieldWithCachedSizes(number, output); + return; + } + + if (is_cleared) return; + + // Start group. + output->WriteTag(WireFormatLite::kMessageSetItemStartTag); + + // Write type ID. + WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber, + number, + output); + // Write message. + if (is_lazy) { + lazymessage_value->WriteMessage( + WireFormatLite::kMessageSetMessageNumber, output); + } else { + WireFormatLite::WriteMessageMaybeToArray( + WireFormatLite::kMessageSetMessageNumber, + *message_value, + output); + } + + // End group. + output->WriteTag(WireFormatLite::kMessageSetItemEndTag); +} + +int ExtensionSet::Extension::MessageSetItemByteSize(int number) const { + if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { + // Not a valid MessageSet extension, but compute the byte size for it the + // normal way. + return ByteSize(number); + } + + if (is_cleared) return 0; + + int our_size = WireFormatLite::kMessageSetItemTagsSize; + + // type_id + our_size += io::CodedOutputStream::VarintSize32(number); + + // message + int message_size = 0; + if (is_lazy) { + message_size = lazymessage_value->ByteSize(); + } else { + message_size = message_value->ByteSize(); + } + + our_size += io::CodedOutputStream::VarintSize32(message_size); + our_size += message_size; + + return our_size; +} + +void ExtensionSet::SerializeMessageSetWithCachedSizes( + io::CodedOutputStream* output) const { + for (map::const_iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + iter->second.SerializeMessageSetItemWithCachedSizes(iter->first, output); + } +} + +int ExtensionSet::MessageSetByteSize() const { + int total_size = 0; + + for (map::const_iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + total_size += iter->second.MessageSetItemByteSize(iter->first); + } + + return total_size; +} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/generated_enum_reflection.h b/toolkit/components/protobuf/src/google/protobuf/generated_enum_reflection.h new file mode 100644 index 0000000000000..3852cea5804e4 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/generated_enum_reflection.h @@ -0,0 +1,91 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: jasonh@google.com (Jason Hsueh) +// +// This header is logically internal, but is made public because it is used +// from protocol-compiler-generated code, which may reside in other components. +// It provides reflection support for generated enums, and is included in +// generated .pb.h files and should have minimal dependencies. The methods are +// implemented in generated_message_reflection.cc. + +#ifndef GOOGLE_PROTOBUF_GENERATED_ENUM_REFLECTION_H__ +#define GOOGLE_PROTOBUF_GENERATED_ENUM_REFLECTION_H__ + +#include + +#include + +namespace google { +namespace protobuf { + class EnumDescriptor; +} // namespace protobuf + +namespace protobuf { + +// This type trait can be used to cause templates to only match proto2 enum +// types. +template struct is_proto_enum : ::google::protobuf::internal::false_type {}; + +// Returns the EnumDescriptor for enum type E, which must be a +// proto-declared enum type. Code generated by the protocol compiler +// will include specializations of this template for each enum type declared. +template +const EnumDescriptor* GetEnumDescriptor(); + +namespace internal { + +// Helper for EnumType_Parse functions: try to parse the string 'name' as an +// enum name of the given type, returning true and filling in value on success, +// or returning false and leaving value unchanged on failure. +LIBPROTOBUF_EXPORT bool ParseNamedEnum(const EnumDescriptor* descriptor, + const string& name, + int* value); + +template +bool ParseNamedEnum(const EnumDescriptor* descriptor, + const string& name, + EnumType* value) { + int tmp; + if (!ParseNamedEnum(descriptor, name, &tmp)) return false; + *value = static_cast(tmp); + return true; +} + +// Just a wrapper around printing the name of a value. The main point of this +// function is not to be inlined, so that you can do this without including +// descriptor.h. +LIBPROTOBUF_EXPORT const string& NameOfEnum(const EnumDescriptor* descriptor, int value); + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_GENERATED_ENUM_REFLECTION_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/generated_message_reflection.cc b/toolkit/components/protobuf/src/google/protobuf/generated_message_reflection.cc new file mode 100644 index 0000000000000..536de7d92f6ec --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/generated_message_reflection.cc @@ -0,0 +1,1683 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GOOGLE_PROTOBUF_HAS_ONEOF + +namespace google { +namespace protobuf { +namespace internal { + +int StringSpaceUsedExcludingSelf(const string& str) { + const void* start = &str; + const void* end = &str + 1; + + if (start <= str.data() && str.data() < end) { + // The string's data is stored inside the string object itself. + return 0; + } else { + return str.capacity(); + } +} + +bool ParseNamedEnum(const EnumDescriptor* descriptor, + const string& name, + int* value) { + const EnumValueDescriptor* d = descriptor->FindValueByName(name); + if (d == NULL) return false; + *value = d->number(); + return true; +} + +const string& NameOfEnum(const EnumDescriptor* descriptor, int value) { + const EnumValueDescriptor* d = descriptor->FindValueByNumber(value); + return (d == NULL ? GetEmptyString() : d->name()); +} + +// =================================================================== +// Helpers for reporting usage errors (e.g. trying to use GetInt32() on +// a string field). + +namespace { + +void ReportReflectionUsageError( + const Descriptor* descriptor, const FieldDescriptor* field, + const char* method, const char* description) { + GOOGLE_LOG(FATAL) + << "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::" << method << "\n" + " Message type: " << descriptor->full_name() << "\n" + " Field : " << field->full_name() << "\n" + " Problem : " << description; +} + +const char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = { + "INVALID_CPPTYPE", + "CPPTYPE_INT32", + "CPPTYPE_INT64", + "CPPTYPE_UINT32", + "CPPTYPE_UINT64", + "CPPTYPE_DOUBLE", + "CPPTYPE_FLOAT", + "CPPTYPE_BOOL", + "CPPTYPE_ENUM", + "CPPTYPE_STRING", + "CPPTYPE_MESSAGE" +}; + +static void ReportReflectionUsageTypeError( + const Descriptor* descriptor, const FieldDescriptor* field, + const char* method, + FieldDescriptor::CppType expected_type) { + GOOGLE_LOG(FATAL) + << "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::" << method << "\n" + " Message type: " << descriptor->full_name() << "\n" + " Field : " << field->full_name() << "\n" + " Problem : Field is not the right type for this message:\n" + " Expected : " << cpptype_names_[expected_type] << "\n" + " Field type: " << cpptype_names_[field->cpp_type()]; +} + +static void ReportReflectionUsageEnumTypeError( + const Descriptor* descriptor, const FieldDescriptor* field, + const char* method, const EnumValueDescriptor* value) { + GOOGLE_LOG(FATAL) + << "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::" << method << "\n" + " Message type: " << descriptor->full_name() << "\n" + " Field : " << field->full_name() << "\n" + " Problem : Enum value did not match field type:\n" + " Expected : " << field->enum_type()->full_name() << "\n" + " Actual : " << value->full_name(); +} + +#define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION) \ + if (!(CONDITION)) \ + ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION) +#define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION) \ + USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION) +#define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION) \ + USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION) + +#define USAGE_CHECK_TYPE(METHOD, CPPTYPE) \ + if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE) \ + ReportReflectionUsageTypeError(descriptor_, field, #METHOD, \ + FieldDescriptor::CPPTYPE_##CPPTYPE) + +#define USAGE_CHECK_ENUM_VALUE(METHOD) \ + if (value->type() != field->enum_type()) \ + ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value) + +#define USAGE_CHECK_MESSAGE_TYPE(METHOD) \ + USAGE_CHECK_EQ(field->containing_type(), descriptor_, \ + METHOD, "Field does not match message type."); +#define USAGE_CHECK_SINGULAR(METHOD) \ + USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ + "Field is repeated; the method requires a singular field.") +#define USAGE_CHECK_REPEATED(METHOD) \ + USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ + "Field is singular; the method requires a repeated field.") + +#define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE) \ + USAGE_CHECK_MESSAGE_TYPE(METHOD); \ + USAGE_CHECK_##LABEL(METHOD); \ + USAGE_CHECK_TYPE(METHOD, CPPTYPE) + +} // namespace + +// =================================================================== + +GeneratedMessageReflection::GeneratedMessageReflection( + const Descriptor* descriptor, + const Message* default_instance, + const int offsets[], + int has_bits_offset, + int unknown_fields_offset, + int extensions_offset, + const DescriptorPool* descriptor_pool, + MessageFactory* factory, + int object_size) + : descriptor_ (descriptor), + default_instance_ (default_instance), + offsets_ (offsets), + has_bits_offset_ (has_bits_offset), + unknown_fields_offset_(unknown_fields_offset), + extensions_offset_(extensions_offset), + object_size_ (object_size), + descriptor_pool_ ((descriptor_pool == NULL) ? + DescriptorPool::generated_pool() : + descriptor_pool), + message_factory_ (factory) { +} + +GeneratedMessageReflection::GeneratedMessageReflection( + const Descriptor* descriptor, + const Message* default_instance, + const int offsets[], + int has_bits_offset, + int unknown_fields_offset, + int extensions_offset, + const void* default_oneof_instance, + int oneof_case_offset, + const DescriptorPool* descriptor_pool, + MessageFactory* factory, + int object_size) + : descriptor_ (descriptor), + default_instance_ (default_instance), + default_oneof_instance_ (default_oneof_instance), + offsets_ (offsets), + has_bits_offset_ (has_bits_offset), + oneof_case_offset_(oneof_case_offset), + unknown_fields_offset_(unknown_fields_offset), + extensions_offset_(extensions_offset), + object_size_ (object_size), + descriptor_pool_ ((descriptor_pool == NULL) ? + DescriptorPool::generated_pool() : + descriptor_pool), + message_factory_ (factory) { +} + +GeneratedMessageReflection::~GeneratedMessageReflection() {} + +const UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields( + const Message& message) const { + const void* ptr = reinterpret_cast(&message) + + unknown_fields_offset_; + return *reinterpret_cast(ptr); +} +UnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields( + Message* message) const { + void* ptr = reinterpret_cast(message) + unknown_fields_offset_; + return reinterpret_cast(ptr); +} + +int GeneratedMessageReflection::SpaceUsed(const Message& message) const { + // object_size_ already includes the in-memory representation of each field + // in the message, so we only need to account for additional memory used by + // the fields. + int total_size = object_size_; + + total_size += GetUnknownFields(message).SpaceUsedExcludingSelf(); + + if (extensions_offset_ != -1) { + total_size += GetExtensionSet(message).SpaceUsedExcludingSelf(); + } + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + if (field->is_repeated()) { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + total_size += GetRaw >(message, field) \ + .SpaceUsedExcludingSelf(); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + total_size += GetRaw >(message, field) + .SpaceUsedExcludingSelf(); + break; + } + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: + // We don't know which subclass of RepeatedPtrFieldBase the type is, + // so we use RepeatedPtrFieldBase directly. + total_size += + GetRaw(message, field) + .SpaceUsedExcludingSelf >(); + break; + } + } else { + if (field->containing_oneof() && !HasOneofField(message, field)) { + continue; + } + switch (field->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32 : + case FieldDescriptor::CPPTYPE_INT64 : + case FieldDescriptor::CPPTYPE_UINT32: + case FieldDescriptor::CPPTYPE_UINT64: + case FieldDescriptor::CPPTYPE_DOUBLE: + case FieldDescriptor::CPPTYPE_FLOAT : + case FieldDescriptor::CPPTYPE_BOOL : + case FieldDescriptor::CPPTYPE_ENUM : + // Field is inline, so we've already counted it. + break; + + case FieldDescriptor::CPPTYPE_STRING: { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: { + const string* ptr = GetField(message, field); + + // Initially, the string points to the default value stored in + // the prototype. Only count the string if it has been changed + // from the default value. + const string* default_ptr = DefaultRaw(field); + + if (ptr != default_ptr) { + // string fields are represented by just a pointer, so also + // include sizeof(string) as well. + total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelf(*ptr); + } + break; + } + } + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: + if (&message == default_instance_) { + // For singular fields, the prototype just stores a pointer to the + // external type's prototype, so there is no extra memory usage. + } else { + const Message* sub_message = GetRaw(message, field); + if (sub_message != NULL) { + total_size += sub_message->SpaceUsed(); + } + } + break; + } + } + } + + return total_size; +} + +void GeneratedMessageReflection::SwapField( + Message* message1, + Message* message2, + const FieldDescriptor* field) const { + if (field->is_repeated()) { + switch (field->cpp_type()) { +#define SWAP_ARRAYS(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + MutableRaw >(message1, field)->Swap( \ + MutableRaw >(message2, field)); \ + break; + + SWAP_ARRAYS(INT32 , int32 ); + SWAP_ARRAYS(INT64 , int64 ); + SWAP_ARRAYS(UINT32, uint32); + SWAP_ARRAYS(UINT64, uint64); + SWAP_ARRAYS(FLOAT , float ); + SWAP_ARRAYS(DOUBLE, double); + SWAP_ARRAYS(BOOL , bool ); + SWAP_ARRAYS(ENUM , int ); +#undef SWAP_ARRAYS + + case FieldDescriptor::CPPTYPE_STRING: + case FieldDescriptor::CPPTYPE_MESSAGE: + MutableRaw(message1, field)->Swap( + MutableRaw(message2, field)); + break; + + default: + GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); + } + } else { + switch (field->cpp_type()) { +#define SWAP_VALUES(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + std::swap(*MutableRaw(message1, field), \ + *MutableRaw(message2, field)); \ + break; + + SWAP_VALUES(INT32 , int32 ); + SWAP_VALUES(INT64 , int64 ); + SWAP_VALUES(UINT32, uint32); + SWAP_VALUES(UINT64, uint64); + SWAP_VALUES(FLOAT , float ); + SWAP_VALUES(DOUBLE, double); + SWAP_VALUES(BOOL , bool ); + SWAP_VALUES(ENUM , int ); +#undef SWAP_VALUES + case FieldDescriptor::CPPTYPE_MESSAGE: + std::swap(*MutableRaw(message1, field), + *MutableRaw(message2, field)); + break; + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + std::swap(*MutableRaw(message1, field), + *MutableRaw(message2, field)); + break; + } + break; + + default: + GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); + } + } +} + +void GeneratedMessageReflection::SwapOneofField( + Message* message1, + Message* message2, + const OneofDescriptor* oneof_descriptor) const { + uint32 oneof_case1 = GetOneofCase(*message1, oneof_descriptor); + uint32 oneof_case2 = GetOneofCase(*message2, oneof_descriptor); + + int32 temp_int32; + int64 temp_int64; + uint32 temp_uint32; + uint64 temp_uint64; + float temp_float; + double temp_double; + bool temp_bool; + int temp_int; + Message* temp_message; + string temp_string; + + // Stores message1's oneof field to a temp variable. + const FieldDescriptor* field1; + if (oneof_case1 > 0) { + field1 = descriptor_->FindFieldByNumber(oneof_case1); + //oneof_descriptor->field(oneof_case1); + switch (field1->cpp_type()) { +#define GET_TEMP_VALUE(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + temp_##TYPE = GetField(*message1, field1); \ + break; + + GET_TEMP_VALUE(INT32 , int32 ); + GET_TEMP_VALUE(INT64 , int64 ); + GET_TEMP_VALUE(UINT32, uint32); + GET_TEMP_VALUE(UINT64, uint64); + GET_TEMP_VALUE(FLOAT , float ); + GET_TEMP_VALUE(DOUBLE, double); + GET_TEMP_VALUE(BOOL , bool ); + GET_TEMP_VALUE(ENUM , int ); +#undef GET_TEMP_VALUE + case FieldDescriptor::CPPTYPE_MESSAGE: + temp_message = ReleaseMessage(message1, field1); + break; + + case FieldDescriptor::CPPTYPE_STRING: + temp_string = GetString(*message1, field1); + break; + + default: + GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type(); + } + } + + // Sets message1's oneof field from the message2's oneof field. + if (oneof_case2 > 0) { + const FieldDescriptor* field2 = + descriptor_->FindFieldByNumber(oneof_case2); + switch (field2->cpp_type()) { +#define SET_ONEOF_VALUE1(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + SetField(message1, field2, GetField(*message2, field2)); \ + break; + + SET_ONEOF_VALUE1(INT32 , int32 ); + SET_ONEOF_VALUE1(INT64 , int64 ); + SET_ONEOF_VALUE1(UINT32, uint32); + SET_ONEOF_VALUE1(UINT64, uint64); + SET_ONEOF_VALUE1(FLOAT , float ); + SET_ONEOF_VALUE1(DOUBLE, double); + SET_ONEOF_VALUE1(BOOL , bool ); + SET_ONEOF_VALUE1(ENUM , int ); +#undef SET_ONEOF_VALUE1 + case FieldDescriptor::CPPTYPE_MESSAGE: + SetAllocatedMessage(message1, + ReleaseMessage(message2, field2), + field2); + break; + + case FieldDescriptor::CPPTYPE_STRING: + SetString(message1, field2, GetString(*message2, field2)); + break; + + default: + GOOGLE_LOG(FATAL) << "Unimplemented type: " << field2->cpp_type(); + } + } else { + ClearOneof(message1, oneof_descriptor); + } + + // Sets message2's oneof field from the temp variable. + if (oneof_case1 > 0) { + switch (field1->cpp_type()) { +#define SET_ONEOF_VALUE2(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + SetField(message2, field1, temp_##TYPE); \ + break; + + SET_ONEOF_VALUE2(INT32 , int32 ); + SET_ONEOF_VALUE2(INT64 , int64 ); + SET_ONEOF_VALUE2(UINT32, uint32); + SET_ONEOF_VALUE2(UINT64, uint64); + SET_ONEOF_VALUE2(FLOAT , float ); + SET_ONEOF_VALUE2(DOUBLE, double); + SET_ONEOF_VALUE2(BOOL , bool ); + SET_ONEOF_VALUE2(ENUM , int ); +#undef SET_ONEOF_VALUE2 + case FieldDescriptor::CPPTYPE_MESSAGE: + SetAllocatedMessage(message2, temp_message, field1); + break; + + case FieldDescriptor::CPPTYPE_STRING: + SetString(message2, field1, temp_string); + break; + + default: + GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type(); + } + } else { + ClearOneof(message2, oneof_descriptor); + } +} + +void GeneratedMessageReflection::Swap( + Message* message1, + Message* message2) const { + if (message1 == message2) return; + + // TODO(kenton): Other Reflection methods should probably check this too. + GOOGLE_CHECK_EQ(message1->GetReflection(), this) + << "First argument to Swap() (of type \"" + << message1->GetDescriptor()->full_name() + << "\") is not compatible with this reflection object (which is for type \"" + << descriptor_->full_name() + << "\"). Note that the exact same class is required; not just the same " + "descriptor."; + GOOGLE_CHECK_EQ(message2->GetReflection(), this) + << "Second argument to Swap() (of type \"" + << message2->GetDescriptor()->full_name() + << "\") is not compatible with this reflection object (which is for type \"" + << descriptor_->full_name() + << "\"). Note that the exact same class is required; not just the same " + "descriptor."; + + uint32* has_bits1 = MutableHasBits(message1); + uint32* has_bits2 = MutableHasBits(message2); + int has_bits_size = (descriptor_->field_count() + 31) / 32; + + for (int i = 0; i < has_bits_size; i++) { + std::swap(has_bits1[i], has_bits2[i]); + } + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + if (!field->containing_oneof()) { + SwapField(message1, message2, field); + } + } + + for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { + SwapOneofField(message1, message2, descriptor_->oneof_decl(i)); + } + + if (extensions_offset_ != -1) { + MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2)); + } + + MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2)); +} + +void GeneratedMessageReflection::SwapFields( + Message* message1, + Message* message2, + const vector& fields) const { + if (message1 == message2) return; + + // TODO(kenton): Other Reflection methods should probably check this too. + GOOGLE_CHECK_EQ(message1->GetReflection(), this) + << "First argument to SwapFields() (of type \"" + << message1->GetDescriptor()->full_name() + << "\") is not compatible with this reflection object (which is for type \"" + << descriptor_->full_name() + << "\"). Note that the exact same class is required; not just the same " + "descriptor."; + GOOGLE_CHECK_EQ(message2->GetReflection(), this) + << "Second argument to SwapFields() (of type \"" + << message2->GetDescriptor()->full_name() + << "\") is not compatible with this reflection object (which is for type \"" + << descriptor_->full_name() + << "\"). Note that the exact same class is required; not just the same " + "descriptor."; + + std::set swapped_oneof; + + for (int i = 0; i < fields.size(); i++) { + const FieldDescriptor* field = fields[i]; + if (field->is_extension()) { + MutableExtensionSet(message1)->SwapExtension( + MutableExtensionSet(message2), + field->number()); + } else { + if (field->containing_oneof()) { + int oneof_index = field->containing_oneof()->index(); + // Only swap the oneof field once. + if (swapped_oneof.find(oneof_index) != swapped_oneof.end()) { + continue; + } + swapped_oneof.insert(oneof_index); + SwapOneofField(message1, message2, field->containing_oneof()); + } else { + // Swap has bit. + SwapBit(message1, message2, field); + // Swap field. + SwapField(message1, message2, field); + } + } + } +} + +// ------------------------------------------------------------------- + +bool GeneratedMessageReflection::HasField(const Message& message, + const FieldDescriptor* field) const { + USAGE_CHECK_MESSAGE_TYPE(HasField); + USAGE_CHECK_SINGULAR(HasField); + + if (field->is_extension()) { + return GetExtensionSet(message).Has(field->number()); + } else { + if (field->containing_oneof()) { + return HasOneofField(message, field); + } else { + return HasBit(message, field); + } + } +} + +int GeneratedMessageReflection::FieldSize(const Message& message, + const FieldDescriptor* field) const { + USAGE_CHECK_MESSAGE_TYPE(FieldSize); + USAGE_CHECK_REPEATED(FieldSize); + + if (field->is_extension()) { + return GetExtensionSet(message).ExtensionSize(field->number()); + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + return GetRaw >(message, field).size() + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + case FieldDescriptor::CPPTYPE_MESSAGE: + return GetRaw(message, field).size(); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return 0; + } +} + +void GeneratedMessageReflection::ClearField( + Message* message, const FieldDescriptor* field) const { + USAGE_CHECK_MESSAGE_TYPE(ClearField); + + if (field->is_extension()) { + MutableExtensionSet(message)->ClearExtension(field->number()); + } else if (!field->is_repeated()) { + if (field->containing_oneof()) { + ClearOneofField(message, field); + return; + } + + if (HasBit(*message, field)) { + ClearBit(message, field); + + // We need to set the field back to its default value. + switch (field->cpp_type()) { +#define CLEAR_TYPE(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + *MutableRaw(message, field) = \ + field->default_value_##TYPE(); \ + break; + + CLEAR_TYPE(INT32 , int32 ); + CLEAR_TYPE(INT64 , int64 ); + CLEAR_TYPE(UINT32, uint32); + CLEAR_TYPE(UINT64, uint64); + CLEAR_TYPE(FLOAT , float ); + CLEAR_TYPE(DOUBLE, double); + CLEAR_TYPE(BOOL , bool ); +#undef CLEAR_TYPE + + case FieldDescriptor::CPPTYPE_ENUM: + *MutableRaw(message, field) = + field->default_value_enum()->number(); + break; + + case FieldDescriptor::CPPTYPE_STRING: { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + const string* default_ptr = DefaultRaw(field); + string** value = MutableRaw(message, field); + if (*value != default_ptr) { + if (field->has_default_value()) { + (*value)->assign(field->default_value_string()); + } else { + (*value)->clear(); + } + } + break; + } + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: + (*MutableRaw(message, field))->Clear(); + break; + } + } + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + MutableRaw >(message, field)->Clear(); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + MutableRaw >(message, field)->Clear(); + break; + } + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: { + // We don't know which subclass of RepeatedPtrFieldBase the type is, + // so we use RepeatedPtrFieldBase directly. + MutableRaw(message, field) + ->Clear >(); + break; + } + } + } +} + +void GeneratedMessageReflection::RemoveLast( + Message* message, + const FieldDescriptor* field) const { + USAGE_CHECK_MESSAGE_TYPE(RemoveLast); + USAGE_CHECK_REPEATED(RemoveLast); + + if (field->is_extension()) { + MutableExtensionSet(message)->RemoveLast(field->number()); + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + MutableRaw >(message, field)->RemoveLast(); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + MutableRaw >(message, field)->RemoveLast(); + break; + } + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: + MutableRaw(message, field) + ->RemoveLast >(); + break; + } + } +} + +Message* GeneratedMessageReflection::ReleaseLast( + Message* message, + const FieldDescriptor* field) const { + USAGE_CHECK_ALL(ReleaseLast, REPEATED, MESSAGE); + + if (field->is_extension()) { + return static_cast( + MutableExtensionSet(message)->ReleaseLast(field->number())); + } else { + return MutableRaw(message, field) + ->ReleaseLast >(); + } +} + +void GeneratedMessageReflection::SwapElements( + Message* message, + const FieldDescriptor* field, + int index1, + int index2) const { + USAGE_CHECK_MESSAGE_TYPE(Swap); + USAGE_CHECK_REPEATED(Swap); + + if (field->is_extension()) { + MutableExtensionSet(message)->SwapElements(field->number(), index1, index2); + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + MutableRaw >(message, field) \ + ->SwapElements(index1, index2); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + case FieldDescriptor::CPPTYPE_MESSAGE: + MutableRaw(message, field) + ->SwapElements(index1, index2); + break; + } + } +} + +namespace { +// Comparison functor for sorting FieldDescriptors by field number. +struct FieldNumberSorter { + bool operator()(const FieldDescriptor* left, + const FieldDescriptor* right) const { + return left->number() < right->number(); + } +}; +} // namespace + +void GeneratedMessageReflection::ListFields( + const Message& message, + vector* output) const { + output->clear(); + + // Optimization: The default instance never has any fields set. + if (&message == default_instance_) return; + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + if (field->is_repeated()) { + if (FieldSize(message, field) > 0) { + output->push_back(field); + } + } else { + if (field->containing_oneof()) { + if (HasOneofField(message, field)) { + output->push_back(field); + } + } else if (HasBit(message, field)) { + output->push_back(field); + } + } + } + + if (extensions_offset_ != -1) { + GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_, + output); + } + + // ListFields() must sort output by field number. + sort(output->begin(), output->end(), FieldNumberSorter()); +} + +// ------------------------------------------------------------------- + +#undef DEFINE_PRIMITIVE_ACCESSORS +#define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE) \ + PASSTYPE GeneratedMessageReflection::Get##TYPENAME( \ + const Message& message, const FieldDescriptor* field) const { \ + USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE); \ + if (field->is_extension()) { \ + return GetExtensionSet(message).Get##TYPENAME( \ + field->number(), field->default_value_##PASSTYPE()); \ + } else { \ + return GetField(message, field); \ + } \ + } \ + \ + void GeneratedMessageReflection::Set##TYPENAME( \ + Message* message, const FieldDescriptor* field, \ + PASSTYPE value) const { \ + USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE); \ + if (field->is_extension()) { \ + return MutableExtensionSet(message)->Set##TYPENAME( \ + field->number(), field->type(), value, field); \ + } else { \ + SetField(message, field, value); \ + } \ + } \ + \ + PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME( \ + const Message& message, \ + const FieldDescriptor* field, int index) const { \ + USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE); \ + if (field->is_extension()) { \ + return GetExtensionSet(message).GetRepeated##TYPENAME( \ + field->number(), index); \ + } else { \ + return GetRepeatedField(message, field, index); \ + } \ + } \ + \ + void GeneratedMessageReflection::SetRepeated##TYPENAME( \ + Message* message, const FieldDescriptor* field, \ + int index, PASSTYPE value) const { \ + USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE); \ + if (field->is_extension()) { \ + MutableExtensionSet(message)->SetRepeated##TYPENAME( \ + field->number(), index, value); \ + } else { \ + SetRepeatedField(message, field, index, value); \ + } \ + } \ + \ + void GeneratedMessageReflection::Add##TYPENAME( \ + Message* message, const FieldDescriptor* field, \ + PASSTYPE value) const { \ + USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE); \ + if (field->is_extension()) { \ + MutableExtensionSet(message)->Add##TYPENAME( \ + field->number(), field->type(), field->options().packed(), value, \ + field); \ + } else { \ + AddField(message, field, value); \ + } \ + } + +DEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 ) +DEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 ) +DEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32) +DEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64) +DEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT ) +DEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE) +DEFINE_PRIMITIVE_ACCESSORS(Bool , bool , bool , BOOL ) +#undef DEFINE_PRIMITIVE_ACCESSORS + +// ------------------------------------------------------------------- + +string GeneratedMessageReflection::GetString( + const Message& message, const FieldDescriptor* field) const { + USAGE_CHECK_ALL(GetString, SINGULAR, STRING); + if (field->is_extension()) { + return GetExtensionSet(message).GetString(field->number(), + field->default_value_string()); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return *GetField(message, field); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return GetEmptyString(); // Make compiler happy. + } +} + +const string& GeneratedMessageReflection::GetStringReference( + const Message& message, + const FieldDescriptor* field, string* scratch) const { + USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING); + if (field->is_extension()) { + return GetExtensionSet(message).GetString(field->number(), + field->default_value_string()); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return *GetField(message, field); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return GetEmptyString(); // Make compiler happy. + } +} + + +void GeneratedMessageReflection::SetString( + Message* message, const FieldDescriptor* field, + const string& value) const { + USAGE_CHECK_ALL(SetString, SINGULAR, STRING); + if (field->is_extension()) { + return MutableExtensionSet(message)->SetString(field->number(), + field->type(), value, field); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: { + if (field->containing_oneof() && !HasOneofField(*message, field)) { + ClearOneof(message, field->containing_oneof()); + *MutableField(message, field) = new string; + } + string** ptr = MutableField(message, field); + if (*ptr == DefaultRaw(field)) { + *ptr = new string(value); + } else { + (*ptr)->assign(value); + } + break; + } + } + } +} + + +string GeneratedMessageReflection::GetRepeatedString( + const Message& message, const FieldDescriptor* field, int index) const { + USAGE_CHECK_ALL(GetRepeatedString, REPEATED, STRING); + if (field->is_extension()) { + return GetExtensionSet(message).GetRepeatedString(field->number(), index); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return GetRepeatedPtrField(message, field, index); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return GetEmptyString(); // Make compiler happy. + } +} + +const string& GeneratedMessageReflection::GetRepeatedStringReference( + const Message& message, const FieldDescriptor* field, + int index, string* scratch) const { + USAGE_CHECK_ALL(GetRepeatedStringReference, REPEATED, STRING); + if (field->is_extension()) { + return GetExtensionSet(message).GetRepeatedString(field->number(), index); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return GetRepeatedPtrField(message, field, index); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return GetEmptyString(); // Make compiler happy. + } +} + + +void GeneratedMessageReflection::SetRepeatedString( + Message* message, const FieldDescriptor* field, + int index, const string& value) const { + USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING); + if (field->is_extension()) { + MutableExtensionSet(message)->SetRepeatedString( + field->number(), index, value); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + *MutableRepeatedField(message, field, index) = value; + break; + } + } +} + + +void GeneratedMessageReflection::AddString( + Message* message, const FieldDescriptor* field, + const string& value) const { + USAGE_CHECK_ALL(AddString, REPEATED, STRING); + if (field->is_extension()) { + MutableExtensionSet(message)->AddString(field->number(), + field->type(), value, field); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + *AddField(message, field) = value; + break; + } + } +} + + +// ------------------------------------------------------------------- + +const EnumValueDescriptor* GeneratedMessageReflection::GetEnum( + const Message& message, const FieldDescriptor* field) const { + USAGE_CHECK_ALL(GetEnum, SINGULAR, ENUM); + + int value; + if (field->is_extension()) { + value = GetExtensionSet(message).GetEnum( + field->number(), field->default_value_enum()->number()); + } else { + value = GetField(message, field); + } + const EnumValueDescriptor* result = + field->enum_type()->FindValueByNumber(value); + GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field " + << field->full_name() << " of type " + << field->enum_type()->full_name() << "."; + return result; +} + +void GeneratedMessageReflection::SetEnum( + Message* message, const FieldDescriptor* field, + const EnumValueDescriptor* value) const { + USAGE_CHECK_ALL(SetEnum, SINGULAR, ENUM); + USAGE_CHECK_ENUM_VALUE(SetEnum); + + if (field->is_extension()) { + MutableExtensionSet(message)->SetEnum(field->number(), field->type(), + value->number(), field); + } else { + SetField(message, field, value->number()); + } +} + +const EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum( + const Message& message, const FieldDescriptor* field, int index) const { + USAGE_CHECK_ALL(GetRepeatedEnum, REPEATED, ENUM); + + int value; + if (field->is_extension()) { + value = GetExtensionSet(message).GetRepeatedEnum(field->number(), index); + } else { + value = GetRepeatedField(message, field, index); + } + const EnumValueDescriptor* result = + field->enum_type()->FindValueByNumber(value); + GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field " + << field->full_name() << " of type " + << field->enum_type()->full_name() << "."; + return result; +} + +void GeneratedMessageReflection::SetRepeatedEnum( + Message* message, + const FieldDescriptor* field, int index, + const EnumValueDescriptor* value) const { + USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM); + USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum); + + if (field->is_extension()) { + MutableExtensionSet(message)->SetRepeatedEnum( + field->number(), index, value->number()); + } else { + SetRepeatedField(message, field, index, value->number()); + } +} + +void GeneratedMessageReflection::AddEnum( + Message* message, const FieldDescriptor* field, + const EnumValueDescriptor* value) const { + USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM); + USAGE_CHECK_ENUM_VALUE(AddEnum); + + if (field->is_extension()) { + MutableExtensionSet(message)->AddEnum(field->number(), field->type(), + field->options().packed(), + value->number(), field); + } else { + AddField(message, field, value->number()); + } +} + +// ------------------------------------------------------------------- + +const Message& GeneratedMessageReflection::GetMessage( + const Message& message, const FieldDescriptor* field, + MessageFactory* factory) const { + USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE); + + if (factory == NULL) factory = message_factory_; + + if (field->is_extension()) { + return static_cast( + GetExtensionSet(message).GetMessage( + field->number(), field->message_type(), factory)); + } else { + const Message* result; + result = GetRaw(message, field); + if (result == NULL) { + result = DefaultRaw(field); + } + return *result; + } +} + +Message* GeneratedMessageReflection::MutableMessage( + Message* message, const FieldDescriptor* field, + MessageFactory* factory) const { + if (factory == NULL) factory = message_factory_; + + if (field->is_extension()) { + return static_cast( + MutableExtensionSet(message)->MutableMessage(field, factory)); + } else { + Message* result; + Message** result_holder = MutableRaw(message, field); + + if (field->containing_oneof()) { + if (!HasOneofField(*message, field)) { + ClearOneof(message, field->containing_oneof()); + result_holder = MutableField(message, field); + const Message* default_message = DefaultRaw(field); + *result_holder = default_message->New(); + } + } else { + SetBit(message, field); + } + + if (*result_holder == NULL) { + const Message* default_message = DefaultRaw(field); + *result_holder = default_message->New(); + } + result = *result_holder; + return result; + } +} + +void GeneratedMessageReflection::SetAllocatedMessage( + Message* message, + Message* sub_message, + const FieldDescriptor* field) const { + USAGE_CHECK_ALL(SetAllocatedMessage, SINGULAR, MESSAGE); + + if (field->is_extension()) { + MutableExtensionSet(message)->SetAllocatedMessage( + field->number(), field->type(), field, sub_message); + } else { + if (field->containing_oneof()) { + if (sub_message == NULL) { + ClearOneof(message, field->containing_oneof()); + return; + } + ClearOneof(message, field->containing_oneof()); + *MutableRaw(message, field) = sub_message; + SetOneofCase(message, field); + return; + } + + if (sub_message == NULL) { + ClearBit(message, field); + } else { + SetBit(message, field); + } + Message** sub_message_holder = MutableRaw(message, field); + delete *sub_message_holder; + *sub_message_holder = sub_message; + } +} + +Message* GeneratedMessageReflection::ReleaseMessage( + Message* message, + const FieldDescriptor* field, + MessageFactory* factory) const { + USAGE_CHECK_ALL(ReleaseMessage, SINGULAR, MESSAGE); + + if (factory == NULL) factory = message_factory_; + + if (field->is_extension()) { + return static_cast( + MutableExtensionSet(message)->ReleaseMessage(field, factory)); + } else { + ClearBit(message, field); + if (field->containing_oneof()) { + if (HasOneofField(*message, field)) { + *MutableOneofCase(message, field->containing_oneof()) = 0; + } else { + return NULL; + } + } + Message** result = MutableRaw(message, field); + Message* ret = *result; + *result = NULL; + return ret; + } +} + +const Message& GeneratedMessageReflection::GetRepeatedMessage( + const Message& message, const FieldDescriptor* field, int index) const { + USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE); + + if (field->is_extension()) { + return static_cast( + GetExtensionSet(message).GetRepeatedMessage(field->number(), index)); + } else { + return GetRaw(message, field) + .Get >(index); + } +} + +Message* GeneratedMessageReflection::MutableRepeatedMessage( + Message* message, const FieldDescriptor* field, int index) const { + USAGE_CHECK_ALL(MutableRepeatedMessage, REPEATED, MESSAGE); + + if (field->is_extension()) { + return static_cast( + MutableExtensionSet(message)->MutableRepeatedMessage( + field->number(), index)); + } else { + return MutableRaw(message, field) + ->Mutable >(index); + } +} + +Message* GeneratedMessageReflection::AddMessage( + Message* message, const FieldDescriptor* field, + MessageFactory* factory) const { + USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE); + + if (factory == NULL) factory = message_factory_; + + if (field->is_extension()) { + return static_cast( + MutableExtensionSet(message)->AddMessage(field, factory)); + } else { + // We can't use AddField() because RepeatedPtrFieldBase doesn't + // know how to allocate one. + RepeatedPtrFieldBase* repeated = + MutableRaw(message, field); + Message* result = repeated->AddFromCleared >(); + if (result == NULL) { + // We must allocate a new object. + const Message* prototype; + if (repeated->size() == 0) { + prototype = factory->GetPrototype(field->message_type()); + } else { + prototype = &repeated->Get >(0); + } + result = prototype->New(); + repeated->AddAllocated >(result); + } + return result; + } +} + +void* GeneratedMessageReflection::MutableRawRepeatedField( + Message* message, const FieldDescriptor* field, + FieldDescriptor::CppType cpptype, + int ctype, const Descriptor* desc) const { + USAGE_CHECK_REPEATED("MutableRawRepeatedField"); + if (field->cpp_type() != cpptype) + ReportReflectionUsageTypeError(descriptor_, + field, "MutableRawRepeatedField", cpptype); + if (ctype >= 0) + GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch"; + if (desc != NULL) + GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type"; + if (field->is_extension()) + return MutableExtensionSet(message)->MutableRawRepeatedField( + field->number(), field->type(), field->is_packed(), field); + else + return reinterpret_cast(message) + offsets_[field->index()]; +} + +const FieldDescriptor* GeneratedMessageReflection::GetOneofFieldDescriptor( + const Message& message, + const OneofDescriptor* oneof_descriptor) const { + uint32 field_number = GetOneofCase(message, oneof_descriptor); + if (field_number == 0) { + return NULL; + } + return descriptor_->FindFieldByNumber(field_number); +} + +// ----------------------------------------------------------------------------- + +const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName( + const string& name) const { + if (extensions_offset_ == -1) return NULL; + + const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name); + if (result != NULL && result->containing_type() == descriptor_) { + return result; + } + + if (descriptor_->options().message_set_wire_format()) { + // MessageSet extensions may be identified by type name. + const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name); + if (type != NULL) { + // Look for a matching extension in the foreign type's scope. + for (int i = 0; i < type->extension_count(); i++) { + const FieldDescriptor* extension = type->extension(i); + if (extension->containing_type() == descriptor_ && + extension->type() == FieldDescriptor::TYPE_MESSAGE && + extension->is_optional() && + extension->message_type() == type) { + // Found it. + return extension; + } + } + } + } + + return NULL; +} + +const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber( + int number) const { + if (extensions_offset_ == -1) return NULL; + return descriptor_pool_->FindExtensionByNumber(descriptor_, number); +} + +// =================================================================== +// Some private helpers. + +// These simple template accessors obtain pointers (or references) to +// the given field. +template +inline const Type& GeneratedMessageReflection::GetRaw( + const Message& message, const FieldDescriptor* field) const { + if (field->containing_oneof() && !HasOneofField(message, field)) { + return DefaultRaw(field); + } + int index = field->containing_oneof() ? + descriptor_->field_count() + field->containing_oneof()->index() : + field->index(); + const void* ptr = reinterpret_cast(&message) + + offsets_[index]; + return *reinterpret_cast(ptr); +} + +template +inline Type* GeneratedMessageReflection::MutableRaw( + Message* message, const FieldDescriptor* field) const { + int index = field->containing_oneof() ? + descriptor_->field_count() + field->containing_oneof()->index() : + field->index(); + void* ptr = reinterpret_cast(message) + offsets_[index]; + return reinterpret_cast(ptr); +} + +template +inline const Type& GeneratedMessageReflection::DefaultRaw( + const FieldDescriptor* field) const { + const void* ptr = field->containing_oneof() ? + reinterpret_cast(default_oneof_instance_) + + offsets_[field->index()] : + reinterpret_cast(default_instance_) + + offsets_[field->index()]; + return *reinterpret_cast(ptr); +} + +inline const uint32* GeneratedMessageReflection::GetHasBits( + const Message& message) const { + const void* ptr = reinterpret_cast(&message) + has_bits_offset_; + return reinterpret_cast(ptr); +} +inline uint32* GeneratedMessageReflection::MutableHasBits( + Message* message) const { + void* ptr = reinterpret_cast(message) + has_bits_offset_; + return reinterpret_cast(ptr); +} + +inline uint32 GeneratedMessageReflection::GetOneofCase( + const Message& message, + const OneofDescriptor* oneof_descriptor) const { + const void* ptr = reinterpret_cast(&message) + + oneof_case_offset_; + return reinterpret_cast(ptr)[oneof_descriptor->index()]; +} + +inline uint32* GeneratedMessageReflection::MutableOneofCase( + Message* message, + const OneofDescriptor* oneof_descriptor) const { + void* ptr = reinterpret_cast(message) + oneof_case_offset_; + return &(reinterpret_cast(ptr)[oneof_descriptor->index()]); +} + +inline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet( + const Message& message) const { + GOOGLE_DCHECK_NE(extensions_offset_, -1); + const void* ptr = reinterpret_cast(&message) + + extensions_offset_; + return *reinterpret_cast(ptr); +} +inline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet( + Message* message) const { + GOOGLE_DCHECK_NE(extensions_offset_, -1); + void* ptr = reinterpret_cast(message) + extensions_offset_; + return reinterpret_cast(ptr); +} + +// Simple accessors for manipulating has_bits_. +inline bool GeneratedMessageReflection::HasBit( + const Message& message, const FieldDescriptor* field) const { + return GetHasBits(message)[field->index() / 32] & + (1 << (field->index() % 32)); +} + +inline void GeneratedMessageReflection::SetBit( + Message* message, const FieldDescriptor* field) const { + MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32)); +} + +inline void GeneratedMessageReflection::ClearBit( + Message* message, const FieldDescriptor* field) const { + MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32)); +} + +inline void GeneratedMessageReflection::SwapBit( + Message* message1, Message* message2, const FieldDescriptor* field) const { + bool temp_has_bit = HasBit(*message1, field); + if (HasBit(*message2, field)) { + SetBit(message1, field); + } else { + ClearBit(message1, field); + } + if (temp_has_bit) { + SetBit(message2, field); + } else { + ClearBit(message2, field); + } +} + +inline bool GeneratedMessageReflection::HasOneof( + const Message& message, const OneofDescriptor* oneof_descriptor) const { + return (GetOneofCase(message, oneof_descriptor) > 0); +} + +inline bool GeneratedMessageReflection::HasOneofField( + const Message& message, const FieldDescriptor* field) const { + return (GetOneofCase(message, field->containing_oneof()) == field->number()); +} + +inline void GeneratedMessageReflection::SetOneofCase( + Message* message, const FieldDescriptor* field) const { + *MutableOneofCase(message, field->containing_oneof()) = field->number(); +} + +inline void GeneratedMessageReflection::ClearOneofField( + Message* message, const FieldDescriptor* field) const { + if (HasOneofField(*message, field)) { + ClearOneof(message, field->containing_oneof()); + } +} + +inline void GeneratedMessageReflection::ClearOneof( + Message* message, const OneofDescriptor* oneof_descriptor) const { + // TODO(jieluo): Consider to cache the unused object instead of deleting + // it. It will be much faster if an aplication switches a lot from + // a few oneof fields. Time/space tradeoff + uint32 oneof_case = GetOneofCase(*message, oneof_descriptor); + if (oneof_case > 0) { + const FieldDescriptor* field = descriptor_->FindFieldByNumber(oneof_case); + switch (field->cpp_type()) { + case FieldDescriptor::CPPTYPE_STRING: { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + delete *MutableRaw(message, field); + break; + } + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: + delete *MutableRaw(message, field); + break; + default: + break; + } + + *MutableOneofCase(message, oneof_descriptor) = 0; + } +} + +// Template implementations of basic accessors. Inline because each +// template instance is only called from one location. These are +// used for all types except messages. +template +inline const Type& GeneratedMessageReflection::GetField( + const Message& message, const FieldDescriptor* field) const { + return GetRaw(message, field); +} + +template +inline void GeneratedMessageReflection::SetField( + Message* message, const FieldDescriptor* field, const Type& value) const { + if (field->containing_oneof() && !HasOneofField(*message, field)) { + ClearOneof(message, field->containing_oneof()); + } + *MutableRaw(message, field) = value; + field->containing_oneof() ? + SetOneofCase(message, field) : SetBit(message, field); +} + +template +inline Type* GeneratedMessageReflection::MutableField( + Message* message, const FieldDescriptor* field) const { + field->containing_oneof() ? + SetOneofCase(message, field) : SetBit(message, field); + return MutableRaw(message, field); +} + +template +inline const Type& GeneratedMessageReflection::GetRepeatedField( + const Message& message, const FieldDescriptor* field, int index) const { + return GetRaw >(message, field).Get(index); +} + +template +inline const Type& GeneratedMessageReflection::GetRepeatedPtrField( + const Message& message, const FieldDescriptor* field, int index) const { + return GetRaw >(message, field).Get(index); +} + +template +inline void GeneratedMessageReflection::SetRepeatedField( + Message* message, const FieldDescriptor* field, + int index, Type value) const { + MutableRaw >(message, field)->Set(index, value); +} + +template +inline Type* GeneratedMessageReflection::MutableRepeatedField( + Message* message, const FieldDescriptor* field, int index) const { + RepeatedPtrField* repeated = + MutableRaw >(message, field); + return repeated->Mutable(index); +} + +template +inline void GeneratedMessageReflection::AddField( + Message* message, const FieldDescriptor* field, const Type& value) const { + MutableRaw >(message, field)->Add(value); +} + +template +inline Type* GeneratedMessageReflection::AddField( + Message* message, const FieldDescriptor* field) const { + RepeatedPtrField* repeated = + MutableRaw >(message, field); + return repeated->Add(); +} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/generated_message_reflection.h b/toolkit/components/protobuf/src/google/protobuf/generated_message_reflection.h new file mode 100644 index 0000000000000..b6671ad06b04f --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/generated_message_reflection.h @@ -0,0 +1,504 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This header is logically internal, but is made public because it is used +// from protocol-compiler-generated code, which may reside in other components. + +#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ +#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ + +#include +#include +#include +// TODO(jasonh): Remove this once the compiler change to directly include this +// is released to components. +#include +#include +#include + + +namespace google { +namespace upb { +namespace google_opensource { +class GMR_Handlers; +} // namespace google_opensource +} // namespace upb + +namespace protobuf { + class DescriptorPool; +} + +namespace protobuf { +namespace internal { +class DefaultEmptyOneof; + +// Defined in this file. +class GeneratedMessageReflection; + +// Defined in other files. +class ExtensionSet; // extension_set.h + +// THIS CLASS IS NOT INTENDED FOR DIRECT USE. It is intended for use +// by generated code. This class is just a big hack that reduces code +// size. +// +// A GeneratedMessageReflection is an implementation of Reflection +// which expects all fields to be backed by simple variables located in +// memory. The locations are given using a base pointer and a set of +// offsets. +// +// It is required that the user represents fields of each type in a standard +// way, so that GeneratedMessageReflection can cast the void* pointer to +// the appropriate type. For primitive fields and string fields, each field +// should be represented using the obvious C++ primitive type. Enums and +// Messages are different: +// - Singular Message fields are stored as a pointer to a Message. These +// should start out NULL, except for in the default instance where they +// should start out pointing to other default instances. +// - Enum fields are stored as an int. This int must always contain +// a valid value, such that EnumDescriptor::FindValueByNumber() would +// not return NULL. +// - Repeated fields are stored as RepeatedFields or RepeatedPtrFields +// of whatever type the individual field would be. Strings and +// Messages use RepeatedPtrFields while everything else uses +// RepeatedFields. +class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { + public: + // Constructs a GeneratedMessageReflection. + // Parameters: + // descriptor: The descriptor for the message type being implemented. + // default_instance: The default instance of the message. This is only + // used to obtain pointers to default instances of embedded + // messages, which GetMessage() will return if the particular + // sub-message has not been initialized yet. (Thus, all + // embedded message fields *must* have non-NULL pointers + // in the default instance.) + // offsets: An array of ints giving the byte offsets, relative to + // the start of the message object, of each field. These can + // be computed at compile time using the + // GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro, defined + // below. + // has_bits_offset: Offset in the message of an array of uint32s of size + // descriptor->field_count()/32, rounded up. This is a + // bitfield where each bit indicates whether or not the + // corresponding field of the message has been initialized. + // The bit for field index i is obtained by the expression: + // has_bits[i / 32] & (1 << (i % 32)) + // unknown_fields_offset: Offset in the message of the UnknownFieldSet for + // the message. + // extensions_offset: Offset in the message of the ExtensionSet for the + // message, or -1 if the message type has no extension + // ranges. + // pool: DescriptorPool to search for extension definitions. Only + // used by FindKnownExtensionByName() and + // FindKnownExtensionByNumber(). + // factory: MessageFactory to use to construct extension messages. + // object_size: The size of a message object of this type, as measured + // by sizeof(). + GeneratedMessageReflection(const Descriptor* descriptor, + const Message* default_instance, + const int offsets[], + int has_bits_offset, + int unknown_fields_offset, + int extensions_offset, + const DescriptorPool* pool, + MessageFactory* factory, + int object_size); + + // Similar with the construction above. Call this construction if the + // message has oneof definition. + // Parameters: + // offsets: An array of ints giving the byte offsets. + // For each oneof field, the offset is relative to the + // default_oneof_instance. These can be computed at compile + // time using the + // PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET() macro. + // For each none oneof field, the offset is related to + // the start of the message object. These can be computed + // at compile time using the + // GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro. + // Besides offsets for all fields, this array also contains + // offsets for oneof unions. The offset of the i-th oneof + // union is offsets[descriptor->field_count() + i]. + // default_oneof_instance: The default instance of the oneofs. It is a + // struct holding the default value of all oneof fields + // for this message. It is only used to obtain pointers + // to default instances of oneof fields, which Get + // methods will return if the field is not set. + // oneof_case_offset: Offset in the message of an array of uint32s of + // size descriptor->oneof_decl_count(). Each uint32 + // indicates what field is set for each oneof. + // other parameters are the same with the construction above. + GeneratedMessageReflection(const Descriptor* descriptor, + const Message* default_instance, + const int offsets[], + int has_bits_offset, + int unknown_fields_offset, + int extensions_offset, + const void* default_oneof_instance, + int oneof_case_offset, + const DescriptorPool* pool, + MessageFactory* factory, + int object_size); + ~GeneratedMessageReflection(); + + // implements Reflection ------------------------------------------- + + const UnknownFieldSet& GetUnknownFields(const Message& message) const; + UnknownFieldSet* MutableUnknownFields(Message* message) const; + + int SpaceUsed(const Message& message) const; + + bool HasField(const Message& message, const FieldDescriptor* field) const; + int FieldSize(const Message& message, const FieldDescriptor* field) const; + void ClearField(Message* message, const FieldDescriptor* field) const; + bool HasOneof(const Message& message, + const OneofDescriptor* oneof_descriptor) const; + void ClearOneof(Message* message, const OneofDescriptor* field) const; + void RemoveLast(Message* message, const FieldDescriptor* field) const; + Message* ReleaseLast(Message* message, const FieldDescriptor* field) const; + void Swap(Message* message1, Message* message2) const; + void SwapFields(Message* message1, Message* message2, + const vector& fields) const; + void SwapElements(Message* message, const FieldDescriptor* field, + int index1, int index2) const; + void ListFields(const Message& message, + vector* output) const; + + int32 GetInt32 (const Message& message, + const FieldDescriptor* field) const; + int64 GetInt64 (const Message& message, + const FieldDescriptor* field) const; + uint32 GetUInt32(const Message& message, + const FieldDescriptor* field) const; + uint64 GetUInt64(const Message& message, + const FieldDescriptor* field) const; + float GetFloat (const Message& message, + const FieldDescriptor* field) const; + double GetDouble(const Message& message, + const FieldDescriptor* field) const; + bool GetBool (const Message& message, + const FieldDescriptor* field) const; + string GetString(const Message& message, + const FieldDescriptor* field) const; + const string& GetStringReference(const Message& message, + const FieldDescriptor* field, + string* scratch) const; + const EnumValueDescriptor* GetEnum(const Message& message, + const FieldDescriptor* field) const; + const Message& GetMessage(const Message& message, + const FieldDescriptor* field, + MessageFactory* factory = NULL) const; + + const FieldDescriptor* GetOneofFieldDescriptor( + const Message& message, + const OneofDescriptor* oneof_descriptor) const; + + public: + void SetInt32 (Message* message, + const FieldDescriptor* field, int32 value) const; + void SetInt64 (Message* message, + const FieldDescriptor* field, int64 value) const; + void SetUInt32(Message* message, + const FieldDescriptor* field, uint32 value) const; + void SetUInt64(Message* message, + const FieldDescriptor* field, uint64 value) const; + void SetFloat (Message* message, + const FieldDescriptor* field, float value) const; + void SetDouble(Message* message, + const FieldDescriptor* field, double value) const; + void SetBool (Message* message, + const FieldDescriptor* field, bool value) const; + void SetString(Message* message, + const FieldDescriptor* field, + const string& value) const; + void SetEnum (Message* message, const FieldDescriptor* field, + const EnumValueDescriptor* value) const; + Message* MutableMessage(Message* message, const FieldDescriptor* field, + MessageFactory* factory = NULL) const; + void SetAllocatedMessage(Message* message, + Message* sub_message, + const FieldDescriptor* field) const; + Message* ReleaseMessage(Message* message, const FieldDescriptor* field, + MessageFactory* factory = NULL) const; + + int32 GetRepeatedInt32 (const Message& message, + const FieldDescriptor* field, int index) const; + int64 GetRepeatedInt64 (const Message& message, + const FieldDescriptor* field, int index) const; + uint32 GetRepeatedUInt32(const Message& message, + const FieldDescriptor* field, int index) const; + uint64 GetRepeatedUInt64(const Message& message, + const FieldDescriptor* field, int index) const; + float GetRepeatedFloat (const Message& message, + const FieldDescriptor* field, int index) const; + double GetRepeatedDouble(const Message& message, + const FieldDescriptor* field, int index) const; + bool GetRepeatedBool (const Message& message, + const FieldDescriptor* field, int index) const; + string GetRepeatedString(const Message& message, + const FieldDescriptor* field, int index) const; + const string& GetRepeatedStringReference(const Message& message, + const FieldDescriptor* field, + int index, string* scratch) const; + const EnumValueDescriptor* GetRepeatedEnum(const Message& message, + const FieldDescriptor* field, + int index) const; + const Message& GetRepeatedMessage(const Message& message, + const FieldDescriptor* field, + int index) const; + + // Set the value of a field. + void SetRepeatedInt32 (Message* message, + const FieldDescriptor* field, int index, int32 value) const; + void SetRepeatedInt64 (Message* message, + const FieldDescriptor* field, int index, int64 value) const; + void SetRepeatedUInt32(Message* message, + const FieldDescriptor* field, int index, uint32 value) const; + void SetRepeatedUInt64(Message* message, + const FieldDescriptor* field, int index, uint64 value) const; + void SetRepeatedFloat (Message* message, + const FieldDescriptor* field, int index, float value) const; + void SetRepeatedDouble(Message* message, + const FieldDescriptor* field, int index, double value) const; + void SetRepeatedBool (Message* message, + const FieldDescriptor* field, int index, bool value) const; + void SetRepeatedString(Message* message, + const FieldDescriptor* field, int index, + const string& value) const; + void SetRepeatedEnum(Message* message, const FieldDescriptor* field, + int index, const EnumValueDescriptor* value) const; + // Get a mutable pointer to a field with a message type. + Message* MutableRepeatedMessage(Message* message, + const FieldDescriptor* field, + int index) const; + + void AddInt32 (Message* message, + const FieldDescriptor* field, int32 value) const; + void AddInt64 (Message* message, + const FieldDescriptor* field, int64 value) const; + void AddUInt32(Message* message, + const FieldDescriptor* field, uint32 value) const; + void AddUInt64(Message* message, + const FieldDescriptor* field, uint64 value) const; + void AddFloat (Message* message, + const FieldDescriptor* field, float value) const; + void AddDouble(Message* message, + const FieldDescriptor* field, double value) const; + void AddBool (Message* message, + const FieldDescriptor* field, bool value) const; + void AddString(Message* message, + const FieldDescriptor* field, const string& value) const; + void AddEnum(Message* message, + const FieldDescriptor* field, + const EnumValueDescriptor* value) const; + Message* AddMessage(Message* message, const FieldDescriptor* field, + MessageFactory* factory = NULL) const; + + const FieldDescriptor* FindKnownExtensionByName(const string& name) const; + const FieldDescriptor* FindKnownExtensionByNumber(int number) const; + + protected: + virtual void* MutableRawRepeatedField( + Message* message, const FieldDescriptor* field, FieldDescriptor::CppType, + int ctype, const Descriptor* desc) const; + + private: + friend class GeneratedMessage; + + // To parse directly into a proto2 generated class, the class GMR_Handlers + // needs access to member offsets and hasbits. + friend class LIBPROTOBUF_EXPORT upb::google_opensource::GMR_Handlers; + + const Descriptor* descriptor_; + const Message* default_instance_; + const void* default_oneof_instance_; + const int* offsets_; + + int has_bits_offset_; + int oneof_case_offset_; + int unknown_fields_offset_; + int extensions_offset_; + int object_size_; + + const DescriptorPool* descriptor_pool_; + MessageFactory* message_factory_; + + template + inline const Type& GetRaw(const Message& message, + const FieldDescriptor* field) const; + template + inline Type* MutableRaw(Message* message, + const FieldDescriptor* field) const; + template + inline const Type& DefaultRaw(const FieldDescriptor* field) const; + template + inline const Type& DefaultOneofRaw(const FieldDescriptor* field) const; + + inline const uint32* GetHasBits(const Message& message) const; + inline uint32* MutableHasBits(Message* message) const; + inline uint32 GetOneofCase( + const Message& message, + const OneofDescriptor* oneof_descriptor) const; + inline uint32* MutableOneofCase( + Message* message, + const OneofDescriptor* oneof_descriptor) const; + inline const ExtensionSet& GetExtensionSet(const Message& message) const; + inline ExtensionSet* MutableExtensionSet(Message* message) const; + + inline bool HasBit(const Message& message, + const FieldDescriptor* field) const; + inline void SetBit(Message* message, + const FieldDescriptor* field) const; + inline void ClearBit(Message* message, + const FieldDescriptor* field) const; + inline void SwapBit(Message* message1, + Message* message2, + const FieldDescriptor* field) const; + + // This function only swaps the field. Should swap corresponding has_bit + // before or after using this function. + void SwapField(Message* message1, + Message* message2, + const FieldDescriptor* field) const; + + void SwapOneofField(Message* message1, + Message* message2, + const OneofDescriptor* oneof_descriptor) const; + + inline bool HasOneofField(const Message& message, + const FieldDescriptor* field) const; + inline void SetOneofCase(Message* message, + const FieldDescriptor* field) const; + inline void ClearOneofField(Message* message, + const FieldDescriptor* field) const; + + template + inline const Type& GetField(const Message& message, + const FieldDescriptor* field) const; + template + inline void SetField(Message* message, + const FieldDescriptor* field, const Type& value) const; + template + inline Type* MutableField(Message* message, + const FieldDescriptor* field) const; + template + inline const Type& GetRepeatedField(const Message& message, + const FieldDescriptor* field, + int index) const; + template + inline const Type& GetRepeatedPtrField(const Message& message, + const FieldDescriptor* field, + int index) const; + template + inline void SetRepeatedField(Message* message, + const FieldDescriptor* field, int index, + Type value) const; + template + inline Type* MutableRepeatedField(Message* message, + const FieldDescriptor* field, + int index) const; + template + inline void AddField(Message* message, + const FieldDescriptor* field, const Type& value) const; + template + inline Type* AddField(Message* message, + const FieldDescriptor* field) const; + + int GetExtensionNumberOrDie(const Descriptor* type) const; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratedMessageReflection); +}; + +// Returns the offset of the given field within the given aggregate type. +// This is equivalent to the ANSI C offsetof() macro. However, according +// to the C++ standard, offsetof() only works on POD types, and GCC +// enforces this requirement with a warning. In practice, this rule is +// unnecessarily strict; there is probably no compiler or platform on +// which the offsets of the direct fields of a class are non-constant. +// Fields inherited from superclasses *can* have non-constant offsets, +// but that's not what this macro will be used for. +// +// Note that we calculate relative to the pointer value 16 here since if we +// just use zero, GCC complains about dereferencing a NULL pointer. We +// choose 16 rather than some other number just in case the compiler would +// be confused by an unaligned pointer. +#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD) \ + static_cast( \ + reinterpret_cast( \ + &reinterpret_cast(16)->FIELD) - \ + reinterpret_cast(16)) + +#define PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(ONEOF, FIELD) \ + static_cast( \ + reinterpret_cast(&(ONEOF->FIELD)) \ + - reinterpret_cast(ONEOF)) + +// There are some places in proto2 where dynamic_cast would be useful as an +// optimization. For example, take Message::MergeFrom(const Message& other). +// For a given generated message FooMessage, we generate these two methods: +// void MergeFrom(const FooMessage& other); +// void MergeFrom(const Message& other); +// The former method can be implemented directly in terms of FooMessage's +// inline accessors, but the latter method must work with the reflection +// interface. However, if the parameter to the latter method is actually of +// type FooMessage, then we'd like to be able to just call the other method +// as an optimization. So, we use dynamic_cast to check this. +// +// That said, dynamic_cast requires RTTI, which many people like to disable +// for performance and code size reasons. When RTTI is not available, we +// still need to produce correct results. So, in this case we have to fall +// back to using reflection, which is what we would have done anyway if the +// objects were not of the exact same class. +// +// dynamic_cast_if_available() implements this logic. If RTTI is +// enabled, it does a dynamic_cast. If RTTI is disabled, it just returns +// NULL. +// +// If you need to compile without RTTI, simply #define GOOGLE_PROTOBUF_NO_RTTI. +// On MSVC, this should be detected automatically. +template +inline To dynamic_cast_if_available(From from) { +#if defined(GOOGLE_PROTOBUF_NO_RTTI) || (defined(_MSC_VER)&&!defined(_CPPRTTI)) + return NULL; +#else + return dynamic_cast(from); +#endif +} + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ diff --git a/toolkit/components/protobuf/google/protobuf/generated_message_util.cc b/toolkit/components/protobuf/src/google/protobuf/generated_message_util.cc similarity index 87% rename from toolkit/components/protobuf/google/protobuf/generated_message_util.cc rename to toolkit/components/protobuf/src/google/protobuf/generated_message_util.cc index 76e547bb8d131..0c20d81c8ccd7 100644 --- a/toolkit/components/protobuf/google/protobuf/generated_message_util.cc +++ b/toolkit/components/protobuf/src/google/protobuf/generated_message_util.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -47,7 +47,17 @@ double NaN() { return std::numeric_limits::quiet_NaN(); } -const ::std::string kEmptyString; +const ::std::string* empty_string_; +GOOGLE_PROTOBUF_DECLARE_ONCE(empty_string_once_init_); + +void DeleteEmptyString() { + delete empty_string_; +} + +void InitEmptyString() { + empty_string_ = new string; + OnShutdown(&DeleteEmptyString); +} } // namespace internal diff --git a/toolkit/components/protobuf/src/google/protobuf/generated_message_util.h b/toolkit/components/protobuf/src/google/protobuf/generated_message_util.h new file mode 100644 index 0000000000000..678f92a7ee209 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/generated_message_util.h @@ -0,0 +1,113 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains miscellaneous helper code used by generated code -- +// including lite types -- but which should not be used directly by users. + +#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ +#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ + +#include +#include + +#include + +#include +namespace google { + +namespace protobuf { +namespace internal { + + +// Annotation for the compiler to emit a deprecation message if a field marked +// with option 'deprecated=true' is used in the code, or for other things in +// generated code which are deprecated. +// +// For internal use in the pb.cc files, deprecation warnings are suppressed +// there. +#undef DEPRECATED_PROTOBUF_FIELD +#define PROTOBUF_DEPRECATED + + +// Constants for special floating point values. +LIBPROTOBUF_EXPORT double Infinity(); +LIBPROTOBUF_EXPORT double NaN(); + +// TODO(jieluo): Change to template. We have tried to use template, +// but it causes net/rpc/python:rpcutil_test fail (the empty string will +// init twice). It may related to swig. Change to template after we +// found the solution. + +// Default empty string object. Don't use the pointer directly. Instead, call +// GetEmptyString() to get the reference. +LIBPROTOBUF_EXPORT extern const ::std::string* empty_string_; +LIBPROTOBUF_EXPORT extern ProtobufOnceType empty_string_once_init_; +LIBPROTOBUF_EXPORT void InitEmptyString(); + + +LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyStringAlreadyInited() { + assert(empty_string_ != NULL); + return *empty_string_; +} +LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyString() { + ::google::protobuf::GoogleOnceInit(&empty_string_once_init_, &InitEmptyString); + return GetEmptyStringAlreadyInited(); +} + +// Defined in generated_message_reflection.cc -- not actually part of the lite +// library. +// +// TODO(jasonh): The various callers get this declaration from a variety of +// places: probably in most cases repeated_field.h. Clean these up so they all +// get the declaration from this file. +LIBPROTOBUF_EXPORT int StringSpaceUsedExcludingSelf(const string& str); + + +// True if IsInitialized() is true for all elements of t. Type is expected +// to be a RepeatedPtrField. It's useful to have this +// helper here to keep the protobuf compiler from ever having to emit loops in +// IsInitialized() methods. We want the C++ compiler to inline this or not +// as it sees fit. +template bool AllAreInitialized(const Type& t) { + for (int i = t.size(); --i >= 0; ) { + if (!t.Get(i).IsInitialized()) return false; + } + return true; +} + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ diff --git a/toolkit/components/protobuf/google/protobuf/io/coded_stream.cc b/toolkit/components/protobuf/src/google/protobuf/io/coded_stream.cc similarity index 85% rename from toolkit/components/protobuf/google/protobuf/io/coded_stream.cc rename to toolkit/components/protobuf/src/google/protobuf/io/coded_stream.cc index 57d486f958a27..53449755c164b 100644 --- a/toolkit/components/protobuf/google/protobuf/io/coded_stream.cc +++ b/toolkit/components/protobuf/src/google/protobuf/io/coded_stream.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -43,7 +43,7 @@ #include #include #include -#include +#include namespace google { @@ -69,6 +69,23 @@ inline bool NextNonEmpty(ZeroCopyInputStream* input, // CodedInputStream ================================================== +CodedInputStream::~CodedInputStream() { + if (input_ != NULL) { + BackUpInputToCurrentPosition(); + } + + if (total_bytes_warning_threshold_ == -2) { + GOOGLE_LOG(WARNING) << "The total number of bytes read was " << total_bytes_read_; + } +} + +// Static. +int CodedInputStream::default_recursion_limit_ = 100; + + +void CodedOutputStream::EnableAliasing(bool enabled) { + aliasing_enabled_ = enabled && output_->AllowsAliasing(); +} void CodedInputStream::BackUpInputToCurrentPosition() { int backup_bytes = BufferSize() + buffer_size_after_limit_ + overflow_bytes_; @@ -98,8 +115,7 @@ inline void CodedInputStream::RecomputeBufferLimits() { CodedInputStream::Limit CodedInputStream::PushLimit(int byte_limit) { // Current position relative to the beginning of the stream. - int current_position = total_bytes_read_ - - (BufferSize() + buffer_size_after_limit_); + int current_position = CurrentPosition(); Limit old_limit = current_limit_; @@ -133,10 +149,9 @@ void CodedInputStream::PopLimit(Limit limit) { legitimate_message_end_ = false; } -int CodedInputStream::BytesUntilLimit() { +int CodedInputStream::BytesUntilLimit() const { if (current_limit_ == INT_MAX) return -1; - int current_position = total_bytes_read_ - - (BufferSize() + buffer_size_after_limit_); + int current_position = CurrentPosition(); return current_limit_ - current_position; } @@ -145,13 +160,22 @@ void CodedInputStream::SetTotalBytesLimit( int total_bytes_limit, int warning_threshold) { // Make sure the limit isn't already past, since this could confuse other // code. - int current_position = total_bytes_read_ - - (BufferSize() + buffer_size_after_limit_); + int current_position = CurrentPosition(); total_bytes_limit_ = max(current_position, total_bytes_limit); - total_bytes_warning_threshold_ = warning_threshold; + if (warning_threshold >= 0) { + total_bytes_warning_threshold_ = warning_threshold; + } else { + // warning_threshold is negative + total_bytes_warning_threshold_ = -1; + } RecomputeBufferLimits(); } +int CodedInputStream::BytesUntilTotalBytesLimit() const { + if (total_bytes_limit_ == INT_MAX) return -1; + return total_bytes_limit_ - CurrentPosition(); +} + void CodedInputStream::PrintTotalBytesLimitError() { GOOGLE_LOG(ERROR) << "A protocol message was rejected because it was too " "big (more than " << total_bytes_limit_ @@ -232,6 +256,14 @@ bool CodedInputStream::ReadStringFallback(string* buffer, int size) { buffer->clear(); } + int closest_limit = min(current_limit_, total_bytes_limit_); + if (closest_limit != INT_MAX) { + int bytes_to_limit = closest_limit - CurrentPosition(); + if (bytes_to_limit > 0 && size > 0 && size <= bytes_to_limit) { + buffer->reserve(size); + } + } + int current_buffer_size; while ((current_buffer_size = BufferSize()) < size) { // Some STL implementations "helpfully" crash on buffer->append(NULL, 0). @@ -298,11 +330,16 @@ inline const uint8* ReadVarint32FromArray(const uint8* buffer, uint32* value) { uint32 b; uint32 result; - b = *(ptr++); result = (b & 0x7F) ; if (!(b & 0x80)) goto done; - b = *(ptr++); result |= (b & 0x7F) << 7; if (!(b & 0x80)) goto done; - b = *(ptr++); result |= (b & 0x7F) << 14; if (!(b & 0x80)) goto done; - b = *(ptr++); result |= (b & 0x7F) << 21; if (!(b & 0x80)) goto done; - b = *(ptr++); result |= b << 28; if (!(b & 0x80)) goto done; + b = *(ptr++); result = b ; if (!(b & 0x80)) goto done; + result -= 0x80; + b = *(ptr++); result += b << 7; if (!(b & 0x80)) goto done; + result -= 0x80 << 7; + b = *(ptr++); result += b << 14; if (!(b & 0x80)) goto done; + result -= 0x80 << 14; + b = *(ptr++); result += b << 21; if (!(b & 0x80)) goto done; + result -= 0x80 << 21; + b = *(ptr++); result += b << 28; if (!(b & 0x80)) goto done; + // "result -= 0x80 << 28" is irrevelant. // If the input is larger than 32 bits, we still need to read it all // and discard the high-order bits. @@ -332,8 +369,8 @@ bool CodedInputStream::ReadVarint32Slow(uint32* value) { bool CodedInputStream::ReadVarint32Fallback(uint32* value) { if (BufferSize() >= kMaxVarintBytes || - // Optimization: If the varint ends at exactly the end of the buffer, - // we can detect that and still use the fast path. + // Optimization: We're also safe if the buffer is non-empty and it ends + // with a byte that would terminate a varint. (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { const uint8* end = ReadVarint32FromArray(buffer_, value); if (end == NULL) return false; @@ -368,16 +405,17 @@ uint32 CodedInputStream::ReadTagSlow() { // For the slow path, just do a 64-bit read. Try to optimize for one-byte tags // again, since we have now refreshed the buffer. - uint64 result; + uint64 result = 0; if (!ReadVarint64(&result)) return 0; return static_cast(result); } uint32 CodedInputStream::ReadTagFallback() { - if (BufferSize() >= kMaxVarintBytes || - // Optimization: If the varint ends at exactly the end of the buffer, - // we can detect that and still use the fast path. - (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { + const int buf_size = BufferSize(); + if (buf_size >= kMaxVarintBytes || + // Optimization: We're also safe if the buffer is non-empty and it ends + // with a byte that would terminate a varint. + (buf_size > 0 && !(buffer_end_[-1] & 0x80))) { uint32 tag; const uint8* end = ReadVarint32FromArray(buffer_, &tag); if (end == NULL) { @@ -388,7 +426,9 @@ uint32 CodedInputStream::ReadTagFallback() { } else { // We are commonly at a limit when attempting to read tags. Try to quickly // detect this case without making another function call. - if (buffer_ == buffer_end_ && buffer_size_after_limit_ > 0 && + if ((buf_size == 0) && + ((buffer_size_after_limit_ > 0) || + (total_bytes_read_ == current_limit_)) && // Make sure that the limit we hit is not total_bytes_limit_, since // in that case we still need to call Refresh() so that it prints an // error. @@ -426,8 +466,8 @@ bool CodedInputStream::ReadVarint64Slow(uint64* value) { bool CodedInputStream::ReadVarint64Fallback(uint64* value) { if (BufferSize() >= kMaxVarintBytes || - // Optimization: If the varint ends at exactly the end of the buffer, - // we can detect that and still use the fast path. + // Optimization: We're also safe if the buffer is non-empty and it ends + // with a byte that would terminate a varint. (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { // Fast path: We have enough bytes left in the buffer to guarantee that // this read won't cross the end, so we can skip the checks. @@ -439,20 +479,30 @@ bool CodedInputStream::ReadVarint64Fallback(uint64* value) { // processors. uint32 part0 = 0, part1 = 0, part2 = 0; - b = *(ptr++); part0 = (b & 0x7F) ; if (!(b & 0x80)) goto done; - b = *(ptr++); part0 |= (b & 0x7F) << 7; if (!(b & 0x80)) goto done; - b = *(ptr++); part0 |= (b & 0x7F) << 14; if (!(b & 0x80)) goto done; - b = *(ptr++); part0 |= (b & 0x7F) << 21; if (!(b & 0x80)) goto done; - b = *(ptr++); part1 = (b & 0x7F) ; if (!(b & 0x80)) goto done; - b = *(ptr++); part1 |= (b & 0x7F) << 7; if (!(b & 0x80)) goto done; - b = *(ptr++); part1 |= (b & 0x7F) << 14; if (!(b & 0x80)) goto done; - b = *(ptr++); part1 |= (b & 0x7F) << 21; if (!(b & 0x80)) goto done; - b = *(ptr++); part2 = (b & 0x7F) ; if (!(b & 0x80)) goto done; - b = *(ptr++); part2 |= (b & 0x7F) << 7; if (!(b & 0x80)) goto done; + b = *(ptr++); part0 = b ; if (!(b & 0x80)) goto done; + part0 -= 0x80; + b = *(ptr++); part0 += b << 7; if (!(b & 0x80)) goto done; + part0 -= 0x80 << 7; + b = *(ptr++); part0 += b << 14; if (!(b & 0x80)) goto done; + part0 -= 0x80 << 14; + b = *(ptr++); part0 += b << 21; if (!(b & 0x80)) goto done; + part0 -= 0x80 << 21; + b = *(ptr++); part1 = b ; if (!(b & 0x80)) goto done; + part1 -= 0x80; + b = *(ptr++); part1 += b << 7; if (!(b & 0x80)) goto done; + part1 -= 0x80 << 7; + b = *(ptr++); part1 += b << 14; if (!(b & 0x80)) goto done; + part1 -= 0x80 << 14; + b = *(ptr++); part1 += b << 21; if (!(b & 0x80)) goto done; + part1 -= 0x80 << 21; + b = *(ptr++); part2 = b ; if (!(b & 0x80)) goto done; + part2 -= 0x80; + b = *(ptr++); part2 += b << 7; if (!(b & 0x80)) goto done; + // "part2 -= 0x80 << 7" is irrelevant because (0x80 << 7) << 56 is 0. // We have overrun the maximum size of a varint (10 bytes). The data // must be corrupt. - return NULL; + return false; done: Advance(ptr - buffer_); @@ -492,8 +542,8 @@ bool CodedInputStream::Refresh() { "CodedInputStream::SetTotalBytesLimit() in " "google/protobuf/io/coded_stream.h."; - // Don't warn again for this stream. - total_bytes_warning_threshold_ = -1; + // Don't warn again for this stream, and print total size at the end. + total_bytes_warning_threshold_ = -2; } const void* void_buffer; @@ -537,7 +587,8 @@ CodedOutputStream::CodedOutputStream(ZeroCopyOutputStream* output) buffer_(NULL), buffer_size_(0), total_bytes_(0), - had_error_(false) { + had_error_(false), + aliasing_enabled_(false) { // Eagerly Refresh() so buffer space is immediately available. Refresh(); // The Refresh() may have failed. If the client doesn't write any data, @@ -591,6 +642,23 @@ uint8* CodedOutputStream::WriteRawToArray( } +void CodedOutputStream::WriteAliasedRaw(const void* data, int size) { + if (size < buffer_size_ + ) { + WriteRaw(data, size); + } else { + if (buffer_size_ > 0) { + output_->BackUp(buffer_size_); + total_bytes_ -= buffer_size_; + buffer_ = NULL; + buffer_size_ = 0; + } + + total_bytes_ += size; + had_error_ |= !output_->WriteAliasedRaw(data, size); + } +} + void CodedOutputStream::WriteLittleEndian32(uint32 value) { uint8 bytes[sizeof(value)]; @@ -834,6 +902,13 @@ int CodedOutputStream::VarintSize64(uint64 value) { } } +uint8* CodedOutputStream::WriteStringWithSizeToArray(const string& str, + uint8* target) { + GOOGLE_DCHECK_LE(str.size(), kuint32max); + target = WriteVarint32ToArray(str.size(), target); + return WriteStringToArray(str, target); +} + } // namespace io } // namespace protobuf } // namespace google diff --git a/toolkit/components/protobuf/google/protobuf/io/coded_stream.h b/toolkit/components/protobuf/src/google/protobuf/io/coded_stream.h similarity index 87% rename from toolkit/components/protobuf/google/protobuf/io/coded_stream.h rename to toolkit/components/protobuf/src/google/protobuf/io/coded_stream.h index 1b6b4e18b4fa3..81fabb1d842c0 100644 --- a/toolkit/components/protobuf/google/protobuf/io/coded_stream.h +++ b/toolkit/components/protobuf/src/google/protobuf/io/coded_stream.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -170,6 +170,9 @@ class LIBPROTOBUF_EXPORT CodedInputStream { // successfully and the stream's byte limit. ~CodedInputStream(); + // Return true if this CodedInputStream reads from a flat array instead of + // a ZeroCopyInputStream. + inline bool IsFlat() const; // Skips a number of bytes. Returns false if an underlying read error // occurs. @@ -230,11 +233,22 @@ class LIBPROTOBUF_EXPORT CodedInputStream { // Read a tag. This calls ReadVarint32() and returns the result, or returns // zero (which is not a valid tag) if ReadVarint32() fails. Also, it updates // the last tag value, which can be checked with LastTagWas(). - // Always inline because this is only called in once place per parse loop + // Always inline because this is only called in one place per parse loop // but it is called for every iteration of said loop, so it should be fast. // GCC doesn't want to inline this by default. uint32 ReadTag() GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + // This usually a faster alternative to ReadTag() when cutoff is a manifest + // constant. It does particularly well for cutoff >= 127. The first part + // of the return value is the tag that was read, though it can also be 0 in + // the cases where ReadTag() would return 0. If the second part is true + // then the tag is known to be in [0, cutoff]. If not, the tag either is + // above cutoff or is 0. (There's intentional wiggle room when tag is 0, + // because that can arise in several ways, and for best performance we want + // to avoid an extra "is tag == 0?" check here.) + inline std::pair ReadTagWithCutoff(uint32 cutoff) + GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + // Usually returns true if calling ReadVarint32() now would produce the given // value. Will always return false if ReadVarint32() would not return the // given value. If ExpectTag() returns true, it also advances past @@ -261,8 +275,8 @@ class LIBPROTOBUF_EXPORT CodedInputStream { // zero, and ConsumedEntireMessage() will return true. bool ExpectAtEnd(); - // If the last call to ReadTag() returned the given value, returns true. - // Otherwise, returns false; + // If the last call to ReadTag() or ReadTagWithCutoff() returned the + // given value, returns true. Otherwise, returns false; // // This is needed because parsers for some types of embedded messages // (with field type TYPE_GROUP) don't actually know that they've reached the @@ -311,7 +325,10 @@ class LIBPROTOBUF_EXPORT CodedInputStream { // Returns the number of bytes left until the nearest limit on the // stack is hit, or -1 if no limits are in place. - int BytesUntilLimit(); + int BytesUntilLimit() const; + + // Returns current position relative to the beginning of the input stream. + int CurrentPosition() const; // Total Bytes Limit ----------------------------------------------- // To prevent malicious users from sending excessively large messages @@ -327,8 +344,9 @@ class LIBPROTOBUF_EXPORT CodedInputStream { // cause integer overflows is 512MB. The default limit is 64MB. Apps // should set shorter limits if possible. If warning_threshold is not -1, // a warning will be printed to stderr after warning_threshold bytes are - // read. An error will always be printed to stderr if the limit is - // reached. + // read. For backwards compatibility all negative values get squashed to -1, + // as other negative values might have special internal meanings. + // An error will always be printed to stderr if the limit is reached. // // This is unrelated to PushLimit()/PopLimit(). // @@ -349,15 +367,20 @@ class LIBPROTOBUF_EXPORT CodedInputStream { // something unusual. void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold); + // The Total Bytes Limit minus the Current Position, or -1 if there + // is no Total Bytes Limit. + int BytesUntilTotalBytesLimit() const; + // Recursion Limit ------------------------------------------------- // To prevent corrupt or malicious messages from causing stack overflows, // we must keep track of the depth of recursion when parsing embedded // messages and groups. CodedInputStream keeps track of this because it // is the only object that is passed down the stack during parsing. - // Sets the maximum recursion depth. The default is 64. + // Sets the maximum recursion depth. The default is 100. void SetRecursionLimit(int limit); + // Increments the current recursion depth. Returns true if the depth is // under the limit, false if it has gone over. bool IncrementRecursionDepth(); @@ -433,7 +456,8 @@ class LIBPROTOBUF_EXPORT CodedInputStream { // // Note that this feature is ignored when parsing "lite" messages as they do // not have descriptors. - void SetExtensionRegistry(DescriptorPool* pool, MessageFactory* factory); + void SetExtensionRegistry(const DescriptorPool* pool, + MessageFactory* factory); // Get the DescriptorPool set via SetExtensionRegistry(), or NULL if no pool // has been provided. @@ -457,7 +481,7 @@ class LIBPROTOBUF_EXPORT CodedInputStream { int overflow_bytes_; // LastTagWas() stuff. - uint32 last_tag_; // result of last ReadTag(). + uint32 last_tag_; // result of last ReadTag() or ReadTagWithCutoff(). // This is set true by ReadTag{Fallback/Slow}() if it is called when exactly // at EOF, or by ExpectAtEnd() when it returns true. This happens when we @@ -482,6 +506,11 @@ class LIBPROTOBUF_EXPORT CodedInputStream { // Maximum number of bytes to read, period. This is unrelated to // current_limit_. Set using SetTotalBytesLimit(). int total_bytes_limit_; + + // If positive/0: Limit for bytes read after which a warning due to size + // should be logged. + // If -1: Printing of warning disabled. Can be set by client. + // If -2: Internal: Limit has been reached, print full size when destructing. int total_bytes_warning_threshold_; // Current recursion depth, controlled by IncrementRecursionDepth() and @@ -539,7 +568,8 @@ class LIBPROTOBUF_EXPORT CodedInputStream { static const int kDefaultTotalBytesLimit = 64 << 20; // 64MB static const int kDefaultTotalBytesWarningThreshold = 32 << 20; // 32MB - static const int kDefaultRecursionLimit = 64; + + static int default_recursion_limit_; // 100 by default. }; // Class which encodes and writes binary data which is composed of varint- @@ -623,6 +653,9 @@ class LIBPROTOBUF_EXPORT CodedOutputStream { // Write raw bytes, copying them from the given buffer. void WriteRaw(const void* buffer, int size); + // Like WriteRaw() but will try to write aliased data if aliasing is + // turned on. + void WriteRawMaybeAliased(const void* data, int size); // Like WriteRaw() but writing directly to the target array. // This is _not_ inlined, as the compiler often optimizes memcpy into inline // copy loops. Since this gets called by every field with string or bytes @@ -634,8 +667,21 @@ class LIBPROTOBUF_EXPORT CodedOutputStream { void WriteString(const string& str); // Like WriteString() but writing directly to the target array. static uint8* WriteStringToArray(const string& str, uint8* target); + // Write the varint-encoded size of str followed by str. + static uint8* WriteStringWithSizeToArray(const string& str, uint8* target); + // Instructs the CodedOutputStream to allow the underlying + // ZeroCopyOutputStream to hold pointers to the original structure instead of + // copying, if it supports it (i.e. output->AllowsAliasing() is true). If the + // underlying stream does not support aliasing, then enabling it has no + // affect. For now, this only affects the behavior of + // WriteRawMaybeAliased(). + // + // NOTE: It is caller's responsibility to ensure that the chunk of memory + // remains live until all of the data has been consumed from the stream. + void EnableAliasing(bool enabled); + // Write a 32-bit little-endian integer. void WriteLittleEndian32(uint32 value); // Like WriteLittleEndian32() but writing directly to the target array. @@ -680,6 +726,21 @@ class LIBPROTOBUF_EXPORT CodedOutputStream { // If negative, 10 bytes. Otheriwse, same as VarintSize32(). static int VarintSize32SignExtended(int32 value); + // Compile-time equivalent of VarintSize32(). + template + struct StaticVarintSize32 { + static const int value = + (Value < (1 << 7)) + ? 1 + : (Value < (1 << 14)) + ? 2 + : (Value < (1 << 21)) + ? 3 + : (Value < (1 << 28)) + ? 4 + : 5; + }; + // Returns the total number of bytes written since this object was created. inline int ByteCount() const; @@ -695,6 +756,7 @@ class LIBPROTOBUF_EXPORT CodedOutputStream { int buffer_size_; int total_bytes_; // Sum of sizes of all buffers seen so far. bool had_error_; // Whether an error occurred during output. + bool aliasing_enabled_; // See EnableAliasing(). // Advance the buffer by a given number of bytes. void Advance(int amount); @@ -703,6 +765,10 @@ class LIBPROTOBUF_EXPORT CodedOutputStream { // Advance(buffer_size_). bool Refresh(); + // Like WriteRaw() but may avoid copying if the underlying + // ZeroCopyOutputStream supports it. + void WriteAliasedRaw(const void* buffer, int size); + static uint8* WriteVarint32FallbackToArray(uint32 value, uint8* target); // Always-inlined versions of WriteVarint* functions so that code can be @@ -820,6 +886,45 @@ inline uint32 CodedInputStream::ReadTag() { } } +inline std::pair CodedInputStream::ReadTagWithCutoff( + uint32 cutoff) { + // In performance-sensitive code we can expect cutoff to be a compile-time + // constant, and things like "cutoff >= kMax1ByteVarint" to be evaluated at + // compile time. + if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) { + // Hot case: buffer_ non_empty, buffer_[0] in [1, 128). + // TODO(gpike): Is it worth rearranging this? E.g., if the number of fields + // is large enough then is it better to check for the two-byte case first? + if (static_cast(buffer_[0]) > 0) { + const uint32 kMax1ByteVarint = 0x7f; + uint32 tag = last_tag_ = buffer_[0]; + Advance(1); + return make_pair(tag, cutoff >= kMax1ByteVarint || tag <= cutoff); + } + // Other hot case: cutoff >= 0x80, buffer_ has at least two bytes available, + // and tag is two bytes. The latter is tested by bitwise-and-not of the + // first byte and the second byte. + if (cutoff >= 0x80 && + GOOGLE_PREDICT_TRUE(buffer_ + 1 < buffer_end_) && + GOOGLE_PREDICT_TRUE((buffer_[0] & ~buffer_[1]) >= 0x80)) { + const uint32 kMax2ByteVarint = (0x7f << 7) + 0x7f; + uint32 tag = last_tag_ = (1u << 7) * buffer_[1] + (buffer_[0] - 0x80); + Advance(2); + // It might make sense to test for tag == 0 now, but it is so rare that + // that we don't bother. A varint-encoded 0 should be one byte unless + // the encoder lost its mind. The second part of the return value of + // this function is allowed to be either true or false if the tag is 0, + // so we don't have to check for tag == 0. We may need to check whether + // it exceeds cutoff. + bool at_or_below_cutoff = cutoff >= kMax2ByteVarint || tag <= cutoff; + return make_pair(tag, at_or_below_cutoff); + } + } + // Slow path + last_tag_ = ReadTagFallback(); + return make_pair(last_tag_, static_cast(last_tag_ - 1) < cutoff); +} + inline bool CodedInputStream::LastTagWas(uint32 expected) { return last_tag_ == expected; } @@ -876,7 +981,9 @@ inline bool CodedInputStream::ExpectAtEnd() { // If we are at a limit we know no more bytes can be read. Otherwise, it's // hard to say without calling Refresh(), and we'd rather not do that. - if (buffer_ == buffer_end_ && buffer_size_after_limit_ != 0) { + if (buffer_ == buffer_end_ && + ((buffer_size_after_limit_ != 0) || + (total_bytes_read_ == current_limit_))) { last_tag_ = 0; // Pretend we called ReadTag()... legitimate_message_end_ = true; // ... and it hit EOF. return true; @@ -885,6 +992,10 @@ inline bool CodedInputStream::ExpectAtEnd() { } } +inline int CodedInputStream::CurrentPosition() const { + return total_bytes_read_ - (BufferSize() + buffer_size_after_limit_); +} + inline uint8* CodedOutputStream::GetDirectBufferForNBytesAndAdvance(int size) { if (buffer_size_ < size) { return NULL; @@ -993,6 +1104,15 @@ inline void CodedOutputStream::WriteString(const string& str) { WriteRaw(str.data(), static_cast(str.size())); } +inline void CodedOutputStream::WriteRawMaybeAliased( + const void* data, int size) { + if (aliasing_enabled_) { + WriteAliasedRaw(data, size); + } else { + WriteRaw(data, size); + } +} + inline uint8* CodedOutputStream::WriteStringToArray( const string& str, uint8* target) { return WriteRawToArray(str.data(), static_cast(str.size()), target); @@ -1024,7 +1144,7 @@ inline void CodedInputStream::DecrementRecursionDepth() { if (recursion_depth_ > 0) --recursion_depth_; } -inline void CodedInputStream::SetExtensionRegistry(DescriptorPool* pool, +inline void CodedInputStream::SetExtensionRegistry(const DescriptorPool* pool, MessageFactory* factory) { extension_pool_ = pool; extension_factory_ = factory; @@ -1056,7 +1176,7 @@ inline CodedInputStream::CodedInputStream(ZeroCopyInputStream* input) total_bytes_limit_(kDefaultTotalBytesLimit), total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), recursion_depth_(0), - recursion_limit_(kDefaultRecursionLimit), + recursion_limit_(default_recursion_limit_), extension_pool_(NULL), extension_factory_(NULL) { // Eagerly Refresh() so buffer space is immediately available. @@ -1077,17 +1197,15 @@ inline CodedInputStream::CodedInputStream(const uint8* buffer, int size) total_bytes_limit_(kDefaultTotalBytesLimit), total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), recursion_depth_(0), - recursion_limit_(kDefaultRecursionLimit), + recursion_limit_(default_recursion_limit_), extension_pool_(NULL), extension_factory_(NULL) { // Note that setting current_limit_ == size is important to prevent some // code paths from trying to access input_ and segfaulting. } -inline CodedInputStream::~CodedInputStream() { - if (input_ != NULL) { - BackUpInputToCurrentPosition(); - } +inline bool CodedInputStream::IsFlat() const { + return input_ == NULL; } } // namespace io diff --git a/toolkit/components/protobuf/google/protobuf/io/coded_stream_inl.h b/toolkit/components/protobuf/src/google/protobuf/io/coded_stream_inl.h similarity index 85% rename from toolkit/components/protobuf/google/protobuf/io/coded_stream_inl.h rename to toolkit/components/protobuf/src/google/protobuf/io/coded_stream_inl.h index e9799d4772524..88c14cab40900 100644 --- a/toolkit/components/protobuf/google/protobuf/io/coded_stream_inl.h +++ b/toolkit/components/protobuf/src/google/protobuf/io/coded_stream_inl.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -37,8 +37,9 @@ #define GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__ #include +#include #include -#include +#include namespace google { namespace protobuf { @@ -50,8 +51,12 @@ inline bool CodedInputStream::InternalReadStringInline(string* buffer, if (BufferSize() >= size) { STLStringResizeUninitialized(buffer, size); - memcpy(string_as_array(buffer), buffer_, size); - Advance(size); + // When buffer is empty, string_as_array(buffer) will return NULL but memcpy + // requires non-NULL pointers even when size is 0. Hench this check. + if (size > 0) { + memcpy(mutable_string_data(buffer), buffer_, size); + Advance(size); + } return true; } diff --git a/toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.cc b/toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.cc new file mode 100644 index 0000000000000..6e4054edaf490 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.cc @@ -0,0 +1,325 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: brianolson@google.com (Brian Olson) +// +// This file contains the implementation of classes GzipInputStream and +// GzipOutputStream. + + +#if HAVE_ZLIB +#include + +#include + +namespace google { +namespace protobuf { +namespace io { + +static const int kDefaultBufferSize = 65536; + +GzipInputStream::GzipInputStream( + ZeroCopyInputStream* sub_stream, Format format, int buffer_size) + : format_(format), sub_stream_(sub_stream), zerror_(Z_OK) { + zcontext_.zalloc = Z_NULL; + zcontext_.zfree = Z_NULL; + zcontext_.opaque = Z_NULL; + zcontext_.total_out = 0; + zcontext_.next_in = NULL; + zcontext_.avail_in = 0; + zcontext_.total_in = 0; + zcontext_.msg = NULL; + if (buffer_size == -1) { + output_buffer_length_ = kDefaultBufferSize; + } else { + output_buffer_length_ = buffer_size; + } + output_buffer_ = operator new(output_buffer_length_); + GOOGLE_CHECK(output_buffer_ != NULL); + zcontext_.next_out = static_cast(output_buffer_); + zcontext_.avail_out = output_buffer_length_; + output_position_ = output_buffer_; +} +GzipInputStream::~GzipInputStream() { + operator delete(output_buffer_); + zerror_ = inflateEnd(&zcontext_); +} + +static inline int internalInflateInit2( + z_stream* zcontext, GzipInputStream::Format format) { + int windowBitsFormat = 0; + switch (format) { + case GzipInputStream::GZIP: windowBitsFormat = 16; break; + case GzipInputStream::AUTO: windowBitsFormat = 32; break; + case GzipInputStream::ZLIB: windowBitsFormat = 0; break; + } + return inflateInit2(zcontext, /* windowBits */15 | windowBitsFormat); +} + +int GzipInputStream::Inflate(int flush) { + if ((zerror_ == Z_OK) && (zcontext_.avail_out == 0)) { + // previous inflate filled output buffer. don't change input params yet. + } else if (zcontext_.avail_in == 0) { + const void* in; + int in_size; + bool first = zcontext_.next_in == NULL; + bool ok = sub_stream_->Next(&in, &in_size); + if (!ok) { + zcontext_.next_out = NULL; + zcontext_.avail_out = 0; + return Z_STREAM_END; + } + zcontext_.next_in = static_cast(const_cast(in)); + zcontext_.avail_in = in_size; + if (first) { + int error = internalInflateInit2(&zcontext_, format_); + if (error != Z_OK) { + return error; + } + } + } + zcontext_.next_out = static_cast(output_buffer_); + zcontext_.avail_out = output_buffer_length_; + output_position_ = output_buffer_; + int error = inflate(&zcontext_, flush); + return error; +} + +void GzipInputStream::DoNextOutput(const void** data, int* size) { + *data = output_position_; + *size = ((uintptr_t)zcontext_.next_out) - ((uintptr_t)output_position_); + output_position_ = zcontext_.next_out; +} + +// implements ZeroCopyInputStream ---------------------------------- +bool GzipInputStream::Next(const void** data, int* size) { + bool ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END) + || (zerror_ == Z_BUF_ERROR); + if ((!ok) || (zcontext_.next_out == NULL)) { + return false; + } + if (zcontext_.next_out != output_position_) { + DoNextOutput(data, size); + return true; + } + if (zerror_ == Z_STREAM_END) { + if (zcontext_.next_out != NULL) { + // sub_stream_ may have concatenated streams to follow + zerror_ = inflateEnd(&zcontext_); + if (zerror_ != Z_OK) { + return false; + } + zerror_ = internalInflateInit2(&zcontext_, format_); + if (zerror_ != Z_OK) { + return false; + } + } else { + *data = NULL; + *size = 0; + return false; + } + } + zerror_ = Inflate(Z_NO_FLUSH); + if ((zerror_ == Z_STREAM_END) && (zcontext_.next_out == NULL)) { + // The underlying stream's Next returned false inside Inflate. + return false; + } + ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END) + || (zerror_ == Z_BUF_ERROR); + if (!ok) { + return false; + } + DoNextOutput(data, size); + return true; +} +void GzipInputStream::BackUp(int count) { + output_position_ = reinterpret_cast( + reinterpret_cast(output_position_) - count); +} +bool GzipInputStream::Skip(int count) { + const void* data; + int size; + bool ok = Next(&data, &size); + while (ok && (size < count)) { + count -= size; + ok = Next(&data, &size); + } + if (size > count) { + BackUp(size - count); + } + return ok; +} +int64 GzipInputStream::ByteCount() const { + return zcontext_.total_out + + (((uintptr_t)zcontext_.next_out) - ((uintptr_t)output_position_)); +} + +// ========================================================================= + +GzipOutputStream::Options::Options() + : format(GZIP), + buffer_size(kDefaultBufferSize), + compression_level(Z_DEFAULT_COMPRESSION), + compression_strategy(Z_DEFAULT_STRATEGY) {} + +GzipOutputStream::GzipOutputStream(ZeroCopyOutputStream* sub_stream) { + Init(sub_stream, Options()); +} + +GzipOutputStream::GzipOutputStream(ZeroCopyOutputStream* sub_stream, + const Options& options) { + Init(sub_stream, options); +} + +void GzipOutputStream::Init(ZeroCopyOutputStream* sub_stream, + const Options& options) { + sub_stream_ = sub_stream; + sub_data_ = NULL; + sub_data_size_ = 0; + + input_buffer_length_ = options.buffer_size; + input_buffer_ = operator new(input_buffer_length_); + GOOGLE_CHECK(input_buffer_ != NULL); + + zcontext_.zalloc = Z_NULL; + zcontext_.zfree = Z_NULL; + zcontext_.opaque = Z_NULL; + zcontext_.next_out = NULL; + zcontext_.avail_out = 0; + zcontext_.total_out = 0; + zcontext_.next_in = NULL; + zcontext_.avail_in = 0; + zcontext_.total_in = 0; + zcontext_.msg = NULL; + // default to GZIP format + int windowBitsFormat = 16; + if (options.format == ZLIB) { + windowBitsFormat = 0; + } + zerror_ = deflateInit2( + &zcontext_, + options.compression_level, + Z_DEFLATED, + /* windowBits */15 | windowBitsFormat, + /* memLevel (default) */8, + options.compression_strategy); +} + +GzipOutputStream::~GzipOutputStream() { + Close(); + if (input_buffer_ != NULL) { + operator delete(input_buffer_); + } +} + +// private +int GzipOutputStream::Deflate(int flush) { + int error = Z_OK; + do { + if ((sub_data_ == NULL) || (zcontext_.avail_out == 0)) { + bool ok = sub_stream_->Next(&sub_data_, &sub_data_size_); + if (!ok) { + sub_data_ = NULL; + sub_data_size_ = 0; + return Z_BUF_ERROR; + } + GOOGLE_CHECK_GT(sub_data_size_, 0); + zcontext_.next_out = static_cast(sub_data_); + zcontext_.avail_out = sub_data_size_; + } + error = deflate(&zcontext_, flush); + } while (error == Z_OK && zcontext_.avail_out == 0); + if ((flush == Z_FULL_FLUSH) || (flush == Z_FINISH)) { + // Notify lower layer of data. + sub_stream_->BackUp(zcontext_.avail_out); + // We don't own the buffer anymore. + sub_data_ = NULL; + sub_data_size_ = 0; + } + return error; +} + +// implements ZeroCopyOutputStream --------------------------------- +bool GzipOutputStream::Next(void** data, int* size) { + if ((zerror_ != Z_OK) && (zerror_ != Z_BUF_ERROR)) { + return false; + } + if (zcontext_.avail_in != 0) { + zerror_ = Deflate(Z_NO_FLUSH); + if (zerror_ != Z_OK) { + return false; + } + } + if (zcontext_.avail_in == 0) { + // all input was consumed. reset the buffer. + zcontext_.next_in = static_cast(input_buffer_); + zcontext_.avail_in = input_buffer_length_; + *data = input_buffer_; + *size = input_buffer_length_; + } else { + // The loop in Deflate should consume all avail_in + GOOGLE_LOG(DFATAL) << "Deflate left bytes unconsumed"; + } + return true; +} +void GzipOutputStream::BackUp(int count) { + GOOGLE_CHECK_GE(zcontext_.avail_in, count); + zcontext_.avail_in -= count; +} +int64 GzipOutputStream::ByteCount() const { + return zcontext_.total_in + zcontext_.avail_in; +} + +bool GzipOutputStream::Flush() { + zerror_ = Deflate(Z_FULL_FLUSH); + // Return true if the flush succeeded or if it was a no-op. + return (zerror_ == Z_OK) || + (zerror_ == Z_BUF_ERROR && zcontext_.avail_in == 0 && + zcontext_.avail_out != 0); +} + +bool GzipOutputStream::Close() { + if ((zerror_ != Z_OK) && (zerror_ != Z_BUF_ERROR)) { + return false; + } + do { + zerror_ = Deflate(Z_FINISH); + } while (zerror_ == Z_OK); + zerror_ = deflateEnd(&zcontext_); + bool ok = zerror_ == Z_OK; + zerror_ = Z_STREAM_END; + return ok; +} + +} // namespace io +} // namespace protobuf +} // namespace google + +#endif // HAVE_ZLIB diff --git a/toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.h b/toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.h new file mode 100644 index 0000000000000..c7ccc260d0018 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/io/gzip_stream.h @@ -0,0 +1,209 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: brianolson@google.com (Brian Olson) +// +// This file contains the definition for classes GzipInputStream and +// GzipOutputStream. +// +// GzipInputStream decompresses data from an underlying +// ZeroCopyInputStream and provides the decompressed data as a +// ZeroCopyInputStream. +// +// GzipOutputStream is an ZeroCopyOutputStream that compresses data to +// an underlying ZeroCopyOutputStream. + +#ifndef GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__ +#define GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__ + +#include + +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +// A ZeroCopyInputStream that reads compressed data through zlib +class LIBPROTOBUF_EXPORT GzipInputStream : public ZeroCopyInputStream { + public: + // Format key for constructor + enum Format { + // zlib will autodetect gzip header or deflate stream + AUTO = 0, + + // GZIP streams have some extra header data for file attributes. + GZIP = 1, + + // Simpler zlib stream format. + ZLIB = 2, + }; + + // buffer_size and format may be -1 for default of 64kB and GZIP format + explicit GzipInputStream( + ZeroCopyInputStream* sub_stream, + Format format = AUTO, + int buffer_size = -1); + virtual ~GzipInputStream(); + + // Return last error message or NULL if no error. + inline const char* ZlibErrorMessage() const { + return zcontext_.msg; + } + inline int ZlibErrorCode() const { + return zerror_; + } + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size); + void BackUp(int count); + bool Skip(int count); + int64 ByteCount() const; + + private: + Format format_; + + ZeroCopyInputStream* sub_stream_; + + z_stream zcontext_; + int zerror_; + + void* output_buffer_; + void* output_position_; + size_t output_buffer_length_; + + int Inflate(int flush); + void DoNextOutput(const void** data, int* size); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipInputStream); +}; + + +class LIBPROTOBUF_EXPORT GzipOutputStream : public ZeroCopyOutputStream { + public: + // Format key for constructor + enum Format { + // GZIP streams have some extra header data for file attributes. + GZIP = 1, + + // Simpler zlib stream format. + ZLIB = 2, + }; + + struct Options { + // Defaults to GZIP. + Format format; + + // What size buffer to use internally. Defaults to 64kB. + int buffer_size; + + // A number between 0 and 9, where 0 is no compression and 9 is best + // compression. Defaults to Z_DEFAULT_COMPRESSION (see zlib.h). + int compression_level; + + // Defaults to Z_DEFAULT_STRATEGY. Can also be set to Z_FILTERED, + // Z_HUFFMAN_ONLY, or Z_RLE. See the documentation for deflateInit2 in + // zlib.h for definitions of these constants. + int compression_strategy; + + Options(); // Initializes with default values. + }; + + // Create a GzipOutputStream with default options. + explicit GzipOutputStream(ZeroCopyOutputStream* sub_stream); + + // Create a GzipOutputStream with the given options. + GzipOutputStream( + ZeroCopyOutputStream* sub_stream, + const Options& options); + + virtual ~GzipOutputStream(); + + // Return last error message or NULL if no error. + inline const char* ZlibErrorMessage() const { + return zcontext_.msg; + } + inline int ZlibErrorCode() const { + return zerror_; + } + + // Flushes data written so far to zipped data in the underlying stream. + // It is the caller's responsibility to flush the underlying stream if + // necessary. + // Compression may be less efficient stopping and starting around flushes. + // Returns true if no error. + // + // Please ensure that block size is > 6. Here is an excerpt from the zlib + // doc that explains why: + // + // In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out + // is greater than six to avoid repeated flush markers due to + // avail_out == 0 on return. + bool Flush(); + + // Writes out all data and closes the gzip stream. + // It is the caller's responsibility to close the underlying stream if + // necessary. + // Returns true if no error. + bool Close(); + + // implements ZeroCopyOutputStream --------------------------------- + bool Next(void** data, int* size); + void BackUp(int count); + int64 ByteCount() const; + + private: + ZeroCopyOutputStream* sub_stream_; + // Result from calling Next() on sub_stream_ + void* sub_data_; + int sub_data_size_; + + z_stream zcontext_; + int zerror_; + void* input_buffer_; + size_t input_buffer_length_; + + // Shared constructor code. + void Init(ZeroCopyOutputStream* sub_stream, const Options& options); + + // Do some compression. + // Takes zlib flush mode. + // Returns zlib error code. + int Deflate(int flush); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipOutputStream); +}; + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__ diff --git a/toolkit/components/protobuf/google/protobuf/io/package_info.h b/toolkit/components/protobuf/src/google/protobuf/io/package_info.h similarity index 97% rename from toolkit/components/protobuf/google/protobuf/io/package_info.h rename to toolkit/components/protobuf/src/google/protobuf/io/package_info.h index 7a7a4e7738d2b..dc1fc91e5b4eb 100644 --- a/toolkit/components/protobuf/google/protobuf/io/package_info.h +++ b/toolkit/components/protobuf/src/google/protobuf/io/package_info.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are diff --git a/toolkit/components/protobuf/src/google/protobuf/io/printer.cc b/toolkit/components/protobuf/src/google/protobuf/io/printer.cc new file mode 100644 index 0000000000000..c8df41778e9cb --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/io/printer.cc @@ -0,0 +1,198 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +Printer::Printer(ZeroCopyOutputStream* output, char variable_delimiter) + : variable_delimiter_(variable_delimiter), + output_(output), + buffer_(NULL), + buffer_size_(0), + at_start_of_line_(true), + failed_(false) { +} + +Printer::~Printer() { + // Only BackUp() if we have called Next() at least once and never failed. + if (buffer_size_ > 0 && !failed_) { + output_->BackUp(buffer_size_); + } +} + +void Printer::Print(const map& variables, const char* text) { + int size = strlen(text); + int pos = 0; // The number of bytes we've written so far. + + for (int i = 0; i < size; i++) { + if (text[i] == '\n') { + // Saw newline. If there is more text, we may need to insert an indent + // here. So, write what we have so far, including the '\n'. + WriteRaw(text + pos, i - pos + 1); + pos = i + 1; + + // Setting this true will cause the next WriteRaw() to insert an indent + // first. + at_start_of_line_ = true; + + } else if (text[i] == variable_delimiter_) { + // Saw the start of a variable name. + + // Write what we have so far. + WriteRaw(text + pos, i - pos); + pos = i + 1; + + // Find closing delimiter. + const char* end = strchr(text + pos, variable_delimiter_); + if (end == NULL) { + GOOGLE_LOG(DFATAL) << " Unclosed variable name."; + end = text + pos; + } + int endpos = end - text; + + string varname(text + pos, endpos - pos); + if (varname.empty()) { + // Two delimiters in a row reduce to a literal delimiter character. + WriteRaw(&variable_delimiter_, 1); + } else { + // Replace with the variable's value. + map::const_iterator iter = variables.find(varname); + if (iter == variables.end()) { + GOOGLE_LOG(DFATAL) << " Undefined variable: " << varname; + } else { + WriteRaw(iter->second.data(), iter->second.size()); + } + } + + // Advance past this variable. + i = endpos; + pos = endpos + 1; + } + } + + // Write the rest. + WriteRaw(text + pos, size - pos); +} + +void Printer::Print(const char* text) { + static map empty; + Print(empty, text); +} + +void Printer::Print(const char* text, + const char* variable, const string& value) { + map vars; + vars[variable] = value; + Print(vars, text); +} + +void Printer::Print(const char* text, + const char* variable1, const string& value1, + const char* variable2, const string& value2) { + map vars; + vars[variable1] = value1; + vars[variable2] = value2; + Print(vars, text); +} + +void Printer::Print(const char* text, + const char* variable1, const string& value1, + const char* variable2, const string& value2, + const char* variable3, const string& value3) { + map vars; + vars[variable1] = value1; + vars[variable2] = value2; + vars[variable3] = value3; + Print(vars, text); +} + +void Printer::Indent() { + indent_ += " "; +} + +void Printer::Outdent() { + if (indent_.empty()) { + GOOGLE_LOG(DFATAL) << " Outdent() without matching Indent()."; + return; + } + + indent_.resize(indent_.size() - 2); +} + +void Printer::PrintRaw(const string& data) { + WriteRaw(data.data(), data.size()); +} + +void Printer::PrintRaw(const char* data) { + if (failed_) return; + WriteRaw(data, strlen(data)); +} + +void Printer::WriteRaw(const char* data, int size) { + if (failed_) return; + if (size == 0) return; + + if (at_start_of_line_ && (size > 0) && (data[0] != '\n')) { + // Insert an indent. + at_start_of_line_ = false; + WriteRaw(indent_.data(), indent_.size()); + if (failed_) return; + } + + while (size > buffer_size_) { + // Data exceeds space in the buffer. Copy what we can and request a + // new buffer. + memcpy(buffer_, data, buffer_size_); + data += buffer_size_; + size -= buffer_size_; + void* void_buffer; + failed_ = !output_->Next(&void_buffer, &buffer_size_); + if (failed_) return; + buffer_ = reinterpret_cast(void_buffer); + } + + // Buffer is big enough to receive the data; copy it. + memcpy(buffer_, data, size); + buffer_ += size; + buffer_size_ -= size; +} + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/io/printer.h b/toolkit/components/protobuf/src/google/protobuf/io/printer.h new file mode 100644 index 0000000000000..f06cbf2f0cf21 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/io/printer.h @@ -0,0 +1,136 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Utility class for writing text to a ZeroCopyOutputStream. + +#ifndef GOOGLE_PROTOBUF_IO_PRINTER_H__ +#define GOOGLE_PROTOBUF_IO_PRINTER_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +class ZeroCopyOutputStream; // zero_copy_stream.h + +// This simple utility class assists in code generation. It basically +// allows the caller to define a set of variables and then output some +// text with variable substitutions. Example usage: +// +// Printer printer(output, '$'); +// map vars; +// vars["name"] = "Bob"; +// printer.Print(vars, "My name is $name$."); +// +// The above writes "My name is Bob." to the output stream. +// +// Printer aggressively enforces correct usage, crashing (with assert failures) +// in the case of undefined variables in debug builds. This helps greatly in +// debugging code which uses it. +class LIBPROTOBUF_EXPORT Printer { + public: + // Create a printer that writes text to the given output stream. Use the + // given character as the delimiter for variables. + Printer(ZeroCopyOutputStream* output, char variable_delimiter); + ~Printer(); + + // Print some text after applying variable substitutions. If a particular + // variable in the text is not defined, this will crash. Variables to be + // substituted are identified by their names surrounded by delimiter + // characters (as given to the constructor). The variable bindings are + // defined by the given map. + void Print(const map& variables, const char* text); + + // Like the first Print(), except the substitutions are given as parameters. + void Print(const char* text); + // Like the first Print(), except the substitutions are given as parameters. + void Print(const char* text, const char* variable, const string& value); + // Like the first Print(), except the substitutions are given as parameters. + void Print(const char* text, const char* variable1, const string& value1, + const char* variable2, const string& value2); + // Like the first Print(), except the substitutions are given as parameters. + void Print(const char* text, const char* variable1, const string& value1, + const char* variable2, const string& value2, + const char* variable3, const string& value3); + // TODO(kenton): Overloaded versions with more variables? Three seems + // to be enough. + + // Indent text by two spaces. After calling Indent(), two spaces will be + // inserted at the beginning of each line of text. Indent() may be called + // multiple times to produce deeper indents. + void Indent(); + + // Reduces the current indent level by two spaces, or crashes if the indent + // level is zero. + void Outdent(); + + // Write a string to the output buffer. + // This method does not look for newlines to add indentation. + void PrintRaw(const string& data); + + // Write a zero-delimited string to output buffer. + // This method does not look for newlines to add indentation. + void PrintRaw(const char* data); + + // Write some bytes to the output buffer. + // This method does not look for newlines to add indentation. + void WriteRaw(const char* data, int size); + + // True if any write to the underlying stream failed. (We don't just + // crash in this case because this is an I/O failure, not a programming + // error.) + bool failed() const { return failed_; } + + private: + const char variable_delimiter_; + + ZeroCopyOutputStream* const output_; + char* buffer_; + int buffer_size_; + + string indent_; + bool at_start_of_line_; + bool failed_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Printer); +}; + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_PRINTER_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/io/strtod.cc b/toolkit/components/protobuf/src/google/protobuf/io/strtod.cc new file mode 100644 index 0000000000000..56973439d953e --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/io/strtod.cc @@ -0,0 +1,113 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#include +#include +#include + +#include + +namespace google { +namespace protobuf { +namespace io { + +// ---------------------------------------------------------------------- +// NoLocaleStrtod() +// This code will make you cry. +// ---------------------------------------------------------------------- + +namespace { + +// Returns a string identical to *input except that the character pointed to +// by radix_pos (which should be '.') is replaced with the locale-specific +// radix character. +string LocalizeRadix(const char* input, const char* radix_pos) { + // Determine the locale-specific radix character by calling sprintf() to + // print the number 1.5, then stripping off the digits. As far as I can + // tell, this is the only portable, thread-safe way to get the C library + // to divuldge the locale's radix character. No, localeconv() is NOT + // thread-safe. + char temp[16]; + int size = sprintf(temp, "%.1f", 1.5); + GOOGLE_CHECK_EQ(temp[0], '1'); + GOOGLE_CHECK_EQ(temp[size-1], '5'); + GOOGLE_CHECK_LE(size, 6); + + // Now replace the '.' in the input with it. + string result; + result.reserve(strlen(input) + size - 3); + result.append(input, radix_pos); + result.append(temp + 1, size - 2); + result.append(radix_pos + 1); + return result; +} + +} // namespace + +double NoLocaleStrtod(const char* text, char** original_endptr) { + // We cannot simply set the locale to "C" temporarily with setlocale() + // as this is not thread-safe. Instead, we try to parse in the current + // locale first. If parsing stops at a '.' character, then this is a + // pretty good hint that we're actually in some other locale in which + // '.' is not the radix character. + + char* temp_endptr; + double result = strtod(text, &temp_endptr); + if (original_endptr != NULL) *original_endptr = temp_endptr; + if (*temp_endptr != '.') return result; + + // Parsing halted on a '.'. Perhaps we're in a different locale? Let's + // try to replace the '.' with a locale-specific radix character and + // try again. + string localized = LocalizeRadix(text, temp_endptr); + const char* localized_cstr = localized.c_str(); + char* localized_endptr; + result = strtod(localized_cstr, &localized_endptr); + if ((localized_endptr - localized_cstr) > + (temp_endptr - text)) { + // This attempt got further, so replacing the decimal must have helped. + // Update original_endptr to point at the right location. + if (original_endptr != NULL) { + // size_diff is non-zero if the localized radix has multiple bytes. + int size_diff = localized.size() - strlen(text); + // const_cast is necessary to match the strtod() interface. + *original_endptr = const_cast( + text + (localized_endptr - localized_cstr - size_diff)); + } + } + + return result; +} + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/io/strtod.h b/toolkit/components/protobuf/src/google/protobuf/io/strtod.h new file mode 100644 index 0000000000000..c2efc8d3e41d5 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/io/strtod.h @@ -0,0 +1,50 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A locale-independent version of strtod(), used to parse floating +// point default values in .proto files, where the decimal separator +// is always a dot. + +#ifndef GOOGLE_PROTOBUF_IO_STRTOD_H__ +#define GOOGLE_PROTOBUF_IO_STRTOD_H__ + +namespace google { +namespace protobuf { +namespace io { + +// A locale-independent version of the standard strtod(), which always +// uses a dot as the decimal separator. +double NoLocaleStrtod(const char* str, char** endptr); + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_STRTOD_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/io/tokenizer.cc b/toolkit/components/protobuf/src/google/protobuf/io/tokenizer.cc new file mode 100644 index 0000000000000..ef2de300bfd87 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/io/tokenizer.cc @@ -0,0 +1,1127 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Here we have a hand-written lexer. At first you might ask yourself, +// "Hand-written text processing? Is Kenton crazy?!" Well, first of all, +// yes I am crazy, but that's beside the point. There are actually reasons +// why I ended up writing this this way. +// +// The traditional approach to lexing is to use lex to generate a lexer for +// you. Unfortunately, lex's output is ridiculously ugly and difficult to +// integrate cleanly with C++ code, especially abstract code or code meant +// as a library. Better parser-generators exist but would add dependencies +// which most users won't already have, which we'd like to avoid. (GNU flex +// has a C++ output option, but it's still ridiculously ugly, non-abstract, +// and not library-friendly.) +// +// The next approach that any good software engineer should look at is to +// use regular expressions. And, indeed, I did. I have code which +// implements this same class using regular expressions. It's about 200 +// lines shorter. However: +// - Rather than error messages telling you "This string has an invalid +// escape sequence at line 5, column 45", you get error messages like +// "Parse error on line 5". Giving more precise errors requires adding +// a lot of code that ends up basically as complex as the hand-coded +// version anyway. +// - The regular expression to match a string literal looks like this: +// kString = new RE("(\"([^\"\\\\]|" // non-escaped +// "\\\\[abfnrtv?\"'\\\\0-7]|" // normal escape +// "\\\\x[0-9a-fA-F])*\"|" // hex escape +// "\'([^\'\\\\]|" // Also support single-quotes. +// "\\\\[abfnrtv?\"'\\\\0-7]|" +// "\\\\x[0-9a-fA-F])*\')"); +// Verifying the correctness of this line noise is actually harder than +// verifying the correctness of ConsumeString(), defined below. I'm not +// even confident that the above is correct, after staring at it for some +// time. +// - PCRE is fast, but there's still more overhead involved than the code +// below. +// - Sadly, regular expressions are not part of the C standard library, so +// using them would require depending on some other library. For the +// open source release, this could be really annoying. Nobody likes +// downloading one piece of software just to find that they need to +// download something else to make it work, and in all likelihood +// people downloading Protocol Buffers will already be doing so just +// to make something else work. We could include a copy of PCRE with +// our code, but that obligates us to keep it up-to-date and just seems +// like a big waste just to save 200 lines of code. +// +// On a similar but unrelated note, I'm even scared to use ctype.h. +// Apparently functions like isalpha() are locale-dependent. So, if we used +// that, then if this code is being called from some program that doesn't +// have its locale set to "C", it would behave strangely. We can't just set +// the locale to "C" ourselves since we might break the calling program that +// way, particularly if it is multi-threaded. WTF? Someone please let me +// (Kenton) know if I'm missing something here... +// +// I'd love to hear about other alternatives, though, as this code isn't +// exactly pretty. + +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { +namespace { + +// As mentioned above, I don't trust ctype.h due to the presence of "locales". +// So, I have written replacement functions here. Someone please smack me if +// this is a bad idea or if there is some way around this. +// +// These "character classes" are designed to be used in template methods. +// For instance, Tokenizer::ConsumeZeroOrMore() will eat +// whitespace. + +// Note: No class is allowed to contain '\0', since this is used to mark end- +// of-input and is handled specially. + +#define CHARACTER_CLASS(NAME, EXPRESSION) \ + class NAME { \ + public: \ + static inline bool InClass(char c) { \ + return EXPRESSION; \ + } \ + } + +CHARACTER_CLASS(Whitespace, c == ' ' || c == '\n' || c == '\t' || + c == '\r' || c == '\v' || c == '\f'); +CHARACTER_CLASS(WhitespaceNoNewline, c == ' ' || c == '\t' || + c == '\r' || c == '\v' || c == '\f'); + +CHARACTER_CLASS(Unprintable, c < ' ' && c > '\0'); + +CHARACTER_CLASS(Digit, '0' <= c && c <= '9'); +CHARACTER_CLASS(OctalDigit, '0' <= c && c <= '7'); +CHARACTER_CLASS(HexDigit, ('0' <= c && c <= '9') || + ('a' <= c && c <= 'f') || + ('A' <= c && c <= 'F')); + +CHARACTER_CLASS(Letter, ('a' <= c && c <= 'z') || + ('A' <= c && c <= 'Z') || + (c == '_')); + +CHARACTER_CLASS(Alphanumeric, ('a' <= c && c <= 'z') || + ('A' <= c && c <= 'Z') || + ('0' <= c && c <= '9') || + (c == '_')); + +CHARACTER_CLASS(Escape, c == 'a' || c == 'b' || c == 'f' || c == 'n' || + c == 'r' || c == 't' || c == 'v' || c == '\\' || + c == '?' || c == '\'' || c == '\"'); + +#undef CHARACTER_CLASS + +// Given a char, interpret it as a numeric digit and return its value. +// This supports any number base up to 36. +inline int DigitValue(char digit) { + if ('0' <= digit && digit <= '9') return digit - '0'; + if ('a' <= digit && digit <= 'z') return digit - 'a' + 10; + if ('A' <= digit && digit <= 'Z') return digit - 'A' + 10; + return -1; +} + +// Inline because it's only used in one place. +inline char TranslateEscape(char c) { + switch (c) { + case 'a': return '\a'; + case 'b': return '\b'; + case 'f': return '\f'; + case 'n': return '\n'; + case 'r': return '\r'; + case 't': return '\t'; + case 'v': return '\v'; + case '\\': return '\\'; + case '?': return '\?'; // Trigraphs = :( + case '\'': return '\''; + case '"': return '\"'; + + // We expect escape sequences to have been validated separately. + default: return '?'; + } +} + +} // anonymous namespace + +ErrorCollector::~ErrorCollector() {} + +// =================================================================== + +Tokenizer::Tokenizer(ZeroCopyInputStream* input, + ErrorCollector* error_collector) + : input_(input), + error_collector_(error_collector), + buffer_(NULL), + buffer_size_(0), + buffer_pos_(0), + read_error_(false), + line_(0), + column_(0), + record_target_(NULL), + record_start_(-1), + allow_f_after_float_(false), + comment_style_(CPP_COMMENT_STYLE), + require_space_after_number_(true), + allow_multiline_strings_(false) { + + current_.line = 0; + current_.column = 0; + current_.end_column = 0; + current_.type = TYPE_START; + + Refresh(); +} + +Tokenizer::~Tokenizer() { + // If we had any buffer left unread, return it to the underlying stream + // so that someone else can read it. + if (buffer_size_ > buffer_pos_) { + input_->BackUp(buffer_size_ - buffer_pos_); + } +} + +// ------------------------------------------------------------------- +// Internal helpers. + +void Tokenizer::NextChar() { + // Update our line and column counters based on the character being + // consumed. + if (current_char_ == '\n') { + ++line_; + column_ = 0; + } else if (current_char_ == '\t') { + column_ += kTabWidth - column_ % kTabWidth; + } else { + ++column_; + } + + // Advance to the next character. + ++buffer_pos_; + if (buffer_pos_ < buffer_size_) { + current_char_ = buffer_[buffer_pos_]; + } else { + Refresh(); + } +} + +void Tokenizer::Refresh() { + if (read_error_) { + current_char_ = '\0'; + return; + } + + // If we're in a token, append the rest of the buffer to it. + if (record_target_ != NULL && record_start_ < buffer_size_) { + record_target_->append(buffer_ + record_start_, buffer_size_ - record_start_); + record_start_ = 0; + } + + const void* data = NULL; + buffer_ = NULL; + buffer_pos_ = 0; + do { + if (!input_->Next(&data, &buffer_size_)) { + // end of stream (or read error) + buffer_size_ = 0; + read_error_ = true; + current_char_ = '\0'; + return; + } + } while (buffer_size_ == 0); + + buffer_ = static_cast(data); + + current_char_ = buffer_[0]; +} + +inline void Tokenizer::RecordTo(string* target) { + record_target_ = target; + record_start_ = buffer_pos_; +} + +inline void Tokenizer::StopRecording() { + // Note: The if() is necessary because some STL implementations crash when + // you call string::append(NULL, 0), presumably because they are trying to + // be helpful by detecting the NULL pointer, even though there's nothing + // wrong with reading zero bytes from NULL. + if (buffer_pos_ != record_start_) { + record_target_->append(buffer_ + record_start_, buffer_pos_ - record_start_); + } + record_target_ = NULL; + record_start_ = -1; +} + +inline void Tokenizer::StartToken() { + current_.type = TYPE_START; // Just for the sake of initializing it. + current_.text.clear(); + current_.line = line_; + current_.column = column_; + RecordTo(¤t_.text); +} + +inline void Tokenizer::EndToken() { + StopRecording(); + current_.end_column = column_; +} + +// ------------------------------------------------------------------- +// Helper methods that consume characters. + +template +inline bool Tokenizer::LookingAt() { + return CharacterClass::InClass(current_char_); +} + +template +inline bool Tokenizer::TryConsumeOne() { + if (CharacterClass::InClass(current_char_)) { + NextChar(); + return true; + } else { + return false; + } +} + +inline bool Tokenizer::TryConsume(char c) { + if (current_char_ == c) { + NextChar(); + return true; + } else { + return false; + } +} + +template +inline void Tokenizer::ConsumeZeroOrMore() { + while (CharacterClass::InClass(current_char_)) { + NextChar(); + } +} + +template +inline void Tokenizer::ConsumeOneOrMore(const char* error) { + if (!CharacterClass::InClass(current_char_)) { + AddError(error); + } else { + do { + NextChar(); + } while (CharacterClass::InClass(current_char_)); + } +} + +// ------------------------------------------------------------------- +// Methods that read whole patterns matching certain kinds of tokens +// or comments. + +void Tokenizer::ConsumeString(char delimiter) { + while (true) { + switch (current_char_) { + case '\0': + AddError("Unexpected end of string."); + return; + + case '\n': { + if (!allow_multiline_strings_) { + AddError("String literals cannot cross line boundaries."); + return; + } + NextChar(); + break; + } + + case '\\': { + // An escape sequence. + NextChar(); + if (TryConsumeOne()) { + // Valid escape sequence. + } else if (TryConsumeOne()) { + // Possibly followed by two more octal digits, but these will + // just be consumed by the main loop anyway so we don't need + // to do so explicitly here. + } else if (TryConsume('x') || TryConsume('X')) { + if (!TryConsumeOne()) { + AddError("Expected hex digits for escape sequence."); + } + // Possibly followed by another hex digit, but again we don't care. + } else if (TryConsume('u')) { + if (!TryConsumeOne() || + !TryConsumeOne() || + !TryConsumeOne() || + !TryConsumeOne()) { + AddError("Expected four hex digits for \\u escape sequence."); + } + } else if (TryConsume('U')) { + // We expect 8 hex digits; but only the range up to 0x10ffff is + // legal. + if (!TryConsume('0') || + !TryConsume('0') || + !(TryConsume('0') || TryConsume('1')) || + !TryConsumeOne() || + !TryConsumeOne() || + !TryConsumeOne() || + !TryConsumeOne() || + !TryConsumeOne()) { + AddError("Expected eight hex digits up to 10ffff for \\U escape " + "sequence"); + } + } else { + AddError("Invalid escape sequence in string literal."); + } + break; + } + + default: { + if (current_char_ == delimiter) { + NextChar(); + return; + } + NextChar(); + break; + } + } + } +} + +Tokenizer::TokenType Tokenizer::ConsumeNumber(bool started_with_zero, + bool started_with_dot) { + bool is_float = false; + + if (started_with_zero && (TryConsume('x') || TryConsume('X'))) { + // A hex number (started with "0x"). + ConsumeOneOrMore("\"0x\" must be followed by hex digits."); + + } else if (started_with_zero && LookingAt()) { + // An octal number (had a leading zero). + ConsumeZeroOrMore(); + if (LookingAt()) { + AddError("Numbers starting with leading zero must be in octal."); + ConsumeZeroOrMore(); + } + + } else { + // A decimal number. + if (started_with_dot) { + is_float = true; + ConsumeZeroOrMore(); + } else { + ConsumeZeroOrMore(); + + if (TryConsume('.')) { + is_float = true; + ConsumeZeroOrMore(); + } + } + + if (TryConsume('e') || TryConsume('E')) { + is_float = true; + TryConsume('-') || TryConsume('+'); + ConsumeOneOrMore("\"e\" must be followed by exponent."); + } + + if (allow_f_after_float_ && (TryConsume('f') || TryConsume('F'))) { + is_float = true; + } + } + + if (LookingAt() && require_space_after_number_) { + AddError("Need space between number and identifier."); + } else if (current_char_ == '.') { + if (is_float) { + AddError( + "Already saw decimal point or exponent; can't have another one."); + } else { + AddError("Hex and octal numbers must be integers."); + } + } + + return is_float ? TYPE_FLOAT : TYPE_INTEGER; +} + +void Tokenizer::ConsumeLineComment(string* content) { + if (content != NULL) RecordTo(content); + + while (current_char_ != '\0' && current_char_ != '\n') { + NextChar(); + } + TryConsume('\n'); + + if (content != NULL) StopRecording(); +} + +void Tokenizer::ConsumeBlockComment(string* content) { + int start_line = line_; + int start_column = column_ - 2; + + if (content != NULL) RecordTo(content); + + while (true) { + while (current_char_ != '\0' && + current_char_ != '*' && + current_char_ != '/' && + current_char_ != '\n') { + NextChar(); + } + + if (TryConsume('\n')) { + if (content != NULL) StopRecording(); + + // Consume leading whitespace and asterisk; + ConsumeZeroOrMore(); + if (TryConsume('*')) { + if (TryConsume('/')) { + // End of comment. + break; + } + } + + if (content != NULL) RecordTo(content); + } else if (TryConsume('*') && TryConsume('/')) { + // End of comment. + if (content != NULL) { + StopRecording(); + // Strip trailing "*/". + content->erase(content->size() - 2); + } + break; + } else if (TryConsume('/') && current_char_ == '*') { + // Note: We didn't consume the '*' because if there is a '/' after it + // we want to interpret that as the end of the comment. + AddError( + "\"/*\" inside block comment. Block comments cannot be nested."); + } else if (current_char_ == '\0') { + AddError("End-of-file inside block comment."); + error_collector_->AddError( + start_line, start_column, " Comment started here."); + if (content != NULL) StopRecording(); + break; + } + } +} + +Tokenizer::NextCommentStatus Tokenizer::TryConsumeCommentStart() { + if (comment_style_ == CPP_COMMENT_STYLE && TryConsume('/')) { + if (TryConsume('/')) { + return LINE_COMMENT; + } else if (TryConsume('*')) { + return BLOCK_COMMENT; + } else { + // Oops, it was just a slash. Return it. + current_.type = TYPE_SYMBOL; + current_.text = "/"; + current_.line = line_; + current_.column = column_ - 1; + current_.end_column = column_; + return SLASH_NOT_COMMENT; + } + } else if (comment_style_ == SH_COMMENT_STYLE && TryConsume('#')) { + return LINE_COMMENT; + } else { + return NO_COMMENT; + } +} + +// ------------------------------------------------------------------- + +bool Tokenizer::Next() { + previous_ = current_; + + while (!read_error_) { + ConsumeZeroOrMore(); + + switch (TryConsumeCommentStart()) { + case LINE_COMMENT: + ConsumeLineComment(NULL); + continue; + case BLOCK_COMMENT: + ConsumeBlockComment(NULL); + continue; + case SLASH_NOT_COMMENT: + return true; + case NO_COMMENT: + break; + } + + // Check for EOF before continuing. + if (read_error_) break; + + if (LookingAt() || current_char_ == '\0') { + AddError("Invalid control characters encountered in text."); + NextChar(); + // Skip more unprintable characters, too. But, remember that '\0' is + // also what current_char_ is set to after EOF / read error. We have + // to be careful not to go into an infinite loop of trying to consume + // it, so make sure to check read_error_ explicitly before consuming + // '\0'. + while (TryConsumeOne() || + (!read_error_ && TryConsume('\0'))) { + // Ignore. + } + + } else { + // Reading some sort of token. + StartToken(); + + if (TryConsumeOne()) { + ConsumeZeroOrMore(); + current_.type = TYPE_IDENTIFIER; + } else if (TryConsume('0')) { + current_.type = ConsumeNumber(true, false); + } else if (TryConsume('.')) { + // This could be the beginning of a floating-point number, or it could + // just be a '.' symbol. + + if (TryConsumeOne()) { + // It's a floating-point number. + if (previous_.type == TYPE_IDENTIFIER && + current_.line == previous_.line && + current_.column == previous_.end_column) { + // We don't accept syntax like "blah.123". + error_collector_->AddError(line_, column_ - 2, + "Need space between identifier and decimal point."); + } + current_.type = ConsumeNumber(false, true); + } else { + current_.type = TYPE_SYMBOL; + } + } else if (TryConsumeOne()) { + current_.type = ConsumeNumber(false, false); + } else if (TryConsume('\"')) { + ConsumeString('\"'); + current_.type = TYPE_STRING; + } else if (TryConsume('\'')) { + ConsumeString('\''); + current_.type = TYPE_STRING; + } else { + // Check if the high order bit is set. + if (current_char_ & 0x80) { + error_collector_->AddError(line_, column_, + StringPrintf("Interpreting non ascii codepoint %d.", + static_cast(current_char_))); + } + NextChar(); + current_.type = TYPE_SYMBOL; + } + + EndToken(); + return true; + } + } + + // EOF + current_.type = TYPE_END; + current_.text.clear(); + current_.line = line_; + current_.column = column_; + current_.end_column = column_; + return false; +} + +namespace { + +// Helper class for collecting comments and putting them in the right places. +// +// This basically just buffers the most recent comment until it can be decided +// exactly where that comment should be placed. When Flush() is called, the +// current comment goes into either prev_trailing_comments or detached_comments. +// When the CommentCollector is destroyed, the last buffered comment goes into +// next_leading_comments. +class CommentCollector { + public: + CommentCollector(string* prev_trailing_comments, + vector* detached_comments, + string* next_leading_comments) + : prev_trailing_comments_(prev_trailing_comments), + detached_comments_(detached_comments), + next_leading_comments_(next_leading_comments), + has_comment_(false), + is_line_comment_(false), + can_attach_to_prev_(true) { + if (prev_trailing_comments != NULL) prev_trailing_comments->clear(); + if (detached_comments != NULL) detached_comments->clear(); + if (next_leading_comments != NULL) next_leading_comments->clear(); + } + + ~CommentCollector() { + // Whatever is in the buffer is a leading comment. + if (next_leading_comments_ != NULL && has_comment_) { + comment_buffer_.swap(*next_leading_comments_); + } + } + + // About to read a line comment. Get the comment buffer pointer in order to + // read into it. + string* GetBufferForLineComment() { + // We want to combine with previous line comments, but not block comments. + if (has_comment_ && !is_line_comment_) { + Flush(); + } + has_comment_ = true; + is_line_comment_ = true; + return &comment_buffer_; + } + + // About to read a block comment. Get the comment buffer pointer in order to + // read into it. + string* GetBufferForBlockComment() { + if (has_comment_) { + Flush(); + } + has_comment_ = true; + is_line_comment_ = false; + return &comment_buffer_; + } + + void ClearBuffer() { + comment_buffer_.clear(); + has_comment_ = false; + } + + // Called once we know that the comment buffer is complete and is *not* + // connected to the next token. + void Flush() { + if (has_comment_) { + if (can_attach_to_prev_) { + if (prev_trailing_comments_ != NULL) { + prev_trailing_comments_->append(comment_buffer_); + } + can_attach_to_prev_ = false; + } else { + if (detached_comments_ != NULL) { + detached_comments_->push_back(comment_buffer_); + } + } + ClearBuffer(); + } + } + + void DetachFromPrev() { + can_attach_to_prev_ = false; + } + + private: + string* prev_trailing_comments_; + vector* detached_comments_; + string* next_leading_comments_; + + string comment_buffer_; + + // True if any comments were read into comment_buffer_. This can be true even + // if comment_buffer_ is empty, namely if the comment was "/**/". + bool has_comment_; + + // Is the comment in the comment buffer a line comment? + bool is_line_comment_; + + // Is it still possible that we could be reading a comment attached to the + // previous token? + bool can_attach_to_prev_; +}; + +} // namespace + +bool Tokenizer::NextWithComments(string* prev_trailing_comments, + vector* detached_comments, + string* next_leading_comments) { + CommentCollector collector(prev_trailing_comments, detached_comments, + next_leading_comments); + + if (current_.type == TYPE_START) { + collector.DetachFromPrev(); + } else { + // A comment appearing on the same line must be attached to the previous + // declaration. + ConsumeZeroOrMore(); + switch (TryConsumeCommentStart()) { + case LINE_COMMENT: + ConsumeLineComment(collector.GetBufferForLineComment()); + + // Don't allow comments on subsequent lines to be attached to a trailing + // comment. + collector.Flush(); + break; + case BLOCK_COMMENT: + ConsumeBlockComment(collector.GetBufferForBlockComment()); + + ConsumeZeroOrMore(); + if (!TryConsume('\n')) { + // Oops, the next token is on the same line. If we recorded a comment + // we really have no idea which token it should be attached to. + collector.ClearBuffer(); + return Next(); + } + + // Don't allow comments on subsequent lines to be attached to a trailing + // comment. + collector.Flush(); + break; + case SLASH_NOT_COMMENT: + return true; + case NO_COMMENT: + if (!TryConsume('\n')) { + // The next token is on the same line. There are no comments. + return Next(); + } + break; + } + } + + // OK, we are now on the line *after* the previous token. + while (true) { + ConsumeZeroOrMore(); + + switch (TryConsumeCommentStart()) { + case LINE_COMMENT: + ConsumeLineComment(collector.GetBufferForLineComment()); + break; + case BLOCK_COMMENT: + ConsumeBlockComment(collector.GetBufferForBlockComment()); + + // Consume the rest of the line so that we don't interpret it as a + // blank line the next time around the loop. + ConsumeZeroOrMore(); + TryConsume('\n'); + break; + case SLASH_NOT_COMMENT: + return true; + case NO_COMMENT: + if (TryConsume('\n')) { + // Completely blank line. + collector.Flush(); + collector.DetachFromPrev(); + } else { + bool result = Next(); + if (!result || + current_.text == "}" || + current_.text == "]" || + current_.text == ")") { + // It looks like we're at the end of a scope. In this case it + // makes no sense to attach a comment to the following token. + collector.Flush(); + } + return result; + } + break; + } + } +} + +// ------------------------------------------------------------------- +// Token-parsing helpers. Remember that these don't need to report +// errors since any errors should already have been reported while +// tokenizing. Also, these can assume that whatever text they +// are given is text that the tokenizer actually parsed as a token +// of the given type. + +bool Tokenizer::ParseInteger(const string& text, uint64 max_value, + uint64* output) { + // Sadly, we can't just use strtoul() since it is only 32-bit and strtoull() + // is non-standard. I hate the C standard library. :( + +// return strtoull(text.c_str(), NULL, 0); + + const char* ptr = text.c_str(); + int base = 10; + if (ptr[0] == '0') { + if (ptr[1] == 'x' || ptr[1] == 'X') { + // This is hex. + base = 16; + ptr += 2; + } else { + // This is octal. + base = 8; + } + } + + uint64 result = 0; + for (; *ptr != '\0'; ptr++) { + int digit = DigitValue(*ptr); + GOOGLE_LOG_IF(DFATAL, digit < 0 || digit >= base) + << " Tokenizer::ParseInteger() passed text that could not have been" + " tokenized as an integer: " << CEscape(text); + if (digit > max_value || result > (max_value - digit) / base) { + // Overflow. + return false; + } + result = result * base + digit; + } + + *output = result; + return true; +} + +double Tokenizer::ParseFloat(const string& text) { + const char* start = text.c_str(); + char* end; + double result = NoLocaleStrtod(start, &end); + + // "1e" is not a valid float, but if the tokenizer reads it, it will + // report an error but still return it as a valid token. We need to + // accept anything the tokenizer could possibly return, error or not. + if (*end == 'e' || *end == 'E') { + ++end; + if (*end == '-' || *end == '+') ++end; + } + + // If the Tokenizer had allow_f_after_float_ enabled, the float may be + // suffixed with the letter 'f'. + if (*end == 'f' || *end == 'F') { + ++end; + } + + GOOGLE_LOG_IF(DFATAL, end - start != text.size() || *start == '-') + << " Tokenizer::ParseFloat() passed text that could not have been" + " tokenized as a float: " << CEscape(text); + return result; +} + +// Helper to append a Unicode code point to a string as UTF8, without bringing +// in any external dependencies. +static void AppendUTF8(uint32 code_point, string* output) { + uint32 tmp = 0; + int len = 0; + if (code_point <= 0x7f) { + tmp = code_point; + len = 1; + } else if (code_point <= 0x07ff) { + tmp = 0x0000c080 | + ((code_point & 0x07c0) << 2) | + (code_point & 0x003f); + len = 2; + } else if (code_point <= 0xffff) { + tmp = 0x00e08080 | + ((code_point & 0xf000) << 4) | + ((code_point & 0x0fc0) << 2) | + (code_point & 0x003f); + len = 3; + } else if (code_point <= 0x1fffff) { + tmp = 0xf0808080 | + ((code_point & 0x1c0000) << 6) | + ((code_point & 0x03f000) << 4) | + ((code_point & 0x000fc0) << 2) | + (code_point & 0x003f); + len = 4; + } else { + // UTF-16 is only defined for code points up to 0x10FFFF, and UTF-8 is + // normally only defined up to there as well. + StringAppendF(output, "\\U%08x", code_point); + return; + } + tmp = ghtonl(tmp); + output->append(reinterpret_cast(&tmp) + sizeof(tmp) - len, len); +} + +// Try to read hex digits from ptr, and stuff the numeric result into +// *result. Returns true if that many digits were successfully consumed. +static bool ReadHexDigits(const char* ptr, int len, uint32* result) { + *result = 0; + if (len == 0) return false; + for (const char* end = ptr + len; ptr < end; ++ptr) { + if (*ptr == '\0') return false; + *result = (*result << 4) + DigitValue(*ptr); + } + return true; +} + +// Handling UTF-16 surrogate pairs. UTF-16 encodes code points in the range +// 0x10000...0x10ffff as a pair of numbers, a head surrogate followed by a trail +// surrogate. These numbers are in a reserved range of Unicode code points, so +// if we encounter such a pair we know how to parse it and convert it into a +// single code point. +static const uint32 kMinHeadSurrogate = 0xd800; +static const uint32 kMaxHeadSurrogate = 0xdc00; +static const uint32 kMinTrailSurrogate = 0xdc00; +static const uint32 kMaxTrailSurrogate = 0xe000; + +static inline bool IsHeadSurrogate(uint32 code_point) { + return (code_point >= kMinHeadSurrogate) && (code_point < kMaxHeadSurrogate); +} + +static inline bool IsTrailSurrogate(uint32 code_point) { + return (code_point >= kMinTrailSurrogate) && + (code_point < kMaxTrailSurrogate); +} + +// Combine a head and trail surrogate into a single Unicode code point. +static uint32 AssembleUTF16(uint32 head_surrogate, uint32 trail_surrogate) { + GOOGLE_DCHECK(IsHeadSurrogate(head_surrogate)); + GOOGLE_DCHECK(IsTrailSurrogate(trail_surrogate)); + return 0x10000 + (((head_surrogate - kMinHeadSurrogate) << 10) | + (trail_surrogate - kMinTrailSurrogate)); +} + +// Convert the escape sequence parameter to a number of expected hex digits. +static inline int UnicodeLength(char key) { + if (key == 'u') return 4; + if (key == 'U') return 8; + return 0; +} + +// Given a pointer to the 'u' or 'U' starting a Unicode escape sequence, attempt +// to parse that sequence. On success, returns a pointer to the first char +// beyond that sequence, and fills in *code_point. On failure, returns ptr +// itself. +static const char* FetchUnicodePoint(const char* ptr, uint32* code_point) { + const char* p = ptr; + // Fetch the code point. + const int len = UnicodeLength(*p++); + if (!ReadHexDigits(p, len, code_point)) + return ptr; + p += len; + + // Check if the code point we read is a "head surrogate." If so, then we + // expect it to be immediately followed by another code point which is a valid + // "trail surrogate," and together they form a UTF-16 pair which decodes into + // a single Unicode point. Trail surrogates may only use \u, not \U. + if (IsHeadSurrogate(*code_point) && *p == '\\' && *(p + 1) == 'u') { + uint32 trail_surrogate; + if (ReadHexDigits(p + 2, 4, &trail_surrogate) && + IsTrailSurrogate(trail_surrogate)) { + *code_point = AssembleUTF16(*code_point, trail_surrogate); + p += 6; + } + // If this failed, then we just emit the head surrogate as a code point. + // It's bogus, but so is the string. + } + + return p; +} + +// The text string must begin and end with single or double quote +// characters. +void Tokenizer::ParseStringAppend(const string& text, string* output) { + // Reminder: text[0] is always a quote character. (If text is + // empty, it's invalid, so we'll just return). + const size_t text_size = text.size(); + if (text_size == 0) { + GOOGLE_LOG(DFATAL) + << " Tokenizer::ParseStringAppend() passed text that could not" + " have been tokenized as a string: " << CEscape(text); + return; + } + + // Reserve room for new string. The branch is necessary because if + // there is already space available the reserve() call might + // downsize the output. + const size_t new_len = text_size + output->size(); + if (new_len > output->capacity()) { + output->reserve(new_len); + } + + // Loop through the string copying characters to "output" and + // interpreting escape sequences. Note that any invalid escape + // sequences or other errors were already reported while tokenizing. + // In this case we do not need to produce valid results. + for (const char* ptr = text.c_str() + 1; *ptr != '\0'; ptr++) { + if (*ptr == '\\' && ptr[1] != '\0') { + // An escape sequence. + ++ptr; + + if (OctalDigit::InClass(*ptr)) { + // An octal escape. May one, two, or three digits. + int code = DigitValue(*ptr); + if (OctalDigit::InClass(ptr[1])) { + ++ptr; + code = code * 8 + DigitValue(*ptr); + } + if (OctalDigit::InClass(ptr[1])) { + ++ptr; + code = code * 8 + DigitValue(*ptr); + } + output->push_back(static_cast(code)); + + } else if (*ptr == 'x') { + // A hex escape. May zero, one, or two digits. (The zero case + // will have been caught as an error earlier.) + int code = 0; + if (HexDigit::InClass(ptr[1])) { + ++ptr; + code = DigitValue(*ptr); + } + if (HexDigit::InClass(ptr[1])) { + ++ptr; + code = code * 16 + DigitValue(*ptr); + } + output->push_back(static_cast(code)); + + } else if (*ptr == 'u' || *ptr == 'U') { + uint32 unicode; + const char* end = FetchUnicodePoint(ptr, &unicode); + if (end == ptr) { + // Failure: Just dump out what we saw, don't try to parse it. + output->push_back(*ptr); + } else { + AppendUTF8(unicode, output); + ptr = end - 1; // Because we're about to ++ptr. + } + } else { + // Some other escape code. + output->push_back(TranslateEscape(*ptr)); + } + + } else if (*ptr == text[0] && ptr[1] == '\0') { + // Ignore final quote matching the starting quote. + } else { + output->push_back(*ptr); + } + } +} + +template +static bool AllInClass(const string& s) { + for (int i = 0; i < s.size(); ++i) { + if (!CharacterClass::InClass(s[i])) + return false; + } + return true; +} + +bool Tokenizer::IsIdentifier(const string& text) { + // Mirrors IDENTIFIER definition in Tokenizer::Next() above. + if (text.size() == 0) + return false; + if (!Letter::InClass(text.at(0))) + return false; + if (!AllInClass(text.substr(1))) + return false; + return true; +} + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/io/tokenizer.h b/toolkit/components/protobuf/src/google/protobuf/io/tokenizer.h new file mode 100644 index 0000000000000..8c6220a1d0889 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/io/tokenizer.h @@ -0,0 +1,402 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Class for parsing tokenized text from a ZeroCopyInputStream. + +#ifndef GOOGLE_PROTOBUF_IO_TOKENIZER_H__ +#define GOOGLE_PROTOBUF_IO_TOKENIZER_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +class ZeroCopyInputStream; // zero_copy_stream.h + +// Defined in this file. +class ErrorCollector; +class Tokenizer; + +// Abstract interface for an object which collects the errors that occur +// during parsing. A typical implementation might simply print the errors +// to stdout. +class LIBPROTOBUF_EXPORT ErrorCollector { + public: + inline ErrorCollector() {} + virtual ~ErrorCollector(); + + // Indicates that there was an error in the input at the given line and + // column numbers. The numbers are zero-based, so you may want to add + // 1 to each before printing them. + virtual void AddError(int line, int column, const string& message) = 0; + + // Indicates that there was a warning in the input at the given line and + // column numbers. The numbers are zero-based, so you may want to add + // 1 to each before printing them. + virtual void AddWarning(int /* line */, int /* column */, + const string& /* message */) { } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector); +}; + +// This class converts a stream of raw text into a stream of tokens for +// the protocol definition parser to parse. The tokens recognized are +// similar to those that make up the C language; see the TokenType enum for +// precise descriptions. Whitespace and comments are skipped. By default, +// C- and C++-style comments are recognized, but other styles can be used by +// calling set_comment_style(). +class LIBPROTOBUF_EXPORT Tokenizer { + public: + // Construct a Tokenizer that reads and tokenizes text from the given + // input stream and writes errors to the given error_collector. + // The caller keeps ownership of input and error_collector. + Tokenizer(ZeroCopyInputStream* input, ErrorCollector* error_collector); + ~Tokenizer(); + + enum TokenType { + TYPE_START, // Next() has not yet been called. + TYPE_END, // End of input reached. "text" is empty. + + TYPE_IDENTIFIER, // A sequence of letters, digits, and underscores, not + // starting with a digit. It is an error for a number + // to be followed by an identifier with no space in + // between. + TYPE_INTEGER, // A sequence of digits representing an integer. Normally + // the digits are decimal, but a prefix of "0x" indicates + // a hex number and a leading zero indicates octal, just + // like with C numeric literals. A leading negative sign + // is NOT included in the token; it's up to the parser to + // interpret the unary minus operator on its own. + TYPE_FLOAT, // A floating point literal, with a fractional part and/or + // an exponent. Always in decimal. Again, never + // negative. + TYPE_STRING, // A quoted sequence of escaped characters. Either single + // or double quotes can be used, but they must match. + // A string literal cannot cross a line break. + TYPE_SYMBOL, // Any other printable character, like '!' or '+'. + // Symbols are always a single character, so "!+$%" is + // four tokens. + }; + + // Structure representing a token read from the token stream. + struct Token { + TokenType type; + string text; // The exact text of the token as it appeared in + // the input. e.g. tokens of TYPE_STRING will still + // be escaped and in quotes. + + // "line" and "column" specify the position of the first character of + // the token within the input stream. They are zero-based. + int line; + int column; + int end_column; + }; + + // Get the current token. This is updated when Next() is called. Before + // the first call to Next(), current() has type TYPE_START and no contents. + const Token& current(); + + // Return the previous token -- i.e. what current() returned before the + // previous call to Next(). + const Token& previous(); + + // Advance to the next token. Returns false if the end of the input is + // reached. + bool Next(); + + // Like Next(), but also collects comments which appear between the previous + // and next tokens. + // + // Comments which appear to be attached to the previous token are stored + // in *prev_tailing_comments. Comments which appear to be attached to the + // next token are stored in *next_leading_comments. Comments appearing in + // between which do not appear to be attached to either will be added to + // detached_comments. Any of these parameters can be NULL to simply discard + // the comments. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // Only the comment content is returned; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk will + // be stripped from the beginning of each line other than the first. Newlines + // are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to qux. + // // + // // Another line attached to qux. + // optional double qux = 4; + // + // // Detached comment. This is not attached to qux or corge + // // because there are blank lines separating it from both. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + bool NextWithComments(string* prev_trailing_comments, + vector* detached_comments, + string* next_leading_comments); + + // Parse helpers --------------------------------------------------- + + // Parses a TYPE_FLOAT token. This never fails, so long as the text actually + // comes from a TYPE_FLOAT token parsed by Tokenizer. If it doesn't, the + // result is undefined (possibly an assert failure). + static double ParseFloat(const string& text); + + // Parses a TYPE_STRING token. This never fails, so long as the text actually + // comes from a TYPE_STRING token parsed by Tokenizer. If it doesn't, the + // result is undefined (possibly an assert failure). + static void ParseString(const string& text, string* output); + + // Identical to ParseString, but appends to output. + static void ParseStringAppend(const string& text, string* output); + + // Parses a TYPE_INTEGER token. Returns false if the result would be + // greater than max_value. Otherwise, returns true and sets *output to the + // result. If the text is not from a Token of type TYPE_INTEGER originally + // parsed by a Tokenizer, the result is undefined (possibly an assert + // failure). + static bool ParseInteger(const string& text, uint64 max_value, + uint64* output); + + // Options --------------------------------------------------------- + + // Set true to allow floats to be suffixed with the letter 'f'. Tokens + // which would otherwise be integers but which have the 'f' suffix will be + // forced to be interpreted as floats. For all other purposes, the 'f' is + // ignored. + void set_allow_f_after_float(bool value) { allow_f_after_float_ = value; } + + // Valid values for set_comment_style(). + enum CommentStyle { + // Line comments begin with "//", block comments are delimited by "/*" and + // "*/". + CPP_COMMENT_STYLE, + // Line comments begin with "#". No way to write block comments. + SH_COMMENT_STYLE + }; + + // Sets the comment style. + void set_comment_style(CommentStyle style) { comment_style_ = style; } + + // Whether to require whitespace between a number and a field name. + // Default is true. Do not use this; for Google-internal cleanup only. + void set_require_space_after_number(bool require) { + require_space_after_number_ = require; + } + + // Whether to allow string literals to span multiple lines. Default is false. + // Do not use this; for Google-internal cleanup only. + void set_allow_multiline_strings(bool allow) { + allow_multiline_strings_ = allow; + } + + // External helper: validate an identifier. + static bool IsIdentifier(const string& text); + + // ----------------------------------------------------------------- + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Tokenizer); + + Token current_; // Returned by current(). + Token previous_; // Returned by previous(). + + ZeroCopyInputStream* input_; + ErrorCollector* error_collector_; + + char current_char_; // == buffer_[buffer_pos_], updated by NextChar(). + const char* buffer_; // Current buffer returned from input_. + int buffer_size_; // Size of buffer_. + int buffer_pos_; // Current position within the buffer. + bool read_error_; // Did we previously encounter a read error? + + // Line and column number of current_char_ within the whole input stream. + int line_; + int column_; + + // String to which text should be appended as we advance through it. + // Call RecordTo(&str) to start recording and StopRecording() to stop. + // E.g. StartToken() calls RecordTo(¤t_.text). record_start_ is the + // position within the current buffer where recording started. + string* record_target_; + int record_start_; + + // Options. + bool allow_f_after_float_; + CommentStyle comment_style_; + bool require_space_after_number_; + bool allow_multiline_strings_; + + // Since we count columns we need to interpret tabs somehow. We'll take + // the standard 8-character definition for lack of any way to do better. + static const int kTabWidth = 8; + + // ----------------------------------------------------------------- + // Helper methods. + + // Consume this character and advance to the next one. + void NextChar(); + + // Read a new buffer from the input. + void Refresh(); + + inline void RecordTo(string* target); + inline void StopRecording(); + + // Called when the current character is the first character of a new + // token (not including whitespace or comments). + inline void StartToken(); + // Called when the current character is the first character after the + // end of the last token. After this returns, current_.text will + // contain all text consumed since StartToken() was called. + inline void EndToken(); + + // Convenience method to add an error at the current line and column. + void AddError(const string& message) { + error_collector_->AddError(line_, column_, message); + } + + // ----------------------------------------------------------------- + // The following four methods are used to consume tokens of specific + // types. They are actually used to consume all characters *after* + // the first, since the calling function consumes the first character + // in order to decide what kind of token is being read. + + // Read and consume a string, ending when the given delimiter is + // consumed. + void ConsumeString(char delimiter); + + // Read and consume a number, returning TYPE_FLOAT or TYPE_INTEGER + // depending on what was read. This needs to know if the first + // character was a zero in order to correctly recognize hex and octal + // numbers. + // It also needs to know if the first characted was a . to parse floating + // point correctly. + TokenType ConsumeNumber(bool started_with_zero, bool started_with_dot); + + // Consume the rest of a line. + void ConsumeLineComment(string* content); + // Consume until "*/". + void ConsumeBlockComment(string* content); + + enum NextCommentStatus { + // Started a line comment. + LINE_COMMENT, + + // Started a block comment. + BLOCK_COMMENT, + + // Consumed a slash, then realized it wasn't a comment. current_ has + // been filled in with a slash token. The caller should return it. + SLASH_NOT_COMMENT, + + // We do not appear to be starting a comment here. + NO_COMMENT + }; + + // If we're at the start of a new comment, consume it and return what kind + // of comment it is. + NextCommentStatus TryConsumeCommentStart(); + + // ----------------------------------------------------------------- + // These helper methods make the parsing code more readable. The + // "character classes" refered to are defined at the top of the .cc file. + // Basically it is a C++ class with one method: + // static bool InClass(char c); + // The method returns true if c is a member of this "class", like "Letter" + // or "Digit". + + // Returns true if the current character is of the given character + // class, but does not consume anything. + template + inline bool LookingAt(); + + // If the current character is in the given class, consume it and return + // true. Otherwise return false. + // e.g. TryConsumeOne() + template + inline bool TryConsumeOne(); + + // Like above, but try to consume the specific character indicated. + inline bool TryConsume(char c); + + // Consume zero or more of the given character class. + template + inline void ConsumeZeroOrMore(); + + // Consume one or more of the given character class or log the given + // error message. + // e.g. ConsumeOneOrMore("Expected digits."); + template + inline void ConsumeOneOrMore(const char* error); +}; + +// inline methods ==================================================== +inline const Tokenizer::Token& Tokenizer::current() { + return current_; +} + +inline const Tokenizer::Token& Tokenizer::previous() { + return previous_; +} + +inline void Tokenizer::ParseString(const string& text, string* output) { + output->clear(); + ParseStringAppend(text, output); +} + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_TOKENIZER_H__ diff --git a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.cc b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream.cc similarity index 82% rename from toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.cc rename to toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream.cc index dad6ff14468d0..f77c768fc990c 100644 --- a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.cc +++ b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -34,6 +34,7 @@ #include +#include namespace google { namespace protobuf { @@ -43,6 +44,14 @@ ZeroCopyInputStream::~ZeroCopyInputStream() {} ZeroCopyOutputStream::~ZeroCopyOutputStream() {} +bool ZeroCopyOutputStream::WriteAliasedRaw(const void* /* data */, + int /* size */) { + GOOGLE_LOG(FATAL) << "This ZeroCopyOutputStream doesn't support aliasing. " + "Reaching here usually means a ZeroCopyOutputStream " + "implementation bug."; + return false; +} + } // namespace io } // namespace protobuf } // namespace google diff --git a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.h b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream.h similarity index 93% rename from toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.h rename to toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream.h index db5326f703dbe..52650fc6686d5 100644 --- a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream.h +++ b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -226,6 +226,16 @@ class LIBPROTOBUF_EXPORT ZeroCopyOutputStream { // Returns the total number of bytes written since this object was created. virtual int64 ByteCount() const = 0; + // Write a given chunk of data to the output. Some output streams may + // implement this in a way that avoids copying. Check AllowsAliasing() before + // calling WriteAliasedRaw(). It will GOOGLE_CHECK fail if WriteAliasedRaw() is + // called on a stream that does not allow aliasing. + // + // NOTE: It is caller's responsibility to ensure that the chunk of memory + // remains live until all of the data has been consumed from the stream. + virtual bool WriteAliasedRaw(const void* data, int size); + virtual bool AllowsAliasing() const { return false; } + private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyOutputStream); diff --git a/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc new file mode 100644 index 0000000000000..f7901b2797eb1 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc @@ -0,0 +1,473 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifdef _MSC_VER +#include +#else +#include +#include +#include +#include +#endif +#include +#include +#include + +#include +#include +#include + + +namespace google { +namespace protobuf { +namespace io { + +#ifdef _WIN32 +// Win32 lseek is broken: If invoked on a non-seekable file descriptor, its +// return value is undefined. We re-define it to always produce an error. +#define lseek(fd, offset, origin) ((off_t)-1) +#endif + +namespace { + +// EINTR sucks. +int close_no_eintr(int fd) { + int result; + do { + result = close(fd); + } while (result < 0 && errno == EINTR); + return result; +} + +} // namespace + + +// =================================================================== + +FileInputStream::FileInputStream(int file_descriptor, int block_size) + : copying_input_(file_descriptor), + impl_(©ing_input_, block_size) { +} + +FileInputStream::~FileInputStream() {} + +bool FileInputStream::Close() { + return copying_input_.Close(); +} + +bool FileInputStream::Next(const void** data, int* size) { + return impl_.Next(data, size); +} + +void FileInputStream::BackUp(int count) { + impl_.BackUp(count); +} + +bool FileInputStream::Skip(int count) { + return impl_.Skip(count); +} + +int64 FileInputStream::ByteCount() const { + return impl_.ByteCount(); +} + +FileInputStream::CopyingFileInputStream::CopyingFileInputStream( + int file_descriptor) + : file_(file_descriptor), + close_on_delete_(false), + is_closed_(false), + errno_(0), + previous_seek_failed_(false) { +} + +FileInputStream::CopyingFileInputStream::~CopyingFileInputStream() { + if (close_on_delete_) { + if (!Close()) { + GOOGLE_LOG(ERROR) << "close() failed: " << strerror(errno_); + } + } +} + +bool FileInputStream::CopyingFileInputStream::Close() { + GOOGLE_CHECK(!is_closed_); + + is_closed_ = true; + if (close_no_eintr(file_) != 0) { + // The docs on close() do not specify whether a file descriptor is still + // open after close() fails with EIO. However, the glibc source code + // seems to indicate that it is not. + errno_ = errno; + return false; + } + + return true; +} + +int FileInputStream::CopyingFileInputStream::Read(void* buffer, int size) { + GOOGLE_CHECK(!is_closed_); + + int result; + do { + result = read(file_, buffer, size); + } while (result < 0 && errno == EINTR); + + if (result < 0) { + // Read error (not EOF). + errno_ = errno; + } + + return result; +} + +int FileInputStream::CopyingFileInputStream::Skip(int count) { + GOOGLE_CHECK(!is_closed_); + + if (!previous_seek_failed_ && + lseek(file_, count, SEEK_CUR) != (off_t)-1) { + // Seek succeeded. + return count; + } else { + // Failed to seek. + + // Note to self: Don't seek again. This file descriptor doesn't + // support it. + previous_seek_failed_ = true; + + // Use the default implementation. + return CopyingInputStream::Skip(count); + } +} + +// =================================================================== + +FileOutputStream::FileOutputStream(int file_descriptor, int block_size) + : copying_output_(file_descriptor), + impl_(©ing_output_, block_size) { +} + +FileOutputStream::~FileOutputStream() { + impl_.Flush(); +} + +bool FileOutputStream::Close() { + bool flush_succeeded = impl_.Flush(); + return copying_output_.Close() && flush_succeeded; +} + +bool FileOutputStream::Flush() { + return impl_.Flush(); +} + +bool FileOutputStream::Next(void** data, int* size) { + return impl_.Next(data, size); +} + +void FileOutputStream::BackUp(int count) { + impl_.BackUp(count); +} + +int64 FileOutputStream::ByteCount() const { + return impl_.ByteCount(); +} + +FileOutputStream::CopyingFileOutputStream::CopyingFileOutputStream( + int file_descriptor) + : file_(file_descriptor), + close_on_delete_(false), + is_closed_(false), + errno_(0) { +} + +FileOutputStream::CopyingFileOutputStream::~CopyingFileOutputStream() { + if (close_on_delete_) { + if (!Close()) { + GOOGLE_LOG(ERROR) << "close() failed: " << strerror(errno_); + } + } +} + +bool FileOutputStream::CopyingFileOutputStream::Close() { + GOOGLE_CHECK(!is_closed_); + + is_closed_ = true; + if (close_no_eintr(file_) != 0) { + // The docs on close() do not specify whether a file descriptor is still + // open after close() fails with EIO. However, the glibc source code + // seems to indicate that it is not. + errno_ = errno; + return false; + } + + return true; +} + +bool FileOutputStream::CopyingFileOutputStream::Write( + const void* buffer, int size) { + GOOGLE_CHECK(!is_closed_); + int total_written = 0; + + const uint8* buffer_base = reinterpret_cast(buffer); + + while (total_written < size) { + int bytes; + do { + bytes = write(file_, buffer_base + total_written, size - total_written); + } while (bytes < 0 && errno == EINTR); + + if (bytes <= 0) { + // Write error. + + // FIXME(kenton): According to the man page, if write() returns zero, + // there was no error; write() simply did not write anything. It's + // unclear under what circumstances this might happen, but presumably + // errno won't be set in this case. I am confused as to how such an + // event should be handled. For now I'm treating it as an error, since + // retrying seems like it could lead to an infinite loop. I suspect + // this never actually happens anyway. + + if (bytes < 0) { + errno_ = errno; + } + return false; + } + total_written += bytes; + } + + return true; +} + +// =================================================================== + +IstreamInputStream::IstreamInputStream(istream* input, int block_size) + : copying_input_(input), + impl_(©ing_input_, block_size) { +} + +IstreamInputStream::~IstreamInputStream() {} + +bool IstreamInputStream::Next(const void** data, int* size) { + return impl_.Next(data, size); +} + +void IstreamInputStream::BackUp(int count) { + impl_.BackUp(count); +} + +bool IstreamInputStream::Skip(int count) { + return impl_.Skip(count); +} + +int64 IstreamInputStream::ByteCount() const { + return impl_.ByteCount(); +} + +IstreamInputStream::CopyingIstreamInputStream::CopyingIstreamInputStream( + istream* input) + : input_(input) { +} + +IstreamInputStream::CopyingIstreamInputStream::~CopyingIstreamInputStream() {} + +int IstreamInputStream::CopyingIstreamInputStream::Read( + void* buffer, int size) { + input_->read(reinterpret_cast(buffer), size); + int result = input_->gcount(); + if (result == 0 && input_->fail() && !input_->eof()) { + return -1; + } + return result; +} + +// =================================================================== + +OstreamOutputStream::OstreamOutputStream(ostream* output, int block_size) + : copying_output_(output), + impl_(©ing_output_, block_size) { +} + +OstreamOutputStream::~OstreamOutputStream() { + impl_.Flush(); +} + +bool OstreamOutputStream::Next(void** data, int* size) { + return impl_.Next(data, size); +} + +void OstreamOutputStream::BackUp(int count) { + impl_.BackUp(count); +} + +int64 OstreamOutputStream::ByteCount() const { + return impl_.ByteCount(); +} + +OstreamOutputStream::CopyingOstreamOutputStream::CopyingOstreamOutputStream( + ostream* output) + : output_(output) { +} + +OstreamOutputStream::CopyingOstreamOutputStream::~CopyingOstreamOutputStream() { +} + +bool OstreamOutputStream::CopyingOstreamOutputStream::Write( + const void* buffer, int size) { + output_->write(reinterpret_cast(buffer), size); + return output_->good(); +} + +// =================================================================== + +ConcatenatingInputStream::ConcatenatingInputStream( + ZeroCopyInputStream* const streams[], int count) + : streams_(streams), stream_count_(count), bytes_retired_(0) { +} + +ConcatenatingInputStream::~ConcatenatingInputStream() { +} + +bool ConcatenatingInputStream::Next(const void** data, int* size) { + while (stream_count_ > 0) { + if (streams_[0]->Next(data, size)) return true; + + // That stream is done. Advance to the next one. + bytes_retired_ += streams_[0]->ByteCount(); + ++streams_; + --stream_count_; + } + + // No more streams. + return false; +} + +void ConcatenatingInputStream::BackUp(int count) { + if (stream_count_ > 0) { + streams_[0]->BackUp(count); + } else { + GOOGLE_LOG(DFATAL) << "Can't BackUp() after failed Next()."; + } +} + +bool ConcatenatingInputStream::Skip(int count) { + while (stream_count_ > 0) { + // Assume that ByteCount() can be used to find out how much we actually + // skipped when Skip() fails. + int64 target_byte_count = streams_[0]->ByteCount() + count; + if (streams_[0]->Skip(count)) return true; + + // Hit the end of the stream. Figure out how many more bytes we still have + // to skip. + int64 final_byte_count = streams_[0]->ByteCount(); + GOOGLE_DCHECK_LT(final_byte_count, target_byte_count); + count = target_byte_count - final_byte_count; + + // That stream is done. Advance to the next one. + bytes_retired_ += final_byte_count; + ++streams_; + --stream_count_; + } + + return false; +} + +int64 ConcatenatingInputStream::ByteCount() const { + if (stream_count_ == 0) { + return bytes_retired_; + } else { + return bytes_retired_ + streams_[0]->ByteCount(); + } +} + + +// =================================================================== + +LimitingInputStream::LimitingInputStream(ZeroCopyInputStream* input, + int64 limit) + : input_(input), limit_(limit) { + prior_bytes_read_ = input_->ByteCount(); +} + +LimitingInputStream::~LimitingInputStream() { + // If we overshot the limit, back up. + if (limit_ < 0) input_->BackUp(-limit_); +} + +bool LimitingInputStream::Next(const void** data, int* size) { + if (limit_ <= 0) return false; + if (!input_->Next(data, size)) return false; + + limit_ -= *size; + if (limit_ < 0) { + // We overshot the limit. Reduce *size to hide the rest of the buffer. + *size += limit_; + } + return true; +} + +void LimitingInputStream::BackUp(int count) { + if (limit_ < 0) { + input_->BackUp(count - limit_); + limit_ = count; + } else { + input_->BackUp(count); + limit_ += count; + } +} + +bool LimitingInputStream::Skip(int count) { + if (count > limit_) { + if (limit_ < 0) return false; + input_->Skip(limit_); + limit_ = 0; + return false; + } else { + if (!input_->Skip(count)) return false; + limit_ -= count; + return true; + } +} + +int64 LimitingInputStream::ByteCount() const { + if (limit_ < 0) { + return input_->ByteCount() + limit_ - prior_bytes_read_; + } else { + return input_->ByteCount() - prior_bytes_read_; + } +} + + +// =================================================================== + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl.h b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h similarity index 99% rename from toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl.h rename to toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h index 9fedb00576b69..0746fa6afe696 100644 --- a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl.h +++ b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -344,6 +344,7 @@ class LIBPROTOBUF_EXPORT LimitingInputStream : public ZeroCopyInputStream { private: ZeroCopyInputStream* input_; int64 limit_; // Decreases as we go, becomes negative if we overshoot. + int64 prior_bytes_read_; // Bytes read on underlying stream at construction GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LimitingInputStream); }; diff --git a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.cc b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc similarity index 93% rename from toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.cc rename to toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc index a7de4a6d94a42..58aff0e256adc 100644 --- a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.cc +++ b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -32,11 +32,13 @@ // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. -#include -#include -#include +#include #include +#include + +#include +#include namespace google { namespace protobuf { @@ -161,15 +163,23 @@ bool StringOutputStream::Next(void** data, int* size) { // without a memory allocation this way. STLStringResizeUninitialized(target_, target_->capacity()); } else { - // Size has reached capacity, so double the size. Also make sure - // that the new size is at least kMinimumSize. + // Size has reached capacity, try to double the size. + if (old_size > std::numeric_limits::max() / 2) { + // Can not double the size otherwise it is going to cause integer + // overflow in the expression below: old_size * 2 "; + GOOGLE_LOG(ERROR) << "Cannot allocate buffer larger than kint32max for " + << "StringOutputStream."; + return false; + } + // Double the size, also make sure that the new size is at least + // kMinimumSize. STLStringResizeUninitialized( target_, max(old_size * 2, kMinimumSize + 0)); // "+ 0" works around GCC4 weirdness. } - *data = string_as_array(target_) + old_size; + *data = mutable_string_data(target_) + old_size; *size = target_->size() - old_size; return true; } diff --git a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.h b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h similarity index 95% rename from toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.h rename to toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h index 153f543ee4b0c..e18da72ca12f0 100644 --- a/toolkit/components/protobuf/google/protobuf/io/zero_copy_stream_impl_lite.h +++ b/toolkit/components/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -48,6 +48,7 @@ #include #include #include +#include namespace google { @@ -333,6 +334,19 @@ class LIBPROTOBUF_EXPORT CopyingOutputStreamAdaptor : public ZeroCopyOutputStrea // =================================================================== +// Return a pointer to mutable characters underlying the given string. The +// return value is valid until the next time the string is resized. We +// trust the caller to treat the return value as an array of length s->size(). +inline char* mutable_string_data(string* s) { +#ifdef LANG_CXX11 + // This should be simpler & faster than string_as_array() because the latter + // is guaranteed to return NULL when *s is empty, so it has to check for that. + return &(*s)[0]; +#else + return string_as_array(s); +#endif +} + } // namespace io } // namespace protobuf diff --git a/toolkit/components/protobuf/src/google/protobuf/message.cc b/toolkit/components/protobuf/src/google/protobuf/message.cc new file mode 100644 index 0000000000000..1324ed9b173f2 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/message.cc @@ -0,0 +1,358 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +using internal::WireFormat; +using internal::ReflectionOps; + +Message::~Message() {} + +void Message::MergeFrom(const Message& from) { + const Descriptor* descriptor = GetDescriptor(); + GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor) + << ": Tried to merge from a message with a different type. " + "to: " << descriptor->full_name() << ", " + "from:" << from.GetDescriptor()->full_name(); + ReflectionOps::Merge(from, this); +} + +void Message::CheckTypeAndMergeFrom(const MessageLite& other) { + MergeFrom(*down_cast(&other)); +} + +void Message::CopyFrom(const Message& from) { + const Descriptor* descriptor = GetDescriptor(); + GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor) + << ": Tried to copy from a message with a different type. " + "to: " << descriptor->full_name() << ", " + "from:" << from.GetDescriptor()->full_name(); + ReflectionOps::Copy(from, this); +} + +string Message::GetTypeName() const { + return GetDescriptor()->full_name(); +} + +void Message::Clear() { + ReflectionOps::Clear(this); +} + +bool Message::IsInitialized() const { + return ReflectionOps::IsInitialized(*this); +} + +void Message::FindInitializationErrors(vector* errors) const { + return ReflectionOps::FindInitializationErrors(*this, "", errors); +} + +string Message::InitializationErrorString() const { + vector errors; + FindInitializationErrors(&errors); + return Join(errors, ", "); +} + +void Message::CheckInitialized() const { + GOOGLE_CHECK(IsInitialized()) + << "Message of type \"" << GetDescriptor()->full_name() + << "\" is missing required fields: " << InitializationErrorString(); +} + +void Message::DiscardUnknownFields() { + return ReflectionOps::DiscardUnknownFields(this); +} + +bool Message::MergePartialFromCodedStream(io::CodedInputStream* input) { + return WireFormat::ParseAndMergePartial(input, this); +} + +bool Message::ParseFromFileDescriptor(int file_descriptor) { + io::FileInputStream input(file_descriptor); + return ParseFromZeroCopyStream(&input) && input.GetErrno() == 0; +} + +bool Message::ParsePartialFromFileDescriptor(int file_descriptor) { + io::FileInputStream input(file_descriptor); + return ParsePartialFromZeroCopyStream(&input) && input.GetErrno() == 0; +} + +bool Message::ParseFromIstream(istream* input) { + io::IstreamInputStream zero_copy_input(input); + return ParseFromZeroCopyStream(&zero_copy_input) && input->eof(); +} + +bool Message::ParsePartialFromIstream(istream* input) { + io::IstreamInputStream zero_copy_input(input); + return ParsePartialFromZeroCopyStream(&zero_copy_input) && input->eof(); +} + + +void Message::SerializeWithCachedSizes( + io::CodedOutputStream* output) const { + WireFormat::SerializeWithCachedSizes(*this, GetCachedSize(), output); +} + +int Message::ByteSize() const { + int size = WireFormat::ByteSize(*this); + SetCachedSize(size); + return size; +} + +void Message::SetCachedSize(int /* size */) const { + GOOGLE_LOG(FATAL) << "Message class \"" << GetDescriptor()->full_name() + << "\" implements neither SetCachedSize() nor ByteSize(). " + "Must implement one or the other."; +} + +int Message::SpaceUsed() const { + return GetReflection()->SpaceUsed(*this); +} + +bool Message::SerializeToFileDescriptor(int file_descriptor) const { + io::FileOutputStream output(file_descriptor); + return SerializeToZeroCopyStream(&output); +} + +bool Message::SerializePartialToFileDescriptor(int file_descriptor) const { + io::FileOutputStream output(file_descriptor); + return SerializePartialToZeroCopyStream(&output); +} + +bool Message::SerializeToOstream(ostream* output) const { + { + io::OstreamOutputStream zero_copy_output(output); + if (!SerializeToZeroCopyStream(&zero_copy_output)) return false; + } + return output->good(); +} + +bool Message::SerializePartialToOstream(ostream* output) const { + io::OstreamOutputStream zero_copy_output(output); + return SerializePartialToZeroCopyStream(&zero_copy_output); +} + + +// ============================================================================= +// Reflection and associated Template Specializations + +Reflection::~Reflection() {} + +#define HANDLE_TYPE(TYPE, CPPTYPE, CTYPE) \ +template<> \ +const RepeatedField& Reflection::GetRepeatedField( \ + const Message& message, const FieldDescriptor* field) const { \ + return *static_cast* >( \ + MutableRawRepeatedField(const_cast(&message), \ + field, CPPTYPE, CTYPE, NULL)); \ +} \ + \ +template<> \ +RepeatedField* Reflection::MutableRepeatedField( \ + Message* message, const FieldDescriptor* field) const { \ + return static_cast* >( \ + MutableRawRepeatedField(message, field, CPPTYPE, CTYPE, NULL)); \ +} + +HANDLE_TYPE(int32, FieldDescriptor::CPPTYPE_INT32, -1); +HANDLE_TYPE(int64, FieldDescriptor::CPPTYPE_INT64, -1); +HANDLE_TYPE(uint32, FieldDescriptor::CPPTYPE_UINT32, -1); +HANDLE_TYPE(uint64, FieldDescriptor::CPPTYPE_UINT64, -1); +HANDLE_TYPE(float, FieldDescriptor::CPPTYPE_FLOAT, -1); +HANDLE_TYPE(double, FieldDescriptor::CPPTYPE_DOUBLE, -1); +HANDLE_TYPE(bool, FieldDescriptor::CPPTYPE_BOOL, -1); + + +#undef HANDLE_TYPE + +void* Reflection::MutableRawRepeatedString( + Message* message, const FieldDescriptor* field, bool is_string) const { + return MutableRawRepeatedField(message, field, + FieldDescriptor::CPPTYPE_STRING, FieldOptions::STRING, NULL); +} + + +// ============================================================================= +// MessageFactory + +MessageFactory::~MessageFactory() {} + +namespace { + +class GeneratedMessageFactory : public MessageFactory { + public: + GeneratedMessageFactory(); + ~GeneratedMessageFactory(); + + static GeneratedMessageFactory* singleton(); + + typedef void RegistrationFunc(const string&); + void RegisterFile(const char* file, RegistrationFunc* registration_func); + void RegisterType(const Descriptor* descriptor, const Message* prototype); + + // implements MessageFactory --------------------------------------- + const Message* GetPrototype(const Descriptor* type); + + private: + // Only written at static init time, so does not require locking. + hash_map, streq> file_map_; + + // Initialized lazily, so requires locking. + Mutex mutex_; + hash_map type_map_; +}; + +GeneratedMessageFactory* generated_message_factory_ = NULL; +GOOGLE_PROTOBUF_DECLARE_ONCE(generated_message_factory_once_init_); + +void ShutdownGeneratedMessageFactory() { + delete generated_message_factory_; +} + +void InitGeneratedMessageFactory() { + generated_message_factory_ = new GeneratedMessageFactory; + internal::OnShutdown(&ShutdownGeneratedMessageFactory); +} + +GeneratedMessageFactory::GeneratedMessageFactory() {} +GeneratedMessageFactory::~GeneratedMessageFactory() {} + +GeneratedMessageFactory* GeneratedMessageFactory::singleton() { + ::google::protobuf::GoogleOnceInit(&generated_message_factory_once_init_, + &InitGeneratedMessageFactory); + return generated_message_factory_; +} + +void GeneratedMessageFactory::RegisterFile( + const char* file, RegistrationFunc* registration_func) { + if (!InsertIfNotPresent(&file_map_, file, registration_func)) { + GOOGLE_LOG(FATAL) << "File is already registered: " << file; + } +} + +void GeneratedMessageFactory::RegisterType(const Descriptor* descriptor, + const Message* prototype) { + GOOGLE_DCHECK_EQ(descriptor->file()->pool(), DescriptorPool::generated_pool()) + << "Tried to register a non-generated type with the generated " + "type registry."; + + // This should only be called as a result of calling a file registration + // function during GetPrototype(), in which case we already have locked + // the mutex. + mutex_.AssertHeld(); + if (!InsertIfNotPresent(&type_map_, descriptor, prototype)) { + GOOGLE_LOG(DFATAL) << "Type is already registered: " << descriptor->full_name(); + } +} + + +const Message* GeneratedMessageFactory::GetPrototype(const Descriptor* type) { + { + ReaderMutexLock lock(&mutex_); + const Message* result = FindPtrOrNull(type_map_, type); + if (result != NULL) return result; + } + + // If the type is not in the generated pool, then we can't possibly handle + // it. + if (type->file()->pool() != DescriptorPool::generated_pool()) return NULL; + + // Apparently the file hasn't been registered yet. Let's do that now. + RegistrationFunc* registration_func = + FindPtrOrNull(file_map_, type->file()->name().c_str()); + if (registration_func == NULL) { + GOOGLE_LOG(DFATAL) << "File appears to be in generated pool but wasn't " + "registered: " << type->file()->name(); + return NULL; + } + + WriterMutexLock lock(&mutex_); + + // Check if another thread preempted us. + const Message* result = FindPtrOrNull(type_map_, type); + if (result == NULL) { + // Nope. OK, register everything. + registration_func(type->file()->name()); + // Should be here now. + result = FindPtrOrNull(type_map_, type); + } + + if (result == NULL) { + GOOGLE_LOG(DFATAL) << "Type appears to be in generated pool but wasn't " + << "registered: " << type->full_name(); + } + + return result; +} + +} // namespace + +MessageFactory* MessageFactory::generated_factory() { + return GeneratedMessageFactory::singleton(); +} + +void MessageFactory::InternalRegisterGeneratedFile( + const char* filename, void (*register_messages)(const string&)) { + GeneratedMessageFactory::singleton()->RegisterFile(filename, + register_messages); +} + +void MessageFactory::InternalRegisterGeneratedMessage( + const Descriptor* descriptor, const Message* prototype) { + GeneratedMessageFactory::singleton()->RegisterType(descriptor, prototype); +} + + +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/message.h b/toolkit/components/protobuf/src/google/protobuf/message.h new file mode 100644 index 0000000000000..9593560531f8d --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/message.h @@ -0,0 +1,866 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Defines Message, the abstract interface implemented by non-lite +// protocol message objects. Although it's possible to implement this +// interface manually, most users will use the protocol compiler to +// generate implementations. +// +// Example usage: +// +// Say you have a message defined as: +// +// message Foo { +// optional string text = 1; +// repeated int32 numbers = 2; +// } +// +// Then, if you used the protocol compiler to generate a class from the above +// definition, you could use it like so: +// +// string data; // Will store a serialized version of the message. +// +// { +// // Create a message and serialize it. +// Foo foo; +// foo.set_text("Hello World!"); +// foo.add_numbers(1); +// foo.add_numbers(5); +// foo.add_numbers(42); +// +// foo.SerializeToString(&data); +// } +// +// { +// // Parse the serialized message and check that it contains the +// // correct data. +// Foo foo; +// foo.ParseFromString(data); +// +// assert(foo.text() == "Hello World!"); +// assert(foo.numbers_size() == 3); +// assert(foo.numbers(0) == 1); +// assert(foo.numbers(1) == 5); +// assert(foo.numbers(2) == 42); +// } +// +// { +// // Same as the last block, but do it dynamically via the Message +// // reflection interface. +// Message* foo = new Foo; +// const Descriptor* descriptor = foo->GetDescriptor(); +// +// // Get the descriptors for the fields we're interested in and verify +// // their types. +// const FieldDescriptor* text_field = descriptor->FindFieldByName("text"); +// assert(text_field != NULL); +// assert(text_field->type() == FieldDescriptor::TYPE_STRING); +// assert(text_field->label() == FieldDescriptor::LABEL_OPTIONAL); +// const FieldDescriptor* numbers_field = descriptor-> +// FindFieldByName("numbers"); +// assert(numbers_field != NULL); +// assert(numbers_field->type() == FieldDescriptor::TYPE_INT32); +// assert(numbers_field->label() == FieldDescriptor::LABEL_REPEATED); +// +// // Parse the message. +// foo->ParseFromString(data); +// +// // Use the reflection interface to examine the contents. +// const Reflection* reflection = foo->GetReflection(); +// assert(reflection->GetString(foo, text_field) == "Hello World!"); +// assert(reflection->FieldSize(foo, numbers_field) == 3); +// assert(reflection->GetRepeatedInt32(foo, numbers_field, 0) == 1); +// assert(reflection->GetRepeatedInt32(foo, numbers_field, 1) == 5); +// assert(reflection->GetRepeatedInt32(foo, numbers_field, 2) == 42); +// +// delete foo; +// } + +#ifndef GOOGLE_PROTOBUF_MESSAGE_H__ +#define GOOGLE_PROTOBUF_MESSAGE_H__ + +#include +#include +#include + +#include + +#include +#include + + +#define GOOGLE_PROTOBUF_HAS_ONEOF + +namespace google { +namespace protobuf { + +// Defined in this file. +class Message; +class Reflection; +class MessageFactory; + +// Defined in other files. +class UnknownFieldSet; // unknown_field_set.h +namespace io { + class ZeroCopyInputStream; // zero_copy_stream.h + class ZeroCopyOutputStream; // zero_copy_stream.h + class CodedInputStream; // coded_stream.h + class CodedOutputStream; // coded_stream.h +} + + +template +class RepeatedField; // repeated_field.h + +template +class RepeatedPtrField; // repeated_field.h + +// A container to hold message metadata. +struct Metadata { + const Descriptor* descriptor; + const Reflection* reflection; +}; + +// Abstract interface for protocol messages. +// +// See also MessageLite, which contains most every-day operations. Message +// adds descriptors and reflection on top of that. +// +// The methods of this class that are virtual but not pure-virtual have +// default implementations based on reflection. Message classes which are +// optimized for speed will want to override these with faster implementations, +// but classes optimized for code size may be happy with keeping them. See +// the optimize_for option in descriptor.proto. +class LIBPROTOBUF_EXPORT Message : public MessageLite { + public: + inline Message() {} + virtual ~Message(); + + // Basic Operations ------------------------------------------------ + + // Construct a new instance of the same type. Ownership is passed to the + // caller. (This is also defined in MessageLite, but is defined again here + // for return-type covariance.) + virtual Message* New() const = 0; + + // Make this message into a copy of the given message. The given message + // must have the same descriptor, but need not necessarily be the same class. + // By default this is just implemented as "Clear(); MergeFrom(from);". + virtual void CopyFrom(const Message& from); + + // Merge the fields from the given message into this message. Singular + // fields will be overwritten, if specified in from, except for embedded + // messages which will be merged. Repeated fields will be concatenated. + // The given message must be of the same type as this message (i.e. the + // exact same class). + virtual void MergeFrom(const Message& from); + + // Verifies that IsInitialized() returns true. GOOGLE_CHECK-fails otherwise, with + // a nice error message. + void CheckInitialized() const; + + // Slowly build a list of all required fields that are not set. + // This is much, much slower than IsInitialized() as it is implemented + // purely via reflection. Generally, you should not call this unless you + // have already determined that an error exists by calling IsInitialized(). + void FindInitializationErrors(vector* errors) const; + + // Like FindInitializationErrors, but joins all the strings, delimited by + // commas, and returns them. + string InitializationErrorString() const; + + // Clears all unknown fields from this message and all embedded messages. + // Normally, if unknown tag numbers are encountered when parsing a message, + // the tag and value are stored in the message's UnknownFieldSet and + // then written back out when the message is serialized. This allows servers + // which simply route messages to other servers to pass through messages + // that have new field definitions which they don't yet know about. However, + // this behavior can have security implications. To avoid it, call this + // method after parsing. + // + // See Reflection::GetUnknownFields() for more on unknown fields. + virtual void DiscardUnknownFields(); + + // Computes (an estimate of) the total number of bytes currently used for + // storing the message in memory. The default implementation calls the + // Reflection object's SpaceUsed() method. + virtual int SpaceUsed() const; + + // Debugging & Testing---------------------------------------------- + + // Generates a human readable form of this message, useful for debugging + // and other purposes. + string DebugString() const; + // Like DebugString(), but with less whitespace. + string ShortDebugString() const; + // Like DebugString(), but do not escape UTF-8 byte sequences. + string Utf8DebugString() const; + // Convenience function useful in GDB. Prints DebugString() to stdout. + void PrintDebugString() const; + + // Heavy I/O ------------------------------------------------------- + // Additional parsing and serialization methods not implemented by + // MessageLite because they are not supported by the lite library. + + // Parse a protocol buffer from a file descriptor. If successful, the entire + // input will be consumed. + bool ParseFromFileDescriptor(int file_descriptor); + // Like ParseFromFileDescriptor(), but accepts messages that are missing + // required fields. + bool ParsePartialFromFileDescriptor(int file_descriptor); + // Parse a protocol buffer from a C++ istream. If successful, the entire + // input will be consumed. + bool ParseFromIstream(istream* input); + // Like ParseFromIstream(), but accepts messages that are missing + // required fields. + bool ParsePartialFromIstream(istream* input); + + // Serialize the message and write it to the given file descriptor. All + // required fields must be set. + bool SerializeToFileDescriptor(int file_descriptor) const; + // Like SerializeToFileDescriptor(), but allows missing required fields. + bool SerializePartialToFileDescriptor(int file_descriptor) const; + // Serialize the message and write it to the given C++ ostream. All + // required fields must be set. + bool SerializeToOstream(ostream* output) const; + // Like SerializeToOstream(), but allows missing required fields. + bool SerializePartialToOstream(ostream* output) const; + + + // Reflection-based methods ---------------------------------------- + // These methods are pure-virtual in MessageLite, but Message provides + // reflection-based default implementations. + + virtual string GetTypeName() const; + virtual void Clear(); + virtual bool IsInitialized() const; + virtual void CheckTypeAndMergeFrom(const MessageLite& other); + virtual bool MergePartialFromCodedStream(io::CodedInputStream* input); + virtual int ByteSize() const; + virtual void SerializeWithCachedSizes(io::CodedOutputStream* output) const; + + private: + // This is called only by the default implementation of ByteSize(), to + // update the cached size. If you override ByteSize(), you do not need + // to override this. If you do not override ByteSize(), you MUST override + // this; the default implementation will crash. + // + // The method is private because subclasses should never call it; only + // override it. Yes, C++ lets you do that. Crazy, huh? + virtual void SetCachedSize(int size) const; + + public: + + // Introspection --------------------------------------------------- + + // Typedef for backwards-compatibility. + typedef google::protobuf::Reflection Reflection; + + // Get a Descriptor for this message's type. This describes what + // fields the message contains, the types of those fields, etc. + const Descriptor* GetDescriptor() const { return GetMetadata().descriptor; } + + // Get the Reflection interface for this Message, which can be used to + // read and modify the fields of the Message dynamically (in other words, + // without knowing the message type at compile time). This object remains + // property of the Message. + // + // This method remains virtual in case a subclass does not implement + // reflection and wants to override the default behavior. + virtual const Reflection* GetReflection() const { + return GetMetadata().reflection; + } + + protected: + // Get a struct containing the metadata for the Message. Most subclasses only + // need to implement this method, rather than the GetDescriptor() and + // GetReflection() wrappers. + virtual Metadata GetMetadata() const = 0; + + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message); +}; + +// This interface contains methods that can be used to dynamically access +// and modify the fields of a protocol message. Their semantics are +// similar to the accessors the protocol compiler generates. +// +// To get the Reflection for a given Message, call Message::GetReflection(). +// +// This interface is separate from Message only for efficiency reasons; +// the vast majority of implementations of Message will share the same +// implementation of Reflection (GeneratedMessageReflection, +// defined in generated_message.h), and all Messages of a particular class +// should share the same Reflection object (though you should not rely on +// the latter fact). +// +// There are several ways that these methods can be used incorrectly. For +// example, any of the following conditions will lead to undefined +// results (probably assertion failures): +// - The FieldDescriptor is not a field of this message type. +// - The method called is not appropriate for the field's type. For +// each field type in FieldDescriptor::TYPE_*, there is only one +// Get*() method, one Set*() method, and one Add*() method that is +// valid for that type. It should be obvious which (except maybe +// for TYPE_BYTES, which are represented using strings in C++). +// - A Get*() or Set*() method for singular fields is called on a repeated +// field. +// - GetRepeated*(), SetRepeated*(), or Add*() is called on a non-repeated +// field. +// - The Message object passed to any method is not of the right type for +// this Reflection object (i.e. message.GetReflection() != reflection). +// +// You might wonder why there is not any abstract representation for a field +// of arbitrary type. E.g., why isn't there just a "GetField()" method that +// returns "const Field&", where "Field" is some class with accessors like +// "GetInt32Value()". The problem is that someone would have to deal with +// allocating these Field objects. For generated message classes, having to +// allocate space for an additional object to wrap every field would at least +// double the message's memory footprint, probably worse. Allocating the +// objects on-demand, on the other hand, would be expensive and prone to +// memory leaks. So, instead we ended up with this flat interface. +// +// TODO(kenton): Create a utility class which callers can use to read and +// write fields from a Reflection without paying attention to the type. +class LIBPROTOBUF_EXPORT Reflection { + public: + inline Reflection() {} + virtual ~Reflection(); + + // Get the UnknownFieldSet for the message. This contains fields which + // were seen when the Message was parsed but were not recognized according + // to the Message's definition. + virtual const UnknownFieldSet& GetUnknownFields( + const Message& message) const = 0; + // Get a mutable pointer to the UnknownFieldSet for the message. This + // contains fields which were seen when the Message was parsed but were not + // recognized according to the Message's definition. + virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0; + + // Estimate the amount of memory used by the message object. + virtual int SpaceUsed(const Message& message) const = 0; + + // Check if the given non-repeated field is set. + virtual bool HasField(const Message& message, + const FieldDescriptor* field) const = 0; + + // Get the number of elements of a repeated field. + virtual int FieldSize(const Message& message, + const FieldDescriptor* field) const = 0; + + // Clear the value of a field, so that HasField() returns false or + // FieldSize() returns zero. + virtual void ClearField(Message* message, + const FieldDescriptor* field) const = 0; + + // Check if the oneof is set. Returns ture if any field in oneof + // is set, false otherwise. + // TODO(jieluo) - make it pure virtual after updating all + // the subclasses. + virtual bool HasOneof(const Message& message, + const OneofDescriptor* oneof_descriptor) const { + return false; + } + + virtual void ClearOneof(Message* message, + const OneofDescriptor* oneof_descriptor) const {} + + // Returns the field descriptor if the oneof is set. NULL otherwise. + // TODO(jieluo) - make it pure virtual. + virtual const FieldDescriptor* GetOneofFieldDescriptor( + const Message& message, + const OneofDescriptor* oneof_descriptor) const { + return NULL; + } + + // Removes the last element of a repeated field. + // We don't provide a way to remove any element other than the last + // because it invites inefficient use, such as O(n^2) filtering loops + // that should have been O(n). If you want to remove an element other + // than the last, the best way to do it is to re-arrange the elements + // (using Swap()) so that the one you want removed is at the end, then + // call RemoveLast(). + virtual void RemoveLast(Message* message, + const FieldDescriptor* field) const = 0; + // Removes the last element of a repeated message field, and returns the + // pointer to the caller. Caller takes ownership of the returned pointer. + virtual Message* ReleaseLast(Message* message, + const FieldDescriptor* field) const = 0; + + // Swap the complete contents of two messages. + virtual void Swap(Message* message1, Message* message2) const = 0; + + // Swap fields listed in fields vector of two messages. + virtual void SwapFields(Message* message1, + Message* message2, + const vector& fields) + const = 0; + + // Swap two elements of a repeated field. + virtual void SwapElements(Message* message, + const FieldDescriptor* field, + int index1, + int index2) const = 0; + + // List all fields of the message which are currently set. This includes + // extensions. Singular fields will only be listed if HasField(field) would + // return true and repeated fields will only be listed if FieldSize(field) + // would return non-zero. Fields (both normal fields and extension fields) + // will be listed ordered by field number. + virtual void ListFields(const Message& message, + vector* output) const = 0; + + // Singular field getters ------------------------------------------ + // These get the value of a non-repeated field. They return the default + // value for fields that aren't set. + + virtual int32 GetInt32 (const Message& message, + const FieldDescriptor* field) const = 0; + virtual int64 GetInt64 (const Message& message, + const FieldDescriptor* field) const = 0; + virtual uint32 GetUInt32(const Message& message, + const FieldDescriptor* field) const = 0; + virtual uint64 GetUInt64(const Message& message, + const FieldDescriptor* field) const = 0; + virtual float GetFloat (const Message& message, + const FieldDescriptor* field) const = 0; + virtual double GetDouble(const Message& message, + const FieldDescriptor* field) const = 0; + virtual bool GetBool (const Message& message, + const FieldDescriptor* field) const = 0; + virtual string GetString(const Message& message, + const FieldDescriptor* field) const = 0; + virtual const EnumValueDescriptor* GetEnum( + const Message& message, const FieldDescriptor* field) const = 0; + // See MutableMessage() for the meaning of the "factory" parameter. + virtual const Message& GetMessage(const Message& message, + const FieldDescriptor* field, + MessageFactory* factory = NULL) const = 0; + + // Get a string value without copying, if possible. + // + // GetString() necessarily returns a copy of the string. This can be + // inefficient when the string is already stored in a string object in the + // underlying message. GetStringReference() will return a reference to the + // underlying string in this case. Otherwise, it will copy the string into + // *scratch and return that. + // + // Note: It is perfectly reasonable and useful to write code like: + // str = reflection->GetStringReference(field, &str); + // This line would ensure that only one copy of the string is made + // regardless of the field's underlying representation. When initializing + // a newly-constructed string, though, it's just as fast and more readable + // to use code like: + // string str = reflection->GetString(field); + virtual const string& GetStringReference(const Message& message, + const FieldDescriptor* field, + string* scratch) const = 0; + + + // Singular field mutators ----------------------------------------- + // These mutate the value of a non-repeated field. + + virtual void SetInt32 (Message* message, + const FieldDescriptor* field, int32 value) const = 0; + virtual void SetInt64 (Message* message, + const FieldDescriptor* field, int64 value) const = 0; + virtual void SetUInt32(Message* message, + const FieldDescriptor* field, uint32 value) const = 0; + virtual void SetUInt64(Message* message, + const FieldDescriptor* field, uint64 value) const = 0; + virtual void SetFloat (Message* message, + const FieldDescriptor* field, float value) const = 0; + virtual void SetDouble(Message* message, + const FieldDescriptor* field, double value) const = 0; + virtual void SetBool (Message* message, + const FieldDescriptor* field, bool value) const = 0; + virtual void SetString(Message* message, + const FieldDescriptor* field, + const string& value) const = 0; + virtual void SetEnum (Message* message, + const FieldDescriptor* field, + const EnumValueDescriptor* value) const = 0; + // Get a mutable pointer to a field with a message type. If a MessageFactory + // is provided, it will be used to construct instances of the sub-message; + // otherwise, the default factory is used. If the field is an extension that + // does not live in the same pool as the containing message's descriptor (e.g. + // it lives in an overlay pool), then a MessageFactory must be provided. + // If you have no idea what that meant, then you probably don't need to worry + // about it (don't provide a MessageFactory). WARNING: If the + // FieldDescriptor is for a compiled-in extension, then + // factory->GetPrototype(field->message_type() MUST return an instance of the + // compiled-in class for this type, NOT DynamicMessage. + virtual Message* MutableMessage(Message* message, + const FieldDescriptor* field, + MessageFactory* factory = NULL) const = 0; + // Replaces the message specified by 'field' with the already-allocated object + // sub_message, passing ownership to the message. If the field contained a + // message, that message is deleted. If sub_message is NULL, the field is + // cleared. + virtual void SetAllocatedMessage(Message* message, + Message* sub_message, + const FieldDescriptor* field) const = 0; + // Releases the message specified by 'field' and returns the pointer, + // ReleaseMessage() will return the message the message object if it exists. + // Otherwise, it may or may not return NULL. In any case, if the return value + // is non-NULL, the caller takes ownership of the pointer. + // If the field existed (HasField() is true), then the returned pointer will + // be the same as the pointer returned by MutableMessage(). + // This function has the same effect as ClearField(). + virtual Message* ReleaseMessage(Message* message, + const FieldDescriptor* field, + MessageFactory* factory = NULL) const = 0; + + + // Repeated field getters ------------------------------------------ + // These get the value of one element of a repeated field. + + virtual int32 GetRepeatedInt32 (const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual int64 GetRepeatedInt64 (const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual uint32 GetRepeatedUInt32(const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual uint64 GetRepeatedUInt64(const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual float GetRepeatedFloat (const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual double GetRepeatedDouble(const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual bool GetRepeatedBool (const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual string GetRepeatedString(const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual const EnumValueDescriptor* GetRepeatedEnum( + const Message& message, + const FieldDescriptor* field, int index) const = 0; + virtual const Message& GetRepeatedMessage( + const Message& message, + const FieldDescriptor* field, int index) const = 0; + + // See GetStringReference(), above. + virtual const string& GetRepeatedStringReference( + const Message& message, const FieldDescriptor* field, + int index, string* scratch) const = 0; + + + // Repeated field mutators ----------------------------------------- + // These mutate the value of one element of a repeated field. + + virtual void SetRepeatedInt32 (Message* message, + const FieldDescriptor* field, + int index, int32 value) const = 0; + virtual void SetRepeatedInt64 (Message* message, + const FieldDescriptor* field, + int index, int64 value) const = 0; + virtual void SetRepeatedUInt32(Message* message, + const FieldDescriptor* field, + int index, uint32 value) const = 0; + virtual void SetRepeatedUInt64(Message* message, + const FieldDescriptor* field, + int index, uint64 value) const = 0; + virtual void SetRepeatedFloat (Message* message, + const FieldDescriptor* field, + int index, float value) const = 0; + virtual void SetRepeatedDouble(Message* message, + const FieldDescriptor* field, + int index, double value) const = 0; + virtual void SetRepeatedBool (Message* message, + const FieldDescriptor* field, + int index, bool value) const = 0; + virtual void SetRepeatedString(Message* message, + const FieldDescriptor* field, + int index, const string& value) const = 0; + virtual void SetRepeatedEnum(Message* message, + const FieldDescriptor* field, int index, + const EnumValueDescriptor* value) const = 0; + // Get a mutable pointer to an element of a repeated field with a message + // type. + virtual Message* MutableRepeatedMessage( + Message* message, const FieldDescriptor* field, int index) const = 0; + + + // Repeated field adders ------------------------------------------- + // These add an element to a repeated field. + + virtual void AddInt32 (Message* message, + const FieldDescriptor* field, int32 value) const = 0; + virtual void AddInt64 (Message* message, + const FieldDescriptor* field, int64 value) const = 0; + virtual void AddUInt32(Message* message, + const FieldDescriptor* field, uint32 value) const = 0; + virtual void AddUInt64(Message* message, + const FieldDescriptor* field, uint64 value) const = 0; + virtual void AddFloat (Message* message, + const FieldDescriptor* field, float value) const = 0; + virtual void AddDouble(Message* message, + const FieldDescriptor* field, double value) const = 0; + virtual void AddBool (Message* message, + const FieldDescriptor* field, bool value) const = 0; + virtual void AddString(Message* message, + const FieldDescriptor* field, + const string& value) const = 0; + virtual void AddEnum (Message* message, + const FieldDescriptor* field, + const EnumValueDescriptor* value) const = 0; + // See MutableMessage() for comments on the "factory" parameter. + virtual Message* AddMessage(Message* message, + const FieldDescriptor* field, + MessageFactory* factory = NULL) const = 0; + + + // Repeated field accessors ------------------------------------------------- + // The methods above, e.g. GetRepeatedInt32(msg, fd, index), provide singular + // access to the data in a RepeatedField. The methods below provide aggregate + // access by exposing the RepeatedField object itself with the Message. + // Applying these templates to inappropriate types will lead to an undefined + // reference at link time (e.g. GetRepeatedField<***double>), or possibly a + // template matching error at compile time (e.g. GetRepeatedPtrField). + // + // Usage example: my_doubs = refl->GetRepeatedField(msg, fd); + + // for T = Cord and all protobuf scalar types except enums. + template + const RepeatedField& GetRepeatedField( + const Message&, const FieldDescriptor*) const; + + // for T = Cord and all protobuf scalar types except enums. + template + RepeatedField* MutableRepeatedField( + Message*, const FieldDescriptor*) const; + + // for T = string, google::protobuf::internal::StringPieceField + // google::protobuf::Message & descendants. + template + const RepeatedPtrField& GetRepeatedPtrField( + const Message&, const FieldDescriptor*) const; + + // for T = string, google::protobuf::internal::StringPieceField + // google::protobuf::Message & descendants. + template + RepeatedPtrField* MutableRepeatedPtrField( + Message*, const FieldDescriptor*) const; + + // Extensions ---------------------------------------------------------------- + + // Try to find an extension of this message type by fully-qualified field + // name. Returns NULL if no extension is known for this name or number. + virtual const FieldDescriptor* FindKnownExtensionByName( + const string& name) const = 0; + + // Try to find an extension of this message type by field number. + // Returns NULL if no extension is known for this name or number. + virtual const FieldDescriptor* FindKnownExtensionByNumber( + int number) const = 0; + + // --------------------------------------------------------------------------- + + protected: + // Obtain a pointer to a Repeated Field Structure and do some type checking: + // on field->cpp_type(), + // on field->field_option().ctype() (if ctype >= 0) + // of field->message_type() (if message_type != NULL). + // We use 1 routine rather than 4 (const vs mutable) x (scalar vs pointer). + virtual void* MutableRawRepeatedField( + Message* message, const FieldDescriptor* field, FieldDescriptor::CppType, + int ctype, const Descriptor* message_type) const = 0; + + private: + // Special version for specialized implementations of string. We can't call + // MutableRawRepeatedField directly here because we don't have access to + // FieldOptions::* which are defined in descriptor.pb.h. Including that + // file here is not possible because it would cause a circular include cycle. + void* MutableRawRepeatedString( + Message* message, const FieldDescriptor* field, bool is_string) const; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection); +}; + +// Abstract interface for a factory for message objects. +class LIBPROTOBUF_EXPORT MessageFactory { + public: + inline MessageFactory() {} + virtual ~MessageFactory(); + + // Given a Descriptor, gets or constructs the default (prototype) Message + // of that type. You can then call that message's New() method to construct + // a mutable message of that type. + // + // Calling this method twice with the same Descriptor returns the same + // object. The returned object remains property of the factory. Also, any + // objects created by calling the prototype's New() method share some data + // with the prototype, so these must be destroyed before the MessageFactory + // is destroyed. + // + // The given descriptor must outlive the returned message, and hence must + // outlive the MessageFactory. + // + // Some implementations do not support all types. GetPrototype() will + // return NULL if the descriptor passed in is not supported. + // + // This method may or may not be thread-safe depending on the implementation. + // Each implementation should document its own degree thread-safety. + virtual const Message* GetPrototype(const Descriptor* type) = 0; + + // Gets a MessageFactory which supports all generated, compiled-in messages. + // In other words, for any compiled-in type FooMessage, the following is true: + // MessageFactory::generated_factory()->GetPrototype( + // FooMessage::descriptor()) == FooMessage::default_instance() + // This factory supports all types which are found in + // DescriptorPool::generated_pool(). If given a descriptor from any other + // pool, GetPrototype() will return NULL. (You can also check if a + // descriptor is for a generated message by checking if + // descriptor->file()->pool() == DescriptorPool::generated_pool().) + // + // This factory is 100% thread-safe; calling GetPrototype() does not modify + // any shared data. + // + // This factory is a singleton. The caller must not delete the object. + static MessageFactory* generated_factory(); + + // For internal use only: Registers a .proto file at static initialization + // time, to be placed in generated_factory. The first time GetPrototype() + // is called with a descriptor from this file, |register_messages| will be + // called, with the file name as the parameter. It must call + // InternalRegisterGeneratedMessage() (below) to register each message type + // in the file. This strange mechanism is necessary because descriptors are + // built lazily, so we can't register types by their descriptor until we + // know that the descriptor exists. |filename| must be a permanent string. + static void InternalRegisterGeneratedFile( + const char* filename, void (*register_messages)(const string&)); + + // For internal use only: Registers a message type. Called only by the + // functions which are registered with InternalRegisterGeneratedFile(), + // above. + static void InternalRegisterGeneratedMessage(const Descriptor* descriptor, + const Message* prototype); + + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFactory); +}; + +#define DECLARE_GET_REPEATED_FIELD(TYPE) \ +template<> \ +LIBPROTOBUF_EXPORT \ +const RepeatedField& Reflection::GetRepeatedField( \ + const Message& message, const FieldDescriptor* field) const; \ + \ +template<> \ +RepeatedField* Reflection::MutableRepeatedField( \ + Message* message, const FieldDescriptor* field) const; + +DECLARE_GET_REPEATED_FIELD(int32) +DECLARE_GET_REPEATED_FIELD(int64) +DECLARE_GET_REPEATED_FIELD(uint32) +DECLARE_GET_REPEATED_FIELD(uint64) +DECLARE_GET_REPEATED_FIELD(float) +DECLARE_GET_REPEATED_FIELD(double) +DECLARE_GET_REPEATED_FIELD(bool) + +#undef DECLARE_GET_REPEATED_FIELD + +// ============================================================================= +// Implementation details for {Get,Mutable}RawRepeatedPtrField. We provide +// specializations for , and and handle +// everything else with the default template which will match any type having +// a method with signature "static const google::protobuf::Descriptor* descriptor()". +// Such a type presumably is a descendant of google::protobuf::Message. + +template<> +inline const RepeatedPtrField& Reflection::GetRepeatedPtrField( + const Message& message, const FieldDescriptor* field) const { + return *static_cast* >( + MutableRawRepeatedString(const_cast(&message), field, true)); +} + +template<> +inline RepeatedPtrField* Reflection::MutableRepeatedPtrField( + Message* message, const FieldDescriptor* field) const { + return static_cast* >( + MutableRawRepeatedString(message, field, true)); +} + + +// ----- + +template<> +inline const RepeatedPtrField& Reflection::GetRepeatedPtrField( + const Message& message, const FieldDescriptor* field) const { + return *static_cast* >( + MutableRawRepeatedField(const_cast(&message), field, + FieldDescriptor::CPPTYPE_MESSAGE, -1, + NULL)); +} + +template<> +inline RepeatedPtrField* Reflection::MutableRepeatedPtrField( + Message* message, const FieldDescriptor* field) const { + return static_cast* >( + MutableRawRepeatedField(message, field, + FieldDescriptor::CPPTYPE_MESSAGE, -1, + NULL)); +} + +template +inline const RepeatedPtrField& Reflection::GetRepeatedPtrField( + const Message& message, const FieldDescriptor* field) const { + return *static_cast* >( + MutableRawRepeatedField(const_cast(&message), field, + FieldDescriptor::CPPTYPE_MESSAGE, -1, + PB::default_instance().GetDescriptor())); +} + +template +inline RepeatedPtrField* Reflection::MutableRepeatedPtrField( + Message* message, const FieldDescriptor* field) const { + return static_cast* >( + MutableRawRepeatedField(message, field, + FieldDescriptor::CPPTYPE_MESSAGE, -1, + PB::default_instance().GetDescriptor())); +} + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_MESSAGE_H__ diff --git a/toolkit/components/protobuf/google/protobuf/message_lite.cc b/toolkit/components/protobuf/src/google/protobuf/message_lite.cc similarity index 98% rename from toolkit/components/protobuf/google/protobuf/message_lite.cc rename to toolkit/components/protobuf/src/google/protobuf/message_lite.cc index e2e7b407afe1f..14cdc91fddeb8 100644 --- a/toolkit/components/protobuf/google/protobuf/message_lite.cc +++ b/toolkit/components/protobuf/src/google/protobuf/message_lite.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -38,7 +38,7 @@ #include #include #include -#include +#include namespace google { namespace protobuf { @@ -278,7 +278,8 @@ bool MessageLite::AppendPartialToString(string* output) const { int old_size = output->size(); int byte_size = ByteSize(); STLStringResizeUninitialized(output, old_size + byte_size); - uint8* start = reinterpret_cast(string_as_array(output) + old_size); + uint8* start = + reinterpret_cast(io::mutable_string_data(output) + old_size); uint8* end = SerializeWithCachedSizesToArray(start); if (end - start != byte_size) { ByteSizeConsistencyError(byte_size, ByteSize(), end - start); diff --git a/toolkit/components/protobuf/google/protobuf/message_lite.h b/toolkit/components/protobuf/src/google/protobuf/message_lite.h similarity index 97% rename from toolkit/components/protobuf/google/protobuf/message_lite.h rename to toolkit/components/protobuf/src/google/protobuf/message_lite.h index ebf4ba3c88af2..027cabf919878 100644 --- a/toolkit/components/protobuf/google/protobuf/message_lite.h +++ b/toolkit/components/protobuf/src/google/protobuf/message_lite.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -40,11 +40,17 @@ #define GOOGLE_PROTOBUF_MESSAGE_LITE_H__ #include -#include namespace google { namespace protobuf { +namespace io { + class CodedInputStream; + class CodedOutputStream; + class ZeroCopyInputStream; + class ZeroCopyOutputStream; +} + // Interface to light weight protocol messages. // // This interface is implemented by all protocol message objects. Non-lite @@ -103,7 +109,8 @@ class LIBPROTOBUF_EXPORT MessageLite { // Parsing --------------------------------------------------------- // Methods for parsing in protocol buffer format. Most of these are - // just simple wrappers around MergeFromCodedStream(). + // just simple wrappers around MergeFromCodedStream(). Clear() will be called + // before merging the input. // Fill the message with a protocol buffer parsed from the given input // stream. Returns false on a read error or if the input is in the @@ -158,6 +165,7 @@ class LIBPROTOBUF_EXPORT MessageLite { // followed by IsInitialized(). virtual bool MergePartialFromCodedStream(io::CodedInputStream* input) = 0; + // Serialization --------------------------------------------------- // Methods for serializing in protocol buffer format. Most of these // are just simple wrappers around ByteSize() and SerializeWithCachedSizes(). diff --git a/toolkit/components/protobuf/google/protobuf/package_info.h b/toolkit/components/protobuf/src/google/protobuf/package_info.h similarity index 98% rename from toolkit/components/protobuf/google/protobuf/package_info.h rename to toolkit/components/protobuf/src/google/protobuf/package_info.h index 60cd3994cbb01..935e96396dc3f 100644 --- a/toolkit/components/protobuf/google/protobuf/package_info.h +++ b/toolkit/components/protobuf/src/google/protobuf/package_info.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are diff --git a/toolkit/components/protobuf/src/google/protobuf/reflection_ops.cc b/toolkit/components/protobuf/src/google/protobuf/reflection_ops.cc new file mode 100644 index 0000000000000..4629dec2510b1 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/reflection_ops.cc @@ -0,0 +1,269 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace internal { + +void ReflectionOps::Copy(const Message& from, Message* to) { + if (&from == to) return; + Clear(to); + Merge(from, to); +} + +void ReflectionOps::Merge(const Message& from, Message* to) { + GOOGLE_CHECK_NE(&from, to); + + const Descriptor* descriptor = from.GetDescriptor(); + GOOGLE_CHECK_EQ(to->GetDescriptor(), descriptor) + << "Tried to merge messages of different types " + << "(merge " << descriptor->full_name() + << " to " << to->GetDescriptor()->full_name() << ")"; + + const Reflection* from_reflection = from.GetReflection(); + const Reflection* to_reflection = to->GetReflection(); + + vector fields; + from_reflection->ListFields(from, &fields); + for (int i = 0; i < fields.size(); i++) { + const FieldDescriptor* field = fields[i]; + + if (field->is_repeated()) { + int count = from_reflection->FieldSize(from, field); + for (int j = 0; j < count; j++) { + switch (field->cpp_type()) { +#define HANDLE_TYPE(CPPTYPE, METHOD) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + to_reflection->Add##METHOD(to, field, \ + from_reflection->GetRepeated##METHOD(from, field, j)); \ + break; + + HANDLE_TYPE(INT32 , Int32 ); + HANDLE_TYPE(INT64 , Int64 ); + HANDLE_TYPE(UINT32, UInt32); + HANDLE_TYPE(UINT64, UInt64); + HANDLE_TYPE(FLOAT , Float ); + HANDLE_TYPE(DOUBLE, Double); + HANDLE_TYPE(BOOL , Bool ); + HANDLE_TYPE(STRING, String); + HANDLE_TYPE(ENUM , Enum ); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_MESSAGE: + to_reflection->AddMessage(to, field)->MergeFrom( + from_reflection->GetRepeatedMessage(from, field, j)); + break; + } + } + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(CPPTYPE, METHOD) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + to_reflection->Set##METHOD(to, field, \ + from_reflection->Get##METHOD(from, field)); \ + break; + + HANDLE_TYPE(INT32 , Int32 ); + HANDLE_TYPE(INT64 , Int64 ); + HANDLE_TYPE(UINT32, UInt32); + HANDLE_TYPE(UINT64, UInt64); + HANDLE_TYPE(FLOAT , Float ); + HANDLE_TYPE(DOUBLE, Double); + HANDLE_TYPE(BOOL , Bool ); + HANDLE_TYPE(STRING, String); + HANDLE_TYPE(ENUM , Enum ); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_MESSAGE: + to_reflection->MutableMessage(to, field)->MergeFrom( + from_reflection->GetMessage(from, field)); + break; + } + } + } + + to_reflection->MutableUnknownFields(to)->MergeFrom( + from_reflection->GetUnknownFields(from)); +} + +void ReflectionOps::Clear(Message* message) { + const Reflection* reflection = message->GetReflection(); + + vector fields; + reflection->ListFields(*message, &fields); + for (int i = 0; i < fields.size(); i++) { + reflection->ClearField(message, fields[i]); + } + + reflection->MutableUnknownFields(message)->Clear(); +} + +bool ReflectionOps::IsInitialized(const Message& message) { + const Descriptor* descriptor = message.GetDescriptor(); + const Reflection* reflection = message.GetReflection(); + + // Check required fields of this message. + for (int i = 0; i < descriptor->field_count(); i++) { + if (descriptor->field(i)->is_required()) { + if (!reflection->HasField(message, descriptor->field(i))) { + return false; + } + } + } + + // Check that sub-messages are initialized. + vector fields; + reflection->ListFields(message, &fields); + for (int i = 0; i < fields.size(); i++) { + const FieldDescriptor* field = fields[i]; + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + + if (field->is_repeated()) { + int size = reflection->FieldSize(message, field); + + for (int j = 0; j < size; j++) { + if (!reflection->GetRepeatedMessage(message, field, j) + .IsInitialized()) { + return false; + } + } + } else { + if (!reflection->GetMessage(message, field).IsInitialized()) { + return false; + } + } + } + } + + return true; +} + +void ReflectionOps::DiscardUnknownFields(Message* message) { + const Reflection* reflection = message->GetReflection(); + + reflection->MutableUnknownFields(message)->Clear(); + + vector fields; + reflection->ListFields(*message, &fields); + for (int i = 0; i < fields.size(); i++) { + const FieldDescriptor* field = fields[i]; + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + if (field->is_repeated()) { + int size = reflection->FieldSize(*message, field); + for (int j = 0; j < size; j++) { + reflection->MutableRepeatedMessage(message, field, j) + ->DiscardUnknownFields(); + } + } else { + reflection->MutableMessage(message, field)->DiscardUnknownFields(); + } + } + } +} + +static string SubMessagePrefix(const string& prefix, + const FieldDescriptor* field, + int index) { + string result(prefix); + if (field->is_extension()) { + result.append("("); + result.append(field->full_name()); + result.append(")"); + } else { + result.append(field->name()); + } + if (index != -1) { + result.append("["); + result.append(SimpleItoa(index)); + result.append("]"); + } + result.append("."); + return result; +} + +void ReflectionOps::FindInitializationErrors( + const Message& message, + const string& prefix, + vector* errors) { + const Descriptor* descriptor = message.GetDescriptor(); + const Reflection* reflection = message.GetReflection(); + + // Check required fields of this message. + for (int i = 0; i < descriptor->field_count(); i++) { + if (descriptor->field(i)->is_required()) { + if (!reflection->HasField(message, descriptor->field(i))) { + errors->push_back(prefix + descriptor->field(i)->name()); + } + } + } + + // Check sub-messages. + vector fields; + reflection->ListFields(message, &fields); + for (int i = 0; i < fields.size(); i++) { + const FieldDescriptor* field = fields[i]; + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + + if (field->is_repeated()) { + int size = reflection->FieldSize(message, field); + + for (int j = 0; j < size; j++) { + const Message& sub_message = + reflection->GetRepeatedMessage(message, field, j); + FindInitializationErrors(sub_message, + SubMessagePrefix(prefix, field, j), + errors); + } + } else { + const Message& sub_message = reflection->GetMessage(message, field); + FindInitializationErrors(sub_message, + SubMessagePrefix(prefix, field, -1), + errors); + } + } + } +} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/reflection_ops.h b/toolkit/components/protobuf/src/google/protobuf/reflection_ops.h new file mode 100644 index 0000000000000..4775911e84a27 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/reflection_ops.h @@ -0,0 +1,81 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This header is logically internal, but is made public because it is used +// from protocol-compiler-generated code, which may reside in other components. + +#ifndef GOOGLE_PROTOBUF_REFLECTION_OPS_H__ +#define GOOGLE_PROTOBUF_REFLECTION_OPS_H__ + +#include +#include + +namespace google { +namespace protobuf { +namespace internal { + +// Basic operations that can be performed using reflection. +// These can be used as a cheap way to implement the corresponding +// methods of the Message interface, though they are likely to be +// slower than implementations tailored for the specific message type. +// +// This class should stay limited to operations needed to implement +// the Message interface. +// +// This class is really a namespace that contains only static methods. +class LIBPROTOBUF_EXPORT ReflectionOps { + public: + static void Copy(const Message& from, Message* to); + static void Merge(const Message& from, Message* to); + static void Clear(Message* message); + static bool IsInitialized(const Message& message); + static void DiscardUnknownFields(Message* message); + + // Finds all unset required fields in the message and adds their full + // paths (e.g. "foo.bar[5].baz") to *names. "prefix" will be attached to + // the front of each name. + static void FindInitializationErrors(const Message& message, + const string& prefix, + vector* errors); + + private: + // All methods are static. No need to construct. + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionOps); +}; + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_REFLECTION_OPS_H__ diff --git a/toolkit/components/protobuf/google/protobuf/repeated_field.cc b/toolkit/components/protobuf/src/google/protobuf/repeated_field.cc similarity index 79% rename from toolkit/components/protobuf/google/protobuf/repeated_field.cc rename to toolkit/components/protobuf/src/google/protobuf/repeated_field.cc index 09377742af597..b400732fe0298 100644 --- a/toolkit/components/protobuf/google/protobuf/repeated_field.cc +++ b/toolkit/components/protobuf/src/google/protobuf/repeated_field.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -46,42 +46,31 @@ void RepeatedPtrFieldBase::Reserve(int new_size) { if (total_size_ >= new_size) return; void** old_elements = elements_; - total_size_ = max(total_size_ * 2, new_size); + total_size_ = max(kMinRepeatedFieldAllocationSize, + max(total_size_ * 2, new_size)); elements_ = new void*[total_size_]; - memcpy(elements_, old_elements, allocated_size_ * sizeof(elements_[0])); - if (old_elements != initial_space_) { + if (old_elements != NULL) { + memcpy(elements_, old_elements, allocated_size_ * sizeof(elements_[0])); delete [] old_elements; } } void RepeatedPtrFieldBase::Swap(RepeatedPtrFieldBase* other) { + if (this == other) return; void** swap_elements = elements_; int swap_current_size = current_size_; int swap_allocated_size = allocated_size_; int swap_total_size = total_size_; - // We may not be using initial_space_ but it's not worth checking. Just - // copy it anyway. - void* swap_initial_space[kInitialSize]; - memcpy(swap_initial_space, initial_space_, sizeof(initial_space_)); elements_ = other->elements_; current_size_ = other->current_size_; allocated_size_ = other->allocated_size_; total_size_ = other->total_size_; - memcpy(initial_space_, other->initial_space_, sizeof(initial_space_)); other->elements_ = swap_elements; other->current_size_ = swap_current_size; other->allocated_size_ = swap_allocated_size; other->total_size_ = swap_total_size; - memcpy(other->initial_space_, swap_initial_space, sizeof(swap_initial_space)); - - if (elements_ == other->initial_space_) { - elements_ = initial_space_; - } - if (other->elements_ == initial_space_) { - other->elements_ = other->initial_space_; - } } string* StringTypeHandlerBase::New() { diff --git a/toolkit/components/protobuf/google/protobuf/repeated_field.h b/toolkit/components/protobuf/src/google/protobuf/repeated_field.h similarity index 74% rename from toolkit/components/protobuf/google/protobuf/repeated_field.h rename to toolkit/components/protobuf/src/google/protobuf/repeated_field.h index 6080ddccce320..50051831d69ff 100644 --- a/toolkit/components/protobuf/google/protobuf/repeated_field.h +++ b/toolkit/components/protobuf/src/google/protobuf/repeated_field.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -46,24 +46,55 @@ #ifndef GOOGLE_PROTOBUF_REPEATED_FIELD_H__ #define GOOGLE_PROTOBUF_REPEATED_FIELD_H__ +#ifdef _MSC_VER +// This is required for min/max on VS2013 only. +#include +#endif + #include #include #include +#include +#include #include namespace google { +namespace upb { +namespace google_opensource { +class GMR_Handlers; +} // namespace google_opensource +} // namespace upb + namespace protobuf { class Message; namespace internal { -// We need this (from generated_message_reflection.cc). -LIBPROTOBUF_EXPORT int StringSpaceUsedExcludingSelf(const string& str); +static const int kMinRepeatedFieldAllocationSize = 4; + +// A utility function for logging that doesn't need any template types. +void LogIndexOutOfBounds(int index, int size); + +template +inline int CalculateReserve(Iter begin, Iter end, std::forward_iterator_tag) { + return std::distance(begin, end); +} +template +inline int CalculateReserve(Iter begin, Iter end, std::input_iterator_tag) { + return -1; +} + +template +inline int CalculateReserve(Iter begin, Iter end) { + typedef typename std::iterator_traits::iterator_category Category; + return CalculateReserve(begin, end, Category()); +} } // namespace internal + // RepeatedField is used to represent repeated fields of a primitive type (in // other words, everything except strings and nested Messages). Most users will // not ever use a RepeatedField directly; they will use the get-by-index, @@ -73,10 +104,13 @@ class RepeatedField { public: RepeatedField(); RepeatedField(const RepeatedField& other); + template + RepeatedField(Iter begin, const Iter& end); ~RepeatedField(); RepeatedField& operator=(const RepeatedField& other); + bool empty() const; int size() const; const Element& Get(int index) const; @@ -85,12 +119,14 @@ class RepeatedField { void Add(const Element& value); Element* Add(); // Remove the last element in the array. - // We don't provide a way to remove any element other than the last - // because it invites inefficient use, such as O(n^2) filtering loops - // that should have been O(n). If you want to remove an element other - // than the last, the best way to do it is to re-arrange the elements - // so that the one you want removed is at the end, then call RemoveLast(). void RemoveLast(); + + // Extract elements with indices in "[start .. start+num-1]". + // Copy them into "elements[0 .. num-1]" if "elements" is not NULL. + // Caution: implementation also moves elements with indices [start+num ..]. + // Calling this routine inside a loop can cause quadratic behavior. + void ExtractSubrange(int start, int num, Element* elements); + void Clear(); void MergeFrom(const RepeatedField& other); void CopyFrom(const RepeatedField& other); @@ -106,6 +142,11 @@ class RepeatedField { Element* AddAlreadyReserved(); int Capacity() const; + // Like STL resize. Uses value to fill appended elements. + // Like Truncate() if new_size <= size(), otherwise this is + // O(new_size - size()). + void Resize(int new_size, const Element& value); + // Gets the underlying array. This pointer is possibly invalidated by // any add or remove operation. Element* mutable_data(); @@ -121,25 +162,45 @@ class RepeatedField { typedef Element* iterator; typedef const Element* const_iterator; typedef Element value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef int size_type; + typedef ptrdiff_t difference_type; iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; + // Reverse iterator support + typedef std::reverse_iterator const_reverse_iterator; + typedef std::reverse_iterator reverse_iterator; + reverse_iterator rbegin() { + return reverse_iterator(end()); + } + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + reverse_iterator rend() { + return reverse_iterator(begin()); + } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + // Returns the number of bytes used by the repeated field, excluding // sizeof(*this) int SpaceUsedExcludingSelf() const; private: - static const int kInitialSize = 4; + static const int kInitialSize = 0; Element* elements_; int current_size_; int total_size_; - Element initial_space_[kInitialSize]; - // Move the contents of |from| into |to|, possibly clobbering |from| in the // process. For primitive types this is just a memcpy(), but it could be // specialized for non-primitive types to, say, swap each element instead. @@ -151,7 +212,21 @@ class RepeatedField { namespace internal { template class RepeatedPtrIterator; -template class RepeatedPtrOverPtrsIterator; +template class RepeatedPtrOverPtrsIterator; +} // namespace internal + +namespace internal { + +// This is a helper template to copy an array of elements effeciently when they +// have a trivial copy constructor, and correctly otherwise. This really +// shouldn't be necessary, but our compiler doesn't optimize std::copy very +// effectively. +template ::value> +struct ElementCopier { + void operator()(Element to[], const Element from[], int array_size); +}; + } // namespace internal namespace internal { @@ -186,12 +261,17 @@ class LIBPROTOBUF_EXPORT RepeatedPtrFieldBase { // use of AddFromCleared(), which is not part of the public interface. friend class ExtensionSet; + // To parse directly into a proto2 generated class, the upb class GMR_Handlers + // needs to be able to modify a RepeatedPtrFieldBase directly. + friend class LIBPROTOBUF_EXPORT upb::google_opensource::GMR_Handlers; + RepeatedPtrFieldBase(); // Must be called from destructor. template void Destroy(); + bool empty() const; int size() const; template @@ -209,6 +289,14 @@ class LIBPROTOBUF_EXPORT RepeatedPtrFieldBase { template void CopyFrom(const RepeatedPtrFieldBase& other); + void CloseGap(int start, int num) { + // Close up a gap of "num" elements starting at offset "start". + for (int i = start + num; i < allocated_size_; ++i) + elements_[i - num] = elements_[i]; + current_size_ -= num; + allocated_size_ -= num; + } + void Reserve(int new_size); int Capacity() const; @@ -248,17 +336,13 @@ class LIBPROTOBUF_EXPORT RepeatedPtrFieldBase { typename TypeHandler::Type* ReleaseCleared(); private: - GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPtrFieldBase); - - static const int kInitialSize = 4; + static const int kInitialSize = 0; void** elements_; int current_size_; int allocated_size_; int total_size_; - void* initial_space_[kInitialSize]; - template static inline typename TypeHandler::Type* cast(void* element) { return reinterpret_cast(element); @@ -267,6 +351,8 @@ class LIBPROTOBUF_EXPORT RepeatedPtrFieldBase { static inline const typename TypeHandler::Type* cast(const void* element) { return reinterpret_cast(element); } + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPtrFieldBase); }; template @@ -280,6 +366,7 @@ class GenericTypeHandler { to->MergeFrom(from); } static int SpaceUsed(const GenericType& value) { return value.SpaceUsed(); } + static const Type& default_instance() { return Type::default_instance(); } }; template <> @@ -288,6 +375,25 @@ inline void GenericTypeHandler::Merge( to->CheckTypeAndMergeFrom(from); } +template <> +inline const MessageLite& GenericTypeHandler::default_instance() { + // Yes, the behavior of the code is undefined, but this function is only + // called when we're already deep into the world of undefined, because the + // caller called Get(index) out of bounds. + MessageLite* null = NULL; + return *null; +} + +template <> +inline const Message& GenericTypeHandler::default_instance() { + // Yes, the behavior of the code is undefined, but this function is only + // called when we're already deep into the world of undefined, because the + // caller called Get(index) out of bounds. + Message* null = NULL; + return *null; +} + + // HACK: If a class is declared as DLL-exported in MSVC, it insists on // generating copies of all its methods -- even inline ones -- to include // in the DLL. But SpaceUsed() calls StringSpaceUsedExcludingSelf() which @@ -303,9 +409,12 @@ class LIBPROTOBUF_EXPORT StringTypeHandlerBase { static void Delete(string* value); static void Clear(string* value) { value->clear(); } static void Merge(const string& from, string* to) { *to = from; } + static const Type& default_instance() { + return ::google::protobuf::internal::GetEmptyString(); + } }; -class LIBPROTOBUF_EXPORT StringTypeHandler : public StringTypeHandlerBase { +class StringTypeHandler : public StringTypeHandlerBase { public: static int SpaceUsed(const string& value) { return sizeof(value) + StringSpaceUsedExcludingSelf(value); @@ -322,16 +431,28 @@ class RepeatedPtrField : public internal::RepeatedPtrFieldBase { public: RepeatedPtrField(); RepeatedPtrField(const RepeatedPtrField& other); + template + RepeatedPtrField(Iter begin, const Iter& end); ~RepeatedPtrField(); RepeatedPtrField& operator=(const RepeatedPtrField& other); + bool empty() const; int size() const; const Element& Get(int index) const; Element* Mutable(int index); Element* Add(); - void RemoveLast(); // Remove the last element in the array. + + // Remove the last element in the array. + // Ownership of the element is retained by the array. + void RemoveLast(); + + // Delete elements with indices in the range [start .. start+num-1]. + // Caution: implementation moves all elements with indices [start+num .. ]. + // Calling this routine inside a loop can cause quadratic behavior. + void DeleteSubrange(int start, int num); + void Clear(); void MergeFrom(const RepeatedPtrField& other); void CopyFrom(const RepeatedPtrField& other); @@ -358,42 +479,78 @@ class RepeatedPtrField : public internal::RepeatedPtrFieldBase { typedef internal::RepeatedPtrIterator iterator; typedef internal::RepeatedPtrIterator const_iterator; typedef Element value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef int size_type; + typedef ptrdiff_t difference_type; iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; + // Reverse iterator support + typedef std::reverse_iterator const_reverse_iterator; + typedef std::reverse_iterator reverse_iterator; + reverse_iterator rbegin() { + return reverse_iterator(end()); + } + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + reverse_iterator rend() { + return reverse_iterator(begin()); + } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + // Custom STL-like iterator that iterates over and returns the underlying // pointers to Element rather than Element itself. - typedef internal::RepeatedPtrOverPtrsIterator pointer_iterator; + typedef internal::RepeatedPtrOverPtrsIterator + pointer_iterator; + typedef internal::RepeatedPtrOverPtrsIterator + const_pointer_iterator; pointer_iterator pointer_begin(); + const_pointer_iterator pointer_begin() const; pointer_iterator pointer_end(); + const_pointer_iterator pointer_end() const; // Returns (an estimate of) the number of bytes used by the repeated field, // excluding sizeof(*this). int SpaceUsedExcludingSelf() const; // Advanced memory management -------------------------------------- - // When hardcore memory management becomes necessary -- as it often + // When hardcore memory management becomes necessary -- as it sometimes // does here at Google -- the following methods may be useful. // Add an already-allocated object, passing ownership to the // RepeatedPtrField. void AddAllocated(Element* value); - // Remove the last element and return it, passing ownership to the - // caller. + // Remove the last element and return it, passing ownership to the caller. // Requires: size() > 0 Element* ReleaseLast(); + // Extract elements with indices in the range "[start .. start+num-1]". + // The caller assumes ownership of the extracted elements and is responsible + // for deleting them when they are no longer needed. + // If "elements" is non-NULL, then pointers to the extracted elements + // are stored in "elements[0 .. num-1]" for the convenience of the caller. + // If "elements" is NULL, then the caller must use some other mechanism + // to perform any further operations (like deletion) on these elements. + // Caution: implementation also moves elements with indices [start+num ..]. + // Calling this routine inside a loop can cause quadratic behavior. + void ExtractSubrange(int start, int num, Element** elements); + // When elements are removed by calls to RemoveLast() or Clear(), they // are not actually freed. Instead, they are cleared and kept so that // they can be reused later. This can save lots of CPU time when // repeatedly reusing a protocol message for similar purposes. // - // Really, extremely hardcore programs may actually want to manipulate - // these objects to better-optimize memory management. These methods - // allow that. + // Hardcore programs may choose to manipulate these cleared objects + // to better optimize memory management using the following routines. // Get the number of cleared objects that are currently being kept // around for reuse. @@ -420,33 +577,56 @@ class RepeatedPtrField : public internal::RepeatedPtrFieldBase { template inline RepeatedField::RepeatedField() - : elements_(initial_space_), + : elements_(NULL), current_size_(0), total_size_(kInitialSize) { } template inline RepeatedField::RepeatedField(const RepeatedField& other) - : elements_(initial_space_), + : elements_(NULL), current_size_(0), total_size_(kInitialSize) { CopyFrom(other); } template -RepeatedField::~RepeatedField() { - if (elements_ != initial_space_) { - delete [] elements_; +template +inline RepeatedField::RepeatedField(Iter begin, const Iter& end) + : elements_(NULL), + current_size_(0), + total_size_(kInitialSize) { + int reserve = internal::CalculateReserve(begin, end); + if (reserve != -1) { + Reserve(reserve); + for (; begin != end; ++begin) { + AddAlreadyReserved(*begin); + } + } else { + for (; begin != end; ++begin) { + Add(*begin); + } } } +template +RepeatedField::~RepeatedField() { + delete [] elements_; +} + template inline RepeatedField& RepeatedField::operator=(const RepeatedField& other) { - CopyFrom(other); + if (this != &other) + CopyFrom(other); return *this; } +template +inline bool RepeatedField::empty() const { + return current_size_ == 0; +} + template inline int RepeatedField::size() const { return current_size_; @@ -469,20 +649,33 @@ inline Element* RepeatedField::AddAlreadyReserved() { return &elements_[current_size_++]; } +template +inline void RepeatedField::Resize(int new_size, const Element& value) { + GOOGLE_DCHECK_GE(new_size, 0); + if (new_size > size()) { + Reserve(new_size); + std::fill(&elements_[current_size_], &elements_[new_size], value); + } + current_size_ = new_size; +} + template inline const Element& RepeatedField::Get(int index) const { + GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, size()); return elements_[index]; } template inline Element* RepeatedField::Mutable(int index) { + GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, size()); return elements_ + index; } template inline void RepeatedField::Set(int index, const Element& value) { + GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, size()); elements_[index] = value; } @@ -505,6 +698,27 @@ inline void RepeatedField::RemoveLast() { --current_size_; } +template +void RepeatedField::ExtractSubrange( + int start, int num, Element* elements) { + GOOGLE_DCHECK_GE(start, 0); + GOOGLE_DCHECK_GE(num, 0); + GOOGLE_DCHECK_LE(start + num, this->size()); + + // Save the values of the removed elements if requested. + if (elements != NULL) { + for (int i = 0; i < num; ++i) + elements[i] = this->Get(i + start); + } + + // Slide remaining elements down to fill the gap. + if (num > 0) { + for (int i = start + num; i < this->size(); ++i) + this->Set(i - num, this->Get(i)); + this->Truncate(this->size() - num); + } +} + template inline void RepeatedField::Clear() { current_size_ = 0; @@ -512,13 +726,17 @@ inline void RepeatedField::Clear() { template inline void RepeatedField::MergeFrom(const RepeatedField& other) { - Reserve(current_size_ + other.current_size_); - CopyArray(elements_ + current_size_, other.elements_, other.current_size_); - current_size_ += other.current_size_; + GOOGLE_CHECK_NE(&other, this); + if (other.current_size_ != 0) { + Reserve(current_size_ + other.current_size_); + CopyArray(elements_ + current_size_, other.elements_, other.current_size_); + current_size_ += other.current_size_; + } } template inline void RepeatedField::CopyFrom(const RepeatedField& other) { + if (&other == this) return; Clear(); MergeFrom(other); } @@ -536,35 +754,24 @@ inline const Element* RepeatedField::data() const { template void RepeatedField::Swap(RepeatedField* other) { + if (this == other) return; Element* swap_elements = elements_; int swap_current_size = current_size_; int swap_total_size = total_size_; - // We may not be using initial_space_ but it's not worth checking. Just - // copy it anyway. - Element swap_initial_space[kInitialSize]; - MoveArray(swap_initial_space, initial_space_, kInitialSize); elements_ = other->elements_; current_size_ = other->current_size_; total_size_ = other->total_size_; - MoveArray(initial_space_, other->initial_space_, kInitialSize); other->elements_ = swap_elements; other->current_size_ = swap_current_size; other->total_size_ = swap_total_size; - MoveArray(other->initial_space_, swap_initial_space, kInitialSize); - - if (elements_ == other->initial_space_) { - elements_ = initial_space_; - } - if (other->elements_ == initial_space_) { - other->elements_ = other->initial_space_; - } } template void RepeatedField::SwapElements(int index1, int index2) { - std::swap(elements_[index1], elements_[index2]); + using std::swap; // enable ADL with fallback + swap(elements_[index1], elements_[index2]); } template @@ -590,20 +797,21 @@ RepeatedField::end() const { template inline int RepeatedField::SpaceUsedExcludingSelf() const { - return (elements_ != initial_space_) ? total_size_ * sizeof(elements_[0]) : 0; + return (elements_ != NULL) ? total_size_ * sizeof(elements_[0]) : 0; } -// Avoid inlining of Reserve(): new, memcpy, and delete[] lead to a significant +// Avoid inlining of Reserve(): new, copy, and delete[] lead to a significant // amount of code bloat. template void RepeatedField::Reserve(int new_size) { if (total_size_ >= new_size) return; Element* old_elements = elements_; - total_size_ = max(total_size_ * 2, new_size); + total_size_ = max(google::protobuf::internal::kMinRepeatedFieldAllocationSize, + max(total_size_ * 2, new_size)); elements_ = new Element[total_size_]; - MoveArray(elements_, old_elements, current_size_); - if (old_elements != initial_space_) { + if (old_elements != NULL) { + MoveArray(elements_, old_elements, current_size_); delete [] old_elements; } } @@ -617,22 +825,39 @@ inline void RepeatedField::Truncate(int new_size) { template inline void RepeatedField::MoveArray( Element to[], Element from[], int array_size) { - memcpy(to, from, array_size * sizeof(Element)); + CopyArray(to, from, array_size); } template inline void RepeatedField::CopyArray( Element to[], const Element from[], int array_size) { - memcpy(to, from, array_size * sizeof(Element)); + internal::ElementCopier()(to, from, array_size); +} + +namespace internal { + +template +void ElementCopier::operator()( + Element to[], const Element from[], int array_size) { + std::copy(from, from + array_size, to); } +template +struct ElementCopier { + void operator()(Element to[], const Element from[], int array_size) { + memcpy(to, from, array_size * sizeof(Element)); + } +}; + +} // namespace internal + // ------------------------------------------------------------------- namespace internal { inline RepeatedPtrFieldBase::RepeatedPtrFieldBase() - : elements_(initial_space_), + : elements_(NULL), current_size_(0), allocated_size_(0), total_size_(kInitialSize) { @@ -643,26 +868,30 @@ void RepeatedPtrFieldBase::Destroy() { for (int i = 0; i < allocated_size_; i++) { TypeHandler::Delete(cast(elements_[i])); } - if (elements_ != initial_space_) { - delete [] elements_; - } + delete [] elements_; +} + +inline bool RepeatedPtrFieldBase::empty() const { + return current_size_ == 0; } inline int RepeatedPtrFieldBase::size() const { return current_size_; } - template inline const typename TypeHandler::Type& RepeatedPtrFieldBase::Get(int index) const { + GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, size()); return *cast(elements_[index]); } + template inline typename TypeHandler::Type* RepeatedPtrFieldBase::Mutable(int index) { + GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, size()); return cast(elements_[index]); } @@ -673,8 +902,8 @@ inline typename TypeHandler::Type* RepeatedPtrFieldBase::Add() { return cast(elements_[current_size_++]); } if (allocated_size_ == total_size_) Reserve(total_size_ + 1); - ++allocated_size_; typename TypeHandler::Type* result = TypeHandler::New(); + ++allocated_size_; elements_[current_size_++] = result; return result; } @@ -695,6 +924,7 @@ void RepeatedPtrFieldBase::Clear() { template inline void RepeatedPtrFieldBase::MergeFrom(const RepeatedPtrFieldBase& other) { + GOOGLE_CHECK_NE(&other, this); Reserve(current_size_ + other.current_size_); for (int i = 0; i < other.current_size_; i++) { TypeHandler::Merge(other.template Get(i), Add()); @@ -703,6 +933,7 @@ inline void RepeatedPtrFieldBase::MergeFrom(const RepeatedPtrFieldBase& other) { template inline void RepeatedPtrFieldBase::CopyFrom(const RepeatedPtrFieldBase& other) { + if (&other == this) return; RepeatedPtrFieldBase::Clear(); RepeatedPtrFieldBase::MergeFrom(other); } @@ -735,13 +966,14 @@ RepeatedPtrFieldBase::data() const { } inline void RepeatedPtrFieldBase::SwapElements(int index1, int index2) { - std::swap(elements_[index1], elements_[index2]); + using std::swap; // enable ADL with fallback + swap(elements_[index1], elements_[index2]); } template inline int RepeatedPtrFieldBase::SpaceUsedExcludingSelf() const { int allocated_bytes = - (elements_ != initial_space_) ? total_size_ * sizeof(elements_[0]) : 0; + (elements_ != NULL) ? total_size_ * sizeof(elements_[0]) : 0; for (int i = 0; i < allocated_size_; ++i) { allocated_bytes += TypeHandler::SpaceUsed(*cast(elements_[i])); } @@ -798,7 +1030,6 @@ inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseLast() { return result; } - inline int RepeatedPtrFieldBase::ClearedCount() const { return allocated_size_ - current_size_; } @@ -822,11 +1053,13 @@ inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseCleared() { template class RepeatedPtrField::TypeHandler - : public internal::GenericTypeHandler {}; + : public internal::GenericTypeHandler { +}; template <> class RepeatedPtrField::TypeHandler - : public internal::StringTypeHandler {}; + : public internal::StringTypeHandler { +}; template @@ -834,10 +1067,24 @@ inline RepeatedPtrField::RepeatedPtrField() {} template inline RepeatedPtrField::RepeatedPtrField( - const RepeatedPtrField& other) { + const RepeatedPtrField& other) + : RepeatedPtrFieldBase() { CopyFrom(other); } +template +template +inline RepeatedPtrField::RepeatedPtrField( + Iter begin, const Iter& end) { + int reserve = internal::CalculateReserve(begin, end); + if (reserve != -1) { + Reserve(reserve); + } + for (; begin != end; ++begin) { + *Add() = *begin; + } +} + template RepeatedPtrField::~RepeatedPtrField() { Destroy(); @@ -846,10 +1093,16 @@ RepeatedPtrField::~RepeatedPtrField() { template inline RepeatedPtrField& RepeatedPtrField::operator=( const RepeatedPtrField& other) { - CopyFrom(other); + if (this != &other) + CopyFrom(other); return *this; } +template +inline bool RepeatedPtrField::empty() const { + return RepeatedPtrFieldBase::empty(); +} + template inline int RepeatedPtrField::size() const { return RepeatedPtrFieldBase::size(); @@ -860,6 +1113,7 @@ inline const Element& RepeatedPtrField::Get(int index) const { return RepeatedPtrFieldBase::Get(index); } + template inline Element* RepeatedPtrField::Mutable(int index) { return RepeatedPtrFieldBase::Mutable(index); @@ -875,6 +1129,33 @@ inline void RepeatedPtrField::RemoveLast() { RepeatedPtrFieldBase::RemoveLast(); } +template +inline void RepeatedPtrField::DeleteSubrange(int start, int num) { + GOOGLE_DCHECK_GE(start, 0); + GOOGLE_DCHECK_GE(num, 0); + GOOGLE_DCHECK_LE(start + num, size()); + for (int i = 0; i < num; ++i) + delete RepeatedPtrFieldBase::Mutable(start + i); + ExtractSubrange(start, num, NULL); +} + +template +inline void RepeatedPtrField::ExtractSubrange( + int start, int num, Element** elements) { + GOOGLE_DCHECK_GE(start, 0); + GOOGLE_DCHECK_GE(num, 0); + GOOGLE_DCHECK_LE(start + num, size()); + + if (num > 0) { + // Save the values of the removed elements if requested. + if (elements != NULL) { + for (int i = 0; i < num; ++i) + elements[i] = RepeatedPtrFieldBase::Mutable(i + start); + } + CloseGap(start, num); + } +} + template inline void RepeatedPtrField::Clear() { RepeatedPtrFieldBase::Clear(); @@ -961,7 +1242,7 @@ namespace internal { // refer to this class directly; use RepeatedPtrField::iterator instead. // // The iterator for RepeatedPtrField, RepeatedPtrIterator, is -// very similar to iterator_ptr in util/gtl/iterator_adaptors-inl.h, +// very similar to iterator_ptr in util/gtl/iterator_adaptors.h, // but adds random-access operators and is modified to wrap a void** base // iterator (since RepeatedPtrField stores its array as a void* array and // casting void** to T** would violate C++ aliasing rules). @@ -977,6 +1258,10 @@ class RepeatedPtrIterator typedef std::iterator< std::random_access_iterator_tag, Element> superclass; + // Shadow the value_type in std::iterator<> because const_iterator::value_type + // needs to be T, not const T. + typedef typename remove_const::type value_type; + // Let the compiler know that these are type names, so we don't have to // write "typename" in front of them everywhere. typedef typename superclass::reference reference; @@ -1057,14 +1342,21 @@ class RepeatedPtrIterator // rather than the objects themselves as RepeatedPtrIterator does. // Consider using this when working with stl algorithms that change // the array. -template +// The VoidPtr template parameter holds the type-agnostic pointer value +// referenced by the iterator. It should either be "void *" for a mutable +// iterator, or "const void *" for a constant iterator. +template class RepeatedPtrOverPtrsIterator : public std::iterator { public: - typedef RepeatedPtrOverPtrsIterator iterator; + typedef RepeatedPtrOverPtrsIterator iterator; typedef std::iterator< std::random_access_iterator_tag, Element*> superclass; + // Shadow the value_type in std::iterator<> because const_iterator::value_type + // needs to be T, not const T. + typedef typename remove_const::type value_type; + // Let the compiler know that these are type names, so we don't have to // write "typename" in front of them everywhere. typedef typename superclass::reference reference; @@ -1072,7 +1364,7 @@ class RepeatedPtrOverPtrsIterator typedef typename superclass::difference_type difference_type; RepeatedPtrOverPtrsIterator() : it_(NULL) {} - explicit RepeatedPtrOverPtrsIterator(void** it) : it_(it) {} + explicit RepeatedPtrOverPtrsIterator(VoidPtr* it) : it_(it) {} // dereferenceable reference operator*() const { return *reinterpret_cast(it_); } @@ -1127,10 +1419,9 @@ class RepeatedPtrOverPtrsIterator friend class RepeatedPtrIterator; // The internal iterator. - void** it_; + VoidPtr* it_; }; - } // namespace internal template @@ -1160,10 +1451,21 @@ RepeatedPtrField::pointer_begin() { return pointer_iterator(raw_mutable_data()); } template +inline typename RepeatedPtrField::const_pointer_iterator +RepeatedPtrField::pointer_begin() const { + return const_pointer_iterator(const_cast(raw_mutable_data())); +} +template inline typename RepeatedPtrField::pointer_iterator RepeatedPtrField::pointer_end() { return pointer_iterator(raw_mutable_data() + size()); } +template +inline typename RepeatedPtrField::const_pointer_iterator +RepeatedPtrField::pointer_end() const { + return const_pointer_iterator( + const_cast(raw_mutable_data() + size())); +} // Iterators and helper functions that follow the spirit of the STL @@ -1173,7 +1475,7 @@ RepeatedPtrField::pointer_end() { // std::copy(some_sequence.begin(), some_sequence.end(), // google::protobuf::RepeatedFieldBackInserter(proto.mutable_sequence())); // -// Ported by johannes from util/gtl/proto-array-iterators-inl.h +// Ported by johannes from util/gtl/proto-array-iterators.h namespace internal { // A back inserter for RepeatedField objects. @@ -1194,7 +1496,7 @@ template class RepeatedFieldBackInsertIterator RepeatedFieldBackInsertIterator& operator++() { return *this; } - RepeatedFieldBackInsertIterator& operator++(int ignores_parameter) { + RepeatedFieldBackInsertIterator& operator++(int /* unused */) { return *this; } @@ -1225,7 +1527,7 @@ template class RepeatedPtrFieldBackInsertIterator RepeatedPtrFieldBackInsertIterator& operator++() { return *this; } - RepeatedPtrFieldBackInsertIterator& operator++(int ignores_parameter) { + RepeatedPtrFieldBackInsertIterator& operator++(int /* unused */) { return *this; } @@ -1254,7 +1556,7 @@ template class AllocatedRepeatedPtrFieldBackInsertIterator return *this; } AllocatedRepeatedPtrFieldBackInsertIterator& operator++( - int ignores_parameter) { + int /* unused */) { return *this; } @@ -1264,16 +1566,22 @@ template class AllocatedRepeatedPtrFieldBackInsertIterator } // namespace internal // Provides a back insert iterator for RepeatedField instances, -// similar to std::back_inserter(). Note the identically named -// function for RepeatedPtrField instances. +// similar to std::back_inserter(). template internal::RepeatedFieldBackInsertIterator RepeatedFieldBackInserter(RepeatedField* const mutable_field) { return internal::RepeatedFieldBackInsertIterator(mutable_field); } // Provides a back insert iterator for RepeatedPtrField instances, -// similar to std::back_inserter(). Note the identically named -// function for RepeatedField instances. +// similar to std::back_inserter(). +template internal::RepeatedPtrFieldBackInsertIterator +RepeatedPtrFieldBackInserter(RepeatedPtrField* const mutable_field) { + return internal::RepeatedPtrFieldBackInsertIterator(mutable_field); +} + +// Special back insert iterator for RepeatedPtrField instances, just in +// case someone wants to write generic template code that can access both +// RepeatedFields and RepeatedPtrFields using a common name. template internal::RepeatedPtrFieldBackInsertIterator RepeatedFieldBackInserter(RepeatedPtrField* const mutable_field) { return internal::RepeatedPtrFieldBackInsertIterator(mutable_field); diff --git a/toolkit/components/protobuf/google/protobuf/generated_message_util.h b/toolkit/components/protobuf/src/google/protobuf/service.cc similarity index 60% rename from toolkit/components/protobuf/google/protobuf/generated_message_util.h rename to toolkit/components/protobuf/src/google/protobuf/service.cc index 1a2343d440838..ffa919daa7e6e 100644 --- a/toolkit/components/protobuf/google/protobuf/generated_message_util.h +++ b/toolkit/components/protobuf/src/google/protobuf/service.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -31,52 +31,16 @@ // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. -// -// This file contains miscellaneous helper code used by generated code -- -// including lite types -- but which should not be used directly by users. - -#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ -#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ - -#include - -#include +#include namespace google { namespace protobuf { - namespace io { - class CodedInputStream; // coded_stream.h - } -} - -namespace protobuf { -namespace internal { - -// Annotation for the compiler to emit a deprecation message if a field marked -// with option 'deprecated=true' is used in the code, or for other things in -// generated code which are deprecated. -// -// For internal use in the pb.cc files, deprecation warnings are suppressed -// there. -#undef DEPRECATED_PROTOBUF_FIELD -#if !defined(INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION) -# define PROTOBUF_DEPRECATED GOOGLE_ATTRIBUTE_DEPRECATED -#else -# define PROTOBUF_DEPRECATED -#endif - - -// Constants for special floating point values. -double Infinity(); -double NaN(); - -// Constant used for empty default strings. -extern const ::std::string kEmptyString; +Service::~Service() {} +RpcChannel::~RpcChannel() {} +RpcController::~RpcController() {} -} // namespace internal } // namespace protobuf } // namespace google -#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/service.h b/toolkit/components/protobuf/src/google/protobuf/service.h new file mode 100644 index 0000000000000..cc0b45d410790 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/service.h @@ -0,0 +1,291 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// DEPRECATED: This module declares the abstract interfaces underlying proto2 +// RPC services. These are intented to be independent of any particular RPC +// implementation, so that proto2 services can be used on top of a variety +// of implementations. Starting with version 2.3.0, RPC implementations should +// not try to build on these, but should instead provide code generator plugins +// which generate code specific to the particular RPC implementation. This way +// the generated code can be more appropriate for the implementation in use +// and can avoid unnecessary layers of indirection. +// +// +// When you use the protocol compiler to compile a service definition, it +// generates two classes: An abstract interface for the service (with +// methods matching the service definition) and a "stub" implementation. +// A stub is just a type-safe wrapper around an RpcChannel which emulates a +// local implementation of the service. +// +// For example, the service definition: +// service MyService { +// rpc Foo(MyRequest) returns(MyResponse); +// } +// will generate abstract interface "MyService" and class "MyService::Stub". +// You could implement a MyService as follows: +// class MyServiceImpl : public MyService { +// public: +// MyServiceImpl() {} +// ~MyServiceImpl() {} +// +// // implements MyService --------------------------------------- +// +// void Foo(google::protobuf::RpcController* controller, +// const MyRequest* request, +// MyResponse* response, +// Closure* done) { +// // ... read request and fill in response ... +// done->Run(); +// } +// }; +// You would then register an instance of MyServiceImpl with your RPC server +// implementation. (How to do that depends on the implementation.) +// +// To call a remote MyServiceImpl, first you need an RpcChannel connected to it. +// How to construct a channel depends, again, on your RPC implementation. +// Here we use a hypothentical "MyRpcChannel" as an example: +// MyRpcChannel channel("rpc:hostname:1234/myservice"); +// MyRpcController controller; +// MyServiceImpl::Stub stub(&channel); +// FooRequest request; +// FooRespnose response; +// +// // ... fill in request ... +// +// stub.Foo(&controller, request, &response, NewCallback(HandleResponse)); +// +// On Thread-Safety: +// +// Different RPC implementations may make different guarantees about what +// threads they may run callbacks on, and what threads the application is +// allowed to use to call the RPC system. Portable software should be ready +// for callbacks to be called on any thread, but should not try to call the +// RPC system from any thread except for the ones on which it received the +// callbacks. Realistically, though, simple software will probably want to +// use a single-threaded RPC system while high-end software will want to +// use multiple threads. RPC implementations should provide multiple +// choices. + +#ifndef GOOGLE_PROTOBUF_SERVICE_H__ +#define GOOGLE_PROTOBUF_SERVICE_H__ + +#include +#include + +namespace google { +namespace protobuf { + +// Defined in this file. +class Service; +class RpcController; +class RpcChannel; + +// Defined in other files. +class Descriptor; // descriptor.h +class ServiceDescriptor; // descriptor.h +class MethodDescriptor; // descriptor.h +class Message; // message.h + +// Abstract base interface for protocol-buffer-based RPC services. Services +// themselves are abstract interfaces (implemented either by servers or as +// stubs), but they subclass this base interface. The methods of this +// interface can be used to call the methods of the Service without knowing +// its exact type at compile time (analogous to Reflection). +class LIBPROTOBUF_EXPORT Service { + public: + inline Service() {} + virtual ~Service(); + + // When constructing a stub, you may pass STUB_OWNS_CHANNEL as the second + // parameter to the constructor to tell it to delete its RpcChannel when + // destroyed. + enum ChannelOwnership { + STUB_OWNS_CHANNEL, + STUB_DOESNT_OWN_CHANNEL + }; + + // Get the ServiceDescriptor describing this service and its methods. + virtual const ServiceDescriptor* GetDescriptor() = 0; + + // Call a method of the service specified by MethodDescriptor. This is + // normally implemented as a simple switch() that calls the standard + // definitions of the service's methods. + // + // Preconditions: + // * method->service() == GetDescriptor() + // * request and response are of the exact same classes as the objects + // returned by GetRequestPrototype(method) and + // GetResponsePrototype(method). + // * After the call has started, the request must not be modified and the + // response must not be accessed at all until "done" is called. + // * "controller" is of the correct type for the RPC implementation being + // used by this Service. For stubs, the "correct type" depends on the + // RpcChannel which the stub is using. Server-side Service + // implementations are expected to accept whatever type of RpcController + // the server-side RPC implementation uses. + // + // Postconditions: + // * "done" will be called when the method is complete. This may be + // before CallMethod() returns or it may be at some point in the future. + // * If the RPC succeeded, "response" contains the response returned by + // the server. + // * If the RPC failed, "response"'s contents are undefined. The + // RpcController can be queried to determine if an error occurred and + // possibly to get more information about the error. + virtual void CallMethod(const MethodDescriptor* method, + RpcController* controller, + const Message* request, + Message* response, + Closure* done) = 0; + + // CallMethod() requires that the request and response passed in are of a + // particular subclass of Message. GetRequestPrototype() and + // GetResponsePrototype() get the default instances of these required types. + // You can then call Message::New() on these instances to construct mutable + // objects which you can then pass to CallMethod(). + // + // Example: + // const MethodDescriptor* method = + // service->GetDescriptor()->FindMethodByName("Foo"); + // Message* request = stub->GetRequestPrototype (method)->New(); + // Message* response = stub->GetResponsePrototype(method)->New(); + // request->ParseFromString(input); + // service->CallMethod(method, *request, response, callback); + virtual const Message& GetRequestPrototype( + const MethodDescriptor* method) const = 0; + virtual const Message& GetResponsePrototype( + const MethodDescriptor* method) const = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Service); +}; + +// An RpcController mediates a single method call. The primary purpose of +// the controller is to provide a way to manipulate settings specific to the +// RPC implementation and to find out about RPC-level errors. +// +// The methods provided by the RpcController interface are intended to be a +// "least common denominator" set of features which we expect all +// implementations to support. Specific implementations may provide more +// advanced features (e.g. deadline propagation). +class LIBPROTOBUF_EXPORT RpcController { + public: + inline RpcController() {} + virtual ~RpcController(); + + // Client-side methods --------------------------------------------- + // These calls may be made from the client side only. Their results + // are undefined on the server side (may crash). + + // Resets the RpcController to its initial state so that it may be reused in + // a new call. Must not be called while an RPC is in progress. + virtual void Reset() = 0; + + // After a call has finished, returns true if the call failed. The possible + // reasons for failure depend on the RPC implementation. Failed() must not + // be called before a call has finished. If Failed() returns true, the + // contents of the response message are undefined. + virtual bool Failed() const = 0; + + // If Failed() is true, returns a human-readable description of the error. + virtual string ErrorText() const = 0; + + // Advises the RPC system that the caller desires that the RPC call be + // canceled. The RPC system may cancel it immediately, may wait awhile and + // then cancel it, or may not even cancel the call at all. If the call is + // canceled, the "done" callback will still be called and the RpcController + // will indicate that the call failed at that time. + virtual void StartCancel() = 0; + + // Server-side methods --------------------------------------------- + // These calls may be made from the server side only. Their results + // are undefined on the client side (may crash). + + // Causes Failed() to return true on the client side. "reason" will be + // incorporated into the message returned by ErrorText(). If you find + // you need to return machine-readable information about failures, you + // should incorporate it into your response protocol buffer and should + // NOT call SetFailed(). + virtual void SetFailed(const string& reason) = 0; + + // If true, indicates that the client canceled the RPC, so the server may + // as well give up on replying to it. The server should still call the + // final "done" callback. + virtual bool IsCanceled() const = 0; + + // Asks that the given callback be called when the RPC is canceled. The + // callback will always be called exactly once. If the RPC completes without + // being canceled, the callback will be called after completion. If the RPC + // has already been canceled when NotifyOnCancel() is called, the callback + // will be called immediately. + // + // NotifyOnCancel() must be called no more than once per request. + virtual void NotifyOnCancel(Closure* callback) = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcController); +}; + +// Abstract interface for an RPC channel. An RpcChannel represents a +// communication line to a Service which can be used to call that Service's +// methods. The Service may be running on another machine. Normally, you +// should not call an RpcChannel directly, but instead construct a stub Service +// wrapping it. Example: +// RpcChannel* channel = new MyRpcChannel("remotehost.example.com:1234"); +// MyService* service = new MyService::Stub(channel); +// service->MyMethod(request, &response, callback); +class LIBPROTOBUF_EXPORT RpcChannel { + public: + inline RpcChannel() {} + virtual ~RpcChannel(); + + // Call the given method of the remote service. The signature of this + // procedure looks the same as Service::CallMethod(), but the requirements + // are less strict in one important way: the request and response objects + // need not be of any specific class as long as their descriptors are + // method->input_type() and method->output_type(). + virtual void CallMethod(const MethodDescriptor* method, + RpcController* controller, + const Message* request, + Message* response, + Closure* done) = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcChannel); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_SERVICE_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops.h new file mode 100644 index 0000000000000..b1336e36b93dd --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops.h @@ -0,0 +1,227 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// The routines exported by this module are subtle. If you use them, even if +// you get the code right, it will depend on careful reasoning about atomicity +// and memory ordering; it will be less readable, and harder to maintain. If +// you plan to use these routines, you should have a good reason, such as solid +// evidence that performance would otherwise suffer, or there being no +// alternative. You should assume only properties explicitly guaranteed by the +// specifications in this file. You are almost certainly _not_ writing code +// just for the x86; if you assume x86 semantics, x86 hardware bugs and +// implementations on other archtectures will cause your code to break. If you +// do not know what you are doing, avoid these routines, and use a Mutex. +// +// It is incorrect to make direct assignments to/from an atomic variable. +// You should use one of the Load or Store routines. The NoBarrier +// versions are provided when no barriers are needed: +// NoBarrier_Store() +// NoBarrier_Load() +// Although there are currently no compiler enforcement, you are encouraged +// to use these. + +// This header and the implementations for each platform (located in +// atomicops_internals_*) must be kept in sync with the upstream code (V8). + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_H_ + +// Don't include this file for people not concerned about thread safety. +#ifndef GOOGLE_PROTOBUF_NO_THREAD_SAFETY + +#include + +namespace google { +namespace protobuf { +namespace internal { + +typedef int32 Atomic32; +#ifdef GOOGLE_PROTOBUF_ARCH_64_BIT +// We need to be able to go between Atomic64 and AtomicWord implicitly. This +// means Atomic64 and AtomicWord should be the same type on 64-bit. +#if defined(__ILP32__) || defined(GOOGLE_PROTOBUF_OS_NACL) || defined(GOOGLE_PROTOBUF_ARCH_SPARC) +// NaCl's intptr_t is not actually 64-bits on 64-bit! +// http://code.google.com/p/nativeclient/issues/detail?id=1162 +// sparcv9's pointer type is 32bits +typedef int64 Atomic64; +#else +typedef intptr_t Atomic64; +#endif +#endif + +// Use AtomicWord for a machine-sized pointer. It will use the Atomic32 or +// Atomic64 routines below, depending on your architecture. +typedef intptr_t AtomicWord; + +// Atomically execute: +// result = *ptr; +// if (*ptr == old_value) +// *ptr = new_value; +// return result; +// +// I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value". +// Always return the old value of "*ptr" +// +// This routine implies no memory barriers. +Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value); + +// Atomically store new_value into *ptr, returning the previous value held in +// *ptr. This routine implies no memory barriers. +Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value); + +// Atomically increment *ptr by "increment". Returns the new value of +// *ptr with the increment applied. This routine implies no memory barriers. +Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment); + +Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment); + +// These following lower-level operations are typically useful only to people +// implementing higher-level synchronization operations like spinlocks, +// mutexes, and condition-variables. They combine CompareAndSwap(), a load, or +// a store with appropriate memory-ordering instructions. "Acquire" operations +// ensure that no later memory access can be reordered ahead of the operation. +// "Release" operations ensure that no previous memory access can be reordered +// after the operation. "Barrier" operations have both "Acquire" and "Release" +// semantics. A MemoryBarrier() has "Barrier" semantics, but does no memory +// access. +Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value); +Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value); + +#if defined(__MINGW32__) && defined(MemoryBarrier) +#undef MemoryBarrier +#endif +void MemoryBarrier(); +void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value); +void Acquire_Store(volatile Atomic32* ptr, Atomic32 value); +void Release_Store(volatile Atomic32* ptr, Atomic32 value); + +Atomic32 NoBarrier_Load(volatile const Atomic32* ptr); +Atomic32 Acquire_Load(volatile const Atomic32* ptr); +Atomic32 Release_Load(volatile const Atomic32* ptr); + +// 64-bit atomic operations (only available on 64-bit processors). +#ifdef GOOGLE_PROTOBUF_ARCH_64_BIT +Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value); +Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value); +Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); +Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); + +Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value); +Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value); +void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value); +void Acquire_Store(volatile Atomic64* ptr, Atomic64 value); +void Release_Store(volatile Atomic64* ptr, Atomic64 value); +Atomic64 NoBarrier_Load(volatile const Atomic64* ptr); +Atomic64 Acquire_Load(volatile const Atomic64* ptr); +Atomic64 Release_Load(volatile const Atomic64* ptr); +#endif // GOOGLE_PROTOBUF_ARCH_64_BIT + +} // namespace internal +} // namespace protobuf +} // namespace google + +// Include our platform specific implementation. +#define GOOGLE_PROTOBUF_ATOMICOPS_ERROR \ +#error "Atomic operations are not supported on your platform" + +// ThreadSanitizer, http://clang.llvm.org/docs/ThreadSanitizer.html. +#if defined(THREAD_SANITIZER) +#include +// MSVC. +#elif defined(_MSC_VER) +#if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64) +#include +#else +GOOGLE_PROTOBUF_ATOMICOPS_ERROR +#endif + +// Solaris +#elif defined(GOOGLE_PROTOBUF_OS_SOLARIS) +#include + +// Apple. +#elif defined(GOOGLE_PROTOBUF_OS_APPLE) +#include + +// GCC. +#elif defined(__GNUC__) +#if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64) +#include +#elif defined(GOOGLE_PROTOBUF_ARCH_ARM) && defined(__linux__) +#include +#elif defined(GOOGLE_PROTOBUF_ARCH_AARCH64) +#include +#elif defined(GOOGLE_PROTOBUF_ARCH_ARM_QNX) +#include +#elif defined(GOOGLE_PROTOBUF_ARCH_MIPS) || defined(GOOGLE_PROTOBUF_ARCH_MIPS64) +#include +#elif defined(__native_client__) +#include +#elif (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4)) +#include +#elif defined(__clang__) +#if __has_extension(c_atomic) +#include +#else +GOOGLE_PROTOBUF_ATOMICOPS_ERROR +#endif +#else +GOOGLE_PROTOBUF_ATOMICOPS_ERROR +#endif + +// Unknown. +#else +GOOGLE_PROTOBUF_ATOMICOPS_ERROR +#endif + +// On some platforms we need additional declarations to make AtomicWord +// compatible with our other Atomic* types. +#if defined(GOOGLE_PROTOBUF_OS_APPLE) +#include +#endif + +#undef GOOGLE_PROTOBUF_ATOMICOPS_ERROR + +#endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h new file mode 100644 index 0000000000000..0a2d2b894b842 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h @@ -0,0 +1,325 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM64_GCC_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM64_GCC_H_ + +namespace google { +namespace protobuf { +namespace internal { + +inline void MemoryBarrier() { + __asm__ __volatile__ ("dmb ish" ::: "memory"); // NOLINT +} + +// NoBarrier versions of the operation include "memory" in the clobber list. +// This is not required for direct usage of the NoBarrier versions of the +// operations. However this is required for correctness when they are used as +// part of the Acquire or Release versions, to ensure that nothing from outside +// the call is reordered between the operation and the memory barrier. This does +// not change the code generated, so has no or minimal impact on the +// NoBarrier operations. + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 prev; + int32_t temp; + + __asm__ __volatile__ ( // NOLINT + "0: \n\t" + "ldxr %w[prev], %[ptr] \n\t" // Load the previous value. + "cmp %w[prev], %w[old_value] \n\t" + "bne 1f \n\t" + "stxr %w[temp], %w[new_value], %[ptr] \n\t" // Try to store the new value. + "cbnz %w[temp], 0b \n\t" // Retry if it did not work. + "1: \n\t" + : [prev]"=&r" (prev), + [temp]"=&r" (temp), + [ptr]"+Q" (*ptr) + : [old_value]"IJr" (old_value), + [new_value]"r" (new_value) + : "cc", "memory" + ); // NOLINT + + return prev; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + Atomic32 result; + int32_t temp; + + __asm__ __volatile__ ( // NOLINT + "0: \n\t" + "ldxr %w[result], %[ptr] \n\t" // Load the previous value. + "stxr %w[temp], %w[new_value], %[ptr] \n\t" // Try to store the new value. + "cbnz %w[temp], 0b \n\t" // Retry if it did not work. + : [result]"=&r" (result), + [temp]"=&r" (temp), + [ptr]"+Q" (*ptr) + : [new_value]"r" (new_value) + : "memory" + ); // NOLINT + + return result; +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + Atomic32 result; + int32_t temp; + + __asm__ __volatile__ ( // NOLINT + "0: \n\t" + "ldxr %w[result], %[ptr] \n\t" // Load the previous value. + "add %w[result], %w[result], %w[increment]\n\t" + "stxr %w[temp], %w[result], %[ptr] \n\t" // Try to store the result. + "cbnz %w[temp], 0b \n\t" // Retry on failure. + : [result]"=&r" (result), + [temp]"=&r" (temp), + [ptr]"+Q" (*ptr) + : [increment]"IJr" (increment) + : "memory" + ); // NOLINT + + return result; +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + MemoryBarrier(); + Atomic32 result = NoBarrier_AtomicIncrement(ptr, increment); + MemoryBarrier(); + + return result; +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + MemoryBarrier(); + + return prev; +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + MemoryBarrier(); + Atomic32 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + + return prev; +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + __asm__ __volatile__ ( // NOLINT + "stlr %w[value], %[ptr] \n\t" + : [ptr]"=Q" (*ptr) + : [value]"r" (value) + : "memory" + ); // NOLINT +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return *ptr; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 value; + + __asm__ __volatile__ ( // NOLINT + "ldar %w[value], %[ptr] \n\t" + : [value]"=r" (value) + : [ptr]"Q" (*ptr) + : "memory" + ); // NOLINT + + return value; +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + MemoryBarrier(); + return *ptr; +} + +// 64-bit versions of the operations. +// See the 32-bit versions for comments. + +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 prev; + int32_t temp; + + __asm__ __volatile__ ( // NOLINT + "0: \n\t" + "ldxr %[prev], %[ptr] \n\t" + "cmp %[prev], %[old_value] \n\t" + "bne 1f \n\t" + "stxr %w[temp], %[new_value], %[ptr] \n\t" + "cbnz %w[temp], 0b \n\t" + "1: \n\t" + : [prev]"=&r" (prev), + [temp]"=&r" (temp), + [ptr]"+Q" (*ptr) + : [old_value]"IJr" (old_value), + [new_value]"r" (new_value) + : "cc", "memory" + ); // NOLINT + + return prev; +} + +inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, + Atomic64 new_value) { + Atomic64 result; + int32_t temp; + + __asm__ __volatile__ ( // NOLINT + "0: \n\t" + "ldxr %[result], %[ptr] \n\t" + "stxr %w[temp], %[new_value], %[ptr] \n\t" + "cbnz %w[temp], 0b \n\t" + : [result]"=&r" (result), + [temp]"=&r" (temp), + [ptr]"+Q" (*ptr) + : [new_value]"r" (new_value) + : "memory" + ); // NOLINT + + return result; +} + +inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + Atomic64 result; + int32_t temp; + + __asm__ __volatile__ ( // NOLINT + "0: \n\t" + "ldxr %[result], %[ptr] \n\t" + "add %[result], %[result], %[increment] \n\t" + "stxr %w[temp], %[result], %[ptr] \n\t" + "cbnz %w[temp], 0b \n\t" + : [result]"=&r" (result), + [temp]"=&r" (temp), + [ptr]"+Q" (*ptr) + : [increment]"IJr" (increment) + : "memory" + ); // NOLINT + + return result; +} + +inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + MemoryBarrier(); + Atomic64 result = NoBarrier_AtomicIncrement(ptr, increment); + MemoryBarrier(); + + return result; +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + MemoryBarrier(); + + return prev; +} + +inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + MemoryBarrier(); + Atomic64 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + + return prev; +} + +inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + __asm__ __volatile__ ( // NOLINT + "stlr %x[value], %[ptr] \n\t" + : [ptr]"=Q" (*ptr) + : [value]"r" (value) + : "memory" + ); // NOLINT +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { + return *ptr; +} + +inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { + Atomic64 value; + + __asm__ __volatile__ ( // NOLINT + "ldar %x[value], %[ptr] \n\t" + : [value]"=r" (value) + : [ptr]"Q" (*ptr) + : "memory" + ); // NOLINT + + return value; +} + +inline Atomic64 Release_Load(volatile const Atomic64* ptr) { + MemoryBarrier(); + return *ptr; +} + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM64_GCC_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h new file mode 100644 index 0000000000000..90e727b0bc56b --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h @@ -0,0 +1,151 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. +// +// LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_GCC_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_GCC_H_ + +namespace google { +namespace protobuf { +namespace internal { + +// 0xffff0fc0 is the hard coded address of a function provided by +// the kernel which implements an atomic compare-exchange. On older +// ARM architecture revisions (pre-v6) this may be implemented using +// a syscall. This address is stable, and in active use (hard coded) +// by at least glibc-2.7 and the Android C library. +typedef Atomic32 (*LinuxKernelCmpxchgFunc)(Atomic32 old_value, + Atomic32 new_value, + volatile Atomic32* ptr); +LinuxKernelCmpxchgFunc pLinuxKernelCmpxchg __attribute__((weak)) = + (LinuxKernelCmpxchgFunc) 0xffff0fc0; + +typedef void (*LinuxKernelMemoryBarrierFunc)(void); +LinuxKernelMemoryBarrierFunc pLinuxKernelMemoryBarrier __attribute__((weak)) = + (LinuxKernelMemoryBarrierFunc) 0xffff0fa0; + + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 prev_value = *ptr; + do { + if (!pLinuxKernelCmpxchg(old_value, new_value, + const_cast(ptr))) { + return old_value; + } + prev_value = *ptr; + } while (prev_value == old_value); + return prev_value; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + Atomic32 old_value; + do { + old_value = *ptr; + } while (pLinuxKernelCmpxchg(old_value, new_value, + const_cast(ptr))); + return old_value; +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return Barrier_AtomicIncrement(ptr, increment); +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + for (;;) { + // Atomic exchange the old value with an incremented one. + Atomic32 old_value = *ptr; + Atomic32 new_value = old_value + increment; + if (pLinuxKernelCmpxchg(old_value, new_value, + const_cast(ptr)) == 0) { + // The exchange took place as expected. + return new_value; + } + // Otherwise, *ptr changed mid-loop and we need to retry. + } +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; +} + +inline void MemoryBarrier() { + pLinuxKernelMemoryBarrier(); +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + MemoryBarrier(); + *ptr = value; +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return *ptr; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 value = *ptr; + MemoryBarrier(); + return value; +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + MemoryBarrier(); + return *ptr; +} + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_GCC_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h new file mode 100644 index 0000000000000..17dfaa518239e --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h @@ -0,0 +1,146 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ + +// For _smp_cmpxchg() +#include + +namespace google { +namespace protobuf { +namespace internal { + +inline Atomic32 QNXCmpxchg(Atomic32 old_value, + Atomic32 new_value, + volatile Atomic32* ptr) { + return static_cast( + _smp_cmpxchg((volatile unsigned *)ptr, + (unsigned)old_value, + (unsigned)new_value)); +} + + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 prev_value = *ptr; + do { + if (!QNXCmpxchg(old_value, new_value, + const_cast(ptr))) { + return old_value; + } + prev_value = *ptr; + } while (prev_value == old_value); + return prev_value; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + Atomic32 old_value; + do { + old_value = *ptr; + } while (QNXCmpxchg(old_value, new_value, + const_cast(ptr))); + return old_value; +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return Barrier_AtomicIncrement(ptr, increment); +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + for (;;) { + // Atomic exchange the old value with an incremented one. + Atomic32 old_value = *ptr; + Atomic32 new_value = old_value + increment; + if (QNXCmpxchg(old_value, new_value, + const_cast(ptr)) == 0) { + // The exchange took place as expected. + return new_value; + } + // Otherwise, *ptr changed mid-loop and we need to retry. + } +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; +} + +inline void MemoryBarrier() { + __sync_synchronize(); +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + MemoryBarrier(); + *ptr = value; +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return *ptr; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 value = *ptr; + MemoryBarrier(); + return value; +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + MemoryBarrier(); + return *ptr; +} + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h new file mode 100644 index 0000000000000..eb198ff5cc236 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h @@ -0,0 +1,122 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ + +// AtomicWord is a synonym for intptr_t, and Atomic32 is a synonym for int32, +// which in turn means int. On some LP32 platforms, intptr_t is an int, but +// on others, it's a long. When AtomicWord and Atomic32 are based on different +// fundamental types, their pointers are incompatible. +// +// This file defines function overloads to allow both AtomicWord and Atomic32 +// data to be used with this interface. +// +// On LP64 platforms, AtomicWord and Atomic64 are both always long, +// so this problem doesn't occur. + +#if !defined(GOOGLE_PROTOBUF_ARCH_64_BIT) + +namespace google { +namespace protobuf { +namespace internal { + +inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr, + AtomicWord old_value, + AtomicWord new_value) { + return NoBarrier_CompareAndSwap( + reinterpret_cast(ptr), old_value, new_value); +} + +inline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr, + AtomicWord new_value) { + return NoBarrier_AtomicExchange( + reinterpret_cast(ptr), new_value); +} + +inline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr, + AtomicWord increment) { + return NoBarrier_AtomicIncrement( + reinterpret_cast(ptr), increment); +} + +inline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr, + AtomicWord increment) { + return Barrier_AtomicIncrement( + reinterpret_cast(ptr), increment); +} + +inline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr, + AtomicWord old_value, + AtomicWord new_value) { + return Acquire_CompareAndSwap( + reinterpret_cast(ptr), old_value, new_value); +} + +inline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr, + AtomicWord old_value, + AtomicWord new_value) { + return Release_CompareAndSwap( + reinterpret_cast(ptr), old_value, new_value); +} + +inline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) { + NoBarrier_Store(reinterpret_cast(ptr), value); +} + +inline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) { + return Acquire_Store(reinterpret_cast(ptr), value); +} + +inline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) { + return Release_Store(reinterpret_cast(ptr), value); +} + +inline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) { + return NoBarrier_Load(reinterpret_cast(ptr)); +} + +inline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) { + return Acquire_Load(reinterpret_cast(ptr)); +} + +inline AtomicWord Release_Load(volatile const AtomicWord* ptr) { + return Release_Load(reinterpret_cast(ptr)); +} + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // !defined(GOOGLE_PROTOBUF_ARCH_64_BIT) + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h new file mode 100644 index 0000000000000..dd7abf6f17541 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h @@ -0,0 +1,137 @@ +// Copyright 2013 Red Hat Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Red Hat Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_GCC_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_GCC_H_ + +namespace google { +namespace protobuf { +namespace internal { + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + __atomic_compare_exchange_n(ptr, &old_value, new_value, true, + __ATOMIC_RELAXED, __ATOMIC_RELAXED); + return old_value; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + return __atomic_exchange_n(ptr, new_value, __ATOMIC_RELAXED); +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return __atomic_add_fetch(ptr, increment, __ATOMIC_RELAXED); +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return __atomic_add_fetch(ptr, increment, __ATOMIC_SEQ_CST); +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + __atomic_compare_exchange(ptr, &old_value, &new_value, true, + __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); + return old_value; +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + __atomic_compare_exchange_n(ptr, &old_value, new_value, true, + __ATOMIC_RELEASE, __ATOMIC_ACQUIRE); + return old_value; +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + __atomic_store_n(ptr, value, __ATOMIC_RELAXED); +} + +inline void MemoryBarrier() { + __sync_synchronize(); +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + __atomic_store_n(ptr, value, __ATOMIC_RELEASE); +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return __atomic_load_n(ptr, __ATOMIC_RELAXED); +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + return __atomic_load_n(ptr, __ATOMIC_ACQUIRE); +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + return __atomic_load_n(ptr, __ATOMIC_SEQ_CST); +} + +#ifdef __LP64__ + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + __atomic_store_n(ptr, value, __ATOMIC_RELEASE); +} + +inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { + return __atomic_load_n(ptr, __ATOMIC_ACQUIRE); +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + __atomic_compare_exchange_n(ptr, &old_value, new_value, true, + __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); + return old_value; +} + +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + __atomic_compare_exchange_n(ptr, &old_value, new_value, true, + __ATOMIC_RELAXED, __ATOMIC_RELAXED); + return old_value; +} + +#endif // defined(__LP64__) + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_GCC_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h new file mode 100644 index 0000000000000..796332417feb0 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h @@ -0,0 +1,225 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MACOSX_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MACOSX_H_ + +#include + +namespace google { +namespace protobuf { +namespace internal { + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 prev_value; + do { + if (OSAtomicCompareAndSwap32(old_value, new_value, + const_cast(ptr))) { + return old_value; + } + prev_value = *ptr; + } while (prev_value == old_value); + return prev_value; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + Atomic32 old_value; + do { + old_value = *ptr; + } while (!OSAtomicCompareAndSwap32(old_value, new_value, + const_cast(ptr))); + return old_value; +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return OSAtomicAdd32(increment, const_cast(ptr)); +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return OSAtomicAdd32Barrier(increment, const_cast(ptr)); +} + +inline void MemoryBarrier() { + OSMemoryBarrier(); +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 prev_value; + do { + if (OSAtomicCompareAndSwap32Barrier(old_value, new_value, + const_cast(ptr))) { + return old_value; + } + prev_value = *ptr; + } while (prev_value == old_value); + return prev_value; +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return Acquire_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + MemoryBarrier(); + *ptr = value; +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return *ptr; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 value = *ptr; + MemoryBarrier(); + return value; +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + MemoryBarrier(); + return *ptr; +} + +#ifdef __LP64__ + +// 64-bit implementation on 64-bit platform + +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 prev_value; + do { + if (OSAtomicCompareAndSwap64(old_value, new_value, + reinterpret_cast(ptr))) { + return old_value; + } + prev_value = *ptr; + } while (prev_value == old_value); + return prev_value; +} + +inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, + Atomic64 new_value) { + Atomic64 old_value; + do { + old_value = *ptr; + } while (!OSAtomicCompareAndSwap64(old_value, new_value, + reinterpret_cast(ptr))); + return old_value; +} + +inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + return OSAtomicAdd64(increment, reinterpret_cast(ptr)); +} + +inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + return OSAtomicAdd64Barrier(increment, + reinterpret_cast(ptr)); +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 prev_value; + do { + if (OSAtomicCompareAndSwap64Barrier( + old_value, new_value, reinterpret_cast(ptr))) { + return old_value; + } + prev_value = *ptr; + } while (prev_value == old_value); + return prev_value; +} + +inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + // The lib kern interface does not distinguish between + // Acquire and Release memory barriers; they are equivalent. + return Acquire_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + MemoryBarrier(); + *ptr = value; +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { + return *ptr; +} + +inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { + Atomic64 value = *ptr; + MemoryBarrier(); + return value; +} + +inline Atomic64 Release_Load(volatile const Atomic64* ptr) { + MemoryBarrier(); + return *ptr; +} + +#endif // defined(__LP64__) + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MACOSX_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h new file mode 100644 index 0000000000000..e3cd14cf8019c --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h @@ -0,0 +1,313 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MIPS_GCC_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MIPS_GCC_H_ + +#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory") + +namespace google { +namespace protobuf { +namespace internal { + +// Atomically execute: +// result = *ptr; +// if (*ptr == old_value) +// *ptr = new_value; +// return result; +// +// I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value". +// Always return the old value of "*ptr" +// +// This routine implies no memory barriers. +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 prev, tmp; + __asm__ __volatile__(".set push\n" + ".set noreorder\n" + "1:\n" + "ll %0, %5\n" // prev = *ptr + "bne %0, %3, 2f\n" // if (prev != old_value) goto 2 + "move %2, %4\n" // tmp = new_value + "sc %2, %1\n" // *ptr = tmp (with atomic check) + "beqz %2, 1b\n" // start again on atomic error + "nop\n" // delay slot nop + "2:\n" + ".set pop\n" + : "=&r" (prev), "=m" (*ptr), "=&r" (tmp) + : "Ir" (old_value), "r" (new_value), "m" (*ptr) + : "memory"); + return prev; +} + +// Atomically store new_value into *ptr, returning the previous value held in +// *ptr. This routine implies no memory barriers. +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + Atomic32 temp, old; + __asm__ __volatile__(".set push\n" + ".set noreorder\n" + "1:\n" + "ll %1, %4\n" // old = *ptr + "move %0, %3\n" // temp = new_value + "sc %0, %2\n" // *ptr = temp (with atomic check) + "beqz %0, 1b\n" // start again on atomic error + "nop\n" // delay slot nop + ".set pop\n" + : "=&r" (temp), "=&r" (old), "=m" (*ptr) + : "r" (new_value), "m" (*ptr) + : "memory"); + + return old; +} + +// Atomically increment *ptr by "increment". Returns the new value of +// *ptr with the increment applied. This routine implies no memory barriers. +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + Atomic32 temp, temp2; + + __asm__ __volatile__(".set push\n" + ".set noreorder\n" + "1:\n" + "ll %0, %4\n" // temp = *ptr + "addu %1, %0, %3\n" // temp2 = temp + increment + "sc %1, %2\n" // *ptr = temp2 (with atomic check) + "beqz %1, 1b\n" // start again on atomic error + "addu %1, %0, %3\n" // temp2 = temp + increment + ".set pop\n" + : "=&r" (temp), "=&r" (temp2), "=m" (*ptr) + : "Ir" (increment), "m" (*ptr) + : "memory"); + // temp2 now holds the final value. + return temp2; +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + ATOMICOPS_COMPILER_BARRIER(); + Atomic32 res = NoBarrier_AtomicIncrement(ptr, increment); + ATOMICOPS_COMPILER_BARRIER(); + return res; +} + +// "Acquire" operations +// ensure that no later memory access can be reordered ahead of the operation. +// "Release" operations ensure that no previous memory access can be reordered +// after the operation. "Barrier" operations have both "Acquire" and "Release" +// semantics. A MemoryBarrier() has "Barrier" semantics, but does no memory +// access. +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + ATOMICOPS_COMPILER_BARRIER(); + Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + ATOMICOPS_COMPILER_BARRIER(); + return res; +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + ATOMICOPS_COMPILER_BARRIER(); + Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + ATOMICOPS_COMPILER_BARRIER(); + return res; +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; +} + +inline void MemoryBarrier() { + __asm__ __volatile__("sync" : : : "memory"); +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + MemoryBarrier(); + *ptr = value; +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return *ptr; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 value = *ptr; + MemoryBarrier(); + return value; +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + MemoryBarrier(); + return *ptr; +} + +#if defined(__LP64__) +// 64-bit versions of the atomic ops. + +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 prev, tmp; + __asm__ __volatile__(".set push\n" + ".set noreorder\n" + "1:\n" + "lld %0, %5\n" // prev = *ptr + "bne %0, %3, 2f\n" // if (prev != old_value) goto 2 + "move %2, %4\n" // tmp = new_value + "scd %2, %1\n" // *ptr = tmp (with atomic check) + "beqz %2, 1b\n" // start again on atomic error + "nop\n" // delay slot nop + "2:\n" + ".set pop\n" + : "=&r" (prev), "=m" (*ptr), "=&r" (tmp) + : "Ir" (old_value), "r" (new_value), "m" (*ptr) + : "memory"); + return prev; +} + +// Atomically store new_value into *ptr, returning the previous value held in +// *ptr. This routine implies no memory barriers. +inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, + Atomic64 new_value) { + Atomic64 temp, old; + __asm__ __volatile__(".set push\n" + ".set noreorder\n" + "1:\n" + "lld %1, %4\n" // old = *ptr + "move %0, %3\n" // temp = new_value + "scd %0, %2\n" // *ptr = temp (with atomic check) + "beqz %0, 1b\n" // start again on atomic error + "nop\n" // delay slot nop + ".set pop\n" + : "=&r" (temp), "=&r" (old), "=m" (*ptr) + : "r" (new_value), "m" (*ptr) + : "memory"); + + return old; +} + +// Atomically increment *ptr by "increment". Returns the new value of +// *ptr with the increment applied. This routine implies no memory barriers. +inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + Atomic64 temp, temp2; + + __asm__ __volatile__(".set push\n" + ".set noreorder\n" + "1:\n" + "lld %0, %4\n" // temp = *ptr + "daddu %1, %0, %3\n" // temp2 = temp + increment + "scd %1, %2\n" // *ptr = temp2 (with atomic check) + "beqz %1, 1b\n" // start again on atomic error + "daddu %1, %0, %3\n" // temp2 = temp + increment + ".set pop\n" + : "=&r" (temp), "=&r" (temp2), "=m" (*ptr) + : "Ir" (increment), "m" (*ptr) + : "memory"); + // temp2 now holds the final value. + return temp2; +} + +inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + MemoryBarrier(); + Atomic64 res = NoBarrier_AtomicIncrement(ptr, increment); + MemoryBarrier(); + return res; +} + +// "Acquire" operations +// ensure that no later memory access can be reordered ahead of the operation. +// "Release" operations ensure that no previous memory access can be reordered +// after the operation. "Barrier" operations have both "Acquire" and "Release" +// semantics. A MemoryBarrier() has "Barrier" semantics, but does no memory +// access. +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + MemoryBarrier(); + return res; +} + +inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + MemoryBarrier(); + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + MemoryBarrier(); + *ptr = value; +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { + return *ptr; +} + +inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { + Atomic64 value = *ptr; + MemoryBarrier(); + return value; +} + +inline Atomic64 Release_Load(volatile const Atomic64* ptr) { + MemoryBarrier(); + return *ptr; +} +#endif + +} // namespace internal +} // namespace protobuf +} // namespace google + +#undef ATOMICOPS_COMPILER_BARRIER + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MIPS_GCC_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h new file mode 100644 index 0000000000000..b10ac02c40776 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h @@ -0,0 +1,73 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PNACL_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PNACL_H_ + +namespace google { +namespace protobuf { +namespace internal { + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return __sync_val_compare_and_swap(ptr, old_value, new_value); +} + +inline void MemoryBarrier() { + __sync_synchronize(); +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + MemoryBarrier(); + return ret; +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + MemoryBarrier(); + *ptr = value; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 value = *ptr; + MemoryBarrier(); + return value; +} + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PNACL_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h new file mode 100644 index 0000000000000..d8057ecdeabf7 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h @@ -0,0 +1,188 @@ +// Copyright 2014 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_SPARC_GCC_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_SPARC_GCC_H_ + +#include + +namespace google { +namespace protobuf { +namespace internal { + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return (Atomic32)atomic_cas_32((volatile uint32_t*)ptr, (uint32_t)old_value, (uint32_t)new_value); +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + return (Atomic32)atomic_swap_32((volatile uint32_t*)ptr, (uint32_t)new_value); +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return (Atomic32)atomic_add_32_nv((volatile uint32_t*)ptr, (uint32_t)increment); +} + +inline void MemoryBarrier(void) { + membar_producer(); + membar_consumer(); +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + MemoryBarrier(); + Atomic32 ret = NoBarrier_AtomicIncrement(ptr, increment); + MemoryBarrier(); + + return ret; +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + MemoryBarrier(); + + return ret; +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + MemoryBarrier(); + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; + membar_producer(); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + membar_consumer(); + *ptr = value; +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return *ptr; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 val = *ptr; + membar_consumer(); + return val; +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + membar_producer(); + return *ptr; +} + +#ifdef GOOGLE_PROTOBUF_ARCH_64_BIT +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + return atomic_cas_64((volatile uint64_t*)ptr, (uint64_t)old_value, (uint64_t)new_value); +} + +inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value) { + return atomic_swap_64((volatile uint64_t*)ptr, (uint64_t)new_value); +} + +inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { + return atomic_add_64_nv((volatile uint64_t*)ptr, increment); +} + +inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { + MemoryBarrier(); + Atomic64 ret = atomic_add_64_nv((volatile uint64_t*)ptr, increment); + MemoryBarrier(); + return ret; +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + MemoryBarrier(); + return ret; +} + +inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + MemoryBarrier(); + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; + membar_producer(); +} + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + membar_consumer(); + *ptr = value; +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { + return *ptr; +} + +inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { + Atomic64 ret = *ptr; + membar_consumer(); + return ret; +} + +inline Atomic64 Release_Load(volatile const Atomic64* ptr) { + membar_producer(); + return *ptr; +} +#endif + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_SPARC_GCC_H_ + diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h new file mode 100644 index 0000000000000..0c903545cd342 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h @@ -0,0 +1,219 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2013 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation for compiler-based +// ThreadSanitizer (http://clang.llvm.org/docs/ThreadSanitizer.html). +// Use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_TSAN_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_TSAN_H_ + +#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory") + +#include + +namespace google { +namespace protobuf { +namespace internal { + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32 *ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 cmp = old_value; + __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value, + __tsan_memory_order_relaxed, __tsan_memory_order_relaxed); + return cmp; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32 *ptr, + Atomic32 new_value) { + return __tsan_atomic32_exchange(ptr, new_value, + __tsan_memory_order_relaxed); +} + +inline Atomic32 Acquire_AtomicExchange(volatile Atomic32 *ptr, + Atomic32 new_value) { + return __tsan_atomic32_exchange(ptr, new_value, + __tsan_memory_order_acquire); +} + +inline Atomic32 Release_AtomicExchange(volatile Atomic32 *ptr, + Atomic32 new_value) { + return __tsan_atomic32_exchange(ptr, new_value, + __tsan_memory_order_release); +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32 *ptr, + Atomic32 increment) { + return increment + __tsan_atomic32_fetch_add(ptr, increment, + __tsan_memory_order_relaxed); +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32 *ptr, + Atomic32 increment) { + return increment + __tsan_atomic32_fetch_add(ptr, increment, + __tsan_memory_order_acq_rel); +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32 *ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 cmp = old_value; + __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value, + __tsan_memory_order_acquire, __tsan_memory_order_acquire); + return cmp; +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32 *ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 cmp = old_value; + __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value, + __tsan_memory_order_release, __tsan_memory_order_relaxed); + return cmp; +} + +inline void NoBarrier_Store(volatile Atomic32 *ptr, Atomic32 value) { + __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed); +} + +inline void Acquire_Store(volatile Atomic32 *ptr, Atomic32 value) { + __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed); + __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); +} + +inline void Release_Store(volatile Atomic32 *ptr, Atomic32 value) { + __tsan_atomic32_store(ptr, value, __tsan_memory_order_release); +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32 *ptr) { + return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed); +} + +inline Atomic32 Acquire_Load(volatile const Atomic32 *ptr) { + return __tsan_atomic32_load(ptr, __tsan_memory_order_acquire); +} + +inline Atomic32 Release_Load(volatile const Atomic32 *ptr) { + __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); + return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed); +} + +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64 *ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 cmp = old_value; + __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value, + __tsan_memory_order_relaxed, __tsan_memory_order_relaxed); + return cmp; +} + +inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64 *ptr, + Atomic64 new_value) { + return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_relaxed); +} + +inline Atomic64 Acquire_AtomicExchange(volatile Atomic64 *ptr, + Atomic64 new_value) { + return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_acquire); +} + +inline Atomic64 Release_AtomicExchange(volatile Atomic64 *ptr, + Atomic64 new_value) { + return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_release); +} + +inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64 *ptr, + Atomic64 increment) { + return increment + __tsan_atomic64_fetch_add(ptr, increment, + __tsan_memory_order_relaxed); +} + +inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64 *ptr, + Atomic64 increment) { + return increment + __tsan_atomic64_fetch_add(ptr, increment, + __tsan_memory_order_acq_rel); +} + +inline void NoBarrier_Store(volatile Atomic64 *ptr, Atomic64 value) { + __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed); +} + +inline void Acquire_Store(volatile Atomic64 *ptr, Atomic64 value) { + __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed); + __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); +} + +inline void Release_Store(volatile Atomic64 *ptr, Atomic64 value) { + __tsan_atomic64_store(ptr, value, __tsan_memory_order_release); +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64 *ptr) { + return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed); +} + +inline Atomic64 Acquire_Load(volatile const Atomic64 *ptr) { + return __tsan_atomic64_load(ptr, __tsan_memory_order_acquire); +} + +inline Atomic64 Release_Load(volatile const Atomic64 *ptr) { + __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); + return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed); +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64 *ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 cmp = old_value; + __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value, + __tsan_memory_order_acquire, __tsan_memory_order_acquire); + return cmp; +} + +inline Atomic64 Release_CompareAndSwap(volatile Atomic64 *ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 cmp = old_value; + __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value, + __tsan_memory_order_release, __tsan_memory_order_relaxed); + return cmp; +} + +inline void MemoryBarrier() { + __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); +} + +} // namespace internal +} // namespace protobuf +} // namespace google + +#undef ATOMICOPS_COMPILER_BARRIER + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_TSAN_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc new file mode 100644 index 0000000000000..53c9eae0fa73f --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc @@ -0,0 +1,137 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This module gets enough CPU information to optimize the +// atomicops module on x86. + +#include + +#include + +// This file only makes sense with atomicops_internals_x86_gcc.h -- it +// depends on structs that are defined in that file. If atomicops.h +// doesn't sub-include that file, then we aren't needed, and shouldn't +// try to do anything. +#ifdef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ + +// Inline cpuid instruction. In PIC compilations, %ebx contains the address +// of the global offset table. To avoid breaking such executables, this code +// must preserve that register's value across cpuid instructions. +#if defined(__i386__) +#define cpuid(a, b, c, d, inp) \ + asm("mov %%ebx, %%edi\n" \ + "cpuid\n" \ + "xchg %%edi, %%ebx\n" \ + : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) +#elif defined(__x86_64__) +#define cpuid(a, b, c, d, inp) \ + asm("mov %%rbx, %%rdi\n" \ + "cpuid\n" \ + "xchg %%rdi, %%rbx\n" \ + : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) +#endif + +#if defined(cpuid) // initialize the struct only on x86 + +namespace google { +namespace protobuf { +namespace internal { + +// Set the flags so that code will run correctly and conservatively, so even +// if we haven't been initialized yet, we're probably single threaded, and our +// default values should hopefully be pretty safe. +struct AtomicOps_x86CPUFeatureStruct AtomicOps_Internalx86CPUFeatures = { + false, // bug can't exist before process spawns multiple threads + false, // no SSE2 +}; + +namespace { + +// Initialize the AtomicOps_Internalx86CPUFeatures struct. +void AtomicOps_Internalx86CPUFeaturesInit() { + uint32_t eax; + uint32_t ebx; + uint32_t ecx; + uint32_t edx; + + // Get vendor string (issue CPUID with eax = 0) + cpuid(eax, ebx, ecx, edx, 0); + char vendor[13]; + memcpy(vendor, &ebx, 4); + memcpy(vendor + 4, &edx, 4); + memcpy(vendor + 8, &ecx, 4); + vendor[12] = 0; + + // get feature flags in ecx/edx, and family/model in eax + cpuid(eax, ebx, ecx, edx, 1); + + int family = (eax >> 8) & 0xf; // family and model fields + int model = (eax >> 4) & 0xf; + if (family == 0xf) { // use extended family and model fields + family += (eax >> 20) & 0xff; + model += ((eax >> 16) & 0xf) << 4; + } + + // Opteron Rev E has a bug in which on very rare occasions a locked + // instruction doesn't act as a read-acquire barrier if followed by a + // non-locked read-modify-write instruction. Rev F has this bug in + // pre-release versions, but not in versions released to customers, + // so we test only for Rev E, which is family 15, model 32..63 inclusive. + if (strcmp(vendor, "AuthenticAMD") == 0 && // AMD + family == 15 && + 32 <= model && model <= 63) { + AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug = true; + } else { + AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug = false; + } + + // edx bit 26 is SSE2 which we use to tell use whether we can use mfence + AtomicOps_Internalx86CPUFeatures.has_sse2 = ((edx >> 26) & 1); +} + +class AtomicOpsx86Initializer { + public: + AtomicOpsx86Initializer() { + AtomicOps_Internalx86CPUFeaturesInit(); + } +}; + +// A global to get use initialized on startup via static initialization :/ +AtomicOpsx86Initializer g_initer; + +} // namespace + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // __i386__ + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h new file mode 100644 index 0000000000000..edccc59dee615 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h @@ -0,0 +1,293 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ + +namespace google { +namespace protobuf { +namespace internal { + +// This struct is not part of the public API of this module; clients may not +// use it. +// Features of this x86. Values may not be correct before main() is run, +// but are set conservatively. +struct AtomicOps_x86CPUFeatureStruct { + bool has_amd_lock_mb_bug; // Processor has AMD memory-barrier bug; do lfence + // after acquire compare-and-swap. + bool has_sse2; // Processor has SSE2. +}; +extern struct AtomicOps_x86CPUFeatureStruct AtomicOps_Internalx86CPUFeatures; + +#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory") + +// 32-bit low-level operations on any platform. + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 prev; + __asm__ __volatile__("lock; cmpxchgl %1,%2" + : "=a" (prev) + : "q" (new_value), "m" (*ptr), "0" (old_value) + : "memory"); + return prev; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + __asm__ __volatile__("xchgl %1,%0" // The lock prefix is implicit for xchg. + : "=r" (new_value) + : "m" (*ptr), "0" (new_value) + : "memory"); + return new_value; // Now it's the previous value. +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + Atomic32 temp = increment; + __asm__ __volatile__("lock; xaddl %0,%1" + : "+r" (temp), "+m" (*ptr) + : : "memory"); + // temp now holds the old value of *ptr + return temp + increment; +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + Atomic32 temp = increment; + __asm__ __volatile__("lock; xaddl %0,%1" + : "+r" (temp), "+m" (*ptr) + : : "memory"); + // temp now holds the old value of *ptr + if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) { + __asm__ __volatile__("lfence" : : : "memory"); + } + return temp + increment; +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + Atomic32 x = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) { + __asm__ __volatile__("lfence" : : : "memory"); + } + return x; +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; +} + +#if defined(__x86_64__) + +// 64-bit implementations of memory barrier can be simpler, because it +// "mfence" is guaranteed to exist. +inline void MemoryBarrier() { + __asm__ __volatile__("mfence" : : : "memory"); +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; + MemoryBarrier(); +} + +#else + +inline void MemoryBarrier() { + if (AtomicOps_Internalx86CPUFeatures.has_sse2) { + __asm__ __volatile__("mfence" : : : "memory"); + } else { // mfence is faster but not present on PIII + Atomic32 x = 0; + NoBarrier_AtomicExchange(&x, 0); // acts as a barrier on PIII + } +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + if (AtomicOps_Internalx86CPUFeatures.has_sse2) { + *ptr = value; + __asm__ __volatile__("mfence" : : : "memory"); + } else { + NoBarrier_AtomicExchange(ptr, value); + // acts as a barrier on PIII + } +} +#endif + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + ATOMICOPS_COMPILER_BARRIER(); + *ptr = value; // An x86 store acts as a release barrier. + // See comments in Atomic64 version of Release_Store(), below. +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return *ptr; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 value = *ptr; // An x86 load acts as a acquire barrier. + // See comments in Atomic64 version of Release_Store(), below. + ATOMICOPS_COMPILER_BARRIER(); + return value; +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + MemoryBarrier(); + return *ptr; +} + +#if defined(__x86_64__) + +// 64-bit low-level operations on 64-bit platform. + +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 prev; + __asm__ __volatile__("lock; cmpxchgq %1,%2" + : "=a" (prev) + : "q" (new_value), "m" (*ptr), "0" (old_value) + : "memory"); + return prev; +} + +inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, + Atomic64 new_value) { + __asm__ __volatile__("xchgq %1,%0" // The lock prefix is implicit for xchg. + : "=r" (new_value) + : "m" (*ptr), "0" (new_value) + : "memory"); + return new_value; // Now it's the previous value. +} + +inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + Atomic64 temp = increment; + __asm__ __volatile__("lock; xaddq %0,%1" + : "+r" (temp), "+m" (*ptr) + : : "memory"); + // temp now contains the previous value of *ptr + return temp + increment; +} + +inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + Atomic64 temp = increment; + __asm__ __volatile__("lock; xaddq %0,%1" + : "+r" (temp), "+m" (*ptr) + : : "memory"); + // temp now contains the previous value of *ptr + if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) { + __asm__ __volatile__("lfence" : : : "memory"); + } + return temp + increment; +} + +inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; + MemoryBarrier(); +} + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + ATOMICOPS_COMPILER_BARRIER(); + + *ptr = value; // An x86 store acts as a release barrier + // for current AMD/Intel chips as of Jan 2008. + // See also Acquire_Load(), below. + + // When new chips come out, check: + // IA-32 Intel Architecture Software Developer's Manual, Volume 3: + // System Programming Guide, Chatper 7: Multiple-processor management, + // Section 7.2, Memory Ordering. + // Last seen at: + // http://developer.intel.com/design/pentium4/manuals/index_new.htm + // + // x86 stores/loads fail to act as barriers for a few instructions (clflush + // maskmovdqu maskmovq movntdq movnti movntpd movntps movntq) but these are + // not generated by the compiler, and are rare. Users of these instructions + // need to know about cache behaviour in any case since all of these involve + // either flushing cache lines or non-temporal cache hints. +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { + return *ptr; +} + +inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { + Atomic64 value = *ptr; // An x86 load acts as a acquire barrier, + // for current AMD/Intel chips as of Jan 2008. + // See also Release_Store(), above. + ATOMICOPS_COMPILER_BARRIER(); + return value; +} + +inline Atomic64 Release_Load(volatile const Atomic64* ptr) { + MemoryBarrier(); + return *ptr; +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + Atomic64 x = NoBarrier_CompareAndSwap(ptr, old_value, new_value); + if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) { + __asm__ __volatile__("lfence" : : : "memory"); + } + return x; +} + +inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +#endif // defined(__x86_64__) + +} // namespace internal +} // namespace protobuf +} // namespace google + +#undef ATOMICOPS_COMPILER_BARRIER + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc new file mode 100644 index 0000000000000..741b164f0ff3a --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc @@ -0,0 +1,112 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// The compilation of extension_set.cc fails when windows.h is included. +// Therefore we move the code depending on windows.h to this separate cc file. + +// Don't compile this file for people not concerned about thread safety. +#ifndef GOOGLE_PROTOBUF_NO_THREAD_SAFETY + +#include + +#ifdef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ + +#include + +namespace google { +namespace protobuf { +namespace internal { + +inline void MemoryBarrier() { + // We use MemoryBarrier from WinNT.h + ::MemoryBarrier(); +} + +Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + LONG result = InterlockedCompareExchange( + reinterpret_cast(ptr), + static_cast(new_value), + static_cast(old_value)); + return static_cast(result); +} + +Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + LONG result = InterlockedExchange( + reinterpret_cast(ptr), + static_cast(new_value)); + return static_cast(result); +} + +Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return InterlockedExchangeAdd( + reinterpret_cast(ptr), + static_cast(increment)) + increment; +} + +#if defined(_WIN64) + +// 64-bit low-level operations on 64-bit platform. + +Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + PVOID result = InterlockedCompareExchangePointer( + reinterpret_cast(ptr), + reinterpret_cast(new_value), reinterpret_cast(old_value)); + return reinterpret_cast(result); +} + +Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, + Atomic64 new_value) { + PVOID result = InterlockedExchangePointer( + reinterpret_cast(ptr), + reinterpret_cast(new_value)); + return reinterpret_cast(result); +} + +Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + return InterlockedExchangeAdd64( + reinterpret_cast(ptr), + static_cast(increment)) + increment; +} + +#endif // defined(_WIN64) + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ +#endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h new file mode 100644 index 0000000000000..e53a641f09f80 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h @@ -0,0 +1,150 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is an internal atomic implementation, use atomicops.h instead. + +#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ +#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ + +namespace google { +namespace protobuf { +namespace internal { + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return Barrier_AtomicIncrement(ptr, increment); +} + +#if !(defined(_MSC_VER) && _MSC_VER >= 1400) +#error "We require at least vs2005 for MemoryBarrier" +#endif + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { + NoBarrier_AtomicExchange(ptr, value); + // acts as a barrier in this implementation +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + *ptr = value; // works w/o barrier for current Intel chips as of June 2005 + // See comments in Atomic64 version of Release_Store() below. +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return *ptr; +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + Atomic32 value = *ptr; + return value; +} + +inline Atomic32 Release_Load(volatile const Atomic32* ptr) { + MemoryBarrier(); + return *ptr; +} + +#if defined(_WIN64) + +// 64-bit low-level operations on 64-bit platform. + +inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + return Barrier_AtomicIncrement(ptr, increment); +} + +inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; +} + +inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { + NoBarrier_AtomicExchange(ptr, value); + // acts as a barrier in this implementation +} + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + *ptr = value; // works w/o barrier for current Intel chips as of June 2005 + + // When new chips come out, check: + // IA-32 Intel Architecture Software Developer's Manual, Volume 3: + // System Programming Guide, Chatper 7: Multiple-processor management, + // Section 7.2, Memory Ordering. + // Last seen at: + // http://developer.intel.com/design/pentium4/manuals/index_new.htm +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { + return *ptr; +} + +inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { + Atomic64 value = *ptr; + return value; +} + +inline Atomic64 Release_Load(volatile const Atomic64* ptr) { + MemoryBarrier(); + return *ptr; +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + return NoBarrier_CompareAndSwap(ptr, old_value, new_value); +} + +#endif // defined(_WIN64) + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ diff --git a/toolkit/components/protobuf/google/protobuf/stubs/common.cc b/toolkit/components/protobuf/src/google/protobuf/stubs/common.cc similarity index 90% rename from toolkit/components/protobuf/google/protobuf/stubs/common.cc rename to toolkit/components/protobuf/src/google/protobuf/stubs/common.cc index 9ae7e61018540..899585996392d 100644 --- a/toolkit/components/protobuf/google/protobuf/stubs/common.cc +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/common.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -36,14 +36,15 @@ #include #include -#ifdef WIN32 + +#ifdef _WIN32 #define WIN32_LEAN_AND_MEAN // We only need minimal includes #include -#if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf // see comment in strutil.cc -#endif -#else +#elif defined(HAVE_PTHREAD_H) #include +#else +#error "No suitable threading library available." #endif namespace google { @@ -108,13 +109,13 @@ void DefaultLogHandler(LogLevel level, const char* filename, int line, // We use fprintf() instead of cerr because we want this to work at static // initialization time. - fprintf(stderr, "libprotobuf %s %s:%d] %s\n", + fprintf(stderr, "[libprotobuf %s %s:%d] %s\n", level_names[level], filename, line, message.c_str()); fflush(stderr); // Needed on MSVC. } -void NullLogHandler(LogLevel level, const char* filename, int line, - const string& message) { +void NullLogHandler(LogLevel /* level */, const char* /* filename */, + int /* line */, const string& /* message */) { // Nothing. } @@ -181,15 +182,15 @@ void LogMessage::Finish() { if (level_ != LOGLEVEL_FATAL) { InitLogSilencerCountOnce(); MutexLock lock(log_silencer_count_mutex_); - suppress = internal::log_silencer_count_ > 0; + suppress = log_silencer_count_ > 0; } if (!suppress) { - internal::log_handler_(level_, filename_, line_, message_); + log_handler_(level_, filename_, line_, message_); } if (level_ == LOGLEVEL_FATAL) { -#ifdef PROTOBUF_USE_EXCEPTIONS +#if PROTOBUF_USE_EXCEPTIONS throw FatalException(filename_, line_, message_); #else abort(); @@ -240,7 +241,7 @@ void DoNothing() {} // =================================================================== // emulates google3/base/mutex.cc -#ifdef WIN32 +#ifdef _WIN32 struct Mutex::Internal { CRITICAL_SECTION mutex; @@ -280,7 +281,7 @@ void Mutex::AssertHeld() { #endif } -#else +#elif defined(HAVE_PTHREAD) struct Mutex::Internal { pthread_mutex_t mutex; @@ -317,6 +318,24 @@ void Mutex::AssertHeld() { #endif +// =================================================================== +// emulates google3/util/endian/endian.h +// +// TODO(xiaofeng): PROTOBUF_LITTLE_ENDIAN is unfortunately defined in +// google/protobuf/io/coded_stream.h and therefore can not be used here. +// Maybe move that macro definition here in the furture. +uint32 ghtonl(uint32 x) { + union { + uint32 result; + uint8 result_array[4]; + }; + result_array[0] = static_cast(x >> 24); + result_array[1] = static_cast((x >> 16) & 0xFF); + result_array[2] = static_cast((x >> 8) & 0xFF); + result_array[3] = static_cast(x & 0xFF); + return result; +} + // =================================================================== // Shutdown support. @@ -363,7 +382,7 @@ void ShutdownProtobufLibrary() { internal::shutdown_functions_mutex = NULL; } -#ifdef PROTOBUF_USE_EXCEPTIONS +#if PROTOBUF_USE_EXCEPTIONS FatalException::~FatalException() throw() {} const char* FatalException::what() const throw() { diff --git a/toolkit/components/protobuf/google/protobuf/stubs/common.h b/toolkit/components/protobuf/src/google/protobuf/stubs/common.h similarity index 93% rename from toolkit/components/protobuf/google/protobuf/stubs/common.h rename to toolkit/components/protobuf/src/google/protobuf/stubs/common.h index 7173a84d14ad5..fa6fe3ce973ba 100644 --- a/toolkit/components/protobuf/google/protobuf/stubs/common.h +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/common.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -48,12 +48,17 @@ #include #endif +#ifndef PROTOBUF_USE_EXCEPTIONS #if defined(_MSC_VER) && defined(_CPPUNWIND) - #define PROTOBUF_USE_EXCEPTIONS + #define PROTOBUF_USE_EXCEPTIONS 1 #elif defined(__EXCEPTIONS) - #define PROTOBUF_USE_EXCEPTIONS + #define PROTOBUF_USE_EXCEPTIONS 1 +#else + #define PROTOBUF_USE_EXCEPTIONS 0 +#endif #endif -#ifdef PROTOBUF_USE_EXCEPTIONS + +#if PROTOBUF_USE_EXCEPTIONS #include #endif @@ -108,24 +113,24 @@ namespace internal { // The current version, represented as a single integer to make comparison // easier: major * 10^6 + minor * 10^3 + micro -#define GOOGLE_PROTOBUF_VERSION 2004001 +#define GOOGLE_PROTOBUF_VERSION 2006001 // The minimum library version which works with the current version of the // headers. -#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 2004000 +#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 2006000 // The minimum header version which works with the current version of // the library. This constant should only be used by protoc's C++ code // generator. -static const int kMinHeaderVersionForLibrary = 2004000; +static const int kMinHeaderVersionForLibrary = 2006000; // The minimum protoc version which works with the current version of the // headers. -#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 2004000 +#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 2006000 // The minimum header version which works with the current version of // protoc. This constant should only be used in VerifyVersion(). -static const int kMinHeaderVersionForProtoc = 2004000; +static const int kMinHeaderVersionForProtoc = 2006000; // Verifies that the headers and libraries are compatible. Use the macro // below to call this. @@ -363,60 +368,9 @@ using internal::down_cast; // the expression is false, most compilers will issue a warning/error // containing the name of the variable. -namespace internal { +#define GOOGLE_COMPILE_ASSERT(expr, msg) static_assert(expr, #msg) -template -struct CompileAssert { -}; -} // namespace internal - -#undef GOOGLE_COMPILE_ASSERT -#define GOOGLE_COMPILE_ASSERT(expr, msg) \ - typedef ::google::protobuf::internal::CompileAssert<(bool(expr))> \ - msg[bool(expr) ? 1 : -1] - - -// Implementation details of COMPILE_ASSERT: -// -// - COMPILE_ASSERT works by defining an array type that has -1 -// elements (and thus is invalid) when the expression is false. -// -// - The simpler definition -// -// #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1] -// -// does not work, as gcc supports variable-length arrays whose sizes -// are determined at run-time (this is gcc's extension and not part -// of the C++ standard). As a result, gcc fails to reject the -// following code with the simple definition: -// -// int foo; -// COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is -// // not a compile-time constant. -// -// - By using the type CompileAssert<(bool(expr))>, we ensures that -// expr is a compile-time constant. (Template arguments must be -// determined at compile-time.) -// -// - The outter parentheses in CompileAssert<(bool(expr))> are necessary -// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written -// -// CompileAssert -// -// instead, these compilers will refuse to compile -// -// COMPILE_ASSERT(5 > 0, some_message); -// -// (They seem to think the ">" in "5 > 0" marks the end of the -// template argument list.) -// -// - The array size is (bool(expr) ? 1 : -1), instead of simply -// -// ((expr) ? 1 : -1). -// -// This is to avoid running into a bug in MS VC 7.1, which -// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. // =================================================================== // from google3/base/scoped_ptr.h @@ -633,6 +587,17 @@ enum LogLevel { #else LOGLEVEL_DFATAL = LOGLEVEL_FATAL #endif + +#ifdef ERROR + // ERROR is defined as 0 on some windows builds, so `GOOGLE_LOG(ERROR, ...)` + // expands into `GOOGLE_LOG(0, ...)` which then expands into + // `someGoogleLogging(LOGLEVEL_0, ...)`. This is not ideal, because the + // GOOGLE_LOG macro expects to expand itself into + // `someGoogleLogging(LOGLEVEL_ERROR, ...)` instead. The workaround to get + // everything building is to simply define LOGLEVEL_0 as LOGLEVEL_ERROR and + // move on with our lives. + , LOGLEVEL_0 = LOGLEVEL_ERROR +#endif }; namespace internal { @@ -680,12 +645,14 @@ class LIBPROTOBUF_EXPORT LogFinisher { #undef GOOGLE_LOG_IF #undef GOOGLE_CHECK +#undef GOOGLE_CHECK_OK #undef GOOGLE_CHECK_EQ #undef GOOGLE_CHECK_NE #undef GOOGLE_CHECK_LT #undef GOOGLE_CHECK_LE #undef GOOGLE_CHECK_GT #undef GOOGLE_CHECK_GE +#undef GOOGLE_CHECK_NOTNULL #undef GOOGLE_DLOG #undef GOOGLE_DCHECK @@ -705,6 +672,7 @@ class LIBPROTOBUF_EXPORT LogFinisher { #define GOOGLE_CHECK(EXPRESSION) \ GOOGLE_LOG_IF(FATAL, !(EXPRESSION)) << "CHECK failed: " #EXPRESSION ": " +#define GOOGLE_CHECK_OK(A) GOOGLE_CHECK(A) #define GOOGLE_CHECK_EQ(A, B) GOOGLE_CHECK((A) == (B)) #define GOOGLE_CHECK_NE(A, B) GOOGLE_CHECK((A) != (B)) #define GOOGLE_CHECK_LT(A, B) GOOGLE_CHECK((A) < (B)) @@ -712,6 +680,19 @@ class LIBPROTOBUF_EXPORT LogFinisher { #define GOOGLE_CHECK_GT(A, B) GOOGLE_CHECK((A) > (B)) #define GOOGLE_CHECK_GE(A, B) GOOGLE_CHECK((A) >= (B)) +namespace internal { +template +T* CheckNotNull(const char* /* file */, int /* line */, + const char* name, T* val) { + if (val == NULL) { + GOOGLE_LOG(FATAL) << name; + } + return val; +} +} // namespace internal +#define GOOGLE_CHECK_NOTNULL(A) \ + internal::CheckNotNull(__FILE__, __LINE__, "'" #A "' must not be NULL", (A)) + #ifdef NDEBUG #define GOOGLE_DLOG GOOGLE_LOG_IF(INFO, false) @@ -1136,26 +1117,20 @@ using internal::WriterMutexLock; using internal::MutexLockMaybe; // =================================================================== -// from google3/base/type_traits.h +// from google3/util/utf8/public/unilib.h namespace internal { -// Specified by TR1 [4.7.4] Pointer modifications. -template struct remove_pointer { typedef T type; }; -template struct remove_pointer { typedef T type; }; -template struct remove_pointer { typedef T type; }; -template struct remove_pointer { typedef T type; }; -template struct remove_pointer { - typedef T type; }; - -// =================================================================== - // Checks if the buffer contains structurally-valid UTF-8. Implemented in // structurally_valid.cc. LIBPROTOBUF_EXPORT bool IsStructurallyValidUTF8(const char* buf, int len); } // namespace internal +// =================================================================== +// from google3/util/endian/endian.h +LIBPROTOBUF_EXPORT uint32 ghtonl(uint32 x); + // =================================================================== // Shutdown support. @@ -1181,7 +1156,7 @@ LIBPROTOBUF_EXPORT void OnShutdown(void (*func)()); } // namespace internal -#ifdef PROTOBUF_USE_EXCEPTIONS +#if PROTOBUF_USE_EXCEPTIONS class FatalException : public std::exception { public: FatalException(const char* filename, int line, const std::string& message) diff --git a/toolkit/components/protobuf/google/protobuf/stubs/hash.h b/toolkit/components/protobuf/src/google/protobuf/stubs/hash.h similarity index 96% rename from toolkit/components/protobuf/google/protobuf/stubs/hash.h rename to toolkit/components/protobuf/src/google/protobuf/stubs/hash.h index 21e34652b5769..3640b8982dfb5 100644 --- a/toolkit/components/protobuf/google/protobuf/stubs/hash.h +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/hash.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -89,12 +89,16 @@ template , typename EqualKey = int > class hash_map : public std::map { + public: + hash_map(int = 0) {} }; template , typename EqualKey = int > class hash_set : public std::set { + public: + hash_set(int = 0) {} }; #elif defined(_MSC_VER) && !defined(_STLPORT_VERSION) @@ -122,6 +126,8 @@ template class hash_map : public HASH_NAMESPACE::hash_map< Key, Data, HashFcn> { + public: + hash_map(int = 0) {} }; template class hash_set : public HASH_NAMESPACE::hash_set< Key, HashFcn> { + public: + hash_set(int = 0) {} }; #else @@ -162,6 +170,8 @@ template > class hash_map : public HASH_NAMESPACE::HASH_MAP_CLASS< Key, Data, HashFcn, EqualKey> { + public: + hash_map(int = 0) {} }; template > class hash_set : public HASH_NAMESPACE::HASH_SET_CLASS< Key, HashFcn, EqualKey> { + public: + hash_set(int = 0) {} }; #endif diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/map_util.h b/toolkit/components/protobuf/src/google/protobuf/stubs/map_util.h new file mode 100644 index 0000000000000..7495cb6aec7b0 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/map_util.h @@ -0,0 +1,771 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2014 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/util/gtl/map_util.h +// Author: Anton Carver + +#ifndef GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__ +#define GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__ + +#include +#include +#include +#include +#include + +#include + +namespace google { +namespace protobuf { +namespace internal { +// Local implementation of RemoveConst to avoid including base/type_traits.h. +template struct RemoveConst { typedef T type; }; +template struct RemoveConst : RemoveConst {}; +} // namespace internal + +// +// Find*() +// + +// Returns a const reference to the value associated with the given key if it +// exists. Crashes otherwise. +// +// This is intended as a replacement for operator[] as an rvalue (for reading) +// when the key is guaranteed to exist. +// +// operator[] for lookup is discouraged for several reasons: +// * It has a side-effect of inserting missing keys +// * It is not thread-safe (even when it is not inserting, it can still +// choose to resize the underlying storage) +// * It invalidates iterators (when it chooses to resize) +// * It default constructs a value object even if it doesn't need to +// +// This version assumes the key is printable, and includes it in the fatal log +// message. +template +const typename Collection::value_type::second_type& +FindOrDie(const Collection& collection, + const typename Collection::value_type::first_type& key) { + typename Collection::const_iterator it = collection.find(key); + GOOGLE_CHECK(it != collection.end()) << "Map key not found: " << key; + return it->second; +} + +// Same as above, but returns a non-const reference. +template +typename Collection::value_type::second_type& +FindOrDie(Collection& collection, // NOLINT + const typename Collection::value_type::first_type& key) { + typename Collection::iterator it = collection.find(key); + GOOGLE_CHECK(it != collection.end()) << "Map key not found: " << key; + return it->second; +} + +// Same as FindOrDie above, but doesn't log the key on failure. +template +const typename Collection::value_type::second_type& +FindOrDieNoPrint(const Collection& collection, + const typename Collection::value_type::first_type& key) { + typename Collection::const_iterator it = collection.find(key); + GOOGLE_CHECK(it != collection.end()) << "Map key not found"; + return it->second; +} + +// Same as above, but returns a non-const reference. +template +typename Collection::value_type::second_type& +FindOrDieNoPrint(Collection& collection, // NOLINT + const typename Collection::value_type::first_type& key) { + typename Collection::iterator it = collection.find(key); + GOOGLE_CHECK(it != collection.end()) << "Map key not found"; + return it->second; +} + +// Returns a const reference to the value associated with the given key if it +// exists, otherwise returns a const reference to the provided default value. +// +// WARNING: If a temporary object is passed as the default "value," +// this function will return a reference to that temporary object, +// which will be destroyed at the end of the statement. A common +// example: if you have a map with string values, and you pass a char* +// as the default "value," either use the returned value immediately +// or store it in a string (not string&). +// Details: http://go/findwithdefault +template +const typename Collection::value_type::second_type& +FindWithDefault(const Collection& collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& value) { + typename Collection::const_iterator it = collection.find(key); + if (it == collection.end()) { + return value; + } + return it->second; +} + +// Returns a pointer to the const value associated with the given key if it +// exists, or NULL otherwise. +template +const typename Collection::value_type::second_type* +FindOrNull(const Collection& collection, + const typename Collection::value_type::first_type& key) { + typename Collection::const_iterator it = collection.find(key); + if (it == collection.end()) { + return 0; + } + return &it->second; +} + +// Same as above but returns a pointer to the non-const value. +template +typename Collection::value_type::second_type* +FindOrNull(Collection& collection, // NOLINT + const typename Collection::value_type::first_type& key) { + typename Collection::iterator it = collection.find(key); + if (it == collection.end()) { + return 0; + } + return &it->second; +} + +// Returns the pointer value associated with the given key. If none is found, +// NULL is returned. The function is designed to be used with a map of keys to +// pointers. +// +// This function does not distinguish between a missing key and a key mapped +// to a NULL value. +template +typename Collection::value_type::second_type +FindPtrOrNull(const Collection& collection, + const typename Collection::value_type::first_type& key) { + typename Collection::const_iterator it = collection.find(key); + if (it == collection.end()) { + return typename Collection::value_type::second_type(); + } + return it->second; +} + +// Same as above, except takes non-const reference to collection. +// +// This function is needed for containers that propagate constness to the +// pointee, such as boost::ptr_map. +template +typename Collection::value_type::second_type +FindPtrOrNull(Collection& collection, // NOLINT + const typename Collection::value_type::first_type& key) { + typename Collection::iterator it = collection.find(key); + if (it == collection.end()) { + return typename Collection::value_type::second_type(); + } + return it->second; +} + +// Finds the pointer value associated with the given key in a map whose values +// are linked_ptrs. Returns NULL if key is not found. +template +typename Collection::value_type::second_type::element_type* +FindLinkedPtrOrNull(const Collection& collection, + const typename Collection::value_type::first_type& key) { + typename Collection::const_iterator it = collection.find(key); + if (it == collection.end()) { + return 0; + } + // Since linked_ptr::get() is a const member returning a non const, + // we do not need a version of this function taking a non const collection. + return it->second.get(); +} + +// Same as above, but dies if the key is not found. +template +typename Collection::value_type::second_type::element_type& +FindLinkedPtrOrDie(const Collection& collection, + const typename Collection::value_type::first_type& key) { + typename Collection::const_iterator it = collection.find(key); + CHECK(it != collection.end()) << "key not found: " << key; + // Since linked_ptr::operator*() is a const member returning a non const, + // we do not need a version of this function taking a non const collection. + return *it->second; +} + +// Finds the value associated with the given key and copies it to *value (if not +// NULL). Returns false if the key was not found, true otherwise. +template +bool FindCopy(const Collection& collection, + const Key& key, + Value* const value) { + typename Collection::const_iterator it = collection.find(key); + if (it == collection.end()) { + return false; + } + if (value) { + *value = it->second; + } + return true; +} + +// +// Contains*() +// + +// Returns true if and only if the given collection contains the given key. +template +bool ContainsKey(const Collection& collection, const Key& key) { + return collection.find(key) != collection.end(); +} + +// Returns true if and only if the given collection contains the given key-value +// pair. +template +bool ContainsKeyValuePair(const Collection& collection, + const Key& key, + const Value& value) { + typedef typename Collection::const_iterator const_iterator; + std::pair range = collection.equal_range(key); + for (const_iterator it = range.first; it != range.second; ++it) { + if (it->second == value) { + return true; + } + } + return false; +} + +// +// Insert*() +// + +// Inserts the given key-value pair into the collection. Returns true if and +// only if the key from the given pair didn't previously exist. Otherwise, the +// value in the map is replaced with the value from the given pair. +template +bool InsertOrUpdate(Collection* const collection, + const typename Collection::value_type& vt) { + std::pair ret = collection->insert(vt); + if (!ret.second) { + // update + ret.first->second = vt.second; + return false; + } + return true; +} + +// Same as above, except that the key and value are passed separately. +template +bool InsertOrUpdate(Collection* const collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& value) { + return InsertOrUpdate( + collection, typename Collection::value_type(key, value)); +} + +// Inserts/updates all the key-value pairs from the range defined by the +// iterators "first" and "last" into the given collection. +template +void InsertOrUpdateMany(Collection* const collection, + InputIterator first, InputIterator last) { + for (; first != last; ++first) { + InsertOrUpdate(collection, *first); + } +} + +// Change the value associated with a particular key in a map or hash_map +// of the form map which owns the objects pointed to by the +// value pointers. If there was an existing value for the key, it is deleted. +// True indicates an insert took place, false indicates an update + delete. +template +bool InsertAndDeleteExisting( + Collection* const collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& value) { + std::pair ret = + collection->insert(typename Collection::value_type(key, value)); + if (!ret.second) { + delete ret.first->second; + ret.first->second = value; + return false; + } + return true; +} + +// Inserts the given key and value into the given collection if and only if the +// given key did NOT already exist in the collection. If the key previously +// existed in the collection, the value is not changed. Returns true if the +// key-value pair was inserted; returns false if the key was already present. +template +bool InsertIfNotPresent(Collection* const collection, + const typename Collection::value_type& vt) { + return collection->insert(vt).second; +} + +// Same as above except the key and value are passed separately. +template +bool InsertIfNotPresent( + Collection* const collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& value) { + return InsertIfNotPresent( + collection, typename Collection::value_type(key, value)); +} + +// Same as above except dies if the key already exists in the collection. +template +void InsertOrDie(Collection* const collection, + const typename Collection::value_type& value) { + CHECK(InsertIfNotPresent(collection, value)) << "duplicate value: " << value; +} + +// Same as above except doesn't log the value on error. +template +void InsertOrDieNoPrint(Collection* const collection, + const typename Collection::value_type& value) { + CHECK(InsertIfNotPresent(collection, value)) << "duplicate value."; +} + +// Inserts the key-value pair into the collection. Dies if key was already +// present. +template +void InsertOrDie(Collection* const collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& data) { + typedef typename Collection::value_type value_type; + GOOGLE_CHECK(InsertIfNotPresent(collection, key, data)) + << "duplicate key: " << key; +} + +// Same as above except doesn't log the key on error. +template +void InsertOrDieNoPrint( + Collection* const collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& data) { + typedef typename Collection::value_type value_type; + GOOGLE_CHECK(InsertIfNotPresent(collection, key, data)) << "duplicate key."; +} + +// Inserts a new key and default-initialized value. Dies if the key was already +// present. Returns a reference to the value. Example usage: +// +// map m; +// SomeProto& proto = InsertKeyOrDie(&m, 3); +// proto.set_field("foo"); +template +typename Collection::value_type::second_type& InsertKeyOrDie( + Collection* const collection, + const typename Collection::value_type::first_type& key) { + typedef typename Collection::value_type value_type; + std::pair res = + collection->insert(value_type(key, typename value_type::second_type())); + GOOGLE_CHECK(res.second) << "duplicate key: " << key; + return res.first->second; +} + +// +// Lookup*() +// + +// Looks up a given key and value pair in a collection and inserts the key-value +// pair if it's not already present. Returns a reference to the value associated +// with the key. +template +typename Collection::value_type::second_type& +LookupOrInsert(Collection* const collection, + const typename Collection::value_type& vt) { + return collection->insert(vt).first->second; +} + +// Same as above except the key-value are passed separately. +template +typename Collection::value_type::second_type& +LookupOrInsert(Collection* const collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& value) { + return LookupOrInsert( + collection, typename Collection::value_type(key, value)); +} + +// Counts the number of equivalent elements in the given "sequence", and stores +// the results in "count_map" with element as the key and count as the value. +// +// Example: +// vector v = {"a", "b", "c", "a", "b"}; +// map m; +// AddTokenCounts(v, 1, &m); +// assert(m["a"] == 2); +// assert(m["b"] == 2); +// assert(m["c"] == 1); +template +void AddTokenCounts( + const Sequence& sequence, + const typename Collection::value_type::second_type& increment, + Collection* const count_map) { + for (typename Sequence::const_iterator it = sequence.begin(); + it != sequence.end(); ++it) { + typename Collection::value_type::second_type& value = + LookupOrInsert(count_map, *it, + typename Collection::value_type::second_type()); + value += increment; + } +} + +// Returns a reference to the value associated with key. If not found, a value +// is default constructed on the heap and added to the map. +// +// This function is useful for containers of the form map, where +// inserting a new key, value pair involves constructing a new heap-allocated +// Value, and storing a pointer to that in the collection. +template +typename Collection::value_type::second_type& +LookupOrInsertNew(Collection* const collection, + const typename Collection::value_type::first_type& key) { + typedef typename std::iterator_traits< + typename Collection::value_type::second_type>::value_type Element; + std::pair ret = + collection->insert(typename Collection::value_type( + key, + static_cast(NULL))); + if (ret.second) { + ret.first->second = new Element(); + } + return ret.first->second; +} + +// Same as above but constructs the value using the single-argument constructor +// and the given "arg". +template +typename Collection::value_type::second_type& +LookupOrInsertNew(Collection* const collection, + const typename Collection::value_type::first_type& key, + const Arg& arg) { + typedef typename std::iterator_traits< + typename Collection::value_type::second_type>::value_type Element; + std::pair ret = + collection->insert(typename Collection::value_type( + key, + static_cast(NULL))); + if (ret.second) { + ret.first->second = new Element(arg); + } + return ret.first->second; +} + +// Lookup of linked/shared pointers is used in two scenarios: +// +// Use LookupOrInsertNewLinkedPtr if the container owns the elements. +// In this case it is fine working with the raw pointer as long as it is +// guaranteed that no other thread can delete/update an accessed element. +// A mutex will need to lock the container operation as well as the use +// of the returned elements. Finding an element may be performed using +// FindLinkedPtr*(). +// +// Use LookupOrInsertNewSharedPtr if the container does not own the elements +// for their whole lifetime. This is typically the case when a reader allows +// parallel updates to the container. In this case a Mutex only needs to lock +// container operations, but all element operations must be performed on the +// shared pointer. Finding an element must be performed using FindPtr*() and +// cannot be done with FindLinkedPtr*() even though it compiles. + +// Lookup a key in a map or hash_map whose values are linked_ptrs. If it is +// missing, set collection[key].reset(new Value::element_type) and return that. +// Value::element_type must be default constructable. +template +typename Collection::value_type::second_type::element_type* +LookupOrInsertNewLinkedPtr( + Collection* const collection, + const typename Collection::value_type::first_type& key) { + typedef typename Collection::value_type::second_type Value; + std::pair ret = + collection->insert(typename Collection::value_type(key, Value())); + if (ret.second) { + ret.first->second.reset(new typename Value::element_type); + } + return ret.first->second.get(); +} + +// A variant of LookupOrInsertNewLinkedPtr where the value is constructed using +// a single-parameter constructor. Note: the constructor argument is computed +// even if it will not be used, so only values cheap to compute should be passed +// here. On the other hand it does not matter how expensive the construction of +// the actual stored value is, as that only occurs if necessary. +template +typename Collection::value_type::second_type::element_type* +LookupOrInsertNewLinkedPtr( + Collection* const collection, + const typename Collection::value_type::first_type& key, + const Arg& arg) { + typedef typename Collection::value_type::second_type Value; + std::pair ret = + collection->insert(typename Collection::value_type(key, Value())); + if (ret.second) { + ret.first->second.reset(new typename Value::element_type(arg)); + } + return ret.first->second.get(); +} + +// Lookup a key in a map or hash_map whose values are shared_ptrs. If it is +// missing, set collection[key].reset(new Value::element_type). Unlike +// LookupOrInsertNewLinkedPtr, this function returns the shared_ptr instead of +// the raw pointer. Value::element_type must be default constructable. +template +typename Collection::value_type::second_type& +LookupOrInsertNewSharedPtr( + Collection* const collection, + const typename Collection::value_type::first_type& key) { + typedef typename Collection::value_type::second_type SharedPtr; + typedef typename Collection::value_type::second_type::element_type Element; + std::pair ret = + collection->insert(typename Collection::value_type(key, SharedPtr())); + if (ret.second) { + ret.first->second.reset(new Element()); + } + return ret.first->second; +} + +// A variant of LookupOrInsertNewSharedPtr where the value is constructed using +// a single-parameter constructor. Note: the constructor argument is computed +// even if it will not be used, so only values cheap to compute should be passed +// here. On the other hand it does not matter how expensive the construction of +// the actual stored value is, as that only occurs if necessary. +template +typename Collection::value_type::second_type& +LookupOrInsertNewSharedPtr( + Collection* const collection, + const typename Collection::value_type::first_type& key, + const Arg& arg) { + typedef typename Collection::value_type::second_type SharedPtr; + typedef typename Collection::value_type::second_type::element_type Element; + std::pair ret = + collection->insert(typename Collection::value_type(key, SharedPtr())); + if (ret.second) { + ret.first->second.reset(new Element(arg)); + } + return ret.first->second; +} + +// +// Misc Utility Functions +// + +// Updates the value associated with the given key. If the key was not already +// present, then the key-value pair are inserted and "previous" is unchanged. If +// the key was already present, the value is updated and "*previous" will +// contain a copy of the old value. +// +// InsertOrReturnExisting has complementary behavior that returns the +// address of an already existing value, rather than updating it. +template +bool UpdateReturnCopy(Collection* const collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& value, + typename Collection::value_type::second_type* previous) { + std::pair ret = + collection->insert(typename Collection::value_type(key, value)); + if (!ret.second) { + // update + if (previous) { + *previous = ret.first->second; + } + ret.first->second = value; + return true; + } + return false; +} + +// Same as above except that the key and value are passed as a pair. +template +bool UpdateReturnCopy(Collection* const collection, + const typename Collection::value_type& vt, + typename Collection::value_type::second_type* previous) { + std::pair ret = collection->insert(vt); + if (!ret.second) { + // update + if (previous) { + *previous = ret.first->second; + } + ret.first->second = vt.second; + return true; + } + return false; +} + +// Tries to insert the given key-value pair into the collection. Returns NULL if +// the insert succeeds. Otherwise, returns a pointer to the existing value. +// +// This complements UpdateReturnCopy in that it allows to update only after +// verifying the old value and still insert quickly without having to look up +// twice. Unlike UpdateReturnCopy this also does not come with the issue of an +// undefined previous* in case new data was inserted. +template +typename Collection::value_type::second_type* const +InsertOrReturnExisting(Collection* const collection, + const typename Collection::value_type& vt) { + std::pair ret = collection->insert(vt); + if (ret.second) { + return NULL; // Inserted, no existing previous value. + } else { + return &ret.first->second; // Return address of already existing value. + } +} + +// Same as above, except for explicit key and data. +template +typename Collection::value_type::second_type* const +InsertOrReturnExisting( + Collection* const collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& data) { + return InsertOrReturnExisting(collection, + typename Collection::value_type(key, data)); +} + +// Erases the collection item identified by the given key, and returns the value +// associated with that key. It is assumed that the value (i.e., the +// mapped_type) is a pointer. Returns NULL if the key was not found in the +// collection. +// +// Examples: +// map my_map; +// +// One line cleanup: +// delete EraseKeyReturnValuePtr(&my_map, "abc"); +// +// Use returned value: +// scoped_ptr value_ptr(EraseKeyReturnValuePtr(&my_map, "abc")); +// if (value_ptr.get()) +// value_ptr->DoSomething(); +// +template +typename Collection::value_type::second_type EraseKeyReturnValuePtr( + Collection* const collection, + const typename Collection::value_type::first_type& key) { + typename Collection::iterator it = collection->find(key); + if (it == collection->end()) { + return NULL; + } + typename Collection::value_type::second_type v = it->second; + collection->erase(it); + return v; +} + +// Inserts all the keys from map_container into key_container, which must +// support insert(MapContainer::key_type). +// +// Note: any initial contents of the key_container are not cleared. +template +void InsertKeysFromMap(const MapContainer& map_container, + KeyContainer* key_container) { + GOOGLE_CHECK(key_container != NULL); + for (typename MapContainer::const_iterator it = map_container.begin(); + it != map_container.end(); ++it) { + key_container->insert(it->first); + } +} + +// Appends all the keys from map_container into key_container, which must +// support push_back(MapContainer::key_type). +// +// Note: any initial contents of the key_container are not cleared. +template +void AppendKeysFromMap(const MapContainer& map_container, + KeyContainer* key_container) { + GOOGLE_CHECK(key_container != NULL); + for (typename MapContainer::const_iterator it = map_container.begin(); + it != map_container.end(); ++it) { + key_container->push_back(it->first); + } +} + +// A more specialized overload of AppendKeysFromMap to optimize reallocations +// for the common case in which we're appending keys to a vector and hence can +// (and sometimes should) call reserve() first. +// +// (It would be possible to play SFINAE games to call reserve() for any +// container that supports it, but this seems to get us 99% of what we need +// without the complexity of a SFINAE-based solution.) +template +void AppendKeysFromMap(const MapContainer& map_container, + vector* key_container) { + GOOGLE_CHECK(key_container != NULL); + // We now have the opportunity to call reserve(). Calling reserve() every + // time is a bad idea for some use cases: libstdc++'s implementation of + // vector<>::reserve() resizes the vector's backing store to exactly the + // given size (unless it's already at least that big). Because of this, + // the use case that involves appending a lot of small maps (total size + // N) one by one to a vector would be O(N^2). But never calling reserve() + // loses the opportunity to improve the use case of adding from a large + // map to an empty vector (this improves performance by up to 33%). A + // number of heuristics are possible; see the discussion in + // cl/34081696. Here we use the simplest one. + if (key_container->empty()) { + key_container->reserve(map_container.size()); + } + for (typename MapContainer::const_iterator it = map_container.begin(); + it != map_container.end(); ++it) { + key_container->push_back(it->first); + } +} + +// Inserts all the values from map_container into value_container, which must +// support push_back(MapContainer::mapped_type). +// +// Note: any initial contents of the value_container are not cleared. +template +void AppendValuesFromMap(const MapContainer& map_container, + ValueContainer* value_container) { + GOOGLE_CHECK(value_container != NULL); + for (typename MapContainer::const_iterator it = map_container.begin(); + it != map_container.end(); ++it) { + value_container->push_back(it->second); + } +} + +// A more specialized overload of AppendValuesFromMap to optimize reallocations +// for the common case in which we're appending values to a vector and hence +// can (and sometimes should) call reserve() first. +// +// (It would be possible to play SFINAE games to call reserve() for any +// container that supports it, but this seems to get us 99% of what we need +// without the complexity of a SFINAE-based solution.) +template +void AppendValuesFromMap(const MapContainer& map_container, + vector* value_container) { + GOOGLE_CHECK(value_container != NULL); + // See AppendKeysFromMap for why this is done. + if (value_container->empty()) { + value_container->reserve(map_container.size()); + } + for (typename MapContainer::const_iterator it = map_container.begin(); + it != map_container.end(); ++it) { + value_container->push_back(it->second); + } +} + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__ diff --git a/toolkit/components/protobuf/google/protobuf/stubs/once.cc b/toolkit/components/protobuf/src/google/protobuf/stubs/once.cc similarity index 56% rename from toolkit/components/protobuf/google/protobuf/stubs/once.cc rename to toolkit/components/protobuf/src/google/protobuf/stubs/once.cc index 5b7af9ce990f8..889c647660ded 100644 --- a/toolkit/components/protobuf/google/protobuf/stubs/once.cc +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/once.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -35,54 +35,65 @@ // This header is intended to be included only by internal .cc files and // generated .pb.cc files. Users should not use this directly. +#include + +#ifndef GOOGLE_PROTOBUF_NO_THREAD_SAFETY + #ifdef _WIN32 #include +#else +#include #endif -#include +#include namespace google { namespace protobuf { -#ifdef _WIN32 - -struct ProtobufOnceInternal { - ProtobufOnceInternal() { - InitializeCriticalSection(&critical_section); - } - ~ProtobufOnceInternal() { - DeleteCriticalSection(&critical_section); - } - CRITICAL_SECTION critical_section; -}; - -ProtobufOnceType::~ProtobufOnceType() -{ - delete internal_; - internal_ = NULL; -} +namespace { -ProtobufOnceType::ProtobufOnceType() { - // internal_ may be non-NULL if Init() was already called. - if (internal_ == NULL) internal_ = new ProtobufOnceInternal; +void SchedYield() { +#ifdef _WIN32 + Sleep(0); +#else // POSIX + sched_yield(); +#endif } -void ProtobufOnceType::Init(void (*init_func)()) { - // internal_ may be NULL if we're still in dynamic initialization and the - // constructor has not been called yet. As mentioned in once.h, we assume - // that the program is still single-threaded at this time, and therefore it - // should be safe to initialize internal_ like so. - if (internal_ == NULL) internal_ = new ProtobufOnceInternal; +} // namespace - EnterCriticalSection(&internal_->critical_section); - if (!initialized_) { - init_func(); - initialized_ = true; +void GoogleOnceInitImpl(ProtobufOnceType* once, Closure* closure) { + internal::AtomicWord state = internal::Acquire_Load(once); + // Fast path. The provided closure was already executed. + if (state == ONCE_STATE_DONE) { + return; + } + // The closure execution did not complete yet. The once object can be in one + // of the two following states: + // - UNINITIALIZED: We are the first thread calling this function. + // - EXECUTING_CLOSURE: Another thread is already executing the closure. + // + // First, try to change the state from UNINITIALIZED to EXECUTING_CLOSURE + // atomically. + state = internal::Acquire_CompareAndSwap( + once, ONCE_STATE_UNINITIALIZED, ONCE_STATE_EXECUTING_CLOSURE); + if (state == ONCE_STATE_UNINITIALIZED) { + // We are the first thread to call this function, so we have to call the + // closure. + closure->Run(); + internal::Release_Store(once, ONCE_STATE_DONE); + } else { + // Another thread has already started executing the closure. We need to + // wait until it completes the initialization. + while (state == ONCE_STATE_EXECUTING_CLOSURE) { + // Note that futex() could be used here on Linux as an improvement. + SchedYield(); + state = internal::Acquire_Load(once); + } } - LeaveCriticalSection(&internal_->critical_section); } -#endif - } // namespace protobuf } // namespace google + +#endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY diff --git a/toolkit/components/protobuf/google/protobuf/stubs/once.h b/toolkit/components/protobuf/src/google/protobuf/stubs/once.h similarity index 61% rename from toolkit/components/protobuf/google/protobuf/stubs/once.h rename to toolkit/components/protobuf/src/google/protobuf/stubs/once.h index 0dee407662be0..cc62bbaab38b7 100644 --- a/toolkit/components/protobuf/google/protobuf/stubs/once.h +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/once.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -37,16 +37,22 @@ // // This is basically a portable version of pthread_once(). // -// This header declares three things: +// This header declares: // * A type called ProtobufOnceType. // * A macro GOOGLE_PROTOBUF_DECLARE_ONCE() which declares a variable of type // ProtobufOnceType. This is the only legal way to declare such a variable. -// The macro may only be used at the global scope (you cannot create local -// or class member variables of this type). -// * A function GogoleOnceInit(ProtobufOnceType* once, void (*init_func)()). +// The macro may only be used at the global scope (you cannot create local or +// class member variables of this type). +// * A function GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()). // This function, when invoked multiple times given the same ProtobufOnceType // object, will invoke init_func on the first call only, and will make sure // none of the calls return before that first call to init_func has finished. +// * The user can provide a parameter which GoogleOnceInit() forwards to the +// user-provided function when it is called. Usage example: +// int a = 10; +// GoogleOnceInit(&my_once, &MyFunctionExpectingIntArgument, &a); +// * This implementation guarantees that ProtobufOnceType is a POD (i.e. no +// static initializer generated). // // This implements a way to perform lazy initialization. It's more efficient // than using mutexes as no lock is needed if initialization has already @@ -72,50 +78,87 @@ #ifndef GOOGLE_PROTOBUF_STUBS_ONCE_H__ #define GOOGLE_PROTOBUF_STUBS_ONCE_H__ +#include #include -#ifndef _WIN32 -#include -#endif - namespace google { namespace protobuf { -#ifdef _WIN32 - -struct ProtobufOnceInternal; +#ifdef GOOGLE_PROTOBUF_NO_THREAD_SAFETY -struct LIBPROTOBUF_EXPORT ProtobufOnceType { - ProtobufOnceType(); - ~ProtobufOnceType(); - void Init(void (*init_func)()); +typedef bool ProtobufOnceType; - volatile bool initialized_; - ProtobufOnceInternal* internal_; -}; - -#define GOOGLE_PROTOBUF_DECLARE_ONCE(NAME) \ - ::google::protobuf::ProtobufOnceType NAME +#define GOOGLE_PROTOBUF_ONCE_INIT false inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) { - // Note: Double-checked locking is safe on x86. - if (!once->initialized_) { - once->Init(init_func); + if (!*once) { + *once = true; + init_func(); + } +} + +template +inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)(Arg), + Arg arg) { + if (!*once) { + *once = true; + init_func(arg); } } #else -typedef pthread_once_t ProtobufOnceType; +enum { + ONCE_STATE_UNINITIALIZED = 0, + ONCE_STATE_EXECUTING_CLOSURE = 1, + ONCE_STATE_DONE = 2 +}; + +typedef internal::AtomicWord ProtobufOnceType; -#define GOOGLE_PROTOBUF_DECLARE_ONCE(NAME) \ - pthread_once_t NAME = PTHREAD_ONCE_INIT +#define GOOGLE_PROTOBUF_ONCE_INIT ::google::protobuf::ONCE_STATE_UNINITIALIZED + +LIBPROTOBUF_EXPORT +void GoogleOnceInitImpl(ProtobufOnceType* once, Closure* closure); inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) { - pthread_once(once, init_func); + if (internal::Acquire_Load(once) != ONCE_STATE_DONE) { + internal::FunctionClosure0 func(init_func, false); + GoogleOnceInitImpl(once, &func); + } +} + +template +inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)(Arg*), + Arg* arg) { + if (internal::Acquire_Load(once) != ONCE_STATE_DONE) { + internal::FunctionClosure1 func(init_func, false, arg); + GoogleOnceInitImpl(once, &func); + } } -#endif +#endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY + +class GoogleOnceDynamic { + public: + GoogleOnceDynamic() : state_(GOOGLE_PROTOBUF_ONCE_INIT) { } + + // If this->Init() has not been called before by any thread, + // execute (*func_with_arg)(arg) then return. + // Otherwise, wait until that prior invocation has finished + // executing its function, then return. + template + void Init(void (*func_with_arg)(T*), T* arg) { + GoogleOnceInit(&this->state_, + func_with_arg, + arg); + } + private: + ProtobufOnceType state_; +}; + +#define GOOGLE_PROTOBUF_DECLARE_ONCE(NAME) \ + ::google::protobuf::ProtobufOnceType NAME = GOOGLE_PROTOBUF_ONCE_INIT } // namespace protobuf } // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/platform_macros.h b/toolkit/components/protobuf/src/google/protobuf/stubs/platform_macros.h new file mode 100644 index 0000000000000..7956d076dcd52 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/platform_macros.h @@ -0,0 +1,103 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef GOOGLE_PROTOBUF_PLATFORM_MACROS_H_ +#define GOOGLE_PROTOBUF_PLATFORM_MACROS_H_ + +#include + +#define GOOGLE_PROTOBUF_PLATFORM_ERROR \ +#error "Host platform was not detected as supported by protobuf" + +// Processor architecture detection. For more info on what's defined, see: +// http://msdn.microsoft.com/en-us/library/b0084kay.aspx +// http://www.agner.org/optimize/calling_conventions.pdf +// or with gcc, run: "echo | gcc -E -dM -" +#if defined(_M_X64) || defined(__x86_64__) +#define GOOGLE_PROTOBUF_ARCH_X64 1 +#define GOOGLE_PROTOBUF_ARCH_64_BIT 1 +#elif defined(_M_IX86) || defined(__i386__) +#define GOOGLE_PROTOBUF_ARCH_IA32 1 +#define GOOGLE_PROTOBUF_ARCH_32_BIT 1 +#elif defined(__QNX__) +#define GOOGLE_PROTOBUF_ARCH_ARM_QNX 1 +#define GOOGLE_PROTOBUF_ARCH_32_BIT 1 +#elif defined(__ARMEL__) +#define GOOGLE_PROTOBUF_ARCH_ARM 1 +#define GOOGLE_PROTOBUF_ARCH_32_BIT 1 +#elif defined(__aarch64__) +#define GOOGLE_PROTOBUF_ARCH_AARCH64 1 +#define GOOGLE_PROTOBUF_ARCH_64_BIT 1 +#elif defined(__MIPSEL__) +#if defined(__LP64__) +#define GOOGLE_PROTOBUF_ARCH_MIPS64 1 +#define GOOGLE_PROTOBUF_ARCH_64_BIT 1 +#else +#define GOOGLE_PROTOBUF_ARCH_MIPS 1 +#define GOOGLE_PROTOBUF_ARCH_32_BIT 1 +#endif +#elif defined(__pnacl__) +#define GOOGLE_PROTOBUF_ARCH_32_BIT 1 +#elif defined(sparc) +#define GOOGLE_PROTOBUF_ARCH_SPARC 1 +#ifdef SOLARIS_64BIT_ENABLED +#define GOOGLE_PROTOBUF_ARCH_64_BIT 1 +#else +#define GOOGLE_PROTOBUF_ARCH_32_BIT 1 +#endif +#elif defined(__GNUC__) +# if (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4)) +// We fallback to the generic Clang/GCC >= 4.7 implementation in atomicops.h +# elif defined(__clang__) +# if !__has_extension(c_atomic) +GOOGLE_PROTOBUF_PLATFORM_ERROR +# endif +// We fallback to the generic Clang/GCC >= 4.7 implementation in atomicops.h +# endif +# if __LP64__ +# define GOOGLE_PROTOBUF_ARCH_64_BIT 1 +# else +# define GOOGLE_PROTOBUF_ARCH_32_BIT 1 +# endif +#else +GOOGLE_PROTOBUF_PLATFORM_ERROR +#endif + +#if defined(__APPLE__) +#define GOOGLE_PROTOBUF_OS_APPLE +#elif defined(__native_client__) +#define GOOGLE_PROTOBUF_OS_NACL +#elif defined(sun) +#define GOOGLE_PROTOBUF_OS_SOLARIS +#endif + +#undef GOOGLE_PROTOBUF_PLATFORM_ERROR + +#endif // GOOGLE_PROTOBUF_PLATFORM_MACROS_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/shared_ptr.h b/toolkit/components/protobuf/src/google/protobuf/stubs/shared_ptr.h new file mode 100644 index 0000000000000..d250bf4d33850 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/shared_ptr.h @@ -0,0 +1,470 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2014 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/util/gtl/shared_ptr.h + +#ifndef GOOGLE_PROTOBUF_STUBS_SHARED_PTR_H__ +#define GOOGLE_PROTOBUF_STUBS_SHARED_PTR_H__ + +#include + +#include // for swap +#include +#include + +namespace google { +namespace protobuf { +namespace internal { + +// Alias to std::shared_ptr for any C++11 platform, +// and for any supported MSVC compiler. +#if !defined(UTIL_GTL_USE_STD_SHARED_PTR) && \ + (defined(COMPILER_MSVC) || defined(LANG_CXX11)) +#define UTIL_GTL_USE_STD_SHARED_PTR 1 +#endif + +#if defined(UTIL_GTL_USE_STD_SHARED_PTR) && UTIL_GTL_USE_STD_SHARED_PTR + +// These are transitional. They will be going away soon. +// Please just #include and just type std::shared_ptr yourself, instead +// of relying on this file. +// +// Migration doc: http://go/std-shared-ptr-lsc +using std::enable_shared_from_this; +using std::shared_ptr; +using std::static_pointer_cast; +using std::weak_ptr; + +#else // below, UTIL_GTL_USE_STD_SHARED_PTR not set or set to 0. + +// For everything else there is the google3 implementation. +inline bool RefCountDec(volatile Atomic32 *ptr) { + return Barrier_AtomicIncrement(ptr, -1) != 0; +} + +inline void RefCountInc(volatile Atomic32 *ptr) { + NoBarrier_AtomicIncrement(ptr, 1); +} + +template class shared_ptr; +template class weak_ptr; + +// This class is an internal implementation detail for shared_ptr. If two +// shared_ptrs point to the same object, they also share a control block. +// An "empty" shared_pointer refers to NULL and also has a NULL control block. +// It contains all of the state that's needed for reference counting or any +// other kind of resource management. In this implementation the control block +// happens to consist of two atomic words, the reference count (the number +// of shared_ptrs that share ownership of the object) and the weak count +// (the number of weak_ptrs that observe the object, plus 1 if the +// refcount is nonzero). +// +// The "plus 1" is to prevent a race condition in the shared_ptr and +// weak_ptr destructors. We need to make sure the control block is +// only deleted once, so we need to make sure that at most one +// object sees the weak count decremented from 1 to 0. +class SharedPtrControlBlock { + template friend class shared_ptr; + template friend class weak_ptr; + private: + SharedPtrControlBlock() : refcount_(1), weak_count_(1) { } + Atomic32 refcount_; + Atomic32 weak_count_; +}; + +// Forward declaration. The class is defined below. +template class enable_shared_from_this; + +template +class shared_ptr { + template friend class weak_ptr; + public: + typedef T element_type; + + shared_ptr() : ptr_(NULL), control_block_(NULL) {} + + explicit shared_ptr(T* ptr) + : ptr_(ptr), + control_block_(ptr != NULL ? new SharedPtrControlBlock : NULL) { + // If p is non-null and T inherits from enable_shared_from_this, we + // set up the data that shared_from_this needs. + MaybeSetupWeakThis(ptr); + } + + // Copy constructor: makes this object a copy of ptr, and increments + // the reference count. + template + shared_ptr(const shared_ptr& ptr) + : ptr_(NULL), + control_block_(NULL) { + Initialize(ptr); + } + // Need non-templated version to prevent the compiler-generated default + shared_ptr(const shared_ptr& ptr) + : ptr_(NULL), + control_block_(NULL) { + Initialize(ptr); + } + + // Assignment operator. Replaces the existing shared_ptr with ptr. + // Increment ptr's reference count and decrement the one being replaced. + template + shared_ptr& operator=(const shared_ptr& ptr) { + if (ptr_ != ptr.ptr_) { + shared_ptr me(ptr); // will hold our previous state to be destroyed. + swap(me); + } + return *this; + } + + // Need non-templated version to prevent the compiler-generated default + shared_ptr& operator=(const shared_ptr& ptr) { + if (ptr_ != ptr.ptr_) { + shared_ptr me(ptr); // will hold our previous state to be destroyed. + swap(me); + } + return *this; + } + + // TODO(austern): Consider providing this constructor. The draft C++ standard + // (20.8.10.2.1) includes it. However, it says that this constructor throws + // a bad_weak_ptr exception when ptr is expired. Is it better to provide this + // constructor and make it do something else, like fail with a CHECK, or to + // leave this constructor out entirely? + // + // template + // shared_ptr(const weak_ptr& ptr); + + ~shared_ptr() { + if (ptr_ != NULL) { + if (!RefCountDec(&control_block_->refcount_)) { + delete ptr_; + + // weak_count_ is defined as the number of weak_ptrs that observe + // ptr_, plus 1 if refcount_ is nonzero. + if (!RefCountDec(&control_block_->weak_count_)) { + delete control_block_; + } + } + } + } + + // Replaces underlying raw pointer with the one passed in. The reference + // count is set to one (or zero if the pointer is NULL) for the pointer + // being passed in and decremented for the one being replaced. + // + // If you have a compilation error with this code, make sure you aren't + // passing NULL, nullptr, or 0 to this function. Call reset without an + // argument to reset to a null ptr. + template + void reset(Y* p) { + if (p != ptr_) { + shared_ptr tmp(p); + tmp.swap(*this); + } + } + + void reset() { + reset(static_cast(NULL)); + } + + // Exchanges the contents of this with the contents of r. This function + // supports more efficient swapping since it eliminates the need for a + // temporary shared_ptr object. + void swap(shared_ptr& r) { + using std::swap; // http://go/using-std-swap + swap(ptr_, r.ptr_); + swap(control_block_, r.control_block_); + } + + // The following function is useful for gaining access to the underlying + // pointer when a shared_ptr remains in scope so the reference-count is + // known to be > 0 (e.g. for parameter passing). + T* get() const { + return ptr_; + } + + T& operator*() const { + return *ptr_; + } + + T* operator->() const { + return ptr_; + } + + long use_count() const { + return control_block_ ? control_block_->refcount_ : 1; + } + + bool unique() const { + return use_count() == 1; + } + + private: + // If r is non-empty, initialize *this to share ownership with r, + // increasing the underlying reference count. + // If r is empty, *this remains empty. + // Requires: this is empty, namely this->ptr_ == NULL. + template + void Initialize(const shared_ptr& r) { + // This performs a static_cast on r.ptr_ to U*, which is a no-op since it + // is already a U*. So initialization here requires that r.ptr_ is + // implicitly convertible to T*. + InitializeWithStaticCast(r); + } + + // Initializes *this as described in Initialize, but additionally performs a + // static_cast from r.ptr_ (V*) to U*. + // NOTE(gfc): We'd need a more general form to support const_pointer_cast and + // dynamic_pointer_cast, but those operations are sufficiently discouraged + // that supporting static_pointer_cast is sufficient. + template + void InitializeWithStaticCast(const shared_ptr& r) { + if (r.control_block_ != NULL) { + RefCountInc(&r.control_block_->refcount_); + + ptr_ = static_cast(r.ptr_); + control_block_ = r.control_block_; + } + } + + // Helper function for the constructor that takes a raw pointer. If T + // doesn't inherit from enable_shared_from_this then we have nothing to + // do, so this function is trivial and inline. The other version is declared + // out of line, after the class definition of enable_shared_from_this. + void MaybeSetupWeakThis(enable_shared_from_this* ptr); + void MaybeSetupWeakThis(...) { } + + T* ptr_; + SharedPtrControlBlock* control_block_; + +#ifndef SWIG + template + friend class shared_ptr; + + template + friend shared_ptr static_pointer_cast(const shared_ptr& rhs); +#endif +}; + +// Matches the interface of std::swap as an aid to generic programming. +template void swap(shared_ptr& r, shared_ptr& s) { + r.swap(s); +} + +template +shared_ptr static_pointer_cast(const shared_ptr& rhs) { + shared_ptr lhs; + lhs.template InitializeWithStaticCast(rhs); + return lhs; +} + +// See comments at the top of the file for a description of why this +// class exists, and the draft C++ standard (as of July 2009 the +// latest draft is N2914) for the detailed specification. +template +class weak_ptr { + template friend class weak_ptr; + public: + typedef T element_type; + + // Create an empty (i.e. already expired) weak_ptr. + weak_ptr() : ptr_(NULL), control_block_(NULL) { } + + // Create a weak_ptr that observes the same object that ptr points + // to. Note that there is no race condition here: we know that the + // control block can't disappear while we're looking at it because + // it is owned by at least one shared_ptr, ptr. + template weak_ptr(const shared_ptr& ptr) { + CopyFrom(ptr.ptr_, ptr.control_block_); + } + + // Copy a weak_ptr. The object it points to might disappear, but we + // don't care: we're only working with the control block, and it can't + // disappear while we're looking at because it's owned by at least one + // weak_ptr, ptr. + template weak_ptr(const weak_ptr& ptr) { + CopyFrom(ptr.ptr_, ptr.control_block_); + } + + // Need non-templated version to prevent default copy constructor + weak_ptr(const weak_ptr& ptr) { + CopyFrom(ptr.ptr_, ptr.control_block_); + } + + // Destroy the weak_ptr. If no shared_ptr owns the control block, and if + // we are the last weak_ptr to own it, then it can be deleted. Note that + // weak_count_ is defined as the number of weak_ptrs sharing this control + // block, plus 1 if there are any shared_ptrs. We therefore know that it's + // safe to delete the control block when weak_count_ reaches 0, without + // having to perform any additional tests. + ~weak_ptr() { + if (control_block_ != NULL && + !RefCountDec(&control_block_->weak_count_)) { + delete control_block_; + } + } + + weak_ptr& operator=(const weak_ptr& ptr) { + if (&ptr != this) { + weak_ptr tmp(ptr); + tmp.swap(*this); + } + return *this; + } + template weak_ptr& operator=(const weak_ptr& ptr) { + weak_ptr tmp(ptr); + tmp.swap(*this); + return *this; + } + template weak_ptr& operator=(const shared_ptr& ptr) { + weak_ptr tmp(ptr); + tmp.swap(*this); + return *this; + } + + void swap(weak_ptr& ptr) { + using std::swap; // http://go/using-std-swap + swap(ptr_, ptr.ptr_); + swap(control_block_, ptr.control_block_); + } + + void reset() { + weak_ptr tmp; + tmp.swap(*this); + } + + // Return the number of shared_ptrs that own the object we are observing. + // Note that this number can be 0 (if this pointer has expired). + long use_count() const { + return control_block_ != NULL ? control_block_->refcount_ : 0; + } + + bool expired() const { return use_count() == 0; } + + // Return a shared_ptr that owns the object we are observing. If we + // have expired, the shared_ptr will be empty. We have to be careful + // about concurrency, though, since some other thread might be + // destroying the last owning shared_ptr while we're in this + // function. We want to increment the refcount only if it's nonzero + // and get the new value, and we want that whole operation to be + // atomic. + shared_ptr lock() const { + shared_ptr result; + if (control_block_ != NULL) { + Atomic32 old_refcount; + do { + old_refcount = control_block_->refcount_; + if (old_refcount == 0) + break; + } while (old_refcount != + NoBarrier_CompareAndSwap( + &control_block_->refcount_, old_refcount, + old_refcount + 1)); + if (old_refcount > 0) { + result.ptr_ = ptr_; + result.control_block_ = control_block_; + } + } + + return result; + } + + private: + void CopyFrom(T* ptr, SharedPtrControlBlock* control_block) { + ptr_ = ptr; + control_block_ = control_block; + if (control_block_ != NULL) + RefCountInc(&control_block_->weak_count_); + } + + private: + element_type* ptr_; + SharedPtrControlBlock* control_block_; +}; + +template void swap(weak_ptr& r, weak_ptr& s) { + r.swap(s); +} + +// See comments at the top of the file for a description of why this class +// exists, and section 20.8.10.5 of the draft C++ standard (as of July 2009 +// the latest draft is N2914) for the detailed specification. +template +class enable_shared_from_this { + friend class shared_ptr; + public: + // Precondition: there must be a shared_ptr that owns *this and that was + // created, directly or indirectly, from a raw pointer of type T*. (The + // latter part of the condition is technical but not quite redundant; it + // rules out some complicated uses involving inheritance hierarchies.) + shared_ptr shared_from_this() { + // Behavior is undefined if the precondition isn't satisfied; we choose + // to die with a CHECK failure. + CHECK(!weak_this_.expired()) << "No shared_ptr owns this object"; + return weak_this_.lock(); + } + shared_ptr shared_from_this() const { + CHECK(!weak_this_.expired()) << "No shared_ptr owns this object"; + return weak_this_.lock(); + } + + protected: + enable_shared_from_this() { } + enable_shared_from_this(const enable_shared_from_this& other) { } + enable_shared_from_this& operator=(const enable_shared_from_this& other) { + return *this; + } + ~enable_shared_from_this() { } + + private: + weak_ptr weak_this_; +}; + +// This is a helper function called by shared_ptr's constructor from a raw +// pointer. If T inherits from enable_shared_from_this, it sets up +// weak_this_ so that shared_from_this works correctly. If T does not inherit +// from weak_this we get a different overload, defined inline, which does +// nothing. +template +void shared_ptr::MaybeSetupWeakThis(enable_shared_from_this* ptr) { + if (ptr) { + CHECK(ptr->weak_this_.expired()) << "Object already owned by a shared_ptr"; + ptr->weak_this_ = *this; + } +} + +#endif // UTIL_GTL_USE_STD_SHARED_PTR + +} // internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_SHARED_PTR_H__ diff --git a/toolkit/components/protobuf/google/protobuf/stubs/stl_util-inl.h b/toolkit/components/protobuf/src/google/protobuf/stubs/stl_util.h similarity index 95% rename from toolkit/components/protobuf/google/protobuf/stubs/stl_util-inl.h rename to toolkit/components/protobuf/src/google/protobuf/stubs/stl_util.h index a2e671bb74612..9e4c82a4c3be3 100644 --- a/toolkit/components/protobuf/google/protobuf/stubs/stl_util-inl.h +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/stl_util.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -28,10 +28,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// from google3/util/gtl/stl_util-inl.h +// from google3/util/gtl/stl_util.h -#ifndef GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__ -#define GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__ +#ifndef GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__ +#define GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__ #include @@ -118,4 +118,4 @@ void STLDeleteValues(T *v) { } // namespace protobuf } // namespace google -#endif // GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__ +#endif // GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.cc b/toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.cc new file mode 100644 index 0000000000000..83fdfe454e903 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.cc @@ -0,0 +1,174 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/base/stringprintf.cc + +#include + +#include +#include // For va_list and related operations +#include // MSVC requires this for _vsnprintf +#include +#include + +namespace google { +namespace protobuf { + +#ifdef _MSC_VER +enum { IS_COMPILER_MSVC = 1 }; +#ifndef va_copy +// Define va_copy for MSVC. This is a hack, assuming va_list is simply a +// pointer into the stack and is safe to copy. +#define va_copy(dest, src) ((dest) = (src)) +#endif +#else +enum { IS_COMPILER_MSVC = 0 }; +#endif + +void StringAppendV(string* dst, const char* format, va_list ap) { + // First try with a small fixed size buffer + static const int kSpaceLength = 1024; + char space[kSpaceLength]; + + // It's possible for methods that use a va_list to invalidate + // the data in it upon use. The fix is to make a copy + // of the structure before using it and use that copy instead. + va_list backup_ap; + va_copy(backup_ap, ap); + int result = vsnprintf(space, kSpaceLength, format, backup_ap); + va_end(backup_ap); + + if (result < kSpaceLength) { + if (result >= 0) { + // Normal case -- everything fit. + dst->append(space, result); + return; + } + + if (IS_COMPILER_MSVC) { + // Error or MSVC running out of space. MSVC 8.0 and higher + // can be asked about space needed with the special idiom below: + va_copy(backup_ap, ap); + result = vsnprintf(NULL, 0, format, backup_ap); + va_end(backup_ap); + } + + if (result < 0) { + // Just an error. + return; + } + } + + // Increase the buffer size to the size requested by vsnprintf, + // plus one for the closing \0. + int length = result+1; + char* buf = new char[length]; + + // Restore the va_list before we use it again + va_copy(backup_ap, ap); + result = vsnprintf(buf, length, format, backup_ap); + va_end(backup_ap); + + if (result >= 0 && result < length) { + // It fit + dst->append(buf, result); + } + delete[] buf; +} + + +string StringPrintf(const char* format, ...) { + va_list ap; + va_start(ap, format); + string result; + StringAppendV(&result, format, ap); + va_end(ap); + return result; +} + +const string& SStringPrintf(string* dst, const char* format, ...) { + va_list ap; + va_start(ap, format); + dst->clear(); + StringAppendV(dst, format, ap); + va_end(ap); + return *dst; +} + +void StringAppendF(string* dst, const char* format, ...) { + va_list ap; + va_start(ap, format); + StringAppendV(dst, format, ap); + va_end(ap); +} + +// Max arguments supported by StringPrintVector +const int kStringPrintfVectorMaxArgs = 32; + +// An empty block of zero for filler arguments. This is const so that if +// printf tries to write to it (via %n) then the program gets a SIGSEGV +// and we can fix the problem or protect against an attack. +static const char string_printf_empty_block[256] = { '\0' }; + +string StringPrintfVector(const char* format, const vector& v) { + GOOGLE_CHECK_LE(v.size(), kStringPrintfVectorMaxArgs) + << "StringPrintfVector currently only supports up to " + << kStringPrintfVectorMaxArgs << " arguments. " + << "Feel free to add support for more if you need it."; + + // Add filler arguments so that bogus format+args have a harder time + // crashing the program, corrupting the program (%n), + // or displaying random chunks of memory to users. + + const char* cstr[kStringPrintfVectorMaxArgs]; + for (int i = 0; i < v.size(); ++i) { + cstr[i] = v[i].c_str(); + } + for (int i = v.size(); i < GOOGLE_ARRAYSIZE(cstr); ++i) { + cstr[i] = &string_printf_empty_block[0]; + } + + // I do not know any way to pass kStringPrintfVectorMaxArgs arguments, + // or any way to build a va_list by hand, or any API for printf + // that accepts an array of arguments. The best I can do is stick + // this COMPILE_ASSERT right next to the actual statement. + + GOOGLE_COMPILE_ASSERT(kStringPrintfVectorMaxArgs == 32, arg_count_mismatch); + return StringPrintf(format, + cstr[0], cstr[1], cstr[2], cstr[3], cstr[4], + cstr[5], cstr[6], cstr[7], cstr[8], cstr[9], + cstr[10], cstr[11], cstr[12], cstr[13], cstr[14], + cstr[15], cstr[16], cstr[17], cstr[18], cstr[19], + cstr[20], cstr[21], cstr[22], cstr[23], cstr[24], + cstr[25], cstr[26], cstr[27], cstr[28], cstr[29], + cstr[30], cstr[31]); +} +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.h b/toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.h new file mode 100644 index 0000000000000..ab1ab558329e4 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/stringprintf.h @@ -0,0 +1,76 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2012 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/base/stringprintf.h +// +// Printf variants that place their output in a C++ string. +// +// Usage: +// string result = StringPrintf("%d %s\n", 10, "hello"); +// SStringPrintf(&result, "%d %s\n", 10, "hello"); +// StringAppendF(&result, "%d %s\n", 20, "there"); + +#ifndef GOOGLE_PROTOBUF_STUBS_STRINGPRINTF_H +#define GOOGLE_PROTOBUF_STUBS_STRINGPRINTF_H + +#include +#include +#include + +#include + +namespace google { +namespace protobuf { + +// Return a C++ string +LIBPROTOBUF_EXPORT extern string StringPrintf(const char* format, ...); + +// Store result into a supplied string and return it +LIBPROTOBUF_EXPORT extern const string& SStringPrintf(string* dst, const char* format, ...); + +// Append result to a supplied string +LIBPROTOBUF_EXPORT extern void StringAppendF(string* dst, const char* format, ...); + +// Lower-level routine that takes a va_list and appends to a specified +// string. All other routines are just convenience wrappers around it. +LIBPROTOBUF_EXPORT extern void StringAppendV(string* dst, const char* format, va_list ap); + +// The max arguments supported by StringPrintfVector +LIBPROTOBUF_EXPORT extern const int kStringPrintfVectorMaxArgs; + +// You can use this version when all your arguments are strings, but +// you don't know how many arguments you'll have at compile time. +// StringPrintfVector will LOG(FATAL) if v.size() > kStringPrintfVectorMaxArgs +LIBPROTOBUF_EXPORT extern string StringPrintfVector(const char* format, const vector& v); + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_STRINGPRINTF_H diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/structurally_valid.cc b/toolkit/components/protobuf/src/google/protobuf/stubs/structurally_valid.cc new file mode 100644 index 0000000000000..0f6afe6dc8e11 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/structurally_valid.cc @@ -0,0 +1,536 @@ +// Copyright 2005-2008 Google Inc. All Rights Reserved. +// Author: jrm@google.com (Jim Meehan) + +#include + +namespace google { +namespace protobuf { +namespace internal { + +// These four-byte entries compactly encode how many bytes 0..255 to delete +// in making a string replacement, how many bytes to add 0..255, and the offset +// 0..64k-1 of the replacement string in remap_string. +struct RemapEntry { + uint8 delete_bytes; + uint8 add_bytes; + uint16 bytes_offset; +}; + +// Exit type codes for state tables. All but the first get stuffed into +// signed one-byte entries. The first is only generated by executable code. +// To distinguish from next-state entries, these must be contiguous and +// all <= kExitNone +typedef enum { + kExitDstSpaceFull = 239, + kExitIllegalStructure, // 240 + kExitOK, // 241 + kExitReject, // ... + kExitReplace1, + kExitReplace2, + kExitReplace3, + kExitReplace21, + kExitReplace31, + kExitReplace32, + kExitReplaceOffset1, + kExitReplaceOffset2, + kExitReplace1S0, + kExitSpecial, + kExitDoAgain, + kExitRejectAlt, + kExitNone // 255 +} ExitReason; + + +// This struct represents one entire state table. The three initialized byte +// areas are state_table, remap_base, and remap_string. state0 and state0_size +// give the byte offset and length within state_table of the initial state -- +// table lookups are expected to start and end in this state, but for +// truncated UTF-8 strings, may end in a different state. These allow a quick +// test for that condition. entry_shift is 8 for tables subscripted by a full +// byte value and 6 for space-optimized tables subscripted by only six +// significant bits in UTF-8 continuation bytes. +typedef struct { + const uint32 state0; + const uint32 state0_size; + const uint32 total_size; + const int max_expand; + const int entry_shift; + const int bytes_per_entry; + const uint32 losub; + const uint32 hiadd; + const uint8* state_table; + const RemapEntry* remap_base; + const uint8* remap_string; + const uint8* fast_state; +} UTF8StateMachineObj; + +typedef UTF8StateMachineObj UTF8ScanObj; + +#define X__ (kExitIllegalStructure) +#define RJ_ (kExitReject) +#define S1_ (kExitReplace1) +#define S2_ (kExitReplace2) +#define S3_ (kExitReplace3) +#define S21 (kExitReplace21) +#define S31 (kExitReplace31) +#define S32 (kExitReplace32) +#define T1_ (kExitReplaceOffset1) +#define T2_ (kExitReplaceOffset2) +#define S11 (kExitReplace1S0) +#define SP_ (kExitSpecial) +#define D__ (kExitDoAgain) +#define RJA (kExitRejectAlt) + +// Entire table has 9 state blocks of 256 entries each +static const unsigned int utf8acceptnonsurrogates_STATE0 = 0; // state[0] +static const unsigned int utf8acceptnonsurrogates_STATE0_SIZE = 256; // =[1] +static const unsigned int utf8acceptnonsurrogates_TOTAL_SIZE = 2304; +static const unsigned int utf8acceptnonsurrogates_MAX_EXPAND_X4 = 0; +static const unsigned int utf8acceptnonsurrogates_SHIFT = 8; +static const unsigned int utf8acceptnonsurrogates_BYTES = 1; +static const unsigned int utf8acceptnonsurrogates_LOSUB = 0x20202020; +static const unsigned int utf8acceptnonsurrogates_HIADD = 0x00000000; + +static const uint8 utf8acceptnonsurrogates[] = { +// state[0] 0x000000 Byte 1 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, + 4, 5, 5, 5, 6, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[1] 0x000080 Byte 2 of 2 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[2] 0x000000 Byte 2 of 3 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[3] 0x001000 Byte 2 of 3 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[4] 0x000000 Byte 2 of 4 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[5] 0x040000 Byte 2 of 4 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[6] 0x100000 Byte 2 of 4 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[7] 0x00d000 Byte 2 of 3 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[8] 0x00d800 Byte 3 of 3 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, +RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, +RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, +RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +}; + +// Remap base[0] = (del, add, string_offset) +static const RemapEntry utf8acceptnonsurrogates_remap_base[] = { +{0, 0, 0} }; + +// Remap string[0] +static const unsigned char utf8acceptnonsurrogates_remap_string[] = { +0 }; + +static const unsigned char utf8acceptnonsurrogates_fast[256] = { +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; + +static const UTF8ScanObj utf8acceptnonsurrogates_obj = { + utf8acceptnonsurrogates_STATE0, + utf8acceptnonsurrogates_STATE0_SIZE, + utf8acceptnonsurrogates_TOTAL_SIZE, + utf8acceptnonsurrogates_MAX_EXPAND_X4, + utf8acceptnonsurrogates_SHIFT, + utf8acceptnonsurrogates_BYTES, + utf8acceptnonsurrogates_LOSUB, + utf8acceptnonsurrogates_HIADD, + utf8acceptnonsurrogates, + utf8acceptnonsurrogates_remap_base, + utf8acceptnonsurrogates_remap_string, + utf8acceptnonsurrogates_fast +}; + + +#undef X__ +#undef RJ_ +#undef S1_ +#undef S2_ +#undef S3_ +#undef S21 +#undef S31 +#undef S32 +#undef T1_ +#undef T2_ +#undef S11 +#undef SP_ +#undef D__ +#undef RJA + +// Return true if current Tbl pointer is within state0 range +// Note that unsigned compare checks both ends of range simultaneously +static inline bool InStateZero(const UTF8ScanObj* st, const uint8* Tbl) { + const uint8* Tbl0 = &st->state_table[st->state0]; + return (static_cast(Tbl - Tbl0) < st->state0_size); +} + +// Scan a UTF-8 string based on state table. +// Always scan complete UTF-8 characters +// Set number of bytes scanned. Return reason for exiting +int UTF8GenericScan(const UTF8ScanObj* st, + const char * str, + int str_length, + int* bytes_consumed) { + *bytes_consumed = 0; + if (str_length == 0) return kExitOK; + + int eshift = st->entry_shift; + const uint8* isrc = reinterpret_cast(str); + const uint8* src = isrc; + const uint8* srclimit = isrc + str_length; + const uint8* srclimit8 = srclimit - 7; + const uint8* Tbl_0 = &st->state_table[st->state0]; + + DoAgain: + // Do state-table scan + int e = 0; + uint8 c; + const uint8* Tbl2 = &st->fast_state[0]; + const uint32 losub = st->losub; + const uint32 hiadd = st->hiadd; + // Check initial few bytes one at a time until 8-byte aligned + //---------------------------- + while ((((uintptr_t)src & 0x07) != 0) && + (src < srclimit) && + Tbl2[src[0]] == 0) { + src++; + } + if (((uintptr_t)src & 0x07) == 0) { + // Do fast for groups of 8 identity bytes. + // This covers a lot of 7-bit ASCII ~8x faster then the 1-byte loop, + // including slowing slightly on cr/lf/ht + //---------------------------- + while (src < srclimit8) { + uint32 s0123 = (reinterpret_cast(src))[0]; + uint32 s4567 = (reinterpret_cast(src))[1]; + src += 8; + // This is a fast range check for all bytes in [lowsub..0x80-hiadd) + uint32 temp = (s0123 - losub) | (s0123 + hiadd) | + (s4567 - losub) | (s4567 + hiadd); + if ((temp & 0x80808080) != 0) { + // We typically end up here on cr/lf/ht; src was incremented + int e0123 = (Tbl2[src[-8]] | Tbl2[src[-7]]) | + (Tbl2[src[-6]] | Tbl2[src[-5]]); + if (e0123 != 0) { + src -= 8; + break; + } // Exit on Non-interchange + e0123 = (Tbl2[src[-4]] | Tbl2[src[-3]]) | + (Tbl2[src[-2]] | Tbl2[src[-1]]); + if (e0123 != 0) { + src -= 4; + break; + } // Exit on Non-interchange + // Else OK, go around again + } + } + } + //---------------------------- + + // Byte-at-a-time scan + //---------------------------- + const uint8* Tbl = Tbl_0; + while (src < srclimit) { + c = *src; + e = Tbl[c]; + src++; + if (e >= kExitIllegalStructure) {break;} + Tbl = &Tbl_0[e << eshift]; + } + //---------------------------- + + + // Exit posibilities: + // Some exit code, !state0, back up over last char + // Some exit code, state0, back up one byte exactly + // source consumed, !state0, back up over partial char + // source consumed, state0, exit OK + // For illegal byte in state0, avoid backup up over PREVIOUS char + // For truncated last char, back up to beginning of it + + if (e >= kExitIllegalStructure) { + // Back up over exactly one byte of rejected/illegal UTF-8 character + src--; + // Back up more if needed + if (!InStateZero(st, Tbl)) { + do { + src--; + } while ((src > isrc) && ((src[0] & 0xc0) == 0x80)); + } + } else if (!InStateZero(st, Tbl)) { + // Back up over truncated UTF-8 character + e = kExitIllegalStructure; + do { + src--; + } while ((src > isrc) && ((src[0] & 0xc0) == 0x80)); + } else { + // Normal termination, source fully consumed + e = kExitOK; + } + + if (e == kExitDoAgain) { + // Loop back up to the fast scan + goto DoAgain; + } + + *bytes_consumed = src - isrc; + return e; +} + +int UTF8GenericScanFastAscii(const UTF8ScanObj* st, + const char * str, + int str_length, + int* bytes_consumed) { + *bytes_consumed = 0; + if (str_length == 0) return kExitOK; + + const uint8* isrc = reinterpret_cast(str); + const uint8* src = isrc; + const uint8* srclimit = isrc + str_length; + const uint8* srclimit8 = srclimit - 7; + int n; + int rest_consumed; + int exit_reason; + do { + // Check initial few bytes one at a time until 8-byte aligned + while ((((uintptr_t)src & 0x07) != 0) && + (src < srclimit) && (src[0] < 0x80)) { + src++; + } + if (((uintptr_t)src & 0x07) == 0) { + while ((src < srclimit8) && + (((reinterpret_cast(src)[0] | + reinterpret_cast(src)[1]) & 0x80808080) == 0)) { + src += 8; + } + } + while ((src < srclimit) && (src[0] < 0x80)) { + src++; + } + // Run state table on the rest + n = src - isrc; + exit_reason = UTF8GenericScan(st, str + n, str_length - n, &rest_consumed); + src += rest_consumed; + } while ( exit_reason == kExitDoAgain ); + + *bytes_consumed = src - isrc; + return exit_reason; +} + +// Hack: On some compilers the static tables are initialized at startup. +// We can't use them until they are initialized. However, some Protocol +// Buffer parsing happens at static init time and may try to validate +// UTF-8 strings. Since UTF-8 validation is only used for debugging +// anyway, we simply always return success if initialization hasn't +// occurred yet. +namespace { + +bool module_initialized_ = false; + +struct InitDetector { + InitDetector() { + module_initialized_ = true; + } +}; +InitDetector init_detector; + +} // namespace + +bool IsStructurallyValidUTF8(const char* buf, int len) { + if (!module_initialized_) return true; + + int bytes_consumed = 0; + UTF8GenericScanFastAscii(&utf8acceptnonsurrogates_obj, + buf, len, &bytes_consumed); + return (bytes_consumed == len); +} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.cc b/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.cc new file mode 100644 index 0000000000000..d7f673d10ad78 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.cc @@ -0,0 +1,1280 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/strings/strutil.cc + +#include +#include +#include // FLT_DIG and DBL_DIG +#include +#include +#include +#include + +#include "mozilla/FloatingPoint.h" + +#ifdef _WIN32 +// MSVC has only _snprintf, not snprintf. +// +// MinGW has both snprintf and _snprintf, but they appear to be different +// functions. The former is buggy. When invoked like so: +// char buffer[32]; +// snprintf(buffer, 32, "%.*g\n", FLT_DIG, 1.23e10f); +// it prints "1.23000e+10". This is plainly wrong: %g should never print +// trailing zeros after the decimal point. For some reason this bug only +// occurs with some input values, not all. In any case, _snprintf does the +// right thing, so we use it. +#define snprintf _snprintf +#endif + +namespace google { +namespace protobuf { + +inline bool IsNaN(double value) { + return ::mozilla::IsNaN(value); +} + +// These are defined as macros on some platforms. #undef them so that we can +// redefine them. +#undef isxdigit +#undef isprint + +// The definitions of these in ctype.h change based on locale. Since our +// string manipulation is all in relation to the protocol buffer and C++ +// languages, we always want to use the C locale. So, we re-define these +// exactly as we want them. +inline bool isxdigit(char c) { + return ('0' <= c && c <= '9') || + ('a' <= c && c <= 'f') || + ('A' <= c && c <= 'F'); +} + +inline bool isprint(char c) { + return c >= 0x20 && c <= 0x7E; +} + +// ---------------------------------------------------------------------- +// StripString +// Replaces any occurrence of the character 'remove' (or the characters +// in 'remove') with the character 'replacewith'. +// ---------------------------------------------------------------------- +void StripString(string* s, const char* remove, char replacewith) { + const char * str_start = s->c_str(); + const char * str = str_start; + for (str = strpbrk(str, remove); + str != NULL; + str = strpbrk(str + 1, remove)) { + (*s)[str - str_start] = replacewith; + } +} + +// ---------------------------------------------------------------------- +// StringReplace() +// Replace the "old" pattern with the "new" pattern in a string, +// and append the result to "res". If replace_all is false, +// it only replaces the first instance of "old." +// ---------------------------------------------------------------------- + +void StringReplace(const string& s, const string& oldsub, + const string& newsub, bool replace_all, + string* res) { + if (oldsub.empty()) { + res->append(s); // if empty, append the given string. + return; + } + + string::size_type start_pos = 0; + string::size_type pos; + do { + pos = s.find(oldsub, start_pos); + if (pos == string::npos) { + break; + } + res->append(s, start_pos, pos - start_pos); + res->append(newsub); + start_pos = pos + oldsub.size(); // start searching again after the "old" + } while (replace_all); + res->append(s, start_pos, s.length() - start_pos); +} + +// ---------------------------------------------------------------------- +// StringReplace() +// Give me a string and two patterns "old" and "new", and I replace +// the first instance of "old" in the string with "new", if it +// exists. If "global" is true; call this repeatedly until it +// fails. RETURN a new string, regardless of whether the replacement +// happened or not. +// ---------------------------------------------------------------------- + +string StringReplace(const string& s, const string& oldsub, + const string& newsub, bool replace_all) { + string ret; + StringReplace(s, oldsub, newsub, replace_all, &ret); + return ret; +} + +// ---------------------------------------------------------------------- +// SplitStringUsing() +// Split a string using a character delimiter. Append the components +// to 'result'. +// +// Note: For multi-character delimiters, this routine will split on *ANY* of +// the characters in the string, not the entire string as a single delimiter. +// ---------------------------------------------------------------------- +template +static inline +void SplitStringToIteratorUsing(const string& full, + const char* delim, + ITR& result) { + // Optimize the common case where delim is a single character. + if (delim[0] != '\0' && delim[1] == '\0') { + char c = delim[0]; + const char* p = full.data(); + const char* end = p + full.size(); + while (p != end) { + if (*p == c) { + ++p; + } else { + const char* start = p; + while (++p != end && *p != c); + *result++ = string(start, p - start); + } + } + return; + } + + string::size_type begin_index, end_index; + begin_index = full.find_first_not_of(delim); + while (begin_index != string::npos) { + end_index = full.find_first_of(delim, begin_index); + if (end_index == string::npos) { + *result++ = full.substr(begin_index); + return; + } + *result++ = full.substr(begin_index, (end_index - begin_index)); + begin_index = full.find_first_not_of(delim, end_index); + } +} + +void SplitStringUsing(const string& full, + const char* delim, + vector* result) { + back_insert_iterator< vector > it(*result); + SplitStringToIteratorUsing(full, delim, it); +} + +// Split a string using a character delimiter. Append the components +// to 'result'. If there are consecutive delimiters, this function +// will return corresponding empty strings. The string is split into +// at most the specified number of pieces greedily. This means that the +// last piece may possibly be split further. To split into as many pieces +// as possible, specify 0 as the number of pieces. +// +// If "full" is the empty string, yields an empty string as the only value. +// +// If "pieces" is negative for some reason, it returns the whole string +// ---------------------------------------------------------------------- +template +static inline +void SplitStringToIteratorAllowEmpty(const StringType& full, + const char* delim, + int pieces, + ITR& result) { + string::size_type begin_index, end_index; + begin_index = 0; + + for (int i = 0; (i < pieces-1) || (pieces == 0); i++) { + end_index = full.find_first_of(delim, begin_index); + if (end_index == string::npos) { + *result++ = full.substr(begin_index); + return; + } + *result++ = full.substr(begin_index, (end_index - begin_index)); + begin_index = end_index + 1; + } + *result++ = full.substr(begin_index); +} + +void SplitStringAllowEmpty(const string& full, const char* delim, + vector* result) { + back_insert_iterator > it(*result); + SplitStringToIteratorAllowEmpty(full, delim, 0, it); +} + +// ---------------------------------------------------------------------- +// JoinStrings() +// This merges a vector of string components with delim inserted +// as separaters between components. +// +// ---------------------------------------------------------------------- +template +static void JoinStringsIterator(const ITERATOR& start, + const ITERATOR& end, + const char* delim, + string* result) { + GOOGLE_CHECK(result != NULL); + result->clear(); + int delim_length = strlen(delim); + + // Precompute resulting length so we can reserve() memory in one shot. + int length = 0; + for (ITERATOR iter = start; iter != end; ++iter) { + if (iter != start) { + length += delim_length; + } + length += iter->size(); + } + result->reserve(length); + + // Now combine everything. + for (ITERATOR iter = start; iter != end; ++iter) { + if (iter != start) { + result->append(delim, delim_length); + } + result->append(iter->data(), iter->size()); + } +} + +void JoinStrings(const vector& components, + const char* delim, + string * result) { + JoinStringsIterator(components.begin(), components.end(), delim, result); +} + +// ---------------------------------------------------------------------- +// UnescapeCEscapeSequences() +// This does all the unescaping that C does: \ooo, \r, \n, etc +// Returns length of resulting string. +// The implementation of \x parses any positive number of hex digits, +// but it is an error if the value requires more than 8 bits, and the +// result is truncated to 8 bits. +// +// The second call stores its errors in a supplied string vector. +// If the string vector pointer is NULL, it reports the errors with LOG(). +// ---------------------------------------------------------------------- + +#define IS_OCTAL_DIGIT(c) (((c) >= '0') && ((c) <= '7')) + +inline int hex_digit_to_int(char c) { + /* Assume ASCII. */ + assert('0' == 0x30 && 'A' == 0x41 && 'a' == 0x61); + assert(isxdigit(c)); + int x = static_cast(c); + if (x > '9') { + x += 9; + } + return x & 0xf; +} + +// Protocol buffers doesn't ever care about errors, but I don't want to remove +// the code. +#define LOG_STRING(LEVEL, VECTOR) GOOGLE_LOG_IF(LEVEL, false) + +int UnescapeCEscapeSequences(const char* source, char* dest) { + return UnescapeCEscapeSequences(source, dest, NULL); +} + +int UnescapeCEscapeSequences(const char* source, char* dest, + vector *errors) { + GOOGLE_DCHECK(errors == NULL) << "Error reporting not implemented."; + + char* d = dest; + const char* p = source; + + // Small optimization for case where source = dest and there's no escaping + while ( p == d && *p != '\0' && *p != '\\' ) + p++, d++; + + while (*p != '\0') { + if (*p != '\\') { + *d++ = *p++; + } else { + switch ( *++p ) { // skip past the '\\' + case '\0': + LOG_STRING(ERROR, errors) << "String cannot end with \\"; + *d = '\0'; + return d - dest; // we're done with p + case 'a': *d++ = '\a'; break; + case 'b': *d++ = '\b'; break; + case 'f': *d++ = '\f'; break; + case 'n': *d++ = '\n'; break; + case 'r': *d++ = '\r'; break; + case 't': *d++ = '\t'; break; + case 'v': *d++ = '\v'; break; + case '\\': *d++ = '\\'; break; + case '?': *d++ = '\?'; break; // \? Who knew? + case '\'': *d++ = '\''; break; + case '"': *d++ = '\"'; break; + case '0': case '1': case '2': case '3': // octal digit: 1 to 3 digits + case '4': case '5': case '6': case '7': { + char ch = *p - '0'; + if ( IS_OCTAL_DIGIT(p[1]) ) + ch = ch * 8 + *++p - '0'; + if ( IS_OCTAL_DIGIT(p[1]) ) // safe (and easy) to do this twice + ch = ch * 8 + *++p - '0'; // now points at last digit + *d++ = ch; + break; + } + case 'x': case 'X': { + if (!isxdigit(p[1])) { + if (p[1] == '\0') { + LOG_STRING(ERROR, errors) << "String cannot end with \\x"; + } else { + LOG_STRING(ERROR, errors) << + "\\x cannot be followed by non-hex digit: \\" << *p << p[1]; + } + break; + } + unsigned int ch = 0; + const char *hex_start = p; + while (isxdigit(p[1])) // arbitrarily many hex digits + ch = (ch << 4) + hex_digit_to_int(*++p); + if (ch > 0xFF) + LOG_STRING(ERROR, errors) << "Value of " << + "\\" << string(hex_start, p+1-hex_start) << " exceeds 8 bits"; + *d++ = ch; + break; + } +#if 0 // TODO(kenton): Support \u and \U? Requires runetochar(). + case 'u': { + // \uhhhh => convert 4 hex digits to UTF-8 + char32 rune = 0; + const char *hex_start = p; + for (int i = 0; i < 4; ++i) { + if (isxdigit(p[1])) { // Look one char ahead. + rune = (rune << 4) + hex_digit_to_int(*++p); // Advance p. + } else { + LOG_STRING(ERROR, errors) + << "\\u must be followed by 4 hex digits: \\" + << string(hex_start, p+1-hex_start); + break; + } + } + d += runetochar(d, &rune); + break; + } + case 'U': { + // \Uhhhhhhhh => convert 8 hex digits to UTF-8 + char32 rune = 0; + const char *hex_start = p; + for (int i = 0; i < 8; ++i) { + if (isxdigit(p[1])) { // Look one char ahead. + // Don't change rune until we're sure this + // is within the Unicode limit, but do advance p. + char32 newrune = (rune << 4) + hex_digit_to_int(*++p); + if (newrune > 0x10FFFF) { + LOG_STRING(ERROR, errors) + << "Value of \\" + << string(hex_start, p + 1 - hex_start) + << " exceeds Unicode limit (0x10FFFF)"; + break; + } else { + rune = newrune; + } + } else { + LOG_STRING(ERROR, errors) + << "\\U must be followed by 8 hex digits: \\" + << string(hex_start, p+1-hex_start); + break; + } + } + d += runetochar(d, &rune); + break; + } +#endif + default: + LOG_STRING(ERROR, errors) << "Unknown escape sequence: \\" << *p; + } + p++; // read past letter we escaped + } + } + *d = '\0'; + return d - dest; +} + +// ---------------------------------------------------------------------- +// UnescapeCEscapeString() +// This does the same thing as UnescapeCEscapeSequences, but creates +// a new string. The caller does not need to worry about allocating +// a dest buffer. This should be used for non performance critical +// tasks such as printing debug messages. It is safe for src and dest +// to be the same. +// +// The second call stores its errors in a supplied string vector. +// If the string vector pointer is NULL, it reports the errors with LOG(). +// +// In the first and second calls, the length of dest is returned. In the +// the third call, the new string is returned. +// ---------------------------------------------------------------------- +int UnescapeCEscapeString(const string& src, string* dest) { + return UnescapeCEscapeString(src, dest, NULL); +} + +int UnescapeCEscapeString(const string& src, string* dest, + vector *errors) { + scoped_array unescaped(new char[src.size() + 1]); + int len = UnescapeCEscapeSequences(src.c_str(), unescaped.get(), errors); + GOOGLE_CHECK(dest); + dest->assign(unescaped.get(), len); + return len; +} + +string UnescapeCEscapeString(const string& src) { + scoped_array unescaped(new char[src.size() + 1]); + int len = UnescapeCEscapeSequences(src.c_str(), unescaped.get(), NULL); + return string(unescaped.get(), len); +} + +// ---------------------------------------------------------------------- +// CEscapeString() +// CHexEscapeString() +// Copies 'src' to 'dest', escaping dangerous characters using +// C-style escape sequences. This is very useful for preparing query +// flags. 'src' and 'dest' should not overlap. The 'Hex' version uses +// hexadecimal rather than octal sequences. +// Returns the number of bytes written to 'dest' (not including the \0) +// or -1 if there was insufficient space. +// +// Currently only \n, \r, \t, ", ', \ and !isprint() chars are escaped. +// ---------------------------------------------------------------------- +int CEscapeInternal(const char* src, int src_len, char* dest, + int dest_len, bool use_hex, bool utf8_safe) { + const char* src_end = src + src_len; + int used = 0; + bool last_hex_escape = false; // true if last output char was \xNN + + for (; src < src_end; src++) { + if (dest_len - used < 2) // Need space for two letter escape + return -1; + + bool is_hex_escape = false; + switch (*src) { + case '\n': dest[used++] = '\\'; dest[used++] = 'n'; break; + case '\r': dest[used++] = '\\'; dest[used++] = 'r'; break; + case '\t': dest[used++] = '\\'; dest[used++] = 't'; break; + case '\"': dest[used++] = '\\'; dest[used++] = '\"'; break; + case '\'': dest[used++] = '\\'; dest[used++] = '\''; break; + case '\\': dest[used++] = '\\'; dest[used++] = '\\'; break; + default: + // Note that if we emit \xNN and the src character after that is a hex + // digit then that digit must be escaped too to prevent it being + // interpreted as part of the character code by C. + if ((!utf8_safe || static_cast(*src) < 0x80) && + (!isprint(*src) || + (last_hex_escape && isxdigit(*src)))) { + if (dest_len - used < 4) // need space for 4 letter escape + return -1; + sprintf(dest + used, (use_hex ? "\\x%02x" : "\\%03o"), + static_cast(*src)); + is_hex_escape = use_hex; + used += 4; + } else { + dest[used++] = *src; break; + } + } + last_hex_escape = is_hex_escape; + } + + if (dest_len - used < 1) // make sure that there is room for \0 + return -1; + + dest[used] = '\0'; // doesn't count towards return value though + return used; +} + +int CEscapeString(const char* src, int src_len, char* dest, int dest_len) { + return CEscapeInternal(src, src_len, dest, dest_len, false, false); +} + +// ---------------------------------------------------------------------- +// CEscape() +// CHexEscape() +// Copies 'src' to result, escaping dangerous characters using +// C-style escape sequences. This is very useful for preparing query +// flags. 'src' and 'dest' should not overlap. The 'Hex' version +// hexadecimal rather than octal sequences. +// +// Currently only \n, \r, \t, ", ', \ and !isprint() chars are escaped. +// ---------------------------------------------------------------------- +string CEscape(const string& src) { + const int dest_length = src.size() * 4 + 1; // Maximum possible expansion + scoped_array dest(new char[dest_length]); + const int len = CEscapeInternal(src.data(), src.size(), + dest.get(), dest_length, false, false); + GOOGLE_DCHECK_GE(len, 0); + return string(dest.get(), len); +} + +namespace strings { + +string Utf8SafeCEscape(const string& src) { + const int dest_length = src.size() * 4 + 1; // Maximum possible expansion + scoped_array dest(new char[dest_length]); + const int len = CEscapeInternal(src.data(), src.size(), + dest.get(), dest_length, false, true); + GOOGLE_DCHECK_GE(len, 0); + return string(dest.get(), len); +} + +string CHexEscape(const string& src) { + const int dest_length = src.size() * 4 + 1; // Maximum possible expansion + scoped_array dest(new char[dest_length]); + const int len = CEscapeInternal(src.data(), src.size(), + dest.get(), dest_length, true, false); + GOOGLE_DCHECK_GE(len, 0); + return string(dest.get(), len); +} + +} // namespace strings + +// ---------------------------------------------------------------------- +// strto32_adaptor() +// strtou32_adaptor() +// Implementation of strto[u]l replacements that have identical +// overflow and underflow characteristics for both ILP-32 and LP-64 +// platforms, including errno preservation in error-free calls. +// ---------------------------------------------------------------------- + +int32 strto32_adaptor(const char *nptr, char **endptr, int base) { + const int saved_errno = errno; + errno = 0; + const long result = strtol(nptr, endptr, base); + if (errno == ERANGE && result == LONG_MIN) { + return kint32min; + } else if (errno == ERANGE && result == LONG_MAX) { + return kint32max; + } else if (errno == 0 && result < kint32min) { + errno = ERANGE; + return kint32min; + } else if (errno == 0 && result > kint32max) { + errno = ERANGE; + return kint32max; + } + if (errno == 0) + errno = saved_errno; + return static_cast(result); +} + +uint32 strtou32_adaptor(const char *nptr, char **endptr, int base) { + const int saved_errno = errno; + errno = 0; + const unsigned long result = strtoul(nptr, endptr, base); + if (errno == ERANGE && result == ULONG_MAX) { + return kuint32max; + } else if (errno == 0 && result > kuint32max) { + errno = ERANGE; + return kuint32max; + } + if (errno == 0) + errno = saved_errno; + return static_cast(result); +} + +inline bool safe_parse_sign(string* text /*inout*/, + bool* negative_ptr /*output*/) { + const char* start = text->data(); + const char* end = start + text->size(); + + // Consume whitespace. + while (start < end && (start[0] == ' ')) { + ++start; + } + while (start < end && (end[-1] == ' ')) { + --end; + } + if (start >= end) { + return false; + } + + // Consume sign. + *negative_ptr = (start[0] == '-'); + if (*negative_ptr || start[0] == '+') { + ++start; + if (start >= end) { + return false; + } + } + *text = text->substr(start - text->data(), end - start); + return true; +} + +inline bool safe_parse_positive_int( + string text, int32* value_p) { + int base = 10; + int32 value = 0; + const int32 vmax = std::numeric_limits::max(); + assert(vmax > 0); + assert(vmax >= base); + const int32 vmax_over_base = vmax / base; + const char* start = text.data(); + const char* end = start + text.size(); + // loop over digits + for (; start < end; ++start) { + unsigned char c = static_cast(start[0]); + int digit = c - '0'; + if (digit >= base || digit < 0) { + *value_p = value; + return false; + } + if (value > vmax_over_base) { + *value_p = vmax; + return false; + } + value *= base; + if (value > vmax - digit) { + *value_p = vmax; + return false; + } + value += digit; + } + *value_p = value; + return true; +} + +inline bool safe_parse_negative_int( + string text, int32* value_p) { + int base = 10; + int32 value = 0; + const int32 vmin = std::numeric_limits::min(); + assert(vmin < 0); + assert(vmin <= 0 - base); + int32 vmin_over_base = vmin / base; + // 2003 c++ standard [expr.mul] + // "... the sign of the remainder is implementation-defined." + // Although (vmin/base)*base + vmin%base is always vmin. + // 2011 c++ standard tightens the spec but we cannot rely on it. + if (vmin % base > 0) { + vmin_over_base += 1; + } + const char* start = text.data(); + const char* end = start + text.size(); + // loop over digits + for (; start < end; ++start) { + unsigned char c = static_cast(start[0]); + int digit = c - '0'; + if (digit >= base || digit < 0) { + *value_p = value; + return false; + } + if (value < vmin_over_base) { + *value_p = vmin; + return false; + } + value *= base; + if (value < vmin + digit) { + *value_p = vmin; + return false; + } + value -= digit; + } + *value_p = value; + return true; +} + +bool safe_int(string text, int32* value_p) { + *value_p = 0; + bool negative; + if (!safe_parse_sign(&text, &negative)) { + return false; + } + if (!negative) { + return safe_parse_positive_int(text, value_p); + } else { + return safe_parse_negative_int(text, value_p); + } +} + +// ---------------------------------------------------------------------- +// FastIntToBuffer() +// FastInt64ToBuffer() +// FastHexToBuffer() +// FastHex64ToBuffer() +// FastHex32ToBuffer() +// ---------------------------------------------------------------------- + +// Offset into buffer where FastInt64ToBuffer places the end of string +// null character. Also used by FastInt64ToBufferLeft. +static const int kFastInt64ToBufferOffset = 21; + +char *FastInt64ToBuffer(int64 i, char* buffer) { + // We could collapse the positive and negative sections, but that + // would be slightly slower for positive numbers... + // 22 bytes is enough to store -2**64, -18446744073709551616. + char* p = buffer + kFastInt64ToBufferOffset; + *p-- = '\0'; + if (i >= 0) { + do { + *p-- = '0' + i % 10; + i /= 10; + } while (i > 0); + return p + 1; + } else { + // On different platforms, % and / have different behaviors for + // negative numbers, so we need to jump through hoops to make sure + // we don't divide negative numbers. + if (i > -10) { + i = -i; + *p-- = '0' + i; + *p = '-'; + return p; + } else { + // Make sure we aren't at MIN_INT, in which case we can't say i = -i + i = i + 10; + i = -i; + *p-- = '0' + i % 10; + // Undo what we did a moment ago + i = i / 10 + 1; + do { + *p-- = '0' + i % 10; + i /= 10; + } while (i > 0); + *p = '-'; + return p; + } + } +} + +// Offset into buffer where FastInt32ToBuffer places the end of string +// null character. Also used by FastInt32ToBufferLeft +static const int kFastInt32ToBufferOffset = 11; + +// Yes, this is a duplicate of FastInt64ToBuffer. But, we need this for the +// compiler to generate 32 bit arithmetic instructions. It's much faster, at +// least with 32 bit binaries. +char *FastInt32ToBuffer(int32 i, char* buffer) { + // We could collapse the positive and negative sections, but that + // would be slightly slower for positive numbers... + // 12 bytes is enough to store -2**32, -4294967296. + char* p = buffer + kFastInt32ToBufferOffset; + *p-- = '\0'; + if (i >= 0) { + do { + *p-- = '0' + i % 10; + i /= 10; + } while (i > 0); + return p + 1; + } else { + // On different platforms, % and / have different behaviors for + // negative numbers, so we need to jump through hoops to make sure + // we don't divide negative numbers. + if (i > -10) { + i = -i; + *p-- = '0' + i; + *p = '-'; + return p; + } else { + // Make sure we aren't at MIN_INT, in which case we can't say i = -i + i = i + 10; + i = -i; + *p-- = '0' + i % 10; + // Undo what we did a moment ago + i = i / 10 + 1; + do { + *p-- = '0' + i % 10; + i /= 10; + } while (i > 0); + *p = '-'; + return p; + } + } +} + +char *FastHexToBuffer(int i, char* buffer) { + GOOGLE_CHECK(i >= 0) << "FastHexToBuffer() wants non-negative integers, not " << i; + + static const char *hexdigits = "0123456789abcdef"; + char *p = buffer + 21; + *p-- = '\0'; + do { + *p-- = hexdigits[i & 15]; // mod by 16 + i >>= 4; // divide by 16 + } while (i > 0); + return p + 1; +} + +char *InternalFastHexToBuffer(uint64 value, char* buffer, int num_byte) { + static const char *hexdigits = "0123456789abcdef"; + buffer[num_byte] = '\0'; + for (int i = num_byte - 1; i >= 0; i--) { +#ifdef _M_X64 + // MSVC x64 platform has a bug optimizing the uint32(value) in the #else + // block. Given that the uint32 cast was to improve performance on 32-bit + // platforms, we use 64-bit '&' directly. + buffer[i] = hexdigits[value & 0xf]; +#else + buffer[i] = hexdigits[uint32(value) & 0xf]; +#endif + value >>= 4; + } + return buffer; +} + +char *FastHex64ToBuffer(uint64 value, char* buffer) { + return InternalFastHexToBuffer(value, buffer, 16); +} + +char *FastHex32ToBuffer(uint32 value, char* buffer) { + return InternalFastHexToBuffer(value, buffer, 8); +} + +static inline char* PlaceNum(char* p, int num, char prev_sep) { + *p-- = '0' + num % 10; + *p-- = '0' + num / 10; + *p-- = prev_sep; + return p; +} + +// ---------------------------------------------------------------------- +// FastInt32ToBufferLeft() +// FastUInt32ToBufferLeft() +// FastInt64ToBufferLeft() +// FastUInt64ToBufferLeft() +// +// Like the Fast*ToBuffer() functions above, these are intended for speed. +// Unlike the Fast*ToBuffer() functions, however, these functions write +// their output to the beginning of the buffer (hence the name, as the +// output is left-aligned). The caller is responsible for ensuring that +// the buffer has enough space to hold the output. +// +// Returns a pointer to the end of the string (i.e. the null character +// terminating the string). +// ---------------------------------------------------------------------- + +static const char two_ASCII_digits[100][2] = { + {'0','0'}, {'0','1'}, {'0','2'}, {'0','3'}, {'0','4'}, + {'0','5'}, {'0','6'}, {'0','7'}, {'0','8'}, {'0','9'}, + {'1','0'}, {'1','1'}, {'1','2'}, {'1','3'}, {'1','4'}, + {'1','5'}, {'1','6'}, {'1','7'}, {'1','8'}, {'1','9'}, + {'2','0'}, {'2','1'}, {'2','2'}, {'2','3'}, {'2','4'}, + {'2','5'}, {'2','6'}, {'2','7'}, {'2','8'}, {'2','9'}, + {'3','0'}, {'3','1'}, {'3','2'}, {'3','3'}, {'3','4'}, + {'3','5'}, {'3','6'}, {'3','7'}, {'3','8'}, {'3','9'}, + {'4','0'}, {'4','1'}, {'4','2'}, {'4','3'}, {'4','4'}, + {'4','5'}, {'4','6'}, {'4','7'}, {'4','8'}, {'4','9'}, + {'5','0'}, {'5','1'}, {'5','2'}, {'5','3'}, {'5','4'}, + {'5','5'}, {'5','6'}, {'5','7'}, {'5','8'}, {'5','9'}, + {'6','0'}, {'6','1'}, {'6','2'}, {'6','3'}, {'6','4'}, + {'6','5'}, {'6','6'}, {'6','7'}, {'6','8'}, {'6','9'}, + {'7','0'}, {'7','1'}, {'7','2'}, {'7','3'}, {'7','4'}, + {'7','5'}, {'7','6'}, {'7','7'}, {'7','8'}, {'7','9'}, + {'8','0'}, {'8','1'}, {'8','2'}, {'8','3'}, {'8','4'}, + {'8','5'}, {'8','6'}, {'8','7'}, {'8','8'}, {'8','9'}, + {'9','0'}, {'9','1'}, {'9','2'}, {'9','3'}, {'9','4'}, + {'9','5'}, {'9','6'}, {'9','7'}, {'9','8'}, {'9','9'} +}; + +char* FastUInt32ToBufferLeft(uint32 u, char* buffer) { + int digits; + const char *ASCII_digits = NULL; + // The idea of this implementation is to trim the number of divides to as few + // as possible by using multiplication and subtraction rather than mod (%), + // and by outputting two digits at a time rather than one. + // The huge-number case is first, in the hopes that the compiler will output + // that case in one branch-free block of code, and only output conditional + // branches into it from below. + if (u >= 1000000000) { // >= 1,000,000,000 + digits = u / 100000000; // 100,000,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +sublt100_000_000: + u -= digits * 100000000; // 100,000,000 +lt100_000_000: + digits = u / 1000000; // 1,000,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +sublt1_000_000: + u -= digits * 1000000; // 1,000,000 +lt1_000_000: + digits = u / 10000; // 10,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +sublt10_000: + u -= digits * 10000; // 10,000 +lt10_000: + digits = u / 100; + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +sublt100: + u -= digits * 100; +lt100: + digits = u; + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +done: + *buffer = 0; + return buffer; + } + + if (u < 100) { + digits = u; + if (u >= 10) goto lt100; + *buffer++ = '0' + digits; + goto done; + } + if (u < 10000) { // 10,000 + if (u >= 1000) goto lt10_000; + digits = u / 100; + *buffer++ = '0' + digits; + goto sublt100; + } + if (u < 1000000) { // 1,000,000 + if (u >= 100000) goto lt1_000_000; + digits = u / 10000; // 10,000 + *buffer++ = '0' + digits; + goto sublt10_000; + } + if (u < 100000000) { // 100,000,000 + if (u >= 10000000) goto lt100_000_000; + digits = u / 1000000; // 1,000,000 + *buffer++ = '0' + digits; + goto sublt1_000_000; + } + // we already know that u < 1,000,000,000 + digits = u / 100000000; // 100,000,000 + *buffer++ = '0' + digits; + goto sublt100_000_000; +} + +char* FastInt32ToBufferLeft(int32 i, char* buffer) { + uint32 u = i; + if (i < 0) { + *buffer++ = '-'; + u = -i; + } + return FastUInt32ToBufferLeft(u, buffer); +} + +char* FastUInt64ToBufferLeft(uint64 u64, char* buffer) { + int digits; + const char *ASCII_digits = NULL; + + uint32 u = static_cast(u64); + if (u == u64) return FastUInt32ToBufferLeft(u, buffer); + + uint64 top_11_digits = u64 / 1000000000; + buffer = FastUInt64ToBufferLeft(top_11_digits, buffer); + u = u64 - (top_11_digits * 1000000000); + + digits = u / 10000000; // 10,000,000 + GOOGLE_DCHECK_LT(digits, 100); + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; + u -= digits * 10000000; // 10,000,000 + digits = u / 100000; // 100,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; + u -= digits * 100000; // 100,000 + digits = u / 1000; // 1,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; + u -= digits * 1000; // 1,000 + digits = u / 10; + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; + u -= digits * 10; + digits = u; + *buffer++ = '0' + digits; + *buffer = 0; + return buffer; +} + +char* FastInt64ToBufferLeft(int64 i, char* buffer) { + uint64 u = i; + if (i < 0) { + *buffer++ = '-'; + u = -i; + } + return FastUInt64ToBufferLeft(u, buffer); +} + +// ---------------------------------------------------------------------- +// SimpleItoa() +// Description: converts an integer to a string. +// +// Return value: string +// ---------------------------------------------------------------------- + +string SimpleItoa(int i) { + char buffer[kFastToBufferSize]; + return (sizeof(i) == 4) ? + FastInt32ToBuffer(i, buffer) : + FastInt64ToBuffer(i, buffer); +} + +string SimpleItoa(unsigned int i) { + char buffer[kFastToBufferSize]; + return string(buffer, (sizeof(i) == 4) ? + FastUInt32ToBufferLeft(i, buffer) : + FastUInt64ToBufferLeft(i, buffer)); +} + +string SimpleItoa(long i) { + char buffer[kFastToBufferSize]; + return (sizeof(i) == 4) ? + FastInt32ToBuffer(i, buffer) : + FastInt64ToBuffer(i, buffer); +} + +string SimpleItoa(unsigned long i) { + char buffer[kFastToBufferSize]; + return string(buffer, (sizeof(i) == 4) ? + FastUInt32ToBufferLeft(i, buffer) : + FastUInt64ToBufferLeft(i, buffer)); +} + +string SimpleItoa(long long i) { + char buffer[kFastToBufferSize]; + return (sizeof(i) == 4) ? + FastInt32ToBuffer(i, buffer) : + FastInt64ToBuffer(i, buffer); +} + +string SimpleItoa(unsigned long long i) { + char buffer[kFastToBufferSize]; + return string(buffer, (sizeof(i) == 4) ? + FastUInt32ToBufferLeft(i, buffer) : + FastUInt64ToBufferLeft(i, buffer)); +} + +// ---------------------------------------------------------------------- +// SimpleDtoa() +// SimpleFtoa() +// DoubleToBuffer() +// FloatToBuffer() +// We want to print the value without losing precision, but we also do +// not want to print more digits than necessary. This turns out to be +// trickier than it sounds. Numbers like 0.2 cannot be represented +// exactly in binary. If we print 0.2 with a very large precision, +// e.g. "%.50g", we get "0.2000000000000000111022302462515654042363167". +// On the other hand, if we set the precision too low, we lose +// significant digits when printing numbers that actually need them. +// It turns out there is no precision value that does the right thing +// for all numbers. +// +// Our strategy is to first try printing with a precision that is never +// over-precise, then parse the result with strtod() to see if it +// matches. If not, we print again with a precision that will always +// give a precise result, but may use more digits than necessary. +// +// An arguably better strategy would be to use the algorithm described +// in "How to Print Floating-Point Numbers Accurately" by Steele & +// White, e.g. as implemented by David M. Gay's dtoa(). It turns out, +// however, that the following implementation is about as fast as +// DMG's code. Furthermore, DMG's code locks mutexes, which means it +// will not scale well on multi-core machines. DMG's code is slightly +// more accurate (in that it will never use more digits than +// necessary), but this is probably irrelevant for most users. +// +// Rob Pike and Ken Thompson also have an implementation of dtoa() in +// third_party/fmt/fltfmt.cc. Their implementation is similar to this +// one in that it makes guesses and then uses strtod() to check them. +// Their implementation is faster because they use their own code to +// generate the digits in the first place rather than use snprintf(), +// thus avoiding format string parsing overhead. However, this makes +// it considerably more complicated than the following implementation, +// and it is embedded in a larger library. If speed turns out to be +// an issue, we could re-implement this in terms of their +// implementation. +// ---------------------------------------------------------------------- + +string SimpleDtoa(double value) { + char buffer[kDoubleToBufferSize]; + return DoubleToBuffer(value, buffer); +} + +string SimpleFtoa(float value) { + char buffer[kFloatToBufferSize]; + return FloatToBuffer(value, buffer); +} + +static inline bool IsValidFloatChar(char c) { + return ('0' <= c && c <= '9') || + c == 'e' || c == 'E' || + c == '+' || c == '-'; +} + +void DelocalizeRadix(char* buffer) { + // Fast check: if the buffer has a normal decimal point, assume no + // translation is needed. + if (strchr(buffer, '.') != NULL) return; + + // Find the first unknown character. + while (IsValidFloatChar(*buffer)) ++buffer; + + if (*buffer == '\0') { + // No radix character found. + return; + } + + // We are now pointing at the locale-specific radix character. Replace it + // with '.'. + *buffer = '.'; + ++buffer; + + if (!IsValidFloatChar(*buffer) && *buffer != '\0') { + // It appears the radix was a multi-byte character. We need to remove the + // extra bytes. + char* target = buffer; + do { ++buffer; } while (!IsValidFloatChar(*buffer) && *buffer != '\0'); + memmove(target, buffer, strlen(buffer) + 1); + } +} + +char* DoubleToBuffer(double value, char* buffer) { + // DBL_DIG is 15 for IEEE-754 doubles, which are used on almost all + // platforms these days. Just in case some system exists where DBL_DIG + // is significantly larger -- and risks overflowing our buffer -- we have + // this assert. + GOOGLE_COMPILE_ASSERT(DBL_DIG < 20, DBL_DIG_is_too_big); + + if (value == numeric_limits::infinity()) { + strcpy(buffer, "inf"); + return buffer; + } else if (value == -numeric_limits::infinity()) { + strcpy(buffer, "-inf"); + return buffer; + } else if (IsNaN(value)) { + strcpy(buffer, "nan"); + return buffer; + } + + int snprintf_result = + snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG, value); + + // The snprintf should never overflow because the buffer is significantly + // larger than the precision we asked for. + GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kDoubleToBufferSize); + + // We need to make parsed_value volatile in order to force the compiler to + // write it out to the stack. Otherwise, it may keep the value in a + // register, and if it does that, it may keep it as a long double instead + // of a double. This long double may have extra bits that make it compare + // unequal to "value" even though it would be exactly equal if it were + // truncated to a double. + volatile double parsed_value = strtod(buffer, NULL); + if (parsed_value != value) { + int snprintf_result = + snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG+2, value); + + // Should never overflow; see above. + GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kDoubleToBufferSize); + } + + DelocalizeRadix(buffer); + return buffer; +} + +bool safe_strtof(const char* str, float* value) { + char* endptr; + errno = 0; // errno only gets set on errors +#if defined(_WIN32) || defined (__hpux) // has no strtof() + *value = strtod(str, &endptr); +#else + *value = strtof(str, &endptr); +#endif + return *str != 0 && *endptr == 0 && errno == 0; +} + +char* FloatToBuffer(float value, char* buffer) { + // FLT_DIG is 6 for IEEE-754 floats, which are used on almost all + // platforms these days. Just in case some system exists where FLT_DIG + // is significantly larger -- and risks overflowing our buffer -- we have + // this assert. + GOOGLE_COMPILE_ASSERT(FLT_DIG < 10, FLT_DIG_is_too_big); + + if (value == numeric_limits::infinity()) { + strcpy(buffer, "inf"); + return buffer; + } else if (value == -numeric_limits::infinity()) { + strcpy(buffer, "-inf"); + return buffer; + } else if (IsNaN(value)) { + strcpy(buffer, "nan"); + return buffer; + } + + int snprintf_result = + snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG, value); + + // The snprintf should never overflow because the buffer is significantly + // larger than the precision we asked for. + GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize); + + float parsed_value; + if (!safe_strtof(buffer, &parsed_value) || parsed_value != value) { + int snprintf_result = + snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG+2, value); + + // Should never overflow; see above. + GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize); + } + + DelocalizeRadix(buffer); + return buffer; +} + +string ToHex(uint64 num) { + if (num == 0) { + return string("0"); + } + + // Compute hex bytes in reverse order, writing to the back of the + // buffer. + char buf[16]; // No more than 16 hex digits needed. + char* bufptr = buf + 16; + static const char kHexChars[] = "0123456789abcdef"; + while (num != 0) { + *--bufptr = kHexChars[num & 0xf]; + num >>= 4; + } + + return string(bufptr, buf + 16 - bufptr); +} + +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.h b/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.h new file mode 100644 index 0000000000000..6cf23821e99b6 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/strutil.h @@ -0,0 +1,563 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/strings/strutil.h + +#ifndef GOOGLE_PROTOBUF_STUBS_STRUTIL_H__ +#define GOOGLE_PROTOBUF_STUBS_STRUTIL_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { + +#ifdef _MSC_VER +#define strtoll _strtoi64 +#define strtoull _strtoui64 +#elif defined(__DECCXX) && defined(__osf__) +// HP C++ on Tru64 does not have strtoll, but strtol is already 64-bit. +#define strtoll strtol +#define strtoull strtoul +#endif + +// ---------------------------------------------------------------------- +// ascii_isalnum() +// Check if an ASCII character is alphanumeric. We can't use ctype's +// isalnum() because it is affected by locale. This function is applied +// to identifiers in the protocol buffer language, not to natural-language +// strings, so locale should not be taken into account. +// ascii_isdigit() +// Like above, but only accepts digits. +// ---------------------------------------------------------------------- + +inline bool ascii_isalnum(char c) { + return ('a' <= c && c <= 'z') || + ('A' <= c && c <= 'Z') || + ('0' <= c && c <= '9'); +} + +inline bool ascii_isdigit(char c) { + return ('0' <= c && c <= '9'); +} + +// ---------------------------------------------------------------------- +// HasPrefixString() +// Check if a string begins with a given prefix. +// StripPrefixString() +// Given a string and a putative prefix, returns the string minus the +// prefix string if the prefix matches, otherwise the original +// string. +// ---------------------------------------------------------------------- +inline bool HasPrefixString(const string& str, + const string& prefix) { + return str.size() >= prefix.size() && + str.compare(0, prefix.size(), prefix) == 0; +} + +inline string StripPrefixString(const string& str, const string& prefix) { + if (HasPrefixString(str, prefix)) { + return str.substr(prefix.size()); + } else { + return str; + } +} + +// ---------------------------------------------------------------------- +// HasSuffixString() +// Return true if str ends in suffix. +// StripSuffixString() +// Given a string and a putative suffix, returns the string minus the +// suffix string if the suffix matches, otherwise the original +// string. +// ---------------------------------------------------------------------- +inline bool HasSuffixString(const string& str, + const string& suffix) { + return str.size() >= suffix.size() && + str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; +} + +inline string StripSuffixString(const string& str, const string& suffix) { + if (HasSuffixString(str, suffix)) { + return str.substr(0, str.size() - suffix.size()); + } else { + return str; + } +} + +// ---------------------------------------------------------------------- +// StripString +// Replaces any occurrence of the character 'remove' (or the characters +// in 'remove') with the character 'replacewith'. +// Good for keeping html characters or protocol characters (\t) out +// of places where they might cause a problem. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT void StripString(string* s, const char* remove, + char replacewith); + +// ---------------------------------------------------------------------- +// LowerString() +// UpperString() +// ToUpper() +// Convert the characters in "s" to lowercase or uppercase. ASCII-only: +// these functions intentionally ignore locale because they are applied to +// identifiers used in the Protocol Buffer language, not to natural-language +// strings. +// ---------------------------------------------------------------------- + +inline void LowerString(string * s) { + string::iterator end = s->end(); + for (string::iterator i = s->begin(); i != end; ++i) { + // tolower() changes based on locale. We don't want this! + if ('A' <= *i && *i <= 'Z') *i += 'a' - 'A'; + } +} + +inline void UpperString(string * s) { + string::iterator end = s->end(); + for (string::iterator i = s->begin(); i != end; ++i) { + // toupper() changes based on locale. We don't want this! + if ('a' <= *i && *i <= 'z') *i += 'A' - 'a'; + } +} + +inline string ToUpper(const string& s) { + string out = s; + UpperString(&out); + return out; +} + +// ---------------------------------------------------------------------- +// StringReplace() +// Give me a string and two patterns "old" and "new", and I replace +// the first instance of "old" in the string with "new", if it +// exists. RETURN a new string, regardless of whether the replacement +// happened or not. +// ---------------------------------------------------------------------- + +LIBPROTOBUF_EXPORT string StringReplace(const string& s, const string& oldsub, + const string& newsub, bool replace_all); + +// ---------------------------------------------------------------------- +// SplitStringUsing() +// Split a string using a character delimiter. Append the components +// to 'result'. If there are consecutive delimiters, this function skips +// over all of them. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT void SplitStringUsing(const string& full, const char* delim, + vector* res); + +// Split a string using one or more byte delimiters, presented +// as a nul-terminated c string. Append the components to 'result'. +// If there are consecutive delimiters, this function will return +// corresponding empty strings. If you want to drop the empty +// strings, try SplitStringUsing(). +// +// If "full" is the empty string, yields an empty string as the only value. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT void SplitStringAllowEmpty(const string& full, + const char* delim, + vector* result); + +// ---------------------------------------------------------------------- +// Split() +// Split a string using a character delimiter. +// ---------------------------------------------------------------------- +inline vector Split( + const string& full, const char* delim, bool skip_empty = true) { + vector result; + if (skip_empty) { + SplitStringUsing(full, delim, &result); + } else { + SplitStringAllowEmpty(full, delim, &result); + } + return result; +} + +// ---------------------------------------------------------------------- +// JoinStrings() +// These methods concatenate a vector of strings into a C++ string, using +// the C-string "delim" as a separator between components. There are two +// flavors of the function, one flavor returns the concatenated string, +// another takes a pointer to the target string. In the latter case the +// target string is cleared and overwritten. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT void JoinStrings(const vector& components, + const char* delim, string* result); + +inline string JoinStrings(const vector& components, + const char* delim) { + string result; + JoinStrings(components, delim, &result); + return result; +} + +// ---------------------------------------------------------------------- +// UnescapeCEscapeSequences() +// Copies "source" to "dest", rewriting C-style escape sequences +// -- '\n', '\r', '\\', '\ooo', etc -- to their ASCII +// equivalents. "dest" must be sufficiently large to hold all +// the characters in the rewritten string (i.e. at least as large +// as strlen(source) + 1 should be safe, since the replacements +// are always shorter than the original escaped sequences). It's +// safe for source and dest to be the same. RETURNS the length +// of dest. +// +// It allows hex sequences \xhh, or generally \xhhhhh with an +// arbitrary number of hex digits, but all of them together must +// specify a value of a single byte (e.g. \x0045 is equivalent +// to \x45, and \x1234 is erroneous). +// +// It also allows escape sequences of the form \uhhhh (exactly four +// hex digits, upper or lower case) or \Uhhhhhhhh (exactly eight +// hex digits, upper or lower case) to specify a Unicode code +// point. The dest array will contain the UTF8-encoded version of +// that code-point (e.g., if source contains \u2019, then dest will +// contain the three bytes 0xE2, 0x80, and 0x99). +// +// Errors: In the first form of the call, errors are reported with +// LOG(ERROR). The same is true for the second form of the call if +// the pointer to the string vector is NULL; otherwise, error +// messages are stored in the vector. In either case, the effect on +// the dest array is not defined, but rest of the source will be +// processed. +// ---------------------------------------------------------------------- + +LIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest); +LIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest, + vector *errors); + +// ---------------------------------------------------------------------- +// UnescapeCEscapeString() +// This does the same thing as UnescapeCEscapeSequences, but creates +// a new string. The caller does not need to worry about allocating +// a dest buffer. This should be used for non performance critical +// tasks such as printing debug messages. It is safe for src and dest +// to be the same. +// +// The second call stores its errors in a supplied string vector. +// If the string vector pointer is NULL, it reports the errors with LOG(). +// +// In the first and second calls, the length of dest is returned. In the +// the third call, the new string is returned. +// ---------------------------------------------------------------------- + +LIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest); +LIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest, + vector *errors); +LIBPROTOBUF_EXPORT string UnescapeCEscapeString(const string& src); + +// ---------------------------------------------------------------------- +// CEscapeString() +// Copies 'src' to 'dest', escaping dangerous characters using +// C-style escape sequences. This is very useful for preparing query +// flags. 'src' and 'dest' should not overlap. +// Returns the number of bytes written to 'dest' (not including the \0) +// or -1 if there was insufficient space. +// +// Currently only \n, \r, \t, ", ', \ and !isprint() chars are escaped. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT int CEscapeString(const char* src, int src_len, + char* dest, int dest_len); + +// ---------------------------------------------------------------------- +// CEscape() +// More convenient form of CEscapeString: returns result as a "string". +// This version is slower than CEscapeString() because it does more +// allocation. However, it is much more convenient to use in +// non-speed-critical code like logging messages etc. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT string CEscape(const string& src); + +namespace strings { +// Like CEscape() but does not escape bytes with the upper bit set. +LIBPROTOBUF_EXPORT string Utf8SafeCEscape(const string& src); + +// Like CEscape() but uses hex (\x) escapes instead of octals. +LIBPROTOBUF_EXPORT string CHexEscape(const string& src); +} // namespace strings + +// ---------------------------------------------------------------------- +// strto32() +// strtou32() +// strto64() +// strtou64() +// Architecture-neutral plug compatible replacements for strtol() and +// strtoul(). Long's have different lengths on ILP-32 and LP-64 +// platforms, so using these is safer, from the point of view of +// overflow behavior, than using the standard libc functions. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT int32 strto32_adaptor(const char *nptr, char **endptr, + int base); +LIBPROTOBUF_EXPORT uint32 strtou32_adaptor(const char *nptr, char **endptr, + int base); + +inline int32 strto32(const char *nptr, char **endptr, int base) { + if (sizeof(int32) == sizeof(long)) + return strtol(nptr, endptr, base); + else + return strto32_adaptor(nptr, endptr, base); +} + +inline uint32 strtou32(const char *nptr, char **endptr, int base) { + if (sizeof(uint32) == sizeof(unsigned long)) + return strtoul(nptr, endptr, base); + else + return strtou32_adaptor(nptr, endptr, base); +} + +// For now, long long is 64-bit on all the platforms we care about, so these +// functions can simply pass the call to strto[u]ll. +inline int64 strto64(const char *nptr, char **endptr, int base) { + static_assert(sizeof(int64) == sizeof(long long), "Protobuf needs sizeof(int64) == sizeof(long long)"); + GOOGLE_COMPILE_ASSERT(sizeof(int64) == sizeof(long long), + sizeof_int64_is_not_sizeof_long_long); + return strtoll(nptr, endptr, base); +} + +inline uint64 strtou64(const char *nptr, char **endptr, int base) { + GOOGLE_COMPILE_ASSERT(sizeof(uint64) == sizeof(unsigned long long), + sizeof_uint64_is_not_sizeof_long_long); + return strtoull(nptr, endptr, base); +} + +// ---------------------------------------------------------------------- +// safe_strto32() +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT bool safe_int(string text, int32* value_p); + +inline bool safe_strto32(string text, int32* value) { + return safe_int(text, value); +} + +// ---------------------------------------------------------------------- +// FastIntToBuffer() +// FastHexToBuffer() +// FastHex64ToBuffer() +// FastHex32ToBuffer() +// FastTimeToBuffer() +// These are intended for speed. FastIntToBuffer() assumes the +// integer is non-negative. FastHexToBuffer() puts output in +// hex rather than decimal. FastTimeToBuffer() puts the output +// into RFC822 format. +// +// FastHex64ToBuffer() puts a 64-bit unsigned value in hex-format, +// padded to exactly 16 bytes (plus one byte for '\0') +// +// FastHex32ToBuffer() puts a 32-bit unsigned value in hex-format, +// padded to exactly 8 bytes (plus one byte for '\0') +// +// All functions take the output buffer as an arg. +// They all return a pointer to the beginning of the output, +// which may not be the beginning of the input buffer. +// ---------------------------------------------------------------------- + +// Suggested buffer size for FastToBuffer functions. Also works with +// DoubleToBuffer() and FloatToBuffer(). +static const int kFastToBufferSize = 32; + +LIBPROTOBUF_EXPORT char* FastInt32ToBuffer(int32 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastInt64ToBuffer(int64 i, char* buffer); +char* FastUInt32ToBuffer(uint32 i, char* buffer); // inline below +char* FastUInt64ToBuffer(uint64 i, char* buffer); // inline below +LIBPROTOBUF_EXPORT char* FastHexToBuffer(int i, char* buffer); +LIBPROTOBUF_EXPORT char* FastHex64ToBuffer(uint64 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastHex32ToBuffer(uint32 i, char* buffer); + +// at least 22 bytes long +inline char* FastIntToBuffer(int i, char* buffer) { + return (sizeof(i) == 4 ? + FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer)); +} +inline char* FastUIntToBuffer(unsigned int i, char* buffer) { + return (sizeof(i) == 4 ? + FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer)); +} +inline char* FastLongToBuffer(long i, char* buffer) { + return (sizeof(i) == 4 ? + FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer)); +} +inline char* FastULongToBuffer(unsigned long i, char* buffer) { + return (sizeof(i) == 4 ? + FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer)); +} + +// ---------------------------------------------------------------------- +// FastInt32ToBufferLeft() +// FastUInt32ToBufferLeft() +// FastInt64ToBufferLeft() +// FastUInt64ToBufferLeft() +// +// Like the Fast*ToBuffer() functions above, these are intended for speed. +// Unlike the Fast*ToBuffer() functions, however, these functions write +// their output to the beginning of the buffer (hence the name, as the +// output is left-aligned). The caller is responsible for ensuring that +// the buffer has enough space to hold the output. +// +// Returns a pointer to the end of the string (i.e. the null character +// terminating the string). +// ---------------------------------------------------------------------- + +LIBPROTOBUF_EXPORT char* FastInt32ToBufferLeft(int32 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastUInt32ToBufferLeft(uint32 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastInt64ToBufferLeft(int64 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastUInt64ToBufferLeft(uint64 i, char* buffer); + +// Just define these in terms of the above. +inline char* FastUInt32ToBuffer(uint32 i, char* buffer) { + FastUInt32ToBufferLeft(i, buffer); + return buffer; +} +inline char* FastUInt64ToBuffer(uint64 i, char* buffer) { + FastUInt64ToBufferLeft(i, buffer); + return buffer; +} + +// ---------------------------------------------------------------------- +// SimpleItoa() +// Description: converts an integer to a string. +// +// Return value: string +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT string SimpleItoa(int i); +LIBPROTOBUF_EXPORT string SimpleItoa(unsigned int i); +LIBPROTOBUF_EXPORT string SimpleItoa(long i); +LIBPROTOBUF_EXPORT string SimpleItoa(unsigned long i); +LIBPROTOBUF_EXPORT string SimpleItoa(long long i); +LIBPROTOBUF_EXPORT string SimpleItoa(unsigned long long i); + +// ---------------------------------------------------------------------- +// SimpleDtoa() +// SimpleFtoa() +// DoubleToBuffer() +// FloatToBuffer() +// Description: converts a double or float to a string which, if +// passed to NoLocaleStrtod(), will produce the exact same original double +// (except in case of NaN; all NaNs are considered the same value). +// We try to keep the string short but it's not guaranteed to be as +// short as possible. +// +// DoubleToBuffer() and FloatToBuffer() write the text to the given +// buffer and return it. The buffer must be at least +// kDoubleToBufferSize bytes for doubles and kFloatToBufferSize +// bytes for floats. kFastToBufferSize is also guaranteed to be large +// enough to hold either. +// +// Return value: string +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT string SimpleDtoa(double value); +LIBPROTOBUF_EXPORT string SimpleFtoa(float value); + +LIBPROTOBUF_EXPORT char* DoubleToBuffer(double i, char* buffer); +LIBPROTOBUF_EXPORT char* FloatToBuffer(float i, char* buffer); + +// In practice, doubles should never need more than 24 bytes and floats +// should never need more than 14 (including null terminators), but we +// overestimate to be safe. +static const int kDoubleToBufferSize = 32; +static const int kFloatToBufferSize = 24; + +// ---------------------------------------------------------------------- +// ToString() are internal help methods used in StrCat() and Join() +// ---------------------------------------------------------------------- +namespace internal { +inline string ToString(int i) { + return SimpleItoa(i); +} + +inline string ToString(string a) { + return a; +} +} // namespace internal + +// ---------------------------------------------------------------------- +// StrCat() +// These methods join some strings together. +// ---------------------------------------------------------------------- +template +string StrCat( + const T1& a, const T2& b, const T3& c, const T4& d, const T5& e) { + return internal::ToString(a) + internal::ToString(b) + + internal::ToString(c) + internal::ToString(d) + internal::ToString(e); +} + +template +string StrCat( + const T1& a, const T2& b, const T3& c, const T4& d) { + return internal::ToString(a) + internal::ToString(b) + + internal::ToString(c) + internal::ToString(d); +} + +template +string StrCat(const T1& a, const T2& b, const T3& c) { + return internal::ToString(a) + internal::ToString(b) + + internal::ToString(c); +} + +template +string StrCat(const T1& a, const T2& b) { + return internal::ToString(a) + internal::ToString(b); +} + +// ---------------------------------------------------------------------- +// Join() +// These methods concatenate a range of components into a C++ string, using +// the C-string "delim" as a separator between components. +// ---------------------------------------------------------------------- +template +void Join(Iterator start, Iterator end, + const char* delim, string* result) { + for (Iterator it = start; it != end; ++it) { + if (it != start) { + result->append(delim); + } + result->append(internal::ToString(*it)); + } +} + +template +string Join(const Range& components, + const char* delim) { + string result; + Join(components.begin(), components.end(), delim, &result); + return result; +} + +// ---------------------------------------------------------------------- +// ToHex() +// Return a lower-case hex string representation of the given integer. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT string ToHex(uint64 num); + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_STRUTIL_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/substitute.cc b/toolkit/components/protobuf/src/google/protobuf/stubs/substitute.cc new file mode 100644 index 0000000000000..c9d95899f5249 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/substitute.cc @@ -0,0 +1,134 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace strings { + +using internal::SubstituteArg; + +// Returns the number of args in arg_array which were passed explicitly +// to Substitute(). +static int CountSubstituteArgs(const SubstituteArg* const* args_array) { + int count = 0; + while (args_array[count] != NULL && args_array[count]->size() != -1) { + ++count; + } + return count; +} + +string Substitute( + const char* format, + const SubstituteArg& arg0, const SubstituteArg& arg1, + const SubstituteArg& arg2, const SubstituteArg& arg3, + const SubstituteArg& arg4, const SubstituteArg& arg5, + const SubstituteArg& arg6, const SubstituteArg& arg7, + const SubstituteArg& arg8, const SubstituteArg& arg9) { + string result; + SubstituteAndAppend(&result, format, arg0, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9); + return result; +} + +void SubstituteAndAppend( + string* output, const char* format, + const SubstituteArg& arg0, const SubstituteArg& arg1, + const SubstituteArg& arg2, const SubstituteArg& arg3, + const SubstituteArg& arg4, const SubstituteArg& arg5, + const SubstituteArg& arg6, const SubstituteArg& arg7, + const SubstituteArg& arg8, const SubstituteArg& arg9) { + const SubstituteArg* const args_array[] = { + &arg0, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9, NULL + }; + + // Determine total size needed. + int size = 0; + for (int i = 0; format[i] != '\0'; i++) { + if (format[i] == '$') { + if (ascii_isdigit(format[i+1])) { + int index = format[i+1] - '0'; + if (args_array[index]->size() == -1) { + GOOGLE_LOG(DFATAL) + << "strings::Substitute format string invalid: asked for \"$" + << index << "\", but only " << CountSubstituteArgs(args_array) + << " args were given. Full format string was: \"" + << CEscape(format) << "\"."; + return; + } + size += args_array[index]->size(); + ++i; // Skip next char. + } else if (format[i+1] == '$') { + ++size; + ++i; // Skip next char. + } else { + GOOGLE_LOG(DFATAL) + << "Invalid strings::Substitute() format string: \"" + << CEscape(format) << "\"."; + return; + } + } else { + ++size; + } + } + + if (size == 0) return; + + // Build the string. + int original_size = output->size(); + STLStringResizeUninitialized(output, original_size + size); + char* target = string_as_array(output) + original_size; + for (int i = 0; format[i] != '\0'; i++) { + if (format[i] == '$') { + if (ascii_isdigit(format[i+1])) { + const SubstituteArg* src = args_array[format[i+1] - '0']; + memcpy(target, src->data(), src->size()); + target += src->size(); + ++i; // Skip next char. + } else if (format[i+1] == '$') { + *target++ = '$'; + ++i; // Skip next char. + } + } else { + *target++ = format[i]; + } + } + + GOOGLE_DCHECK_EQ(target - output->data(), output->size()); +} + +} // namespace strings +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/substitute.h b/toolkit/components/protobuf/src/google/protobuf/stubs/substitute.h new file mode 100644 index 0000000000000..7ee442af77b35 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/substitute.h @@ -0,0 +1,170 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// from google3/strings/substitute.h + +#include +#include +#include + +#ifndef GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_ +#define GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_ + +namespace google { +namespace protobuf { +namespace strings { + +// ---------------------------------------------------------------------- +// strings::Substitute() +// strings::SubstituteAndAppend() +// Kind of like StringPrintf, but different. +// +// Example: +// string GetMessage(string first_name, string last_name, int age) { +// return strings::Substitute("My name is $0 $1 and I am $2 years old.", +// first_name, last_name, age); +// } +// +// Differences from StringPrintf: +// * The format string does not identify the types of arguments. +// Instead, the magic of C++ deals with this for us. See below +// for a list of accepted types. +// * Substitutions in the format string are identified by a '$' +// followed by a digit. So, you can use arguments out-of-order and +// use the same argument multiple times. +// * It's much faster than StringPrintf. +// +// Supported types: +// * Strings (const char*, const string&) +// * Note that this means you do not have to add .c_str() to all of +// your strings. In fact, you shouldn't; it will be slower. +// * int32, int64, uint32, uint64: Formatted using SimpleItoa(). +// * float, double: Formatted using SimpleFtoa() and SimpleDtoa(). +// * bool: Printed as "true" or "false". +// +// SubstituteAndAppend() is like Substitute() but appends the result to +// *output. Example: +// +// string str; +// strings::SubstituteAndAppend(&str, +// "My name is $0 $1 and I am $2 years old.", +// first_name, last_name, age); +// +// Substitute() is significantly faster than StringPrintf(). For very +// large strings, it may be orders of magnitude faster. +// ---------------------------------------------------------------------- + +namespace internal { // Implementation details. + +class SubstituteArg { + public: + inline SubstituteArg(const char* value) + : text_(value), size_(strlen(text_)) {} + inline SubstituteArg(const string& value) + : text_(value.data()), size_(value.size()) {} + + // Indicates that no argument was given. + inline explicit SubstituteArg() + : text_(NULL), size_(-1) {} + + // Primitives + // We don't overload for signed and unsigned char because if people are + // explicitly declaring their chars as signed or unsigned then they are + // probably actually using them as 8-bit integers and would probably + // prefer an integer representation. But, we don't really know. So, we + // make the caller decide what to do. + inline SubstituteArg(char value) + : text_(scratch_), size_(1) { scratch_[0] = value; } + inline SubstituteArg(short value) + : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(unsigned short value) + : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(int value) + : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(unsigned int value) + : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(long value) + : text_(FastLongToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(unsigned long value) + : text_(FastULongToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(long long value) + : text_(FastInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(unsigned long long value) + : text_(FastUInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(float value) + : text_(FloatToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(double value) + : text_(DoubleToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(bool value) + : text_(value ? "true" : "false"), size_(strlen(text_)) {} + + inline const char* data() const { return text_; } + inline int size() const { return size_; } + + private: + const char* text_; + int size_; + char scratch_[kFastToBufferSize]; +}; + +} // namespace internal + +LIBPROTOBUF_EXPORT string Substitute( + const char* format, + const internal::SubstituteArg& arg0 = internal::SubstituteArg(), + const internal::SubstituteArg& arg1 = internal::SubstituteArg(), + const internal::SubstituteArg& arg2 = internal::SubstituteArg(), + const internal::SubstituteArg& arg3 = internal::SubstituteArg(), + const internal::SubstituteArg& arg4 = internal::SubstituteArg(), + const internal::SubstituteArg& arg5 = internal::SubstituteArg(), + const internal::SubstituteArg& arg6 = internal::SubstituteArg(), + const internal::SubstituteArg& arg7 = internal::SubstituteArg(), + const internal::SubstituteArg& arg8 = internal::SubstituteArg(), + const internal::SubstituteArg& arg9 = internal::SubstituteArg()); + +LIBPROTOBUF_EXPORT void SubstituteAndAppend( + string* output, const char* format, + const internal::SubstituteArg& arg0 = internal::SubstituteArg(), + const internal::SubstituteArg& arg1 = internal::SubstituteArg(), + const internal::SubstituteArg& arg2 = internal::SubstituteArg(), + const internal::SubstituteArg& arg3 = internal::SubstituteArg(), + const internal::SubstituteArg& arg4 = internal::SubstituteArg(), + const internal::SubstituteArg& arg5 = internal::SubstituteArg(), + const internal::SubstituteArg& arg6 = internal::SubstituteArg(), + const internal::SubstituteArg& arg7 = internal::SubstituteArg(), + const internal::SubstituteArg& arg8 = internal::SubstituteArg(), + const internal::SubstituteArg& arg9 = internal::SubstituteArg()); + +} // namespace strings +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/template_util.h b/toolkit/components/protobuf/src/google/protobuf/stubs/template_util.h new file mode 100644 index 0000000000000..4f30ffa3bbec2 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/template_util.h @@ -0,0 +1,138 @@ +// Copyright 2005 Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ---- +// Author: lar@google.com (Laramie Leavitt) +// +// Template metaprogramming utility functions. +// +// This code is compiled directly on many platforms, including client +// platforms like Windows, Mac, and embedded systems. Before making +// any changes here, make sure that you're not breaking any platforms. +// +// +// The names choosen here reflect those used in tr1 and the boost::mpl +// library, there are similar operations used in the Loki library as +// well. I prefer the boost names for 2 reasons: +// 1. I think that portions of the Boost libraries are more likely to +// be included in the c++ standard. +// 2. It is not impossible that some of the boost libraries will be +// included in our own build in the future. +// Both of these outcomes means that we may be able to directly replace +// some of these with boost equivalents. +// +#ifndef GOOGLE_PROTOBUF_TEMPLATE_UTIL_H_ +#define GOOGLE_PROTOBUF_TEMPLATE_UTIL_H_ + +namespace google { +namespace protobuf { +namespace internal { + +// Types small_ and big_ are guaranteed such that sizeof(small_) < +// sizeof(big_) +typedef char small_; + +struct big_ { + char dummy[2]; +}; + +// Identity metafunction. +template +struct identity_ { + typedef T type; +}; + +// integral_constant, defined in tr1, is a wrapper for an integer +// value. We don't really need this generality; we could get away +// with hardcoding the integer type to bool. We use the fully +// general integer_constant for compatibility with tr1. + +template +struct integral_constant { + static const T value = v; + typedef T value_type; + typedef integral_constant type; +}; + +template const T integral_constant::value; + + +// Abbreviations: true_type and false_type are structs that represent boolean +// true and false values. Also define the boost::mpl versions of those names, +// true_ and false_. +typedef integral_constant true_type; +typedef integral_constant false_type; +typedef true_type true_; +typedef false_type false_; + +// if_ is a templatized conditional statement. +// if_ is a compile time evaluation of cond. +// if_<>::type contains A if cond is true, B otherwise. +template +struct if_{ + typedef A type; +}; + +template +struct if_ { + typedef B type; +}; + + +// type_equals_ is a template type comparator, similar to Loki IsSameType. +// type_equals_::value is true iff "A" is the same type as "B". +// +// New code should prefer base::is_same, defined in base/type_traits.h. +// It is functionally identical, but is_same is the standard spelling. +template +struct type_equals_ : public false_ { +}; + +template +struct type_equals_ : public true_ { +}; + +// and_ is a template && operator. +// and_::value evaluates "A::value && B::value". +template +struct and_ : public integral_constant { +}; + +// or_ is a template || operator. +// or_::value evaluates "A::value || B::value". +template +struct or_ : public integral_constant { +}; + + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_TEMPLATE_UTIL_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/stubs/type_traits.h b/toolkit/components/protobuf/src/google/protobuf/stubs/type_traits.h new file mode 100644 index 0000000000000..0ef166b7abde6 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/stubs/type_traits.h @@ -0,0 +1,334 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// ---- +// Author: Matt Austern +// +// This code is compiled directly on many platforms, including client +// platforms like Windows, Mac, and embedded systems. Before making +// any changes here, make sure that you're not breaking any platforms. +// +// Define a small subset of tr1 type traits. The traits we define are: +// is_integral +// is_floating_point +// is_pointer +// is_enum +// is_reference +// is_pod +// has_trivial_constructor +// has_trivial_copy +// has_trivial_assign +// has_trivial_destructor +// remove_const +// remove_volatile +// remove_cv +// remove_reference +// add_reference +// remove_pointer +// is_same +// is_convertible +// We can add more type traits as required. + +#ifndef GOOGLE_PROTOBUF_TYPE_TRAITS_H_ +#define GOOGLE_PROTOBUF_TYPE_TRAITS_H_ + +#include // For pair + +#include // For true_type and false_type + +namespace google { +namespace protobuf { +namespace internal { + +template struct is_integral; +template struct is_floating_point; +template struct is_pointer; +// MSVC can't compile this correctly, and neither can gcc 3.3.5 (at least) +#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) +// is_enum uses is_convertible, which is not available on MSVC. +template struct is_enum; +#endif +template struct is_reference; +template struct is_pod; +template struct has_trivial_constructor; +template struct has_trivial_copy; +template struct has_trivial_assign; +template struct has_trivial_destructor; +template struct remove_const; +template struct remove_volatile; +template struct remove_cv; +template struct remove_reference; +template struct add_reference; +template struct remove_pointer; +template struct is_same; +#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) +template struct is_convertible; +#endif + +// is_integral is false except for the built-in integer types. A +// cv-qualified type is integral if and only if the underlying type is. +template struct is_integral : false_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +#if defined(_MSC_VER) +// wchar_t is not by default a distinct type from unsigned short in +// Microsoft C. +// See http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx +template<> struct is_integral<__wchar_t> : true_type { }; +#else +template<> struct is_integral : true_type { }; +#endif +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template<> struct is_integral : true_type { }; +template struct is_integral : is_integral { }; +template struct is_integral : is_integral { }; +template struct is_integral : is_integral { }; + +// is_floating_point is false except for the built-in floating-point types. +// A cv-qualified type is integral if and only if the underlying type is. +template struct is_floating_point : false_type { }; +template<> struct is_floating_point : true_type { }; +template<> struct is_floating_point : true_type { }; +template<> struct is_floating_point : true_type { }; +template struct is_floating_point + : is_floating_point { }; +template struct is_floating_point + : is_floating_point { }; +template struct is_floating_point + : is_floating_point { }; + +// is_pointer is false except for pointer types. A cv-qualified type (e.g. +// "int* const", as opposed to "int const*") is cv-qualified if and only if +// the underlying type is. +template struct is_pointer : false_type { }; +template struct is_pointer : true_type { }; +template struct is_pointer : is_pointer { }; +template struct is_pointer : is_pointer { }; +template struct is_pointer : is_pointer { }; + +#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) + +namespace internal { + +template struct is_class_or_union { + template static small_ tester(void (U::*)()); + template static big_ tester(...); + static const bool value = sizeof(tester(0)) == sizeof(small_); +}; + +// is_convertible chokes if the first argument is an array. That's why +// we use add_reference here. +template struct is_enum_impl + : is_convertible::type, int> { }; + +template struct is_enum_impl : false_type { }; + +} // namespace internal + +// Specified by TR1 [4.5.1] primary type categories. + +// Implementation note: +// +// Each type is either void, integral, floating point, array, pointer, +// reference, member object pointer, member function pointer, enum, +// union or class. Out of these, only integral, floating point, reference, +// class and enum types are potentially convertible to int. Therefore, +// if a type is not a reference, integral, floating point or class and +// is convertible to int, it's a enum. Adding cv-qualification to a type +// does not change whether it's an enum. +// +// Is-convertible-to-int check is done only if all other checks pass, +// because it can't be used with some types (e.g. void or classes with +// inaccessible conversion operators). +template struct is_enum + : internal::is_enum_impl< + is_same::value || + is_integral::value || + is_floating_point::value || + is_reference::value || + internal::is_class_or_union::value, + T> { }; + +template struct is_enum : is_enum { }; +template struct is_enum : is_enum { }; +template struct is_enum : is_enum { }; + +#endif + +// is_reference is false except for reference types. +template struct is_reference : false_type {}; +template struct is_reference : true_type {}; + + +// We can't get is_pod right without compiler help, so fail conservatively. +// We will assume it's false except for arithmetic types, enumerations, +// pointers and cv-qualified versions thereof. Note that std::pair +// is not a POD even if T and U are PODs. +template struct is_pod + : integral_constant::value || + is_floating_point::value || +#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) + // is_enum is not available on MSVC. + is_enum::value || +#endif + is_pointer::value)> { }; +template struct is_pod : is_pod { }; +template struct is_pod : is_pod { }; +template struct is_pod : is_pod { }; + + +// We can't get has_trivial_constructor right without compiler help, so +// fail conservatively. We will assume it's false except for: (1) types +// for which is_pod is true. (2) std::pair of types with trivial +// constructors. (3) array of a type with a trivial constructor. +// (4) const versions thereof. +template struct has_trivial_constructor : is_pod { }; +template struct has_trivial_constructor > + : integral_constant::value && + has_trivial_constructor::value)> { }; +template struct has_trivial_constructor + : has_trivial_constructor { }; +template struct has_trivial_constructor + : has_trivial_constructor { }; + +// We can't get has_trivial_copy right without compiler help, so fail +// conservatively. We will assume it's false except for: (1) types +// for which is_pod is true. (2) std::pair of types with trivial copy +// constructors. (3) array of a type with a trivial copy constructor. +// (4) const versions thereof. +template struct has_trivial_copy : is_pod { }; +template struct has_trivial_copy > + : integral_constant::value && + has_trivial_copy::value)> { }; +template struct has_trivial_copy + : has_trivial_copy { }; +template struct has_trivial_copy : has_trivial_copy { }; + +// We can't get has_trivial_assign right without compiler help, so fail +// conservatively. We will assume it's false except for: (1) types +// for which is_pod is true. (2) std::pair of types with trivial copy +// constructors. (3) array of a type with a trivial assign constructor. +template struct has_trivial_assign : is_pod { }; +template struct has_trivial_assign > + : integral_constant::value && + has_trivial_assign::value)> { }; +template struct has_trivial_assign + : has_trivial_assign { }; + +// We can't get has_trivial_destructor right without compiler help, so +// fail conservatively. We will assume it's false except for: (1) types +// for which is_pod is true. (2) std::pair of types with trivial +// destructors. (3) array of a type with a trivial destructor. +// (4) const versions thereof. +template struct has_trivial_destructor : is_pod { }; +template struct has_trivial_destructor > + : integral_constant::value && + has_trivial_destructor::value)> { }; +template struct has_trivial_destructor + : has_trivial_destructor { }; +template struct has_trivial_destructor + : has_trivial_destructor { }; + +// Specified by TR1 [4.7.1] +template struct remove_const { typedef T type; }; +template struct remove_const { typedef T type; }; +template struct remove_volatile { typedef T type; }; +template struct remove_volatile { typedef T type; }; +template struct remove_cv { + typedef typename remove_const::type>::type type; +}; + + +// Specified by TR1 [4.7.2] Reference modifications. +template struct remove_reference { typedef T type; }; +template struct remove_reference { typedef T type; }; + +template struct add_reference { typedef T& type; }; +template struct add_reference { typedef T& type; }; + +// Specified by TR1 [4.7.4] Pointer modifications. +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { + typedef T type; }; + +// Specified by TR1 [4.6] Relationships between types +template struct is_same : public false_type { }; +template struct is_same : public true_type { }; + +// Specified by TR1 [4.6] Relationships between types +#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) +namespace internal { + +// This class is an implementation detail for is_convertible, and you +// don't need to know how it works to use is_convertible. For those +// who care: we declare two different functions, one whose argument is +// of type To and one with a variadic argument list. We give them +// return types of different size, so we can use sizeof to trick the +// compiler into telling us which function it would have chosen if we +// had called it with an argument of type From. See Alexandrescu's +// _Modern C++ Design_ for more details on this sort of trick. + +template +struct ConvertHelper { + static small_ Test(To); + static big_ Test(...); + static From Create(); +}; +} // namespace internal + +// Inherits from true_type if From is convertible to To, false_type otherwise. +template +struct is_convertible + : integral_constant::Test( + internal::ConvertHelper::Create())) + == sizeof(small_)> { +}; +#endif + +} // namespace internal +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_TYPE_TRAITS_H_ diff --git a/toolkit/components/protobuf/src/google/protobuf/text_format.cc b/toolkit/components/protobuf/src/google/protobuf/text_format.cc new file mode 100644 index 0000000000000..84cdbb57e4341 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/text_format.cc @@ -0,0 +1,1746 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: jschorr@google.com (Joseph Schorr) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +namespace { + +inline bool IsHexNumber(const string& str) { + return (str.length() >= 2 && str[0] == '0' && + (str[1] == 'x' || str[1] == 'X')); +} + +inline bool IsOctNumber(const string& str) { + return (str.length() >= 2 && str[0] == '0' && + (str[1] >= '0' && str[1] < '8')); +} + +} // namespace + +string Message::DebugString() const { + string debug_string; + + TextFormat::PrintToString(*this, &debug_string); + + return debug_string; +} + +string Message::ShortDebugString() const { + string debug_string; + + TextFormat::Printer printer; + printer.SetSingleLineMode(true); + + printer.PrintToString(*this, &debug_string); + // Single line mode currently might have an extra space at the end. + if (debug_string.size() > 0 && + debug_string[debug_string.size() - 1] == ' ') { + debug_string.resize(debug_string.size() - 1); + } + + return debug_string; +} + +string Message::Utf8DebugString() const { + string debug_string; + + TextFormat::Printer printer; + printer.SetUseUtf8StringEscaping(true); + + printer.PrintToString(*this, &debug_string); + + return debug_string; +} + +void Message::PrintDebugString() const { + printf("%s", DebugString().c_str()); +} + + +// =========================================================================== +// Implementation of the parse information tree class. +TextFormat::ParseInfoTree::ParseInfoTree() { } + +TextFormat::ParseInfoTree::~ParseInfoTree() { + // Remove any nested information trees, as they are owned by this tree. + for (NestedMap::iterator it = nested_.begin(); it != nested_.end(); ++it) { + STLDeleteElements(&(it->second)); + } +} + +void TextFormat::ParseInfoTree::RecordLocation( + const FieldDescriptor* field, + TextFormat::ParseLocation location) { + locations_[field].push_back(location); +} + +TextFormat::ParseInfoTree* TextFormat::ParseInfoTree::CreateNested( + const FieldDescriptor* field) { + // Owned by us in the map. + TextFormat::ParseInfoTree* instance = new TextFormat::ParseInfoTree(); + vector* trees = &nested_[field]; + GOOGLE_CHECK(trees); + trees->push_back(instance); + return instance; +} + +void CheckFieldIndex(const FieldDescriptor* field, int index) { + if (field == NULL) { return; } + + if (field->is_repeated() && index == -1) { + GOOGLE_LOG(DFATAL) << "Index must be in range of repeated field values. " + << "Field: " << field->name(); + } else if (!field->is_repeated() && index != -1) { + GOOGLE_LOG(DFATAL) << "Index must be -1 for singular fields." + << "Field: " << field->name(); + } +} + +TextFormat::ParseLocation TextFormat::ParseInfoTree::GetLocation( + const FieldDescriptor* field, int index) const { + CheckFieldIndex(field, index); + if (index == -1) { index = 0; } + + const vector* locations = + FindOrNull(locations_, field); + if (locations == NULL || index >= locations->size()) { + return TextFormat::ParseLocation(); + } + + return (*locations)[index]; +} + +TextFormat::ParseInfoTree* TextFormat::ParseInfoTree::GetTreeForNested( + const FieldDescriptor* field, int index) const { + CheckFieldIndex(field, index); + if (index == -1) { index = 0; } + + const vector* trees = FindOrNull(nested_, field); + if (trees == NULL || index >= trees->size()) { + return NULL; + } + + return (*trees)[index]; +} + + +// =========================================================================== +// Internal class for parsing an ASCII representation of a Protocol Message. +// This class makes use of the Protocol Message compiler's tokenizer found +// in //google/protobuf/io/tokenizer.h. Note that class's Parse +// method is *not* thread-safe and should only be used in a single thread at +// a time. + +// Makes code slightly more readable. The meaning of "DO(foo)" is +// "Execute foo and fail if it fails.", where failure is indicated by +// returning false. Borrowed from parser.cc (Thanks Kenton!). +#define DO(STATEMENT) if (STATEMENT) {} else return false + +class TextFormat::Parser::ParserImpl { + public: + + // Determines if repeated values for non-repeated fields and + // oneofs are permitted, e.g., the string "foo: 1 foo: 2" for a + // required/optional field named "foo", or "baz: 1 qux: 2" + // where "baz" and "qux" are members of the same oneof. + enum SingularOverwritePolicy { + ALLOW_SINGULAR_OVERWRITES = 0, // the last value is retained + FORBID_SINGULAR_OVERWRITES = 1, // an error is issued + }; + + ParserImpl(const Descriptor* root_message_type, + io::ZeroCopyInputStream* input_stream, + io::ErrorCollector* error_collector, + TextFormat::Finder* finder, + ParseInfoTree* parse_info_tree, + SingularOverwritePolicy singular_overwrite_policy, + bool allow_case_insensitive_field, + bool allow_unknown_field, + bool allow_unknown_enum, + bool allow_field_number, + bool allow_relaxed_whitespace) + : error_collector_(error_collector), + finder_(finder), + parse_info_tree_(parse_info_tree), + tokenizer_error_collector_(this), + tokenizer_(input_stream, &tokenizer_error_collector_), + root_message_type_(root_message_type), + singular_overwrite_policy_(singular_overwrite_policy), + allow_case_insensitive_field_(allow_case_insensitive_field), + allow_unknown_field_(allow_unknown_field), + allow_unknown_enum_(allow_unknown_enum), + allow_field_number_(allow_field_number), + had_errors_(false) { + // For backwards-compatibility with proto1, we need to allow the 'f' suffix + // for floats. + tokenizer_.set_allow_f_after_float(true); + + // '#' starts a comment. + tokenizer_.set_comment_style(io::Tokenizer::SH_COMMENT_STYLE); + + if (allow_relaxed_whitespace) { + tokenizer_.set_require_space_after_number(false); + tokenizer_.set_allow_multiline_strings(true); + } + + // Consume the starting token. + tokenizer_.Next(); + } + ~ParserImpl() { } + + // Parses the ASCII representation specified in input and saves the + // information into the output pointer (a Message). Returns + // false if an error occurs (an error will also be logged to + // GOOGLE_LOG(ERROR)). + bool Parse(Message* output) { + // Consume fields until we cannot do so anymore. + while (true) { + if (LookingAtType(io::Tokenizer::TYPE_END)) { + return !had_errors_; + } + + DO(ConsumeField(output)); + } + } + + bool ParseField(const FieldDescriptor* field, Message* output) { + bool suc; + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + suc = ConsumeFieldMessage(output, output->GetReflection(), field); + } else { + suc = ConsumeFieldValue(output, output->GetReflection(), field); + } + return suc && LookingAtType(io::Tokenizer::TYPE_END); + } + + void ReportError(int line, int col, const string& message) { + had_errors_ = true; + if (error_collector_ == NULL) { + if (line >= 0) { + GOOGLE_LOG(ERROR) << "Error parsing text-format " + << root_message_type_->full_name() + << ": " << (line + 1) << ":" + << (col + 1) << ": " << message; + } else { + GOOGLE_LOG(ERROR) << "Error parsing text-format " + << root_message_type_->full_name() + << ": " << message; + } + } else { + error_collector_->AddError(line, col, message); + } + } + + void ReportWarning(int line, int col, const string& message) { + if (error_collector_ == NULL) { + if (line >= 0) { + GOOGLE_LOG(WARNING) << "Warning parsing text-format " + << root_message_type_->full_name() + << ": " << (line + 1) << ":" + << (col + 1) << ": " << message; + } else { + GOOGLE_LOG(WARNING) << "Warning parsing text-format " + << root_message_type_->full_name() + << ": " << message; + } + } else { + error_collector_->AddWarning(line, col, message); + } + } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserImpl); + + // Reports an error with the given message with information indicating + // the position (as derived from the current token). + void ReportError(const string& message) { + ReportError(tokenizer_.current().line, tokenizer_.current().column, + message); + } + + // Reports a warning with the given message with information indicating + // the position (as derived from the current token). + void ReportWarning(const string& message) { + ReportWarning(tokenizer_.current().line, tokenizer_.current().column, + message); + } + + // Consumes the specified message with the given starting delimeter. + // This method checks to see that the end delimeter at the conclusion of + // the consumption matches the starting delimeter passed in here. + bool ConsumeMessage(Message* message, const string delimeter) { + while (!LookingAt(">") && !LookingAt("}")) { + DO(ConsumeField(message)); + } + + // Confirm that we have a valid ending delimeter. + DO(Consume(delimeter)); + + return true; + } + + + // Consumes the current field (as returned by the tokenizer) on the + // passed in message. + bool ConsumeField(Message* message) { + const Reflection* reflection = message->GetReflection(); + const Descriptor* descriptor = message->GetDescriptor(); + + string field_name; + + const FieldDescriptor* field = NULL; + int start_line = tokenizer_.current().line; + int start_column = tokenizer_.current().column; + + if (TryConsume("[")) { + // Extension. + DO(ConsumeIdentifier(&field_name)); + while (TryConsume(".")) { + string part; + DO(ConsumeIdentifier(&part)); + field_name += "."; + field_name += part; + } + DO(Consume("]")); + + field = (finder_ != NULL + ? finder_->FindExtension(message, field_name) + : reflection->FindKnownExtensionByName(field_name)); + + if (field == NULL) { + if (!allow_unknown_field_) { + ReportError("Extension \"" + field_name + "\" is not defined or " + "is not an extension of \"" + + descriptor->full_name() + "\"."); + return false; + } else { + ReportWarning("Extension \"" + field_name + "\" is not defined or " + "is not an extension of \"" + + descriptor->full_name() + "\"."); + } + } + } else { + DO(ConsumeIdentifier(&field_name)); + + int32 field_number; + if (allow_field_number_ && safe_strto32(field_name, &field_number)) { + if (descriptor->IsExtensionNumber(field_number)) { + field = reflection->FindKnownExtensionByNumber(field_number); + } else { + field = descriptor->FindFieldByNumber(field_number); + } + } else { + field = descriptor->FindFieldByName(field_name); + // Group names are expected to be capitalized as they appear in the + // .proto file, which actually matches their type names, not their + // field names. + if (field == NULL) { + string lower_field_name = field_name; + LowerString(&lower_field_name); + field = descriptor->FindFieldByName(lower_field_name); + // If the case-insensitive match worked but the field is NOT a group, + if (field != NULL && field->type() != FieldDescriptor::TYPE_GROUP) { + field = NULL; + } + } + // Again, special-case group names as described above. + if (field != NULL && field->type() == FieldDescriptor::TYPE_GROUP + && field->message_type()->name() != field_name) { + field = NULL; + } + + if (field == NULL && allow_case_insensitive_field_) { + string lower_field_name = field_name; + LowerString(&lower_field_name); + field = descriptor->FindFieldByLowercaseName(lower_field_name); + } + } + + if (field == NULL) { + if (!allow_unknown_field_) { + ReportError("Message type \"" + descriptor->full_name() + + "\" has no field named \"" + field_name + "\"."); + return false; + } else { + ReportWarning("Message type \"" + descriptor->full_name() + + "\" has no field named \"" + field_name + "\"."); + } + } + } + + // Skips unknown field. + if (field == NULL) { + GOOGLE_CHECK(allow_unknown_field_); + // Try to guess the type of this field. + // If this field is not a message, there should be a ":" between the + // field name and the field value and also the field value should not + // start with "{" or "<" which indicates the begining of a message body. + // If there is no ":" or there is a "{" or "<" after ":", this field has + // to be a message or the input is ill-formed. + if (TryConsume(":") && !LookingAt("{") && !LookingAt("<")) { + return SkipFieldValue(); + } else { + return SkipFieldMessage(); + } + } + + if (singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) { + // Fail if the field is not repeated and it has already been specified. + if (!field->is_repeated() && reflection->HasField(*message, field)) { + ReportError("Non-repeated field \"" + field_name + + "\" is specified multiple times."); + return false; + } + // Fail if the field is a member of a oneof and another member has already + // been specified. + const OneofDescriptor* oneof = field->containing_oneof(); + if (oneof != NULL && reflection->HasOneof(*message, oneof)) { + const FieldDescriptor* other_field = + reflection->GetOneofFieldDescriptor(*message, oneof); + ReportError("Field \"" + field_name + "\" is specified along with " + "field \"" + other_field->name() + "\", another member " + "of oneof \"" + oneof->name() + "\"."); + return false; + } + } + + // Perform special handling for embedded message types. + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + // ':' is optional here. + TryConsume(":"); + } else { + // ':' is required here. + DO(Consume(":")); + } + + if (field->is_repeated() && TryConsume("[")) { + // Short repeated format, e.g. "foo: [1, 2, 3]" + while (true) { + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + // Perform special handling for embedded message types. + DO(ConsumeFieldMessage(message, reflection, field)); + } else { + DO(ConsumeFieldValue(message, reflection, field)); + } + if (TryConsume("]")) { + break; + } + DO(Consume(",")); + } + } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + DO(ConsumeFieldMessage(message, reflection, field)); + } else { + DO(ConsumeFieldValue(message, reflection, field)); + } + + // For historical reasons, fields may optionally be separated by commas or + // semicolons. + TryConsume(";") || TryConsume(","); + + if (field->options().deprecated()) { + ReportWarning("text format contains deprecated field \"" + + field_name + "\""); + } + + // If a parse info tree exists, add the location for the parsed + // field. + if (parse_info_tree_ != NULL) { + RecordLocation(parse_info_tree_, field, + ParseLocation(start_line, start_column)); + } + + return true; + } + + // Skips the next field including the field's name and value. + bool SkipField() { + string field_name; + if (TryConsume("[")) { + // Extension name. + DO(ConsumeIdentifier(&field_name)); + while (TryConsume(".")) { + string part; + DO(ConsumeIdentifier(&part)); + field_name += "."; + field_name += part; + } + DO(Consume("]")); + } else { + DO(ConsumeIdentifier(&field_name)); + } + + // Try to guess the type of this field. + // If this field is not a message, there should be a ":" between the + // field name and the field value and also the field value should not + // start with "{" or "<" which indicates the begining of a message body. + // If there is no ":" or there is a "{" or "<" after ":", this field has + // to be a message or the input is ill-formed. + if (TryConsume(":") && !LookingAt("{") && !LookingAt("<")) { + DO(SkipFieldValue()); + } else { + DO(SkipFieldMessage()); + } + // For historical reasons, fields may optionally be separated by commas or + // semicolons. + TryConsume(";") || TryConsume(","); + return true; + } + + bool ConsumeFieldMessage(Message* message, + const Reflection* reflection, + const FieldDescriptor* field) { + + // If the parse information tree is not NULL, create a nested one + // for the nested message. + ParseInfoTree* parent = parse_info_tree_; + if (parent != NULL) { + parse_info_tree_ = CreateNested(parent, field); + } + + string delimeter; + if (TryConsume("<")) { + delimeter = ">"; + } else { + DO(Consume("{")); + delimeter = "}"; + } + + if (field->is_repeated()) { + DO(ConsumeMessage(reflection->AddMessage(message, field), delimeter)); + } else { + DO(ConsumeMessage(reflection->MutableMessage(message, field), + delimeter)); + } + + // Reset the parse information tree. + parse_info_tree_ = parent; + return true; + } + + // Skips the whole body of a message including the begining delimeter and + // the ending delimeter. + bool SkipFieldMessage() { + string delimeter; + if (TryConsume("<")) { + delimeter = ">"; + } else { + DO(Consume("{")); + delimeter = "}"; + } + while (!LookingAt(">") && !LookingAt("}")) { + DO(SkipField()); + } + DO(Consume(delimeter)); + return true; + } + + bool ConsumeFieldValue(Message* message, + const Reflection* reflection, + const FieldDescriptor* field) { + +// Define an easy to use macro for setting fields. This macro checks +// to see if the field is repeated (in which case we need to use the Add +// methods or not (in which case we need to use the Set methods). +#define SET_FIELD(CPPTYPE, VALUE) \ + if (field->is_repeated()) { \ + reflection->Add##CPPTYPE(message, field, VALUE); \ + } else { \ + reflection->Set##CPPTYPE(message, field, VALUE); \ + } \ + + switch(field->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: { + int64 value; + DO(ConsumeSignedInteger(&value, kint32max)); + SET_FIELD(Int32, static_cast(value)); + break; + } + + case FieldDescriptor::CPPTYPE_UINT32: { + uint64 value; + DO(ConsumeUnsignedInteger(&value, kuint32max)); + SET_FIELD(UInt32, static_cast(value)); + break; + } + + case FieldDescriptor::CPPTYPE_INT64: { + int64 value; + DO(ConsumeSignedInteger(&value, kint64max)); + SET_FIELD(Int64, value); + break; + } + + case FieldDescriptor::CPPTYPE_UINT64: { + uint64 value; + DO(ConsumeUnsignedInteger(&value, kuint64max)); + SET_FIELD(UInt64, value); + break; + } + + case FieldDescriptor::CPPTYPE_FLOAT: { + double value; + DO(ConsumeDouble(&value)); + SET_FIELD(Float, static_cast(value)); + break; + } + + case FieldDescriptor::CPPTYPE_DOUBLE: { + double value; + DO(ConsumeDouble(&value)); + SET_FIELD(Double, value); + break; + } + + case FieldDescriptor::CPPTYPE_STRING: { + string value; + DO(ConsumeString(&value)); + SET_FIELD(String, value); + break; + } + + case FieldDescriptor::CPPTYPE_BOOL: { + if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + uint64 value; + DO(ConsumeUnsignedInteger(&value, 1)); + SET_FIELD(Bool, value); + } else { + string value; + DO(ConsumeIdentifier(&value)); + if (value == "true" || value == "True" || value == "t") { + SET_FIELD(Bool, true); + } else if (value == "false" || value == "False" || value == "f") { + SET_FIELD(Bool, false); + } else { + ReportError("Invalid value for boolean field \"" + field->name() + + "\". Value: \"" + value + "\"."); + return false; + } + } + break; + } + + case FieldDescriptor::CPPTYPE_ENUM: { + string value; + const EnumDescriptor* enum_type = field->enum_type(); + const EnumValueDescriptor* enum_value = NULL; + + if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + DO(ConsumeIdentifier(&value)); + // Find the enumeration value. + enum_value = enum_type->FindValueByName(value); + + } else if (LookingAt("-") || + LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + int64 int_value; + DO(ConsumeSignedInteger(&int_value, kint32max)); + value = SimpleItoa(int_value); // for error reporting + enum_value = enum_type->FindValueByNumber(int_value); + } else { + ReportError("Expected integer or identifier."); + return false; + } + + if (enum_value == NULL) { + if (!allow_unknown_enum_) { + ReportError("Unknown enumeration value of \"" + value + "\" for " + "field \"" + field->name() + "\"."); + return false; + } else { + ReportWarning("Unknown enumeration value of \"" + value + "\" for " + "field \"" + field->name() + "\"."); + return true; + } + } + + SET_FIELD(Enum, enum_value); + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: { + // We should never get here. Put here instead of a default + // so that if new types are added, we get a nice compiler warning. + GOOGLE_LOG(FATAL) << "Reached an unintended state: CPPTYPE_MESSAGE"; + break; + } + } +#undef SET_FIELD + return true; + } + + bool SkipFieldValue() { + if (LookingAtType(io::Tokenizer::TYPE_STRING)) { + while (LookingAtType(io::Tokenizer::TYPE_STRING)) { + tokenizer_.Next(); + } + return true; + } + // Possible field values other than string: + // 12345 => TYPE_INTEGER + // -12345 => TYPE_SYMBOL + TYPE_INTEGER + // 1.2345 => TYPE_FLOAT + // -1.2345 => TYPE_SYMBOL + TYPE_FLOAT + // inf => TYPE_IDENTIFIER + // -inf => TYPE_SYMBOL + TYPE_IDENTIFIER + // TYPE_INTEGER => TYPE_IDENTIFIER + // Divides them into two group, one with TYPE_SYMBOL + // and the other without: + // Group one: + // 12345 => TYPE_INTEGER + // 1.2345 => TYPE_FLOAT + // inf => TYPE_IDENTIFIER + // TYPE_INTEGER => TYPE_IDENTIFIER + // Group two: + // -12345 => TYPE_SYMBOL + TYPE_INTEGER + // -1.2345 => TYPE_SYMBOL + TYPE_FLOAT + // -inf => TYPE_SYMBOL + TYPE_IDENTIFIER + // As we can see, the field value consists of an optional '-' and one of + // TYPE_INTEGER, TYPE_FLOAT and TYPE_IDENTIFIER. + bool has_minus = TryConsume("-"); + if (!LookingAtType(io::Tokenizer::TYPE_INTEGER) && + !LookingAtType(io::Tokenizer::TYPE_FLOAT) && + !LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + return false; + } + // Combination of '-' and TYPE_IDENTIFIER may result in an invalid field + // value while other combinations all generate valid values. + // We check if the value of this combination is valid here. + // TYPE_IDENTIFIER after a '-' should be one of the float values listed + // below: + // inf, inff, infinity, nan + if (has_minus && LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + string text = tokenizer_.current().text; + LowerString(&text); + if (text != "inf" && + text != "infinity" && + text != "nan") { + ReportError("Invalid float number: " + text); + return false; + } + } + tokenizer_.Next(); + return true; + } + + // Returns true if the current token's text is equal to that specified. + bool LookingAt(const string& text) { + return tokenizer_.current().text == text; + } + + // Returns true if the current token's type is equal to that specified. + bool LookingAtType(io::Tokenizer::TokenType token_type) { + return tokenizer_.current().type == token_type; + } + + // Consumes an identifier and saves its value in the identifier parameter. + // Returns false if the token is not of type IDENTFIER. + bool ConsumeIdentifier(string* identifier) { + if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + *identifier = tokenizer_.current().text; + tokenizer_.Next(); + return true; + } + + // If allow_field_numer_ or allow_unknown_field_ is true, we should able + // to parse integer identifiers. + if ((allow_field_number_ || allow_unknown_field_) + && LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + *identifier = tokenizer_.current().text; + tokenizer_.Next(); + return true; + } + + ReportError("Expected identifier."); + return false; + } + + // Consumes a string and saves its value in the text parameter. + // Returns false if the token is not of type STRING. + bool ConsumeString(string* text) { + if (!LookingAtType(io::Tokenizer::TYPE_STRING)) { + ReportError("Expected string."); + return false; + } + + text->clear(); + while (LookingAtType(io::Tokenizer::TYPE_STRING)) { + io::Tokenizer::ParseStringAppend(tokenizer_.current().text, text); + + tokenizer_.Next(); + } + + return true; + } + + // Consumes a uint64 and saves its value in the value parameter. + // Returns false if the token is not of type INTEGER. + bool ConsumeUnsignedInteger(uint64* value, uint64 max_value) { + if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + ReportError("Expected integer."); + return false; + } + + if (!io::Tokenizer::ParseInteger(tokenizer_.current().text, + max_value, value)) { + ReportError("Integer out of range."); + return false; + } + + tokenizer_.Next(); + return true; + } + + // Consumes an int64 and saves its value in the value parameter. + // Note that since the tokenizer does not support negative numbers, + // we actually may consume an additional token (for the minus sign) in this + // method. Returns false if the token is not an integer + // (signed or otherwise). + bool ConsumeSignedInteger(int64* value, uint64 max_value) { + bool negative = false; + + if (TryConsume("-")) { + negative = true; + // Two's complement always allows one more negative integer than + // positive. + ++max_value; + } + + uint64 unsigned_value; + + DO(ConsumeUnsignedInteger(&unsigned_value, max_value)); + + *value = static_cast(unsigned_value); + + if (negative) { + *value = -*value; + } + + return true; + } + + // Consumes a uint64 and saves its value in the value parameter. + // Accepts decimal numbers only, rejects hex or oct numbers. + bool ConsumeUnsignedDecimalInteger(uint64* value, uint64 max_value) { + if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + ReportError("Expected integer."); + return false; + } + + const string& text = tokenizer_.current().text; + if (IsHexNumber(text) || IsOctNumber(text)) { + ReportError("Expect a decimal number."); + return false; + } + + if (!io::Tokenizer::ParseInteger(text, max_value, value)) { + ReportError("Integer out of range."); + return false; + } + + tokenizer_.Next(); + return true; + } + + // Consumes a double and saves its value in the value parameter. + // Note that since the tokenizer does not support negative numbers, + // we actually may consume an additional token (for the minus sign) in this + // method. Returns false if the token is not a double + // (signed or otherwise). + bool ConsumeDouble(double* value) { + bool negative = false; + + if (TryConsume("-")) { + negative = true; + } + + // A double can actually be an integer, according to the tokenizer. + // Therefore, we must check both cases here. + if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + // We have found an integer value for the double. + uint64 integer_value; + DO(ConsumeUnsignedDecimalInteger(&integer_value, kuint64max)); + + *value = static_cast(integer_value); + } else if (LookingAtType(io::Tokenizer::TYPE_FLOAT)) { + // We have found a float value for the double. + *value = io::Tokenizer::ParseFloat(tokenizer_.current().text); + + // Mark the current token as consumed. + tokenizer_.Next(); + } else if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + string text = tokenizer_.current().text; + LowerString(&text); + if (text == "inf" || + text == "infinity") { + *value = std::numeric_limits::infinity(); + tokenizer_.Next(); + } else if (text == "nan") { + *value = std::numeric_limits::quiet_NaN(); + tokenizer_.Next(); + } else { + ReportError("Expected double."); + return false; + } + } else { + ReportError("Expected double."); + return false; + } + + if (negative) { + *value = -*value; + } + + return true; + } + + // Consumes a token and confirms that it matches that specified in the + // value parameter. Returns false if the token found does not match that + // which was specified. + bool Consume(const string& value) { + const string& current_value = tokenizer_.current().text; + + if (current_value != value) { + ReportError("Expected \"" + value + "\", found \"" + current_value + + "\"."); + return false; + } + + tokenizer_.Next(); + + return true; + } + + // Attempts to consume the supplied value. Returns false if a the + // token found does not match the value specified. + bool TryConsume(const string& value) { + if (tokenizer_.current().text == value) { + tokenizer_.Next(); + return true; + } else { + return false; + } + } + + // An internal instance of the Tokenizer's error collector, used to + // collect any base-level parse errors and feed them to the ParserImpl. + class ParserErrorCollector : public io::ErrorCollector { + public: + explicit ParserErrorCollector(TextFormat::Parser::ParserImpl* parser) : + parser_(parser) { } + + virtual ~ParserErrorCollector() { } + + virtual void AddError(int line, int column, const string& message) { + parser_->ReportError(line, column, message); + } + + virtual void AddWarning(int line, int column, const string& message) { + parser_->ReportWarning(line, column, message); + } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserErrorCollector); + TextFormat::Parser::ParserImpl* parser_; + }; + + io::ErrorCollector* error_collector_; + TextFormat::Finder* finder_; + ParseInfoTree* parse_info_tree_; + ParserErrorCollector tokenizer_error_collector_; + io::Tokenizer tokenizer_; + const Descriptor* root_message_type_; + SingularOverwritePolicy singular_overwrite_policy_; + const bool allow_case_insensitive_field_; + const bool allow_unknown_field_; + const bool allow_unknown_enum_; + const bool allow_field_number_; + bool had_errors_; +}; + +#undef DO + +// =========================================================================== +// Internal class for writing text to the io::ZeroCopyOutputStream. Adapted +// from the Printer found in //google/protobuf/io/printer.h +class TextFormat::Printer::TextGenerator { + public: + explicit TextGenerator(io::ZeroCopyOutputStream* output, + int initial_indent_level) + : output_(output), + buffer_(NULL), + buffer_size_(0), + at_start_of_line_(true), + failed_(false), + indent_(""), + initial_indent_level_(initial_indent_level) { + indent_.resize(initial_indent_level_ * 2, ' '); + } + + ~TextGenerator() { + // Only BackUp() if we're sure we've successfully called Next() at least + // once. + if (!failed_ && buffer_size_ > 0) { + output_->BackUp(buffer_size_); + } + } + + // Indent text by two spaces. After calling Indent(), two spaces will be + // inserted at the beginning of each line of text. Indent() may be called + // multiple times to produce deeper indents. + void Indent() { + indent_ += " "; + } + + // Reduces the current indent level by two spaces, or crashes if the indent + // level is zero. + void Outdent() { + if (indent_.empty() || + indent_.size() < initial_indent_level_ * 2) { + GOOGLE_LOG(DFATAL) << " Outdent() without matching Indent()."; + return; + } + + indent_.resize(indent_.size() - 2); + } + + // Print text to the output stream. + void Print(const string& str) { + Print(str.data(), str.size()); + } + + // Print text to the output stream. + void Print(const char* text) { + Print(text, strlen(text)); + } + + // Print text to the output stream. + void Print(const char* text, int size) { + int pos = 0; // The number of bytes we've written so far. + + for (int i = 0; i < size; i++) { + if (text[i] == '\n') { + // Saw newline. If there is more text, we may need to insert an indent + // here. So, write what we have so far, including the '\n'. + Write(text + pos, i - pos + 1); + pos = i + 1; + + // Setting this true will cause the next Write() to insert an indent + // first. + at_start_of_line_ = true; + } + } + + // Write the rest. + Write(text + pos, size - pos); + } + + // True if any write to the underlying stream failed. (We don't just + // crash in this case because this is an I/O failure, not a programming + // error.) + bool failed() const { return failed_; } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextGenerator); + + void Write(const char* data, int size) { + if (failed_) return; + if (size == 0) return; + + if (at_start_of_line_) { + // Insert an indent. + at_start_of_line_ = false; + Write(indent_.data(), indent_.size()); + if (failed_) return; + } + + while (size > buffer_size_) { + // Data exceeds space in the buffer. Copy what we can and request a + // new buffer. + memcpy(buffer_, data, buffer_size_); + data += buffer_size_; + size -= buffer_size_; + void* void_buffer; + failed_ = !output_->Next(&void_buffer, &buffer_size_); + if (failed_) return; + buffer_ = reinterpret_cast(void_buffer); + } + + // Buffer is big enough to receive the data; copy it. + memcpy(buffer_, data, size); + buffer_ += size; + buffer_size_ -= size; + } + + io::ZeroCopyOutputStream* const output_; + char* buffer_; + int buffer_size_; + bool at_start_of_line_; + bool failed_; + + string indent_; + int initial_indent_level_; +}; + +// =========================================================================== + +TextFormat::Finder::~Finder() { +} + +TextFormat::Parser::Parser() + : error_collector_(NULL), + finder_(NULL), + parse_info_tree_(NULL), + allow_partial_(false), + allow_case_insensitive_field_(false), + allow_unknown_field_(false), + allow_unknown_enum_(false), + allow_field_number_(false), + allow_relaxed_whitespace_(false), + allow_singular_overwrites_(false) { +} + +TextFormat::Parser::~Parser() {} + +bool TextFormat::Parser::Parse(io::ZeroCopyInputStream* input, + Message* output) { + output->Clear(); + + ParserImpl::SingularOverwritePolicy overwrites_policy = + allow_singular_overwrites_ + ? ParserImpl::ALLOW_SINGULAR_OVERWRITES + : ParserImpl::FORBID_SINGULAR_OVERWRITES; + + ParserImpl parser(output->GetDescriptor(), input, error_collector_, + finder_, parse_info_tree_, + overwrites_policy, + allow_case_insensitive_field_, allow_unknown_field_, + allow_unknown_enum_, allow_field_number_, + allow_relaxed_whitespace_); + return MergeUsingImpl(input, output, &parser); +} + +bool TextFormat::Parser::ParseFromString(const string& input, + Message* output) { + io::ArrayInputStream input_stream(input.data(), input.size()); + return Parse(&input_stream, output); +} + +bool TextFormat::Parser::Merge(io::ZeroCopyInputStream* input, + Message* output) { + ParserImpl parser(output->GetDescriptor(), input, error_collector_, + finder_, parse_info_tree_, + ParserImpl::ALLOW_SINGULAR_OVERWRITES, + allow_case_insensitive_field_, allow_unknown_field_, + allow_unknown_enum_, allow_field_number_, + allow_relaxed_whitespace_); + return MergeUsingImpl(input, output, &parser); +} + +bool TextFormat::Parser::MergeFromString(const string& input, + Message* output) { + io::ArrayInputStream input_stream(input.data(), input.size()); + return Merge(&input_stream, output); +} + +bool TextFormat::Parser::MergeUsingImpl(io::ZeroCopyInputStream* /* input */, + Message* output, + ParserImpl* parser_impl) { + if (!parser_impl->Parse(output)) return false; + if (!allow_partial_ && !output->IsInitialized()) { + vector missing_fields; + output->FindInitializationErrors(&missing_fields); + parser_impl->ReportError(-1, 0, "Message missing required fields: " + + Join(missing_fields, ", ")); + return false; + } + return true; +} + +bool TextFormat::Parser::ParseFieldValueFromString( + const string& input, + const FieldDescriptor* field, + Message* output) { + io::ArrayInputStream input_stream(input.data(), input.size()); + ParserImpl parser(output->GetDescriptor(), &input_stream, error_collector_, + finder_, parse_info_tree_, + ParserImpl::ALLOW_SINGULAR_OVERWRITES, + allow_case_insensitive_field_, allow_unknown_field_, + allow_unknown_enum_, allow_field_number_, + allow_relaxed_whitespace_); + return parser.ParseField(field, output); +} + +/* static */ bool TextFormat::Parse(io::ZeroCopyInputStream* input, + Message* output) { + return Parser().Parse(input, output); +} + +/* static */ bool TextFormat::Merge(io::ZeroCopyInputStream* input, + Message* output) { + return Parser().Merge(input, output); +} + +/* static */ bool TextFormat::ParseFromString(const string& input, + Message* output) { + return Parser().ParseFromString(input, output); +} + +/* static */ bool TextFormat::MergeFromString(const string& input, + Message* output) { + return Parser().MergeFromString(input, output); +} + +// =========================================================================== + +// The default implementation for FieldValuePrinter. The base class just +// does simple formatting. That way, deriving classes could decide to fallback +// to that behavior. +TextFormat::FieldValuePrinter::FieldValuePrinter() {} +TextFormat::FieldValuePrinter::~FieldValuePrinter() {} +string TextFormat::FieldValuePrinter::PrintBool(bool val) const { + return val ? "true" : "false"; +} +string TextFormat::FieldValuePrinter::PrintInt32(int32 val) const { + return SimpleItoa(val); +} +string TextFormat::FieldValuePrinter::PrintUInt32(uint32 val) const { + return SimpleItoa(val); +} +string TextFormat::FieldValuePrinter::PrintInt64(int64 val) const { + return SimpleItoa(val); +} +string TextFormat::FieldValuePrinter::PrintUInt64(uint64 val) const { + return SimpleItoa(val); +} +string TextFormat::FieldValuePrinter::PrintFloat(float val) const { + return SimpleFtoa(val); +} +string TextFormat::FieldValuePrinter::PrintDouble(double val) const { + return SimpleDtoa(val); +} +string TextFormat::FieldValuePrinter::PrintString(const string& val) const { + return StrCat("\"", CEscape(val), "\""); +} +string TextFormat::FieldValuePrinter::PrintBytes(const string& val) const { + return PrintString(val); +} +string TextFormat::FieldValuePrinter::PrintEnum(int32 val, + const string& name) const { + return name; +} +string TextFormat::FieldValuePrinter::PrintFieldName( + const Message& message, + const Reflection* reflection, + const FieldDescriptor* field) const { + if (field->is_extension()) { + // We special-case MessageSet elements for compatibility with proto1. + if (field->containing_type()->options().message_set_wire_format() + && field->type() == FieldDescriptor::TYPE_MESSAGE + && field->is_optional() + && field->extension_scope() == field->message_type()) { + return StrCat("[", field->message_type()->full_name(), "]"); + } else { + return StrCat("[", field->full_name(), "]"); + } + } else if (field->type() == FieldDescriptor::TYPE_GROUP) { + // Groups must be serialized with their original capitalization. + return field->message_type()->name(); + } else { + return field->name(); + } +} +string TextFormat::FieldValuePrinter::PrintMessageStart( + const Message& message, + int field_index, + int field_count, + bool single_line_mode) const { + return single_line_mode ? " { " : " {\n"; +} +string TextFormat::FieldValuePrinter::PrintMessageEnd( + const Message& message, + int field_index, + int field_count, + bool single_line_mode) const { + return single_line_mode ? "} " : "}\n"; +} + +namespace { +// Our own specialization: for UTF8 escaped strings. +class FieldValuePrinterUtf8Escaping : public TextFormat::FieldValuePrinter { + public: + virtual string PrintString(const string& val) const { + return StrCat("\"", strings::Utf8SafeCEscape(val), "\""); + } + virtual string PrintBytes(const string& val) const { + return TextFormat::FieldValuePrinter::PrintString(val); + } +}; + +} // namespace + +TextFormat::Printer::Printer() + : initial_indent_level_(0), + single_line_mode_(false), + use_field_number_(false), + use_short_repeated_primitives_(false), + hide_unknown_fields_(false), + print_message_fields_in_index_order_(false) { + SetUseUtf8StringEscaping(false); +} + +TextFormat::Printer::~Printer() { + STLDeleteValues(&custom_printers_); +} + +void TextFormat::Printer::SetUseUtf8StringEscaping(bool as_utf8) { + SetDefaultFieldValuePrinter(as_utf8 + ? new FieldValuePrinterUtf8Escaping() + : new FieldValuePrinter()); +} + +void TextFormat::Printer::SetDefaultFieldValuePrinter( + const FieldValuePrinter* printer) { + default_field_value_printer_.reset(printer); +} + +bool TextFormat::Printer::RegisterFieldValuePrinter( + const FieldDescriptor* field, + const FieldValuePrinter* printer) { + return field != NULL + && printer != NULL + && custom_printers_.insert(make_pair(field, printer)).second; +} + +bool TextFormat::Printer::PrintToString(const Message& message, + string* output) const { + GOOGLE_DCHECK(output) << "output specified is NULL"; + + output->clear(); + io::StringOutputStream output_stream(output); + + return Print(message, &output_stream); +} + +bool TextFormat::Printer::PrintUnknownFieldsToString( + const UnknownFieldSet& unknown_fields, + string* output) const { + GOOGLE_DCHECK(output) << "output specified is NULL"; + + output->clear(); + io::StringOutputStream output_stream(output); + return PrintUnknownFields(unknown_fields, &output_stream); +} + +bool TextFormat::Printer::Print(const Message& message, + io::ZeroCopyOutputStream* output) const { + TextGenerator generator(output, initial_indent_level_); + + Print(message, generator); + + // Output false if the generator failed internally. + return !generator.failed(); +} + +bool TextFormat::Printer::PrintUnknownFields( + const UnknownFieldSet& unknown_fields, + io::ZeroCopyOutputStream* output) const { + TextGenerator generator(output, initial_indent_level_); + + PrintUnknownFields(unknown_fields, generator); + + // Output false if the generator failed internally. + return !generator.failed(); +} + +namespace { +// Comparison functor for sorting FieldDescriptors by field index. +struct FieldIndexSorter { + bool operator()(const FieldDescriptor* left, + const FieldDescriptor* right) const { + return left->index() < right->index(); + } +}; +} // namespace + +void TextFormat::Printer::Print(const Message& message, + TextGenerator& generator) const { + const Reflection* reflection = message.GetReflection(); + vector fields; + reflection->ListFields(message, &fields); + if (print_message_fields_in_index_order_) { + sort(fields.begin(), fields.end(), FieldIndexSorter()); + } + for (int i = 0; i < fields.size(); i++) { + PrintField(message, reflection, fields[i], generator); + } + if (!hide_unknown_fields_) { + PrintUnknownFields(reflection->GetUnknownFields(message), generator); + } +} + +void TextFormat::Printer::PrintFieldValueToString( + const Message& message, + const FieldDescriptor* field, + int index, + string* output) const { + + GOOGLE_DCHECK(output) << "output specified is NULL"; + + output->clear(); + io::StringOutputStream output_stream(output); + TextGenerator generator(&output_stream, initial_indent_level_); + + PrintFieldValue(message, message.GetReflection(), field, index, generator); +} + +void TextFormat::Printer::PrintField(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const { + if (use_short_repeated_primitives_ && + field->is_repeated() && + field->cpp_type() != FieldDescriptor::CPPTYPE_STRING && + field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { + PrintShortRepeatedField(message, reflection, field, generator); + return; + } + + int count = 0; + + if (field->is_repeated()) { + count = reflection->FieldSize(message, field); + } else if (reflection->HasField(message, field)) { + count = 1; + } + + for (int j = 0; j < count; ++j) { + const int field_index = field->is_repeated() ? j : -1; + + PrintFieldName(message, reflection, field, generator); + + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + const FieldValuePrinter* printer = FindWithDefault( + custom_printers_, field, default_field_value_printer_.get()); + const Message& sub_message = + field->is_repeated() + ? reflection->GetRepeatedMessage(message, field, j) + : reflection->GetMessage(message, field); + generator.Print( + printer->PrintMessageStart( + sub_message, field_index, count, single_line_mode_)); + generator.Indent(); + Print(sub_message, generator); + generator.Outdent(); + generator.Print( + printer->PrintMessageEnd( + sub_message, field_index, count, single_line_mode_)); + } else { + generator.Print(": "); + // Write the field value. + PrintFieldValue(message, reflection, field, field_index, generator); + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + } + } +} + +void TextFormat::Printer::PrintShortRepeatedField( + const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const { + // Print primitive repeated field in short form. + PrintFieldName(message, reflection, field, generator); + + int size = reflection->FieldSize(message, field); + generator.Print(": ["); + for (int i = 0; i < size; i++) { + if (i > 0) generator.Print(", "); + PrintFieldValue(message, reflection, field, i, generator); + } + if (single_line_mode_) { + generator.Print("] "); + } else { + generator.Print("]\n"); + } +} + +void TextFormat::Printer::PrintFieldName(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const { + // if use_field_number_ is true, prints field number instead + // of field name. + if (use_field_number_) { + generator.Print(SimpleItoa(field->number())); + return; + } + + const FieldValuePrinter* printer = FindWithDefault( + custom_printers_, field, default_field_value_printer_.get()); + generator.Print(printer->PrintFieldName(message, reflection, field)); +} + +void TextFormat::Printer::PrintFieldValue( + const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + int index, + TextGenerator& generator) const { + GOOGLE_DCHECK(field->is_repeated() || (index == -1)) + << "Index must be -1 for non-repeated fields"; + + const FieldValuePrinter* printer + = FindWithDefault(custom_printers_, field, + default_field_value_printer_.get()); + + switch (field->cpp_type()) { +#define OUTPUT_FIELD(CPPTYPE, METHOD) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + generator.Print(printer->Print##METHOD(field->is_repeated() \ + ? reflection->GetRepeated##METHOD(message, field, index) \ + : reflection->Get##METHOD(message, field))); \ + break + + OUTPUT_FIELD( INT32, Int32); + OUTPUT_FIELD( INT64, Int64); + OUTPUT_FIELD(UINT32, UInt32); + OUTPUT_FIELD(UINT64, UInt64); + OUTPUT_FIELD( FLOAT, Float); + OUTPUT_FIELD(DOUBLE, Double); + OUTPUT_FIELD( BOOL, Bool); +#undef OUTPUT_FIELD + + case FieldDescriptor::CPPTYPE_STRING: { + string scratch; + const string& value = field->is_repeated() + ? reflection->GetRepeatedStringReference( + message, field, index, &scratch) + : reflection->GetStringReference(message, field, &scratch); + if (field->type() == FieldDescriptor::TYPE_STRING) { + generator.Print(printer->PrintString(value)); + } else { + GOOGLE_DCHECK_EQ(field->type(), FieldDescriptor::TYPE_BYTES); + generator.Print(printer->PrintBytes(value)); + } + break; + } + + case FieldDescriptor::CPPTYPE_ENUM: { + const EnumValueDescriptor *enum_val = field->is_repeated() + ? reflection->GetRepeatedEnum(message, field, index) + : reflection->GetEnum(message, field); + generator.Print(printer->PrintEnum(enum_val->number(), enum_val->name())); + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: + Print(field->is_repeated() + ? reflection->GetRepeatedMessage(message, field, index) + : reflection->GetMessage(message, field), + generator); + break; + } +} + +/* static */ bool TextFormat::Print(const Message& message, + io::ZeroCopyOutputStream* output) { + return Printer().Print(message, output); +} + +/* static */ bool TextFormat::PrintUnknownFields( + const UnknownFieldSet& unknown_fields, + io::ZeroCopyOutputStream* output) { + return Printer().PrintUnknownFields(unknown_fields, output); +} + +/* static */ bool TextFormat::PrintToString( + const Message& message, string* output) { + return Printer().PrintToString(message, output); +} + +/* static */ bool TextFormat::PrintUnknownFieldsToString( + const UnknownFieldSet& unknown_fields, string* output) { + return Printer().PrintUnknownFieldsToString(unknown_fields, output); +} + +/* static */ void TextFormat::PrintFieldValueToString( + const Message& message, + const FieldDescriptor* field, + int index, + string* output) { + return Printer().PrintFieldValueToString(message, field, index, output); +} + +/* static */ bool TextFormat::ParseFieldValueFromString( + const string& input, + const FieldDescriptor* field, + Message* message) { + return Parser().ParseFieldValueFromString(input, field, message); +} + +// Prints an integer as hex with a fixed number of digits dependent on the +// integer type. +template +static string PaddedHex(IntType value) { + string result; + result.reserve(sizeof(value) * 2); + for (int i = sizeof(value) * 2 - 1; i >= 0; i--) { + result.push_back(int_to_hex_digit(value >> (i*4) & 0x0F)); + } + return result; +} + +void TextFormat::Printer::PrintUnknownFields( + const UnknownFieldSet& unknown_fields, TextGenerator& generator) const { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + string field_number = SimpleItoa(field.number()); + + switch (field.type()) { + case UnknownField::TYPE_VARINT: + generator.Print(field_number); + generator.Print(": "); + generator.Print(SimpleItoa(field.varint())); + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + break; + case UnknownField::TYPE_FIXED32: { + generator.Print(field_number); + generator.Print(": 0x"); + char buffer[kFastToBufferSize]; + generator.Print(FastHex32ToBuffer(field.fixed32(), buffer)); + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + break; + } + case UnknownField::TYPE_FIXED64: { + generator.Print(field_number); + generator.Print(": 0x"); + char buffer[kFastToBufferSize]; + generator.Print(FastHex64ToBuffer(field.fixed64(), buffer)); + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + break; + } + case UnknownField::TYPE_LENGTH_DELIMITED: { + generator.Print(field_number); + const string& value = field.length_delimited(); + UnknownFieldSet embedded_unknown_fields; + if (!value.empty() && embedded_unknown_fields.ParseFromString(value)) { + // This field is parseable as a Message. + // So it is probably an embedded message. + if (single_line_mode_) { + generator.Print(" { "); + } else { + generator.Print(" {\n"); + generator.Indent(); + } + PrintUnknownFields(embedded_unknown_fields, generator); + if (single_line_mode_) { + generator.Print("} "); + } else { + generator.Outdent(); + generator.Print("}\n"); + } + } else { + // This field is not parseable as a Message. + // So it is probably just a plain string. + generator.Print(": \""); + generator.Print(CEscape(value)); + generator.Print("\""); + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + } + break; + } + case UnknownField::TYPE_GROUP: + generator.Print(field_number); + if (single_line_mode_) { + generator.Print(" { "); + } else { + generator.Print(" {\n"); + generator.Indent(); + } + PrintUnknownFields(field.group(), generator); + if (single_line_mode_) { + generator.Print("} "); + } else { + generator.Outdent(); + generator.Print("}\n"); + } + break; + } + } +} + +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/text_format.h b/toolkit/components/protobuf/src/google/protobuf/text_format.h new file mode 100644 index 0000000000000..2954941082d6a --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/text_format.h @@ -0,0 +1,473 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: jschorr@google.com (Joseph Schorr) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Utilities for printing and parsing protocol messages in a human-readable, +// text-based format. + +#ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__ +#define GOOGLE_PROTOBUF_TEXT_FORMAT_H__ + +#include +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { + +namespace io { + class ErrorCollector; // tokenizer.h +} + +// This class implements protocol buffer text format. Printing and parsing +// protocol messages in text format is useful for debugging and human editing +// of messages. +// +// This class is really a namespace that contains only static methods. +class LIBPROTOBUF_EXPORT TextFormat { + public: + // Outputs a textual representation of the given message to the given + // output stream. + static bool Print(const Message& message, io::ZeroCopyOutputStream* output); + + // Print the fields in an UnknownFieldSet. They are printed by tag number + // only. Embedded messages are heuristically identified by attempting to + // parse them. + static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields, + io::ZeroCopyOutputStream* output); + + // Like Print(), but outputs directly to a string. + static bool PrintToString(const Message& message, string* output); + + // Like PrintUnknownFields(), but outputs directly to a string. + static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields, + string* output); + + // Outputs a textual representation of the value of the field supplied on + // the message supplied. For non-repeated fields, an index of -1 must + // be supplied. Note that this method will print the default value for a + // field if it is not set. + static void PrintFieldValueToString(const Message& message, + const FieldDescriptor* field, + int index, + string* output); + + // The default printer that converts scalar values from fields into + // their string representation. + // You can derive from this FieldValuePrinter if you want to have + // fields to be printed in a different way and register it at the + // Printer. + class LIBPROTOBUF_EXPORT FieldValuePrinter { + public: + FieldValuePrinter(); + virtual ~FieldValuePrinter(); + virtual string PrintBool(bool val) const; + virtual string PrintInt32(int32 val) const; + virtual string PrintUInt32(uint32 val) const; + virtual string PrintInt64(int64 val) const; + virtual string PrintUInt64(uint64 val) const; + virtual string PrintFloat(float val) const; + virtual string PrintDouble(double val) const; + virtual string PrintString(const string& val) const; + virtual string PrintBytes(const string& val) const; + virtual string PrintEnum(int32 val, const string& name) const; + virtual string PrintFieldName(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field) const; + virtual string PrintMessageStart(const Message& message, + int field_index, + int field_count, + bool single_line_mode) const; + virtual string PrintMessageEnd(const Message& message, + int field_index, + int field_count, + bool single_line_mode) const; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldValuePrinter); + }; + + // Class for those users which require more fine-grained control over how + // a protobuffer message is printed out. + class LIBPROTOBUF_EXPORT Printer { + public: + Printer(); + ~Printer(); + + // Like TextFormat::Print + bool Print(const Message& message, io::ZeroCopyOutputStream* output) const; + // Like TextFormat::PrintUnknownFields + bool PrintUnknownFields(const UnknownFieldSet& unknown_fields, + io::ZeroCopyOutputStream* output) const; + // Like TextFormat::PrintToString + bool PrintToString(const Message& message, string* output) const; + // Like TextFormat::PrintUnknownFieldsToString + bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields, + string* output) const; + // Like TextFormat::PrintFieldValueToString + void PrintFieldValueToString(const Message& message, + const FieldDescriptor* field, + int index, + string* output) const; + + // Adjust the initial indent level of all output. Each indent level is + // equal to two spaces. + void SetInitialIndentLevel(int indent_level) { + initial_indent_level_ = indent_level; + } + + // If printing in single line mode, then the entire message will be output + // on a single line with no line breaks. + void SetSingleLineMode(bool single_line_mode) { + single_line_mode_ = single_line_mode; + } + + bool IsInSingleLineMode() { + return single_line_mode_; + } + + // If use_field_number is true, uses field number instead of field name. + void SetUseFieldNumber(bool use_field_number) { + use_field_number_ = use_field_number; + } + + // Set true to print repeated primitives in a format like: + // field_name: [1, 2, 3, 4] + // instead of printing each value on its own line. Short format applies + // only to primitive values -- i.e. everything except strings and + // sub-messages/groups. + void SetUseShortRepeatedPrimitives(bool use_short_repeated_primitives) { + use_short_repeated_primitives_ = use_short_repeated_primitives; + } + + // Set true to output UTF-8 instead of ASCII. The only difference + // is that bytes >= 0x80 in string fields will not be escaped, + // because they are assumed to be part of UTF-8 multi-byte + // sequences. This will change the default FieldValuePrinter. + void SetUseUtf8StringEscaping(bool as_utf8); + + // Set the default FieldValuePrinter that is used for all fields that + // don't have a field-specific printer registered. + // Takes ownership of the printer. + void SetDefaultFieldValuePrinter(const FieldValuePrinter* printer); + + // Sets whether we want to hide unknown fields or not. + // Usually unknown fields are printed in a generic way that includes the + // tag number of the field instead of field name. However, sometimes it + // is useful to be able to print the message without unknown fields (e.g. + // for the python protobuf version to maintain consistency between its pure + // python and c++ implementations). + void SetHideUnknownFields(bool hide) { + hide_unknown_fields_ = hide; + } + + // If print_message_fields_in_index_order is true, print fields of a proto + // message using the order defined in source code instead of the field + // number. By default, use the field number order. + void SetPrintMessageFieldsInIndexOrder( + bool print_message_fields_in_index_order) { + print_message_fields_in_index_order_ = + print_message_fields_in_index_order; + } + + // Register a custom field-specific FieldValuePrinter for fields + // with a particular FieldDescriptor. + // Returns "true" if the registration succeeded, or "false", if there is + // already a printer for that FieldDescriptor. + // Takes ownership of the printer on successful registration. + bool RegisterFieldValuePrinter(const FieldDescriptor* field, + const FieldValuePrinter* printer); + + private: + // Forward declaration of an internal class used to print the text + // output to the OutputStream (see text_format.cc for implementation). + class TextGenerator; + + // Internal Print method, used for writing to the OutputStream via + // the TextGenerator class. + void Print(const Message& message, + TextGenerator& generator) const; + + // Print a single field. + void PrintField(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const; + + // Print a repeated primitive field in short form. + void PrintShortRepeatedField(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const; + + // Print the name of a field -- i.e. everything that comes before the + // ':' for a single name/value pair. + void PrintFieldName(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const; + + // Outputs a textual representation of the value of the field supplied on + // the message supplied or the default value if not set. + void PrintFieldValue(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + int index, + TextGenerator& generator) const; + + // Print the fields in an UnknownFieldSet. They are printed by tag number + // only. Embedded messages are heuristically identified by attempting to + // parse them. + void PrintUnknownFields(const UnknownFieldSet& unknown_fields, + TextGenerator& generator) const; + + int initial_indent_level_; + + bool single_line_mode_; + + bool use_field_number_; + + bool use_short_repeated_primitives_; + + bool hide_unknown_fields_; + + bool print_message_fields_in_index_order_; + + scoped_ptr default_field_value_printer_; + typedef map CustomPrinterMap; + CustomPrinterMap custom_printers_; + }; + + // Parses a text-format protocol message from the given input stream to + // the given message object. This function parses the format written + // by Print(). + static bool Parse(io::ZeroCopyInputStream* input, Message* output); + // Like Parse(), but reads directly from a string. + static bool ParseFromString(const string& input, Message* output); + + // Like Parse(), but the data is merged into the given message, as if + // using Message::MergeFrom(). + static bool Merge(io::ZeroCopyInputStream* input, Message* output); + // Like Merge(), but reads directly from a string. + static bool MergeFromString(const string& input, Message* output); + + // Parse the given text as a single field value and store it into the + // given field of the given message. If the field is a repeated field, + // the new value will be added to the end + static bool ParseFieldValueFromString(const string& input, + const FieldDescriptor* field, + Message* message); + + // Interface that TextFormat::Parser can use to find extensions. + // This class may be extended in the future to find more information + // like fields, etc. + class LIBPROTOBUF_EXPORT Finder { + public: + virtual ~Finder(); + + // Try to find an extension of *message by fully-qualified field + // name. Returns NULL if no extension is known for this name or number. + virtual const FieldDescriptor* FindExtension( + Message* message, + const string& name) const = 0; + }; + + // A location in the parsed text. + struct ParseLocation { + int line; + int column; + + ParseLocation() : line(-1), column(-1) {} + ParseLocation(int line_param, int column_param) + : line(line_param), column(column_param) {} + }; + + // Data structure which is populated with the locations of each field + // value parsed from the text. + class LIBPROTOBUF_EXPORT ParseInfoTree { + public: + ParseInfoTree(); + ~ParseInfoTree(); + + // Returns the parse location for index-th value of the field in the parsed + // text. If none exists, returns a location with line = -1. Index should be + // -1 for not-repeated fields. + ParseLocation GetLocation(const FieldDescriptor* field, int index) const; + + // Returns the parse info tree for the given field, which must be a message + // type. The nested information tree is owned by the root tree and will be + // deleted when it is deleted. + ParseInfoTree* GetTreeForNested(const FieldDescriptor* field, + int index) const; + + private: + // Allow the text format parser to record information into the tree. + friend class TextFormat; + + // Records the starting location of a single value for a field. + void RecordLocation(const FieldDescriptor* field, ParseLocation location); + + // Create and records a nested tree for a nested message field. + ParseInfoTree* CreateNested(const FieldDescriptor* field); + + // Defines the map from the index-th field descriptor to its parse location. + typedef map > LocationMap; + + // Defines the map from the index-th field descriptor to the nested parse + // info tree. + typedef map > NestedMap; + + LocationMap locations_; + NestedMap nested_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParseInfoTree); + }; + + // For more control over parsing, use this class. + class LIBPROTOBUF_EXPORT Parser { + public: + Parser(); + ~Parser(); + + // Like TextFormat::Parse(). + bool Parse(io::ZeroCopyInputStream* input, Message* output); + // Like TextFormat::ParseFromString(). + bool ParseFromString(const string& input, Message* output); + // Like TextFormat::Merge(). + bool Merge(io::ZeroCopyInputStream* input, Message* output); + // Like TextFormat::MergeFromString(). + bool MergeFromString(const string& input, Message* output); + + // Set where to report parse errors. If NULL (the default), errors will + // be printed to stderr. + void RecordErrorsTo(io::ErrorCollector* error_collector) { + error_collector_ = error_collector; + } + + // Set how parser finds extensions. If NULL (the default), the + // parser will use the standard Reflection object associated with + // the message being parsed. + void SetFinder(Finder* finder) { + finder_ = finder; + } + + // Sets where location information about the parse will be written. If NULL + // (the default), then no location will be written. + void WriteLocationsTo(ParseInfoTree* tree) { + parse_info_tree_ = tree; + } + + // Normally parsing fails if, after parsing, output->IsInitialized() + // returns false. Call AllowPartialMessage(true) to skip this check. + void AllowPartialMessage(bool allow) { + allow_partial_ = allow; + } + + // Allow field names to be matched case-insensitively. + // This is not advisable if there are fields that only differ in case, or + // if you want to enforce writing in the canonical form. + // This is 'false' by default. + void AllowCaseInsensitiveField(bool allow) { + allow_case_insensitive_field_ = allow; + } + + // Like TextFormat::ParseFieldValueFromString + bool ParseFieldValueFromString(const string& input, + const FieldDescriptor* field, + Message* output); + + + void AllowFieldNumber(bool allow) { + allow_field_number_ = allow; + } + + private: + // Forward declaration of an internal class used to parse text + // representations (see text_format.cc for implementation). + class ParserImpl; + + // Like TextFormat::Merge(). The provided implementation is used + // to do the parsing. + bool MergeUsingImpl(io::ZeroCopyInputStream* input, + Message* output, + ParserImpl* parser_impl); + + io::ErrorCollector* error_collector_; + Finder* finder_; + ParseInfoTree* parse_info_tree_; + bool allow_partial_; + bool allow_case_insensitive_field_; + bool allow_unknown_field_; + bool allow_unknown_enum_; + bool allow_field_number_; + bool allow_relaxed_whitespace_; + bool allow_singular_overwrites_; + }; + + + private: + // Hack: ParseInfoTree declares TextFormat as a friend which should extend + // the friendship to TextFormat::Parser::ParserImpl, but unfortunately some + // old compilers (e.g. GCC 3.4.6) don't implement this correctly. We provide + // helpers for ParserImpl to call methods of ParseInfoTree. + static inline void RecordLocation(ParseInfoTree* info_tree, + const FieldDescriptor* field, + ParseLocation location); + static inline ParseInfoTree* CreateNested(ParseInfoTree* info_tree, + const FieldDescriptor* field); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat); +}; + +inline void TextFormat::RecordLocation(ParseInfoTree* info_tree, + const FieldDescriptor* field, + ParseLocation location) { + info_tree->RecordLocation(field, location); +} + + +inline TextFormat::ParseInfoTree* TextFormat::CreateNested( + ParseInfoTree* info_tree, const FieldDescriptor* field) { + return info_tree->CreateNested(field); +} + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_TEXT_FORMAT_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/unknown_field_set.cc b/toolkit/components/protobuf/src/google/protobuf/unknown_field_set.cc new file mode 100644 index 0000000000000..020a323b34d91 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/unknown_field_set.cc @@ -0,0 +1,265 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +UnknownFieldSet::UnknownFieldSet() + : fields_(NULL) {} + +UnknownFieldSet::~UnknownFieldSet() { + Clear(); + delete fields_; +} + +void UnknownFieldSet::ClearFallback() { + GOOGLE_DCHECK(fields_ != NULL); + for (int i = 0; i < fields_->size(); i++) { + (*fields_)[i].Delete(); + } + fields_->clear(); +} + +void UnknownFieldSet::ClearAndFreeMemory() { + if (fields_ != NULL) { + Clear(); + delete fields_; + fields_ = NULL; + } +} + +void UnknownFieldSet::MergeFrom(const UnknownFieldSet& other) { + for (int i = 0; i < other.field_count(); i++) { + AddField(other.field(i)); + } +} + +int UnknownFieldSet::SpaceUsedExcludingSelf() const { + if (fields_ == NULL) return 0; + + int total_size = sizeof(*fields_) + sizeof(UnknownField) * fields_->size(); + for (int i = 0; i < fields_->size(); i++) { + const UnknownField& field = (*fields_)[i]; + switch (field.type()) { + case UnknownField::TYPE_LENGTH_DELIMITED: + total_size += sizeof(*field.length_delimited_.string_value_) + + internal::StringSpaceUsedExcludingSelf( + *field.length_delimited_.string_value_); + break; + case UnknownField::TYPE_GROUP: + total_size += field.group_->SpaceUsed(); + break; + default: + break; + } + } + return total_size; +} + +int UnknownFieldSet::SpaceUsed() const { + return sizeof(*this) + SpaceUsedExcludingSelf(); +} + +void UnknownFieldSet::AddVarint(int number, uint64 value) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.SetType(UnknownField::TYPE_VARINT); + field.varint_ = value; + fields_->push_back(field); +} + +void UnknownFieldSet::AddFixed32(int number, uint32 value) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.SetType(UnknownField::TYPE_FIXED32); + field.fixed32_ = value; + fields_->push_back(field); +} + +void UnknownFieldSet::AddFixed64(int number, uint64 value) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.SetType(UnknownField::TYPE_FIXED64); + field.fixed64_ = value; + fields_->push_back(field); +} + +string* UnknownFieldSet::AddLengthDelimited(int number) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.SetType(UnknownField::TYPE_LENGTH_DELIMITED); + field.length_delimited_.string_value_ = new string; + fields_->push_back(field); + return field.length_delimited_.string_value_; +} + + +UnknownFieldSet* UnknownFieldSet::AddGroup(int number) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.SetType(UnknownField::TYPE_GROUP); + field.group_ = new UnknownFieldSet; + fields_->push_back(field); + return field.group_; +} + +void UnknownFieldSet::AddField(const UnknownField& field) { + if (fields_ == NULL) fields_ = new vector; + fields_->push_back(field); + fields_->back().DeepCopy(); +} + +void UnknownFieldSet::DeleteSubrange(int start, int num) { + GOOGLE_DCHECK(fields_ != NULL); + // Delete the specified fields. + for (int i = 0; i < num; ++i) { + (*fields_)[i + start].Delete(); + } + // Slide down the remaining fields. + for (int i = start + num; i < fields_->size(); ++i) { + (*fields_)[i - num] = (*fields_)[i]; + } + // Pop off the # of deleted fields. + for (int i = 0; i < num; ++i) { + fields_->pop_back(); + } +} + +void UnknownFieldSet::DeleteByNumber(int number) { + if (fields_ == NULL) return; + int left = 0; // The number of fields left after deletion. + for (int i = 0; i < fields_->size(); ++i) { + UnknownField* field = &(*fields_)[i]; + if (field->number() == number) { + field->Delete(); + } else { + if (i != left) { + (*fields_)[left] = (*fields_)[i]; + } + ++left; + } + } + fields_->resize(left); +} + +bool UnknownFieldSet::MergeFromCodedStream(io::CodedInputStream* input) { + UnknownFieldSet other; + if (internal::WireFormat::SkipMessage(input, &other) && + input->ConsumedEntireMessage()) { + MergeFrom(other); + return true; + } else { + return false; + } +} + +bool UnknownFieldSet::ParseFromCodedStream(io::CodedInputStream* input) { + Clear(); + return MergeFromCodedStream(input); +} + +bool UnknownFieldSet::ParseFromZeroCopyStream(io::ZeroCopyInputStream* input) { + io::CodedInputStream coded_input(input); + return (ParseFromCodedStream(&coded_input) && + coded_input.ConsumedEntireMessage()); +} + +bool UnknownFieldSet::ParseFromArray(const void* data, int size) { + io::ArrayInputStream input(data, size); + return ParseFromZeroCopyStream(&input); +} + +void UnknownField::Delete() { + switch (type()) { + case UnknownField::TYPE_LENGTH_DELIMITED: + delete length_delimited_.string_value_; + break; + case UnknownField::TYPE_GROUP: + delete group_; + break; + default: + break; + } +} + +void UnknownField::DeepCopy() { + switch (type()) { + case UnknownField::TYPE_LENGTH_DELIMITED: + length_delimited_.string_value_ = new string( + *length_delimited_.string_value_); + break; + case UnknownField::TYPE_GROUP: { + UnknownFieldSet* group = new UnknownFieldSet; + group->MergeFrom(*group_); + group_ = group; + break; + } + default: + break; + } +} + + +void UnknownField::SerializeLengthDelimitedNoTag( + io::CodedOutputStream* output) const { + GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type()); + const string& data = *length_delimited_.string_value_; + output->WriteVarint32(data.size()); + output->WriteRawMaybeAliased(data.data(), data.size()); +} + +uint8* UnknownField::SerializeLengthDelimitedNoTagToArray(uint8* target) const { + GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type()); + const string& data = *length_delimited_.string_value_; + target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target); + target = io::CodedOutputStream::WriteStringToArray(data, target); + return target; +} + +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/unknown_field_set.h b/toolkit/components/protobuf/src/google/protobuf/unknown_field_set.h new file mode 100644 index 0000000000000..ba202eb6863cd --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/unknown_field_set.h @@ -0,0 +1,318 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Contains classes used to keep track of unrecognized fields seen while +// parsing a protocol message. + +#ifndef GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__ +#define GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__ + +#include +#include +#include +#include + +namespace google { +namespace protobuf { + namespace io { + class CodedInputStream; // coded_stream.h + class CodedOutputStream; // coded_stream.h + class ZeroCopyInputStream; // zero_copy_stream.h + } + namespace internal { + class WireFormat; // wire_format.h + class MessageSetFieldSkipperUsingCord; + // extension_set_heavy.cc + } + +class Message; // message.h +class UnknownField; // below + +// An UnknownFieldSet contains fields that were encountered while parsing a +// message but were not defined by its type. Keeping track of these can be +// useful, especially in that they may be written if the message is serialized +// again without being cleared in between. This means that software which +// simply receives messages and forwards them to other servers does not need +// to be updated every time a new field is added to the message definition. +// +// To get the UnknownFieldSet attached to any message, call +// Reflection::GetUnknownFields(). +// +// This class is necessarily tied to the protocol buffer wire format, unlike +// the Reflection interface which is independent of any serialization scheme. +class LIBPROTOBUF_EXPORT UnknownFieldSet { + public: + UnknownFieldSet(); + ~UnknownFieldSet(); + + // Remove all fields. + inline void Clear(); + + // Remove all fields and deallocate internal data objects + void ClearAndFreeMemory(); + + // Is this set empty? + inline bool empty() const; + + // Merge the contents of some other UnknownFieldSet with this one. + void MergeFrom(const UnknownFieldSet& other); + + // Swaps the contents of some other UnknownFieldSet with this one. + inline void Swap(UnknownFieldSet* x); + + // Computes (an estimate of) the total number of bytes currently used for + // storing the unknown fields in memory. Does NOT include + // sizeof(*this) in the calculation. + int SpaceUsedExcludingSelf() const; + + // Version of SpaceUsed() including sizeof(*this). + int SpaceUsed() const; + + // Returns the number of fields present in the UnknownFieldSet. + inline int field_count() const; + // Get a field in the set, where 0 <= index < field_count(). The fields + // appear in the order in which they were added. + inline const UnknownField& field(int index) const; + // Get a mutable pointer to a field in the set, where + // 0 <= index < field_count(). The fields appear in the order in which + // they were added. + inline UnknownField* mutable_field(int index); + + // Adding fields --------------------------------------------------- + + void AddVarint(int number, uint64 value); + void AddFixed32(int number, uint32 value); + void AddFixed64(int number, uint64 value); + void AddLengthDelimited(int number, const string& value); + string* AddLengthDelimited(int number); + UnknownFieldSet* AddGroup(int number); + + // Adds an unknown field from another set. + void AddField(const UnknownField& field); + + // Delete fields with indices in the range [start .. start+num-1]. + // Caution: implementation moves all fields with indices [start+num .. ]. + void DeleteSubrange(int start, int num); + + // Delete all fields with a specific field number. The order of left fields + // is preserved. + // Caution: implementation moves all fields after the first deleted field. + void DeleteByNumber(int number); + + // Parsing helpers ------------------------------------------------- + // These work exactly like the similarly-named methods of Message. + + bool MergeFromCodedStream(io::CodedInputStream* input); + bool ParseFromCodedStream(io::CodedInputStream* input); + bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input); + bool ParseFromArray(const void* data, int size); + inline bool ParseFromString(const string& data) { + return ParseFromArray(data.data(), static_cast(data.size())); + } + + private: + + void ClearFallback(); + + vector* fields_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UnknownFieldSet); +}; + +// Represents one field in an UnknownFieldSet. +class LIBPROTOBUF_EXPORT UnknownField { + public: + enum Type { + TYPE_VARINT, + TYPE_FIXED32, + TYPE_FIXED64, + TYPE_LENGTH_DELIMITED, + TYPE_GROUP + }; + + // The field's tag number, as seen on the wire. + inline int number() const; + + // The field type. + inline Type type() const; + + // Accessors ------------------------------------------------------- + // Each method works only for UnknownFields of the corresponding type. + + inline uint64 varint() const; + inline uint32 fixed32() const; + inline uint64 fixed64() const; + inline const string& length_delimited() const; + inline const UnknownFieldSet& group() const; + + inline void set_varint(uint64 value); + inline void set_fixed32(uint32 value); + inline void set_fixed64(uint64 value); + inline void set_length_delimited(const string& value); + inline string* mutable_length_delimited(); + inline UnknownFieldSet* mutable_group(); + + // Serialization API. + // These methods can take advantage of the underlying implementation and may + // archieve a better performance than using getters to retrieve the data and + // do the serialization yourself. + void SerializeLengthDelimitedNoTag(io::CodedOutputStream* output) const; + uint8* SerializeLengthDelimitedNoTagToArray(uint8* target) const; + + inline int GetLengthDelimitedSize() const; + + private: + friend class UnknownFieldSet; + + // If this UnknownField contains a pointer, delete it. + void Delete(); + + // Make a deep copy of any pointers in this UnknownField. + void DeepCopy(); + + // Set the wire type of this UnknownField. Should only be used when this + // UnknownField is being created. + inline void SetType(Type type); + + uint32 number_; + uint32 type_; + union { + uint64 varint_; + uint32 fixed32_; + uint64 fixed64_; + mutable union { + string* string_value_; + } length_delimited_; + UnknownFieldSet* group_; + }; +}; + +// =================================================================== +// inline implementations + +inline void UnknownFieldSet::Clear() { + if (fields_ != NULL) { + ClearFallback(); + } +} + +inline bool UnknownFieldSet::empty() const { + return fields_ == NULL || fields_->empty(); +} + +inline void UnknownFieldSet::Swap(UnknownFieldSet* x) { + std::swap(fields_, x->fields_); +} + +inline int UnknownFieldSet::field_count() const { + return (fields_ == NULL) ? 0 : static_cast(fields_->size()); +} +inline const UnknownField& UnknownFieldSet::field(int index) const { + return (*fields_)[index]; +} +inline UnknownField* UnknownFieldSet::mutable_field(int index) { + return &(*fields_)[index]; +} + +inline void UnknownFieldSet::AddLengthDelimited( + int number, const string& value) { + AddLengthDelimited(number)->assign(value); +} + + +inline int UnknownField::number() const { return number_; } +inline UnknownField::Type UnknownField::type() const { + return static_cast(type_); +} + +inline uint64 UnknownField::varint() const { + assert(type() == TYPE_VARINT); + return varint_; +} +inline uint32 UnknownField::fixed32() const { + assert(type() == TYPE_FIXED32); + return fixed32_; +} +inline uint64 UnknownField::fixed64() const { + assert(type() == TYPE_FIXED64); + return fixed64_; +} +inline const string& UnknownField::length_delimited() const { + assert(type() == TYPE_LENGTH_DELIMITED); + return *length_delimited_.string_value_; +} +inline const UnknownFieldSet& UnknownField::group() const { + assert(type() == TYPE_GROUP); + return *group_; +} + +inline void UnknownField::set_varint(uint64 value) { + assert(type() == TYPE_VARINT); + varint_ = value; +} +inline void UnknownField::set_fixed32(uint32 value) { + assert(type() == TYPE_FIXED32); + fixed32_ = value; +} +inline void UnknownField::set_fixed64(uint64 value) { + assert(type() == TYPE_FIXED64); + fixed64_ = value; +} +inline void UnknownField::set_length_delimited(const string& value) { + assert(type() == TYPE_LENGTH_DELIMITED); + length_delimited_.string_value_->assign(value); +} +inline string* UnknownField::mutable_length_delimited() { + assert(type() == TYPE_LENGTH_DELIMITED); + return length_delimited_.string_value_; +} +inline UnknownFieldSet* UnknownField::mutable_group() { + assert(type() == TYPE_GROUP); + return group_; +} + +inline int UnknownField::GetLengthDelimitedSize() const { + GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type()); + return static_cast(length_delimited_.string_value_->size()); +} + +inline void UnknownField::SetType(Type type) { + type_ = type; +} + + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__ diff --git a/toolkit/components/protobuf/src/google/protobuf/wire_format.cc b/toolkit/components/protobuf/src/google/protobuf/wire_format.cc new file mode 100644 index 0000000000000..fc6210c2846f1 --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/wire_format.cc @@ -0,0 +1,1106 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +namespace google { +namespace protobuf { +namespace internal { + +namespace { + +// This function turns out to be convenient when using some macros later. +inline int GetEnumNumber(const EnumValueDescriptor* descriptor) { + return descriptor->number(); +} + +} // anonymous namespace + +// =================================================================== + +bool UnknownFieldSetFieldSkipper::SkipField( + io::CodedInputStream* input, uint32 tag) { + return WireFormat::SkipField(input, tag, unknown_fields_); +} + +bool UnknownFieldSetFieldSkipper::SkipMessage(io::CodedInputStream* input) { + return WireFormat::SkipMessage(input, unknown_fields_); +} + +void UnknownFieldSetFieldSkipper::SkipUnknownEnum( + int field_number, int value) { + unknown_fields_->AddVarint(field_number, value); +} + +bool WireFormat::SkipField(io::CodedInputStream* input, uint32 tag, + UnknownFieldSet* unknown_fields) { + int number = WireFormatLite::GetTagFieldNumber(tag); + + switch (WireFormatLite::GetTagWireType(tag)) { + case WireFormatLite::WIRETYPE_VARINT: { + uint64 value; + if (!input->ReadVarint64(&value)) return false; + if (unknown_fields != NULL) unknown_fields->AddVarint(number, value); + return true; + } + case WireFormatLite::WIRETYPE_FIXED64: { + uint64 value; + if (!input->ReadLittleEndian64(&value)) return false; + if (unknown_fields != NULL) unknown_fields->AddFixed64(number, value); + return true; + } + case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (unknown_fields == NULL) { + if (!input->Skip(length)) return false; + } else { + if (!input->ReadString(unknown_fields->AddLengthDelimited(number), + length)) { + return false; + } + } + return true; + } + case WireFormatLite::WIRETYPE_START_GROUP: { + if (!input->IncrementRecursionDepth()) return false; + if (!SkipMessage(input, (unknown_fields == NULL) ? + NULL : unknown_fields->AddGroup(number))) { + return false; + } + input->DecrementRecursionDepth(); + // Check that the ending tag matched the starting tag. + if (!input->LastTagWas(WireFormatLite::MakeTag( + WireFormatLite::GetTagFieldNumber(tag), + WireFormatLite::WIRETYPE_END_GROUP))) { + return false; + } + return true; + } + case WireFormatLite::WIRETYPE_END_GROUP: { + return false; + } + case WireFormatLite::WIRETYPE_FIXED32: { + uint32 value; + if (!input->ReadLittleEndian32(&value)) return false; + if (unknown_fields != NULL) unknown_fields->AddFixed32(number, value); + return true; + } + default: { + return false; + } + } +} + +bool WireFormat::SkipMessage(io::CodedInputStream* input, + UnknownFieldSet* unknown_fields) { + while(true) { + uint32 tag = input->ReadTag(); + if (tag == 0) { + // End of input. This is a valid place to end, so return true. + return true; + } + + WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); + + if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) { + // Must be the end of the message. + return true; + } + + if (!SkipField(input, tag, unknown_fields)) return false; + } +} + +void WireFormat::SerializeUnknownFields(const UnknownFieldSet& unknown_fields, + io::CodedOutputStream* output) { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + switch (field.type()) { + case UnknownField::TYPE_VARINT: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_VARINT)); + output->WriteVarint64(field.varint()); + break; + case UnknownField::TYPE_FIXED32: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_FIXED32)); + output->WriteLittleEndian32(field.fixed32()); + break; + case UnknownField::TYPE_FIXED64: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_FIXED64)); + output->WriteLittleEndian64(field.fixed64()); + break; + case UnknownField::TYPE_LENGTH_DELIMITED: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); + output->WriteVarint32(field.length_delimited().size()); + output->WriteRawMaybeAliased(field.length_delimited().data(), + field.length_delimited().size()); + break; + case UnknownField::TYPE_GROUP: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_START_GROUP)); + SerializeUnknownFields(field.group(), output); + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_END_GROUP)); + break; + } + } +} + +uint8* WireFormat::SerializeUnknownFieldsToArray( + const UnknownFieldSet& unknown_fields, + uint8* target) { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + + switch (field.type()) { + case UnknownField::TYPE_VARINT: + target = WireFormatLite::WriteInt64ToArray( + field.number(), field.varint(), target); + break; + case UnknownField::TYPE_FIXED32: + target = WireFormatLite::WriteFixed32ToArray( + field.number(), field.fixed32(), target); + break; + case UnknownField::TYPE_FIXED64: + target = WireFormatLite::WriteFixed64ToArray( + field.number(), field.fixed64(), target); + break; + case UnknownField::TYPE_LENGTH_DELIMITED: + target = WireFormatLite::WriteBytesToArray( + field.number(), field.length_delimited(), target); + break; + case UnknownField::TYPE_GROUP: + target = WireFormatLite::WriteTagToArray( + field.number(), WireFormatLite::WIRETYPE_START_GROUP, target); + target = SerializeUnknownFieldsToArray(field.group(), target); + target = WireFormatLite::WriteTagToArray( + field.number(), WireFormatLite::WIRETYPE_END_GROUP, target); + break; + } + } + return target; +} + +void WireFormat::SerializeUnknownMessageSetItems( + const UnknownFieldSet& unknown_fields, + io::CodedOutputStream* output) { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + // The only unknown fields that are allowed to exist in a MessageSet are + // messages, which are length-delimited. + if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { + // Start group. + output->WriteVarint32(WireFormatLite::kMessageSetItemStartTag); + + // Write type ID. + output->WriteVarint32(WireFormatLite::kMessageSetTypeIdTag); + output->WriteVarint32(field.number()); + + // Write message. + output->WriteVarint32(WireFormatLite::kMessageSetMessageTag); + field.SerializeLengthDelimitedNoTag(output); + + // End group. + output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag); + } + } +} + +uint8* WireFormat::SerializeUnknownMessageSetItemsToArray( + const UnknownFieldSet& unknown_fields, + uint8* target) { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + + // The only unknown fields that are allowed to exist in a MessageSet are + // messages, which are length-delimited. + if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { + // Start group. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetItemStartTag, target); + + // Write type ID. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetTypeIdTag, target); + target = io::CodedOutputStream::WriteVarint32ToArray( + field.number(), target); + + // Write message. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetMessageTag, target); + target = field.SerializeLengthDelimitedNoTagToArray(target); + + // End group. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetItemEndTag, target); + } + } + + return target; +} + +int WireFormat::ComputeUnknownFieldsSize( + const UnknownFieldSet& unknown_fields) { + int size = 0; + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + + switch (field.type()) { + case UnknownField::TYPE_VARINT: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_VARINT)); + size += io::CodedOutputStream::VarintSize64(field.varint()); + break; + case UnknownField::TYPE_FIXED32: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_FIXED32)); + size += sizeof(int32); + break; + case UnknownField::TYPE_FIXED64: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_FIXED64)); + size += sizeof(int64); + break; + case UnknownField::TYPE_LENGTH_DELIMITED: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); + size += io::CodedOutputStream::VarintSize32( + field.length_delimited().size()); + size += field.length_delimited().size(); + break; + case UnknownField::TYPE_GROUP: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_START_GROUP)); + size += ComputeUnknownFieldsSize(field.group()); + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_END_GROUP)); + break; + } + } + + return size; +} + +int WireFormat::ComputeUnknownMessageSetItemsSize( + const UnknownFieldSet& unknown_fields) { + int size = 0; + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + + // The only unknown fields that are allowed to exist in a MessageSet are + // messages, which are length-delimited. + if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { + size += WireFormatLite::kMessageSetItemTagsSize; + size += io::CodedOutputStream::VarintSize32(field.number()); + + int field_size = field.GetLengthDelimitedSize(); + size += io::CodedOutputStream::VarintSize32(field_size); + size += field_size; + } + } + + return size; +} + +// =================================================================== + +bool WireFormat::ParseAndMergePartial(io::CodedInputStream* input, + Message* message) { + const Descriptor* descriptor = message->GetDescriptor(); + const Reflection* message_reflection = message->GetReflection(); + + while(true) { + uint32 tag = input->ReadTag(); + if (tag == 0) { + // End of input. This is a valid place to end, so return true. + return true; + } + + if (WireFormatLite::GetTagWireType(tag) == + WireFormatLite::WIRETYPE_END_GROUP) { + // Must be the end of the message. + return true; + } + + const FieldDescriptor* field = NULL; + + if (descriptor != NULL) { + int field_number = WireFormatLite::GetTagFieldNumber(tag); + field = descriptor->FindFieldByNumber(field_number); + + // If that failed, check if the field is an extension. + if (field == NULL && descriptor->IsExtensionNumber(field_number)) { + if (input->GetExtensionPool() == NULL) { + field = message_reflection->FindKnownExtensionByNumber(field_number); + } else { + field = input->GetExtensionPool() + ->FindExtensionByNumber(descriptor, field_number); + } + } + + // If that failed, but we're a MessageSet, and this is the tag for a + // MessageSet item, then parse that. + if (field == NULL && + descriptor->options().message_set_wire_format() && + tag == WireFormatLite::kMessageSetItemStartTag) { + if (!ParseAndMergeMessageSetItem(input, message)) { + return false; + } + continue; // Skip ParseAndMergeField(); already taken care of. + } + } + + if (!ParseAndMergeField(tag, field, message, input)) { + return false; + } + } +} + +bool WireFormat::SkipMessageSetField(io::CodedInputStream* input, + uint32 field_number, + UnknownFieldSet* unknown_fields) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + return input->ReadString( + unknown_fields->AddLengthDelimited(field_number), length); +} + +bool WireFormat::ParseAndMergeMessageSetField(uint32 field_number, + const FieldDescriptor* field, + Message* message, + io::CodedInputStream* input) { + const Reflection* message_reflection = message->GetReflection(); + if (field == NULL) { + // We store unknown MessageSet extensions as groups. + return SkipMessageSetField( + input, field_number, message_reflection->MutableUnknownFields(message)); + } else if (field->is_repeated() || + field->type() != FieldDescriptor::TYPE_MESSAGE) { + // This shouldn't happen as we only allow optional message extensions to + // MessageSet. + GOOGLE_LOG(ERROR) << "Extensions of MessageSets must be optional messages."; + return false; + } else { + Message* sub_message = message_reflection->MutableMessage( + message, field, input->GetExtensionFactory()); + return WireFormatLite::ReadMessage(input, sub_message); + } +} + +bool WireFormat::ParseAndMergeField( + uint32 tag, + const FieldDescriptor* field, // May be NULL for unknown + Message* message, + io::CodedInputStream* input) { + const Reflection* message_reflection = message->GetReflection(); + + enum { UNKNOWN, NORMAL_FORMAT, PACKED_FORMAT } value_format; + + if (field == NULL) { + value_format = UNKNOWN; + } else if (WireFormatLite::GetTagWireType(tag) == + WireTypeForFieldType(field->type())) { + value_format = NORMAL_FORMAT; + } else if (field->is_packable() && + WireFormatLite::GetTagWireType(tag) == + WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + value_format = PACKED_FORMAT; + } else { + // We don't recognize this field. Either the field number is unknown + // or the wire type doesn't match. Put it in our unknown field set. + value_format = UNKNOWN; + } + + if (value_format == UNKNOWN) { + return SkipField(input, tag, + message_reflection->MutableUnknownFields(message)); + } else if (value_format == PACKED_FORMAT) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + io::CodedInputStream::Limit limit = input->PushLimit(length); + + switch (field->type()) { +#define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: { \ + while (input->BytesUntilLimit() > 0) { \ + CPPTYPE value; \ + if (!WireFormatLite::ReadPrimitive< \ + CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)) \ + return false; \ + message_reflection->Add##CPPTYPE_METHOD(message, field, value); \ + } \ + break; \ + } + + HANDLE_PACKED_TYPE( INT32, int32, Int32) + HANDLE_PACKED_TYPE( INT64, int64, Int64) + HANDLE_PACKED_TYPE(SINT32, int32, Int32) + HANDLE_PACKED_TYPE(SINT64, int64, Int64) + HANDLE_PACKED_TYPE(UINT32, uint32, UInt32) + HANDLE_PACKED_TYPE(UINT64, uint64, UInt64) + + HANDLE_PACKED_TYPE( FIXED32, uint32, UInt32) + HANDLE_PACKED_TYPE( FIXED64, uint64, UInt64) + HANDLE_PACKED_TYPE(SFIXED32, int32, Int32) + HANDLE_PACKED_TYPE(SFIXED64, int64, Int64) + + HANDLE_PACKED_TYPE(FLOAT , float , Float ) + HANDLE_PACKED_TYPE(DOUBLE, double, Double) + + HANDLE_PACKED_TYPE(BOOL, bool, Bool) +#undef HANDLE_PACKED_TYPE + + case FieldDescriptor::TYPE_ENUM: { + while (input->BytesUntilLimit() > 0) { + int value; + if (!WireFormatLite::ReadPrimitive( + input, &value)) return false; + const EnumValueDescriptor* enum_value = + field->enum_type()->FindValueByNumber(value); + if (enum_value != NULL) { + message_reflection->AddEnum(message, field, enum_value); + } + } + + break; + } + + case FieldDescriptor::TYPE_STRING: + case FieldDescriptor::TYPE_GROUP: + case FieldDescriptor::TYPE_MESSAGE: + case FieldDescriptor::TYPE_BYTES: + // Can't have packed fields of these types: these should be caught by + // the protocol compiler. + return false; + break; + } + + input->PopLimit(limit); + } else { + // Non-packed value (value_format == NORMAL_FORMAT) + switch (field->type()) { +#define HANDLE_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: { \ + CPPTYPE value; \ + if (!WireFormatLite::ReadPrimitive< \ + CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)) \ + return false; \ + if (field->is_repeated()) { \ + message_reflection->Add##CPPTYPE_METHOD(message, field, value); \ + } else { \ + message_reflection->Set##CPPTYPE_METHOD(message, field, value); \ + } \ + break; \ + } + + HANDLE_TYPE( INT32, int32, Int32) + HANDLE_TYPE( INT64, int64, Int64) + HANDLE_TYPE(SINT32, int32, Int32) + HANDLE_TYPE(SINT64, int64, Int64) + HANDLE_TYPE(UINT32, uint32, UInt32) + HANDLE_TYPE(UINT64, uint64, UInt64) + + HANDLE_TYPE( FIXED32, uint32, UInt32) + HANDLE_TYPE( FIXED64, uint64, UInt64) + HANDLE_TYPE(SFIXED32, int32, Int32) + HANDLE_TYPE(SFIXED64, int64, Int64) + + HANDLE_TYPE(FLOAT , float , Float ) + HANDLE_TYPE(DOUBLE, double, Double) + + HANDLE_TYPE(BOOL, bool, Bool) +#undef HANDLE_TYPE + + case FieldDescriptor::TYPE_ENUM: { + int value; + if (!WireFormatLite::ReadPrimitive( + input, &value)) return false; + const EnumValueDescriptor* enum_value = + field->enum_type()->FindValueByNumber(value); + if (enum_value != NULL) { + if (field->is_repeated()) { + message_reflection->AddEnum(message, field, enum_value); + } else { + message_reflection->SetEnum(message, field, enum_value); + } + } else { + // The enum value is not one of the known values. Add it to the + // UnknownFieldSet. + int64 sign_extended_value = static_cast(value); + message_reflection->MutableUnknownFields(message) + ->AddVarint(WireFormatLite::GetTagFieldNumber(tag), + sign_extended_value); + } + break; + } + + // Handle strings separately so that we can optimize the ctype=CORD case. + case FieldDescriptor::TYPE_STRING: { + string value; + if (!WireFormatLite::ReadString(input, &value)) return false; + VerifyUTF8StringNamedField(value.data(), value.length(), PARSE, + field->name().c_str()); + if (field->is_repeated()) { + message_reflection->AddString(message, field, value); + } else { + message_reflection->SetString(message, field, value); + } + break; + } + + case FieldDescriptor::TYPE_BYTES: { + string value; + if (!WireFormatLite::ReadBytes(input, &value)) return false; + if (field->is_repeated()) { + message_reflection->AddString(message, field, value); + } else { + message_reflection->SetString(message, field, value); + } + break; + } + + case FieldDescriptor::TYPE_GROUP: { + Message* sub_message; + if (field->is_repeated()) { + sub_message = message_reflection->AddMessage( + message, field, input->GetExtensionFactory()); + } else { + sub_message = message_reflection->MutableMessage( + message, field, input->GetExtensionFactory()); + } + + if (!WireFormatLite::ReadGroup(WireFormatLite::GetTagFieldNumber(tag), + input, sub_message)) + return false; + break; + } + + case FieldDescriptor::TYPE_MESSAGE: { + Message* sub_message; + if (field->is_repeated()) { + sub_message = message_reflection->AddMessage( + message, field, input->GetExtensionFactory()); + } else { + sub_message = message_reflection->MutableMessage( + message, field, input->GetExtensionFactory()); + } + + if (!WireFormatLite::ReadMessage(input, sub_message)) return false; + break; + } + } + } + + return true; +} + +bool WireFormat::ParseAndMergeMessageSetItem( + io::CodedInputStream* input, + Message* message) { + const Reflection* message_reflection = message->GetReflection(); + + // This method parses a group which should contain two fields: + // required int32 type_id = 2; + // required data message = 3; + + uint32 last_type_id = 0; + + // Once we see a type_id, we'll look up the FieldDescriptor for the + // extension. + const FieldDescriptor* field = NULL; + + // If we see message data before the type_id, we'll append it to this so + // we can parse it later. + string message_data; + + while (true) { + uint32 tag = input->ReadTag(); + if (tag == 0) return false; + + switch (tag) { + case WireFormatLite::kMessageSetTypeIdTag: { + uint32 type_id; + if (!input->ReadVarint32(&type_id)) return false; + last_type_id = type_id; + field = message_reflection->FindKnownExtensionByNumber(type_id); + + if (!message_data.empty()) { + // We saw some message data before the type_id. Have to parse it + // now. + io::ArrayInputStream raw_input(message_data.data(), + message_data.size()); + io::CodedInputStream sub_input(&raw_input); + if (!ParseAndMergeMessageSetField(last_type_id, field, message, + &sub_input)) { + return false; + } + message_data.clear(); + } + + break; + } + + case WireFormatLite::kMessageSetMessageTag: { + if (last_type_id == 0) { + // We haven't seen a type_id yet. Append this data to message_data. + string temp; + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (!input->ReadString(&temp, length)) return false; + io::StringOutputStream output_stream(&message_data); + io::CodedOutputStream coded_output(&output_stream); + coded_output.WriteVarint32(length); + coded_output.WriteString(temp); + } else { + // Already saw type_id, so we can parse this directly. + if (!ParseAndMergeMessageSetField(last_type_id, field, message, + input)) { + return false; + } + } + + break; + } + + case WireFormatLite::kMessageSetItemEndTag: { + return true; + } + + default: { + if (!SkipField(input, tag, NULL)) return false; + } + } + } +} + +// =================================================================== + +void WireFormat::SerializeWithCachedSizes( + const Message& message, + int size, io::CodedOutputStream* output) { + const Descriptor* descriptor = message.GetDescriptor(); + const Reflection* message_reflection = message.GetReflection(); + int expected_endpoint = output->ByteCount() + size; + + vector fields; + message_reflection->ListFields(message, &fields); + for (int i = 0; i < fields.size(); i++) { + SerializeFieldWithCachedSizes(fields[i], message, output); + } + + if (descriptor->options().message_set_wire_format()) { + SerializeUnknownMessageSetItems( + message_reflection->GetUnknownFields(message), output); + } else { + SerializeUnknownFields( + message_reflection->GetUnknownFields(message), output); + } + + GOOGLE_CHECK_EQ(output->ByteCount(), expected_endpoint) + << ": Protocol message serialized to a size different from what was " + "originally expected. Perhaps it was modified by another thread " + "during serialization?"; +} + +void WireFormat::SerializeFieldWithCachedSizes( + const FieldDescriptor* field, + const Message& message, + io::CodedOutputStream* output) { + const Reflection* message_reflection = message.GetReflection(); + + if (field->is_extension() && + field->containing_type()->options().message_set_wire_format() && + field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && + !field->is_repeated()) { + SerializeMessageSetItemWithCachedSizes(field, message, output); + return; + } + + int count = 0; + + if (field->is_repeated()) { + count = message_reflection->FieldSize(message, field); + } else if (message_reflection->HasField(message, field)) { + count = 1; + } + + const bool is_packed = field->options().packed(); + if (is_packed && count > 0) { + WireFormatLite::WriteTag(field->number(), + WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + const int data_size = FieldDataOnlyByteSize(field, message); + output->WriteVarint32(data_size); + } + + for (int j = 0; j < count; j++) { + switch (field->type()) { +#define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: { \ + const CPPTYPE value = field->is_repeated() ? \ + message_reflection->GetRepeated##CPPTYPE_METHOD( \ + message, field, j) : \ + message_reflection->Get##CPPTYPE_METHOD( \ + message, field); \ + if (is_packed) { \ + WireFormatLite::Write##TYPE_METHOD##NoTag(value, output); \ + } else { \ + WireFormatLite::Write##TYPE_METHOD(field->number(), value, output); \ + } \ + break; \ + } + + HANDLE_PRIMITIVE_TYPE( INT32, int32, Int32, Int32) + HANDLE_PRIMITIVE_TYPE( INT64, int64, Int64, Int64) + HANDLE_PRIMITIVE_TYPE(SINT32, int32, SInt32, Int32) + HANDLE_PRIMITIVE_TYPE(SINT64, int64, SInt64, Int64) + HANDLE_PRIMITIVE_TYPE(UINT32, uint32, UInt32, UInt32) + HANDLE_PRIMITIVE_TYPE(UINT64, uint64, UInt64, UInt64) + + HANDLE_PRIMITIVE_TYPE( FIXED32, uint32, Fixed32, UInt32) + HANDLE_PRIMITIVE_TYPE( FIXED64, uint64, Fixed64, UInt64) + HANDLE_PRIMITIVE_TYPE(SFIXED32, int32, SFixed32, Int32) + HANDLE_PRIMITIVE_TYPE(SFIXED64, int64, SFixed64, Int64) + + HANDLE_PRIMITIVE_TYPE(FLOAT , float , Float , Float ) + HANDLE_PRIMITIVE_TYPE(DOUBLE, double, Double, Double) + + HANDLE_PRIMITIVE_TYPE(BOOL, bool, Bool, Bool) +#undef HANDLE_PRIMITIVE_TYPE + + case FieldDescriptor::TYPE_GROUP: + WireFormatLite::WriteGroup( + field->number(), + field->is_repeated() ? + message_reflection->GetRepeatedMessage( + message, field, j) : + message_reflection->GetMessage(message, field), + output); + break; + + case FieldDescriptor::TYPE_MESSAGE: + WireFormatLite::WriteMessage( + field->number(), + field->is_repeated() ? + message_reflection->GetRepeatedMessage( + message, field, j) : + message_reflection->GetMessage(message, field), + output); + break; + + case FieldDescriptor::TYPE_ENUM: { + const EnumValueDescriptor* value = field->is_repeated() ? + message_reflection->GetRepeatedEnum(message, field, j) : + message_reflection->GetEnum(message, field); + if (is_packed) { + WireFormatLite::WriteEnumNoTag(value->number(), output); + } else { + WireFormatLite::WriteEnum(field->number(), value->number(), output); + } + break; + } + + // Handle strings separately so that we can get string references + // instead of copying. + case FieldDescriptor::TYPE_STRING: { + string scratch; + const string& value = field->is_repeated() ? + message_reflection->GetRepeatedStringReference( + message, field, j, &scratch) : + message_reflection->GetStringReference(message, field, &scratch); + VerifyUTF8StringNamedField(value.data(), value.length(), SERIALIZE, + field->name().c_str()); + WireFormatLite::WriteString(field->number(), value, output); + break; + } + + case FieldDescriptor::TYPE_BYTES: { + string scratch; + const string& value = field->is_repeated() ? + message_reflection->GetRepeatedStringReference( + message, field, j, &scratch) : + message_reflection->GetStringReference(message, field, &scratch); + WireFormatLite::WriteBytes(field->number(), value, output); + break; + } + } + } +} + +void WireFormat::SerializeMessageSetItemWithCachedSizes( + const FieldDescriptor* field, + const Message& message, + io::CodedOutputStream* output) { + const Reflection* message_reflection = message.GetReflection(); + + // Start group. + output->WriteVarint32(WireFormatLite::kMessageSetItemStartTag); + + // Write type ID. + output->WriteVarint32(WireFormatLite::kMessageSetTypeIdTag); + output->WriteVarint32(field->number()); + + // Write message. + output->WriteVarint32(WireFormatLite::kMessageSetMessageTag); + + const Message& sub_message = message_reflection->GetMessage(message, field); + output->WriteVarint32(sub_message.GetCachedSize()); + sub_message.SerializeWithCachedSizes(output); + + // End group. + output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag); +} + +// =================================================================== + +int WireFormat::ByteSize(const Message& message) { + const Descriptor* descriptor = message.GetDescriptor(); + const Reflection* message_reflection = message.GetReflection(); + + int our_size = 0; + + vector fields; + message_reflection->ListFields(message, &fields); + for (int i = 0; i < fields.size(); i++) { + our_size += FieldByteSize(fields[i], message); + } + + if (descriptor->options().message_set_wire_format()) { + our_size += ComputeUnknownMessageSetItemsSize( + message_reflection->GetUnknownFields(message)); + } else { + our_size += ComputeUnknownFieldsSize( + message_reflection->GetUnknownFields(message)); + } + + return our_size; +} + +int WireFormat::FieldByteSize( + const FieldDescriptor* field, + const Message& message) { + const Reflection* message_reflection = message.GetReflection(); + + if (field->is_extension() && + field->containing_type()->options().message_set_wire_format() && + field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && + !field->is_repeated()) { + return MessageSetItemByteSize(field, message); + } + + int count = 0; + if (field->is_repeated()) { + count = message_reflection->FieldSize(message, field); + } else if (message_reflection->HasField(message, field)) { + count = 1; + } + + const int data_size = FieldDataOnlyByteSize(field, message); + int our_size = data_size; + if (field->options().packed()) { + if (data_size > 0) { + // Packed fields get serialized like a string, not their native type. + // Technically this doesn't really matter; the size only changes if it's + // a GROUP + our_size += TagSize(field->number(), FieldDescriptor::TYPE_STRING); + our_size += io::CodedOutputStream::VarintSize32(data_size); + } + } else { + our_size += count * TagSize(field->number(), field->type()); + } + return our_size; +} + +int WireFormat::FieldDataOnlyByteSize( + const FieldDescriptor* field, + const Message& message) { + const Reflection* message_reflection = message.GetReflection(); + + int count = 0; + if (field->is_repeated()) { + count = message_reflection->FieldSize(message, field); + } else if (message_reflection->HasField(message, field)) { + count = 1; + } + + int data_size = 0; + switch (field->type()) { +#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: \ + if (field->is_repeated()) { \ + for (int j = 0; j < count; j++) { \ + data_size += WireFormatLite::TYPE_METHOD##Size( \ + message_reflection->GetRepeated##CPPTYPE_METHOD( \ + message, field, j)); \ + } \ + } else { \ + data_size += WireFormatLite::TYPE_METHOD##Size( \ + message_reflection->Get##CPPTYPE_METHOD(message, field)); \ + } \ + break; + +#define HANDLE_FIXED_TYPE(TYPE, TYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: \ + data_size += count * WireFormatLite::k##TYPE_METHOD##Size; \ + break; + + HANDLE_TYPE( INT32, Int32, Int32) + HANDLE_TYPE( INT64, Int64, Int64) + HANDLE_TYPE(SINT32, SInt32, Int32) + HANDLE_TYPE(SINT64, SInt64, Int64) + HANDLE_TYPE(UINT32, UInt32, UInt32) + HANDLE_TYPE(UINT64, UInt64, UInt64) + + HANDLE_FIXED_TYPE( FIXED32, Fixed32) + HANDLE_FIXED_TYPE( FIXED64, Fixed64) + HANDLE_FIXED_TYPE(SFIXED32, SFixed32) + HANDLE_FIXED_TYPE(SFIXED64, SFixed64) + + HANDLE_FIXED_TYPE(FLOAT , Float ) + HANDLE_FIXED_TYPE(DOUBLE, Double) + + HANDLE_FIXED_TYPE(BOOL, Bool) + + HANDLE_TYPE(GROUP , Group , Message) + HANDLE_TYPE(MESSAGE, Message, Message) +#undef HANDLE_TYPE +#undef HANDLE_FIXED_TYPE + + case FieldDescriptor::TYPE_ENUM: { + if (field->is_repeated()) { + for (int j = 0; j < count; j++) { + data_size += WireFormatLite::EnumSize( + message_reflection->GetRepeatedEnum(message, field, j)->number()); + } + } else { + data_size += WireFormatLite::EnumSize( + message_reflection->GetEnum(message, field)->number()); + } + break; + } + + // Handle strings separately so that we can get string references + // instead of copying. + case FieldDescriptor::TYPE_STRING: + case FieldDescriptor::TYPE_BYTES: { + for (int j = 0; j < count; j++) { + string scratch; + const string& value = field->is_repeated() ? + message_reflection->GetRepeatedStringReference( + message, field, j, &scratch) : + message_reflection->GetStringReference(message, field, &scratch); + data_size += WireFormatLite::StringSize(value); + } + break; + } + } + return data_size; +} + +int WireFormat::MessageSetItemByteSize( + const FieldDescriptor* field, + const Message& message) { + const Reflection* message_reflection = message.GetReflection(); + + int our_size = WireFormatLite::kMessageSetItemTagsSize; + + // type_id + our_size += io::CodedOutputStream::VarintSize32(field->number()); + + // message + const Message& sub_message = message_reflection->GetMessage(message, field); + int message_size = sub_message.ByteSize(); + + our_size += io::CodedOutputStream::VarintSize32(message_size); + our_size += message_size; + + return our_size; +} + +void WireFormat::VerifyUTF8StringFallback(const char* data, + int size, + Operation op, + const char* field_name) { + if (!IsStructurallyValidUTF8(data, size)) { + const char* operation_str = NULL; + switch (op) { + case PARSE: + operation_str = "parsing"; + break; + case SERIALIZE: + operation_str = "serializing"; + break; + // no default case: have the compiler warn if a case is not covered. + } + string quoted_field_name = ""; + if (field_name != NULL) { + quoted_field_name = StringPrintf(" '%s'", field_name); + } + // no space below to avoid double space when the field name is missing. + GOOGLE_LOG(ERROR) << "String field" << quoted_field_name << " contains invalid " + << "UTF-8 data when " << operation_str << " a protocol " + << "buffer. Use the 'bytes' type if you intend to send raw " + << "bytes. "; + } +} + + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/toolkit/components/protobuf/src/google/protobuf/wire_format.h b/toolkit/components/protobuf/src/google/protobuf/wire_format.h new file mode 100644 index 0000000000000..9f26eb29bdf5d --- /dev/null +++ b/toolkit/components/protobuf/src/google/protobuf/wire_format.h @@ -0,0 +1,336 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// atenasio@google.com (Chris Atenasio) (ZigZag transform) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This header is logically internal, but is made public because it is used +// from protocol-compiler-generated code, which may reside in other components. + +#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_H__ +#define GOOGLE_PROTOBUF_WIRE_FORMAT_H__ + +#include +#include +#include +#include +#include +#include + +// Do UTF-8 validation on string type in Debug build only +#ifndef NDEBUG +#define GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED +#endif + +namespace google { +namespace protobuf { + namespace io { + class CodedInputStream; // coded_stream.h + class CodedOutputStream; // coded_stream.h + } + class UnknownFieldSet; // unknown_field_set.h +} + +namespace protobuf { +namespace internal { + +// This class is for internal use by the protocol buffer library and by +// protocol-complier-generated message classes. It must not be called +// directly by clients. +// +// This class contains code for implementing the binary protocol buffer +// wire format via reflection. The WireFormatLite class implements the +// non-reflection based routines. +// +// This class is really a namespace that contains only static methods +class LIBPROTOBUF_EXPORT WireFormat { + public: + + // Given a field return its WireType + static inline WireFormatLite::WireType WireTypeForField( + const FieldDescriptor* field); + + // Given a FieldDescriptor::Type return its WireType + static inline WireFormatLite::WireType WireTypeForFieldType( + FieldDescriptor::Type type); + + // Compute the byte size of a tag. For groups, this includes both the start + // and end tags. + static inline int TagSize(int field_number, FieldDescriptor::Type type); + + // These procedures can be used to implement the methods of Message which + // handle parsing and serialization of the protocol buffer wire format + // using only the Reflection interface. When you ask the protocol + // compiler to optimize for code size rather than speed, it will implement + // those methods in terms of these procedures. Of course, these are much + // slower than the specialized implementations which the protocol compiler + // generates when told to optimize for speed. + + // Read a message in protocol buffer wire format. + // + // This procedure reads either to the end of the input stream or through + // a WIRETYPE_END_GROUP tag ending the message, whichever comes first. + // It returns false if the input is invalid. + // + // Required fields are NOT checked by this method. You must call + // IsInitialized() on the resulting message yourself. + static bool ParseAndMergePartial(io::CodedInputStream* input, + Message* message); + + // Serialize a message in protocol buffer wire format. + // + // Any embedded messages within the message must have their correct sizes + // cached. However, the top-level message need not; its size is passed as + // a parameter to this procedure. + // + // These return false iff the underlying stream returns a write error. + static void SerializeWithCachedSizes( + const Message& message, + int size, io::CodedOutputStream* output); + + // Implements Message::ByteSize() via reflection. WARNING: The result + // of this method is *not* cached anywhere. However, all embedded messages + // will have their ByteSize() methods called, so their sizes will be cached. + // Therefore, calling this method is sufficient to allow you to call + // WireFormat::SerializeWithCachedSizes() on the same object. + static int ByteSize(const Message& message); + + // ----------------------------------------------------------------- + // Helpers for dealing with unknown fields + + // Skips a field value of the given WireType. The input should start + // positioned immediately after the tag. If unknown_fields is non-NULL, + // the contents of the field will be added to it. + static bool SkipField(io::CodedInputStream* input, uint32 tag, + UnknownFieldSet* unknown_fields); + + // Reads and ignores a message from the input. If unknown_fields is non-NULL, + // the contents will be added to it. + static bool SkipMessage(io::CodedInputStream* input, + UnknownFieldSet* unknown_fields); + + // Write the contents of an UnknownFieldSet to the output. + static void SerializeUnknownFields(const UnknownFieldSet& unknown_fields, + io::CodedOutputStream* output); + // Same as above, except writing directly to the provided buffer. + // Requires that the buffer have sufficient capacity for + // ComputeUnknownFieldsSize(unknown_fields). + // + // Returns a pointer past the last written byte. + static uint8* SerializeUnknownFieldsToArray( + const UnknownFieldSet& unknown_fields, + uint8* target); + + // Same thing except for messages that have the message_set_wire_format + // option. + static void SerializeUnknownMessageSetItems( + const UnknownFieldSet& unknown_fields, + io::CodedOutputStream* output); + // Same as above, except writing directly to the provided buffer. + // Requires that the buffer have sufficient capacity for + // ComputeUnknownMessageSetItemsSize(unknown_fields). + // + // Returns a pointer past the last written byte. + static uint8* SerializeUnknownMessageSetItemsToArray( + const UnknownFieldSet& unknown_fields, + uint8* target); + + // Compute the size of the UnknownFieldSet on the wire. + static int ComputeUnknownFieldsSize(const UnknownFieldSet& unknown_fields); + + // Same thing except for messages that have the message_set_wire_format + // option. + static int ComputeUnknownMessageSetItemsSize( + const UnknownFieldSet& unknown_fields); + + + // Helper functions for encoding and decoding tags. (Inlined below and in + // _inl.h) + // + // This is different from MakeTag(field->number(), field->type()) in the case + // of packed repeated fields. + static uint32 MakeTag(const FieldDescriptor* field); + + // Parse a single field. The input should start out positioned immediately + // after the tag. + static bool ParseAndMergeField( + uint32 tag, + const FieldDescriptor* field, // May be NULL for unknown + Message* message, + io::CodedInputStream* input); + + // Serialize a single field. + static void SerializeFieldWithCachedSizes( + const FieldDescriptor* field, // Cannot be NULL + const Message& message, + io::CodedOutputStream* output); + + // Compute size of a single field. If the field is a message type, this + // will call ByteSize() for the embedded message, insuring that it caches + // its size. + static int FieldByteSize( + const FieldDescriptor* field, // Cannot be NULL + const Message& message); + + // Parse/serialize a MessageSet::Item group. Used with messages that use + // opion message_set_wire_format = true. + static bool ParseAndMergeMessageSetItem( + io::CodedInputStream* input, + Message* message); + static void SerializeMessageSetItemWithCachedSizes( + const FieldDescriptor* field, + const Message& message, + io::CodedOutputStream* output); + static int MessageSetItemByteSize( + const FieldDescriptor* field, + const Message& message); + + // Computes the byte size of a field, excluding tags. For packed fields, it + // only includes the size of the raw data, and not the size of the total + // length, but for other length-delimited types, the size of the length is + // included. + static int FieldDataOnlyByteSize( + const FieldDescriptor* field, // Cannot be NULL + const Message& message); + + enum Operation { + PARSE, + SERIALIZE, + }; + + // Verifies that a string field is valid UTF8, logging an error if not. + // This function will not be called by newly generated protobuf code + // but remains present to support existing code. + static void VerifyUTF8String(const char* data, int size, Operation op); + // The NamedField variant takes a field name in order to produce an + // informative error message if verification fails. + static void VerifyUTF8StringNamedField(const char* data, + int size, + Operation op, + const char* field_name); + + private: + // Verifies that a string field is valid UTF8, logging an error if not. + static void VerifyUTF8StringFallback( + const char* data, + int size, + Operation op, + const char* field_name); + + // Skip a MessageSet field. + static bool SkipMessageSetField(io::CodedInputStream* input, + uint32 field_number, + UnknownFieldSet* unknown_fields); + + // Parse a MessageSet field. + static bool ParseAndMergeMessageSetField(uint32 field_number, + const FieldDescriptor* field, + Message* message, + io::CodedInputStream* input); + + + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormat); +}; + +// Subclass of FieldSkipper which saves skipped fields to an UnknownFieldSet. +class LIBPROTOBUF_EXPORT UnknownFieldSetFieldSkipper : public FieldSkipper { + public: + UnknownFieldSetFieldSkipper(UnknownFieldSet* unknown_fields) + : unknown_fields_(unknown_fields) {} + virtual ~UnknownFieldSetFieldSkipper() {} + + // implements FieldSkipper ----------------------------------------- + virtual bool SkipField(io::CodedInputStream* input, uint32 tag); + virtual bool SkipMessage(io::CodedInputStream* input); + virtual void SkipUnknownEnum(int field_number, int value); + + protected: + UnknownFieldSet* unknown_fields_; +}; + +// inline methods ==================================================== + +inline WireFormatLite::WireType WireFormat::WireTypeForField( + const FieldDescriptor* field) { + if (field->options().packed()) { + return WireFormatLite::WIRETYPE_LENGTH_DELIMITED; + } else { + return WireTypeForFieldType(field->type()); + } +} + +inline WireFormatLite::WireType WireFormat::WireTypeForFieldType( + FieldDescriptor::Type type) { + // Some compilers don't like enum -> enum casts, so we implicit_cast to + // int first. + return WireFormatLite::WireTypeForFieldType( + static_cast( + implicit_cast(type))); +} + +inline uint32 WireFormat::MakeTag(const FieldDescriptor* field) { + return WireFormatLite::MakeTag(field->number(), WireTypeForField(field)); +} + +inline int WireFormat::TagSize(int field_number, FieldDescriptor::Type type) { + // Some compilers don't like enum -> enum casts, so we implicit_cast to + // int first. + return WireFormatLite::TagSize(field_number, + static_cast( + implicit_cast(type))); +} + +inline void WireFormat::VerifyUTF8String(const char* data, int size, + WireFormat::Operation op) { +#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED + WireFormat::VerifyUTF8StringFallback(data, size, op, NULL); +#else + // Avoid the compiler warning about unsued variables. + (void)data; (void)size; (void)op; +#endif +} + +inline void WireFormat::VerifyUTF8StringNamedField( + const char* data, int size, WireFormat::Operation op, + const char* field_name) { +#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED + WireFormat::VerifyUTF8StringFallback(data, size, op, field_name); +#endif +} + + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_H__ diff --git a/toolkit/components/protobuf/google/protobuf/wire_format_lite.cc b/toolkit/components/protobuf/src/google/protobuf/wire_format_lite.cc similarity index 76% rename from toolkit/components/protobuf/google/protobuf/wire_format_lite.cc rename to toolkit/components/protobuf/src/google/protobuf/wire_format_lite.cc index b1ff93a293ce2..8de827849da88 100644 --- a/toolkit/components/protobuf/google/protobuf/wire_format_lite.cc +++ b/toolkit/components/protobuf/src/google/protobuf/wire_format_lite.cc @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -56,10 +56,10 @@ const int WireFormatLite::kMessageSetMessageTag; #endif const int WireFormatLite::kMessageSetItemTagsSize = - io::CodedOutputStream::VarintSize32(kMessageSetItemStartTag) + - io::CodedOutputStream::VarintSize32(kMessageSetItemEndTag) + - io::CodedOutputStream::VarintSize32(kMessageSetTypeIdTag) + - io::CodedOutputStream::VarintSize32(kMessageSetMessageTag); + io::CodedOutputStream::StaticVarintSize32::value + + io::CodedOutputStream::StaticVarintSize32::value + + io::CodedOutputStream::StaticVarintSize32::value + + io::CodedOutputStream::StaticVarintSize32::value; const WireFormatLite::CppType WireFormatLite::kFieldTypeToCppTypeMap[MAX_FIELD_TYPE + 1] = { @@ -153,8 +153,65 @@ bool WireFormatLite::SkipField( } } +bool WireFormatLite::SkipField( + io::CodedInputStream* input, uint32 tag, io::CodedOutputStream* output) { + switch (WireFormatLite::GetTagWireType(tag)) { + case WireFormatLite::WIRETYPE_VARINT: { + uint64 value; + if (!input->ReadVarint64(&value)) return false; + output->WriteVarint32(tag); + output->WriteVarint64(value); + return true; + } + case WireFormatLite::WIRETYPE_FIXED64: { + uint64 value; + if (!input->ReadLittleEndian64(&value)) return false; + output->WriteVarint32(tag); + output->WriteLittleEndian64(value); + return true; + } + case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + output->WriteVarint32(tag); + output->WriteVarint32(length); + // TODO(mkilavuz): Provide API to prevent extra string copying. + string temp; + if (!input->ReadString(&temp, length)) return false; + output->WriteString(temp); + return true; + } + case WireFormatLite::WIRETYPE_START_GROUP: { + output->WriteVarint32(tag); + if (!input->IncrementRecursionDepth()) return false; + if (!SkipMessage(input, output)) return false; + input->DecrementRecursionDepth(); + // Check that the ending tag matched the starting tag. + if (!input->LastTagWas(WireFormatLite::MakeTag( + WireFormatLite::GetTagFieldNumber(tag), + WireFormatLite::WIRETYPE_END_GROUP))) { + return false; + } + return true; + } + case WireFormatLite::WIRETYPE_END_GROUP: { + return false; + } + case WireFormatLite::WIRETYPE_FIXED32: { + uint32 value; + if (!input->ReadLittleEndian32(&value)) return false; + output->WriteVarint32(tag); + output->WriteLittleEndian32(value); + return true; + } + default: { + return false; + } + } +} + bool WireFormatLite::SkipMessage(io::CodedInputStream* input) { - while(true) { + while (true) { uint32 tag = input->ReadTag(); if (tag == 0) { // End of input. This is a valid place to end, so return true. @@ -172,6 +229,27 @@ bool WireFormatLite::SkipMessage(io::CodedInputStream* input) { } } +bool WireFormatLite::SkipMessage(io::CodedInputStream* input, + io::CodedOutputStream* output) { + while (true) { + uint32 tag = input->ReadTag(); + if (tag == 0) { + // End of input. This is a valid place to end, so return true. + return true; + } + + WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); + + if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) { + output->WriteVarint32(tag); + // Must be the end of the message. + return true; + } + + if (!SkipField(input, tag, output)) return false; + } +} + bool FieldSkipper::SkipField( io::CodedInputStream* input, uint32 tag) { return WireFormatLite::SkipField(input, tag); @@ -182,10 +260,25 @@ bool FieldSkipper::SkipMessage(io::CodedInputStream* input) { } void FieldSkipper::SkipUnknownEnum( - int field_number, int value) { + int /* field_number */, int /* value */) { // Nothing. } +bool CodedOutputStreamFieldSkipper::SkipField( + io::CodedInputStream* input, uint32 tag) { + return WireFormatLite::SkipField(input, tag, unknown_fields_); +} + +bool CodedOutputStreamFieldSkipper::SkipMessage(io::CodedInputStream* input) { + return WireFormatLite::SkipMessage(input, unknown_fields_); +} + +void CodedOutputStreamFieldSkipper::SkipUnknownEnum( + int field_number, int value) { + unknown_fields_->WriteVarint32(field_number); + unknown_fields_->WriteVarint64(value); +} + bool WireFormatLite::ReadPackedEnumNoInline(io::CodedInputStream* input, bool (*is_valid)(int), RepeatedField* values) { @@ -281,15 +374,34 @@ void WireFormatLite::WriteString(int field_number, const string& value, io::CodedOutputStream* output) { // String is for UTF-8 text only WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output); + GOOGLE_CHECK(value.size() <= kint32max); output->WriteVarint32(value.size()); output->WriteString(value); } +void WireFormatLite::WriteStringMaybeAliased( + int field_number, const string& value, + io::CodedOutputStream* output) { + // String is for UTF-8 text only + WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output); + GOOGLE_CHECK(value.size() <= kint32max); + output->WriteVarint32(value.size()); + output->WriteRawMaybeAliased(value.data(), value.size()); +} void WireFormatLite::WriteBytes(int field_number, const string& value, io::CodedOutputStream* output) { WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output); + GOOGLE_CHECK(value.size() <= kint32max); output->WriteVarint32(value.size()); output->WriteString(value); } +void WireFormatLite::WriteBytesMaybeAliased( + int field_number, const string& value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output); + GOOGLE_CHECK(value.size() <= kint32max); + output->WriteVarint32(value.size()); + output->WriteRawMaybeAliased(value.data(), value.size()); +} void WireFormatLite::WriteGroup(int field_number, diff --git a/toolkit/components/protobuf/google/protobuf/wire_format_lite.h b/toolkit/components/protobuf/src/google/protobuf/wire_format_lite.h similarity index 92% rename from toolkit/components/protobuf/google/protobuf/wire_format_lite.h rename to toolkit/components/protobuf/src/google/protobuf/wire_format_lite.h index e3d5b2d8d05c9..14b3feb6ab2eb 100644 --- a/toolkit/components/protobuf/google/protobuf/wire_format_lite.h +++ b/toolkit/components/protobuf/src/google/protobuf/wire_format_lite.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -40,17 +40,16 @@ #ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ #define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ +#include #include +#include #include +#include // for CodedOutputStream::Varint32Size namespace google { namespace protobuf { template class RepeatedField; // repeated_field.h - namespace io { - class CodedInputStream; // coded_stream.h - class CodedOutputStream; // coded_stream.h - } } namespace protobuf { @@ -165,11 +164,22 @@ class LIBPROTOBUF_EXPORT WireFormatLite { // records to an UnknownFieldSet. static bool SkipField(io::CodedInputStream* input, uint32 tag); + // Skips a field value with the given tag. The input should start + // positioned immediately after the tag. Skipped values are recorded to a + // CodedOutputStream. + static bool SkipField(io::CodedInputStream* input, uint32 tag, + io::CodedOutputStream* output); + // Reads and ignores a message from the input. Skipped values are simply // discarded, not recorded anywhere. See WireFormat::SkipMessage() for a // version that records to an UnknownFieldSet. static bool SkipMessage(io::CodedInputStream* input); + // Reads and ignores a message from the input. Skipped values are recorded + // to a CodedOutputStream. + static bool SkipMessage(io::CodedInputStream* input, + io::CodedOutputStream* output); + // This macro does the same thing as WireFormatLite::MakeTag(), but the // result is usable as a compile-time constant, which makes it usable // as a switch case or a template input. WireFormatLite::MakeTag() is more @@ -230,9 +240,9 @@ class LIBPROTOBUF_EXPORT WireFormatLite { // that file to use these. // Avoid ugly line wrapping -#define input io::CodedInputStream* input -#define output io::CodedOutputStream* output -#define field_number int field_number +#define input io::CodedInputStream* input_arg +#define output io::CodedOutputStream* output_arg +#define field_number int field_number_arg #define INL GOOGLE_ATTRIBUTE_ALWAYS_INLINE // Read fields, not including tags. The assumption is that you already @@ -342,6 +352,10 @@ class LIBPROTOBUF_EXPORT WireFormatLite { static void WriteString(field_number, const string& value, output); static void WriteBytes (field_number, const string& value, output); + static void WriteStringMaybeAliased( + field_number, const string& value, output); + static void WriteBytesMaybeAliased( + field_number, const string& value, output); static void WriteGroup( field_number, const MessageLite& value, output); @@ -477,6 +491,10 @@ class LIBPROTOBUF_EXPORT WireFormatLite { template static inline int MessageSizeNoVirtual(const MessageType& value); + // Given the length of data, calculate the byte size of the data on the + // wire if we encode the data as a length delimited field. + static inline int LengthDelimitedSize(int length); + private: // A helper method for the repeated primitive reader. This method has // optimizations for primitive types that have fixed size on the wire, and @@ -488,6 +506,12 @@ class LIBPROTOBUF_EXPORT WireFormatLite { google::protobuf::io::CodedInputStream* input, RepeatedField* value) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + // Like ReadRepeatedFixedSizePrimitive but for packed primitive fields. + template + static inline bool ReadPackedFixedSizePrimitive( + google::protobuf::io::CodedInputStream* input, + RepeatedField* value) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + static const CppType kFieldTypeToCppTypeMap[]; static const WireFormatLite::WireType kWireTypeForFieldType[]; @@ -516,6 +540,24 @@ class LIBPROTOBUF_EXPORT FieldSkipper { virtual void SkipUnknownEnum(int field_number, int value); }; +// Subclass of FieldSkipper which saves skipped fields to a CodedOutputStream. + +class LIBPROTOBUF_EXPORT CodedOutputStreamFieldSkipper : public FieldSkipper { + public: + explicit CodedOutputStreamFieldSkipper(io::CodedOutputStream* unknown_fields) + : unknown_fields_(unknown_fields) {} + virtual ~CodedOutputStreamFieldSkipper() {} + + // implements FieldSkipper ----------------------------------------- + virtual bool SkipField(io::CodedInputStream* input, uint32 tag); + virtual bool SkipMessage(io::CodedInputStream* input); + virtual void SkipUnknownEnum(int field_number, int value); + + protected: + io::CodedOutputStream* unknown_fields_; +}; + + // inline methods ==================================================== inline WireFormatLite::CppType diff --git a/toolkit/components/protobuf/google/protobuf/wire_format_lite_inl.h b/toolkit/components/protobuf/src/google/protobuf/wire_format_lite_inl.h similarity index 86% rename from toolkit/components/protobuf/google/protobuf/wire_format_lite_inl.h rename to toolkit/components/protobuf/src/google/protobuf/wire_format_lite_inl.h index 729767464977d..feb2254043648 100644 --- a/toolkit/components/protobuf/google/protobuf/wire_format_lite_inl.h +++ b/toolkit/components/protobuf/src/google/protobuf/wire_format_lite_inl.h @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are @@ -36,13 +36,16 @@ #ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__ #define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__ +#ifdef _MSC_VER +// This is required for min/max on VS2013 only. #include +#endif + #include #include #include #include #include -#include #include @@ -152,8 +155,8 @@ template <> inline bool WireFormatLite::ReadPrimitive( io::CodedInputStream* input, bool* value) { - uint32 temp; - if (!input->ReadVarint32(&temp)) return false; + uint64 temp; + if (!input->ReadVarint64(&temp)) return false; *value = temp != 0; return true; } @@ -223,10 +226,11 @@ inline const uint8* WireFormatLite::ReadPrimitiveFromArray< } template -inline bool WireFormatLite::ReadRepeatedPrimitive(int, // tag_size, unused. - uint32 tag, - io::CodedInputStream* input, - RepeatedField* values) { +inline bool WireFormatLite::ReadRepeatedPrimitive( + int, // tag_size, unused. + uint32 tag, + io::CodedInputStream* input, + RepeatedField* values) { CType value; if (!ReadPrimitive(input, &value)) return false; values->Add(value); @@ -286,7 +290,7 @@ inline bool WireFormatLite::ReadRepeatedFixedSizePrimitive( return true; } -// Specializations of ReadRepeatedPrimitive for the fixed size types, which use +// Specializations of ReadRepeatedPrimitive for the fixed size types, which use // the optimized code path. #define READ_REPEATED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE) \ template <> \ @@ -301,12 +305,12 @@ inline bool WireFormatLite::ReadRepeatedPrimitive< \ tag_size, tag, input, values); \ } -READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32); -READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64); -READ_REPEATED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32); -READ_REPEATED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64); -READ_REPEATED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT); -READ_REPEATED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE); +READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32) +READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64) +READ_REPEATED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32) +READ_REPEATED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64) +READ_REPEATED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT) +READ_REPEATED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE) #undef READ_REPEATED_FIXED_SIZE_PRIMITIVE @@ -335,6 +339,86 @@ inline bool WireFormatLite::ReadPackedPrimitive(io::CodedInputStream* input, return true; } +template +inline bool WireFormatLite::ReadPackedFixedSizePrimitive( + io::CodedInputStream* input, RepeatedField* values) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + const uint32 old_entries = values->size(); + const uint32 new_entries = length / sizeof(CType); + const uint32 new_bytes = new_entries * sizeof(CType); + if (new_bytes != length) return false; + // We would *like* to pre-allocate the buffer to write into (for + // speed), but *must* avoid performing a very large allocation due + // to a malicious user-supplied "length" above. So we have a fast + // path that pre-allocates when the "length" is less than a bound. + // We determine the bound by calling BytesUntilTotalBytesLimit() and + // BytesUntilLimit(). These return -1 to mean "no limit set". + // There are four cases: + // TotalBytesLimit Limit + // -1 -1 Use slow path. + // -1 >= 0 Use fast path if length <= Limit. + // >= 0 -1 Use slow path. + // >= 0 >= 0 Use fast path if length <= min(both limits). + int64 bytes_limit = input->BytesUntilTotalBytesLimit(); + if (bytes_limit == -1) { + bytes_limit = input->BytesUntilLimit(); + } else { + bytes_limit = + min(bytes_limit, static_cast(input->BytesUntilLimit())); + } + if (bytes_limit >= new_bytes) { + // Fast-path that pre-allocates *values to the final size. +#if defined(PROTOBUF_LITTLE_ENDIAN) + values->Resize(old_entries + new_entries, 0); + // values->mutable_data() may change after Resize(), so do this after: + void* dest = reinterpret_cast(values->mutable_data() + old_entries); + if (!input->ReadRaw(dest, new_bytes)) { + values->Truncate(old_entries); + return false; + } +#else + values->Reserve(old_entries + new_entries); + CType value; + for (uint32 i = 0; i < new_entries; ++i) { + if (!ReadPrimitive(input, &value)) return false; + values->AddAlreadyReserved(value); + } +#endif + } else { + // This is the slow-path case where "length" may be too large to + // safely allocate. We read as much as we can into *values + // without pre-allocating "length" bytes. + CType value; + for (uint32 i = 0; i < new_entries; ++i) { + if (!ReadPrimitive(input, &value)) return false; + values->Add(value); + } + } + return true; +} + +// Specializations of ReadPackedPrimitive for the fixed size types, which use +// an optimized code path. +#define READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE) \ +template <> \ +inline bool WireFormatLite::ReadPackedPrimitive< \ + CPPTYPE, WireFormatLite::DECLARED_TYPE>( \ + io::CodedInputStream* input, \ + RepeatedField* values) { \ + return ReadPackedFixedSizePrimitive< \ + CPPTYPE, WireFormatLite::DECLARED_TYPE>(input, values); \ +} + +READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32); +READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64); +READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32); +READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64); +READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT); +READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE); + +#undef READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE + template bool WireFormatLite::ReadPackedPrimitiveNoInline(io::CodedInputStream* input, RepeatedField* values) { @@ -662,15 +746,13 @@ inline uint8* WireFormatLite::WriteStringToArray(int field_number, // WriteString() to avoid code duplication. If the implementations become // different, you will need to update that usage. target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target); - target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target); - return io::CodedOutputStream::WriteStringToArray(value, target); + return io::CodedOutputStream::WriteStringWithSizeToArray(value, target); } inline uint8* WireFormatLite::WriteBytesToArray(int field_number, const string& value, uint8* target) { target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target); - target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target); - return io::CodedOutputStream::WriteStringToArray(value, target); + return io::CodedOutputStream::WriteStringWithSizeToArray(value, target); } @@ -750,8 +832,7 @@ inline int WireFormatLite::GroupSize(const MessageLite& value) { return value.ByteSize(); } inline int WireFormatLite::MessageSize(const MessageLite& value) { - int size = value.ByteSize(); - return io::CodedOutputStream::VarintSize32(size) + size; + return LengthDelimitedSize(value.ByteSize()); } // See comment on ReadGroupNoVirtual to understand the need for this template @@ -764,8 +845,12 @@ inline int WireFormatLite::GroupSizeNoVirtual( template inline int WireFormatLite::MessageSizeNoVirtual( const MessageType_WorkAroundCppLookupDefect& value) { - int size = value.MessageType_WorkAroundCppLookupDefect::ByteSize(); - return io::CodedOutputStream::VarintSize32(size) + size; + return LengthDelimitedSize( + value.MessageType_WorkAroundCppLookupDefect::ByteSize()); +} + +inline int WireFormatLite::LengthDelimitedSize(int length) { + return io::CodedOutputStream::VarintSize32(length) + length; } } // namespace internal diff --git a/toolkit/components/protobuf/update.sh b/toolkit/components/protobuf/update.sh deleted file mode 100644 index 3472a76fe1e2a..0000000000000 --- a/toolkit/components/protobuf/update.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -patch -p1 < r512.patch diff --git a/toolkit/components/protobuf/upgrade_protobuf.sh b/toolkit/components/protobuf/upgrade_protobuf.sh new file mode 100755 index 0000000000000..bdaa4ce6338ec --- /dev/null +++ b/toolkit/components/protobuf/upgrade_protobuf.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +set -e + +usage() { + echo "Usage: upgrade_protobuf.sh path/to/protobuf" + echo + echo " Upgrades mozilla-central's copy of the protobuf library." + echo + echo " Get a protobuf release from here:" + echo " https://github.com/google/protobuf/releases" +} + +if [[ "$#" -ne 1 ]]; then + usage + exit 1 +fi + +PROTOBUF_LIB_PATH=$1 + +if [[ ! -d "$PROTOBUF_LIB_PATH" ]]; then + echo No such directory: $PROTOBUF_LIB_PATH + echo + usage + exit 1 +fi + +realpath() { + if [[ $1 = /* ]]; then + echo "$1" + else + echo "$PWD/${1#./}" + fi +} + +PROTOBUF_LIB_PATH=$(realpath $PROTOBUF_LIB_PATH) + +cd $(dirname $0) + +# Remove the old protobuf sources. +rm -rf src/google/* + +# Add all the new protobuf sources. +cp -r $PROTOBUF_LIB_PATH/src/google/* src/google/ + +# Remove compiler sources. +rm -rf src/google/protobuf/compiler + +# Remove test files. +find src/google -name '*test*' | xargs rm -rf + +# Remove protobuf's build files. +find src/google/ -name '.deps' | xargs rm -rf +find src/google/ -name '.dirstamp' | xargs rm -rf +rm -rf src/google/protobuf/SEBS + +# Apply custom changes for building as part of mozilla-central. + +cd ../../.. # Top level. + +echo +echo Applying custom changes for mozilla-central. If this fails, you need to +echo edit the 'toolkit/components/protobuf/src/google/*' sources manually and +echo update the 'toolkit/components/protobuf/m-c-changes.patch' patch file +echo accordingly. +echo + +patch -p1 < toolkit/components/protobuf/m-c-changes.patch + +echo +echo Successfully upgraded the protobuf lib! diff --git a/toolkit/components/protobuf/vs2013.patch b/toolkit/components/protobuf/vs2013.patch deleted file mode 100644 index f14f00060f37f..0000000000000 --- a/toolkit/components/protobuf/vs2013.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/toolkit/components/protobuf/google/protobuf/wire_format_lite_inl.h b/toolkit/components/protobuf/google/protobuf/wire_format_lite_inl.h ---- a/toolkit/components/protobuf/google/protobuf/wire_format_lite_inl.h -+++ b/toolkit/components/protobuf/google/protobuf/wire_format_lite_inl.h -@@ -31,16 +31,17 @@ - // Author: kenton@google.com (Kenton Varda) - // wink@google.com (Wink Saville) (refactored from wire_format.h) - // Based on original Protocol Buffers design by - // Sanjay Ghemawat, Jeff Dean, and others. - - #ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__ - #define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__ - -+#include - #include - #include - #include - #include - #include - #include - #include - From cb75c6c34c5523ecb64dac4e30a789c7ad6e91c2 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:42 -0700 Subject: [PATCH 044/151] Bug 1024774 - Part 1: Add the ChromeUtils WebIDL interface. r=bholley --- dom/bindings/Bindings.conf | 8 +++++ dom/webidl/ChromeUtils.webidl | 55 +++++++++++++++++++++++++++++++++++ dom/webidl/moz.build | 1 + 3 files changed, 64 insertions(+) create mode 100644 dom/webidl/ChromeUtils.webidl diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index ce8ffef4caa90..3b75056251303 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -266,6 +266,14 @@ DOMInterfaces = { 'concrete': False }, +'ChromeUtils': { + # The codegen is dumb, and doesn't understand that this interface is only a + # collection of static methods, so we have this `concrete: False` hack. + 'concrete': False, + 'nativeType': 'mozilla::devtools::ChromeUtils', + 'implicitJSContext': ['saveHeapSnapshot'] +}, + 'ChromeWindow': { 'concrete': False, }, diff --git a/dom/webidl/ChromeUtils.webidl b/dom/webidl/ChromeUtils.webidl new file mode 100644 index 0000000000000..43ab2b7dd9f44 --- /dev/null +++ b/dom/webidl/ChromeUtils.webidl @@ -0,0 +1,55 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/** + * A collection of static utility methods that are only exposed to Chrome. + */ +[ChromeOnly, Exposed=(Window,System)] +interface ChromeUtils { + /** + * Serialize a snapshot of the heap graph, as seen by |JS::ubi::Node| and + * restricted by |boundaries|, and write it to the provided file path. + * + * @param filePath The file path to write the heap snapshot to. + * + * @param boundaries The portion of the heap graph to write. + */ + [Throws] + static void saveHeapSnapshot(DOMString filePath, + optional HeapSnapshotBoundaries boundaries); +}; + +/** + * A JS object whose properties specify what portion of the heap graph to + * write. The recognized properties are: + * + * * globals: [ global, ... ] + * Dump only nodes that either: + * - belong in the compartment of one of the given globals; + * - belong to no compartment, but do belong to a Zone that contains one of + * the given globals; + * - are referred to directly by one of the last two kinds of nodes; or + * - is the fictional root node, described below. + * + * * debugger: Debugger object + * Like "globals", but use the Debugger's debuggees as the globals. + * + * * runtime: true + * Dump the entire heap graph, starting with the JSRuntime's roots. + * + * One, and only one, of these properties must exist on the boundaries object. + * + * The root of the dumped graph is a fictional node whose ubi::Node type name is + * "CoreDumpRoot". If we are dumping the entire ubi::Node graph, this root node + * has an edge for each of the JSRuntime's roots. If we are dumping a selected + * set of globals, the root has an edge to each global, and an edge for each + * incoming JS reference to the selected Zones. + */ +dictionary HeapSnapshotBoundaries { + sequence globals; + object debugger; + boolean runtime; +}; diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build index a53e50c862c57..25e64bb765e0d 100644 --- a/dom/webidl/moz.build +++ b/dom/webidl/moz.build @@ -74,6 +74,7 @@ WEBIDL_FILES = [ 'CharacterData.webidl', 'ChildNode.webidl', 'ChromeNotifications.webidl', + 'ChromeUtils.webidl', 'Client.webidl', 'Clients.webidl', 'ClipboardEvent.webidl', From 5c7b356755a31773c0e5166e6db07de2f8cab6ac Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:42 -0700 Subject: [PATCH 045/151] Bug 1024774 - Part 2: Implement a google::protobuf::ZeroCopyOutputStream wrapper around nsIOutputStream; r=jimb --- .../server/ZeroCopyNSIOutputStream.cpp | 99 +++++++++++++++++++ .../devtools/server/ZeroCopyNSIOutputStream.h | 70 +++++++++++++ toolkit/devtools/server/moz.build | 5 + 3 files changed, 174 insertions(+) create mode 100644 toolkit/devtools/server/ZeroCopyNSIOutputStream.cpp create mode 100644 toolkit/devtools/server/ZeroCopyNSIOutputStream.h diff --git a/toolkit/devtools/server/ZeroCopyNSIOutputStream.cpp b/toolkit/devtools/server/ZeroCopyNSIOutputStream.cpp new file mode 100644 index 0000000000000..41e85923eba1e --- /dev/null +++ b/toolkit/devtools/server/ZeroCopyNSIOutputStream.cpp @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/devtools/ZeroCopyNSIOutputStream.h" + +#include "mozilla/DebugOnly.h" + +namespace mozilla { +namespace devtools { + +ZeroCopyNSIOutputStream::ZeroCopyNSIOutputStream(nsCOMPtr &out) + : out(out) + , result_(NS_OK) + , amountUsed(0) + , writtenCount(0) +{ + DebugOnly nonBlocking = false; + MOZ_ASSERT(out->IsNonBlocking(&nonBlocking) == NS_OK); + MOZ_ASSERT(!nonBlocking); +} + +ZeroCopyNSIOutputStream::~ZeroCopyNSIOutputStream() +{ + if (!failed()) + NS_WARN_IF(NS_FAILED(writeBuffer())); +} + +nsresult +ZeroCopyNSIOutputStream::writeBuffer() +{ + if (failed()) + return result_; + + if (amountUsed == 0) + return NS_OK; + + int32_t amountWritten = 0; + while (amountWritten < amountUsed) { + uint32_t justWritten = 0; + + result_ = out->Write(buffer + amountWritten, + amountUsed - amountWritten, + &justWritten); + if (NS_WARN_IF(NS_FAILED(result_))) + return result_; + + amountWritten += justWritten; + } + + writtenCount += amountUsed; + amountUsed = 0; + return NS_OK; +} + +// ZeroCopyOutputStream Interface + +bool +ZeroCopyNSIOutputStream::Next(void **data, int *size) +{ + MOZ_ASSERT(data != nullptr); + MOZ_ASSERT(size != nullptr); + + if (failed()) + return false; + + if (amountUsed == BUFFER_SIZE) { + if (NS_FAILED(writeBuffer())) + return false; + } + + *data = buffer + amountUsed; + *size = BUFFER_SIZE - amountUsed; + amountUsed = BUFFER_SIZE; + return true; +} + +void +ZeroCopyNSIOutputStream::BackUp(int count) +{ + MOZ_ASSERT(count > 0, + "Must back up a positive number of bytes."); + MOZ_ASSERT(amountUsed == BUFFER_SIZE, + "Can only call BackUp directly after calling Next."); + MOZ_ASSERT(count <= amountUsed, + "Can't back up further than we've given out."); + + amountUsed -= count; +} + +::google::protobuf::int64 +ZeroCopyNSIOutputStream::ByteCount() const +{ + return writtenCount + amountUsed; +} + +} // namespace devtools +} // namespace mozilla diff --git a/toolkit/devtools/server/ZeroCopyNSIOutputStream.h b/toolkit/devtools/server/ZeroCopyNSIOutputStream.h new file mode 100644 index 0000000000000..80ec55dc6e0a6 --- /dev/null +++ b/toolkit/devtools/server/ZeroCopyNSIOutputStream.h @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_devtools_ZeroCopyNSIOutputStream__ +#define mozilla_devtools_ZeroCopyNSIOutputStream__ + +#include +#include + +#include "nsCOMPtr.h" +#include "nsIOutputStream.h" + +namespace mozilla { +namespace devtools { + +// A `google::protobuf::io::ZeroCopyOutputStream` implementation that uses an +// `nsIOutputStream` under the covers. +// +// This class will automatically write and flush its data to the +// `nsIOutputStream` in its destructor, but if you care whether that call +// succeeds or fails, then you should call the `flush` method yourself. Errors +// will be logged, however. +class MOZ_STACK_CLASS ZeroCopyNSIOutputStream + : public ::google::protobuf::io::ZeroCopyOutputStream +{ + static const int BUFFER_SIZE = 8192; + + // The nsIOutputStream we are streaming to. + nsCOMPtr &out; + + // The buffer we write data to before passing it to the output stream. + char buffer[BUFFER_SIZE]; + + // The status of writing to the underlying output stream. + nsresult result_; + + // The number of bytes in the buffer that have been used thus far. + int amountUsed; + + // Excluding the amount of the buffer currently used (which hasn't been + // written and flushed yet), this is the number of bytes written to the output + // stream. + int64_t writtenCount; + + // Write the internal buffer to the output stream and flush it. + nsresult writeBuffer(); + +public: + explicit ZeroCopyNSIOutputStream(nsCOMPtr &out); + + nsresult flush() { return writeBuffer(); } + + // Return true if writing to the underlying output stream ever failed. + bool failed() const { return NS_FAILED(result_); } + + nsresult result() const { return result_; } + + // ZeroCopyOutputStream Interface + virtual ~ZeroCopyNSIOutputStream() override; + virtual bool Next(void **data, int *size) override; + virtual void BackUp(int count) override; + virtual ::google::protobuf::int64 ByteCount() const override; +}; + +} // namespace devtools +} // namespace mozilla + +#endif // mozilla_devtools_ZeroCopyNSIOutputStream__ diff --git a/toolkit/devtools/server/moz.build b/toolkit/devtools/server/moz.build index b444e4ac41223..92b18c8672413 100644 --- a/toolkit/devtools/server/moz.build +++ b/toolkit/devtools/server/moz.build @@ -14,8 +14,13 @@ XPIDL_SOURCES += [ XPIDL_MODULE = 'jsinspector' +EXPORTS.mozilla.devtools += [ + 'ZeroCopyNSIOutputStream.h', +] + SOURCES += [ 'nsJSInspector.cpp', + 'ZeroCopyNSIOutputStream.cpp', ] FINAL_LIBRARY = 'xul' From 273a313f370d0c1b2213e7c36bd360b611ff35af Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:42 -0700 Subject: [PATCH 046/151] Bug 1024774 - Part 3: Serialize heap snapshots. r=jimb --- js/public/Debug.h | 15 +- js/public/UbiNode.h | 50 +- js/public/UbiNodeTraverse.h | 2 +- js/src/jsfriendapi.cpp | 6 + js/src/jsfriendapi.h | 3 + js/src/vm/Debugger-inl.h | 2 +- js/src/vm/Debugger.cpp | 23 +- js/src/vm/Debugger.h | 5 +- js/src/vm/DebuggerMemory.cpp | 11 +- js/src/vm/UbiNode.cpp | 24 +- toolkit/devtools/server/ChromeUtils.cpp | 386 +++++++ toolkit/devtools/server/ChromeUtils.h | 72 ++ toolkit/devtools/server/CoreDump.pb.cc | 1005 +++++++++++++++++ toolkit/devtools/server/CoreDump.pb.h | 643 +++++++++++ toolkit/devtools/server/CoreDump.proto | 69 ++ .../server/generate-core-dump-sources.sh | 26 + toolkit/devtools/server/moz.build | 7 + 17 files changed, 2311 insertions(+), 38 deletions(-) create mode 100644 toolkit/devtools/server/ChromeUtils.cpp create mode 100644 toolkit/devtools/server/ChromeUtils.h create mode 100644 toolkit/devtools/server/CoreDump.pb.cc create mode 100644 toolkit/devtools/server/CoreDump.pb.h create mode 100644 toolkit/devtools/server/CoreDump.proto create mode 100755 toolkit/devtools/server/generate-core-dump-sources.sh diff --git a/js/public/Debug.h b/js/public/Debug.h index 3f99273e2912b..5e33e13802be6 100644 --- a/js/public/Debug.h +++ b/js/public/Debug.h @@ -262,7 +262,13 @@ class BuilderOrigin : public Builder { // Tell Debuggers in |runtime| to use |mallocSizeOf| to find the size of // malloc'd blocks. -void SetDebuggerMallocSizeOf(JSRuntime* runtime, mozilla::MallocSizeOf mallocSizeOf); +JS_PUBLIC_API(void) +SetDebuggerMallocSizeOf(JSRuntime* runtime, mozilla::MallocSizeOf mallocSizeOf); + +// Get the MallocSizeOf function that the given runtime is using to find the +// size of malloc'd blocks. +JS_PUBLIC_API(mozilla::MallocSizeOf) +GetDebuggerMallocSizeOf(JSRuntime* runtime); @@ -316,7 +322,12 @@ onPromiseSettled(JSContext* cx, HandleObject promise); // Return true if the given value is a Debugger object, false otherwise. JS_PUBLIC_API(bool) -IsDebugger(JS::Value val); +IsDebugger(const JSObject &obj); + +// Append each of the debuggee global objects observed by the Debugger object +// |dbgObj| to |vector|. Returns true on success, false on failure. +JS_PUBLIC_API(bool) +GetDebuggeeGlobals(JSContext *cx, const JSObject &dbgObj, AutoObjectVector &vector); // Hooks for reporting where JavaScript execution began. diff --git a/js/public/UbiNode.h b/js/public/UbiNode.h index b92af4e82c397..775558a5c0f64 100644 --- a/js/public/UbiNode.h +++ b/js/public/UbiNode.h @@ -266,8 +266,8 @@ struct Concrete { static void construct(void* storage, Referent* referent); }; -// A container for a Base instance; all members simply forward to the contained instance. -// This container allows us to pass ubi::Node instances by value. +// A container for a Base instance; all members simply forward to the contained +// instance. This container allows us to pass ubi::Node instances by value. class Node { // Storage in which we allocate Base subclasses. mozilla::AlignedStorage2 storage; @@ -376,6 +376,21 @@ class Node { return base()->edges(cx, wantNames); } + // An identifier for this node, guaranteed to be stable and unique for as + // long as this ubi::Node's referent is alive and at the same address. + // + // This is probably suitable for use in serializations, as it is an integral + // type. It may also help save memory when constructing HashSets of + // ubi::Nodes: since a uintptr_t will always be smaller than a ubi::Node, a + // HashSet will use less space per element than a + // HashSet. + // + // (Note that 'unique' only means 'up to equality on ubi::Node'; see the + // caveats about multiple objects allocated at the same address for + // 'ubi::Node::operator=='.) + typedef uintptr_t Id; + Id identifier() const { return reinterpret_cast(base()->ptr); } + // A hash policy for ubi::Nodes. // This simply uses the stock PointerHasher on the ubi::Node's pointer. // We specialize DefaultHasher below to make this the default. @@ -495,6 +510,33 @@ class SimpleEdge : public Edge { typedef mozilla::Vector SimpleEdgeVector; +// An EdgeRange concrete class that holds a pre-existing vector of +// SimpleEdges. A PreComputedEdgeRange does not take ownership of its +// SimpleEdgeVector; it is up to the PreComputedEdgeRange's consumer to manage +// that lifetime. +class PreComputedEdgeRange : public EdgeRange { + SimpleEdgeVector& edges; + size_t i; + + void settle() { + front_ = i < edges.length() ? &edges[i] : nullptr; + } + + public: + explicit PreComputedEdgeRange(JSContext* cx, SimpleEdgeVector& edges) + : edges(edges), + i(0) + { + settle(); + } + + void popFront() override { + MOZ_ASSERT(!empty()); + i++; + settle(); + } +}; + // RootList is a class that can be pointed to by a |ubi::Node|, creating a // fictional root-of-roots which has edges to every GC root in the JS @@ -541,6 +583,10 @@ class MOZ_STACK_CLASS RootList { // Find only GC roots in the given Debugger object's set of debuggee zones. bool init(HandleObject debuggees); + // Returns true if the RootList has been initialized successfully, false + // otherwise. + bool initialized() { return noGC.isSome(); } + // Explicitly add the given Node as a root in this RootList. If wantNames is // true, you must pass an edgeName. The RootList does not take ownership of // edgeName. diff --git a/js/public/UbiNodeTraverse.h b/js/public/UbiNodeTraverse.h index 159de27e7d5c2..5d8650f04719c 100644 --- a/js/public/UbiNodeTraverse.h +++ b/js/public/UbiNodeTraverse.h @@ -120,7 +120,7 @@ struct BreadthFirst { MOZ_ASSERT(!traversalBegun); traversalBegun = true; - // While there are pending nodes, visit them, until we've found a path to the target. + // While there are pending nodes, visit them. while (!pending.empty()) { Node origin = pending.front(); pending.popFront(); diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 65ccf6700fde7..9c27fb9c50edb 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -302,6 +302,12 @@ js::IsAtomsCompartment(JSCompartment* comp) return comp->runtimeFromAnyThread()->isAtomsCompartment(comp); } +JS_FRIEND_API(bool) +js::IsAtomsZone(JS::Zone* zone) +{ + return zone->runtimeFromAnyThread()->isAtomsZone(zone); +} + JS_FRIEND_API(bool) js::IsInNonStrictPropertySet(JSContext* cx) { diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index b6a3cf7f7951d..7e7ad84c0e4d8 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -478,6 +478,9 @@ IsSystemZone(JS::Zone* zone); extern JS_FRIEND_API(bool) IsAtomsCompartment(JSCompartment* comp); +extern JS_FRIEND_API(bool) +IsAtomsZone(JS::Zone *zone); + /* * Returns whether we're in a non-strict property set (in that we're in a * non-strict script and the bytecode we're on is a property set). The return diff --git a/js/src/vm/Debugger-inl.h b/js/src/vm/Debugger-inl.h index 007267b3be5d0..73ca6b2caf9e9 100644 --- a/js/src/vm/Debugger-inl.h +++ b/js/src/vm/Debugger-inl.h @@ -27,7 +27,7 @@ js::Debugger::onLeaveFrame(JSContext* cx, AbstractFramePtr frame, bool ok) } /* static */ inline js::Debugger* -js::Debugger::fromJSObject(JSObject* obj) +js::Debugger::fromJSObject(const JSObject* obj) { MOZ_ASSERT(js::GetObjectClass(obj) == &jsclass); return (Debugger*) obj->as().getPrivate(); diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index 0bca1f4fedc70..209beb008ea0a 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -7915,16 +7915,27 @@ JS::dbg::onPromiseSettled(JSContext* cx, HandleObject promise) } JS_PUBLIC_API(bool) -JS::dbg::IsDebugger(JS::Value val) +JS::dbg::IsDebugger(const JSObject &obj) { - if (!val.isObject()) - return false; + return js::GetObjectClass(&obj) == &Debugger::jsclass && + js::Debugger::fromJSObject(&obj) != nullptr; +} + +JS_PUBLIC_API(bool) +JS::dbg::GetDebuggeeGlobals(JSContext *cx, const JSObject &dbgObj, AutoObjectVector &vector) +{ + MOZ_ASSERT(IsDebugger(dbgObj)); + js::Debugger *dbg = js::Debugger::fromJSObject(&dbgObj); - JSObject& obj = val.toObject(); - if (obj.getClass() != &Debugger::jsclass) + if (!vector.reserve(vector.length() + dbg->debuggees.count())) { + JS_ReportOutOfMemory(cx); return false; + } - return js::Debugger::fromJSObject(&obj) != nullptr; + for (WeakGlobalObjectSet::Range r = dbg->allDebuggees(); !r.empty(); r.popFront()) + vector.infallibleAppend(static_cast(r.front())); + + return true; } diff --git a/js/src/vm/Debugger.h b/js/src/vm/Debugger.h index a4bb68a89f550..cc7143215300d 100644 --- a/js/src/vm/Debugger.h +++ b/js/src/vm/Debugger.h @@ -188,7 +188,8 @@ class Debugger : private mozilla::LinkedListElement friend class SavedStacks; friend class mozilla::LinkedListElement; friend bool (::JS_DefineDebuggerObject)(JSContext* cx, JS::HandleObject obj); - friend bool (::JS::dbg::IsDebugger)(JS::Value val); + friend bool (::JS::dbg::IsDebugger)(const JSObject&); + friend bool (::JS::dbg::GetDebuggeeGlobals)(JSContext*, const JSObject&, AutoObjectVector&); friend void JS::dbg::onNewPromise(JSContext* cx, HandleObject promise); friend void JS::dbg::onPromiseSettled(JSContext* cx, HandleObject promise); friend bool JS::dbg::FireOnGarbageCollectionHook(JSContext* cx, @@ -601,7 +602,7 @@ class Debugger : private mozilla::LinkedListElement bool init(JSContext* cx); inline const js::HeapPtrNativeObject& toJSObject() const; inline js::HeapPtrNativeObject& toJSObjectRef(); - static inline Debugger* fromJSObject(JSObject* obj); + static inline Debugger* fromJSObject(const JSObject* obj); static Debugger* fromChildJSObject(JSObject* obj); bool hasMemory() const; diff --git a/js/src/vm/DebuggerMemory.cpp b/js/src/vm/DebuggerMemory.cpp index b7c4de7fd917f..6c132732dbdb3 100644 --- a/js/src/vm/DebuggerMemory.cpp +++ b/js/src/vm/DebuggerMemory.cpp @@ -325,11 +325,18 @@ DebuggerMemory::setOnGarbageCollection(JSContext* cx, unsigned argc, Value* vp) /* Debugger.Memory.prototype.takeCensus */ -void -JS::dbg::SetDebuggerMallocSizeOf(JSRuntime* rt, mozilla::MallocSizeOf mallocSizeOf) { +JS_PUBLIC_API(void) +JS::dbg::SetDebuggerMallocSizeOf(JSRuntime* rt, mozilla::MallocSizeOf mallocSizeOf) +{ rt->debuggerMallocSizeOf = mallocSizeOf; } +JS_PUBLIC_API(mozilla::MallocSizeOf) +JS::dbg::GetDebuggerMallocSizeOf(JSRuntime *rt) +{ + return rt->debuggerMallocSizeOf; +} + namespace js { namespace dbg { diff --git a/js/src/vm/UbiNode.cpp b/js/src/vm/UbiNode.cpp index 78476eee1e9ce..7a80bc46cf04a 100644 --- a/js/src/vm/UbiNode.cpp +++ b/js/src/vm/UbiNode.cpp @@ -328,8 +328,8 @@ RootList::init(ZoneSet& debuggees) bool RootList::init(HandleObject debuggees) { - MOZ_ASSERT(debuggees && JS::dbg::IsDebugger(ObjectValue(*debuggees))); - js::Debugger* dbg = js::Debugger::fromJSObject(debuggees); + MOZ_ASSERT(debuggees && JS::dbg::IsDebugger(*debuggees)); + js::Debugger* dbg = js::Debugger::fromJSObject(debuggees.get()); ZoneSet debuggeeZones; if (!debuggeeZones.init()) @@ -371,26 +371,6 @@ RootList::addRoot(Node node, const char16_t* edgeName) return edges.append(mozilla::Move(SimpleEdge(name.release(), node))); } -// An EdgeRange concrete class that holds a pre-existing vector of SimpleEdges. -class PreComputedEdgeRange : public EdgeRange { - SimpleEdgeVector& edges; - size_t i; - - void settle() { - front_ = i < edges.length() ? &edges[i] : nullptr; - } - - public: - explicit PreComputedEdgeRange(JSContext* cx, SimpleEdgeVector& edges) - : edges(edges), - i(0) - { - settle(); - } - - void popFront() override { i++; settle(); } -}; - const char16_t Concrete::concreteTypeName[] = MOZ_UTF16("RootList"); UniquePtr diff --git a/toolkit/devtools/server/ChromeUtils.cpp b/toolkit/devtools/server/ChromeUtils.cpp new file mode 100644 index 0000000000000..7d13abd015ae4 --- /dev/null +++ b/toolkit/devtools/server/ChromeUtils.cpp @@ -0,0 +1,386 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "ChromeUtils.h" + +#include +#include + +#include "mozilla/devtools/HeapSnapshot.h" +#include "mozilla/devtools/ZeroCopyNSIOutputStream.h" +#include "mozilla/Attributes.h" +#include "mozilla/UniquePtr.h" + +#include "nsCRTGlue.h" +#include "nsIOutputStream.h" +#include "nsNetUtil.h" +#include "prerror.h" +#include "prio.h" +#include "prtypes.h" + +#include "js/Debug.h" +#include "js/UbiNodeTraverse.h" + +namespace mozilla { +namespace devtools { + +using namespace JS; +using namespace dom; + + +// If we are only taking a snapshot of the heap affected by the given set of +// globals, find the set of zones the globals are allocated within. Returns +// false on OOM failure. +static bool +PopulateZonesWithGlobals(ZoneSet &zones, AutoObjectVector &globals) +{ + if (!zones.init()) + return false; + + unsigned length = globals.length(); + for (unsigned i = 0; i < length; i++) { + if (!zones.put(GetTenuredGCThingZone(globals[i]))) + return false; + } + + return true; +} + +// Add the given set of globals as explicit roots in the given roots +// list. Returns false on OOM failure. +static bool +AddGlobalsAsRoots(AutoObjectVector &globals, ubi::RootList &roots) +{ + unsigned length = globals.length(); + for (unsigned i = 0; i < length; i++) { + if (!roots.addRoot(ubi::Node(globals[i].get()), + MOZ_UTF16("heap snapshot global"))) + { + return false; + } + } + return true; +} + +// Choose roots and limits for a traversal, given `boundaries`. Set `roots` to +// the set of nodes within the boundaries that are referred to by nodes +// outside. If `boundaries` does not include all JS zones, initialize `zones` to +// the set of included zones; otherwise, leave `zones` uninitialized. (You can +// use zones.initialized() to check.) +// +// If `boundaries` is incoherent, or we encounter an error while trying to +// handle it, or we run out of memory, set `rv` appropriately and return +// `false`. +static bool +EstablishBoundaries(JSContext *cx, + ErrorResult &rv, + const HeapSnapshotBoundaries &boundaries, + ubi::RootList &roots, + ZoneSet &zones) +{ + MOZ_ASSERT(!roots.initialized()); + MOZ_ASSERT(!zones.initialized()); + + bool foundBoundaryProperty = false; + + if (boundaries.mRuntime.WasPassed()) { + foundBoundaryProperty = true; + + if (!boundaries.mRuntime.Value()) { + rv.Throw(NS_ERROR_INVALID_ARG); + return false; + } + + if (!roots.init()) { + rv.Throw(NS_ERROR_OUT_OF_MEMORY); + return false; + } + } + + if (boundaries.mDebugger.WasPassed()) { + if (foundBoundaryProperty) { + rv.Throw(NS_ERROR_INVALID_ARG); + return false; + } + foundBoundaryProperty = true; + + JSObject *dbgObj = boundaries.mDebugger.Value(); + if (!dbgObj || !dbg::IsDebugger(*dbgObj)) { + rv.Throw(NS_ERROR_INVALID_ARG); + return false; + } + + AutoObjectVector globals(cx); + if (!dbg::GetDebuggeeGlobals(cx, *dbgObj, globals) || + !PopulateZonesWithGlobals(zones, globals) || + !roots.init(zones) || + !AddGlobalsAsRoots(globals, roots)) + { + rv.Throw(NS_ERROR_OUT_OF_MEMORY); + return false; + } + } + + if (boundaries.mGlobals.WasPassed()) { + if (foundBoundaryProperty) { + rv.Throw(NS_ERROR_INVALID_ARG); + return false; + } + foundBoundaryProperty = true; + + uint32_t length = boundaries.mGlobals.Value().Length(); + if (length == 0) { + rv.Throw(NS_ERROR_INVALID_ARG); + return false; + } + + AutoObjectVector globals(cx); + for (uint32_t i = 0; i < length; i++) { + JSObject *global = boundaries.mGlobals.Value().ElementAt(i); + if (!JS_IsGlobalObject(global)) { + rv.Throw(NS_ERROR_INVALID_ARG); + return false; + } + if (!globals.append(global)) { + rv.Throw(NS_ERROR_OUT_OF_MEMORY); + return false; + } + } + + if (!PopulateZonesWithGlobals(zones, globals) || + !roots.init(zones) || + !AddGlobalsAsRoots(globals, roots)) + { + rv.Throw(NS_ERROR_OUT_OF_MEMORY); + return false; + } + } + + if (!foundBoundaryProperty) { + rv.Throw(NS_ERROR_INVALID_ARG); + return false; + } + + MOZ_ASSERT(roots.initialized()); + MOZ_ASSERT_IF(boundaries.mDebugger.WasPassed(), zones.initialized()); + MOZ_ASSERT_IF(boundaries.mGlobals.WasPassed(), zones.initialized()); + return true; +} + + +// A `CoreDumpWriter` that serializes nodes to protobufs and writes them to +// the given `CodedOutputStream`. +class MOZ_STACK_CLASS StreamWriter : public CoreDumpWriter +{ + JSContext *cx; + bool wantNames; + + ::google::protobuf::io::ZeroCopyOutputStream &stream; + + bool writeMessage(const ::google::protobuf::MessageLite &message) { + // We have to create a new CodedOutputStream when writing each message so + // that the 64MB size limit used by Coded{Output,Input}Stream to prevent + // integer overflow is enforced per message rather than on the whole stream. + ::google::protobuf::io::CodedOutputStream codedStream(&stream); + codedStream.WriteVarint32(message.ByteSize()); + message.SerializeWithCachedSizes(&codedStream); + return !codedStream.HadError(); + } + +public: + StreamWriter(JSContext *cx, + ::google::protobuf::io::ZeroCopyOutputStream &stream, + bool wantNames) + : cx(cx) + , wantNames(wantNames) + , stream(stream) + { } + + ~StreamWriter() override { } + + virtual bool writeMetadata(uint64_t timestamp) override { + protobuf::Metadata metadata; + metadata.set_timestamp(timestamp); + return writeMessage(metadata); + } + + virtual bool writeNode(const JS::ubi::Node &ubiNode, + EdgePolicy includeEdges) override { + protobuf::Node protobufNode; + protobufNode.set_id(ubiNode.identifier()); + + const char16_t *typeName = ubiNode.typeName(); + size_t length = NS_strlen(typeName) * sizeof(char16_t); + protobufNode.set_typename_(typeName, length); + + JSRuntime *rt = JS_GetRuntime(cx); + mozilla::MallocSizeOf mallocSizeOf = dbg::GetDebuggerMallocSizeOf(rt); + MOZ_ASSERT(mallocSizeOf); + protobufNode.set_size(ubiNode.size(mallocSizeOf)); + + if (includeEdges) { + auto edges = ubiNode.edges(cx, wantNames); + if (NS_WARN_IF(!edges)) + return false; + + for ( ; !edges->empty(); edges->popFront()) { + const ubi::Edge &ubiEdge = edges->front(); + + protobuf::Edge *protobufEdge = protobufNode.add_edges(); + if (NS_WARN_IF(!protobufEdge)) { + return false; + } + + protobufEdge->set_referent(ubiEdge.referent.identifier()); + + if (wantNames && ubiEdge.name) { + size_t length = NS_strlen(ubiEdge.name) * sizeof(char16_t); + protobufEdge->set_name(ubiEdge.name, length); + } + } + } + + return writeMessage(protobufNode); + } +}; + +// A JS::ubi::BreadthFirst handler that serializes a snapshot of the heap into a +// core dump. +class MOZ_STACK_CLASS HeapSnapshotHandler { + CoreDumpWriter& writer; + JS::ZoneSet* zones; + +public: + HeapSnapshotHandler(CoreDumpWriter& writer, + JS::ZoneSet* zones) + : writer(writer), + zones(zones) + { } + + // JS::ubi::BreadthFirst handler interface. + + class NodeData { }; + typedef JS::ubi::BreadthFirst Traversal; + bool operator() (Traversal &traversal, + JS::ubi::Node origin, + const JS::ubi::Edge &edge, + NodeData *, + bool first) + { + // We're only interested in the first time we reach edge.referent, not in + // every edge arriving at that node. "But, don't we want to serialize every + // edge in the heap graph?" you ask. Don't worry! This edge is still + // serialized into the core dump. Serializing a node also serializes each of + // its edges, and if we are traversing a given edge, we must have already + // visited and serialized the origin node and its edges. + if (!first) + return true; + + const JS::ubi::Node &referent = edge.referent; + + if (!zones) + // We aren't targeting a particular set of zones, so serialize all the + // things! + return writer.writeNode(referent, CoreDumpWriter::INCLUDE_EDGES); + + // We are targeting a particular set of zones. If this node is in our target + // set, serialize it and all of its edges. If this node is _not_ in our + // target set, we also serialize under the assumption that it is a shared + // resource being used by something in our target zones since we reached it + // by traversing the heap graph. However, we do not serialize its outgoing + // edges and we abandon further traversal from this node. + + JS::Zone *zone = referent.zone(); + + if (zones->has(zone)) + return writer.writeNode(referent, CoreDumpWriter::INCLUDE_EDGES); + + traversal.abandonReferent(); + return writer.writeNode(referent, CoreDumpWriter::EXCLUDE_EDGES); + } +}; + + +bool +WriteHeapGraph(JSContext *cx, + const JS::ubi::Node &node, + CoreDumpWriter &writer, + bool wantNames, + JS::ZoneSet *zones, + JS::AutoCheckCannotGC &noGC) +{ + // Serialize the starting node to the core dump. + + if (NS_WARN_IF(!writer.writeNode(node, CoreDumpWriter::INCLUDE_EDGES))) { + return false; + } + + // Walk the heap graph starting from the given node and serialize it into the + // core dump. + + HeapSnapshotHandler handler(writer, zones); + HeapSnapshotHandler::Traversal traversal(cx, handler, noGC); + if (!traversal.init()) + return false; + traversal.wantNames = wantNames; + + return traversal.addStartVisited(node) && + traversal.traverse(); +} + +/* static */ void +ChromeUtils::SaveHeapSnapshot(GlobalObject &global, + JSContext *cx, + const nsAString &filePath, + const HeapSnapshotBoundaries &boundaries, + ErrorResult& rv) +{ + bool wantNames = true; + ZoneSet zones; + Maybe maybeNoGC; + ubi::RootList rootList(cx, maybeNoGC, wantNames); + if (!EstablishBoundaries(cx, rv, boundaries, rootList, zones)) + return; + + MOZ_ASSERT(maybeNoGC.isSome()); + ubi::Node roots(&rootList); + + nsCOMPtr file; + rv = NS_NewLocalFile(filePath, false, getter_AddRefs(file)); + if (NS_WARN_IF(rv.Failed())) + return; + + nsCOMPtr outputStream; + rv = NS_NewLocalFileOutputStream(getter_AddRefs(outputStream), file, + PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE, + -1, 0); + if (NS_WARN_IF(rv.Failed())) + return; + + ZeroCopyNSIOutputStream zeroCopyStream(outputStream); + ::google::protobuf::io::GzipOutputStream gzipStream(&zeroCopyStream); + + StreamWriter writer(cx, gzipStream, wantNames); + + // Serialize the initial heap snapshot metadata to the core dump. + if (!writer.writeMetadata(PR_Now()) || + // Serialize the heap graph to the core dump, starting from our list of + // roots. + !WriteHeapGraph(cx, + roots, + writer, + wantNames, + zones.initialized() ? &zones : nullptr, + maybeNoGC.ref())) + { + rv.Throw(zeroCopyStream.failed() + ? zeroCopyStream.result() + : NS_ERROR_UNEXPECTED); + return; + } +} + +} +} diff --git a/toolkit/devtools/server/ChromeUtils.h b/toolkit/devtools/server/ChromeUtils.h new file mode 100644 index 0000000000000..211e755872f41 --- /dev/null +++ b/toolkit/devtools/server/ChromeUtils.h @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_devtools_ChromeUtils__ +#define mozilla_devtools_ChromeUtils__ + +#include "CoreDump.pb.h" +#include "jsapi.h" +#include "jsfriendapi.h" + +#include "js/UbiNode.h" +#include "js/UbiNodeTraverse.h" +#include "mozilla/ErrorResult.h" +#include "mozilla/dom/BindingDeclarations.h" +#include "mozilla/dom/ChromeUtilsBinding.h" + +namespace mozilla { +namespace devtools { + +// A `CoreDumpWriter` is given the data we wish to save in a core dump and +// serializes it to disk, or memory, or a socket, etc. +class CoreDumpWriter +{ +public: + virtual ~CoreDumpWriter() { }; + + // Write the given bits of metadata we would like to associate with this core + // dump. + virtual bool writeMetadata(uint64_t timestamp) = 0; + + enum EdgePolicy : bool { + INCLUDE_EDGES = true, + EXCLUDE_EDGES = false + }; + + // Write the given `JS::ubi::Node` to the core dump. The given `EdgePolicy` + // dictates whether its outgoing edges should also be written to the core + // dump, or excluded. + virtual bool writeNode(const JS::ubi::Node &node, + EdgePolicy includeEdges) = 0; +}; + + +// Serialize the heap graph as seen from `node` with the given +// `CoreDumpWriter`. If `wantNames` is true, capture edge names. If `zones` is +// non-null, only capture the sub-graph within the zone set, otherwise capture +// the whole heap graph. Returns false on failure. +bool +WriteHeapGraph(JSContext *cx, + const JS::ubi::Node &node, + CoreDumpWriter &writer, + bool wantNames, + JS::ZoneSet *zones, + JS::AutoCheckCannotGC &noGC); + + +class ChromeUtils +{ +public: + static void SaveHeapSnapshot(dom::GlobalObject &global, + JSContext *cx, + const nsAString &filePath, + const dom::HeapSnapshotBoundaries &boundaries, + ErrorResult &rv); +}; + +} // namespace devtools +} // namespace mozilla + +#endif // mozilla_devtools_ChromeUtils__ diff --git a/toolkit/devtools/server/CoreDump.pb.cc b/toolkit/devtools/server/CoreDump.pb.cc new file mode 100644 index 0000000000000..c82037f3eeb4b --- /dev/null +++ b/toolkit/devtools/server/CoreDump.pb.cc @@ -0,0 +1,1005 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: CoreDump.proto + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "CoreDump.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace mozilla { +namespace devtools { +namespace protobuf { + +namespace { + +const ::google::protobuf::Descriptor* Metadata_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Metadata_reflection_ = NULL; +const ::google::protobuf::Descriptor* Node_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Node_reflection_ = NULL; +const ::google::protobuf::Descriptor* Edge_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + Edge_reflection_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_CoreDump_2eproto() { + protobuf_AddDesc_CoreDump_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "CoreDump.proto"); + GOOGLE_CHECK(file != NULL); + Metadata_descriptor_ = file->message_type(0); + static const int Metadata_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metadata, timestamp_), + }; + Metadata_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Metadata_descriptor_, + Metadata::default_instance_, + Metadata_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metadata, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Metadata, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Metadata)); + Node_descriptor_ = file->message_type(1); + static const int Node_offsets_[4] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, id_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, typename__), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, size_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, edges_), + }; + Node_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Node_descriptor_, + Node::default_instance_, + Node_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Node, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Node)); + Edge_descriptor_ = file->message_type(2); + static const int Edge_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, referent_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, name_), + }; + Edge_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + Edge_descriptor_, + Edge::default_instance_, + Edge_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Edge, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(Edge)); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_CoreDump_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Metadata_descriptor_, &Metadata::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Node_descriptor_, &Node::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + Edge_descriptor_, &Edge::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_CoreDump_2eproto() { + delete Metadata::default_instance_; + delete Metadata_reflection_; + delete Node::default_instance_; + delete Node_reflection_; + delete Edge::default_instance_; + delete Edge_reflection_; +} + +void protobuf_AddDesc_CoreDump_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n\016CoreDump.proto\022\031mozilla.devtools.proto" + "buf\"\035\n\010Metadata\022\021\n\ttimeStamp\030\001 \001(\004\"b\n\004No" + "de\022\n\n\002id\030\001 \001(\004\022\020\n\010typeName\030\002 \001(\014\022\014\n\004size" + "\030\003 \001(\004\022.\n\005edges\030\004 \003(\0132\037.mozilla.devtools" + ".protobuf.Edge\"&\n\004Edge\022\020\n\010referent\030\001 \001(\004" + "\022\014\n\004name\030\002 \001(\014", 214); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "CoreDump.proto", &protobuf_RegisterTypes); + Metadata::default_instance_ = new Metadata(); + Node::default_instance_ = new Node(); + Edge::default_instance_ = new Edge(); + Metadata::default_instance_->InitAsDefaultInstance(); + Node::default_instance_->InitAsDefaultInstance(); + Edge::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_CoreDump_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_CoreDump_2eproto { + StaticDescriptorInitializer_CoreDump_2eproto() { + protobuf_AddDesc_CoreDump_2eproto(); + } +} static_descriptor_initializer_CoreDump_2eproto_; + +// =================================================================== + +#ifndef _MSC_VER +const int Metadata::kTimeStampFieldNumber; +#endif // !_MSC_VER + +Metadata::Metadata() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.devtools.protobuf.Metadata) +} + +void Metadata::InitAsDefaultInstance() { +} + +Metadata::Metadata(const Metadata& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.devtools.protobuf.Metadata) +} + +void Metadata::SharedCtor() { + _cached_size_ = 0; + timestamp_ = GOOGLE_ULONGLONG(0); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Metadata::~Metadata() { + // @@protoc_insertion_point(destructor:mozilla.devtools.protobuf.Metadata) + SharedDtor(); +} + +void Metadata::SharedDtor() { + if (this != default_instance_) { + } +} + +void Metadata::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Metadata::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Metadata_descriptor_; +} + +const Metadata& Metadata::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_CoreDump_2eproto(); + return *default_instance_; +} + +Metadata* Metadata::default_instance_ = NULL; + +Metadata* Metadata::New() const { + return new Metadata; +} + +void Metadata::Clear() { + timestamp_ = GOOGLE_ULONGLONG(0); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Metadata::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:mozilla.devtools.protobuf.Metadata) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional uint64 timeStamp = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, ×tamp_))); + set_has_timestamp(); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:mozilla.devtools.protobuf.Metadata) + return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.devtools.protobuf.Metadata) + return false; +#undef DO_ +} + +void Metadata::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.devtools.protobuf.Metadata) + // optional uint64 timeStamp = 1; + if (has_timestamp()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->timestamp(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:mozilla.devtools.protobuf.Metadata) +} + +::google::protobuf::uint8* Metadata::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:mozilla.devtools.protobuf.Metadata) + // optional uint64 timeStamp = 1; + if (has_timestamp()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->timestamp(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:mozilla.devtools.protobuf.Metadata) + return target; +} + +int Metadata::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional uint64 timeStamp = 1; + if (has_timestamp()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->timestamp()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Metadata::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Metadata* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Metadata::MergeFrom(const Metadata& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_timestamp()) { + set_timestamp(from.timestamp()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Metadata::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Metadata::CopyFrom(const Metadata& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Metadata::IsInitialized() const { + + return true; +} + +void Metadata::Swap(Metadata* other) { + if (other != this) { + std::swap(timestamp_, other->timestamp_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Metadata::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Metadata_descriptor_; + metadata.reflection = Metadata_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Node::kIdFieldNumber; +const int Node::kTypeNameFieldNumber; +const int Node::kSizeFieldNumber; +const int Node::kEdgesFieldNumber; +#endif // !_MSC_VER + +Node::Node() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.devtools.protobuf.Node) +} + +void Node::InitAsDefaultInstance() { +} + +Node::Node(const Node& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.devtools.protobuf.Node) +} + +void Node::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + id_ = GOOGLE_ULONGLONG(0); + typename__ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + size_ = GOOGLE_ULONGLONG(0); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Node::~Node() { + // @@protoc_insertion_point(destructor:mozilla.devtools.protobuf.Node) + SharedDtor(); +} + +void Node::SharedDtor() { + if (typename__ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete typename__; + } + if (this != default_instance_) { + } +} + +void Node::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Node::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Node_descriptor_; +} + +const Node& Node::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_CoreDump_2eproto(); + return *default_instance_; +} + +Node* Node::default_instance_ = NULL; + +Node* Node::New() const { + return new Node; +} + +void Node::Clear() { + if (_has_bits_[0 / 32] & 7) { + id_ = GOOGLE_ULONGLONG(0); + if (has_typename_()) { + if (typename__ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + typename__->clear(); + } + } + size_ = GOOGLE_ULONGLONG(0); + } + edges_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Node::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:mozilla.devtools.protobuf.Node) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional uint64 id = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &id_))); + set_has_id(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_typeName; + break; + } + + // optional bytes typeName = 2; + case 2: { + if (tag == 18) { + parse_typeName: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_typename_())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(24)) goto parse_size; + break; + } + + // optional uint64 size = 3; + case 3: { + if (tag == 24) { + parse_size: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &size_))); + set_has_size(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_edges; + break; + } + + // repeated .mozilla.devtools.protobuf.Edge edges = 4; + case 4: { + if (tag == 34) { + parse_edges: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_edges())); + } else { + goto handle_unusual; + } + if (input->ExpectTag(34)) goto parse_edges; + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:mozilla.devtools.protobuf.Node) + return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.devtools.protobuf.Node) + return false; +#undef DO_ +} + +void Node::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.devtools.protobuf.Node) + // optional uint64 id = 1; + if (has_id()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->id(), output); + } + + // optional bytes typeName = 2; + if (has_typename_()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 2, this->typename_(), output); + } + + // optional uint64 size = 3; + if (has_size()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(3, this->size(), output); + } + + // repeated .mozilla.devtools.protobuf.Edge edges = 4; + for (int i = 0; i < this->edges_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->edges(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:mozilla.devtools.protobuf.Node) +} + +::google::protobuf::uint8* Node::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:mozilla.devtools.protobuf.Node) + // optional uint64 id = 1; + if (has_id()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->id(), target); + } + + // optional bytes typeName = 2; + if (has_typename_()) { + target = + ::google::protobuf::internal::WireFormatLite::WriteBytesToArray( + 2, this->typename_(), target); + } + + // optional uint64 size = 3; + if (has_size()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(3, this->size(), target); + } + + // repeated .mozilla.devtools.protobuf.Edge edges = 4; + for (int i = 0; i < this->edges_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->edges(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:mozilla.devtools.protobuf.Node) + return target; +} + +int Node::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional uint64 id = 1; + if (has_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->id()); + } + + // optional bytes typeName = 2; + if (has_typename_()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->typename_()); + } + + // optional uint64 size = 3; + if (has_size()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->size()); + } + + } + // repeated .mozilla.devtools.protobuf.Edge edges = 4; + total_size += 1 * this->edges_size(); + for (int i = 0; i < this->edges_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->edges(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Node::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Node* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Node::MergeFrom(const Node& from) { + GOOGLE_CHECK_NE(&from, this); + edges_.MergeFrom(from.edges_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_id()) { + set_id(from.id()); + } + if (from.has_typename_()) { + set_typename_(from.typename_()); + } + if (from.has_size()) { + set_size(from.size()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Node::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Node::CopyFrom(const Node& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Node::IsInitialized() const { + + return true; +} + +void Node::Swap(Node* other) { + if (other != this) { + std::swap(id_, other->id_); + std::swap(typename__, other->typename__); + std::swap(size_, other->size_); + edges_.Swap(&other->edges_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Node::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Node_descriptor_; + metadata.reflection = Node_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int Edge::kReferentFieldNumber; +const int Edge::kNameFieldNumber; +#endif // !_MSC_VER + +Edge::Edge() + : ::google::protobuf::Message() { + SharedCtor(); + // @@protoc_insertion_point(constructor:mozilla.devtools.protobuf.Edge) +} + +void Edge::InitAsDefaultInstance() { +} + +Edge::Edge(const Edge& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); + // @@protoc_insertion_point(copy_constructor:mozilla.devtools.protobuf.Edge) +} + +void Edge::SharedCtor() { + ::google::protobuf::internal::GetEmptyString(); + _cached_size_ = 0; + referent_ = GOOGLE_ULONGLONG(0); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +Edge::~Edge() { + // @@protoc_insertion_point(destructor:mozilla.devtools.protobuf.Edge) + SharedDtor(); +} + +void Edge::SharedDtor() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (this != default_instance_) { + } +} + +void Edge::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* Edge::descriptor() { + protobuf_AssignDescriptorsOnce(); + return Edge_descriptor_; +} + +const Edge& Edge::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_CoreDump_2eproto(); + return *default_instance_; +} + +Edge* Edge::default_instance_ = NULL; + +Edge* Edge::New() const { + return new Edge; +} + +void Edge::Clear() { + if (_has_bits_[0 / 32] & 3) { + referent_ = GOOGLE_ULONGLONG(0); + if (has_name()) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool Edge::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + // @@protoc_insertion_point(parse_start:mozilla.devtools.protobuf.Edge) + for (;;) { + ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoff(127); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional uint64 referent = 1; + case 1: { + if (tag == 8) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &referent_))); + set_has_referent(); + } else { + goto handle_unusual; + } + if (input->ExpectTag(18)) goto parse_name; + break; + } + + // optional bytes name = 2; + case 2: { + if (tag == 18) { + parse_name: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_name())); + } else { + goto handle_unusual; + } + if (input->ExpectAtEnd()) goto success; + break; + } + + default: { + handle_unusual: + if (tag == 0 || + ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + goto success; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:mozilla.devtools.protobuf.Edge) + return true; +failure: + // @@protoc_insertion_point(parse_failure:mozilla.devtools.protobuf.Edge) + return false; +#undef DO_ +} + +void Edge::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:mozilla.devtools.protobuf.Edge) + // optional uint64 referent = 1; + if (has_referent()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(1, this->referent(), output); + } + + // optional bytes name = 2; + if (has_name()) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 2, this->name(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:mozilla.devtools.protobuf.Edge) +} + +::google::protobuf::uint8* Edge::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:mozilla.devtools.protobuf.Edge) + // optional uint64 referent = 1; + if (has_referent()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(1, this->referent(), target); + } + + // optional bytes name = 2; + if (has_name()) { + target = + ::google::protobuf::internal::WireFormatLite::WriteBytesToArray( + 2, this->name(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:mozilla.devtools.protobuf.Edge) + return target; +} + +int Edge::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional uint64 referent = 1; + if (has_referent()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->referent()); + } + + // optional bytes name = 2; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->name()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void Edge::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const Edge* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void Edge::MergeFrom(const Edge& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_referent()) { + set_referent(from.referent()); + } + if (from.has_name()) { + set_name(from.name()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void Edge::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Edge::CopyFrom(const Edge& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Edge::IsInitialized() const { + + return true; +} + +void Edge::Swap(Edge* other) { + if (other != this) { + std::swap(referent_, other->referent_); + std::swap(name_, other->name_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata Edge::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = Edge_descriptor_; + metadata.reflection = Edge_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace protobuf +} // namespace devtools +} // namespace mozilla + +// @@protoc_insertion_point(global_scope) diff --git a/toolkit/devtools/server/CoreDump.pb.h b/toolkit/devtools/server/CoreDump.pb.h new file mode 100644 index 0000000000000..8420a2415777c --- /dev/null +++ b/toolkit/devtools/server/CoreDump.pb.h @@ -0,0 +1,643 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: CoreDump.proto + +#ifndef PROTOBUF_CoreDump_2eproto__INCLUDED +#define PROTOBUF_CoreDump_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2006000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2006001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace mozilla { +namespace devtools { +namespace protobuf { + +// Internal implementation detail -- do not call these. +void protobuf_AddDesc_CoreDump_2eproto(); +void protobuf_AssignDesc_CoreDump_2eproto(); +void protobuf_ShutdownFile_CoreDump_2eproto(); + +class Metadata; +class Node; +class Edge; + +// =================================================================== + +class Metadata : public ::google::protobuf::Message { + public: + Metadata(); + virtual ~Metadata(); + + Metadata(const Metadata& from); + + inline Metadata& operator=(const Metadata& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Metadata& default_instance(); + + void Swap(Metadata* other); + + // implements Message ---------------------------------------------- + + Metadata* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Metadata& from); + void MergeFrom(const Metadata& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint64 timeStamp = 1; + inline bool has_timestamp() const; + inline void clear_timestamp(); + static const int kTimeStampFieldNumber = 1; + inline ::google::protobuf::uint64 timestamp() const; + inline void set_timestamp(::google::protobuf::uint64 value); + + // @@protoc_insertion_point(class_scope:mozilla.devtools.protobuf.Metadata) + private: + inline void set_has_timestamp(); + inline void clear_has_timestamp(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::uint64 timestamp_; + friend void protobuf_AddDesc_CoreDump_2eproto(); + friend void protobuf_AssignDesc_CoreDump_2eproto(); + friend void protobuf_ShutdownFile_CoreDump_2eproto(); + + void InitAsDefaultInstance(); + static Metadata* default_instance_; +}; +// ------------------------------------------------------------------- + +class Node : public ::google::protobuf::Message { + public: + Node(); + virtual ~Node(); + + Node(const Node& from); + + inline Node& operator=(const Node& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Node& default_instance(); + + void Swap(Node* other); + + // implements Message ---------------------------------------------- + + Node* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Node& from); + void MergeFrom(const Node& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint64 id = 1; + inline bool has_id() const; + inline void clear_id(); + static const int kIdFieldNumber = 1; + inline ::google::protobuf::uint64 id() const; + inline void set_id(::google::protobuf::uint64 value); + + // optional bytes typeName = 2; + inline bool has_typename_() const; + inline void clear_typename_(); + static const int kTypeNameFieldNumber = 2; + inline const ::std::string& typename_() const; + inline void set_typename_(const ::std::string& value); + inline void set_typename_(const char* value); + inline void set_typename_(const void* value, size_t size); + inline ::std::string* mutable_typename_(); + inline ::std::string* release_typename_(); + inline void set_allocated_typename_(::std::string* typename_); + + // optional uint64 size = 3; + inline bool has_size() const; + inline void clear_size(); + static const int kSizeFieldNumber = 3; + inline ::google::protobuf::uint64 size() const; + inline void set_size(::google::protobuf::uint64 value); + + // repeated .mozilla.devtools.protobuf.Edge edges = 4; + inline int edges_size() const; + inline void clear_edges(); + static const int kEdgesFieldNumber = 4; + inline const ::mozilla::devtools::protobuf::Edge& edges(int index) const; + inline ::mozilla::devtools::protobuf::Edge* mutable_edges(int index); + inline ::mozilla::devtools::protobuf::Edge* add_edges(); + inline const ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge >& + edges() const; + inline ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge >* + mutable_edges(); + + // @@protoc_insertion_point(class_scope:mozilla.devtools.protobuf.Node) + private: + inline void set_has_id(); + inline void clear_has_id(); + inline void set_has_typename_(); + inline void clear_has_typename_(); + inline void set_has_size(); + inline void clear_has_size(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::uint64 id_; + ::std::string* typename__; + ::google::protobuf::uint64 size_; + ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge > edges_; + friend void protobuf_AddDesc_CoreDump_2eproto(); + friend void protobuf_AssignDesc_CoreDump_2eproto(); + friend void protobuf_ShutdownFile_CoreDump_2eproto(); + + void InitAsDefaultInstance(); + static Node* default_instance_; +}; +// ------------------------------------------------------------------- + +class Edge : public ::google::protobuf::Message { + public: + Edge(); + virtual ~Edge(); + + Edge(const Edge& from); + + inline Edge& operator=(const Edge& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const Edge& default_instance(); + + void Swap(Edge* other); + + // implements Message ---------------------------------------------- + + Edge* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const Edge& from); + void MergeFrom(const Edge& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional uint64 referent = 1; + inline bool has_referent() const; + inline void clear_referent(); + static const int kReferentFieldNumber = 1; + inline ::google::protobuf::uint64 referent() const; + inline void set_referent(::google::protobuf::uint64 value); + + // optional bytes name = 2; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 2; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const void* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + inline void set_allocated_name(::std::string* name); + + // @@protoc_insertion_point(class_scope:mozilla.devtools.protobuf.Edge) + private: + inline void set_has_referent(); + inline void clear_has_referent(); + inline void set_has_name(); + inline void clear_has_name(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::uint32 _has_bits_[1]; + mutable int _cached_size_; + ::google::protobuf::uint64 referent_; + ::std::string* name_; + friend void protobuf_AddDesc_CoreDump_2eproto(); + friend void protobuf_AssignDesc_CoreDump_2eproto(); + friend void protobuf_ShutdownFile_CoreDump_2eproto(); + + void InitAsDefaultInstance(); + static Edge* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// Metadata + +// optional uint64 timeStamp = 1; +inline bool Metadata::has_timestamp() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Metadata::set_has_timestamp() { + _has_bits_[0] |= 0x00000001u; +} +inline void Metadata::clear_has_timestamp() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Metadata::clear_timestamp() { + timestamp_ = GOOGLE_ULONGLONG(0); + clear_has_timestamp(); +} +inline ::google::protobuf::uint64 Metadata::timestamp() const { + // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Metadata.timeStamp) + return timestamp_; +} +inline void Metadata::set_timestamp(::google::protobuf::uint64 value) { + set_has_timestamp(); + timestamp_ = value; + // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Metadata.timeStamp) +} + +// ------------------------------------------------------------------- + +// Node + +// optional uint64 id = 1; +inline bool Node::has_id() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Node::set_has_id() { + _has_bits_[0] |= 0x00000001u; +} +inline void Node::clear_has_id() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Node::clear_id() { + id_ = GOOGLE_ULONGLONG(0); + clear_has_id(); +} +inline ::google::protobuf::uint64 Node::id() const { + // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.id) + return id_; +} +inline void Node::set_id(::google::protobuf::uint64 value) { + set_has_id(); + id_ = value; + // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Node.id) +} + +// optional bytes typeName = 2; +inline bool Node::has_typename_() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Node::set_has_typename_() { + _has_bits_[0] |= 0x00000002u; +} +inline void Node::clear_has_typename_() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Node::clear_typename_() { + if (typename__ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + typename__->clear(); + } + clear_has_typename_(); +} +inline const ::std::string& Node::typename_() const { + // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.typeName) + return *typename__; +} +inline void Node::set_typename_(const ::std::string& value) { + set_has_typename_(); + if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + typename__ = new ::std::string; + } + typename__->assign(value); + // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Node.typeName) +} +inline void Node::set_typename_(const char* value) { + set_has_typename_(); + if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + typename__ = new ::std::string; + } + typename__->assign(value); + // @@protoc_insertion_point(field_set_char:mozilla.devtools.protobuf.Node.typeName) +} +inline void Node::set_typename_(const void* value, size_t size) { + set_has_typename_(); + if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + typename__ = new ::std::string; + } + typename__->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:mozilla.devtools.protobuf.Node.typeName) +} +inline ::std::string* Node::mutable_typename_() { + set_has_typename_(); + if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + typename__ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:mozilla.devtools.protobuf.Node.typeName) + return typename__; +} +inline ::std::string* Node::release_typename_() { + clear_has_typename_(); + if (typename__ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = typename__; + typename__ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void Node::set_allocated_typename_(::std::string* typename_) { + if (typename__ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete typename__; + } + if (typename_) { + set_has_typename_(); + typename__ = typename_; + } else { + clear_has_typename_(); + typename__ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.devtools.protobuf.Node.typeName) +} + +// optional uint64 size = 3; +inline bool Node::has_size() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void Node::set_has_size() { + _has_bits_[0] |= 0x00000004u; +} +inline void Node::clear_has_size() { + _has_bits_[0] &= ~0x00000004u; +} +inline void Node::clear_size() { + size_ = GOOGLE_ULONGLONG(0); + clear_has_size(); +} +inline ::google::protobuf::uint64 Node::size() const { + // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.size) + return size_; +} +inline void Node::set_size(::google::protobuf::uint64 value) { + set_has_size(); + size_ = value; + // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Node.size) +} + +// repeated .mozilla.devtools.protobuf.Edge edges = 4; +inline int Node::edges_size() const { + return edges_.size(); +} +inline void Node::clear_edges() { + edges_.Clear(); +} +inline const ::mozilla::devtools::protobuf::Edge& Node::edges(int index) const { + // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Node.edges) + return edges_.Get(index); +} +inline ::mozilla::devtools::protobuf::Edge* Node::mutable_edges(int index) { + // @@protoc_insertion_point(field_mutable:mozilla.devtools.protobuf.Node.edges) + return edges_.Mutable(index); +} +inline ::mozilla::devtools::protobuf::Edge* Node::add_edges() { + // @@protoc_insertion_point(field_add:mozilla.devtools.protobuf.Node.edges) + return edges_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge >& +Node::edges() const { + // @@protoc_insertion_point(field_list:mozilla.devtools.protobuf.Node.edges) + return edges_; +} +inline ::google::protobuf::RepeatedPtrField< ::mozilla::devtools::protobuf::Edge >* +Node::mutable_edges() { + // @@protoc_insertion_point(field_mutable_list:mozilla.devtools.protobuf.Node.edges) + return &edges_; +} + +// ------------------------------------------------------------------- + +// Edge + +// optional uint64 referent = 1; +inline bool Edge::has_referent() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void Edge::set_has_referent() { + _has_bits_[0] |= 0x00000001u; +} +inline void Edge::clear_has_referent() { + _has_bits_[0] &= ~0x00000001u; +} +inline void Edge::clear_referent() { + referent_ = GOOGLE_ULONGLONG(0); + clear_has_referent(); +} +inline ::google::protobuf::uint64 Edge::referent() const { + // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Edge.referent) + return referent_; +} +inline void Edge::set_referent(::google::protobuf::uint64 value) { + set_has_referent(); + referent_ = value; + // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Edge.referent) +} + +// optional bytes name = 2; +inline bool Edge::has_name() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void Edge::set_has_name() { + _has_bits_[0] |= 0x00000002u; +} +inline void Edge::clear_has_name() { + _has_bits_[0] &= ~0x00000002u; +} +inline void Edge::clear_name() { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& Edge::name() const { + // @@protoc_insertion_point(field_get:mozilla.devtools.protobuf.Edge.name) + return *name_; +} +inline void Edge::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set:mozilla.devtools.protobuf.Edge.name) +} +inline void Edge::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(value); + // @@protoc_insertion_point(field_set_char:mozilla.devtools.protobuf.Edge.name) +} +inline void Edge::set_name(const void* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:mozilla.devtools.protobuf.Edge.name) +} +inline ::std::string* Edge::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + name_ = new ::std::string; + } + // @@protoc_insertion_point(field_mutable:mozilla.devtools.protobuf.Edge.name) + return name_; +} +inline ::std::string* Edge::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + return temp; + } +} +inline void Edge::set_allocated_name(::std::string* name) { + if (name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { + delete name_; + } + if (name) { + set_has_name(); + name_ = name; + } else { + clear_has_name(); + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + } + // @@protoc_insertion_point(field_set_allocated:mozilla.devtools.protobuf.Edge.name) +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace protobuf +} // namespace devtools +} // namespace mozilla + +#ifndef SWIG +namespace google { +namespace protobuf { + + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_CoreDump_2eproto__INCLUDED diff --git a/toolkit/devtools/server/CoreDump.proto b/toolkit/devtools/server/CoreDump.proto new file mode 100644 index 0000000000000..2424cc7248ed8 --- /dev/null +++ b/toolkit/devtools/server/CoreDump.proto @@ -0,0 +1,69 @@ +/* -*- Mode: protobuf; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// # Core Dumps +// +// A core dump is a serialized snapshot of the heap graph. We serialize the heap +// as a series of protobuf messages with each message prefixed by its Varint32 +// byte size so we can delimit individual protobuf messages (protobuf parsers +// cannot determine where a message ends on their own). +// +// The first protobuf message is an instance of the `Metadata` message. All +// subsequent messages will be instances of the `Node` message. The first of +// these `Node` messages is the root node of the serialized heap graph. Here is +// a diagram of our core dump format: +// +// +-----------------------------------------------------------------------+ +// | Varint32: The size of following `Metadata` message. | +// +-----------------------------------------------------------------------+ +// | message: The core dump `Metadata` message. | +// +-----------------------------------------------------------------------+ +// | Varint32: The size of the following `Node` message. | +// +-----------------------------------------------------------------------+ +// | message: The first `Node` message. This is the root node. | +// +-----------------------------------------------------------------------+ +// | Varint32: The size of the following `Node` message. | +// +-----------------------------------------------------------------------+ +// | message: A `Node` message. | +// +-----------------------------------------------------------------------+ +// | Varint32: The size of the following `Node` message. | +// +-----------------------------------------------------------------------+ +// | message: A `Node` message. | +// +-----------------------------------------------------------------------+ +// | . | +// | . | +// | . | +// +-----------------------------------------------------------------------+ +// +// In practice, certain message fields have a lot of duplication (such as type +// or edge name strings). Rather than try and de-duplicate this information at +// the protobuf message and field level, core dumps should be written with +// `google::protobuf::io::GzipOutputStream` and read from +// `google::protobuf::io::GzipInputStream`. + +package mozilla.devtools.protobuf; + +// A collection of metadata about this core dump. +message Metadata { + // Number of microseconds since midnight (00:00:00) 1 January 1970 UTC. + optional uint64 timeStamp = 1; +} + +// A serialized version of `JS::ubi::Node` and its outgoing edges. +message Node { + optional uint64 id = 1; + // char16_t[] + optional bytes typeName = 2; + optional uint64 size = 3; + repeated Edge edges = 4; +} + +// A serialized edge from the heap graph. +message Edge { + optional uint64 referent = 1; + // char16_t[] + optional bytes name = 2; +} \ No newline at end of file diff --git a/toolkit/devtools/server/generate-core-dump-sources.sh b/toolkit/devtools/server/generate-core-dump-sources.sh new file mode 100755 index 0000000000000..05abde2ca8677 --- /dev/null +++ b/toolkit/devtools/server/generate-core-dump-sources.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +# A script to generate toolkit/devtools/server/CoreDump.pb.{h,cc} from +# toolkit/devtools/server/CoreDump.proto. This script assumes you have +# downloaded and installed the protocol buffer compiler, and that it is either +# on your $PATH or located at $PROTOC_PATH. +# +# These files were last compiled with libprotoc 2.4.1. + +set -e + +cd $(dirname $0) + +if [ -n $PROTOC_PATH ]; then + PROTOC_PATH=`which protoc` +fi + +if [ ! -e $PROTOC_PATH ]; then + echo You must install the protocol compiler from + echo https://code.google.com/p/protobuf/downloads/list + exit 1 +fi + +echo Using $PROTOC_PATH as the protocol compiler + +$PROTOC_PATH --cpp_out="." CoreDump.proto diff --git a/toolkit/devtools/server/moz.build b/toolkit/devtools/server/moz.build index 92b18c8672413..5b2063317b621 100644 --- a/toolkit/devtools/server/moz.build +++ b/toolkit/devtools/server/moz.build @@ -15,14 +15,21 @@ XPIDL_SOURCES += [ XPIDL_MODULE = 'jsinspector' EXPORTS.mozilla.devtools += [ + 'ChromeUtils.h', + 'CoreDump.pb.h', 'ZeroCopyNSIOutputStream.h', ] SOURCES += [ + 'ChromeUtils.cpp', + 'CoreDump.pb.cc', 'nsJSInspector.cpp', 'ZeroCopyNSIOutputStream.cpp', ] +# Disable RTTI in google protocol buffer +DEFINES['GOOGLE_PROTOBUF_NO_RTTI'] = True + FINAL_LIBRARY = 'xul' EXTRA_JS_MODULES.devtools += [ From e20ce5640c6fe8dd25327cffdc2afb2ccc6786c2 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:42 -0700 Subject: [PATCH 047/151] Bug 1024774 - Part 4: Add an xpcshell test for saving heap snapshots. r=jimb --- .../devtools/server/tests/unit/head_dbg.js | 12 ++- .../tests/unit/test_SaveHeapSnapshot.js | 98 +++++++++++++++++++ .../devtools/server/tests/unit/xpcshell.ini | 1 + 3 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 toolkit/devtools/server/tests/unit/test_SaveHeapSnapshot.js diff --git a/toolkit/devtools/server/tests/unit/head_dbg.js b/toolkit/devtools/server/tests/unit/head_dbg.js index 7bb0a1bc830a7..c8055b2ffaecd 100644 --- a/toolkit/devtools/server/tests/unit/head_dbg.js +++ b/toolkit/devtools/server/tests/unit/head_dbg.js @@ -6,6 +6,7 @@ const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils; const Cr = Components.results; +const CC = Components.Constructor; const { devtools } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}); const { worker } = Cu.import("resource://gre/modules/devtools/worker-loader.js", {}) @@ -349,7 +350,7 @@ function getFileUrl(aName, aAllowMissing=false) { * Returns the full path of the file with the specified name in a * platform-independent and URL-like form. */ -function getFilePath(aName, aAllowMissing=false) +function getFilePath(aName, aAllowMissing=false, aUsePlatformPathSeparator=false) { let file = do_get_file(aName, aAllowMissing); let path = Services.io.newFileURI(file).spec; @@ -358,7 +359,14 @@ function getFilePath(aName, aAllowMissing=false) file instanceof Ci.nsILocalFileWin) { filePrePath += "/"; } - return path.slice(filePrePath.length); + + path = path.slice(filePrePath.length); + + if (aUsePlatformPathSeparator && path.match(/^\w:/)) { + path = path.replace(/\//g, "\\"); + } + + return path; } Cu.import("resource://gre/modules/NetUtil.jsm"); diff --git a/toolkit/devtools/server/tests/unit/test_SaveHeapSnapshot.js b/toolkit/devtools/server/tests/unit/test_SaveHeapSnapshot.js new file mode 100644 index 0000000000000..ef37383ac3d7d --- /dev/null +++ b/toolkit/devtools/server/tests/unit/test_SaveHeapSnapshot.js @@ -0,0 +1,98 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Test the ChromeUtils interface. + +const { addDebuggerToGlobal } = Cu.import("resource://gre/modules/jsdebugger.jsm", {}); +var Debugger; +addDebuggerToGlobal(this); + +function run_test() { + ok(ChromeUtils, "Should be able to get the ChromeUtils interface"); + + let filePath = getFilePath("core-dump.tmp", true, true); + ok(filePath, "Should get a file path"); + + testBadParameters(filePath); + testGoodParameters(filePath); + + do_test_finished(); +} + +function testBadParameters(filePath) { + throws(() => ChromeUtils.saveHeapSnapshot(), + "Should throw if arguments aren't passed in."); + + throws(() => ChromeUtils.saveHeapSnapshot(Object.create(null), + { runtime: true }), + "Should throw if the filePath is not coercible to string."); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + null), + "Should throw if boundaries isn't an object."); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + {}), + "Should throw if the boundaries object doesn't have any properties."); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + { runtime: true, + globals: [this] }), + "Should throw if the boundaries object has more than one property."); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + { debugger: {} }), + "Should throw if the debuggees object is not a Debugger object"); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + { globals: [{}] }), + "Should throw if the globals array contains non-global objects."); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + { runtime: false }), + "Should throw if runtime is supplied and is not true."); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + { globals: null }), + "Should throw if globals is not an object."); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + { globals: {} }), + "Should throw if globals is not an array."); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + { debugger: Debugger.prototype }), + "Should throw if debugger is the Debugger.prototype object."); + + throws(() => ChromeUtils.saveHeapSnapshot(filePath, + { get globals() { return [this]; } }), + "Should throw if boundaries property is a getter."); +} + +const makeNewSandbox = () => + Cu.Sandbox(CC('@mozilla.org/systemprincipal;1', 'nsIPrincipal')()); + +function testGoodParameters(filePath) { + let sandbox = makeNewSandbox(); + let dbg = new Debugger(sandbox); + + ChromeUtils.saveHeapSnapshot(filePath, { debugger: dbg }); + ok(true, "Should be able to save a snapshot for a debuggee global."); + + dbg = new Debugger; + let sandboxes = Array(10).fill(null).map(makeNewSandbox); + sandboxes.forEach(sb => dbg.addDebuggee(sb)); + + ChromeUtils.saveHeapSnapshot(filePath, { debugger: dbg }); + ok(true, "Should be able to save a snapshot for many debuggee globals."); + + dbg = new Debugger; + ChromeUtils.saveHeapSnapshot(filePath, { debugger: dbg }); + ok(true, "Should be able to save a snapshot with no debuggee globals."); + + ChromeUtils.saveHeapSnapshot(filePath, { globals: [this] }); + ok(true, "Should be able to save a snapshot for a specific global."); + + ChromeUtils.saveHeapSnapshot(filePath, { runtime: true }); + ok(true, "Should be able to save a snapshot of the full runtime."); +} diff --git a/toolkit/devtools/server/tests/unit/xpcshell.ini b/toolkit/devtools/server/tests/unit/xpcshell.ini index 9ed7cf1859a13..b3aaac5ca82f5 100644 --- a/toolkit/devtools/server/tests/unit/xpcshell.ini +++ b/toolkit/devtools/server/tests/unit/xpcshell.ini @@ -40,6 +40,7 @@ support-files = [test_forwardingprefix.js] [test_getyoungestframe.js] [test_nsjsinspector.js] +[test_SaveHeapSnapshot.js] [test_dbgactor.js] [test_dbgglobal.js] [test_dbgclient_debuggerstatement.js] From dc503d95e15d6d6a20a5446be95a23f8e411ccbe Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:42 -0700 Subject: [PATCH 048/151] Bug 1024774 - Part 5: Add GTests for core dump serialization. r=jimb --- toolkit/devtools/server/moz.build | 3 + .../devtools/server/tests/gtest/DevTools.h | 289 ++++++++++++++++++ .../tests/gtest/DoesCrossZoneBoundaries.cpp | 70 +++++ .../tests/gtest/DoesntCrossZoneBoundaries.cpp | 62 ++++ .../tests/gtest/SerializesEdgeNames.cpp | 53 ++++ .../SerializesEverythingInHeapGraphOnce.cpp | 37 +++ .../tests/gtest/SerializesTypeNames.cpp | 30 ++ toolkit/devtools/server/tests/gtest/moz.build | 21 ++ 8 files changed, 565 insertions(+) create mode 100644 toolkit/devtools/server/tests/gtest/DevTools.h create mode 100644 toolkit/devtools/server/tests/gtest/DoesCrossZoneBoundaries.cpp create mode 100644 toolkit/devtools/server/tests/gtest/DoesntCrossZoneBoundaries.cpp create mode 100644 toolkit/devtools/server/tests/gtest/SerializesEdgeNames.cpp create mode 100644 toolkit/devtools/server/tests/gtest/SerializesEverythingInHeapGraphOnce.cpp create mode 100644 toolkit/devtools/server/tests/gtest/SerializesTypeNames.cpp create mode 100644 toolkit/devtools/server/tests/gtest/moz.build diff --git a/toolkit/devtools/server/moz.build b/toolkit/devtools/server/moz.build index 5b2063317b621..59fcb17234cb1 100644 --- a/toolkit/devtools/server/moz.build +++ b/toolkit/devtools/server/moz.build @@ -8,6 +8,9 @@ BROWSER_CHROME_MANIFESTS += ['tests/browser/browser.ini'] MOCHITEST_CHROME_MANIFESTS += ['tests/mochitest/chrome.ini'] XPCSHELL_TESTS_MANIFESTS += ['tests/unit/xpcshell.ini'] +if CONFIG['ENABLE_TESTS']: + DIRS += ['tests/gtest'] + XPIDL_SOURCES += [ 'nsIJSInspector.idl', ] diff --git a/toolkit/devtools/server/tests/gtest/DevTools.h b/toolkit/devtools/server/tests/gtest/DevTools.h new file mode 100644 index 0000000000000..35d38911a68b0 --- /dev/null +++ b/toolkit/devtools/server/tests/gtest/DevTools.h @@ -0,0 +1,289 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_devtools_gtest_DevTools__ +#define mozilla_devtools_gtest_DevTools__ + +#include "CoreDump.pb.h" +#include "jsapi.h" +#include "jspubtd.h" +#include "nsCRTGlue.h" + +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include "mozilla/devtools/ChromeUtils.h" +#include "mozilla/CycleCollectedJSRuntime.h" +#include "mozilla/Move.h" +#include "mozilla/UniquePtr.h" +#include "js/UbiNode.h" + +using namespace mozilla; +using namespace mozilla::devtools; +using namespace testing; + +// GTest fixture class that all of our tests derive from. +struct DevTools : public ::testing::Test { + bool _initialized; + JSRuntime *rt; + JSContext *cx; + JSCompartment *compartment; + JS::Zone *zone; + JS::PersistentRootedObject global; + + DevTools() + : _initialized(false), + rt(nullptr), + cx(nullptr) + { } + + virtual void SetUp() { + MOZ_ASSERT(!_initialized); + + rt = getRuntime(); + if (!rt) + return; + + cx = createContext(); + if (!cx) + return; + JS_BeginRequest(cx); + + global.init(rt, createGlobal()); + if (!global) + return; + JS_EnterCompartment(cx, global); + + compartment = js::GetContextCompartment(cx); + zone = js::GetContextZone(cx); + + _initialized = true; + } + + JSRuntime* getRuntime() { + return CycleCollectedJSRuntime::Get()->Runtime(); + } + + static void setNativeStackQuota(JSRuntime *rt) + { + const size_t MAX_STACK_SIZE = + /* Assume we can't use more than 5e5 bytes of C stack by default. */ +#if (defined(DEBUG) && defined(__SUNPRO_CC)) || defined(JS_CPU_SPARC) + /* + * Sun compiler uses a larger stack space for js::Interpret() with + * debug. Use a bigger gMaxStackSize to make "make check" happy. + */ + 5000000 +#else + 500000 +#endif + ; + + JS_SetNativeStackQuota(rt, MAX_STACK_SIZE); + } + + static void reportError(JSContext *cx, const char *message, JSErrorReport *report) { + fprintf(stderr, "%s:%u:%s\n", + report->filename ? report->filename : "", + (unsigned int) report->lineno, + message); + } + + JSContext *createContext() { + return JS_NewContext(rt, 8192); + } + + static const JSClass *getGlobalClass() { + static const JSClass globalClass = { + "global", JSCLASS_GLOBAL_FLAGS, + nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, + JS_GlobalObjectTraceHook + }; + return &globalClass; + } + + JSObject *createGlobal() + { + /* Create the global object. */ + JS::RootedObject newGlobal(cx); + JS::CompartmentOptions options; + options.setVersion(JSVERSION_LATEST); + newGlobal = JS_NewGlobalObject(cx, getGlobalClass(), nullptr, + JS::FireOnNewGlobalHook, options); + if (!newGlobal) + return nullptr; + + JSAutoCompartment ac(cx, newGlobal); + + /* Populate the global object with the standard globals, like Object and + Array. */ + if (!JS_InitStandardClasses(cx, newGlobal)) + return nullptr; + + return newGlobal; + } + + virtual void TearDown() { + _initialized = false; + + if (global) { + JS_LeaveCompartment(cx, nullptr); + global = nullptr; + } + if (cx) { + JS_EndRequest(cx); + JS_DestroyContext(cx); + cx = nullptr; + } + } +}; + + +// Helper to define a test and ensure that the fixture is initialized properly. +#define DEF_TEST(name, body) \ + TEST_F(DevTools, name) { \ + ASSERT_TRUE(_initialized); \ + body \ + } + + +// Fake JS::ubi::Node implementation + +class MOZ_STACK_CLASS FakeNode +{ +public: + JS::ubi::SimpleEdgeVector edges; + JSCompartment* compartment; + JS::Zone* zone; + size_t size; + + explicit FakeNode(JSContext* cx) + : edges(cx), + compartment(nullptr), + zone(nullptr), + size(1) + { } +}; + +namespace JS { +namespace ubi { + +using mozilla::UniquePtr; + +template<> +class Concrete : public Base +{ + const char16_t* typeName() const override { + return concreteTypeName; + } + + UniquePtr edges(JSContext* cx, bool wantNames) const override { + return UniquePtr(js_new(cx, get().edges)); + } + + size_t size(mozilla::MallocSizeOf) const override { + return get().size; + } + + JS::Zone* zone() const override { + return get().zone; + } + + JSCompartment* compartment() const override { + return get().compartment; + } + +protected: + explicit Concrete(FakeNode* ptr) : Base(ptr) { } + FakeNode& get() const { return *static_cast(ptr); } + +public: + static const char16_t concreteTypeName[]; + static void construct(void* storage, FakeNode* ptr) { + new (storage) Concrete(ptr); + } +}; + +const char16_t Concrete::concreteTypeName[] = MOZ_UTF16("FakeNode"); + +} // namespace ubi +} // namespace JS + +void AddEdge(FakeNode &node, FakeNode &referent, const char16_t *edgeName = nullptr) { + char16_t *ownedEdgeName = nullptr; + if (edgeName) { + ownedEdgeName = NS_strdup(edgeName); + ASSERT_NE(ownedEdgeName, nullptr); + } + + JS::ubi::SimpleEdge edge(ownedEdgeName, &referent); + ASSERT_TRUE(node.edges.append(mozilla::Move(edge))); +} + + +// Custom GMock Matchers + +// Use the testing namespace to avoid static analysis failures in the gmock +// matcher classes that get generated from MATCHER_P macros. +namespace testing { + +// Ensure that given node has the expected number of edges. +MATCHER_P2(EdgesLength, cx, expectedLength, "") { + auto edges = arg.edges(cx); + if (!edges) + return false; + + int actualLength = 0; + for ( ; !edges->empty(); edges->popFront()) + actualLength++; + + return Matcher(Eq(expectedLength)) + .MatchAndExplain(actualLength, result_listener); +} + +// Get the nth edge and match it with the given matcher. +MATCHER_P3(Edge, cx, n, matcher, "") { + auto edges = arg.edges(cx); + if (!edges) + return false; + + int i = 0; + for ( ; !edges->empty(); edges->popFront()) { + if (i == n) { + return Matcher(matcher) + .MatchAndExplain(edges->front(), result_listener); + } + + i++; + } + + return false; +} + +// Ensures that two char16_t* strings are equal. +MATCHER_P(UTF16StrEq, str, "") { + return NS_strcmp(arg, str) == 0; +} + +} // namespace testing + + +// A mock `Writer` class to be used with testing `WriteHeapGraph`. +class MockWriter : public CoreDumpWriter +{ +public: + virtual ~MockWriter() override { } + MOCK_METHOD2(writeNode, bool(const JS::ubi::Node &, CoreDumpWriter::EdgePolicy)); + MOCK_METHOD1(writeMetadata, bool(uint64_t)); +}; + +void ExpectWriteNode(MockWriter &writer, FakeNode &node) { + EXPECT_CALL(writer, writeNode(Eq(JS::ubi::Node(&node)), _)) + .Times(1) + .WillOnce(Return(true)); +} + +#endif // mozilla_devtools_gtest_DevTools__ diff --git a/toolkit/devtools/server/tests/gtest/DoesCrossZoneBoundaries.cpp b/toolkit/devtools/server/tests/gtest/DoesCrossZoneBoundaries.cpp new file mode 100644 index 0000000000000..9bc92fa334859 --- /dev/null +++ b/toolkit/devtools/server/tests/gtest/DoesCrossZoneBoundaries.cpp @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Test that heap snapshots cross zone boundaries when expected. + +#include "DevTools.h" + +DEF_TEST(DoesCrossZoneBoundaries, { + // Create a new global to get a new zone. + JS::RootedObject newGlobal(cx, JS_NewGlobalObject(cx, + getGlobalClass(), + nullptr, + JS::FireOnNewGlobalHook)); + ASSERT_TRUE(newGlobal); + JS::Zone *newZone = nullptr; + { + JSAutoCompartment ac(cx, newGlobal); + ASSERT_TRUE(JS_InitStandardClasses(cx, newGlobal)); + newZone = js::GetContextZone(cx); + } + ASSERT_TRUE(newZone); + ASSERT_NE(newZone, zone); + + // Our set of target zones is both the old and new zones. + JS::ZoneSet targetZones; + ASSERT_TRUE(targetZones.init()); + ASSERT_TRUE(targetZones.put(zone)); + ASSERT_TRUE(targetZones.put(newZone)); + + FakeNode nodeA(cx); + FakeNode nodeB(cx); + FakeNode nodeC(cx); + FakeNode nodeD(cx); + + nodeA.zone = zone; + nodeB.zone = nullptr; + nodeC.zone = newZone; + nodeD.zone = nullptr; + + AddEdge(nodeA, nodeB); + AddEdge(nodeA, nodeC); + AddEdge(nodeB, nodeD); + + ::testing::NiceMock writer; + + // Should serialize nodeA, because it is in one of our target zones. + ExpectWriteNode(writer, nodeA); + + // Should serialize nodeB, because it doesn't belong to a zone and is + // therefore assumed to be shared. + ExpectWriteNode(writer, nodeB); + + // Should also serialize nodeC, which is in our target zones, but a + // different zone than A. + ExpectWriteNode(writer, nodeC); + + // However, should not serialize nodeD because nodeB doesn't belong to one + // of our target zones and so its edges are excluded from serialization. + + JS::AutoCheckCannotGC noGC(rt); + + ASSERT_TRUE(WriteHeapGraph(cx, + JS::ubi::Node(&nodeA), + writer, + /* wantNames = */ false, + &targetZones, + noGC)); + }); diff --git a/toolkit/devtools/server/tests/gtest/DoesntCrossZoneBoundaries.cpp b/toolkit/devtools/server/tests/gtest/DoesntCrossZoneBoundaries.cpp new file mode 100644 index 0000000000000..cbfa9999e5f57 --- /dev/null +++ b/toolkit/devtools/server/tests/gtest/DoesntCrossZoneBoundaries.cpp @@ -0,0 +1,62 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Test that heap snapshots walk the zone boundaries correctly. + +#include "DevTools.h" + +DEF_TEST(DoesntCrossZoneBoundaries, { + // Create a new global to get a new zone. + JS::RootedObject newGlobal(cx, JS_NewGlobalObject(cx, + getGlobalClass(), + nullptr, + JS::FireOnNewGlobalHook)); + ASSERT_TRUE(newGlobal); + JS::Zone *newZone = nullptr; + { + JSAutoCompartment ac(cx, newGlobal); + ASSERT_TRUE(JS_InitStandardClasses(cx, newGlobal)); + newZone = js::GetContextZone(cx); + } + ASSERT_TRUE(newZone); + ASSERT_NE(newZone, zone); + + // Our set of target zones is only the pre-existing zone and does not + // include the new zone. + JS::ZoneSet targetZones; + ASSERT_TRUE(targetZones.init()); + ASSERT_TRUE(targetZones.put(zone)); + + FakeNode nodeA(cx); + FakeNode nodeB(cx); + FakeNode nodeC(cx); + + nodeA.zone = zone; + nodeB.zone = nullptr; + nodeC.zone = newZone; + + AddEdge(nodeA, nodeB); + AddEdge(nodeB, nodeC); + + ::testing::NiceMock writer; + + // Should serialize nodeA, because it is in our target zones. + ExpectWriteNode(writer, nodeA); + + // Should serialize nodeB, because it doesn't belong to a zone and is + // therefore assumed to be shared. + ExpectWriteNode(writer, nodeB); + + // But we shouldn't ever serialize nodeC. + + JS::AutoCheckCannotGC noGC(rt); + + ASSERT_TRUE(WriteHeapGraph(cx, + JS::ubi::Node(&nodeA), + writer, + /* wantNames = */ false, + &targetZones, + noGC)); + }); diff --git a/toolkit/devtools/server/tests/gtest/SerializesEdgeNames.cpp b/toolkit/devtools/server/tests/gtest/SerializesEdgeNames.cpp new file mode 100644 index 0000000000000..1af78b81eb846 --- /dev/null +++ b/toolkit/devtools/server/tests/gtest/SerializesEdgeNames.cpp @@ -0,0 +1,53 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Test that edge names get serialized correctly. + +#include "DevTools.h" + +using testing::Field; +using testing::IsNull; +using testing::Property; +using testing::Return; + +DEF_TEST(SerializesEdgeNames, { + FakeNode node(cx); + FakeNode referent(cx); + + const char16_t edgeName[] = MOZ_UTF16("edge name"); + const char16_t emptyStr[] = MOZ_UTF16(""); + + AddEdge(node, referent, edgeName); + AddEdge(node, referent, emptyStr); + AddEdge(node, referent, nullptr); + + ::testing::NiceMock writer; + + // Should get the node with edges once. + EXPECT_CALL( + writer, + writeNode(AllOf(EdgesLength(cx, 3), + Edge(cx, 0, Field(&JS::ubi::Edge::name, + UTF16StrEq(edgeName))), + Edge(cx, 1, Field(&JS::ubi::Edge::name, + UTF16StrEq(emptyStr))), + Edge(cx, 2, Field(&JS::ubi::Edge::name, + IsNull()))), + _) + ) + .Times(1) + .WillOnce(Return(true)); + + // Should get the referent node that doesn't have any edges once. + ExpectWriteNode(writer, referent); + + JS::AutoCheckCannotGC noGC(rt); + ASSERT_TRUE(WriteHeapGraph(cx, + JS::ubi::Node(&node), + writer, + /* wantNames = */ true, + /* zones = */ nullptr, + noGC)); + }); diff --git a/toolkit/devtools/server/tests/gtest/SerializesEverythingInHeapGraphOnce.cpp b/toolkit/devtools/server/tests/gtest/SerializesEverythingInHeapGraphOnce.cpp new file mode 100644 index 0000000000000..f35f199c44d50 --- /dev/null +++ b/toolkit/devtools/server/tests/gtest/SerializesEverythingInHeapGraphOnce.cpp @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Test that everything in the heap graph gets serialized once, and only once. + +#include "DevTools.h" + +DEF_TEST(SerializesEverythingInHeapGraphOnce, { + FakeNode nodeA(cx); + FakeNode nodeB(cx); + FakeNode nodeC(cx); + FakeNode nodeD(cx); + + AddEdge(nodeA, nodeB); + AddEdge(nodeB, nodeC); + AddEdge(nodeC, nodeD); + AddEdge(nodeD, nodeA); + + ::testing::NiceMock writer; + + // Should serialize each node once. + ExpectWriteNode(writer, nodeA); + ExpectWriteNode(writer, nodeB); + ExpectWriteNode(writer, nodeC); + ExpectWriteNode(writer, nodeD); + + JS::AutoCheckCannotGC noGC(rt); + + ASSERT_TRUE(WriteHeapGraph(cx, + JS::ubi::Node(&nodeA), + writer, + /* wantNames = */ false, + /* zones = */ nullptr, + noGC)); + }); diff --git a/toolkit/devtools/server/tests/gtest/SerializesTypeNames.cpp b/toolkit/devtools/server/tests/gtest/SerializesTypeNames.cpp new file mode 100644 index 0000000000000..250ffb5276140 --- /dev/null +++ b/toolkit/devtools/server/tests/gtest/SerializesTypeNames.cpp @@ -0,0 +1,30 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Test that a ubi::Node's typeName gets properly serialized into a core dump. + +#include "DevTools.h" + +using testing::Property; +using testing::Return; + +DEF_TEST(SerializesTypeNames, { + FakeNode node(cx); + + ::testing::NiceMock writer; + EXPECT_CALL(writer, writeNode(Property(&JS::ubi::Node::typeName, + UTF16StrEq(MOZ_UTF16("FakeNode"))), + _)) + .Times(1) + .WillOnce(Return(true)); + + JS::AutoCheckCannotGC noGC(rt); + ASSERT_TRUE(WriteHeapGraph(cx, + JS::ubi::Node(&node), + writer, + /* wantNames = */ true, + /* zones = */ nullptr, + noGC)); + }); diff --git a/toolkit/devtools/server/tests/gtest/moz.build b/toolkit/devtools/server/tests/gtest/moz.build new file mode 100644 index 0000000000000..83005c0950aa3 --- /dev/null +++ b/toolkit/devtools/server/tests/gtest/moz.build @@ -0,0 +1,21 @@ +# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, you can obtain one at http://mozilla.org/MPL/2.0/. + +Library('devtoolstests') + +LOCAL_INCLUDES += [ + '/toolkit/devtools/server', +] + +UNIFIED_SOURCES = [ + 'DoesCrossZoneBoundaries.cpp', + 'DoesntCrossZoneBoundaries.cpp', + 'SerializesEdgeNames.cpp', + 'SerializesEverythingInHeapGraphOnce.cpp', + 'SerializesTypeNames.cpp', +] + +FINAL_LIBRARY = 'xul-gtest' From e355bde6851de902a46536456fa7d250e4911c7e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:42 -0700 Subject: [PATCH 049/151] Bug 1024774 - Part 6: Add a mochitest-chrome sanity check test. r=bholley --- .../server/tests/mochitest/chrome.ini | 1 + .../mochitest/test_SaveHeapSnapshot.html | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 toolkit/devtools/server/tests/mochitest/test_SaveHeapSnapshot.html diff --git a/toolkit/devtools/server/tests/mochitest/chrome.ini b/toolkit/devtools/server/tests/mochitest/chrome.ini index a84ff603a29dd..e33c9c9b3b16b 100644 --- a/toolkit/devtools/server/tests/mochitest/chrome.ini +++ b/toolkit/devtools/server/tests/mochitest/chrome.ini @@ -83,6 +83,7 @@ skip-if = buildapp == 'mulet' [test_memory_gc_events.html] [test_preference.html] [test_registerActor.html] +[test_SaveHeapSnapshot.html] [test_settings.html] [test_styles-applied.html] [test_styles-computed.html] diff --git a/toolkit/devtools/server/tests/mochitest/test_SaveHeapSnapshot.html b/toolkit/devtools/server/tests/mochitest/test_SaveHeapSnapshot.html new file mode 100644 index 0000000000000..2b94851faecde --- /dev/null +++ b/toolkit/devtools/server/tests/mochitest/test_SaveHeapSnapshot.html @@ -0,0 +1,31 @@ + + + + + + ChromeUtils.saveHeapSnapshot test + + + + +
+
+
+ + From 3641c12115cf63d6b3941d473b1bc3534463989e Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:42 -0700 Subject: [PATCH 050/151] Bug 1024774 - Part 7: Add HeapSnapshot WebIDL interface; r=bholley --- dom/bindings/Bindings.conf | 6 +++++- dom/webidl/ChromeUtils.webidl | 8 ++++++++ dom/webidl/HeapSnapshot.webidl | 12 ++++++++++++ dom/webidl/moz.build | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 dom/webidl/HeapSnapshot.webidl diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index 3b75056251303..e29deacf0e2c4 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -271,7 +271,7 @@ DOMInterfaces = { # collection of static methods, so we have this `concrete: False` hack. 'concrete': False, 'nativeType': 'mozilla::devtools::ChromeUtils', - 'implicitJSContext': ['saveHeapSnapshot'] + 'implicitJSContext': ['readHeapSnapshot', 'saveHeapSnapshot'] }, 'ChromeWindow': { @@ -509,6 +509,10 @@ DOMInterfaces = { 'headerFile': 'nsGeolocation.h' }, +'HeapSnapshot': { + 'nativeType': 'mozilla::devtools::HeapSnapshot' +}, + 'History': { 'headerFile': 'nsHistory.h', 'nativeType': 'nsHistory' diff --git a/dom/webidl/ChromeUtils.webidl b/dom/webidl/ChromeUtils.webidl index 43ab2b7dd9f44..db373fea98ae6 100644 --- a/dom/webidl/ChromeUtils.webidl +++ b/dom/webidl/ChromeUtils.webidl @@ -20,6 +20,14 @@ interface ChromeUtils { [Throws] static void saveHeapSnapshot(DOMString filePath, optional HeapSnapshotBoundaries boundaries); + + /** + * Deserialize a core dump into a HeapSnapshot. + * + * @param filePath The file path to read the core dump from. + */ + [Throws, NewObject] + static HeapSnapshot readHeapSnapshot(DOMString filePath); }; /** diff --git a/dom/webidl/HeapSnapshot.webidl b/dom/webidl/HeapSnapshot.webidl new file mode 100644 index 0000000000000..4b4068318c9f7 --- /dev/null +++ b/dom/webidl/HeapSnapshot.webidl @@ -0,0 +1,12 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/** + * A HeapSnapshot represents a snapshot of the heap graph + */ +[ChromeOnly, Exposed=(Window,System)] +interface HeapSnapshot { +}; diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build index 25e64bb765e0d..2472a43c34189 100644 --- a/dom/webidl/moz.build +++ b/dom/webidl/moz.build @@ -162,6 +162,7 @@ WEBIDL_FILES = [ 'GetUserMediaRequest.webidl', 'HDMIInputPort.webidl', 'Headers.webidl', + 'HeapSnapshot.webidl', 'History.webidl', 'HTMLAllCollection.webidl', 'HTMLAnchorElement.webidl', From 94d5c16a2e146befb9dc5fe617349a6e86e8e2e4 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:43 -0700 Subject: [PATCH 051/151] Bug 1024774 - Part 8: Add JS::ubi::Node::isLive; r=jimb --- js/public/UbiNode.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/js/public/UbiNode.h b/js/public/UbiNode.h index 775558a5c0f64..b45294d0a952a 100644 --- a/js/public/UbiNode.h +++ b/js/public/UbiNode.h @@ -187,6 +187,11 @@ class Base { } bool operator!=(const Base& rhs) const { return !(*this == rhs); } + // Returns true if this node is pointing to something on the live heap, as + // opposed to something from a deserialized core dump. Returns false, + // otherwise. + virtual bool isLive() const { return true; }; + // Return a human-readable name for the referent's type. The result should // be statically allocated. (You can use MOZ_UTF16("strings") for this.) // @@ -337,6 +342,8 @@ class Node { return base()->ptr != nullptr; } + bool isLive() const { return base()->isLive(); } + template bool is() const { return base()->typeName() == Concrete::concreteTypeName; @@ -344,12 +351,14 @@ class Node { template T* as() const { + MOZ_ASSERT(isLive()); MOZ_ASSERT(is()); return static_cast(base()->ptr); } template T* asOrNull() const { + MOZ_ASSERT(isLive()); return is() ? static_cast(base()->ptr) : nullptr; } From 1bd1513bea969b9c9dff93cd99ea43813721e9cb Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:43 -0700 Subject: [PATCH 052/151] Bug 1024774 - Part 9: Deserialize heap snapshots; r=jimb --- toolkit/devtools/server/ChromeUtils.cpp | 52 ++++- toolkit/devtools/server/ChromeUtils.h | 9 + toolkit/devtools/server/DeserializedNode.cpp | 109 +++++++++++ toolkit/devtools/server/DeserializedNode.h | 91 +++++++++ toolkit/devtools/server/HeapSnapshot.cpp | 194 +++++++++++++++++++ toolkit/devtools/server/HeapSnapshot.h | 133 +++++++++++++ toolkit/devtools/server/moz.build | 4 + xpcom/glue/nsCRTGlue.cpp | 18 ++ xpcom/glue/nsCRTGlue.h | 5 + 9 files changed, 612 insertions(+), 3 deletions(-) create mode 100644 toolkit/devtools/server/DeserializedNode.cpp create mode 100644 toolkit/devtools/server/DeserializedNode.h create mode 100644 toolkit/devtools/server/HeapSnapshot.cpp create mode 100644 toolkit/devtools/server/HeapSnapshot.h diff --git a/toolkit/devtools/server/ChromeUtils.cpp b/toolkit/devtools/server/ChromeUtils.cpp index 7d13abd015ae4..db291198f61e5 100644 --- a/toolkit/devtools/server/ChromeUtils.cpp +++ b/toolkit/devtools/server/ChromeUtils.cpp @@ -21,6 +21,7 @@ #include "prtypes.h" #include "js/Debug.h" +#include "js/TypeDecls.h" #include "js/UbiNodeTraverse.h" namespace mozilla { @@ -170,8 +171,8 @@ EstablishBoundaries(JSContext *cx, } -// A `CoreDumpWriter` that serializes nodes to protobufs and writes them to -// the given `CodedOutputStream`. +// A `CoreDumpWriter` that serializes nodes to protobufs and writes them to the +// given `ZeroCopyOutputStream`. class MOZ_STACK_CLASS StreamWriter : public CoreDumpWriter { JSContext *cx; @@ -382,5 +383,50 @@ ChromeUtils::SaveHeapSnapshot(GlobalObject &global, } } +/* static */ already_AddRefed +ChromeUtils::ReadHeapSnapshot(GlobalObject &global, + JSContext *cx, + const nsAString &filePath, + ErrorResult &rv) +{ + UniquePtr path(ToNewCString(filePath)); + if (!path) { + rv.Throw(NS_ERROR_OUT_OF_MEMORY); + return nullptr; + } + + PRFileInfo fileInfo; + if (PR_GetFileInfo(path.get(), &fileInfo) != PR_SUCCESS) { + rv.Throw(NS_ERROR_FILE_NOT_FOUND); + return nullptr; + } + + uint32_t size = fileInfo.size; + ScopedFreePtr buffer(static_cast(malloc(size))); + if (!buffer) { + rv.Throw(NS_ERROR_OUT_OF_MEMORY); + return nullptr; + } + + PRFileDesc *fd = PR_Open(path.get(), PR_RDONLY, 0); + if (!fd) { + rv.Throw(NS_ERROR_UNEXPECTED); + return nullptr; + } + + uint32_t bytesRead = 0; + while (bytesRead < size) { + uint32_t bytesLeft = size - bytesRead; + int32_t bytesReadThisTime = PR_Read(fd, buffer.get() + bytesRead, bytesLeft); + if (bytesReadThisTime < 1) { + rv.Throw(NS_ERROR_UNEXPECTED); + return nullptr; + } + bytesRead += bytesReadThisTime; + } + + return HeapSnapshot::Create(cx, global, buffer.get(), size, rv); } -} + +} // namespace devtools +} // namespace mozilla diff --git a/toolkit/devtools/server/ChromeUtils.h b/toolkit/devtools/server/ChromeUtils.h index 211e755872f41..efbed444c3f3f 100644 --- a/toolkit/devtools/server/ChromeUtils.h +++ b/toolkit/devtools/server/ChromeUtils.h @@ -12,6 +12,7 @@ #include "js/UbiNode.h" #include "js/UbiNodeTraverse.h" +#include "mozilla/AlreadyAddRefed.h" #include "mozilla/ErrorResult.h" #include "mozilla/dom/BindingDeclarations.h" #include "mozilla/dom/ChromeUtilsBinding.h" @@ -56,6 +57,9 @@ WriteHeapGraph(JSContext *cx, JS::AutoCheckCannotGC &noGC); +class HeapSnapshot; + + class ChromeUtils { public: @@ -64,6 +68,11 @@ class ChromeUtils const nsAString &filePath, const dom::HeapSnapshotBoundaries &boundaries, ErrorResult &rv); + + static already_AddRefed ReadHeapSnapshot(dom::GlobalObject &global, + JSContext *cx, + const nsAString &filePath, + ErrorResult &rv); }; } // namespace devtools diff --git a/toolkit/devtools/server/DeserializedNode.cpp b/toolkit/devtools/server/DeserializedNode.cpp new file mode 100644 index 0000000000000..db1515f414d89 --- /dev/null +++ b/toolkit/devtools/server/DeserializedNode.cpp @@ -0,0 +1,109 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/devtools/DeserializedNode.h" + +namespace mozilla { +namespace devtools { + +DeserializedEdge::DeserializedEdge() + : referent(0) + , name(nullptr) +{ } + +DeserializedEdge::DeserializedEdge(DeserializedEdge &&rhs) +{ + referent = rhs.referent; + name = rhs.name; +} + +DeserializedEdge &DeserializedEdge::operator=(DeserializedEdge &&rhs) +{ + MOZ_ASSERT(&rhs != this); + this->~DeserializedEdge(); + new(this) DeserializedEdge(Move(rhs)); + return *this; +} + +bool +DeserializedEdge::init(const protobuf::Edge &edge, HeapSnapshot &owner) +{ + // Although the referent property is optional in the protobuf format for + // future compatibility, we can't semantically have an edge to nowhere and + // require a referent here. + if (!edge.has_referent()) + return false; + referent = edge.referent(); + + if (edge.has_name()) { + const char16_t* duplicateEdgeName = reinterpret_cast(edge.name().c_str()); + name = owner.borrowUniqueString(duplicateEdgeName, edge.name().length() / sizeof(char16_t)); + if (!name) + return false; + } + + return true; +} + +/* static */ UniquePtr +DeserializedNode::Create(const protobuf::Node &node, HeapSnapshot &owner) +{ + if (!node.has_id()) + return nullptr; + NodeId id = node.id(); + + if (!node.has_typename_()) + return nullptr; + + const char16_t* duplicatedTypeName = reinterpret_cast(node.typename_().c_str()); + const char16_t* uniqueTypeName = owner.borrowUniqueString(duplicatedTypeName, + node.typename_().length() / sizeof(char16_t)); + if (!uniqueTypeName) + return nullptr; + + auto edgesLength = node.edges_size(); + EdgeVector edges; + if (!edges.reserve(edgesLength)) + return nullptr; + for (decltype(edgesLength) i = 0; i < edgesLength; i++) { + DeserializedEdge edge; + if (!edge.init(node.edges(i), owner)) + return nullptr; + edges.infallibleAppend(Move(edge)); + } + + if (!node.has_size()) + return nullptr; + uint64_t size = node.size(); + + return MakeUnique(id, + uniqueTypeName, + size, + Move(edges), + owner); +} + +DeserializedNode::DeserializedNode(NodeId id, + const char16_t *typeName, + uint64_t size, + EdgeVector &&edges, + HeapSnapshot &owner) + : id(id) + , typeName(typeName) + , size(size) + , edges(Move(edges)) + , owner(&owner) +{ } + +DeserializedNode & +DeserializedNode::getEdgeReferent(const DeserializedEdge &edge) +{ + auto ptr = owner->nodes.lookup(edge.referent); + MOZ_ASSERT(ptr); + return *ptr->value(); +} + +} // namespace devtools +} // namespace mozilla diff --git a/toolkit/devtools/server/DeserializedNode.h b/toolkit/devtools/server/DeserializedNode.h new file mode 100644 index 0000000000000..b1b3218e86048 --- /dev/null +++ b/toolkit/devtools/server/DeserializedNode.h @@ -0,0 +1,91 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_devtools_DeserializedNode__ +#define mozilla_devtools_DeserializedNode__ + +#include "mozilla/devtools/CoreDump.pb.h" +#include "mozilla/MaybeOneOf.h" +#include "mozilla/Move.h" +#include "mozilla/UniquePtr.h" +#include "mozilla/Vector.h" + +// `Deserialized{Node,Edge}` translate protobuf messages from our core dump +// format into structures we can rely upon for implementing `JS::ubi::Node` +// specializations on top of. All of the properties of the protobuf messages are +// optional for future compatibility, and this is the layer where we validate +// that the properties that do actually exist in any given message fulfill our +// semantic requirements. +// +// Both `DeserializedNode` and `DeserializedEdge` are always owned by a +// `HeapSnapshot` instance, and their lifetimes must not extend after that of +// their owning `HeapSnapshot`. + +namespace mozilla { +namespace devtools { + +class HeapSnapshot; + +using NodeId = uint64_t; + +// A `DeserializedEdge` represents an edge in the heap graph pointing to the +// node with id equal to `DeserializedEdge::referent` that we deserialized from +// a core dump. +struct DeserializedEdge { + NodeId referent; + // A borrowed reference to a string owned by this node's owning HeapSnapshot. + const char16_t *name; + + explicit DeserializedEdge(); + DeserializedEdge(DeserializedEdge &&rhs); + DeserializedEdge &operator=(DeserializedEdge &&rhs); + + // Initialize this `DeserializedEdge` from the given `protobuf::Edge` message. + bool init(const protobuf::Edge &edge, HeapSnapshot &owner); + +private: + DeserializedEdge(const DeserializedEdge &) = delete; + DeserializedEdge& operator=(const DeserializedEdge &) = delete; +}; + +// A `DeserializedNode` is a node in the heap graph that we deserialized from a +// core dump. +struct DeserializedNode { + using EdgeVector = Vector; + using UniqueStringPtr = UniquePtr; + + NodeId id; + // A borrowed reference to a string owned by this node's owning HeapSnapshot. + const char16_t *typeName; + uint64_t size; + EdgeVector edges; + // A weak pointer to this node's owning `HeapSnapshot`. Safe without + // AddRef'ing because this node's lifetime is equal to that of its owner. + HeapSnapshot *owner; + + // Create a new `DeserializedNode` from the given `protobuf::Node` message. + static UniquePtr Create(const protobuf::Node &node, + HeapSnapshot &owner); + + DeserializedNode(NodeId id, + const char16_t *typeName, + uint64_t size, + EdgeVector &&edges, + HeapSnapshot &owner); + virtual ~DeserializedNode() { } + + // Get a borrowed reference to the given edge's referent. This method is + // virtual to provide a hook for gmock and gtest. + virtual DeserializedNode &getEdgeReferent(const DeserializedEdge &edge); + +private: + DeserializedNode(const DeserializedNode &) = delete; + DeserializedNode &operator=(const DeserializedNode &) = delete; +}; + +} // namespace devtools +} // namespace mozilla + +#endif // mozilla_devtools_DeserializedNode__ diff --git a/toolkit/devtools/server/HeapSnapshot.cpp b/toolkit/devtools/server/HeapSnapshot.cpp new file mode 100644 index 0000000000000..4b61e4eb3e647 --- /dev/null +++ b/toolkit/devtools/server/HeapSnapshot.cpp @@ -0,0 +1,194 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "HeapSnapshot.h" + +#include +#include +#include + +#include "mozilla/devtools/DeserializedNode.h" +#include "mozilla/dom/HeapSnapshotBinding.h" + +#include "CoreDump.pb.h" +#include "nsCycleCollectionParticipant.h" +#include "nsCRTGlue.h" +#include "nsISupportsImpl.h" + +namespace mozilla { +namespace devtools { + +using ::google::protobuf::io::ArrayInputStream; +using ::google::protobuf::io::CodedInputStream; +using ::google::protobuf::io::GzipInputStream; +using ::google::protobuf::io::ZeroCopyInputStream; + +NS_IMPL_CYCLE_COLLECTION_CLASS(HeapSnapshot) + +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(HeapSnapshot) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(HeapSnapshot) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(HeapSnapshot) + NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER +NS_IMPL_CYCLE_COLLECTION_TRACE_END + +NS_IMPL_CYCLE_COLLECTING_ADDREF(HeapSnapshot) +NS_IMPL_CYCLE_COLLECTING_RELEASE(HeapSnapshot) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(HeapSnapshot) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY + NS_INTERFACE_MAP_ENTRY(nsISupports) +NS_INTERFACE_MAP_END + +/* virtual */ JSObject * +HeapSnapshot::WrapObject(JSContext* aCx, JS::Handle aGivenProto) +{ + return dom::HeapSnapshotBinding::Wrap(aCx, this, aGivenProto); +} + +/* static */ already_AddRefed +HeapSnapshot::Create(JSContext *cx, + dom::GlobalObject &global, + const uint8_t *buffer, + uint32_t size, + ErrorResult &rv) +{ + nsRefPtr snapshot = new HeapSnapshot(cx, global.GetAsSupports()); + if (!snapshot->init(buffer, size)) { + rv.Throw(NS_ERROR_UNEXPECTED); + return nullptr; + } + return snapshot.forget(); +} + +template +static bool +parseMessage(ZeroCopyInputStream &stream, MessageType &message) +{ + // We need to create a new `CodedInputStream` for each message so that the + // 64MB limit is applied per-message rather than to the whole stream. + CodedInputStream codedStream(&stream); + + // Because protobuf messages aren't self-delimiting, we serialize each message + // preceeded by its size in bytes. When deserializing, we read this size and + // then limit reading from the stream to the given byte size. If we didn't, + // then the first message would consume the entire stream. + + uint32_t size = 0; + if (NS_WARN_IF(!codedStream.ReadVarint32(&size))) + return false; + + auto limit = codedStream.PushLimit(size); + if (NS_WARN_IF(!message.ParseFromCodedStream(&codedStream)) || + NS_WARN_IF(!codedStream.ConsumedEntireMessage())) + { + return false; + } + + codedStream.PopLimit(limit); + return true; +} + +bool +HeapSnapshot::saveNode(const protobuf::Node &node) +{ + UniquePtr dn(DeserializedNode::Create(node, *this)); + if (!dn) + return false; + return nodes.put(dn->id, Move(dn)); +} + +static inline bool +StreamHasData(GzipInputStream &stream) +{ + // Test for the end of the stream. The protobuf library gives no way to tell + // the difference between an underlying read error and the stream being + // done. All we can do is attempt to read data and extrapolate guestimations + // from the result of that operation. + + const void *buf; + int size; + bool more = stream.Next(&buf, &size); + if (!more) + // Could not read any more data. We are optimistic and assume the stream is + // just exhausted and there is not an underlying IO error, since this + // function is only called at message boundaries. + return false; + + // There is more data still available in the stream. Return the data we read + // to the stream and let the parser get at it. + stream.BackUp(size); + return true; +} + +bool +HeapSnapshot::init(const uint8_t *buffer, uint32_t size) +{ + if (!nodes.init() || !strings.init()) + return false; + + ArrayInputStream stream(buffer, size); + GzipInputStream gzipStream(&stream); + + // First is the metadata. + + protobuf::Metadata metadata; + if (!parseMessage(gzipStream, metadata)) + return false; + if (metadata.has_timestamp()) + timestamp.emplace(metadata.timestamp()); + + // Next is the root node. + + protobuf::Node root; + if (!parseMessage(gzipStream, root)) + return false; + + // Although the id is optional in the protobuf format for future proofing, we + // can't currently do anything without it. + if (NS_WARN_IF(!root.has_id())) + return false; + rootId = root.id(); + + if (NS_WARN_IF(!saveNode(root))) + return false; + + // Finally, the rest of the nodes in the core dump. + + while (StreamHasData(gzipStream)) { + protobuf::Node node; + if (!parseMessage(gzipStream, node)) + return false; + if (NS_WARN_IF(!saveNode(node))) + return false; + } + + return true; +} + +const char16_t* +HeapSnapshot::borrowUniqueString(const char16_t* duplicateString, size_t length) +{ + MOZ_ASSERT(duplicateString); + UniqueStringHashPolicy::Lookup lookup(duplicateString, length); + auto ptr = strings.lookupForAdd(lookup); + + if (!ptr) { + UniqueString owned(NS_strndup(duplicateString, length)); + if (!owned || !strings.add(ptr, Move(owned))) + return nullptr; + } + + MOZ_ASSERT(ptr->get() != duplicateString); + return ptr->get(); +} + + +} // namespace devtools +} // namespace mozilla diff --git a/toolkit/devtools/server/HeapSnapshot.h b/toolkit/devtools/server/HeapSnapshot.h new file mode 100644 index 0000000000000..9d14c829633e5 --- /dev/null +++ b/toolkit/devtools/server/HeapSnapshot.h @@ -0,0 +1,133 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_devtools_HeapSnapshot__ +#define mozilla_devtools_HeapSnapshot__ + +#include "js/HashTable.h" +#include "mozilla/ErrorResult.h" +#include "mozilla/devtools/DeserializedNode.h" +#include "mozilla/dom/BindingDeclarations.h" +#include "mozilla/HashFunctions.h" +#include "mozilla/Maybe.h" +#include "mozilla/RefPtr.h" +#include "mozilla/UniquePtr.h" + +#include "CoreDump.pb.h" +#include "nsCOMPtr.h" +#include "nsCRTGlue.h" +#include "nsCycleCollectionParticipant.h" +#include "nsISupports.h" +#include "nsWrapperCache.h" +#include "nsXPCOM.h" + +namespace mozilla { +namespace devtools { + +struct NSFreePolicy { + void operator()(void* ptr) { + NS_Free(ptr); + } +}; + +using UniqueString = UniquePtr; + +struct UniqueStringHashPolicy { + struct Lookup { + const char16_t* str; + size_t length; + + Lookup(const char16_t* str, size_t length) + : str(str) + , length(length) + { } + }; + + static js::HashNumber hash(const Lookup& lookup) { + MOZ_ASSERT(lookup.str); + return HashString(lookup.str, lookup.length); + } + + static bool match(const UniqueString& existing, const Lookup& lookup) { + MOZ_ASSERT(lookup.str); + return NS_strncmp(existing.get(), lookup.str, lookup.length) == 0; + } +}; + +class HeapSnapshot final : public nsISupports + , public nsWrapperCache +{ + friend struct DeserializedNode; + + explicit HeapSnapshot(JSContext *cx, nsISupports *aParent) + : timestamp(Nothing()) + , rootId(0) + , nodes(cx) + , strings(cx) + , mParent(aParent) + { + MOZ_ASSERT(aParent); + }; + + // Initialize this HeapSnapshot from the given buffer that contains a + // serialized core dump. Do NOT take ownership of the buffer, only borrow it + // for the duration of the call. Return false on failure. + bool init(const uint8_t *buffer, uint32_t size); + + // Save the given `protobuf::Node` message in this `HeapSnapshot` as a + // `DeserializedNode`. + bool saveNode(const protobuf::Node &node); + + // If present, a timestamp in the same units that `PR_Now` gives. + Maybe timestamp; + + // The id of the root node for this deserialized heap graph. + NodeId rootId; + + // The set of nodes in this deserialized heap graph, keyed by id. + using NodeMap = js::HashMap>; + NodeMap nodes; + + // Core dump files have many duplicate strings: type names are repeated for + // each node, and although in theory edge names are highly customizable for + // specific edges, in practice they are also highly duplicated. Rather than + // make each Deserialized{Node,Edge} malloc their own copy of their edge and + // type names, we de-duplicate the strings here and Deserialized{Node,Edge} + // get borrowed pointers into this set. + using UniqueStringSet = js::HashSet; + UniqueStringSet strings; + +protected: + nsCOMPtr mParent; + + virtual ~HeapSnapshot() { } + +public: + // Create a `HeapSnapshot` from the given buffer that contains a serialized + // core dump. Do NOT take ownership of the buffer, only borrow it for the + // duration of the call. + static already_AddRefed Create(JSContext *cx, + dom::GlobalObject &global, + const uint8_t *buffer, + uint32_t size, + ErrorResult &rv); + + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(HeapSnapshot) + MOZ_DECLARE_REFCOUNTED_TYPENAME(HeapSnapshot) + + nsISupports *GetParentObject() const { return mParent; } + + virtual JSObject *WrapObject(JSContext* aCx, + JS::Handle aGivenProto) override; + + const char16_t* borrowUniqueString(const char16_t* duplicateString, + size_t length); +}; + +} // namespace devtools +} // namespace mozilla + +#endif // mozilla_devtools_HeapSnapshot__ diff --git a/toolkit/devtools/server/moz.build b/toolkit/devtools/server/moz.build index 59fcb17234cb1..f83103a8ecd16 100644 --- a/toolkit/devtools/server/moz.build +++ b/toolkit/devtools/server/moz.build @@ -20,12 +20,16 @@ XPIDL_MODULE = 'jsinspector' EXPORTS.mozilla.devtools += [ 'ChromeUtils.h', 'CoreDump.pb.h', + 'DeserializedNode.h', + 'HeapSnapshot.h', 'ZeroCopyNSIOutputStream.h', ] SOURCES += [ 'ChromeUtils.cpp', 'CoreDump.pb.cc', + 'DeserializedNode.cpp', + 'HeapSnapshot.cpp', 'nsJSInspector.cpp', 'ZeroCopyNSIOutputStream.cpp', ] diff --git a/xpcom/glue/nsCRTGlue.cpp b/xpcom/glue/nsCRTGlue.cpp index 0d63bc46b6bc9..d95a0d69e4cf4 100644 --- a/xpcom/glue/nsCRTGlue.cpp +++ b/xpcom/glue/nsCRTGlue.cpp @@ -78,6 +78,7 @@ NS_strtok(const char* aDelims, char** aStr) uint32_t NS_strlen(const char16_t* aString) { + MOZ_ASSERT(aString); const char16_t* end; for (end = aString; *end; ++end) { @@ -103,6 +104,23 @@ NS_strcmp(const char16_t* aStrA, const char16_t* aStrB) return *aStrA != '\0'; } +int +NS_strncmp(const char16_t* aStrA, const char16_t* aStrB, size_t aLen) +{ + while (aLen && *aStrB) { + int r = *aStrA - *aStrB; + if (r) { + return r; + } + + ++aStrA; + ++aStrB; + --aLen; + } + + return aLen ? *aStrA != '\0' : *aStrA - *aStrB; +} + char16_t* NS_strdup(const char16_t* aString) { diff --git a/xpcom/glue/nsCRTGlue.h b/xpcom/glue/nsCRTGlue.h index 1c10611a0e118..4e59c137c455d 100644 --- a/xpcom/glue/nsCRTGlue.h +++ b/xpcom/glue/nsCRTGlue.h @@ -47,6 +47,11 @@ uint32_t NS_strlen(const char16_t* aString); */ int NS_strcmp(const char16_t* aStrA, const char16_t* aStrB); +/** + * "strncmp" for char16_t strings + */ +int NS_strncmp(const char16_t* aStrA, const char16_t* aStrB, size_t aLen); + /** * "strdup" for char16_t strings, uses the NS_Alloc allocator. */ From 887d7debc4462cd6539dd9d1b665393a50173746 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:43 -0700 Subject: [PATCH 053/151] Bug 1024774 - Part 10: Add an xpcshell test for reading heap snapshots. r=jimb --- .../tests/unit/test_ReadHeapSnapshot.js | 22 +++++++++++++++++++ .../devtools/server/tests/unit/xpcshell.ini | 1 + 2 files changed, 23 insertions(+) create mode 100644 toolkit/devtools/server/tests/unit/test_ReadHeapSnapshot.js diff --git a/toolkit/devtools/server/tests/unit/test_ReadHeapSnapshot.js b/toolkit/devtools/server/tests/unit/test_ReadHeapSnapshot.js new file mode 100644 index 0000000000000..44e91a209a9b3 --- /dev/null +++ b/toolkit/devtools/server/tests/unit/test_ReadHeapSnapshot.js @@ -0,0 +1,22 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Test that we can read core dumps into HeapSnapshot instances. + +const { addDebuggerToGlobal } = Cu.import("resource://gre/modules/jsdebugger.jsm", {}); +var Debugger; +addDebuggerToGlobal(this); + +function run_test() { + const filePath = getFilePath("core-dump.tmp", true, true); + ok(filePath, "Should get a file path"); + + ChromeUtils.saveHeapSnapshot(filePath, { globals: [this] }); + ok(true, "Should be able to save a snapshot."); + + const snapshot = ChromeUtils.readHeapSnapshot(filePath); + ok(snapshot, "Should be able to read a heap snapshot"); + ok(snapshot instanceof HeapSnapshot, "Should be an instanceof HeapSnapshot"); + + do_test_finished(); +} diff --git a/toolkit/devtools/server/tests/unit/xpcshell.ini b/toolkit/devtools/server/tests/unit/xpcshell.ini index b3aaac5ca82f5..937fcfda10094 100644 --- a/toolkit/devtools/server/tests/unit/xpcshell.ini +++ b/toolkit/devtools/server/tests/unit/xpcshell.ini @@ -41,6 +41,7 @@ support-files = [test_getyoungestframe.js] [test_nsjsinspector.js] [test_SaveHeapSnapshot.js] +[test_ReadHeapSnapshot.js] [test_dbgactor.js] [test_dbgglobal.js] [test_dbgclient_debuggerstatement.js] From 2c6810accba0e19d55d3ca7b98492efb62ef5fb6 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:43 -0700 Subject: [PATCH 054/151] Bug 1024774 - Part 11: Implement a JS::ubi::Node specialization for DeserializedNode; r=jimb --- js/public/UbiNode.h | 31 +++---- toolkit/devtools/server/DeserializedNode.cpp | 85 ++++++++++++++++++++ toolkit/devtools/server/DeserializedNode.h | 36 +++++++++ 3 files changed, 138 insertions(+), 14 deletions(-) diff --git a/js/public/UbiNode.h b/js/public/UbiNode.h index b45294d0a952a..595badb21aee8 100644 --- a/js/public/UbiNode.h +++ b/js/public/UbiNode.h @@ -187,6 +187,21 @@ class Base { } bool operator!=(const Base& rhs) const { return !(*this == rhs); } + // An identifier for this node, guaranteed to be stable and unique for as + // long as this ubi::Node's referent is alive and at the same address. + // + // This is probably suitable for use in serializations, as it is an integral + // type. It may also help save memory when constructing HashSets of + // ubi::Nodes: since a uintptr_t will always be smaller than a ubi::Node, a + // HashSet will use less space per element than a + // HashSet. + // + // (Note that 'unique' only means 'up to equality on ubi::Node'; see the + // caveats about multiple objects allocated at the same address for + // 'ubi::Node::operator=='.) + typedef uintptr_t Id; + virtual Id identifier() const { return reinterpret_cast(ptr); } + // Returns true if this node is pointing to something on the live heap, as // opposed to something from a deserialized core dump. Returns false, // otherwise. @@ -385,20 +400,8 @@ class Node { return base()->edges(cx, wantNames); } - // An identifier for this node, guaranteed to be stable and unique for as - // long as this ubi::Node's referent is alive and at the same address. - // - // This is probably suitable for use in serializations, as it is an integral - // type. It may also help save memory when constructing HashSets of - // ubi::Nodes: since a uintptr_t will always be smaller than a ubi::Node, a - // HashSet will use less space per element than a - // HashSet. - // - // (Note that 'unique' only means 'up to equality on ubi::Node'; see the - // caveats about multiple objects allocated at the same address for - // 'ubi::Node::operator=='.) - typedef uintptr_t Id; - Id identifier() const { return reinterpret_cast(base()->ptr); } + typedef Base::Id Id; + Id identifier() const { return base()->identifier(); } // A hash policy for ubi::Nodes. // This simply uses the stock PointerHasher on the ubi::Node's pointer. diff --git a/toolkit/devtools/server/DeserializedNode.cpp b/toolkit/devtools/server/DeserializedNode.cpp index db1515f414d89..08d104c2b0799 100644 --- a/toolkit/devtools/server/DeserializedNode.cpp +++ b/toolkit/devtools/server/DeserializedNode.cpp @@ -4,6 +4,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mozilla/devtools/DeserializedNode.h" +#include "mozilla/devtools/HeapSnapshot.h" +#include "nsCRTGlue.h" namespace mozilla { namespace devtools { @@ -107,3 +109,86 @@ DeserializedNode::getEdgeReferent(const DeserializedEdge &edge) } // namespace devtools } // namespace mozilla + +namespace JS { +namespace ubi { + +using mozilla::devtools::DeserializedEdge; + +const char16_t Concrete::concreteTypeName[] = + MOZ_UTF16("mozilla::devtools::DeserializedNode"); + +const char16_t * +Concrete::typeName() const +{ + return get().typeName; +} + +size_t +Concrete::size(mozilla::MallocSizeOf mallocSizeof) const +{ + return get().size; +} + +class DeserializedEdgeRange : public EdgeRange +{ + SimpleEdgeVector edges; + size_t i; + + void settle() { + front_ = i < edges.length() ? &edges[i] : nullptr; + } + +public: + explicit DeserializedEdgeRange(JSContext* cx) + : edges(cx) + , i(0) + { + settle(); + } + + bool init(DeserializedNode &node) + { + if (!edges.reserve(node.edges.length())) + return false; + + for (DeserializedEdge *edgep = node.edges.begin(); + edgep != node.edges.end(); + edgep++) + { + char16_t *name = nullptr; + if (edgep->name) { + name = NS_strdup(edgep->name); + if (!name) + return false; + } + + DeserializedNode &referent = node.getEdgeReferent(*edgep); + edges.infallibleAppend(mozilla::Move(SimpleEdge(name, Node(&referent)))); + } + + settle(); + return true; + } + + void popFront() override + { + i++; + settle(); + } +}; + +UniquePtr +Concrete::edges(JSContext* cx, bool) const +{ + UniquePtr> range( + js_new(cx)); + + if (!range || !range->init(get())) + return nullptr; + + return UniquePtr(range.release()); +} + +} // namespace JS +} // namespace ubi diff --git a/toolkit/devtools/server/DeserializedNode.h b/toolkit/devtools/server/DeserializedNode.h index b1b3218e86048..b080c078bb752 100644 --- a/toolkit/devtools/server/DeserializedNode.h +++ b/toolkit/devtools/server/DeserializedNode.h @@ -6,6 +6,7 @@ #ifndef mozilla_devtools_DeserializedNode__ #define mozilla_devtools_DeserializedNode__ +#include "js/UbiNode.h" #include "mozilla/devtools/CoreDump.pb.h" #include "mozilla/MaybeOneOf.h" #include "mozilla/Move.h" @@ -88,4 +89,39 @@ struct DeserializedNode { } // namespace devtools } // namespace mozilla +namespace JS { +namespace ubi { + +using mozilla::devtools::DeserializedNode; +using mozilla::UniquePtr; + +template<> +struct Concrete : public Base +{ +protected: + explicit Concrete(DeserializedNode *ptr) : Base(ptr) { } + DeserializedNode &get() const { + return *static_cast(ptr); + } + +public: + static const char16_t concreteTypeName[]; + + static void construct(void *storage, DeserializedNode *ptr) { + new (storage) Concrete(ptr); + } + + Id identifier() const override { return get().id; } + bool isLive() const override { return false; } + const char16_t *typeName() const override; + size_t size(mozilla::MallocSizeOf mallocSizeof) const override; + + // We ignore the `bool wantNames` parameter because we can't control whether + // the core dump was serialized with edge names or not. + UniquePtr edges(JSContext* cx, bool) const override; +}; + +} // namespace JS +} // namespace ubi + #endif // mozilla_devtools_DeserializedNode__ From 8f4dd8a4438ed5fd7490b971a93d31df9487c6b3 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:43 -0700 Subject: [PATCH 055/151] Bug 1024774 - Part 12: Add a GTest for the JS::ubi::Node specialization for DeserializedNode; r=jimb --- toolkit/devtools/server/DeserializedNode.cpp | 8 ++ toolkit/devtools/server/DeserializedNode.h | 4 + .../tests/gtest/DeserializedNodeUbiNodes.cpp | 95 +++++++++++++++++++ toolkit/devtools/server/tests/gtest/moz.build | 1 + 4 files changed, 108 insertions(+) create mode 100644 toolkit/devtools/server/tests/gtest/DeserializedNodeUbiNodes.cpp diff --git a/toolkit/devtools/server/DeserializedNode.cpp b/toolkit/devtools/server/DeserializedNode.cpp index 08d104c2b0799..341103fd702d9 100644 --- a/toolkit/devtools/server/DeserializedNode.cpp +++ b/toolkit/devtools/server/DeserializedNode.cpp @@ -99,6 +99,14 @@ DeserializedNode::DeserializedNode(NodeId id, , owner(&owner) { } +DeserializedNode::DeserializedNode(NodeId id, const char16_t *typeName, uint64_t size) + : id(id) + , typeName(typeName) + , size(size) + , edges() + , owner(nullptr) +{ } + DeserializedNode & DeserializedNode::getEdgeReferent(const DeserializedEdge &edge) { diff --git a/toolkit/devtools/server/DeserializedNode.h b/toolkit/devtools/server/DeserializedNode.h index b080c078bb752..dcdf82441e743 100644 --- a/toolkit/devtools/server/DeserializedNode.h +++ b/toolkit/devtools/server/DeserializedNode.h @@ -81,6 +81,10 @@ struct DeserializedNode { // virtual to provide a hook for gmock and gtest. virtual DeserializedNode &getEdgeReferent(const DeserializedEdge &edge); +protected: + // This is only for use with `MockDeserializedNode` in testing. + DeserializedNode(NodeId id, const char16_t *typeName, uint64_t size); + private: DeserializedNode(const DeserializedNode &) = delete; DeserializedNode &operator=(const DeserializedNode &) = delete; diff --git a/toolkit/devtools/server/tests/gtest/DeserializedNodeUbiNodes.cpp b/toolkit/devtools/server/tests/gtest/DeserializedNodeUbiNodes.cpp new file mode 100644 index 0000000000000..1795360b798fa --- /dev/null +++ b/toolkit/devtools/server/tests/gtest/DeserializedNodeUbiNodes.cpp @@ -0,0 +1,95 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Test that the `JS::ubi::Node`s we create from +// `mozilla::devtools::DeserializedNode` instances look and behave as we would +// like. + +#include "DevTools.h" +#include "js/TypeDecls.h" +#include "mozilla/devtools/DeserializedNode.h" + +using testing::Field; +using testing::ReturnRef; + +// A mock DeserializedNode for testing. +struct MockDeserializedNode : public DeserializedNode +{ + MockDeserializedNode(NodeId id, const char16_t *typeName, uint64_t size) + : DeserializedNode(id, typeName, size) + { } + + bool addEdge(DeserializedEdge &&edge) + { + return edges.append(Move(edge)); + } + + MOCK_METHOD1(getEdgeReferent, DeserializedNode &(const DeserializedEdge &)); +}; + +size_t fakeMallocSizeOf(const void *) { + EXPECT_TRUE(false); + MOZ_ASSERT_UNREACHABLE("fakeMallocSizeOf should never be called because " + "DeserializedNodes report the deserialized size."); + return 0; +} + +DEF_TEST(DeserializedNodeUbiNodes, { + const char16_t *typeName = MOZ_UTF16("TestTypeName"); + + NodeId id = 1L << 33; + uint64_t size = 1L << 60; + MockDeserializedNode mocked(id, typeName, size); + + DeserializedNode &deserialized = mocked; + JS::ubi::Node ubi(&deserialized); + + // Test the ubi::Node accessors. + + EXPECT_EQ(size, ubi.size(fakeMallocSizeOf)); + EXPECT_EQ(typeName, ubi.typeName()); + EXPECT_EQ(id, ubi.identifier()); + EXPECT_FALSE(ubi.isLive()); + + // Test the ubi::Node's edges. + + UniquePtr referent1(new MockDeserializedNode(1, + nullptr, + 10)); + DeserializedEdge edge1; + edge1.referent = referent1->id; + mocked.addEdge(Move(edge1)); + EXPECT_CALL(mocked, + getEdgeReferent(Field(&DeserializedEdge::referent, + referent1->id))) + .Times(1) + .WillOnce(ReturnRef(*referent1.get())); + + UniquePtr referent2(new MockDeserializedNode(2, + nullptr, + 20)); + DeserializedEdge edge2; + edge2.referent = referent2->id; + mocked.addEdge(Move(edge2)); + EXPECT_CALL(mocked, + getEdgeReferent(Field(&DeserializedEdge::referent, + referent2->id))) + .Times(1) + .WillOnce(ReturnRef(*referent2.get())); + + UniquePtr referent3(new MockDeserializedNode(3, + nullptr, + 30)); + DeserializedEdge edge3; + edge3.referent = referent3->id; + mocked.addEdge(Move(edge3)); + EXPECT_CALL(mocked, + getEdgeReferent(Field(&DeserializedEdge::referent, + referent3->id))) + .Times(1) + .WillOnce(ReturnRef(*referent3.get())); + + ubi.edges(cx); + }); diff --git a/toolkit/devtools/server/tests/gtest/moz.build b/toolkit/devtools/server/tests/gtest/moz.build index 83005c0950aa3..eb78b6ff7ed28 100644 --- a/toolkit/devtools/server/tests/gtest/moz.build +++ b/toolkit/devtools/server/tests/gtest/moz.build @@ -11,6 +11,7 @@ LOCAL_INCLUDES += [ ] UNIFIED_SOURCES = [ + 'DeserializedNodeUbiNodes.cpp', 'DoesCrossZoneBoundaries.cpp', 'DoesntCrossZoneBoundaries.cpp', 'SerializesEdgeNames.cpp', From bf8b9ad3593521f40bd8698b76f80666f0afd495 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:43 -0700 Subject: [PATCH 056/151] Bug 1024774 - Part 13: Change to new SpiderMonkey style from bug 1144366; r=me --- js/public/Debug.h | 4 +- js/src/jsfriendapi.h | 2 +- js/src/vm/Debugger.cpp | 6 +- js/src/vm/DebuggerMemory.cpp | 2 +- toolkit/devtools/server/ChromeUtils.cpp | 80 +++++++++---------- toolkit/devtools/server/ChromeUtils.h | 32 ++++---- toolkit/devtools/server/DeserializedNode.cpp | 30 +++---- toolkit/devtools/server/DeserializedNode.h | 44 +++++----- toolkit/devtools/server/HeapSnapshot.cpp | 20 ++--- toolkit/devtools/server/HeapSnapshot.h | 18 ++--- .../server/ZeroCopyNSIOutputStream.cpp | 4 +- .../devtools/server/ZeroCopyNSIOutputStream.h | 6 +- .../tests/gtest/DeserializedNodeUbiNodes.cpp | 12 +-- .../devtools/server/tests/gtest/DevTools.h | 29 ++++--- .../tests/gtest/DoesCrossZoneBoundaries.cpp | 2 +- .../tests/gtest/DoesntCrossZoneBoundaries.cpp | 2 +- 16 files changed, 146 insertions(+), 147 deletions(-) diff --git a/js/public/Debug.h b/js/public/Debug.h index 5e33e13802be6..328cd427ff40f 100644 --- a/js/public/Debug.h +++ b/js/public/Debug.h @@ -322,12 +322,12 @@ onPromiseSettled(JSContext* cx, HandleObject promise); // Return true if the given value is a Debugger object, false otherwise. JS_PUBLIC_API(bool) -IsDebugger(const JSObject &obj); +IsDebugger(const JSObject& obj); // Append each of the debuggee global objects observed by the Debugger object // |dbgObj| to |vector|. Returns true on success, false on failure. JS_PUBLIC_API(bool) -GetDebuggeeGlobals(JSContext *cx, const JSObject &dbgObj, AutoObjectVector &vector); +GetDebuggeeGlobals(JSContext* cx, const JSObject& dbgObj, AutoObjectVector& vector); // Hooks for reporting where JavaScript execution began. diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index 7e7ad84c0e4d8..6f5de9b754314 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -479,7 +479,7 @@ extern JS_FRIEND_API(bool) IsAtomsCompartment(JSCompartment* comp); extern JS_FRIEND_API(bool) -IsAtomsZone(JS::Zone *zone); +IsAtomsZone(JS::Zone* zone); /* * Returns whether we're in a non-strict property set (in that we're in a diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index 209beb008ea0a..165daa7bb84d9 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -7915,17 +7915,17 @@ JS::dbg::onPromiseSettled(JSContext* cx, HandleObject promise) } JS_PUBLIC_API(bool) -JS::dbg::IsDebugger(const JSObject &obj) +JS::dbg::IsDebugger(const JSObject& obj) { return js::GetObjectClass(&obj) == &Debugger::jsclass && js::Debugger::fromJSObject(&obj) != nullptr; } JS_PUBLIC_API(bool) -JS::dbg::GetDebuggeeGlobals(JSContext *cx, const JSObject &dbgObj, AutoObjectVector &vector) +JS::dbg::GetDebuggeeGlobals(JSContext* cx, const JSObject& dbgObj, AutoObjectVector& vector) { MOZ_ASSERT(IsDebugger(dbgObj)); - js::Debugger *dbg = js::Debugger::fromJSObject(&dbgObj); + js::Debugger* dbg = js::Debugger::fromJSObject(&dbgObj); if (!vector.reserve(vector.length() + dbg->debuggees.count())) { JS_ReportOutOfMemory(cx); diff --git a/js/src/vm/DebuggerMemory.cpp b/js/src/vm/DebuggerMemory.cpp index 6c132732dbdb3..69923b9d263d7 100644 --- a/js/src/vm/DebuggerMemory.cpp +++ b/js/src/vm/DebuggerMemory.cpp @@ -332,7 +332,7 @@ JS::dbg::SetDebuggerMallocSizeOf(JSRuntime* rt, mozilla::MallocSizeOf mallocSize } JS_PUBLIC_API(mozilla::MallocSizeOf) -JS::dbg::GetDebuggerMallocSizeOf(JSRuntime *rt) +JS::dbg::GetDebuggerMallocSizeOf(JSRuntime* rt) { return rt->debuggerMallocSizeOf; } diff --git a/toolkit/devtools/server/ChromeUtils.cpp b/toolkit/devtools/server/ChromeUtils.cpp index db291198f61e5..4e47fc8276a6f 100644 --- a/toolkit/devtools/server/ChromeUtils.cpp +++ b/toolkit/devtools/server/ChromeUtils.cpp @@ -35,7 +35,7 @@ using namespace dom; // globals, find the set of zones the globals are allocated within. Returns // false on OOM failure. static bool -PopulateZonesWithGlobals(ZoneSet &zones, AutoObjectVector &globals) +PopulateZonesWithGlobals(ZoneSet& zones, AutoObjectVector& globals) { if (!zones.init()) return false; @@ -52,7 +52,7 @@ PopulateZonesWithGlobals(ZoneSet &zones, AutoObjectVector &globals) // Add the given set of globals as explicit roots in the given roots // list. Returns false on OOM failure. static bool -AddGlobalsAsRoots(AutoObjectVector &globals, ubi::RootList &roots) +AddGlobalsAsRoots(AutoObjectVector& globals, ubi::RootList& roots) { unsigned length = globals.length(); for (unsigned i = 0; i < length; i++) { @@ -75,11 +75,11 @@ AddGlobalsAsRoots(AutoObjectVector &globals, ubi::RootList &roots) // handle it, or we run out of memory, set `rv` appropriately and return // `false`. static bool -EstablishBoundaries(JSContext *cx, - ErrorResult &rv, - const HeapSnapshotBoundaries &boundaries, - ubi::RootList &roots, - ZoneSet &zones) +EstablishBoundaries(JSContext* cx, + ErrorResult& rv, + const HeapSnapshotBoundaries& boundaries, + ubi::RootList& roots, + ZoneSet& zones) { MOZ_ASSERT(!roots.initialized()); MOZ_ASSERT(!zones.initialized()); @@ -107,7 +107,7 @@ EstablishBoundaries(JSContext *cx, } foundBoundaryProperty = true; - JSObject *dbgObj = boundaries.mDebugger.Value(); + JSObject* dbgObj = boundaries.mDebugger.Value(); if (!dbgObj || !dbg::IsDebugger(*dbgObj)) { rv.Throw(NS_ERROR_INVALID_ARG); return false; @@ -139,7 +139,7 @@ EstablishBoundaries(JSContext *cx, AutoObjectVector globals(cx); for (uint32_t i = 0; i < length; i++) { - JSObject *global = boundaries.mGlobals.Value().ElementAt(i); + JSObject* global = boundaries.mGlobals.Value().ElementAt(i); if (!JS_IsGlobalObject(global)) { rv.Throw(NS_ERROR_INVALID_ARG); return false; @@ -175,12 +175,12 @@ EstablishBoundaries(JSContext *cx, // given `ZeroCopyOutputStream`. class MOZ_STACK_CLASS StreamWriter : public CoreDumpWriter { - JSContext *cx; + JSContext* cx; bool wantNames; - ::google::protobuf::io::ZeroCopyOutputStream &stream; + ::google::protobuf::io::ZeroCopyOutputStream& stream; - bool writeMessage(const ::google::protobuf::MessageLite &message) { + bool writeMessage(const ::google::protobuf::MessageLite& message) { // We have to create a new CodedOutputStream when writing each message so // that the 64MB size limit used by Coded{Output,Input}Stream to prevent // integer overflow is enforced per message rather than on the whole stream. @@ -191,8 +191,8 @@ class MOZ_STACK_CLASS StreamWriter : public CoreDumpWriter } public: - StreamWriter(JSContext *cx, - ::google::protobuf::io::ZeroCopyOutputStream &stream, + StreamWriter(JSContext* cx, + ::google::protobuf::io::ZeroCopyOutputStream& stream, bool wantNames) : cx(cx) , wantNames(wantNames) @@ -207,16 +207,16 @@ class MOZ_STACK_CLASS StreamWriter : public CoreDumpWriter return writeMessage(metadata); } - virtual bool writeNode(const JS::ubi::Node &ubiNode, + virtual bool writeNode(const JS::ubi::Node& ubiNode, EdgePolicy includeEdges) override { protobuf::Node protobufNode; protobufNode.set_id(ubiNode.identifier()); - const char16_t *typeName = ubiNode.typeName(); + const char16_t* typeName = ubiNode.typeName(); size_t length = NS_strlen(typeName) * sizeof(char16_t); protobufNode.set_typename_(typeName, length); - JSRuntime *rt = JS_GetRuntime(cx); + JSRuntime* rt = JS_GetRuntime(cx); mozilla::MallocSizeOf mallocSizeOf = dbg::GetDebuggerMallocSizeOf(rt); MOZ_ASSERT(mallocSizeOf); protobufNode.set_size(ubiNode.size(mallocSizeOf)); @@ -227,9 +227,9 @@ class MOZ_STACK_CLASS StreamWriter : public CoreDumpWriter return false; for ( ; !edges->empty(); edges->popFront()) { - const ubi::Edge &ubiEdge = edges->front(); + const ubi::Edge& ubiEdge = edges->front(); - protobuf::Edge *protobufEdge = protobufNode.add_edges(); + protobuf::Edge* protobufEdge = protobufNode.add_edges(); if (NS_WARN_IF(!protobufEdge)) { return false; } @@ -251,7 +251,7 @@ class MOZ_STACK_CLASS StreamWriter : public CoreDumpWriter // core dump. class MOZ_STACK_CLASS HeapSnapshotHandler { CoreDumpWriter& writer; - JS::ZoneSet* zones; + JS::ZoneSet* zones; public: HeapSnapshotHandler(CoreDumpWriter& writer, @@ -264,10 +264,10 @@ class MOZ_STACK_CLASS HeapSnapshotHandler { class NodeData { }; typedef JS::ubi::BreadthFirst Traversal; - bool operator() (Traversal &traversal, + bool operator() (Traversal& traversal, JS::ubi::Node origin, - const JS::ubi::Edge &edge, - NodeData *, + const JS::ubi::Edge& edge, + NodeData*, bool first) { // We're only interested in the first time we reach edge.referent, not in @@ -279,7 +279,7 @@ class MOZ_STACK_CLASS HeapSnapshotHandler { if (!first) return true; - const JS::ubi::Node &referent = edge.referent; + const JS::ubi::Node& referent = edge.referent; if (!zones) // We aren't targeting a particular set of zones, so serialize all the @@ -293,7 +293,7 @@ class MOZ_STACK_CLASS HeapSnapshotHandler { // by traversing the heap graph. However, we do not serialize its outgoing // edges and we abandon further traversal from this node. - JS::Zone *zone = referent.zone(); + JS::Zone* zone = referent.zone(); if (zones->has(zone)) return writer.writeNode(referent, CoreDumpWriter::INCLUDE_EDGES); @@ -305,12 +305,12 @@ class MOZ_STACK_CLASS HeapSnapshotHandler { bool -WriteHeapGraph(JSContext *cx, - const JS::ubi::Node &node, - CoreDumpWriter &writer, +WriteHeapGraph(JSContext* cx, + const JS::ubi::Node& node, + CoreDumpWriter& writer, bool wantNames, - JS::ZoneSet *zones, - JS::AutoCheckCannotGC &noGC) + JS::ZoneSet* zones, + JS::AutoCheckCannotGC& noGC) { // Serialize the starting node to the core dump. @@ -332,10 +332,10 @@ WriteHeapGraph(JSContext *cx, } /* static */ void -ChromeUtils::SaveHeapSnapshot(GlobalObject &global, - JSContext *cx, - const nsAString &filePath, - const HeapSnapshotBoundaries &boundaries, +ChromeUtils::SaveHeapSnapshot(GlobalObject& global, + JSContext* cx, + const nsAString& filePath, + const HeapSnapshotBoundaries& boundaries, ErrorResult& rv) { bool wantNames = true; @@ -384,10 +384,10 @@ ChromeUtils::SaveHeapSnapshot(GlobalObject &global, } /* static */ already_AddRefed -ChromeUtils::ReadHeapSnapshot(GlobalObject &global, - JSContext *cx, - const nsAString &filePath, - ErrorResult &rv) +ChromeUtils::ReadHeapSnapshot(GlobalObject& global, + JSContext* cx, + const nsAString& filePath, + ErrorResult& rv) { UniquePtr path(ToNewCString(filePath)); if (!path) { @@ -402,13 +402,13 @@ ChromeUtils::ReadHeapSnapshot(GlobalObject &global, } uint32_t size = fileInfo.size; - ScopedFreePtr buffer(static_cast(malloc(size))); + ScopedFreePtr buffer(static_cast(malloc(size))); if (!buffer) { rv.Throw(NS_ERROR_OUT_OF_MEMORY); return nullptr; } - PRFileDesc *fd = PR_Open(path.get(), PR_RDONLY, 0); + PRFileDesc* fd = PR_Open(path.get(), PR_RDONLY, 0); if (!fd) { rv.Throw(NS_ERROR_UNEXPECTED); return nullptr; diff --git a/toolkit/devtools/server/ChromeUtils.h b/toolkit/devtools/server/ChromeUtils.h index efbed444c3f3f..047194b3d3d35 100644 --- a/toolkit/devtools/server/ChromeUtils.h +++ b/toolkit/devtools/server/ChromeUtils.h @@ -39,7 +39,7 @@ class CoreDumpWriter // Write the given `JS::ubi::Node` to the core dump. The given `EdgePolicy` // dictates whether its outgoing edges should also be written to the core // dump, or excluded. - virtual bool writeNode(const JS::ubi::Node &node, + virtual bool writeNode(const JS::ubi::Node& node, EdgePolicy includeEdges) = 0; }; @@ -49,12 +49,12 @@ class CoreDumpWriter // non-null, only capture the sub-graph within the zone set, otherwise capture // the whole heap graph. Returns false on failure. bool -WriteHeapGraph(JSContext *cx, - const JS::ubi::Node &node, - CoreDumpWriter &writer, +WriteHeapGraph(JSContext* cx, + const JS::ubi::Node& node, + CoreDumpWriter& writer, bool wantNames, - JS::ZoneSet *zones, - JS::AutoCheckCannotGC &noGC); + JS::ZoneSet* zones, + JS::AutoCheckCannotGC& noGC); class HeapSnapshot; @@ -63,16 +63,16 @@ class HeapSnapshot; class ChromeUtils { public: - static void SaveHeapSnapshot(dom::GlobalObject &global, - JSContext *cx, - const nsAString &filePath, - const dom::HeapSnapshotBoundaries &boundaries, - ErrorResult &rv); - - static already_AddRefed ReadHeapSnapshot(dom::GlobalObject &global, - JSContext *cx, - const nsAString &filePath, - ErrorResult &rv); + static void SaveHeapSnapshot(dom::GlobalObject& global, + JSContext* cx, + const nsAString& filePath, + const dom::HeapSnapshotBoundaries& boundaries, + ErrorResult& rv); + + static already_AddRefed ReadHeapSnapshot(dom::GlobalObject& global, + JSContext* cx, + const nsAString& filePath, + ErrorResult& rv); }; } // namespace devtools diff --git a/toolkit/devtools/server/DeserializedNode.cpp b/toolkit/devtools/server/DeserializedNode.cpp index 341103fd702d9..9600be76a3e94 100644 --- a/toolkit/devtools/server/DeserializedNode.cpp +++ b/toolkit/devtools/server/DeserializedNode.cpp @@ -15,13 +15,13 @@ DeserializedEdge::DeserializedEdge() , name(nullptr) { } -DeserializedEdge::DeserializedEdge(DeserializedEdge &&rhs) +DeserializedEdge::DeserializedEdge(DeserializedEdge&& rhs) { referent = rhs.referent; name = rhs.name; } -DeserializedEdge &DeserializedEdge::operator=(DeserializedEdge &&rhs) +DeserializedEdge& DeserializedEdge::operator=(DeserializedEdge&& rhs) { MOZ_ASSERT(&rhs != this); this->~DeserializedEdge(); @@ -30,7 +30,7 @@ DeserializedEdge &DeserializedEdge::operator=(DeserializedEdge &&rhs) } bool -DeserializedEdge::init(const protobuf::Edge &edge, HeapSnapshot &owner) +DeserializedEdge::init(const protobuf::Edge& edge, HeapSnapshot& owner) { // Although the referent property is optional in the protobuf format for // future compatibility, we can't semantically have an edge to nowhere and @@ -50,7 +50,7 @@ DeserializedEdge::init(const protobuf::Edge &edge, HeapSnapshot &owner) } /* static */ UniquePtr -DeserializedNode::Create(const protobuf::Node &node, HeapSnapshot &owner) +DeserializedNode::Create(const protobuf::Node& node, HeapSnapshot& owner) { if (!node.has_id()) return nullptr; @@ -88,10 +88,10 @@ DeserializedNode::Create(const protobuf::Node &node, HeapSnapshot &owner) } DeserializedNode::DeserializedNode(NodeId id, - const char16_t *typeName, + const char16_t* typeName, uint64_t size, - EdgeVector &&edges, - HeapSnapshot &owner) + EdgeVector&& edges, + HeapSnapshot& owner) : id(id) , typeName(typeName) , size(size) @@ -99,7 +99,7 @@ DeserializedNode::DeserializedNode(NodeId id, , owner(&owner) { } -DeserializedNode::DeserializedNode(NodeId id, const char16_t *typeName, uint64_t size) +DeserializedNode::DeserializedNode(NodeId id, const char16_t* typeName, uint64_t size) : id(id) , typeName(typeName) , size(size) @@ -107,8 +107,8 @@ DeserializedNode::DeserializedNode(NodeId id, const char16_t *typeName, uint64_t , owner(nullptr) { } -DeserializedNode & -DeserializedNode::getEdgeReferent(const DeserializedEdge &edge) +DeserializedNode& +DeserializedNode::getEdgeReferent(const DeserializedEdge& edge) { auto ptr = owner->nodes.lookup(edge.referent); MOZ_ASSERT(ptr); @@ -126,7 +126,7 @@ using mozilla::devtools::DeserializedEdge; const char16_t Concrete::concreteTypeName[] = MOZ_UTF16("mozilla::devtools::DeserializedNode"); -const char16_t * +const char16_t* Concrete::typeName() const { return get().typeName; @@ -155,23 +155,23 @@ class DeserializedEdgeRange : public EdgeRange settle(); } - bool init(DeserializedNode &node) + bool init(DeserializedNode& node) { if (!edges.reserve(node.edges.length())) return false; - for (DeserializedEdge *edgep = node.edges.begin(); + for (DeserializedEdge* edgep = node.edges.begin(); edgep != node.edges.end(); edgep++) { - char16_t *name = nullptr; + char16_t* name = nullptr; if (edgep->name) { name = NS_strdup(edgep->name); if (!name) return false; } - DeserializedNode &referent = node.getEdgeReferent(*edgep); + DeserializedNode& referent = node.getEdgeReferent(*edgep); edges.infallibleAppend(mozilla::Move(SimpleEdge(name, Node(&referent)))); } diff --git a/toolkit/devtools/server/DeserializedNode.h b/toolkit/devtools/server/DeserializedNode.h index dcdf82441e743..876dec906d2bb 100644 --- a/toolkit/devtools/server/DeserializedNode.h +++ b/toolkit/devtools/server/DeserializedNode.h @@ -37,18 +37,18 @@ using NodeId = uint64_t; struct DeserializedEdge { NodeId referent; // A borrowed reference to a string owned by this node's owning HeapSnapshot. - const char16_t *name; + const char16_t* name; explicit DeserializedEdge(); - DeserializedEdge(DeserializedEdge &&rhs); - DeserializedEdge &operator=(DeserializedEdge &&rhs); + DeserializedEdge(DeserializedEdge&& rhs); + DeserializedEdge& operator=(DeserializedEdge&& rhs); // Initialize this `DeserializedEdge` from the given `protobuf::Edge` message. - bool init(const protobuf::Edge &edge, HeapSnapshot &owner); + bool init(const protobuf::Edge& edge, HeapSnapshot& owner); private: - DeserializedEdge(const DeserializedEdge &) = delete; - DeserializedEdge& operator=(const DeserializedEdge &) = delete; + DeserializedEdge(const DeserializedEdge&) = delete; + DeserializedEdge& operator=(const DeserializedEdge&) = delete; }; // A `DeserializedNode` is a node in the heap graph that we deserialized from a @@ -59,35 +59,35 @@ struct DeserializedNode { NodeId id; // A borrowed reference to a string owned by this node's owning HeapSnapshot. - const char16_t *typeName; + const char16_t* typeName; uint64_t size; EdgeVector edges; // A weak pointer to this node's owning `HeapSnapshot`. Safe without // AddRef'ing because this node's lifetime is equal to that of its owner. - HeapSnapshot *owner; + HeapSnapshot* owner; // Create a new `DeserializedNode` from the given `protobuf::Node` message. - static UniquePtr Create(const protobuf::Node &node, - HeapSnapshot &owner); + static UniquePtr Create(const protobuf::Node& node, + HeapSnapshot& owner); DeserializedNode(NodeId id, - const char16_t *typeName, + const char16_t* typeName, uint64_t size, - EdgeVector &&edges, - HeapSnapshot &owner); + EdgeVector&& edges, + HeapSnapshot& owner); virtual ~DeserializedNode() { } // Get a borrowed reference to the given edge's referent. This method is // virtual to provide a hook for gmock and gtest. - virtual DeserializedNode &getEdgeReferent(const DeserializedEdge &edge); + virtual DeserializedNode& getEdgeReferent(const DeserializedEdge& edge); protected: // This is only for use with `MockDeserializedNode` in testing. - DeserializedNode(NodeId id, const char16_t *typeName, uint64_t size); + DeserializedNode(NodeId id, const char16_t* typeName, uint64_t size); private: - DeserializedNode(const DeserializedNode &) = delete; - DeserializedNode &operator=(const DeserializedNode &) = delete; + DeserializedNode(const DeserializedNode&) = delete; + DeserializedNode& operator=(const DeserializedNode&) = delete; }; } // namespace devtools @@ -103,21 +103,21 @@ template<> struct Concrete : public Base { protected: - explicit Concrete(DeserializedNode *ptr) : Base(ptr) { } - DeserializedNode &get() const { - return *static_cast(ptr); + explicit Concrete(DeserializedNode* ptr) : Base(ptr) { } + DeserializedNode& get() const { + return *static_cast(ptr); } public: static const char16_t concreteTypeName[]; - static void construct(void *storage, DeserializedNode *ptr) { + static void construct(void* storage, DeserializedNode* ptr) { new (storage) Concrete(ptr); } Id identifier() const override { return get().id; } bool isLive() const override { return false; } - const char16_t *typeName() const override; + const char16_t* typeName() const override; size_t size(mozilla::MallocSizeOf mallocSizeof) const override; // We ignore the `bool wantNames` parameter because we can't control whether diff --git a/toolkit/devtools/server/HeapSnapshot.cpp b/toolkit/devtools/server/HeapSnapshot.cpp index 4b61e4eb3e647..b4decbd036f3d 100644 --- a/toolkit/devtools/server/HeapSnapshot.cpp +++ b/toolkit/devtools/server/HeapSnapshot.cpp @@ -46,18 +46,18 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(HeapSnapshot) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END -/* virtual */ JSObject * +/* virtual */ JSObject* HeapSnapshot::WrapObject(JSContext* aCx, JS::Handle aGivenProto) { return dom::HeapSnapshotBinding::Wrap(aCx, this, aGivenProto); } /* static */ already_AddRefed -HeapSnapshot::Create(JSContext *cx, - dom::GlobalObject &global, - const uint8_t *buffer, +HeapSnapshot::Create(JSContext* cx, + dom::GlobalObject& global, + const uint8_t* buffer, uint32_t size, - ErrorResult &rv) + ErrorResult& rv) { nsRefPtr snapshot = new HeapSnapshot(cx, global.GetAsSupports()); if (!snapshot->init(buffer, size)) { @@ -69,7 +69,7 @@ HeapSnapshot::Create(JSContext *cx, template static bool -parseMessage(ZeroCopyInputStream &stream, MessageType &message) +parseMessage(ZeroCopyInputStream& stream, MessageType& message) { // We need to create a new `CodedInputStream` for each message so that the // 64MB limit is applied per-message rather than to the whole stream. @@ -96,7 +96,7 @@ parseMessage(ZeroCopyInputStream &stream, MessageType &message) } bool -HeapSnapshot::saveNode(const protobuf::Node &node) +HeapSnapshot::saveNode(const protobuf::Node& node) { UniquePtr dn(DeserializedNode::Create(node, *this)); if (!dn) @@ -105,14 +105,14 @@ HeapSnapshot::saveNode(const protobuf::Node &node) } static inline bool -StreamHasData(GzipInputStream &stream) +StreamHasData(GzipInputStream& stream) { // Test for the end of the stream. The protobuf library gives no way to tell // the difference between an underlying read error and the stream being // done. All we can do is attempt to read data and extrapolate guestimations // from the result of that operation. - const void *buf; + const void* buf; int size; bool more = stream.Next(&buf, &size); if (!more) @@ -128,7 +128,7 @@ StreamHasData(GzipInputStream &stream) } bool -HeapSnapshot::init(const uint8_t *buffer, uint32_t size) +HeapSnapshot::init(const uint8_t* buffer, uint32_t size) { if (!nodes.init() || !strings.init()) return false; diff --git a/toolkit/devtools/server/HeapSnapshot.h b/toolkit/devtools/server/HeapSnapshot.h index 9d14c829633e5..ead729a9e5b38 100644 --- a/toolkit/devtools/server/HeapSnapshot.h +++ b/toolkit/devtools/server/HeapSnapshot.h @@ -61,7 +61,7 @@ class HeapSnapshot final : public nsISupports { friend struct DeserializedNode; - explicit HeapSnapshot(JSContext *cx, nsISupports *aParent) + explicit HeapSnapshot(JSContext* cx, nsISupports* aParent) : timestamp(Nothing()) , rootId(0) , nodes(cx) @@ -74,11 +74,11 @@ class HeapSnapshot final : public nsISupports // Initialize this HeapSnapshot from the given buffer that contains a // serialized core dump. Do NOT take ownership of the buffer, only borrow it // for the duration of the call. Return false on failure. - bool init(const uint8_t *buffer, uint32_t size); + bool init(const uint8_t* buffer, uint32_t size); // Save the given `protobuf::Node` message in this `HeapSnapshot` as a // `DeserializedNode`. - bool saveNode(const protobuf::Node &node); + bool saveNode(const protobuf::Node& node); // If present, a timestamp in the same units that `PR_Now` gives. Maybe timestamp; @@ -108,19 +108,19 @@ class HeapSnapshot final : public nsISupports // Create a `HeapSnapshot` from the given buffer that contains a serialized // core dump. Do NOT take ownership of the buffer, only borrow it for the // duration of the call. - static already_AddRefed Create(JSContext *cx, - dom::GlobalObject &global, - const uint8_t *buffer, + static already_AddRefed Create(JSContext* cx, + dom::GlobalObject& global, + const uint8_t* buffer, uint32_t size, - ErrorResult &rv); + ErrorResult& rv); NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(HeapSnapshot) MOZ_DECLARE_REFCOUNTED_TYPENAME(HeapSnapshot) - nsISupports *GetParentObject() const { return mParent; } + nsISupports* GetParentObject() const { return mParent; } - virtual JSObject *WrapObject(JSContext* aCx, + virtual JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; const char16_t* borrowUniqueString(const char16_t* duplicateString, diff --git a/toolkit/devtools/server/ZeroCopyNSIOutputStream.cpp b/toolkit/devtools/server/ZeroCopyNSIOutputStream.cpp index 41e85923eba1e..6a5a06e5be850 100644 --- a/toolkit/devtools/server/ZeroCopyNSIOutputStream.cpp +++ b/toolkit/devtools/server/ZeroCopyNSIOutputStream.cpp @@ -10,7 +10,7 @@ namespace mozilla { namespace devtools { -ZeroCopyNSIOutputStream::ZeroCopyNSIOutputStream(nsCOMPtr &out) +ZeroCopyNSIOutputStream::ZeroCopyNSIOutputStream(nsCOMPtr& out) : out(out) , result_(NS_OK) , amountUsed(0) @@ -57,7 +57,7 @@ ZeroCopyNSIOutputStream::writeBuffer() // ZeroCopyOutputStream Interface bool -ZeroCopyNSIOutputStream::Next(void **data, int *size) +ZeroCopyNSIOutputStream::Next(void** data, int* size) { MOZ_ASSERT(data != nullptr); MOZ_ASSERT(size != nullptr); diff --git a/toolkit/devtools/server/ZeroCopyNSIOutputStream.h b/toolkit/devtools/server/ZeroCopyNSIOutputStream.h index 80ec55dc6e0a6..117fc0f877e5b 100644 --- a/toolkit/devtools/server/ZeroCopyNSIOutputStream.h +++ b/toolkit/devtools/server/ZeroCopyNSIOutputStream.h @@ -28,7 +28,7 @@ class MOZ_STACK_CLASS ZeroCopyNSIOutputStream static const int BUFFER_SIZE = 8192; // The nsIOutputStream we are streaming to. - nsCOMPtr &out; + nsCOMPtr& out; // The buffer we write data to before passing it to the output stream. char buffer[BUFFER_SIZE]; @@ -48,7 +48,7 @@ class MOZ_STACK_CLASS ZeroCopyNSIOutputStream nsresult writeBuffer(); public: - explicit ZeroCopyNSIOutputStream(nsCOMPtr &out); + explicit ZeroCopyNSIOutputStream(nsCOMPtr& out); nsresult flush() { return writeBuffer(); } @@ -59,7 +59,7 @@ class MOZ_STACK_CLASS ZeroCopyNSIOutputStream // ZeroCopyOutputStream Interface virtual ~ZeroCopyNSIOutputStream() override; - virtual bool Next(void **data, int *size) override; + virtual bool Next(void** data, int* size) override; virtual void BackUp(int count) override; virtual ::google::protobuf::int64 ByteCount() const override; }; diff --git a/toolkit/devtools/server/tests/gtest/DeserializedNodeUbiNodes.cpp b/toolkit/devtools/server/tests/gtest/DeserializedNodeUbiNodes.cpp index 1795360b798fa..76d7845ee7f42 100644 --- a/toolkit/devtools/server/tests/gtest/DeserializedNodeUbiNodes.cpp +++ b/toolkit/devtools/server/tests/gtest/DeserializedNodeUbiNodes.cpp @@ -17,19 +17,19 @@ using testing::ReturnRef; // A mock DeserializedNode for testing. struct MockDeserializedNode : public DeserializedNode { - MockDeserializedNode(NodeId id, const char16_t *typeName, uint64_t size) + MockDeserializedNode(NodeId id, const char16_t* typeName, uint64_t size) : DeserializedNode(id, typeName, size) { } - bool addEdge(DeserializedEdge &&edge) + bool addEdge(DeserializedEdge&& edge) { return edges.append(Move(edge)); } - MOCK_METHOD1(getEdgeReferent, DeserializedNode &(const DeserializedEdge &)); + MOCK_METHOD1(getEdgeReferent, DeserializedNode&(const DeserializedEdge&)); }; -size_t fakeMallocSizeOf(const void *) { +size_t fakeMallocSizeOf(const void*) { EXPECT_TRUE(false); MOZ_ASSERT_UNREACHABLE("fakeMallocSizeOf should never be called because " "DeserializedNodes report the deserialized size."); @@ -37,13 +37,13 @@ size_t fakeMallocSizeOf(const void *) { } DEF_TEST(DeserializedNodeUbiNodes, { - const char16_t *typeName = MOZ_UTF16("TestTypeName"); + const char16_t* typeName = MOZ_UTF16("TestTypeName"); NodeId id = 1L << 33; uint64_t size = 1L << 60; MockDeserializedNode mocked(id, typeName, size); - DeserializedNode &deserialized = mocked; + DeserializedNode& deserialized = mocked; JS::ubi::Node ubi(&deserialized); // Test the ubi::Node accessors. diff --git a/toolkit/devtools/server/tests/gtest/DevTools.h b/toolkit/devtools/server/tests/gtest/DevTools.h index 35d38911a68b0..2842d5b6ef626 100644 --- a/toolkit/devtools/server/tests/gtest/DevTools.h +++ b/toolkit/devtools/server/tests/gtest/DevTools.h @@ -26,10 +26,10 @@ using namespace testing; // GTest fixture class that all of our tests derive from. struct DevTools : public ::testing::Test { bool _initialized; - JSRuntime *rt; - JSContext *cx; - JSCompartment *compartment; - JS::Zone *zone; + JSRuntime* rt; + JSContext* cx; + JSCompartment* compartment; + JS::Zone* zone; JS::PersistentRootedObject global; DevTools() @@ -65,7 +65,7 @@ struct DevTools : public ::testing::Test { return CycleCollectedJSRuntime::Get()->Runtime(); } - static void setNativeStackQuota(JSRuntime *rt) + static void setNativeStackQuota(JSRuntime* rt) { const size_t MAX_STACK_SIZE = /* Assume we can't use more than 5e5 bytes of C stack by default. */ @@ -83,18 +83,18 @@ struct DevTools : public ::testing::Test { JS_SetNativeStackQuota(rt, MAX_STACK_SIZE); } - static void reportError(JSContext *cx, const char *message, JSErrorReport *report) { + static void reportError(JSContext* cx, const char* message, JSErrorReport* report) { fprintf(stderr, "%s:%u:%s\n", report->filename ? report->filename : "", (unsigned int) report->lineno, message); } - JSContext *createContext() { + JSContext* createContext() { return JS_NewContext(rt, 8192); } - static const JSClass *getGlobalClass() { + static const JSClass* getGlobalClass() { static const JSClass globalClass = { "global", JSCLASS_GLOBAL_FLAGS, nullptr, nullptr, nullptr, nullptr, @@ -105,7 +105,7 @@ struct DevTools : public ::testing::Test { return &globalClass; } - JSObject *createGlobal() + JSObject* createGlobal() { /* Create the global object. */ JS::RootedObject newGlobal(cx); @@ -151,7 +151,6 @@ struct DevTools : public ::testing::Test { // Fake JS::ubi::Node implementation - class MOZ_STACK_CLASS FakeNode { public: @@ -212,8 +211,8 @@ const char16_t Concrete::concreteTypeName[] = MOZ_UTF16("FakeNode"); } // namespace ubi } // namespace JS -void AddEdge(FakeNode &node, FakeNode &referent, const char16_t *edgeName = nullptr) { - char16_t *ownedEdgeName = nullptr; +void AddEdge(FakeNode& node, FakeNode& referent, const char16_t* edgeName = nullptr) { + char16_t* ownedEdgeName = nullptr; if (edgeName) { ownedEdgeName = NS_strdup(edgeName); ASSERT_NE(ownedEdgeName, nullptr); @@ -253,7 +252,7 @@ MATCHER_P3(Edge, cx, n, matcher, "") { int i = 0; for ( ; !edges->empty(); edges->popFront()) { if (i == n) { - return Matcher(matcher) + return Matcher(matcher) .MatchAndExplain(edges->front(), result_listener); } @@ -276,11 +275,11 @@ class MockWriter : public CoreDumpWriter { public: virtual ~MockWriter() override { } - MOCK_METHOD2(writeNode, bool(const JS::ubi::Node &, CoreDumpWriter::EdgePolicy)); + MOCK_METHOD2(writeNode, bool(const JS::ubi::Node&, CoreDumpWriter::EdgePolicy)); MOCK_METHOD1(writeMetadata, bool(uint64_t)); }; -void ExpectWriteNode(MockWriter &writer, FakeNode &node) { +void ExpectWriteNode(MockWriter& writer, FakeNode& node) { EXPECT_CALL(writer, writeNode(Eq(JS::ubi::Node(&node)), _)) .Times(1) .WillOnce(Return(true)); diff --git a/toolkit/devtools/server/tests/gtest/DoesCrossZoneBoundaries.cpp b/toolkit/devtools/server/tests/gtest/DoesCrossZoneBoundaries.cpp index 9bc92fa334859..c2c54816f33b7 100644 --- a/toolkit/devtools/server/tests/gtest/DoesCrossZoneBoundaries.cpp +++ b/toolkit/devtools/server/tests/gtest/DoesCrossZoneBoundaries.cpp @@ -14,7 +14,7 @@ DEF_TEST(DoesCrossZoneBoundaries, { nullptr, JS::FireOnNewGlobalHook)); ASSERT_TRUE(newGlobal); - JS::Zone *newZone = nullptr; + JS::Zone* newZone = nullptr; { JSAutoCompartment ac(cx, newGlobal); ASSERT_TRUE(JS_InitStandardClasses(cx, newGlobal)); diff --git a/toolkit/devtools/server/tests/gtest/DoesntCrossZoneBoundaries.cpp b/toolkit/devtools/server/tests/gtest/DoesntCrossZoneBoundaries.cpp index cbfa9999e5f57..75e1039d330ff 100644 --- a/toolkit/devtools/server/tests/gtest/DoesntCrossZoneBoundaries.cpp +++ b/toolkit/devtools/server/tests/gtest/DoesntCrossZoneBoundaries.cpp @@ -14,7 +14,7 @@ DEF_TEST(DoesntCrossZoneBoundaries, { nullptr, JS::FireOnNewGlobalHook)); ASSERT_TRUE(newGlobal); - JS::Zone *newZone = nullptr; + JS::Zone* newZone = nullptr; { JSAutoCompartment ac(cx, newGlobal); ASSERT_TRUE(JS_InitStandardClasses(cx, newGlobal)); From 0e14428443f894f91422f6a890168390996a6daf Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:43 -0700 Subject: [PATCH 057/151] Bug 1024774 - Part 14: Ignore protobuf indirect calls in the GC hazard analysis; r=sfink --- js/src/devtools/rootAnalysis/annotations.js | 45 ++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/js/src/devtools/rootAnalysis/annotations.js b/js/src/devtools/rootAnalysis/annotations.js index 704a19c27d233..72cd464a6d149 100644 --- a/js/src/devtools/rootAnalysis/annotations.js +++ b/js/src/devtools/rootAnalysis/annotations.js @@ -13,7 +13,7 @@ var ignoreIndirectCalls = { "__conv" : true, "__convf" : true, "prerrortable.c:callback_newtable" : true, - "mozalloc_oom.cpp:void (* gAbortHandler)(size_t)" : true + "mozalloc_oom.cpp:void (* gAbortHandler)(size_t)" : true, }; function indirectCallCannotGC(fullCaller, fullVariable) @@ -180,8 +180,34 @@ var ignoreFunctions = { // analysis think maybe they can. "nsGlobalNameStruct* nsScriptNameSpaceManager::LookupNavigatorName(nsAString_internal*)": true, "nsGlobalNameStruct* nsScriptNameSpaceManager::LookupName(nsAString_internal*, uint16**)": true, + + // Similar to heap snapshot mock classes, and GTests below. This posts a + // synchronous runnable when a GTest fails, and we are pretty sure that the + // particular runnable it posts can't even GC, but the analysis isn't + // currently smart enough to determine that. In either case, this is (a) + // only in GTests, and (b) only when the Gtest has already failed. We have + // static and dynamic checks for no GC in the non-test code, and in the test + // code we fall back to only the dynamic checks. + "void test::RingbufferDumper::OnTestPartResult(testing::TestPartResult*)" : true, }; +function isProtobuf(name) +{ + return name.match(/\bgoogle::protobuf\b/) || + name.match(/\bmozilla::devtools::protobuf\b/); +} + +function isHeapSnapshotMockClass(name) +{ + return name.match(/\bMockWriter\b/) || + name.match(/\bMockDeserializedNode\b/); +} + +function isGTest(name) +{ + return name.match(/\btesting::/); +} + function ignoreGCFunction(mangled) { assert(mangled in readableNames); @@ -190,6 +216,23 @@ function ignoreGCFunction(mangled) if (fun in ignoreFunctions) return true; + // The protobuf library, and [de]serialization code generated by the + // protobuf compiler, uses a _ton_ of function pointers but they are all + // internal. Easiest to just ignore that mess here. + if (isProtobuf(fun)) + return true; + + // Ignore anything that goes through heap snapshot GTests or mocked classes + // used in heap snapshot GTests. GTest and GMock expose a lot of virtual + // methods and function pointers that could potentially GC after an + // assertion has already failed (depending on user-provided code), but don't + // exhibit that behavior currently. For non-test code, we have dynamic and + // static checks that ensure we don't GC. However, for test code we opt out + // of static checks here, because of the above stated GMock/GTest issues, + // and rely on only the dynamic checks provided by AutoAssertCannotGC. + if (isHeapSnapshotMockClass(fun) || isGTest(fun)) + return true; + // Templatized function if (fun.indexOf("void nsCOMPtr::Assert_NoQueryNeeded()") >= 0) return true; From bb41d221a30796c5af139dbc15b499dcb28e56e6 Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Thu, 28 May 2015 07:37:43 -0700 Subject: [PATCH 058/151] Bug 1024774 - Followup: Don't redefine the Debugger property in xpcshell tests; r=jorendorff --- .../devtools/server/tests/unit/test_ReadHeapSnapshot.js | 7 ++++--- .../devtools/server/tests/unit/test_SaveHeapSnapshot.js | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/toolkit/devtools/server/tests/unit/test_ReadHeapSnapshot.js b/toolkit/devtools/server/tests/unit/test_ReadHeapSnapshot.js index 44e91a209a9b3..21500da3f1150 100644 --- a/toolkit/devtools/server/tests/unit/test_ReadHeapSnapshot.js +++ b/toolkit/devtools/server/tests/unit/test_ReadHeapSnapshot.js @@ -3,9 +3,10 @@ // Test that we can read core dumps into HeapSnapshot instances. -const { addDebuggerToGlobal } = Cu.import("resource://gre/modules/jsdebugger.jsm", {}); -var Debugger; -addDebuggerToGlobal(this); +if (typeof Debugger != "function") { + const { addDebuggerToGlobal } = Cu.import("resource://gre/modules/jsdebugger.jsm", {}); + addDebuggerToGlobal(this); +} function run_test() { const filePath = getFilePath("core-dump.tmp", true, true); diff --git a/toolkit/devtools/server/tests/unit/test_SaveHeapSnapshot.js b/toolkit/devtools/server/tests/unit/test_SaveHeapSnapshot.js index ef37383ac3d7d..3d46e3b1056d4 100644 --- a/toolkit/devtools/server/tests/unit/test_SaveHeapSnapshot.js +++ b/toolkit/devtools/server/tests/unit/test_SaveHeapSnapshot.js @@ -3,9 +3,10 @@ // Test the ChromeUtils interface. -const { addDebuggerToGlobal } = Cu.import("resource://gre/modules/jsdebugger.jsm", {}); -var Debugger; -addDebuggerToGlobal(this); +if (typeof Debugger != "function") { + const { addDebuggerToGlobal } = Cu.import("resource://gre/modules/jsdebugger.jsm", {}); + addDebuggerToGlobal(this); +} function run_test() { ok(ChromeUtils, "Should be able to get the ChromeUtils interface"); From 47b8771d370363653f389fcf735d2e80fd397ab1 Mon Sep 17 00:00:00 2001 From: Ben Kelly Date: Thu, 28 May 2015 07:46:47 -0700 Subject: [PATCH 059/151] Bug 1168135 P1 Execute Cache init Action on same target thread used for other Actions. r=ehsan --- dom/cache/Context.cpp | 51 ++++++++++++++++++++++++++++++------------- dom/cache/Context.h | 2 +- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/dom/cache/Context.cpp b/dom/cache/Context.cpp index de69e4cc9363d..2cf550c22b44c 100644 --- a/dom/cache/Context.cpp +++ b/dom/cache/Context.cpp @@ -131,11 +131,13 @@ class Context::QuotaInitRunnable final : public nsIRunnable public: QuotaInitRunnable(Context* aContext, Manager* aManager, - Action* aQuotaIOThreadAction) + nsIThread* aTarget, + Action* aInitAction) : mContext(aContext) , mThreadsafeHandle(aContext->CreateThreadsafeHandle()) , mManager(aManager) - , mQuotaIOThreadAction(aQuotaIOThreadAction) + , mTarget(aTarget) + , mInitAction(aInitAction) , mInitiatingThread(NS_GetCurrentThread()) , mResult(NS_OK) , mState(STATE_INIT) @@ -144,6 +146,7 @@ class Context::QuotaInitRunnable final : public nsIRunnable { MOZ_ASSERT(mContext); MOZ_ASSERT(mManager); + MOZ_ASSERT(mTarget); MOZ_ASSERT(mInitiatingThread); } @@ -166,7 +169,7 @@ class Context::QuotaInitRunnable final : public nsIRunnable NS_ASSERT_OWNINGTHREAD(QuotaInitRunnable); MOZ_ASSERT(!mCanceled); mCanceled = true; - mQuotaIOThreadAction->CancelOnInitiatingThread(); + mInitAction->CancelOnInitiatingThread(); } private: @@ -202,7 +205,7 @@ class Context::QuotaInitRunnable final : public nsIRunnable { MOZ_ASSERT(mState == STATE_COMPLETE); MOZ_ASSERT(!mContext); - MOZ_ASSERT(!mQuotaIOThreadAction); + MOZ_ASSERT(!mInitAction); } enum State @@ -211,6 +214,7 @@ class Context::QuotaInitRunnable final : public nsIRunnable STATE_CALL_WAIT_FOR_OPEN_ALLOWED, STATE_WAIT_FOR_OPEN_ALLOWED, STATE_ENSURE_ORIGIN_INITIALIZED, + STATE_RUN_ON_TARGET, STATE_RUNNING, STATE_COMPLETING, STATE_COMPLETE @@ -222,13 +226,14 @@ class Context::QuotaInitRunnable final : public nsIRunnable MOZ_ASSERT(mContext); mContext = nullptr; mManager = nullptr; - mQuotaIOThreadAction = nullptr; + mInitAction = nullptr; } nsRefPtr mContext; nsRefPtr mThreadsafeHandle; nsRefPtr mManager; - nsRefPtr mQuotaIOThreadAction; + nsCOMPtr mTarget; + nsRefPtr mInitAction; nsCOMPtr mInitiatingThread; nsresult mResult; QuotaInfo mQuotaInfo; @@ -266,9 +271,14 @@ NS_IMPL_ISUPPORTS(mozilla::dom::cache::Context::QuotaInitRunnable, nsIRunnable); // | (Quota IO Thread) +----------------+ // +----------+------------+ | // | | +// +----------v------------+ | +// | RunOnTarget | Resolve(error) | +// | (Target Thread) +----------------+ +// +----------+------------+ | +// | | // +---------v---------+ +------v------+ // | Running | | Completing | -// | (Quota IO Thread) +------------>(Orig Thread)| +// | (Target Thread) +------------>(Orig Thread)| // +-------------------+ +------+------+ // | // +-----v----+ @@ -384,16 +394,27 @@ Context::QuotaInitRunnable::Run() break; } - mState = STATE_RUNNING; - - if (!mQuotaIOThreadAction) { + if (!mInitAction) { resolver->Resolve(NS_OK); break; } + mState = STATE_RUN_ON_TARGET; + + MOZ_ALWAYS_TRUE(NS_SUCCEEDED( + mTarget->Dispatch(this, nsIThread::DISPATCH_NORMAL))); + break; + } + // ------------------- + case STATE_RUN_ON_TARGET: + { + MOZ_ASSERT(NS_GetCurrentThread() == mTarget); + + mState = STATE_RUNNING; + // Execute the provided initialization Action. The Action must Resolve() // before returning. - mQuotaIOThreadAction->RunOnTarget(resolver, mQuotaInfo, nullptr); + mInitAction->RunOnTarget(resolver, mQuotaInfo, nullptr); MOZ_ASSERT(resolver->Resolved()); break; @@ -402,8 +423,8 @@ Context::QuotaInitRunnable::Run() case STATE_COMPLETING: { NS_ASSERT_OWNINGTHREAD(QuotaInitRunnable); - if (mQuotaIOThreadAction) { - mQuotaIOThreadAction->CompleteOnInitiatingThread(mResult); + if (mInitAction) { + mInitAction->CompleteOnInitiatingThread(mResult); } mContext->OnQuotaInit(mResult, mQuotaInfo, mOfflineStorage); mState = STATE_COMPLETE; @@ -776,14 +797,14 @@ Context::ThreadsafeHandle::ContextDestroyed(Context* aContext) // static already_AddRefed Context::Create(Manager* aManager, nsIThread* aTarget, - Action* aQuotaIOThreadAction, Context* aOldContext) + Action* aInitAction, Context* aOldContext) { nsRefPtr context = new Context(aManager, aTarget); // Do this here to avoid doing an AddRef() in the constructor // TODO: pass context->mData to allow connetion sharing with init context->mInitRunnable = new QuotaInitRunnable(context, aManager, - aQuotaIOThreadAction); + aTarget, aInitAction); if (aOldContext) { aOldContext->SetNextContext(context); diff --git a/dom/cache/Context.h b/dom/cache/Context.h index 50e705f380ebd..3b010ca87364b 100644 --- a/dom/cache/Context.h +++ b/dom/cache/Context.h @@ -112,7 +112,7 @@ class Context final // be execute synchronously. static already_AddRefed Create(Manager* aManager, nsIThread* aTarget, - Action* aQuotaIOThreadAction, Context* aOldContext); + Action* aInitAction, Context* aOldContext); // Execute given action on the target once the quota manager has been // initialized. From 02392e2639cb40c162402b8244362f641a7dc6e1 Mon Sep 17 00:00:00 2001 From: Ben Kelly Date: Thu, 28 May 2015 07:46:47 -0700 Subject: [PATCH 060/151] Bug 1168135 P2 Add Cache Context::Init() method. r=ehsan --- dom/cache/Context.cpp | 31 +++++++++++++++++++------------ dom/cache/Context.h | 1 + 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/dom/cache/Context.cpp b/dom/cache/Context.cpp index 2cf550c22b44c..3187f58be3e99 100644 --- a/dom/cache/Context.cpp +++ b/dom/cache/Context.cpp @@ -800,18 +800,7 @@ Context::Create(Manager* aManager, nsIThread* aTarget, Action* aInitAction, Context* aOldContext) { nsRefPtr context = new Context(aManager, aTarget); - - // Do this here to avoid doing an AddRef() in the constructor - // TODO: pass context->mData to allow connetion sharing with init - context->mInitRunnable = new QuotaInitRunnable(context, aManager, - aTarget, aInitAction); - - if (aOldContext) { - aOldContext->SetNextContext(context); - } else { - context->Start(); - } - + context->Init(aInitAction, aOldContext); return context.forget(); } @@ -934,6 +923,24 @@ Context::~Context() } } +void +Context::Init(Action* aInitAction, Context* aOldContext) +{ + NS_ASSERT_OWNINGTHREAD(Context); + MOZ_ASSERT(!mInitRunnable); + + // Do this here to avoid doing an AddRef() in the constructor + // TODO: pass context->mData to allow connetion sharing with init + mInitRunnable = new QuotaInitRunnable(this, mManager, mTarget, aInitAction); + + if (aOldContext) { + aOldContext->SetNextContext(this); + return; + } + + Start(); +} + void Context::Start() { diff --git a/dom/cache/Context.h b/dom/cache/Context.h index 3b010ca87364b..4dfe7c9fd1ea5 100644 --- a/dom/cache/Context.h +++ b/dom/cache/Context.h @@ -173,6 +173,7 @@ class Context final Context(Manager* aManager, nsIThread* aTarget); ~Context(); + void Init(Action* aInitAction, Context* aOldContext); void Start(); void DispatchAction(Action* aAction, bool aDoomData = false); void OnQuotaInit(nsresult aRv, const QuotaInfo& aQuotaInfo, From ac3f20c81e3cd3b10b143afcb6055b57a8568a05 Mon Sep 17 00:00:00 2001 From: Ben Kelly Date: Thu, 28 May 2015 07:46:47 -0700 Subject: [PATCH 061/151] Bug 1168135 P3 Cache Context should pass shared Data container to init Action. r=ehsan --- dom/cache/Context.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dom/cache/Context.cpp b/dom/cache/Context.cpp index 3187f58be3e99..6515477890c45 100644 --- a/dom/cache/Context.cpp +++ b/dom/cache/Context.cpp @@ -131,11 +131,13 @@ class Context::QuotaInitRunnable final : public nsIRunnable public: QuotaInitRunnable(Context* aContext, Manager* aManager, + Data* aData, nsIThread* aTarget, Action* aInitAction) : mContext(aContext) , mThreadsafeHandle(aContext->CreateThreadsafeHandle()) , mManager(aManager) + , mData(aData) , mTarget(aTarget) , mInitAction(aInitAction) , mInitiatingThread(NS_GetCurrentThread()) @@ -146,6 +148,7 @@ class Context::QuotaInitRunnable final : public nsIRunnable { MOZ_ASSERT(mContext); MOZ_ASSERT(mManager); + MOZ_ASSERT(mData); MOZ_ASSERT(mTarget); MOZ_ASSERT(mInitiatingThread); } @@ -232,6 +235,7 @@ class Context::QuotaInitRunnable final : public nsIRunnable nsRefPtr mContext; nsRefPtr mThreadsafeHandle; nsRefPtr mManager; + nsRefPtr mData; nsCOMPtr mTarget; nsRefPtr mInitAction; nsCOMPtr mInitiatingThread; @@ -414,7 +418,7 @@ Context::QuotaInitRunnable::Run() // Execute the provided initialization Action. The Action must Resolve() // before returning. - mInitAction->RunOnTarget(resolver, mQuotaInfo, nullptr); + mInitAction->RunOnTarget(resolver, mQuotaInfo, mData); MOZ_ASSERT(resolver->Resolved()); break; @@ -930,8 +934,8 @@ Context::Init(Action* aInitAction, Context* aOldContext) MOZ_ASSERT(!mInitRunnable); // Do this here to avoid doing an AddRef() in the constructor - // TODO: pass context->mData to allow connetion sharing with init - mInitRunnable = new QuotaInitRunnable(this, mManager, mTarget, aInitAction); + mInitRunnable = new QuotaInitRunnable(this, mManager, mData, mTarget, + aInitAction); if (aOldContext) { aOldContext->SetNextContext(this); From aee2720d229c7a4598a174f847a5d214d8581ce3 Mon Sep 17 00:00:00 2001 From: Ben Kelly Date: Thu, 28 May 2015 07:46:47 -0700 Subject: [PATCH 062/151] Bug 1168152 P1 Use a smaller sqlite page size and a growth increment in Cache. r=ehsan --- dom/cache/DBSchema.cpp | 55 +++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/dom/cache/DBSchema.cpp b/dom/cache/DBSchema.cpp index c2bed77f63f1c..45b951fdf00e7 100644 --- a/dom/cache/DBSchema.cpp +++ b/dom/cache/DBSchema.cpp @@ -29,13 +29,27 @@ namespace dom { namespace cache { namespace db { -const int32_t kMaxWipeSchemaVersion = 9; +const int32_t kMaxWipeSchemaVersion = 10; namespace { -const int32_t kLatestSchemaVersion = 9; +const int32_t kLatestSchemaVersion = 10; const int32_t kMaxEntriesPerStatement = 255; +const uint32_t kPageSize = 4 * 1024; + +// Grow the database in chunks to reduce fragmentation +const uint32_t kGrowthSize = 64 * 1024; +const uint32_t kGrowthPages = kGrowthSize / kPageSize; +static_assert(kGrowthSize % kPageSize == 0, + "Growth size must be multiple of page size"); + +// Limit WAL journal to a reasonable size +const uint32_t kWalAutoCheckpointSize = 512 * 1024; +const uint32_t kWalAutoCheckpointPages = kWalAutoCheckpointSize / kPageSize; +static_assert(kWalAutoCheckpointSize % kPageSize == 0, + "WAL checkpoint size must be multiple of page size"); + } // anonymous namespace // If any of the static_asserts below fail, it means that you have changed @@ -380,24 +394,37 @@ InitializeConnection(mozIStorageConnection* aConn) // This function needs to perform per-connection initialization tasks that // need to happen regardless of the schema. - nsAutoCString pragmas( + nsPrintfCString pragmas( + // Use a smaller page size to improve perf/footprint; default is too large + "PRAGMA page_size = %u; " + // WAL journal can grow to given number of *pages* + "PRAGMA wal_autocheckpoint = %u; " + // Always truncate the journal back to given number of *bytes* + "PRAGMA journal_size_limit = %u; " + // WAL must be enabled at the end to allow page size to be changed, etc. "PRAGMA journal_mode = WAL; " - // Use default mozStorage 32kb page size for now - // WAL journal can grow to 512kb before being flushed to disk - "PRAGMA wal_autocheckpoint = 16; " - // Always truncate the journal back to 512kb after large transactions - "PRAGMA journal_size_limit = 524288; " - "PRAGMA foreign_keys = ON; " - - // Note, the default encoding of UTF-8 is preferred. mozStorage does all - // the work necessary to convert UTF-16 nsString values for us. We don't - // need ordering and the binary equality operations are correct. So, do - // NOT set PRAGMA encoding to UTF-16. + "PRAGMA foreign_keys = ON; ", + kPageSize, + kWalAutoCheckpointPages, + kWalAutoCheckpointSize ); + // Note, the default encoding of UTF-8 is preferred. mozStorage does all + // the work necessary to convert UTF-16 nsString values for us. We don't + // need ordering and the binary equality operations are correct. So, do + // NOT set PRAGMA encoding to UTF-16. + nsresult rv = aConn->ExecuteSimpleSQL(pragmas); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + // Limit fragmentation by growing the database by many pages at once. + rv = aConn->SetGrowthIncrement(kGrowthSize, EmptyCString()); + if (rv == NS_ERROR_FILE_TOO_BIG) { + NS_WARNING("Not enough disk space to set sqlite growth increment."); + rv = NS_OK; + } + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + return NS_OK; } From 6ea4923572335ce53df97fb5e798cc8049890f5f Mon Sep 17 00:00:00 2001 From: Ben Kelly Date: Thu, 28 May 2015 07:46:47 -0700 Subject: [PATCH 063/151] Bug 1168152 P2 Use a wrapper mozIStorageConnection for shared Cache connections. r=ehsan --- dom/cache/Connection.cpp | 260 +++++++++++++++++++++++++++++++++++++++ dom/cache/Connection.h | 35 ++++++ dom/cache/DBAction.cpp | 12 +- dom/cache/moz.build | 2 + 4 files changed, 306 insertions(+), 3 deletions(-) create mode 100644 dom/cache/Connection.cpp create mode 100644 dom/cache/Connection.h diff --git a/dom/cache/Connection.cpp b/dom/cache/Connection.cpp new file mode 100644 index 0000000000000..0557cc3f81c68 --- /dev/null +++ b/dom/cache/Connection.cpp @@ -0,0 +1,260 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/dom/cache/Connection.h" + +namespace mozilla { +namespace dom { +namespace cache { + +NS_IMPL_ISUPPORTS(cache::Connection, mozIStorageAsyncConnection, + mozIStorageConnection); + +Connection::Connection(mozIStorageConnection* aBase) + : mBase(aBase) +{ + MOZ_ASSERT(mBase); +} + +Connection::~Connection() +{ +} + +// The following methods are all boilerplate that either forward to the +// base connection or block the method. All the async execution methods +// are blocked because Cache does not use them and they would require more +// work to wrap properly. + +// mozIStorageAsyncConnection methods + +NS_IMETHODIMP +Connection::AsyncClose(mozIStorageCompletionCallback*) +{ + // async methods are not supported + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +Connection::AsyncClone(bool, mozIStorageCompletionCallback*) +{ + // async methods are not supported + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +Connection::GetDatabaseFile(nsIFile** aFileOut) +{ + return mBase->GetDatabaseFile(aFileOut); +} + +NS_IMETHODIMP +Connection::CreateAsyncStatement(const nsACString&, mozIStorageAsyncStatement**) +{ + // async methods are not supported + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +Connection::ExecuteAsync(mozIStorageBaseStatement**, uint32_t, + mozIStorageStatementCallback*, + mozIStoragePendingStatement**) +{ + // async methods are not supported + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +Connection::ExecuteSimpleSQLAsync(const nsACString&, + mozIStorageStatementCallback*, + mozIStoragePendingStatement**) +{ + // async methods are not supported + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +Connection::CreateFunction(const nsACString& aFunctionName, + int32_t aNumArguments, + mozIStorageFunction* aFunction) +{ + // async methods are not supported + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +Connection::CreateAggregateFunction(const nsACString& aFunctionName, + int32_t aNumArguments, + mozIStorageAggregateFunction* aFunction) +{ + return mBase->CreateAggregateFunction(aFunctionName, aNumArguments, + aFunction); +} + +NS_IMETHODIMP +Connection::RemoveFunction(const nsACString& aFunctionName) +{ + return mBase->RemoveFunction(aFunctionName); +} + +NS_IMETHODIMP +Connection::SetProgressHandler(int32_t aGranularity, + mozIStorageProgressHandler* aHandler, + mozIStorageProgressHandler** aHandlerOut) +{ + return mBase->SetProgressHandler(aGranularity, aHandler, aHandlerOut); +} + +NS_IMETHODIMP +Connection::RemoveProgressHandler(mozIStorageProgressHandler** aHandlerOut) +{ + return mBase->RemoveProgressHandler(aHandlerOut); +} + +// mozIStorageConnection methods + +NS_IMETHODIMP +Connection::Close() +{ + return mBase->Close(); +} + +NS_IMETHODIMP +Connection::Clone(bool aReadOnly, mozIStorageConnection** aConnectionOut) +{ + nsCOMPtr conn; + nsresult rv = mBase->Clone(aReadOnly, getter_AddRefs(conn)); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + nsCOMPtr wrapped = new Connection(conn); + wrapped.forget(aConnectionOut); + + return rv; +} + +NS_IMETHODIMP +Connection::GetDefaultPageSize(int32_t* aSizeOut) +{ + return mBase->GetDefaultPageSize(aSizeOut); +} + +NS_IMETHODIMP +Connection::GetConnectionReady(bool* aReadyOut) +{ + return mBase->GetConnectionReady(aReadyOut); +} + +NS_IMETHODIMP +Connection::GetLastInsertRowID(int64_t* aRowIdOut) +{ + return mBase->GetLastInsertRowID(aRowIdOut); +} + +NS_IMETHODIMP +Connection::GetAffectedRows(int32_t* aCountOut) +{ + return mBase->GetAffectedRows(aCountOut); +} + +NS_IMETHODIMP +Connection::GetLastError(int32_t* aErrorOut) +{ + return mBase->GetLastError(aErrorOut); +} + +NS_IMETHODIMP +Connection::GetLastErrorString(nsACString& aErrorOut) +{ + return mBase->GetLastErrorString(aErrorOut); +} + +NS_IMETHODIMP +Connection::GetSchemaVersion(int32_t* aVersionOut) +{ + return mBase->GetSchemaVersion(aVersionOut); +} + +NS_IMETHODIMP +Connection::SetSchemaVersion(int32_t aVersion) +{ + return mBase->SetSchemaVersion(aVersion); +} + +NS_IMETHODIMP +Connection::CreateStatement(const nsACString& aQuery, + mozIStorageStatement** aStatementOut) +{ + return mBase->CreateStatement(aQuery, aStatementOut); +} + +NS_IMETHODIMP +Connection::ExecuteSimpleSQL(const nsACString& aQuery) +{ + return mBase->ExecuteSimpleSQL(aQuery); +} + +NS_IMETHODIMP +Connection::TableExists(const nsACString& aTableName, bool* aExistsOut) +{ + return mBase->TableExists(aTableName, aExistsOut); +} + +NS_IMETHODIMP +Connection::IndexExists(const nsACString& aIndexName, bool* aExistsOut) +{ + return mBase->IndexExists(aIndexName, aExistsOut); +} + +NS_IMETHODIMP +Connection::GetTransactionInProgress(bool* aResultOut) +{ + return mBase->GetTransactionInProgress(aResultOut); +} + +NS_IMETHODIMP +Connection::BeginTransaction() +{ + return mBase->BeginTransaction(); +} + +NS_IMETHODIMP +Connection::BeginTransactionAs(int32_t aType) +{ + return mBase->BeginTransactionAs(aType); +} + +NS_IMETHODIMP +Connection::CommitTransaction() +{ + return mBase->CommitTransaction(); +} + +NS_IMETHODIMP +Connection::RollbackTransaction() +{ + return mBase->RollbackTransaction(); +} + +NS_IMETHODIMP +Connection::CreateTable(const char* aTable, const char* aSchema) +{ + return mBase->CreateTable(aTable, aSchema); +} + +NS_IMETHODIMP +Connection::SetGrowthIncrement(int32_t aIncrement, const nsACString& aDatabase) +{ + return mBase->SetGrowthIncrement(aIncrement, aDatabase); +} + +NS_IMETHODIMP +Connection::EnableModule(const nsACString& aModule) +{ + return mBase->EnableModule(aModule); +} + +} // namespace cache +} // namespace dom +} // namespace mozilla diff --git a/dom/cache/Connection.h b/dom/cache/Connection.h new file mode 100644 index 0000000000000..7b9c0441aeca8 --- /dev/null +++ b/dom/cache/Connection.h @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_cache_Connection_h +#define mozilla_dom_cache_Connection_h + +#include "mozIStorageConnection.h" + +namespace mozilla { +namespace dom { +namespace cache { + +class Connection final : public mozIStorageConnection +{ +public: + explicit Connection(mozIStorageConnection* aBase); + +private: + ~Connection(); + + nsCOMPtr mBase; + + NS_DECL_ISUPPORTS + NS_DECL_MOZISTORAGEASYNCCONNECTION + NS_DECL_MOZISTORAGECONNECTION +}; + +} // namespace cache +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_cache_Connection_h diff --git a/dom/cache/DBAction.cpp b/dom/cache/DBAction.cpp index 8073cecd1b96a..bb99933162846 100644 --- a/dom/cache/DBAction.cpp +++ b/dom/cache/DBAction.cpp @@ -6,6 +6,9 @@ #include "mozilla/dom/cache/DBAction.h" +#include "mozilla/dom/cache/Connection.h" +#include "mozilla/dom/cache/DBSchema.h" +#include "mozilla/dom/cache/FileUtils.h" #include "mozilla/dom/quota/PersistenceType.h" #include "mozilla/net/nsFileProtocolHandler.h" #include "mozIStorageConnection.h" @@ -15,8 +18,6 @@ #include "nsIURI.h" #include "nsNetUtil.h" #include "nsThreadUtils.h" -#include "DBSchema.h" -#include "FileUtils.h" namespace mozilla { namespace dom { @@ -79,7 +80,12 @@ DBAction::RunOnTarget(Resolver* aResolver, const QuotaInfo& aQuotaInfo, // Save this connection in the shared Data object so later Actions can // use it. This avoids opening a new connection for every Action. if (aOptionalData) { - aOptionalData->SetConnection(conn); + // Since we know this connection will be around for as long as the + // Cache is open, use our special wrapped connection class. This + // will let us perform certain operations once the Cache origin + // is closed. + nsCOMPtr wrapped = new Connection(conn); + aOptionalData->SetConnection(wrapped); } } diff --git a/dom/cache/moz.build b/dom/cache/moz.build index 3f672aafff390..7b71a453e9d17 100644 --- a/dom/cache/moz.build +++ b/dom/cache/moz.build @@ -21,6 +21,7 @@ EXPORTS.mozilla.dom.cache += [ 'CacheStorageParent.h', 'CacheStreamControlChild.h', 'CacheStreamControlParent.h', + 'Connection.h', 'Context.h', 'DBAction.h', 'DBSchema.h', @@ -56,6 +57,7 @@ UNIFIED_SOURCES += [ 'CacheStorageParent.cpp', 'CacheStreamControlChild.cpp', 'CacheStreamControlParent.cpp', + 'Connection.cpp', 'Context.cpp', 'DBAction.cpp', 'DBSchema.cpp', From dbbf4fbc4a7dccc54503218dc84dcf567d6d422c Mon Sep 17 00:00:00 2001 From: Ben Kelly Date: Thu, 28 May 2015 07:46:47 -0700 Subject: [PATCH 064/151] Bug 1168152 P3 Perform incremental vacuum at tail end of Cache db connections. r=ehsan --- dom/cache/Connection.cpp | 29 +++++++-- dom/cache/Connection.h | 1 + dom/cache/DBSchema.cpp | 137 +++++++++++++++++++++++++++++++-------- dom/cache/DBSchema.h | 5 ++ 4 files changed, 139 insertions(+), 33 deletions(-) diff --git a/dom/cache/Connection.cpp b/dom/cache/Connection.cpp index 0557cc3f81c68..91b2bb1882b8c 100644 --- a/dom/cache/Connection.cpp +++ b/dom/cache/Connection.cpp @@ -6,6 +6,9 @@ #include "mozilla/dom/cache/Connection.h" +#include "mozilla/dom/cache/DBSchema.h" +#include "mozStorageHelper.h" + namespace mozilla { namespace dom { namespace cache { @@ -15,12 +18,32 @@ NS_IMPL_ISUPPORTS(cache::Connection, mozIStorageAsyncConnection, Connection::Connection(mozIStorageConnection* aBase) : mBase(aBase) + , mClosed(false) { MOZ_ASSERT(mBase); } Connection::~Connection() { + NS_ASSERT_OWNINGTHREAD(Connection); + MOZ_ALWAYS_TRUE(NS_SUCCEEDED(Close())); +} + +NS_IMETHODIMP +Connection::Close() +{ + NS_ASSERT_OWNINGTHREAD(Connection); + + if (mClosed) { + return NS_OK; + } + mClosed = true; + + // If we are closing here, then Cache must not have a transaction + // open anywhere else. This should be guaranteed to succeed. + MOZ_ALWAYS_TRUE(NS_SUCCEEDED(db::IncrementalVacuum(this))); + + return mBase->Close(); } // The following methods are all boilerplate that either forward to the @@ -115,12 +138,6 @@ Connection::RemoveProgressHandler(mozIStorageProgressHandler** aHandlerOut) // mozIStorageConnection methods -NS_IMETHODIMP -Connection::Close() -{ - return mBase->Close(); -} - NS_IMETHODIMP Connection::Clone(bool aReadOnly, mozIStorageConnection** aConnectionOut) { diff --git a/dom/cache/Connection.h b/dom/cache/Connection.h index 7b9c0441aeca8..93dc8177a01c7 100644 --- a/dom/cache/Connection.h +++ b/dom/cache/Connection.h @@ -22,6 +22,7 @@ class Connection final : public mozIStorageConnection ~Connection(); nsCOMPtr mBase; + bool mClosed; NS_DECL_ISUPPORTS NS_DECL_MOZISTORAGEASYNCCONNECTION diff --git a/dom/cache/DBSchema.cpp b/dom/cache/DBSchema.cpp index 45b951fdf00e7..f4ea47c4f9fc5 100644 --- a/dom/cache/DBSchema.cpp +++ b/dom/cache/DBSchema.cpp @@ -44,6 +44,9 @@ const uint32_t kGrowthPages = kGrowthSize / kPageSize; static_assert(kGrowthSize % kPageSize == 0, "Growth size must be multiple of page size"); +// Only release free pages when we have more than this limit +const int32_t kMaxFreePages = kGrowthPages; + // Limit WAL journal to a reasonable size const uint32_t kWalAutoCheckpointSize = 512 * 1024; const uint32_t kWalAutoCheckpointPages = kWalAutoCheckpointSize / kPageSize; @@ -227,28 +230,12 @@ CreateSchema(mozIStorageConnection* aConn) MOZ_ASSERT(!NS_IsMainThread()); MOZ_ASSERT(aConn); - nsAutoCString pragmas( - // Enable auto-vaccum but in incremental mode in order to avoid doing a lot - // of work at the end of each transaction. - // NOTE: This must be done here instead of InitializeConnection() because it - // only works when the database is empty. - "PRAGMA auto_vacuum = INCREMENTAL; " - ); - - nsresult rv = aConn->ExecuteSimpleSQL(pragmas); - if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - int32_t schemaVersion; - rv = aConn->GetSchemaVersion(&schemaVersion); + nsresult rv = aConn->GetSchemaVersion(&schemaVersion); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } if (schemaVersion == kLatestSchemaVersion) { - // We already have the correct schema, so just do an incremental vaccum and - // get started. - rv = aConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING( - "PRAGMA incremental_vacuum;")); - if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - + // We already have the correct schema, so just get started. return rv; } @@ -397,16 +384,10 @@ InitializeConnection(mozIStorageConnection* aConn) nsPrintfCString pragmas( // Use a smaller page size to improve perf/footprint; default is too large "PRAGMA page_size = %u; " - // WAL journal can grow to given number of *pages* - "PRAGMA wal_autocheckpoint = %u; " - // Always truncate the journal back to given number of *bytes* - "PRAGMA journal_size_limit = %u; " - // WAL must be enabled at the end to allow page size to be changed, etc. - "PRAGMA journal_mode = WAL; " + // Enable auto_vacuum; this must happen after page_size and before WAL + "PRAGMA auto_vacuum = INCREMENTAL; " "PRAGMA foreign_keys = ON; ", - kPageSize, - kWalAutoCheckpointPages, - kWalAutoCheckpointSize + kPageSize ); // Note, the default encoding of UTF-8 is preferred. mozStorage does all @@ -425,6 +406,44 @@ InitializeConnection(mozIStorageConnection* aConn) } if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + // Enable WAL journaling. This must be performed in a separate transaction + // after changing the page_size and enabling auto_vacuum. + nsPrintfCString wal( + // WAL journal can grow to given number of *pages* + "PRAGMA wal_autocheckpoint = %u; " + // Always truncate the journal back to given number of *bytes* + "PRAGMA journal_size_limit = %u; " + // WAL must be enabled at the end to allow page size to be changed, etc. + "PRAGMA journal_mode = WAL; ", + kWalAutoCheckpointPages, + kWalAutoCheckpointSize + ); + + rv = aConn->ExecuteSimpleSQL(wal); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + // Verify that we successfully set the vacuum mode to incremental. It + // is very easy to put the database in a state where the auto_vacuum + // pragma above fails silently. +#ifdef DEBUG + nsCOMPtr state; + rv = aConn->CreateStatement(NS_LITERAL_CSTRING( + "PRAGMA auto_vacuum;" + ), getter_AddRefs(state)); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + bool hasMoreData = false; + rv = state->ExecuteStep(&hasMoreData); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + int32_t mode; + rv = state->GetInt32(0, &mode); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + // integer value 2 is incremental mode + if (NS_WARN_IF(mode != 2)) { return NS_ERROR_UNEXPECTED; } +#endif + return NS_OK; } @@ -1943,6 +1962,70 @@ CreateAndBindKeyStatement(mozIStorageConnection* aConn, } // anonymouns namespace +nsresult +IncrementalVacuum(mozIStorageConnection* aConn) +{ + // Determine how much free space is in the database. + nsCOMPtr state; + nsresult rv = aConn->CreateStatement(NS_LITERAL_CSTRING( + "PRAGMA freelist_count;" + ), getter_AddRefs(state)); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + bool hasMoreData = false; + rv = state->ExecuteStep(&hasMoreData); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + int32_t freePages = 0; + rv = state->GetInt32(0, &freePages); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + // We have a relatively small page size, so we want to be careful to avoid + // fragmentation. We already use a growth incremental which will cause + // sqlite to allocate and release multiple pages at the same time. We can + // further reduce fragmentation by making our allocated chunks a bit + // "sticky". This is done by creating some hysteresis where we allocate + // pages/chunks as soon as we need them, but we only release pages/chunks + // when we have a large amount of free space. This helps with the case + // where a page is adding and remove resources causing it to dip back and + // forth across a chunk boundary. + // + // So only proceed with releasing pages if we have more than our constant + // threshold. + if (freePages <= kMaxFreePages) { + return NS_OK; + } + + // Release the excess pages back to the sqlite VFS. This may also release + // chunks of multiple pages back to the OS. + int32_t pagesToRelease = freePages - kMaxFreePages; + + rv = aConn->ExecuteSimpleSQL(nsPrintfCString( + "PRAGMA incremental_vacuum(%d);", pagesToRelease + )); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + // Verify that our incremental vacuum actually did something +#ifdef DEBUG + rv = aConn->CreateStatement(NS_LITERAL_CSTRING( + "PRAGMA freelist_count;" + ), getter_AddRefs(state)); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + hasMoreData = false; + rv = state->ExecuteStep(&hasMoreData); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + freePages = 0; + rv = state->GetInt32(0, &freePages); + if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + MOZ_ASSERT(freePages <= kMaxFreePages); +#endif + + return NS_OK; +} + } // namespace db } // namespace cache } // namespace dom diff --git a/dom/cache/DBSchema.h b/dom/cache/DBSchema.h index fdd2d85d39b0e..6f94deb362f2d 100644 --- a/dom/cache/DBSchema.h +++ b/dom/cache/DBSchema.h @@ -32,6 +32,7 @@ namespace db { nsresult CreateSchema(mozIStorageConnection* aConn); +// Note, this cannot be executed within a transaction. nsresult InitializeConnection(mozIStorageConnection* aConn); @@ -104,6 +105,10 @@ nsresult StorageGetKeys(mozIStorageConnection* aConn, Namespace aNamespace, nsTArray& aKeysOut); +// Note, this works best when its NOT executed within a transaction. +nsresult +IncrementalVacuum(mozIStorageConnection* aConn); + // We will wipe out databases with a schema versions less than this. extern const int32_t kMaxWipeSchemaVersion; From da9b1ef1b9f493f68617cb45d83a1abdfe76a655 Mon Sep 17 00:00:00 2001 From: Ben Kelly Date: Thu, 28 May 2015 07:46:48 -0700 Subject: [PATCH 065/151] Bug 1168152 P4 Add a test to verify Cache incremental vacuum works. r=ehsan --- dom/cache/test/mochitest/large_url_list.js | 1002 +++++++++++++++++ dom/cache/test/mochitest/mochitest.ini | 2 + .../test/mochitest/test_cache_shrink.html | 131 +++ 3 files changed, 1135 insertions(+) create mode 100644 dom/cache/test/mochitest/large_url_list.js create mode 100644 dom/cache/test/mochitest/test_cache_shrink.html diff --git a/dom/cache/test/mochitest/large_url_list.js b/dom/cache/test/mochitest/large_url_list.js new file mode 100644 index 0000000000000..40fb7acfb246a --- /dev/null +++ b/dom/cache/test/mochitest/large_url_list.js @@ -0,0 +1,1002 @@ +var largeUrlList = [ + 'http://example.com/cia5rherm0000hkjx7r8of8b1/cia5rhern0001hkjxes0mptxq/cia5rhern0002hkjx0ze9t1oy/cia5rhern0003hkjxa07rei71', + 'http://example.com/cia5rhern0004hkjx15dh2a23/cia5rhern0005hkjxukeg547n/cia5rhern0006hkjxn78qlfk0/cia5rhern0007hkjxx7pkqem5', + 'http://example.com/cia5rhern0008hkjx6xh95dcp/cia5rhern0009hkjxu3212vkx/cia5rhern000ahkjxlhu69sv7/cia5rhern000bhkjxwffaxb8c', + 'http://example.com/cia5rhern000chkjxylxzrc0l/cia5rhern000dhkjxoe8p7jap/cia5rhern000ehkjx49ssgz0i/cia5rhern000fhkjxlqcm6jq9', + 'http://example.com/cia5rhern000ghkjxjfag4uqk/cia5rhern000hhkjxxjmvakfj/cia5rhern000ihkjxp5j7d9ic/cia5rhern000jhkjxdog5rxfb', + 'http://example.com/cia5rhern000khkjxrdrwsflr/cia5rhern000lhkjxjqj2ydrd/cia5rhern000mhkjxujiqkc1c/cia5rhern000nhkjxw0nk2nvg', + 'http://example.com/cia5rhern000ohkjxpglj3lmb/cia5rhern000phkjxjekhrrqd/cia5rhern000qhkjxalsyb73l/cia5rhern000rhkjxyjbnn6er', + 'http://example.com/cia5rhero000shkjxmhknjjrv/cia5rhero000thkjx8xtfdrgh/cia5rhero000uhkjxpe3dwxk6/cia5rhero000vhkjxint5ohhn', + 'http://example.com/cia5rhero000whkjxvaiypkdj/cia5rhero000xhkjxaqm599g5/cia5rhero000yhkjxivrhnj8f/cia5rhero000zhkjxvmd4t8h6', + 'http://example.com/cia5rhero0010hkjxsx3ke38t/cia5rhero0011hkjx8xnw9tqf/cia5rhero0012hkjxl0lf3iup/cia5rhero0013hkjxbvhj1jj9', + 'http://example.com/cia5rhero0014hkjx4fmpoeu0/cia5rhero0015hkjxwpptyghv/cia5rhero0016hkjxva5k7lbw/cia5rhero0017hkjx138e6bmj', + 'http://example.com/cia5rhero0018hkjxx7j78vei/cia5rhero0019hkjx6xrih33b/cia5rhero001ahkjxd4zgngrg/cia5rhero001bhkjx1tloxb1q', + 'http://example.com/cia5rhero001chkjxrt8zdtde/cia5rhero001dhkjxm9mbqci7/cia5rhero001ehkjxowk5e4q6/cia5rhero001fhkjxh6qmsl1v', + 'http://example.com/cia5rhero001ghkjxfadnveq2/cia5rhero001hhkjx4edkaq54/cia5rhero001ihkjx9fqoqxga/cia5rhero001jhkjx58vqa1zr', + 'http://example.com/cia5rhero001khkjxdrmypltg/cia5rhero001lhkjxhqdzis67/cia5rhero001mhkjxcggzuqdx/cia5rhero001nhkjxctfvi81n', + 'http://example.com/cia5rhero001ohkjxe8pk4cgt/cia5rhero001phkjx6sm4qi4x/cia5rhero001qhkjxm9lqhc6e/cia5rhero001rhkjxy9k6yacj', + 'http://example.com/cia5rhero001shkjx0zfh0f80/cia5rhero001thkjx06fdx9h9/cia5rherp001uhkjxqdmh6jtq/cia5rherp001vhkjxywng3c85', + 'http://example.com/cia5rherp001whkjxm2qihavv/cia5rherp001xhkjxw9v508hp/cia5rherp001yhkjx3jtn1gc8/cia5rherp001zhkjxsmvesh8h', + 'http://example.com/cia5rherp0020hkjxz8yaovlg/cia5rherp0021hkjx66mvfalu/cia5rherp0022hkjxqpilypyo/cia5rherp0023hkjxsp9txbui', + 'http://example.com/cia5rherp0024hkjxcc9ni9ai/cia5rherp0025hkjxslerqaui/cia5rherp0026hkjxe0jl3k05/cia5rherp0027hkjxr0hf5tjn', + 'http://example.com/cia5rherp0028hkjxsg9l2j7w/cia5rherp0029hkjx8zs585su/cia5rherp002ahkjxuwrjr76m/cia5rherp002bhkjxh5nsz7nf', + 'http://example.com/cia5rherp002chkjxzph0v3u0/cia5rherp002dhkjxdayhh6lg/cia5rherp002ehkjxrkvcxz41/cia5rherp002fhkjxlqa9ul9r', + 'http://example.com/cia5rherp002ghkjxf6egbyrh/cia5rherp002hhkjxaw3isyif/cia5rherp002ihkjxboruj7fc/cia5rherp002jhkjx6fgq322u', + 'http://example.com/cia5rherp002khkjx5adgzcsd/cia5rherp002lhkjxo84dwluf/cia5rherp002mhkjxijwq9esb/cia5rherp002nhkjx59ky0n1a', + 'http://example.com/cia5rherp002ohkjx8r9ldy53/cia5rherp002phkjxn5vwv7yi/cia5rherp002qhkjxdsg26179/cia5rherp002rhkjxxvufen34', + 'http://example.com/cia5rherp002shkjxj17ade31/cia5rherp002thkjx37xtqdld/cia5rherp002uhkjxbl9a3b96/cia5rherp002vhkjxrq82quxi', + 'http://example.com/cia5rherp002whkjxj0kiekos/cia5rherp002xhkjxltksjia2/cia5rherp002yhkjx9f6j16y4/cia5rherp002zhkjxub535mh5', + 'http://example.com/cia5rherp0030hkjxsd01uqhn/cia5rherp0031hkjxxy7v0enj/cia5rherp0032hkjxm7afimyn/cia5rherp0033hkjxu9rm6wnw', + 'http://example.com/cia5rherp0034hkjxoe7lub90/cia5rherp0035hkjxdqfkfwe5/cia5rherp0036hkjx7bydg1o0/cia5rherp0037hkjxwiayjj4h', + 'http://example.com/cia5rherp0038hkjxrxyltlgt/cia5rherp0039hkjxq8m8gzd9/cia5rherp003ahkjxfzlwk84z/cia5rherp003bhkjxhzsd9psq', + 'http://example.com/cia5rherp003chkjx8k4d0ev6/cia5rherp003dhkjxe5rhd9bk/cia5rherp003ehkjxhdb9pe1z/cia5rherp003fhkjxnwfpch8g', + 'http://example.com/cia5rherp003ghkjxv07j52h2/cia5rherp003hhkjx1i0x37cm/cia5rherp003ihkjxey8otr6v/cia5rherp003jhkjxk1np7zo5', + 'http://example.com/cia5rherp003khkjxscsb30qa/cia5rherp003lhkjxcuap7ls3/cia5rherq003mhkjxsdoqgpxu/cia5rherq003nhkjxz21dqdpc', + 'http://example.com/cia5rherq003ohkjx66ms0nn0/cia5rherq003phkjxb8hblxdd/cia5rherq003qhkjxmr2bkt0b/cia5rherq003rhkjxkla58f3d', + 'http://example.com/cia5rherr003shkjxutmljflc/cia5rherr003thkjx9sglm092/cia5rherr003uhkjx6ttae5q1/cia5rherr003vhkjx2i22wbci', + 'http://example.com/cia5rherr003whkjx0gmqk0qu/cia5rherr003xhkjxnnopsaqa/cia5rherr003yhkjxhicji4pa/cia5rherr003zhkjxg7dm7usj', + 'http://example.com/cia5rherr0040hkjxqymjv2aj/cia5rherr0041hkjxgjublrsc/cia5rherr0042hkjxu34zz1y2/cia5rherr0043hkjx0v1t6s9s', + 'http://example.com/cia5rherr0044hkjxourvl7pc/cia5rherr0045hkjxem1bv16o/cia5rherr0046hkjxlza5reyz/cia5rherr0047hkjxc0hqmpn8', + 'http://example.com/cia5rherr0048hkjxab7n8nos/cia5rherr0049hkjxjwltgxvq/cia5rherr004ahkjxpskjnyvt/cia5rherr004bhkjx9t1zafr8', + 'http://example.com/cia5rherr004chkjxos007jlr/cia5rherr004dhkjxside72xk/cia5rherr004ehkjxmsb8r01v/cia5rherr004fhkjx1c1v6ypg', + 'http://example.com/cia5rherr004ghkjxl9hin1sd/cia5rherr004hhkjx1ktxr1zz/cia5rherr004ihkjxjnq6wq6b/cia5rherr004jhkjx6z9ffji0', + 'http://example.com/cia5rherr004khkjxxu7r4mzw/cia5rherr004lhkjxj9vru5i2/cia5rherr004mhkjxowwrqrzg/cia5rherr004nhkjxejliyhz4', + 'http://example.com/cia5rherr004ohkjx23jh1sos/cia5rherr004phkjxrq8hqfpy/cia5rherr004qhkjx4232owb6/cia5rherr004rhkjx6dbg83qw', + 'http://example.com/cia5rherr004shkjx6t43ggcp/cia5rherr004thkjxmf2k2w6n/cia5rherr004uhkjxwhhmhvx5/cia5rherr004vhkjxt4qahjbz', + 'http://example.com/cia5rherr004whkjx0bkl7a31/cia5rherr004xhkjxk34mm030/cia5rherr004yhkjxoundtp7u/cia5rherr004zhkjxr1htazrx', + 'http://example.com/cia5rherr0050hkjxfm9e7rcy/cia5rherr0051hkjxvp7y4api/cia5rherr0052hkjxdairex18/cia5rherr0053hkjxoqt8of5n', + 'http://example.com/cia5rherr0054hkjxbg8to9br/cia5rherr0055hkjxymwr54ie/cia5rherr0056hkjxez64qj8r/cia5rherr0057hkjxann7kwhj', + 'http://example.com/cia5rherr0058hkjxov69tz76/cia5rherr0059hkjxxh6rrvs8/cia5rherr005ahkjxwsmsljoc/cia5rherr005bhkjxi5o005me', + 'http://example.com/cia5rherr005chkjxu6w2wby8/cia5rherr005dhkjxvcmga3pp/cia5rherr005ehkjxcr90eaeq/cia5rherr005fhkjxon6fcg5h', + 'http://example.com/cia5rherr005ghkjxqo4vucke/cia5rherr005hhkjxxvdv1j8f/cia5rherr005ihkjxo2vl23qb/cia5rherr005jhkjx3tbu637k', + 'http://example.com/cia5rherr005khkjx8fnhdy4n/cia5rherr005lhkjxvgvc27dd/cia5rherr005mhkjxydbxzvrw/cia5rherr005nhkjx0ev5rnx0', + 'http://example.com/cia5rherr005ohkjxymk6ffpy/cia5rherr005phkjx79eg202o/cia5rherr005qhkjxloql9sm9/cia5rherr005rhkjxf0fcwa88', + 'http://example.com/cia5rherr005shkjxkclvai2n/cia5rherr005thkjx6lhii1h5/cia5rherr005uhkjx21imwf9f/cia5rherr005vhkjxct3akix6', + 'http://example.com/cia5rherr005whkjxam3tkrf9/cia5rherr005xhkjx3ooh8d77/cia5rherr005yhkjx3ih1052q/cia5rherr005zhkjxjn08ve87', + 'http://example.com/cia5rherr0060hkjxbovht1zk/cia5rherr0061hkjx3mq7yzke/cia5rherr0062hkjxc3jyhls3/cia5rherr0063hkjxw5y2kgtl', + 'http://example.com/cia5rherr0064hkjxlzchg2lf/cia5rherr0065hkjxjf4qz7h7/cia5rherr0066hkjxhzxfzly2/cia5rherr0067hkjxxpsm77n2', + 'http://example.com/cia5rherr0068hkjxqakagjms/cia5rherr0069hkjxahy5cahd/cia5rherr006ahkjxlx3eo0d8/cia5rherr006bhkjxqhufagp0', + 'http://example.com/cia5rherr006chkjxs6l4reuh/cia5rherr006dhkjx22dhomat/cia5rherr006ehkjxv8bhjw6s/cia5rherr006fhkjxiembar5h', + 'http://example.com/cia5rherr006ghkjx7uk2ahcv/cia5rherr006hhkjxrptkdzpc/cia5rherr006ihkjxoelimxey/cia5rherr006jhkjxh00sc9q0', + 'http://example.com/cia5rherr006khkjx7bjaq4p8/cia5rherr006lhkjx0t17bwqu/cia5rherr006mhkjx63m6nx0x/cia5rherr006nhkjx4aylco20', + 'http://example.com/cia5rherr006ohkjxqncx2bfn/cia5rherr006phkjxcs9lhj4k/cia5rherr006qhkjxltiaiox0/cia5rherr006rhkjxpxhk6ceh', + 'http://example.com/cia5rherr006shkjxkjpkluh5/cia5rherr006thkjxksjhi0rp/cia5rherr006uhkjxuluxeq56/cia5rherr006vhkjx2i5mkp5o', + 'http://example.com/cia5rherr006whkjx94ph66s7/cia5rherr006xhkjx963ey6z0/cia5rherr006yhkjxklr3zey7/cia5rherr006zhkjxhi9ckzcj', + 'http://example.com/cia5rherr0070hkjx8qu91dki/cia5rherr0071hkjxnsj72h7a/cia5rherr0072hkjxpcch22pw/cia5rherr0073hkjxr88cl6td', + 'http://example.com/cia5rherr0074hkjx33v1pc9p/cia5rherr0075hkjxbijzax59/cia5rherr0076hkjxdatwas40/cia5rherr0077hkjxp92fa2bh', + 'http://example.com/cia5rherr0078hkjxids7sgwp/cia5rherr0079hkjxptr6nbvk/cia5rherr007ahkjx51bynaee/cia5rherr007bhkjx2f0oimkg', + 'http://example.com/cia5rherr007chkjxj243t6fq/cia5rherr007dhkjxx0z54s2z/cia5rherr007ehkjxvtk1saqr/cia5rherr007fhkjxc99ot3di', + 'http://example.com/cia5rherr007ghkjxcdyrgbe5/cia5rherr007hhkjx4g2zda93/cia5rherr007ihkjx3dhwfh5w/cia5rherr007jhkjxnucjju1k', + 'http://example.com/cia5rherr007khkjxtucv4xam/cia5rherr007lhkjxzb52dzam/cia5rherr007mhkjxe5ytefsg/cia5rherr007nhkjxhn1htqim', + 'http://example.com/cia5rherr007ohkjxyhvqunje/cia5rherr007phkjxg1rmr8ia/cia5rherr007qhkjxvne6tsg2/cia5rherr007rhkjx92plnv33', + 'http://example.com/cia5rherr007shkjxedxbud9y/cia5rherr007thkjxsfcv846z/cia5rherr007uhkjxrtoyvp1k/cia5rherr007vhkjxwkkvb63p', + 'http://example.com/cia5rherr007whkjxhom33u72/cia5rherr007xhkjx00i52itn/cia5rherr007yhkjxlbwyrfbh/cia5rherr007zhkjx7hqxgotj', + 'http://example.com/cia5rherr0080hkjxm6fr03t9/cia5rherr0081hkjxsskkldqg/cia5rherr0082hkjx6agt52v9/cia5rherr0083hkjxmw1qpljq', + 'http://example.com/cia5rherr0084hkjx66lbczid/cia5rherr0085hkjx1yhf4qqz/cia5rherr0086hkjx156ah7x1/cia5rhers0087hkjxf7zmqrz3', + 'http://example.com/cia5rhers0088hkjxlvoy1vtq/cia5rhers0089hkjxwopzmrl8/cia5rhers008ahkjxa76skipt/cia5rhers008bhkjxchpeggii', + 'http://example.com/cia5rhers008chkjx77jxzrj5/cia5rhers008dhkjxwdtj4fxt/cia5rhers008ehkjxyk1rbqs4/cia5rhers008fhkjxi6c9h7on', + 'http://example.com/cia5rhers008ghkjxcjbq4qio/cia5rhers008hhkjx46uf4z78/cia5rhers008ihkjxiwjs7rs8/cia5rhers008jhkjx6gow2oc8', + 'http://example.com/cia5rhers008khkjxam5doybe/cia5rhers008lhkjx33h8n79o/cia5rhers008mhkjxch0uhhqa/cia5rhers008nhkjxvkh7mio2', + 'http://example.com/cia5rhers008ohkjxfixhe4vq/cia5rhers008phkjxrw2g2zi3/cia5rhers008qhkjxoynia1m2/cia5rhers008rhkjxoh1yvlac', + 'http://example.com/cia5rhers008shkjxewzwesdt/cia5rhers008thkjx2yx5o3rs/cia5rhers008uhkjxm75q9exl/cia5rhers008vhkjx4jogh9q0', + 'http://example.com/cia5rhers008whkjxdo6vglei/cia5rhers008xhkjx0bx8rrph/cia5rhers008yhkjx7sotv4z4/cia5rhers008zhkjxid6dq8hl', + 'http://example.com/cia5rhers0090hkjxpmid4zyj/cia5rhers0091hkjx7swur7ci/cia5rhers0092hkjxd4mc5j7l/cia5rhers0093hkjxri89p7jy', + 'http://example.com/cia5rhers0094hkjxirrewas9/cia5rhers0095hkjx1wkqq1g1/cia5rhers0096hkjxvpc3hp0t/cia5rhers0097hkjx1ugphwhs', + 'http://example.com/cia5rhers0098hkjxxptvggpn/cia5rhers0099hkjx0hgy6tpl/cia5rhers009ahkjxrgk4cwx1/cia5rhers009bhkjxhff7ocag', + 'http://example.com/cia5rhers009chkjxt2zanh56/cia5rhers009dhkjxeh17c4wg/cia5rhers009ehkjxkhdljhm4/cia5rhers009fhkjxa78k166d', + 'http://example.com/cia5rhers009ghkjxblshruiu/cia5rhers009hhkjx6bpkys70/cia5rhers009ihkjx097xi5jr/cia5rhers009jhkjxl1v2ym6h', + 'http://example.com/cia5rhers009khkjxvciqe48d/cia5rhers009lhkjxxgfzrzqn/cia5rhers009mhkjx99k29erp/cia5rhers009nhkjxnmdineg9', + 'http://example.com/cia5rhers009ohkjx0rr58cbk/cia5rhers009phkjxo0wwxbtm/cia5rhers009qhkjx8j0n0ta4/cia5rhers009rhkjx8jok0mo9', + 'http://example.com/cia5rhers009shkjxo1trhdsu/cia5rhers009thkjxtukv1mwy/cia5rhers009uhkjx0e82f0we/cia5rhers009vhkjx8j0ysbxu', + 'http://example.com/cia5rhers009whkjxdl5recmi/cia5rhers009xhkjx801pcdzp/cia5rhers009yhkjx2wnyv52l/cia5rhers009zhkjxdmjnipn0', + 'http://example.com/cia5rhers00a0hkjxj46kgklk/cia5rhers00a1hkjxmaxskno1/cia5rhers00a2hkjxrv6jtia4/cia5rhers00a3hkjx524js0bd', + 'http://example.com/cia5rhers00a4hkjx6y55uml1/cia5rhers00a5hkjxahhtmal1/cia5rhers00a6hkjx0pt7rbot/cia5rhers00a7hkjxtboirxmu', + 'http://example.com/cia5rhers00a8hkjxqmrjjens/cia5rhers00a9hkjxxbmuxaqn/cia5rhers00aahkjx2fdz4j2q/cia5rhers00abhkjxflwb8nml', + 'http://example.com/cia5rhers00achkjxc7n5xjqb/cia5rhers00adhkjx98mur9hy/cia5rhers00aehkjxrmv4miio/cia5rhers00afhkjxm1wmuk24', + 'http://example.com/cia5rhers00aghkjxhh9nyajy/cia5rhers00ahhkjxypuj93ni/cia5rhers00aihkjxqhvpkhvu/cia5rhers00ajhkjxcebhpi2g', + 'http://example.com/cia5rhers00akhkjxpq2z92bg/cia5rhers00alhkjx6ztkugxa/cia5rhers00amhkjxys8qr2ae/cia5rhers00anhkjxugpiwy4o', + 'http://example.com/cia5rhers00aohkjx5lptk7ll/cia5rhert00aphkjx3m0tdlo6/cia5rhert00aqhkjxtun34qda/cia5rhert00arhkjxgn2cukgo', + 'http://example.com/cia5rhert00ashkjxgndi0t1w/cia5rhert00athkjxngdtw2ac/cia5rhert00auhkjxtlqdm9tk/cia5rhert00avhkjxpmv39lb6', + 'http://example.com/cia5rhert00awhkjxsm1i5606/cia5rhert00axhkjxiini4u7n/cia5rhert00ayhkjxawcdih8y/cia5rhert00azhkjx2uwcskyo', + 'http://example.com/cia5rhert00b0hkjxjosiu610/cia5rhert00b1hkjx0inj6sis/cia5rhert00b2hkjx687j5ca5/cia5rhert00b3hkjxaaepyb37', + 'http://example.com/cia5rhert00b4hkjxccpt8awt/cia5rhert00b5hkjxb4kuj419/cia5rhert00b6hkjxq8bi4zga/cia5rhert00b7hkjxrgomql9g', + 'http://example.com/cia5rhert00b8hkjxjxy3fhb0/cia5rhert00b9hkjxftkoktwh/cia5rhert00bahkjxjx5o3cnn/cia5rhert00bbhkjxa6frtobg', + 'http://example.com/cia5rhert00bchkjxe5tkaifo/cia5rhert00bdhkjx5jppppvo/cia5rhert00behkjxdmsqdq9p/cia5rhert00bfhkjxnw4tk86n', + 'http://example.com/cia5rhert00bghkjx49wz4l5r/cia5rhert00bhhkjx2mfza2xe/cia5rhert00bihkjxbsd9ovfr/cia5rhert00bjhkjx3vye5ep3', + 'http://example.com/cia5rhert00bkhkjxwtdsj589/cia5rhert00blhkjxmjchgsmf/cia5rhert00bmhkjxm5fxzqpq/cia5rhert00bnhkjxyf65cmel', + 'http://example.com/cia5rhert00bohkjx7c22ja5m/cia5rhert00bphkjxhe6e895b/cia5rhert00bqhkjxj6kge909/cia5rhert00brhkjx65rkq4ma', + 'http://example.com/cia5rhert00bshkjx1cn2s8w0/cia5rhert00bthkjxlbbqak7z/cia5rhert00buhkjxfy9yreib/cia5rhert00bvhkjxaivuz0fw', + 'http://example.com/cia5rhert00bwhkjxinogvtl2/cia5rhert00bxhkjxw62nijla/cia5rhert00byhkjxl5nlc2eo/cia5rhert00bzhkjxhlmdfgi7', + 'http://example.com/cia5rhert00c0hkjx4n6b40nr/cia5rhert00c1hkjxsnmkujr5/cia5rhert00c2hkjxv6w0h717/cia5rhert00c3hkjxrcvb5qs6', + 'http://example.com/cia5rhert00c4hkjxgd95z86n/cia5rhert00c5hkjxv1tvmf9c/cia5rhert00c6hkjx4cv3ix8y/cia5rhert00c7hkjxli2to7w7', + 'http://example.com/cia5rhert00c8hkjxgaiuvkul/cia5rhert00c9hkjxkcpdyj68/cia5rhert00cahkjxjxrfjfl0/cia5rhert00cbhkjxk64v5mhq', + 'http://example.com/cia5rhert00cchkjxzkjnwkn1/cia5rhert00cdhkjx1cdlk3ms/cia5rhert00cehkjxaw4lnp43/cia5rhert00cfhkjxz4hk5gsw', + 'http://example.com/cia5rhert00cghkjxpil3za50/cia5rhert00chhkjxp7t5jz46/cia5rhert00cihkjx5cwk8th0/cia5rhert00cjhkjxaxp4y2o0', + 'http://example.com/cia5rhert00ckhkjxcylxiiem/cia5rhert00clhkjxzkx50uda/cia5rhert00cmhkjxs5uv5t4e/cia5rhert00cnhkjxxz9rplpv', + 'http://example.com/cia5rhert00cohkjxa1r51z2k/cia5rhert00cphkjx1zw5bwvd/cia5rhert00cqhkjxkmcxldzz/cia5rhert00crhkjx8xm9oeny', + 'http://example.com/cia5rhert00cshkjxuoqaoftt/cia5rhert00cthkjx1x01dmec/cia5rhert00cuhkjx9sixehxp/cia5rhert00cvhkjxomyssiza', + 'http://example.com/cia5rhert00cwhkjx7et34wux/cia5rhert00cxhkjxncva74m3/cia5rhert00cyhkjxfkizvrik/cia5rhert00czhkjxgbzmphlh', + 'http://example.com/cia5rhert00d0hkjx5amei299/cia5rhert00d1hkjxumygde64/cia5rhert00d2hkjxpnuisg9m/cia5rhert00d3hkjxakoawt1r', + 'http://example.com/cia5rhert00d4hkjx1h1sd1xk/cia5rhert00d5hkjxiszqt7gt/cia5rhert00d6hkjxrgly5qmw/cia5rhert00d7hkjx0khb7is3', + 'http://example.com/cia5rhert00d8hkjx8q3rh7mm/cia5rhert00d9hkjxsc3r3d6p/cia5rhert00dahkjxi4ka0kza/cia5rhert00dbhkjxzvnrcsv0', + 'http://example.com/cia5rhert00dchkjxqlqg4rat/cia5rhert00ddhkjxtjjv0jz2/cia5rhert00dehkjxf7uayrst/cia5rhert00dfhkjxzjqnclyl', + 'http://example.com/cia5rhert00dghkjxdq5ojgf7/cia5rhert00dhhkjxs3fjff88/cia5rheru00dihkjxo2axpgvn/cia5rheru00djhkjx8lrs9xha', + 'http://example.com/cia5rheru00dkhkjx45m33mct/cia5rheru00dlhkjxzrjk6adw/cia5rheru00dmhkjxhhgorfhb/cia5rheru00dnhkjxwadtejpl', + 'http://example.com/cia5rheru00dohkjxj8rdgozp/cia5rheru00dphkjxsqktwr0d/cia5rheru00dqhkjxlodva5ul/cia5rheru00drhkjxy79ve13k', + 'http://example.com/cia5rheru00dshkjxwawhyuhd/cia5rheru00dthkjxovwtz7zd/cia5rheru00duhkjxnhebnm70/cia5rheru00dvhkjxt28pubcm', + 'http://example.com/cia5rheru00dwhkjxasdto0h0/cia5rheru00dxhkjxvoxohbir/cia5rheru00dyhkjxr50yvvwt/cia5rheru00dzhkjxiffhdptt', + 'http://example.com/cia5rheru00e0hkjx9htn1puz/cia5rheru00e1hkjxqvm483lo/cia5rheru00e2hkjxbr3v8ysf/cia5rheru00e3hkjx1xxys4u4', + 'http://example.com/cia5rheru00e4hkjx0pdbwiqd/cia5rheru00e5hkjxcjyvelv6/cia5rheru00e6hkjxfar4jska/cia5rheru00e7hkjxfkw7rkrq', + 'http://example.com/cia5rheru00e8hkjx1rtfronr/cia5rheru00e9hkjxpgfyuqxd/cia5rheru00eahkjx9hw9j0h3/cia5rheru00ebhkjx83acges9', + 'http://example.com/cia5rheru00echkjxbrhqzezc/cia5rheru00edhkjxu3iycpdz/cia5rheru00eehkjxs91i2o4s/cia5rheru00efhkjxgsawfxoa', + 'http://example.com/cia5rheru00eghkjxdhzfetw8/cia5rheru00ehhkjx1wnw1va3/cia5rheru00eihkjxo0vft0jh/cia5rheru00ejhkjxa8vgdyzn', + 'http://example.com/cia5rheru00ekhkjxfo36jiae/cia5rheru00elhkjxim0qkqcu/cia5rheru00emhkjxyv3cm8s8/cia5rheru00enhkjx4zsm4g1k', + 'http://example.com/cia5rherv00eohkjxl16e03j1/cia5rherv00ephkjxtfqgb09e/cia5rherv00eqhkjxxnuib8vx/cia5rherv00erhkjx3c2eh7rw', + 'http://example.com/cia5rherv00eshkjxk2ugn862/cia5rherv00ethkjx4a4i5bu4/cia5rherv00euhkjx4x1ll1hu/cia5rherv00evhkjx4a90801w', + 'http://example.com/cia5rherv00ewhkjx16ofuvju/cia5rherv00exhkjxbjicg8ee/cia5rherv00eyhkjxi37ly2xd/cia5rherv00ezhkjxme2gnc8n', + 'http://example.com/cia5rherv00f0hkjxupxvqy6f/cia5rherv00f1hkjxif6y2ebt/cia5rherv00f2hkjx2hxktwi1/cia5rherv00f3hkjxboq2udk4', + 'http://example.com/cia5rherv00f4hkjxe5t1s9vm/cia5rherv00f5hkjx2p1bkk8q/cia5rherv00f6hkjx3ugeare1/cia5rherv00f7hkjxw5xpdje2', + 'http://example.com/cia5rherv00f8hkjxr347e4en/cia5rherv00f9hkjxjmjvxubi/cia5rherv00fahkjxhgdld04j/cia5rherv00fbhkjxury8qhpe', + 'http://example.com/cia5rherv00fchkjx36kklfip/cia5rherv00fdhkjx51q4kxdz/cia5rherv00fehkjxm1xs1n6p/cia5rherv00ffhkjxzrms1ho0', + 'http://example.com/cia5rherv00fghkjxq54a40bh/cia5rherv00fhhkjxfjd33rlp/cia5rherv00fihkjx8ydqzwn4/cia5rherv00fjhkjx800mxgbz', + 'http://example.com/cia5rherv00fkhkjxr5ktedsn/cia5rherv00flhkjxkh6ip88y/cia5rherv00fmhkjxx824akqe/cia5rherv00fnhkjxn8b9z0y4', + 'http://example.com/cia5rherv00fohkjximtuc4oo/cia5rherv00fphkjxo8xnj3a1/cia5rherv00fqhkjx3frdvz0l/cia5rherv00frhkjxnt4ip06p', + 'http://example.com/cia5rherv00fshkjxebbqlsj4/cia5rherv00fthkjxhejhs2en/cia5rherv00fuhkjxww4v962t/cia5rherv00fvhkjx5n0tpk2r', + 'http://example.com/cia5rherv00fwhkjxomhb4741/cia5rherv00fxhkjxkgs095w0/cia5rherv00fyhkjxtve4rfnk/cia5rherv00fzhkjxkl9m13ke', + 'http://example.com/cia5rherv00g0hkjxwfqm1g52/cia5rherv00g1hkjx0sajw56m/cia5rherv00g2hkjxcs30a0m9/cia5rherv00g3hkjxuq2edyvx', + 'http://example.com/cia5rherv00g4hkjxpmffchhu/cia5rherv00g5hkjxkhh7fc92/cia5rherv00g6hkjxsak4bwp4/cia5rherv00g7hkjxemsqgdmx', + 'http://example.com/cia5rherv00g8hkjxxd4iaucx/cia5rherv00g9hkjx82yt525c/cia5rherv00gahkjx9higv8wz/cia5rherv00gbhkjx0bxq8ejn', + 'http://example.com/cia5rherv00gchkjxolbgqpvx/cia5rherv00gdhkjxh1q1mlra/cia5rherv00gehkjx6rmpv7a6/cia5rherv00gfhkjx7v471pja', + 'http://example.com/cia5rherv00gghkjx4swi554w/cia5rherv00ghhkjxrbcdqi5x/cia5rherv00gihkjxrzkje2z3/cia5rherv00gjhkjx23xefzn2', + 'http://example.com/cia5rherv00gkhkjx7om372u4/cia5rherv00glhkjx7t4qbrj9/cia5rherv00gmhkjxm4021iiz/cia5rherv00gnhkjxgxmosagw', + 'http://example.com/cia5rherv00gohkjx92hhv2g9/cia5rherv00gphkjx7bf3eo7t/cia5rherv00gqhkjx6wj13cjb/cia5rherv00grhkjx9xdd6xqg', + 'http://example.com/cia5rherv00gshkjxapw92pmq/cia5rherv00gthkjx7uqh0m79/cia5rherv00guhkjx9uxnghi5/cia5rherv00gvhkjx9dk24e4x', + 'http://example.com/cia5rherv00gwhkjxm8spj2z7/cia5rherv00gxhkjx1bzjkoj5/cia5rherv00gyhkjxj4n460vb/cia5rherv00gzhkjx6824pani', + 'http://example.com/cia5rherv00h0hkjx8wfm03s5/cia5rherv00h1hkjxboapbcoy/cia5rherv00h2hkjxqgzz6g4s/cia5rherv00h3hkjxcbpuhpk2', + 'http://example.com/cia5rherv00h4hkjx0eho0z4b/cia5rherv00h5hkjx1z59ioaa/cia5rherv00h6hkjxzqmxtasv/cia5rherv00h7hkjxflt86e5f', + 'http://example.com/cia5rherv00h8hkjxxlr7008t/cia5rherv00h9hkjxz8kctoc9/cia5rherv00hahkjxq60p0kx0/cia5rherv00hbhkjxd0zud58a', + 'http://example.com/cia5rherv00hchkjx4o8rphb9/cia5rherv00hdhkjxs3n7yko7/cia5rherv00hehkjxnxwntfg5/cia5rherv00hfhkjxb39xgejv', + 'http://example.com/cia5rherv00hghkjxb1yco8y1/cia5rherv00hhhkjx2v6pz42w/cia5rherv00hihkjx400aow1n/cia5rherv00hjhkjxtwik0d1s', + 'http://example.com/cia5rherv00hkhkjxwnaoc3oc/cia5rherv00hlhkjxsmntvjhm/cia5rherv00hmhkjx4ag0j8cq/cia5rherv00hnhkjxbiigrngm', + 'http://example.com/cia5rherv00hohkjx2s4opprd/cia5rherv00hphkjx8pkc39p2/cia5rherv00hqhkjxif9qfvct/cia5rherv00hrhkjxe4vtvd6z', + 'http://example.com/cia5rherv00hshkjxampz8fwm/cia5rherv00hthkjxf48ybrar/cia5rherv00huhkjx3asrrys5/cia5rherv00hvhkjxc570882r', + 'http://example.com/cia5rherv00hwhkjxfooadgv0/cia5rherv00hxhkjxnmtttd03/cia5rherv00hyhkjx0deqal5b/cia5rherv00hzhkjxleqe94v1', + 'http://example.com/cia5rherv00i0hkjxs3ps41wq/cia5rherv00i1hkjxw46qft2r/cia5rherv00i2hkjxfmfjpssy/cia5rherv00i3hkjxayjpzx43', + 'http://example.com/cia5rherv00i4hkjxpxotlyhp/cia5rherv00i5hkjxhz77s1t6/cia5rherv00i6hkjxwgw9wpq7/cia5rherv00i7hkjxy724la5w', + 'http://example.com/cia5rherv00i8hkjx6wko56vc/cia5rherv00i9hkjxiqs85dqr/cia5rherv00iahkjx32pvc8lh/cia5rherv00ibhkjxouu7jcs7', + 'http://example.com/cia5rherv00ichkjxub141io8/cia5rherv00idhkjx4xp7yqzz/cia5rherv00iehkjx4l9xkah3/cia5rherv00ifhkjx3qco4ypm', + 'http://example.com/cia5rherv00ighkjx9sp14gne/cia5rherv00ihhkjx713r0569/cia5rherv00iihkjxorq3d5yp/cia5rherv00ijhkjxtdo94p17', + 'http://example.com/cia5rherv00ikhkjx4j5jbzre/cia5rherv00ilhkjxcgsn6xlu/cia5rherv00imhkjxx8la8kf5/cia5rherv00inhkjx3hz5opiw', + 'http://example.com/cia5rherv00iohkjx3dgmyl4e/cia5rherv00iphkjx8glt32u3/cia5rherv00iqhkjx6cb6wlxs/cia5rherv00irhkjxza76xuqt', + 'http://example.com/cia5rherv00ishkjxo51i49wr/cia5rherv00ithkjxxa546aho/cia5rherv00iuhkjx50q0dsyb/cia5rherv00ivhkjxcq50j6b5', + 'http://example.com/cia5rherv00iwhkjxaklfq2jh/cia5rherv00ixhkjxq47wm5d8/cia5rherv00iyhkjx93fsh773/cia5rherv00izhkjx05qw5ls6', + 'http://example.com/cia5rherv00j0hkjxcpk80dqg/cia5rherv00j1hkjxe5fze7ph/cia5rherv00j2hkjx0b4x6jj2/cia5rherv00j3hkjxslnfjk8f', + 'http://example.com/cia5rherv00j4hkjxn02a7r4w/cia5rherv00j5hkjxqbq2abzk/cia5rherv00j6hkjx046gf9gh/cia5rherv00j7hkjxw8y6aybl', + 'http://example.com/cia5rherv00j8hkjxua9fh4f2/cia5rherv00j9hkjx0n7j7tf0/cia5rherv00jahkjx1h8p0yzt/cia5rherv00jbhkjx6isout34', + 'http://example.com/cia5rherv00jchkjxscxpp7mk/cia5rherv00jdhkjxx7314ajy/cia5rherv00jehkjx2wej8wjh/cia5rherv00jfhkjxs4i5eiho', + 'http://example.com/cia5rherv00jghkjxcrkt8o3t/cia5rherv00jhhkjx2u0sm2r0/cia5rherv00jihkjxtpjif9k6/cia5rherv00jjhkjxaagcsohi', + 'http://example.com/cia5rherv00jkhkjx8gq5x6ov/cia5rherv00jlhkjxev9zq161/cia5rherv00jmhkjx2sjcp2px/cia5rherv00jnhkjxn8jpfipq', + 'http://example.com/cia5rherv00johkjxbx8744i5/cia5rherv00jphkjxi2eza54a/cia5rherv00jqhkjx1q5y2n4p/cia5rherv00jrhkjxvl0soujd', + 'http://example.com/cia5rherv00jshkjxs7ziy4vs/cia5rherv00jthkjx3ewtvj26/cia5rherv00juhkjxkwhid4b7/cia5rherv00jvhkjxx7nurgrx', + 'http://example.com/cia5rherv00jwhkjxxlcfjhj3/cia5rherv00jxhkjxoresrx2f/cia5rherv00jyhkjxtsmt6apo/cia5rherv00jzhkjxghybzsqs', + 'http://example.com/cia5rherv00k0hkjx7o0bc0o5/cia5rherv00k1hkjxmzwu9w7x/cia5rherv00k2hkjxw6z2g76g/cia5rherv00k3hkjx8htly8zt', + 'http://example.com/cia5rherv00k4hkjx59yd941i/cia5rherv00k5hkjx0j5ccesw/cia5rherv00k6hkjxduxlqh65/cia5rherv00k7hkjx5et0n6t0', + 'http://example.com/cia5rherv00k8hkjxj72kcc3p/cia5rherv00k9hkjx0zy8vr32/cia5rherv00kahkjx6kmi5wtf/cia5rherv00kbhkjxh2ut5f4w', + 'http://example.com/cia5rherv00kchkjxq9ki0lgr/cia5rherv00kdhkjx8mafuept/cia5rherv00kehkjx3kffqdj5/cia5rherv00kfhkjxk30tt2a0', + 'http://example.com/cia5rherv00kghkjxaw98qyx2/cia5rherv00khhkjxieg0bycx/cia5rherw00kihkjxdmdkp4x9/cia5rherw00kjhkjxijtzapeq', + 'http://example.com/cia5rherw00kkhkjxh1oh0kl4/cia5rherw00klhkjx6ffidsax/cia5rherw00kmhkjxqtgyxcy0/cia5rherw00knhkjx2xyipie3', + 'http://example.com/cia5rherw00kohkjxdq8vr7d0/cia5rherw00kphkjxes36xbks/cia5rherw00kqhkjx4ektym79/cia5rherw00krhkjxib4btsp0', + 'http://example.com/cia5rherw00kshkjxpc4m0m9e/cia5rherw00kthkjxgdi6nnzj/cia5rherw00kuhkjxcwj7gk86/cia5rherw00kvhkjx7cj949ld', + 'http://example.com/cia5rherw00kwhkjxmwj8brl1/cia5rherw00kxhkjxae8yeb7p/cia5rherw00kyhkjxqze289bb/cia5rherw00kzhkjx2jy2h9ji', + 'http://example.com/cia5rherw00l0hkjxxadfzs3n/cia5rherw00l1hkjxhngih2c7/cia5rherw00l2hkjxn5zwgxrx/cia5rherw00l3hkjxz3mp1gb9', + 'http://example.com/cia5rherw00l4hkjxhcw0erdu/cia5rherw00l5hkjxj6j3l2zh/cia5rherw00l6hkjx533r5z4r/cia5rherw00l7hkjxvjjbvgo6', + 'http://example.com/cia5rherw00l8hkjxx61zlkek/cia5rherw00l9hkjxb7xj73l2/cia5rherw00lahkjxrpt6fk4m/cia5rherw00lbhkjxlron4prb', + 'http://example.com/cia5rherw00lchkjxtq99vutt/cia5rherw00ldhkjxon95rdss/cia5rherw00lehkjxblctcrfw/cia5rherw00lfhkjxc3mffk2x', + 'http://example.com/cia5rherw00lghkjx4v9dujig/cia5rherw00lhhkjx734cxan0/cia5rherw00lihkjxlxx3bx3y/cia5rherw00ljhkjxa5te3vm6', + 'http://example.com/cia5rherw00lkhkjxy4akb3lo/cia5rherw00llhkjxxg2t6ecs/cia5rherw00lmhkjx5v0ur1zi/cia5rherw00lnhkjxuw4grqgg', + 'http://example.com/cia5rherw00lohkjx1tx7bq0f/cia5rherw00lphkjx118uu54q/cia5rherw00lqhkjxo63inpim/cia5rherw00lrhkjx60iprrlh', + 'http://example.com/cia5rherw00lshkjxq67z9znh/cia5rherw00lthkjxknfimvv6/cia5rherw00luhkjxln059pxx/cia5rherw00lvhkjx0b5u1wvh', + 'http://example.com/cia5rherw00lwhkjxdnbo7o8x/cia5rherw00lxhkjxialw39ph/cia5rherw00lyhkjxq44794oz/cia5rherw00lzhkjx063oj379', + 'http://example.com/cia5rherw00m0hkjxa51hcx2d/cia5rherw00m1hkjx5udmt5pw/cia5rherw00m2hkjxh2zenkxy/cia5rherw00m3hkjxaa4b1ukf', + 'http://example.com/cia5rherw00m4hkjxu0txyp2a/cia5rherw00m5hkjxku5t6nia/cia5rherw00m6hkjxpuvkxgxe/cia5rherw00m7hkjx7mgdnt4i', + 'http://example.com/cia5rherw00m8hkjx9tjak8nq/cia5rherw00m9hkjx6tjbc4c1/cia5rherw00mahkjxhrlq09fa/cia5rherw00mbhkjxncngvvyl', + 'http://example.com/cia5rherw00mchkjxqjijeepd/cia5rherw00mdhkjx5n3u57g1/cia5rherw00mehkjxlhfhx86m/cia5rherw00mfhkjxhtz36qq5', + 'http://example.com/cia5rherw00mghkjxiknnl4br/cia5rherw00mhhkjxl1kv5f98/cia5rherw00mihkjxzo6yez34/cia5rherw00mjhkjx2ffeb3lh', + 'http://example.com/cia5rherw00mkhkjxziimpsbk/cia5rherw00mlhkjxp3bcocf5/cia5rherw00mmhkjxbwztbp6k/cia5rherw00mnhkjxyc9eixhz', + 'http://example.com/cia5rherw00mohkjxm8kai7n5/cia5rherw00mphkjx65gvhaf2/cia5rherw00mqhkjxfh4vu8eq/cia5rherw00mrhkjxfv2gj9bt', + 'http://example.com/cia5rherw00mshkjxmnuhrdj4/cia5rherw00mthkjxjj5iizh6/cia5rherw00muhkjxiw62tfl7/cia5rherw00mvhkjxhzemezd3', + 'http://example.com/cia5rherw00mwhkjxlml9rs61/cia5rherw00mxhkjxl2mbwrnp/cia5rherw00myhkjxj96ye1zv/cia5rherw00mzhkjxodju2h5o', + 'http://example.com/cia5rherw00n0hkjxuivmtahu/cia5rherw00n1hkjx8gbwu61v/cia5rherw00n2hkjx1j9gzlce/cia5rherw00n3hkjxaz67uu2l', + 'http://example.com/cia5rherw00n4hkjxoz2v47cp/cia5rherw00n5hkjxc2m0xq1d/cia5rherw00n6hkjxs5pej7ym/cia5rherw00n7hkjxrj28b2tt', + 'http://example.com/cia5rherw00n8hkjxikm4mbwi/cia5rherw00n9hkjxcfsu9f9d/cia5rherw00nahkjxawec3u0q/cia5rherw00nbhkjx38j8uycv', + 'http://example.com/cia5rherw00nchkjxpxks6dv1/cia5rherw00ndhkjxme2uh9cm/cia5rherw00nehkjxiu6s9qet/cia5rherw00nfhkjxjeycmmn7', + 'http://example.com/cia5rherw00nghkjx66hdwbtg/cia5rherw00nhhkjxki3i81i4/cia5rherw00nihkjxvve944gl/cia5rherw00njhkjx3jwe46il', + 'http://example.com/cia5rherw00nkhkjx8znncv54/cia5rherw00nlhkjxsyqrjo5g/cia5rherw00nmhkjxkir8br45/cia5rherw00nnhkjxexumdwa2', + 'http://example.com/cia5rherw00nohkjxzs49c8vj/cia5rherw00nphkjx5eq7mllr/cia5rherw00nqhkjxxqc7wn0n/cia5rherw00nrhkjx3xnlk87f', + 'http://example.com/cia5rherw00nshkjxis89wcyt/cia5rherw00nthkjxmo962d98/cia5rherw00nuhkjx5102qsyd/cia5rherw00nvhkjx4dhdkq7d', + 'http://example.com/cia5rherw00nwhkjx6o2era0y/cia5rherw00nxhkjxibwv5nl3/cia5rherw00nyhkjxnobkkmmt/cia5rherw00nzhkjx2rfj3yw8', + 'http://example.com/cia5rherw00o0hkjxys1f6cpt/cia5rherw00o1hkjxv7y1wk16/cia5rherw00o2hkjx72rwd3p7/cia5rherw00o3hkjxdpw2fjf4', + 'http://example.com/cia5rherw00o4hkjxj0qwjpur/cia5rherw00o5hkjxr0vma4yn/cia5rherw00o6hkjxjdio6m66/cia5rherw00o7hkjx6tah5wos', + 'http://example.com/cia5rherw00o8hkjxtseqnpix/cia5rherw00o9hkjxcll29qxs/cia5rherw00oahkjxy6j4514j/cia5rherw00obhkjxyt12uhto', + 'http://example.com/cia5rherw00ochkjxv94azfo3/cia5rherw00odhkjxvvb9a4cf/cia5rherw00oehkjxro8j0dau/cia5rherw00ofhkjxazh1bnkv', + 'http://example.com/cia5rherw00oghkjxaiqblgaz/cia5rherw00ohhkjxq0jg2ekb/cia5rherw00oihkjxhxp787hh/cia5rherw00ojhkjxwn2bygkc', + 'http://example.com/cia5rherw00okhkjxrvuzh590/cia5rherw00olhkjxukov5sdm/cia5rherw00omhkjxprnz66kz/cia5rherw00onhkjxd19rb8es', + 'http://example.com/cia5rherw00oohkjxdp73iojj/cia5rherw00ophkjx0ejclbnc/cia5rherw00oqhkjxzbrto5j9/cia5rherw00orhkjx64ybndrk', + 'http://example.com/cia5rherw00oshkjxto8g8o9d/cia5rherw00othkjx0siti4zs/cia5rherw00ouhkjxn4k2rxwd/cia5rherw00ovhkjxlfh7kchr', + 'http://example.com/cia5rherw00owhkjx5u0y9ly7/cia5rherw00oxhkjxuc2947n2/cia5rherw00oyhkjxclqlf4cz/cia5rherw00ozhkjxw4ljr3n2', + 'http://example.com/cia5rherw00p0hkjxprwdryfg/cia5rherw00p1hkjxnm9mqxjr/cia5rherw00p2hkjxo97f8u6g/cia5rherw00p3hkjxu3v7vxny', + 'http://example.com/cia5rherw00p4hkjx52wsz26a/cia5rherw00p5hkjxbcznr0do/cia5rherw00p6hkjxytrdjjnt/cia5rherw00p7hkjx6l5uvkab', + 'http://example.com/cia5rherw00p8hkjxm2zue659/cia5rherx00p9hkjxbkzeky4l/cia5rherx00pahkjxrqp8ljqj/cia5rherx00pbhkjxuxod17kg', + 'http://example.com/cia5rherx00pchkjxa26ekxyy/cia5rherx00pdhkjx0kxle2w1/cia5rherx00pehkjxxugq6n6r/cia5rherx00pfhkjx2ucx69kc', + 'http://example.com/cia5rherx00pghkjxnqt22yl7/cia5rherx00phhkjxuxv53gmq/cia5rherx00pihkjxcb70hxmq/cia5rherx00pjhkjxlvjdb6xl', + 'http://example.com/cia5rherx00pkhkjxjc8qkw9h/cia5rherx00plhkjxcbs6t9k7/cia5rherx00pmhkjxh6cijkuv/cia5rherx00pnhkjxpf14evbg', + 'http://example.com/cia5rherx00pohkjxfgxqyo6d/cia5rherx00pphkjxtpilb91o/cia5rherx00pqhkjxny7abx9y/cia5rherx00prhkjx0l5g83bc', + 'http://example.com/cia5rherx00pshkjxxuxfrdbr/cia5rherx00pthkjxxnj6u6sk/cia5rherx00puhkjxpubm3g6s/cia5rherx00pvhkjxyj7u9c6t', + 'http://example.com/cia5rherx00pwhkjx6ppgibkl/cia5rherx00pxhkjxvv4p4kry/cia5rherx00pyhkjxpkbho8g0/cia5rherx00pzhkjxivjo0784', + 'http://example.com/cia5rherx00q0hkjxffxtz7i5/cia5rherx00q1hkjxygfowug9/cia5rherx00q2hkjxvsau87zx/cia5rherx00q3hkjx6z1kw9b2', + 'http://example.com/cia5rherx00q4hkjx4auglr08/cia5rherx00q5hkjxno848f23/cia5rherx00q6hkjxy6y8cv6y/cia5rherx00q7hkjxzzoogxhg', + 'http://example.com/cia5rherx00q8hkjx70m64of5/cia5rherx00q9hkjxg5c1aukr/cia5rherx00qahkjxqn1h5a85/cia5rherx00qbhkjxg2cf36ig', + 'http://example.com/cia5rherx00qchkjxlwf1o9ji/cia5rherx00qdhkjx1gdhjcsr/cia5rherx00qehkjx172b5dpn/cia5rherx00qfhkjxe3uruk25', + 'http://example.com/cia5rherx00qghkjx2ptty8ex/cia5rherx00qhhkjx5latps1q/cia5rherx00qihkjx9bdo19z2/cia5rherx00qjhkjxfj5a849t', + 'http://example.com/cia5rherx00qkhkjxataa91qp/cia5rherx00qlhkjxkos37rp2/cia5rherx00qmhkjxnr52z1ck/cia5rherx00qnhkjxg2wv4j3b', + 'http://example.com/cia5rherx00qohkjx5zybfy6z/cia5rherx00qphkjx3jotkzjk/cia5rherx00qqhkjxzqnuoxc1/cia5rherx00qrhkjxjqx7n6dd', + 'http://example.com/cia5rherx00qshkjxfusl4u8i/cia5rherx00qthkjx7nax9k3j/cia5rherx00quhkjxce6sda7o/cia5rherx00qvhkjxvjw9krhf', + 'http://example.com/cia5rherx00qwhkjx3myek18h/cia5rherx00qxhkjxye1vc3g5/cia5rherx00qyhkjx0qnkwhv8/cia5rherx00qzhkjx7xbpfb2g', + 'http://example.com/cia5rherx00r0hkjxr05rkysp/cia5rherx00r1hkjx5skxve27/cia5rherx00r2hkjxm42ww2wl/cia5rherx00r3hkjxvgaok3d7', + 'http://example.com/cia5rherx00r4hkjxhqn73qfk/cia5rherx00r5hkjx0vhqzi3y/cia5rherx00r6hkjxzo83uw13/cia5rherx00r7hkjxshtbkjap', + 'http://example.com/cia5rherx00r8hkjxkolk05tr/cia5rherx00r9hkjx87txftcu/cia5rherx00rahkjx7zt1mxfl/cia5rherx00rbhkjxj3225obu', + 'http://example.com/cia5rherx00rchkjxec3j4cbw/cia5rherx00rdhkjx2o60bre2/cia5rherx00rehkjx1gza5jo1/cia5rherx00rfhkjx6i15t347', + 'http://example.com/cia5rherx00rghkjxqsx1tilb/cia5rherx00rhhkjxld7q3ees/cia5rherx00rihkjxywwmwh7a/cia5rherx00rjhkjxa7lzkj0b', + 'http://example.com/cia5rherx00rkhkjxo2uekt9y/cia5rherx00rlhkjxz1y92fdx/cia5rherx00rmhkjxrls010bq/cia5rherx00rnhkjx5phg7y9q', + 'http://example.com/cia5rherx00rohkjxt69rlmpb/cia5rherx00rphkjxxdo9vbof/cia5rherx00rqhkjxgnvs2gxf/cia5rherx00rrhkjx5vv7kk7v', + 'http://example.com/cia5rherx00rshkjxfn0v3dx4/cia5rherx00rthkjx5wkktp8p/cia5rherx00ruhkjx6palbn57/cia5rherx00rvhkjxugk01wvb', + 'http://example.com/cia5rherx00rwhkjxzgza4olt/cia5rherx00rxhkjxwdssdcbj/cia5rherx00ryhkjxxnyxv3t6/cia5rherx00rzhkjxhr6w38i4', + 'http://example.com/cia5rherx00s0hkjxerf3k9ib/cia5rherx00s1hkjxnqqw079u/cia5rherx00s2hkjxifw1h8n3/cia5rherx00s3hkjxd05rx85o', + 'http://example.com/cia5rherx00s4hkjx2x89mh5w/cia5rherx00s5hkjx87d0h7li/cia5rherx00s6hkjxqjueoeqw/cia5rherx00s7hkjxyq9w3n82', + 'http://example.com/cia5rherx00s8hkjxzigd1zp5/cia5rherx00s9hkjxdtx2amst/cia5rherx00sahkjx2onc2f21/cia5rherx00sbhkjx4hgu22zb', + 'http://example.com/cia5rherx00schkjxrz7trjeu/cia5rherx00sdhkjxwmrp365i/cia5rherx00sehkjx7eq317yf/cia5rherx00sfhkjxo93dnhcw', + 'http://example.com/cia5rherx00sghkjx2zsmv5zb/cia5rherx00shhkjxuu1u80qs/cia5rherx00sihkjx8avektr4/cia5rherx00sjhkjxpg3tjre5', + 'http://example.com/cia5rherx00skhkjxm9hrr8dp/cia5rherx00slhkjxmklu8fxx/cia5rherx00smhkjxpz58b4co/cia5rherx00snhkjx6kflkbwz', + 'http://example.com/cia5rherx00sohkjx6zveco0b/cia5rherx00sphkjx9tzv10q9/cia5rherx00sqhkjx5kw9y9vt/cia5rherx00srhkjx5q2dpc7o', + 'http://example.com/cia5rherx00sshkjxfmf3zzhg/cia5rherx00sthkjx085rnzf5/cia5rherx00suhkjxo7eaxytl/cia5rherx00svhkjx3bfbsur9', + 'http://example.com/cia5rherx00swhkjxzihyd64f/cia5rherx00sxhkjxor1bcxl3/cia5rhery00syhkjxlensj1wa/cia5rhery00szhkjxwk1jdpzj', + 'http://example.com/cia5rhery00t0hkjxz5hf0kfl/cia5rhery00t1hkjx36ar1r16/cia5rhery00t2hkjxcv7t3hqq/cia5rhery00t3hkjxkzgqe0a6', + 'http://example.com/cia5rhery00t4hkjxpmbibq16/cia5rhery00t5hkjxrqr5n4lt/cia5rhery00t6hkjx4npmmnvj/cia5rhery00t7hkjxewqanavg', + 'http://example.com/cia5rhery00t8hkjxci9wud4s/cia5rhery00t9hkjxui809qxy/cia5rhery00tahkjx870oqect/cia5rhery00tbhkjx8g24crc0', + 'http://example.com/cia5rhery00tchkjxzjllkr5i/cia5rhery00tdhkjxqnnjio0r/cia5rhery00tehkjxnice4c5a/cia5rhery00tfhkjx0b0tfkbd', + 'http://example.com/cia5rhery00tghkjx1hfn5jnm/cia5rhery00thhkjx0m68lrh0/cia5rhery00tihkjxe24uktvm/cia5rhery00tjhkjxwudbxvgf', + 'http://example.com/cia5rhery00tkhkjxyupjrqmt/cia5rhery00tlhkjxns9kt84a/cia5rhery00tmhkjxnjnkvsza/cia5rhery00tnhkjx2u1kf42m', + 'http://example.com/cia5rhery00tohkjxv8euxxvv/cia5rhery00tphkjxcewtixg8/cia5rhery00tqhkjxm0fvhod1/cia5rhery00trhkjxzfels6hy', + 'http://example.com/cia5rhery00tshkjxcnmhpytv/cia5rhery00tthkjxgmwy284j/cia5rhery00tuhkjxvl9f0bet/cia5rhery00tvhkjxvd9h00tu', + 'http://example.com/cia5rhery00twhkjxworddumj/cia5rhery00txhkjx5hn3bob3/cia5rhery00tyhkjxwxhy5o31/cia5rhery00tzhkjxy7swe892', + 'http://example.com/cia5rhery00u0hkjx9v2rskyu/cia5rhery00u1hkjxt65535lp/cia5rhery00u2hkjxiephk9x0/cia5rhery00u3hkjxylul9icr', + 'http://example.com/cia5rhery00u4hkjxo1tucbyj/cia5rhery00u5hkjxchfewpdu/cia5rhery00u6hkjxzh1f7dsv/cia5rhery00u7hkjxow4myzvc', + 'http://example.com/cia5rhery00u8hkjxjkljwzmx/cia5rhery00u9hkjxb2hq0zff/cia5rhery00uahkjx3zil5iye/cia5rhery00ubhkjxpx6l4i62', + 'http://example.com/cia5rhery00uchkjxzybwg1aj/cia5rhery00udhkjxbc85v998/cia5rhery00uehkjx9x8k1ebt/cia5rhery00ufhkjxziinfjvs', + 'http://example.com/cia5rhery00ughkjxqjq7rbqe/cia5rhery00uhhkjxn422gi7s/cia5rhery00uihkjx6wdh0kru/cia5rhery00ujhkjxgx2z6i30', + 'http://example.com/cia5rhery00ukhkjxxwekiqd8/cia5rhery00ulhkjxti0u03ji/cia5rhery00umhkjxneh94911/cia5rhery00unhkjx5uothdt2', + 'http://example.com/cia5rhery00uohkjxh8wvz750/cia5rhery00uphkjxya408v8j/cia5rhery00uqhkjxowcw4c0j/cia5rhery00urhkjxp0hxhyjr', + 'http://example.com/cia5rhery00ushkjxj5ezkt47/cia5rhery00uthkjxfcbhp09u/cia5rhery00uuhkjxw14otqjw/cia5rhery00uvhkjxhkdyfxrs', + 'http://example.com/cia5rhery00uwhkjxehm078n0/cia5rhery00uxhkjxbadu0bio/cia5rhery00uyhkjxak1ocp8h/cia5rhery00uzhkjxing0qkah', + 'http://example.com/cia5rhery00v0hkjxl8s5to3x/cia5rhery00v1hkjx9t9obxjk/cia5rhery00v2hkjx37ndtfyo/cia5rhery00v3hkjxgsrqx8wo', + 'http://example.com/cia5rhery00v4hkjxcv3mqk3k/cia5rhery00v5hkjxm8gbw43x/cia5rhery00v6hkjxu55dmspc/cia5rhery00v7hkjx34me677j', + 'http://example.com/cia5rhery00v8hkjxwecik8go/cia5rhery00v9hkjxap89471j/cia5rhery00vahkjxllo77l7s/cia5rhery00vbhkjxrqbtypmt', + 'http://example.com/cia5rhery00vchkjx4uu12kzr/cia5rhery00vdhkjx5sxrg1cw/cia5rhery00vehkjxpimi78w5/cia5rhery00vfhkjxvu1h0bnc', + 'http://example.com/cia5rhery00vghkjxryq1kku2/cia5rhery00vhhkjx8yq7g6dg/cia5rhery00vihkjxrhoe95rs/cia5rhery00vjhkjxg036tj71', + 'http://example.com/cia5rhery00vkhkjxfk603ubw/cia5rhery00vlhkjxv6cvncpa/cia5rhery00vmhkjxtlptcbfj/cia5rhery00vnhkjx019qtozs', + 'http://example.com/cia5rhery00vohkjx55roqfyq/cia5rhery00vphkjxq51jjd0w/cia5rhery00vqhkjxzl5r049u/cia5rhery00vrhkjx8w085tma', + 'http://example.com/cia5rhery00vshkjx43gw6sxr/cia5rhery00vthkjx20l8em51/cia5rhery00vuhkjxdwoh2vk9/cia5rhery00vvhkjxw1g6vrut', + 'http://example.com/cia5rhery00vwhkjxvn2ebxzm/cia5rhery00vxhkjxz2hlqhzd/cia5rhery00vyhkjxqvadz9wb/cia5rhery00vzhkjx9rh2a3uh', + 'http://example.com/cia5rhery00w0hkjxa0rqkpov/cia5rhery00w1hkjxp833u09z/cia5rhery00w2hkjxn2awahj4/cia5rhery00w3hkjxwqcb9cgd', + 'http://example.com/cia5rhery00w4hkjx2qn7xtr0/cia5rhery00w5hkjx4mw9p5o5/cia5rhery00w6hkjx1h6f1nne/cia5rhery00w7hkjxqgof32en', + 'http://example.com/cia5rhery00w8hkjx40u225qd/cia5rhery00w9hkjx6jc1e5lj/cia5rhery00wahkjxqqn44l7k/cia5rhery00wbhkjxdwnm2lan', + 'http://example.com/cia5rhery00wchkjxmf3n36f9/cia5rhery00wdhkjxjitsfpkb/cia5rhery00wehkjxrwzzunbx/cia5rhery00wfhkjxlu5ar2zw', + 'http://example.com/cia5rhery00wghkjxkoktvbqj/cia5rhery00whhkjxjs6l9c1l/cia5rhery00wihkjx4c6l8wcz/cia5rhery00wjhkjxwrrx1kta', + 'http://example.com/cia5rhery00wkhkjx4o64pmsg/cia5rhery00wlhkjx5jwjko3n/cia5rhery00wmhkjxuj79fu0e/cia5rhery00wnhkjxdxjnmwu4', + 'http://example.com/cia5rhery00wohkjxnj9yz95o/cia5rhery00wphkjxqs39n7we/cia5rhery00wqhkjxw7enbbt8/cia5rhery00wrhkjxhirvzsj8', + 'http://example.com/cia5rhery00wshkjxklfnj99r/cia5rhery00wthkjxyvxvxzxm/cia5rhery00wuhkjxselr08ti/cia5rhery00wvhkjx0n4m1gwb', + 'http://example.com/cia5rhery00wwhkjxidbq1641/cia5rhery00wxhkjxer0uj0bx/cia5rhery00wyhkjx3rj98a5m/cia5rhery00wzhkjxar7ucjyp', + 'http://example.com/cia5rhery00x0hkjxikq8tega/cia5rhery00x1hkjxgq9t00p7/cia5rhery00x2hkjxzczhf4ta/cia5rhery00x3hkjxs8rl0xle', + 'http://example.com/cia5rhery00x4hkjxtpgdpam7/cia5rhery00x5hkjxnudpwm02/cia5rhery00x6hkjx96jfugp6/cia5rhery00x7hkjxugyl5bsm', + 'http://example.com/cia5rhery00x8hkjx26k3912r/cia5rhery00x9hkjx8j1o37fy/cia5rhery00xahkjxcnx1kjtl/cia5rhery00xbhkjxws0y4q9u', + 'http://example.com/cia5rhery00xchkjxnceot2tu/cia5rhery00xdhkjxmfcanvsn/cia5rhery00xehkjxti3dt4zk/cia5rhery00xfhkjx4r9pxmk8', + 'http://example.com/cia5rhery00xghkjxcl0s61iu/cia5rhery00xhhkjxy85ou2fq/cia5rhery00xihkjx8p53n3u3/cia5rhery00xjhkjx6dzo2asw', + 'http://example.com/cia5rhery00xkhkjxcfvflel3/cia5rhery00xlhkjxjs82vnte/cia5rhery00xmhkjxrisis221/cia5rhery00xnhkjx92ojt9kd', + 'http://example.com/cia5rhery00xohkjxxu18v57w/cia5rhery00xphkjx5gfp65ut/cia5rhery00xqhkjx0zug4xqu/cia5rhery00xrhkjxxqj8k3ce', + 'http://example.com/cia5rhery00xshkjxbpshqaoi/cia5rhery00xthkjxthb498xj/cia5rhery00xuhkjxu6o0heam/cia5rhery00xvhkjxcxp7f3yh', + 'http://example.com/cia5rhery00xwhkjxre2n0fww/cia5rhery00xxhkjxtu8s69t6/cia5rhery00xyhkjx7q1fm4xo/cia5rhery00xzhkjx6o1nu6ga', + 'http://example.com/cia5rhery00y0hkjxlsfyk6o1/cia5rhery00y1hkjxpaqyucwy/cia5rhery00y2hkjxapp8yfj0/cia5rhery00y3hkjx0fnzbtnb', + 'http://example.com/cia5rhery00y4hkjxlm2p2v6d/cia5rhery00y5hkjx0vzxj59x/cia5rhery00y6hkjxkamlg3ck/cia5rhery00y7hkjxkayvfx3a', + 'http://example.com/cia5rhery00y8hkjxdwdcp5cs/cia5rherz00y9hkjxjb0teg8f/cia5rherz00yahkjxs1uzi2l6/cia5rherz00ybhkjxp449moik', + 'http://example.com/cia5rherz00ychkjxwvi52xlt/cia5rherz00ydhkjxr7g9xhla/cia5rherz00yehkjxmrqqq92m/cia5rherz00yfhkjxljrtx13a', + 'http://example.com/cia5rherz00yghkjx6sxe01ps/cia5rherz00yhhkjxh27l6kvi/cia5rherz00yihkjxbrazjcpk/cia5rherz00yjhkjxmi6ft3qb', + 'http://example.com/cia5rherz00ykhkjxifkk8p2x/cia5rherz00ylhkjxpqz9t3cb/cia5rherz00ymhkjxc00r45v0/cia5rherz00ynhkjxgnbgvycv', + 'http://example.com/cia5rherz00yohkjxmr9yq0jk/cia5rherz00yphkjxaamwbi9t/cia5rherz00yqhkjxv53l03jj/cia5rherz00yrhkjxsvkylos9', + 'http://example.com/cia5rherz00yshkjx3vhhy1ut/cia5rherz00ythkjxnx4cssnw/cia5rherz00yuhkjxyojj0lzk/cia5rherz00yvhkjxoyozoftr', + 'http://example.com/cia5rherz00ywhkjxl9hqei9p/cia5rherz00yxhkjxyefcfdtf/cia5rherz00yyhkjxpmcgonjp/cia5rherz00yzhkjxtp7r9f3r', + 'http://example.com/cia5rherz00z0hkjxrhistyei/cia5rherz00z1hkjxinya1udt/cia5rherz00z2hkjxt2uibesw/cia5rherz00z3hkjxrv504cf7', + 'http://example.com/cia5rherz00z4hkjxo0a9j311/cia5rherz00z5hkjxazvef1je/cia5rherz00z6hkjxb75qrdko/cia5rherz00z7hkjxnv1dgzal', + 'http://example.com/cia5rherz00z8hkjx8ny20q55/cia5rherz00z9hkjxwlj70f0m/cia5rherz00zahkjx42hyz0m2/cia5rherz00zbhkjxwotnxn7y', + 'http://example.com/cia5rherz00zchkjxa1tke93x/cia5rherz00zdhkjxzd8wghy0/cia5rherz00zehkjxba383v6a/cia5rherz00zfhkjxjkcs4bwl', + 'http://example.com/cia5rherz00zghkjxk8sklzkb/cia5rherz00zhhkjxfwy3q53n/cia5rherz00zihkjxvheuc2pr/cia5rherz00zjhkjxbzljm6zl', + 'http://example.com/cia5rherz00zkhkjxv84kqu85/cia5rherz00zlhkjxso9bvlw7/cia5rherz00zmhkjxib6w80kz/cia5rherz00znhkjx41d5nf7s', + 'http://example.com/cia5rherz00zohkjxdd3iy5vu/cia5rherz00zphkjxwad53vl4/cia5rherz00zqhkjx4ad3e109/cia5rherz00zrhkjx4r6bwsia', + 'http://example.com/cia5rherz00zshkjx1rzmmdvs/cia5rherz00zthkjx6165yn1j/cia5rherz00zuhkjxnefkdvqx/cia5rherz00zvhkjxgm3q4960', + 'http://example.com/cia5rherz00zwhkjx78quz63t/cia5rherz00zxhkjxdj7uhzb1/cia5rherz00zyhkjxgfrciagd/cia5rherz00zzhkjx2fhew3jm', + 'http://example.com/cia5rherz0100hkjxpoguaspc/cia5rherz0101hkjxj8wf0hvv/cia5rherz0102hkjxft1bu9bg/cia5rherz0103hkjxh7rc7icq', + 'http://example.com/cia5rherz0104hkjxl336njqd/cia5rherz0105hkjxq5od0pbq/cia5rherz0106hkjxtgk2vqld/cia5rherz0107hkjxnyquy58x', + 'http://example.com/cia5rherz0108hkjx0e8vlkuv/cia5rherz0109hkjx1w4ao3zl/cia5rherz010ahkjx0uvsczyx/cia5rherz010bhkjxctueaktb', + 'http://example.com/cia5rherz010chkjxgocyaoln/cia5rherz010dhkjxvym9xjpu/cia5rherz010ehkjxkmv9qd1h/cia5rherz010fhkjxux4kwy9m', + 'http://example.com/cia5rherz010ghkjxgjg51jll/cia5rherz010hhkjxheyloqok/cia5rherz010ihkjxocdihpf0/cia5rherz010jhkjxkjob7g4l', + 'http://example.com/cia5rherz010khkjxyqnrc520/cia5rherz010lhkjxyfmva03e/cia5rherz010mhkjx7pf5a1q1/cia5rherz010nhkjxvcbajwq5', + 'http://example.com/cia5rherz010ohkjxlj1peujy/cia5rherz010phkjxbe0edddw/cia5rherz010qhkjxese0v0d0/cia5rherz010rhkjx3z5sqmvd', + 'http://example.com/cia5rherz010shkjx031cq64v/cia5rherz010thkjxo31twbuq/cia5rherz010uhkjxx0w89wkt/cia5rherz010vhkjxunc21rd5', + 'http://example.com/cia5rherz010whkjxokxwgntu/cia5rherz010xhkjx8zhcummr/cia5rherz010yhkjxrr19wgdd/cia5rherz010zhkjx3krrrmfy', + 'http://example.com/cia5rherz0110hkjxsnag5gy8/cia5rherz0111hkjxti3yt0uo/cia5rherz0112hkjxuvxezwly/cia5rherz0113hkjx42tjs0w1', + 'http://example.com/cia5rherz0114hkjxhap5ggkp/cia5rherz0115hkjxhpvs28ez/cia5rherz0116hkjxchtzr6ub/cia5rherz0117hkjxldrskwe8', + 'http://example.com/cia5rherz0118hkjx3moumoc6/cia5rherz0119hkjx8jmsv1po/cia5rherz011ahkjx5tbk1781/cia5rherz011bhkjxda8axg94', + 'http://example.com/cia5rherz011chkjxpch14tnq/cia5rherz011dhkjx779uxhge/cia5rherz011ehkjxd1gossfl/cia5rherz011fhkjxe6fsxfle', + 'http://example.com/cia5rherz011ghkjxkv0e5x6o/cia5rherz011hhkjxrmm01lop/cia5rherz011ihkjxadtpfth3/cia5rherz011jhkjxmsbqnjtx', + 'http://example.com/cia5rherz011khkjxs9v8q989/cia5rherz011lhkjxbb47ojmz/cia5rherz011mhkjxfqrbtm2s/cia5rherz011nhkjxf0ukz3z7', + 'http://example.com/cia5rherz011ohkjx1ljxj85v/cia5rherz011phkjxzyc52kr1/cia5rherz011qhkjxx03aq7rt/cia5rherz011rhkjxib8yi6wz', + 'http://example.com/cia5rherz011shkjxelvnazea/cia5rherz011thkjx6ge3ekjc/cia5rherz011uhkjxj6spkxml/cia5rherz011vhkjx2g4n6l67', + 'http://example.com/cia5rherz011whkjxoa9tcq7o/cia5rherz011xhkjx0aa7y41v/cia5rherz011yhkjx56c9pqwk/cia5rherz011zhkjx5iy36w89', + 'http://example.com/cia5rherz0120hkjx04d4k3fi/cia5rherz0121hkjxvl6nw4m5/cia5rherz0122hkjxxc1jbk55/cia5rherz0123hkjx0pjnf99r', + 'http://example.com/cia5rherz0124hkjx91z4pze5/cia5rherz0125hkjxg7qc4u38/cia5rherz0126hkjx1yegfvw4/cia5rherz0127hkjxl15ygp9h', + 'http://example.com/cia5rherz0128hkjx4tkyj2om/cia5rherz0129hkjx7h7oqbrp/cia5rherz012ahkjxkajenzcs/cia5rherz012bhkjxi4bowdxs', + 'http://example.com/cia5rherz012chkjx2szlut25/cia5rherz012dhkjxupa098p0/cia5rherz012ehkjxlg93n5ca/cia5rherz012fhkjx3e3lqc5s', + 'http://example.com/cia5rherz012ghkjxiypurty6/cia5rherz012hhkjxnpuba7yn/cia5rherz012ihkjxqajb87r0/cia5rherz012jhkjx3w8tfq58', + 'http://example.com/cia5rherz012khkjx6kpvfmqc/cia5rherz012lhkjxle4ozx4b/cia5rherz012mhkjxcx3zh6l8/cia5rherz012nhkjxwhol1p7z', + 'http://example.com/cia5rherz012ohkjx8hcbuea8/cia5rherz012phkjxjn78pjpu/cia5rherz012qhkjxcso0w7ob/cia5rherz012rhkjxuwsrzjnb', + 'http://example.com/cia5rherz012shkjxmfrs9kl4/cia5rherz012thkjxqd79q3jk/cia5rherz012uhkjx4y92c2l9/cia5rherz012vhkjxah5zn3ql', + 'http://example.com/cia5rherz012whkjxnoco7250/cia5rherz012xhkjx50xbnyn6/cia5rherz012yhkjxhiz0qo7f/cia5rherz012zhkjxpvm1udb0', + 'http://example.com/cia5rherz0130hkjxo3o4fndr/cia5rherz0131hkjxkz4fvrzq/cia5rherz0132hkjxz7tax104/cia5rherz0133hkjx1g0g06dn', + 'http://example.com/cia5rherz0134hkjx5y2031n3/cia5rherz0135hkjx7uqpqo6r/cia5rherz0136hkjxy33y4m0i/cia5rherz0137hkjxi2zwuxom', + 'http://example.com/cia5rherz0138hkjx2r63kcp2/cia5rherz0139hkjxqhukego2/cia5rherz013ahkjxrct5kwo5/cia5rherz013bhkjxlwdsrkdb', + 'http://example.com/cia5rherz013chkjxqb7drtld/cia5rherz013dhkjxhk7nzkp6/cia5rherz013ehkjxt59enx4r/cia5rherz013fhkjxmequgudl', + 'http://example.com/cia5rherz013ghkjxsvtndprv/cia5rherz013hhkjx5qzj9yky/cia5rherz013ihkjx7wi51091/cia5rherz013jhkjx07qd1vho', + 'http://example.com/cia5rherz013khkjxxhuteqrg/cia5rherz013lhkjxnytihmq0/cia5rherz013mhkjxxcuyopb7/cia5rherz013nhkjxz8wjm6kv', + 'http://example.com/cia5rherz013ohkjxti624ceh/cia5rherz013phkjx9es0m8z1/cia5rherz013qhkjx2thq0yiq/cia5rherz013rhkjxcz1h935h', + 'http://example.com/cia5rherz013shkjxy1fcs2p9/cia5rherz013thkjxqj1f3hzd/cia5rherz013uhkjx9n3img9m/cia5rherz013vhkjxbbsd9s7u', + 'http://example.com/cia5rherz013whkjxzrks74yw/cia5rherz013xhkjx19u9gnum/cia5rherz013yhkjxf189dqov/cia5rherz013zhkjxn840ifqp', + 'http://example.com/cia5rherz0140hkjxzflkd8o3/cia5rherz0141hkjxth1k5pcv/cia5rherz0142hkjxk4tx2d6t/cia5rherz0143hkjxua6in4hi', + 'http://example.com/cia5rherz0144hkjxh5223dp4/cia5rherz0145hkjxggdx0inf/cia5rherz0146hkjxukma20rn/cia5rherz0147hkjxbz6yr3vj', + 'http://example.com/cia5rherz0148hkjxj6yz49cp/cia5rherz0149hkjxnshaboc7/cia5rherz014ahkjx9k7w03oz/cia5rherz014bhkjxim3qdl32', + 'http://example.com/cia5rherz014chkjxkwm4bedt/cia5rherz014dhkjxd87owzz9/cia5rherz014ehkjx7gvsq5h8/cia5rherz014fhkjxvg5i2lzo', + 'http://example.com/cia5rhes0014ghkjx57nwx3bd/cia5rhes0014hhkjx7yg5lnmm/cia5rhes0014ihkjxpcj5y5pc/cia5rhes0014jhkjxx7pqjwyi', + 'http://example.com/cia5rhes0014khkjx8je94eu9/cia5rhes0014lhkjxj7s0ayqj/cia5rhes0014mhkjxaj8frq8f/cia5rhes0014nhkjxsvfwikzc', + 'http://example.com/cia5rhes0014ohkjx7w5zhsfa/cia5rhes0014phkjxb8znpn93/cia5rhes0014qhkjx26dojt2q/cia5rhes0014rhkjx4z51j3v1', + 'http://example.com/cia5rhes0014shkjxsrfqfh66/cia5rhes0014thkjxchkutc4l/cia5rhes0014uhkjx61hu197u/cia5rhes0014vhkjx88tbe055', + 'http://example.com/cia5rhes0014whkjxnsy6o8oh/cia5rhes0014xhkjxhf7qa11c/cia5rhes0014yhkjx8dg54bhs/cia5rhes0014zhkjxwddjjbfx', + 'http://example.com/cia5rhes00150hkjxvbx9bs0t/cia5rhes00151hkjx1ndja821/cia5rhes00152hkjxgre5jaft/cia5rhes00153hkjx403j16ab', + 'http://example.com/cia5rhes00154hkjx850qetqc/cia5rhes00155hkjx25fuxyq1/cia5rhes00156hkjxt0otyqf9/cia5rhes00157hkjxkrckit2g', + 'http://example.com/cia5rhes00158hkjxeka610dd/cia5rhes00159hkjxirohiw4g/cia5rhes0015ahkjx4a2e7hwj/cia5rhes0015bhkjx54ew959x', + 'http://example.com/cia5rhes0015chkjxdbymvixv/cia5rhes0015dhkjxehyc0l2p/cia5rhes0015ehkjxkkzsw7sr/cia5rhes0015fhkjx694x9jdr', + 'http://example.com/cia5rhes0015ghkjx8524c513/cia5rhes0015hhkjx9gbh0axg/cia5rhes0015ihkjxhux4m9va/cia5rhes0015jhkjxizfpn19a', + 'http://example.com/cia5rhes0015khkjxmy1viucg/cia5rhes0015lhkjx4k9cpi1x/cia5rhes0015mhkjxlwccit5i/cia5rhes0015nhkjxyyerl1x5', + 'http://example.com/cia5rhes0015ohkjxse6u4cq1/cia5rhes0015phkjxmbosv5k1/cia5rhes0015qhkjxagd18q9e/cia5rhes0015rhkjx18k37mza', + 'http://example.com/cia5rhes0015shkjxkf88qpr2/cia5rhes0015thkjxxjngloiv/cia5rhes0015uhkjxw3p51ph3/cia5rhes0015vhkjxuv117q6n', + 'http://example.com/cia5rhes0015whkjxepiuli5w/cia5rhes0015xhkjx6912ozju/cia5rhes0015yhkjxs50s4iw9/cia5rhes0015zhkjx4fqv3fj5', + 'http://example.com/cia5rhes00160hkjxaezek04y/cia5rhes00161hkjxo7jexmqa/cia5rhes00162hkjx8qt4t84r/cia5rhes00163hkjx0x35v1ea', + 'http://example.com/cia5rhes00164hkjxum5cztru/cia5rhes00165hkjxykw801f6/cia5rhes00166hkjx87cgbtl9/cia5rhes00167hkjxr5laneo4', + 'http://example.com/cia5rhes00168hkjx4675xx8q/cia5rhes00169hkjxa69bs98w/cia5rhes0016ahkjxgxbg1ktg/cia5rhes0016bhkjxcssrfeb6', + 'http://example.com/cia5rhes0016chkjxskrmxbeu/cia5rhes0016dhkjxchuf9w7d/cia5rhes0016ehkjx96tmup0w/cia5rhes0016fhkjx3b2ir9k8', + 'http://example.com/cia5rhes0016ghkjxshn9r5cd/cia5rhes0016hhkjxt0okuboo/cia5rhes0016ihkjx3xc5n1z7/cia5rhes0016jhkjxmm1rhinv', + 'http://example.com/cia5rhes0016khkjxs4md552m/cia5rhes0016lhkjxdqs7jlks/cia5rhes0016mhkjxsbqpbr27/cia5rhes0016nhkjxsw0eoqxh', + 'http://example.com/cia5rhes0016ohkjxj1uyawl4/cia5rhes0016phkjx4s3keqvp/cia5rhes0016qhkjxlr2ujty3/cia5rhes0016rhkjxshluxgzs', + 'http://example.com/cia5rhes0016shkjxmjm47a2n/cia5rhes0016thkjxvawl3vod/cia5rhes0016uhkjxlkwcmxrn/cia5rhes0016vhkjx0yrlq0k0', + 'http://example.com/cia5rhes0016whkjx47wacy0d/cia5rhes0016xhkjxx20x2adr/cia5rhes0016yhkjxpyafhbax/cia5rhes0016zhkjxkm7homqb', + 'http://example.com/cia5rhes00170hkjx58dppj32/cia5rhes00171hkjxgl9ekfiu/cia5rhes00172hkjx35hn4ajh/cia5rhes00173hkjx4k5x795i', + 'http://example.com/cia5rhes00174hkjx431k7e7c/cia5rhes00175hkjxdfvrfwqy/cia5rhes00176hkjx2wqmhu6x/cia5rhes00177hkjxd8ykmqj9', + 'http://example.com/cia5rhes00178hkjxpbwz0dv1/cia5rhes00179hkjxfxnx8xde/cia5rhes0017ahkjxnumozh8d/cia5rhes0017bhkjxjvgv7bu3', + 'http://example.com/cia5rhes0017chkjx6cbtaca4/cia5rhes0017dhkjxl6oa2n77/cia5rhes0017ehkjxv4e7c73p/cia5rhes0017fhkjxarapkb0w', + 'http://example.com/cia5rhes0017ghkjxvzviznq4/cia5rhes0017hhkjxkxkq2w0r/cia5rhes0017ihkjxfdhga9qz/cia5rhes0017jhkjxzr0zbpli', + 'http://example.com/cia5rhes0017khkjxd6x7dl0m/cia5rhes0017lhkjxpa472u8x/cia5rhes0017mhkjxi7scj2zd/cia5rhes0017nhkjxcrar3doc', + 'http://example.com/cia5rhes1017ohkjxim1b2tgs/cia5rhes1017phkjxido7zpq3/cia5rhes1017qhkjxzhgszmuh/cia5rhes1017rhkjxh9n4vlu9', + 'http://example.com/cia5rhes1017shkjxazazffwt/cia5rhes1017thkjxt1mu7dkg/cia5rhes1017uhkjx79p8vex3/cia5rhes1017vhkjxzk3rwfaj', + 'http://example.com/cia5rhes1017whkjxg9ldz44h/cia5rhes1017xhkjxubjc7d35/cia5rhes1017yhkjxyn9t58r7/cia5rhes1017zhkjx822o28jf', + 'http://example.com/cia5rhes10180hkjxy0zeitqi/cia5rhes10181hkjxuiumypud/cia5rhes10182hkjxqhf3xprn/cia5rhes10183hkjx9orcdf2t', + 'http://example.com/cia5rhes10184hkjx60vpjosn/cia5rhes10185hkjxiuxdbrjp/cia5rhes10186hkjxjazso4v3/cia5rhes10187hkjx1yda3p8i', + 'http://example.com/cia5rhes10188hkjx67qn30yn/cia5rhes10189hkjxd8e62yud/cia5rhes1018ahkjxr1ogihzw/cia5rhes1018bhkjxqa83yxs2', + 'http://example.com/cia5rhes1018chkjxcijm6ol2/cia5rhes1018dhkjxn27lkryl/cia5rhes1018ehkjxin74swtd/cia5rhes1018fhkjxc3n9hjub', + 'http://example.com/cia5rhes1018ghkjxs06i4n1v/cia5rhes1018hhkjxtbrrprdd/cia5rhes1018ihkjxh375u2d5/cia5rhes1018jhkjxwe4m1w3k', + 'http://example.com/cia5rhes1018khkjxc2fo3tyn/cia5rhes1018lhkjx11wqgr3o/cia5rhes1018mhkjx55cz73km/cia5rhes1018nhkjx027g05rh', + 'http://example.com/cia5rhes1018ohkjxuxt9w0qg/cia5rhes1018phkjxuppi0zpt/cia5rhes1018qhkjx3hedzfgq/cia5rhes1018rhkjxdbef85sg', + 'http://example.com/cia5rhes1018shkjxh23bn4hl/cia5rhes1018thkjx2jo33xt5/cia5rhes1018uhkjxgrf6z3q5/cia5rhes1018vhkjxs51u2bsq', + 'http://example.com/cia5rhes1018whkjxh98q42o4/cia5rhes1018xhkjxtktqtwob/cia5rhes1018yhkjxxf9qq7me/cia5rhes1018zhkjx540am2xr', + 'http://example.com/cia5rhes10190hkjxcom1s1af/cia5rhes10191hkjxr15i8zfz/cia5rhes10192hkjxbsyx6pqa/cia5rhes10193hkjx5lfk3tnz', + 'http://example.com/cia5rhes10194hkjx63khbmh5/cia5rhes10195hkjx23tzm25c/cia5rhes10196hkjx3tu55kps/cia5rhes10197hkjxt9kgwuye', + 'http://example.com/cia5rhes10198hkjxvsic8zyi/cia5rhes10199hkjxiqcxj6ha/cia5rhes1019ahkjxul53ymxv/cia5rhes1019bhkjx8j5i4gjo', + 'http://example.com/cia5rhes1019chkjxhkzab45h/cia5rhes1019dhkjxp9m537kv/cia5rhes1019ehkjxflgayfwl/cia5rhes1019fhkjxpxcfuwm7', + 'http://example.com/cia5rhes1019ghkjx0ec3mbfs/cia5rhes1019hhkjxpzum6b24/cia5rhes1019ihkjx8l7ygjw5/cia5rhes1019jhkjxc4kywxia', + 'http://example.com/cia5rhes1019khkjxcgdm2x8i/cia5rhes1019lhkjxsd4z7axk/cia5rhes1019mhkjxrivl4h0v/cia5rhes1019nhkjxwq5r7rjw', + 'http://example.com/cia5rhes1019ohkjxlbgrt2qs/cia5rhes1019phkjxrqx7xr97/cia5rhes1019qhkjxqxuaxnbc/cia5rhes1019rhkjx479nva7e', + 'http://example.com/cia5rhes1019shkjxo903skww/cia5rhes1019thkjx835fib01/cia5rhes1019uhkjxqnb5hb1c/cia5rhes1019vhkjx985hdr8a', + 'http://example.com/cia5rhes1019whkjxul29xzs7/cia5rhes1019xhkjx8v769rft/cia5rhes1019yhkjx8moz4avh/cia5rhes1019zhkjxltk1bmj1', + 'http://example.com/cia5rhes101a0hkjxgj1bgqcu/cia5rhes101a1hkjxam87hyv6/cia5rhes101a2hkjx6n7xfzcf/cia5rhes101a3hkjxwhuzx4bu', + 'http://example.com/cia5rhes101a4hkjxkz4gt4bb/cia5rhes101a5hkjx8jto6sbw/cia5rhes101a6hkjxdkz6q053/cia5rhes101a7hkjxafsa477k', + 'http://example.com/cia5rhes101a8hkjxmawq81f9/cia5rhes101a9hkjx7a1m25vl/cia5rhes101aahkjxn9vib2k1/cia5rhes101abhkjxnd9lr35m', + 'http://example.com/cia5rhes101achkjxaz60ife8/cia5rhes101adhkjxb9jyduwc/cia5rhes101aehkjximmqxxdc/cia5rhes101afhkjxrivbhs77', + 'http://example.com/cia5rhes101aghkjxrq2da1pd/cia5rhes101ahhkjxjcuopb44/cia5rhes101aihkjxmeqnm90k/cia5rhes101ajhkjxli2mp598', + 'http://example.com/cia5rhes101akhkjx3uzisjok/cia5rhes101alhkjx2z2rnozw/cia5rhes101amhkjxektigddg/cia5rhes101anhkjxvsxrqsn5', + 'http://example.com/cia5rhes101aohkjxfb78h44w/cia5rhes101aphkjx2g9hr8n2/cia5rhes101aqhkjx61plt1q1/cia5rhes101arhkjxajstaro6', + 'http://example.com/cia5rhes101ashkjxm5zox05g/cia5rhes101athkjxqnofipd6/cia5rhes101auhkjxr39j3scv/cia5rhes101avhkjxcnv43592', + 'http://example.com/cia5rhes101awhkjxi5amucip/cia5rhes101axhkjxy05rb4by/cia5rhes101ayhkjxoqbug0w2/cia5rhes101azhkjxobqv30io', + 'http://example.com/cia5rhes101b0hkjxgtxrq6a1/cia5rhes101b1hkjx3kckskk9/cia5rhes101b2hkjxgp3x3n2k/cia5rhes101b3hkjxjoa91opd', + 'http://example.com/cia5rhes101b4hkjxl0uryndo/cia5rhes101b5hkjxn8o6oumu/cia5rhes101b6hkjxrjbze70s/cia5rhes101b7hkjxv5mrjv5y', + 'http://example.com/cia5rhes101b8hkjx7yeg3s3m/cia5rhes101b9hkjxnchy3mil/cia5rhes101bahkjxawomopeo/cia5rhes101bbhkjx9oml99jy', + 'http://example.com/cia5rhes101bchkjxzaccplvr/cia5rhes101bdhkjxmv4u1l8n/cia5rhes101behkjxja90rgy0/cia5rhes101bfhkjxolfzxocw', + 'http://example.com/cia5rhes101bghkjxy1vfbaaw/cia5rhes101bhhkjxg6xznpan/cia5rhes101bihkjxlg9fzku8/cia5rhes101bjhkjxnh2hjnui', + 'http://example.com/cia5rhes101bkhkjxsclo2zp3/cia5rhes101blhkjxuvrcudv5/cia5rhes101bmhkjx605j2zjj/cia5rhes101bnhkjx2xml0fvu', + 'http://example.com/cia5rhes101bohkjx5gf3ijos/cia5rhes101bphkjxpe0su46e/cia5rhes101bqhkjxs22f7ad2/cia5rhes101brhkjx9agg7eo1', + 'http://example.com/cia5rhes101bshkjx3sn7g8yy/cia5rhes101bthkjxe04n3g8b/cia5rhes101buhkjxgy5w6ts0/cia5rhes101bvhkjx7q91193i', + 'http://example.com/cia5rhes101bwhkjxfgzjxdtg/cia5rhes101bxhkjx9fof34tp/cia5rhes101byhkjxoyqeyb8o/cia5rhes101bzhkjxs4h8rhgv', + 'http://example.com/cia5rhes101c0hkjxxj1zh5us/cia5rhes101c1hkjxoc2z40bk/cia5rhes101c2hkjxp2mh4dck/cia5rhes101c3hkjx11dpdt65', + 'http://example.com/cia5rhes101c4hkjxrfzebrql/cia5rhes101c5hkjxhgaz06ty/cia5rhes101c6hkjxrs79e85g/cia5rhes101c7hkjxggrhbqyx', + 'http://example.com/cia5rhes101c8hkjxvgxdgnbw/cia5rhes101c9hkjxyjttv60a/cia5rhes101cahkjxsq6fq2jl/cia5rhes101cbhkjx7q41av4q', + 'http://example.com/cia5rhes101cchkjxovipv8ev/cia5rhes101cdhkjxqmj2adv7/cia5rhes101cehkjxkac54kr0/cia5rhes101cfhkjxuqcmlixm', + 'http://example.com/cia5rhes101cghkjx8p3hy50r/cia5rhes101chhkjxitheakp9/cia5rhes101cihkjxrm1z2bcp/cia5rhes101cjhkjx6e60mdcr', + 'http://example.com/cia5rhes101ckhkjxavxp0z0w/cia5rhes101clhkjxo78s8ce3/cia5rhes101cmhkjx3q5plsy4/cia5rhes101cnhkjxbr2dyljs', + 'http://example.com/cia5rhes101cohkjxx6uzzh6z/cia5rhes101cphkjx39t0gmdt/cia5rhes101cqhkjx5cpi5gv2/cia5rhes101crhkjx8tiw2khg', + 'http://example.com/cia5rhes101cshkjxx26p2oew/cia5rhes101cthkjxh5x6cctw/cia5rhes101cuhkjxmqbok5qb/cia5rhes101cvhkjx98q4u6vg', + 'http://example.com/cia5rhes101cwhkjxca46qqdc/cia5rhes101cxhkjxkya9jblw/cia5rhes101cyhkjxsx55uj72/cia5rhes101czhkjx4px01ypv', + 'http://example.com/cia5rhes201d0hkjxrfq1bxuy/cia5rhes201d1hkjxum4pm3s6/cia5rhes201d2hkjx9djj6tvc/cia5rhes201d3hkjxkobt5p5a', + 'http://example.com/cia5rhes201d4hkjx6vbuy1h3/cia5rhes201d5hkjxtyrtq6sn/cia5rhes201d6hkjxyn0dbgeq/cia5rhes201d7hkjx9g1d2pu0', + 'http://example.com/cia5rhes201d8hkjxsci6f24w/cia5rhes201d9hkjxd8q6ugbk/cia5rhes201dahkjx8c8yunrs/cia5rhes201dbhkjxb657b9hh', + 'http://example.com/cia5rhes201dchkjxhpytp0es/cia5rhes201ddhkjxzz6or9dl/cia5rhes201dehkjxvt1iaj4e/cia5rhes201dfhkjxcovukh36', + 'http://example.com/cia5rhes201dghkjxs4wcuyr5/cia5rhes201dhhkjxa3ltvy94/cia5rhes201dihkjx1q3i72ys/cia5rhes201djhkjxjgthq1xi', + 'http://example.com/cia5rhes201dkhkjxsvsw8r7g/cia5rhes201dlhkjxho9dzz7z/cia5rhes201dmhkjxtd6y9lt9/cia5rhes201dnhkjx2mryfja5', + 'http://example.com/cia5rhes201dohkjx1qpsam6z/cia5rhes201dphkjxyqckmdus/cia5rhes201dqhkjx05x0cua4/cia5rhes201drhkjxlv48ezca', + 'http://example.com/cia5rhes201dshkjxv3tvrlnv/cia5rhes201dthkjxsb1vp68a/cia5rhes201duhkjxr3dpwbsl/cia5rhes201dvhkjxooy13asr', + 'http://example.com/cia5rhes201dwhkjxy2yxmf1a/cia5rhes201dxhkjxg7ddbk62/cia5rhes201dyhkjxyfw66d9i/cia5rhes201dzhkjxhiriqvpp', + 'http://example.com/cia5rhes201e0hkjxgnojdvfu/cia5rhes201e1hkjx35d46pkf/cia5rhes201e2hkjx8al6xyxc/cia5rhes201e3hkjxpm8o33n5', + 'http://example.com/cia5rhes201e4hkjxgmt6q22i/cia5rhes201e5hkjxcxujptph/cia5rhes201e6hkjxvjqvqv5y/cia5rhes201e7hkjx7frk9v00', + 'http://example.com/cia5rhes201e8hkjxwksc2h6k/cia5rhes201e9hkjxmrv2nebe/cia5rhes201eahkjxju4ycxem/cia5rhes201ebhkjxu63x5ai0', + 'http://example.com/cia5rhes201echkjxq4et8qb3/cia5rhes201edhkjxmawlqvb6/cia5rhes201eehkjx5mvbc5jf/cia5rhes201efhkjxf81g9ft0', + 'http://example.com/cia5rhes201eghkjxwc2n8rrz/cia5rhes201ehhkjx96jrb9qp/cia5rhes201eihkjxolmvqk0b/cia5rhes201ejhkjx8t4yxqdy', + 'http://example.com/cia5rhes201ekhkjxjj375p8m/cia5rhes201elhkjxd7n988u0/cia5rhes201emhkjx4sgv75jt/cia5rhes201enhkjx89v2rpwd', + 'http://example.com/cia5rhes201eohkjx441c02sl/cia5rhes201ephkjxicff9k4p/cia5rhes201eqhkjx5c7sjm4x/cia5rhes201erhkjxvl0a13y1', + 'http://example.com/cia5rhes201eshkjxf8inxrty/cia5rhes201ethkjxqjixrhe3/cia5rhes201euhkjx6cq543as/cia5rhes201evhkjxiq4rvbm6', + 'http://example.com/cia5rhes201ewhkjxpzr481o0/cia5rhes201exhkjxfqo3ya1u/cia5rhes201eyhkjxzaieceuz/cia5rhes201ezhkjxrp9aiyto', + 'http://example.com/cia5rhes201f0hkjxdxg04ktt/cia5rhes201f1hkjxc5xqh8w6/cia5rhes201f2hkjxxqt7mk69/cia5rhes201f3hkjxhz4mt35k', + 'http://example.com/cia5rhes201f4hkjxwif8ix73/cia5rhes201f5hkjxcnk41o2f/cia5rhes201f6hkjxqvmwkmte/cia5rhes201f7hkjxjhf0rwkd', + 'http://example.com/cia5rhes201f8hkjxgu0mbayd/cia5rhes201f9hkjxoirm2pi6/cia5rhes201fahkjx3eggxv1v/cia5rhes201fbhkjx3dr0v5lr', + 'http://example.com/cia5rhes201fchkjx9bl00653/cia5rhes201fdhkjxd986f7dy/cia5rhes201fehkjxcjhtezko/cia5rhes201ffhkjx2g6pp08r', + 'http://example.com/cia5rhes201fghkjxieabfnjf/cia5rhes201fhhkjxhncmkptc/cia5rhes201fihkjxd2idn405/cia5rhes201fjhkjxxh12k6dz', + 'http://example.com/cia5rhes201fkhkjxjhb8dl6c/cia5rhes201flhkjxjesmmxj5/cia5rhes201fmhkjxgdq4watu/cia5rhes201fnhkjxcx2v7046', + 'http://example.com/cia5rhes201fohkjxooyrgbd6/cia5rhes201fphkjxnswgkqhg/cia5rhes201fqhkjxr1olqtyi/cia5rhes201frhkjxpylkppc7', + 'http://example.com/cia5rhes201fshkjxss3f3m7a/cia5rhes201fthkjxtb752b31/cia5rhes201fuhkjxl8v5tked/cia5rhes201fvhkjxs83n3lna', + 'http://example.com/cia5rhes201fwhkjx7mn2ufyp/cia5rhes201fxhkjxykgvds9s/cia5rhes201fyhkjxzj880aau/cia5rhes201fzhkjx9hmzn5w1', + 'http://example.com/cia5rhes201g0hkjx40m23pfq/cia5rhes201g1hkjxu5axzq44/cia5rhes201g2hkjxtenwlezp/cia5rhes201g3hkjxeaanxtc3', + 'http://example.com/cia5rhes201g4hkjxfko2j17a/cia5rhes201g5hkjxdngk92iq/cia5rhes201g6hkjxyiixm3h3/cia5rhes201g7hkjx1e0o9rbr', + 'http://example.com/cia5rhes201g8hkjxzvuuf9mr/cia5rhes201g9hkjx9i4067eb/cia5rhes201gahkjxe0877b7o/cia5rhes201gbhkjxhjeqydx3', + 'http://example.com/cia5rhes201gchkjx28buxxph/cia5rhes201gdhkjx11mlvzu6/cia5rhes201gehkjx56z31f3p/cia5rhes201gfhkjxon8mxyaq', + 'http://example.com/cia5rhes201gghkjxzhavbsbu/cia5rhes201ghhkjxpalfbbgq/cia5rhes201gihkjxmg14pb0i/cia5rhes201gjhkjxz1k6lfox', + 'http://example.com/cia5rhes201gkhkjxr91y8n1x/cia5rhes201glhkjxcd8gf56b/cia5rhes201gmhkjxgmgi5aag/cia5rhes201gnhkjxzuskm0u3', + 'http://example.com/cia5rhes201gohkjxh6stmdzj/cia5rhes201gphkjxjhxmrc1z/cia5rhes201gqhkjxbsb6x26m/cia5rhes201grhkjx2qjq5azu', + 'http://example.com/cia5rhes201gshkjxwgykuiuh/cia5rhes201gthkjxshezzoh7/cia5rhes201guhkjxhxk5wn0c/cia5rhes201gvhkjxfgd3dy5o', + 'http://example.com/cia5rhes201gwhkjxrjdm59mt/cia5rhes201gxhkjx5p1au9tm/cia5rhes201gyhkjx2fhr9h8l/cia5rhes201gzhkjx1d6ey84l', + 'http://example.com/cia5rhes201h0hkjxw539qclb/cia5rhes201h1hkjxtasbgd4k/cia5rhes201h2hkjxnggs4jvi/cia5rhes201h3hkjx10i4oa01', + 'http://example.com/cia5rhes201h4hkjxc4yc7ah2/cia5rhes201h5hkjxpp8h6vjy/cia5rhes201h6hkjx3is219tv/cia5rhes201h7hkjxi5vczfdr', + 'http://example.com/cia5rhes201h8hkjx0pnfnjv8/cia5rhes201h9hkjxvab7mw12/cia5rhes201hahkjxpdkx31mo/cia5rhes201hbhkjx5qrrpii9', + 'http://example.com/cia5rhes201hchkjxxpstoh0r/cia5rhes201hdhkjxd3fqr26w/cia5rhes201hehkjxa89a8p00/cia5rhes201hfhkjxjb7dx816', + 'http://example.com/cia5rhes201hghkjxoundwtvv/cia5rhes201hhhkjxq0l8n544/cia5rhes201hihkjxfnxig9tq/cia5rhes201hjhkjxmthbhba3', + 'http://example.com/cia5rhes201hkhkjxh8del6ix/cia5rhes201hlhkjxbbkqryiz/cia5rhes201hmhkjxsrbt8rwc/cia5rhes201hnhkjxvjinr83g', + 'http://example.com/cia5rhes201hohkjxnm39jamh/cia5rhes201hphkjxbpdbg85s/cia5rhes201hqhkjxt4xsrvvw/cia5rhes201hrhkjx28uncmqm', + 'http://example.com/cia5rhes201hshkjx9y3havo3/cia5rhes201hthkjxsl3xf65k/cia5rhes201huhkjxevlc6mpu/cia5rhes201hvhkjxios9hjnc', + 'http://example.com/cia5rhes201hwhkjx1gqoupdx/cia5rhes201hxhkjxoezqmdn4/cia5rhes201hyhkjxsd34q556/cia5rhes201hzhkjxvkqinyu3', + 'http://example.com/cia5rhes201i0hkjxtuqp1qgj/cia5rhes201i1hkjxjq0bui86/cia5rhes201i2hkjxlu4behua/cia5rhes201i3hkjxbarxd26f', + 'http://example.com/cia5rhes201i4hkjx1dgyo81l/cia5rhes201i5hkjx3xb9oqcc/cia5rhes201i6hkjxgiyz2tkh/cia5rhes201i7hkjx6w3cspdt', + 'http://example.com/cia5rhes201i8hkjxgazao8qk/cia5rhes201i9hkjx9g0kulps/cia5rhes201iahkjxo3xkc8pd/cia5rhes201ibhkjx1dqefi47', + 'http://example.com/cia5rhes201ichkjxg5gkkixu/cia5rhes201idhkjxy4ocvh6v/cia5rhes201iehkjx4cyin399/cia5rhes201ifhkjxx2gjdbml', + 'http://example.com/cia5rhes201ighkjxhg0kk0p1/cia5rhes201ihhkjxt9erqxzy/cia5rhes201iihkjxorqialmn/cia5rhes201ijhkjxuj6s809s', + 'http://example.com/cia5rhes201ikhkjx0vne1gub/cia5rhes201ilhkjxvumlvx2e/cia5rhes201imhkjxkwp8knsu/cia5rhes201inhkjxi7n4t5yd', + 'http://example.com/cia5rhes201iohkjxzho5l61h/cia5rhes201iphkjxxe8fo8zr/cia5rhes201iqhkjxqnsimx8u/cia5rhes201irhkjxecgdhcvp', + 'http://example.com/cia5rhes201ishkjx2fi6dek5/cia5rhes201ithkjxf3i7k6mm/cia5rhes201iuhkjx0uioh430/cia5rhes201ivhkjxqw1gumyl', + 'http://example.com/cia5rhes201iwhkjxlqpv0zzb/cia5rhes201ixhkjxfxx80lsv/cia5rhes201iyhkjx6f1rt1ik/cia5rhes201izhkjx0pmgbqf9', + 'http://example.com/cia5rhes201j0hkjxi3jo8eqm/cia5rhes201j1hkjx8iahnhoa/cia5rhes201j2hkjxcp1bjuci/cia5rhes201j3hkjxushcyv9h', + 'http://example.com/cia5rhes201j4hkjxmfy3u8bq/cia5rhes201j5hkjxl6j0ozf5/cia5rhes201j6hkjx0jrm1hr3/cia5rhes201j7hkjxkgzgfuc2', + 'http://example.com/cia5rhes201j8hkjx6sbhqirt/cia5rhes201j9hkjx3jm8ttkr/cia5rhes201jahkjx4ww2jkjb/cia5rhes201jbhkjx2vwmj8mw', + 'http://example.com/cia5rhes201jchkjx6s6c38ry/cia5rhes201jdhkjxo5iduoju/cia5rhes201jehkjxl337z10k/cia5rhes201jfhkjxennzj2ed', + 'http://example.com/cia5rhes201jghkjx65xshc5s/cia5rhes201jhhkjxtrvnzhf5/cia5rhes201jihkjxers53yxq/cia5rhes201jjhkjxw8nisucr', + 'http://example.com/cia5rhes301jkhkjx7rpx2kp1/cia5rhes301jlhkjxa3840rux/cia5rhes301jmhkjx1943602l/cia5rhes301jnhkjxft42idno', + 'http://example.com/cia5rhes301johkjxoa2e62n8/cia5rhes301jphkjx8jfoflvc/cia5rhes301jqhkjxjt9rh0u6/cia5rhes301jrhkjxofoa9vq2', + 'http://example.com/cia5rhes301jshkjxnm4wl4ab/cia5rhes301jthkjx89ehf3ty/cia5rhes301juhkjxwubr4oap/cia5rhes301jvhkjxk2e8yz43', + 'http://example.com/cia5rhes301jwhkjx4bo3r583/cia5rhes301jxhkjxfmbottug/cia5rhes301jyhkjx86nc7v6s/cia5rhes301jzhkjx9h9x7167', + 'http://example.com/cia5rhes301k0hkjx0oc98odu/cia5rhes301k1hkjxdjynl4c1/cia5rhes301k2hkjxc471ye9i/cia5rhes301k3hkjxcawvse26', + 'http://example.com/cia5rhes301k4hkjxsqss9ydm/cia5rhes301k5hkjx9e2cz05j/cia5rhes301k6hkjxjb18jpjj/cia5rhes301k7hkjxai3k1edl', + 'http://example.com/cia5rhes301k8hkjxeqdbbtwd/cia5rhes301k9hkjxeliovzfz/cia5rhes301kahkjxt8kvwaw8/cia5rhes301kbhkjx334ytlc2', + 'http://example.com/cia5rhes301kchkjxl1lize37/cia5rhes301kdhkjxczqjsftr/cia5rhes301kehkjxercwjrhh/cia5rhes301kfhkjxdeb3fvgv', + 'http://example.com/cia5rhes301kghkjx0yk4gm2e/cia5rhes301khhkjxt4gdd4ly/cia5rhes301kihkjxegsqzb2u/cia5rhes301kjhkjxp1cug6e2', + 'http://example.com/cia5rhes301kkhkjxyhe6rxl6/cia5rhes301klhkjxqfebfzea/cia5rhes301kmhkjxrz0qs4pq/cia5rhes301knhkjxyskiwz5y', + 'http://example.com/cia5rhes301kohkjx3tpgvarg/cia5rhes301kphkjx19vihidz/cia5rhes301kqhkjxos60mu4k/cia5rhes301krhkjxbvenxr93', + 'http://example.com/cia5rhes301kshkjx9ysyvjir/cia5rhes301kthkjxrk2z4v9t/cia5rhes301kuhkjxitxi78qg/cia5rhes301kvhkjx6m0cf7dl', + 'http://example.com/cia5rhes301kwhkjxt4f6hr4z/cia5rhes301kxhkjxilxbilms/cia5rhes301kyhkjxotkf8aaj/cia5rhes301kzhkjx7czn8fdy', + 'http://example.com/cia5rhes301l0hkjxf9jhzc7i/cia5rhes301l1hkjx1by7b0y3/cia5rhes301l2hkjxoo8obxiq/cia5rhes301l3hkjxvoc40tkj', + 'http://example.com/cia5rhes301l4hkjxgjpxmlpv/cia5rhes301l5hkjx94yuj664/cia5rhes301l6hkjxr8e8y97y/cia5rhes301l7hkjxwznfxlhr', + 'http://example.com/cia5rhes301l8hkjxif8hgss9/cia5rhes301l9hkjxls026lu2/cia5rhes301lahkjx8g221cqp/cia5rhes301lbhkjx5nnfkl1o', + 'http://example.com/cia5rhes301lchkjx55outsg7/cia5rhes301ldhkjxa32ta3im/cia5rhes301lehkjxqzx1v4ag/cia5rhes301lfhkjxzs4h9iq8', + 'http://example.com/cia5rhes301lghkjx9zymf1is/cia5rhes301lhhkjxxi8tt4p0/cia5rhes301lihkjxwsqjsjxe/cia5rhes301ljhkjxa2tfzt6w', + 'http://example.com/cia5rhes301lkhkjxs9t7x1x9/cia5rhes301llhkjxo81fsok6/cia5rhes301lmhkjxgi0i3j3b/cia5rhes301lnhkjx5i1k3l6t', + 'http://example.com/cia5rhes301lohkjxj1t98ds7/cia5rhes301lphkjxdee7ecco/cia5rhes301lqhkjxgfslix18/cia5rhes301lrhkjx4w0teefo', + 'http://example.com/cia5rhes301lshkjxghppkl49/cia5rhes301lthkjx7b8lqwg7/cia5rhes301luhkjx9a10fkrm/cia5rhes301lvhkjxbbotm5de', + 'http://example.com/cia5rhes301lwhkjxmjdqwoun/cia5rhes301lxhkjxqscqyygp/cia5rhes301lyhkjx9v1twpxt/cia5rhes301lzhkjxedovrwz9', + 'http://example.com/cia5rhes301m0hkjxa79l057t/cia5rhes301m1hkjxi4lf4pam/cia5rhes301m2hkjxbc54aj2i/cia5rhes301m3hkjxh0uiocv9', + 'http://example.com/cia5rhes301m4hkjxehur1yoh/cia5rhes301m5hkjxa360j1dg/cia5rhes301m6hkjxxu566hbq/cia5rhes301m7hkjxx3ynzmno', + 'http://example.com/cia5rhes301m8hkjxboi8g565/cia5rhes301m9hkjxcw8d20dp/cia5rhes301mahkjxgep6vvnb/cia5rhes301mbhkjxaig0kixq', + 'http://example.com/cia5rhes301mchkjxrjfsemox/cia5rhes301mdhkjxwifr2cdy/cia5rhes301mehkjx0mfczty9/cia5rhes301mfhkjxw0d7du38', + 'http://example.com/cia5rhes301mghkjxma95b0fw/cia5rhes301mhhkjxe08g59uf/cia5rhes301mihkjx6uflwnsd/cia5rhes301mjhkjxrwodr62q', + 'http://example.com/cia5rhes301mkhkjx6rb2vspf/cia5rhes301mlhkjx95l13vr9/cia5rhes301mmhkjx8nf0whp6/cia5rhes301mnhkjxpa5k4qfz', + 'http://example.com/cia5rhes301mohkjx3lbw4jvc/cia5rhes301mphkjx80vx4999/cia5rhes301mqhkjxyyl6bvqt/cia5rhes301mrhkjxq4xrjjqk', + 'http://example.com/cia5rhes301mshkjx8bf0phng/cia5rhes301mthkjxorxsclwf/cia5rhes301muhkjxi92z3o3d/cia5rhes301mvhkjxc3pvc5j6', + 'http://example.com/cia5rhes301mwhkjxm1nnxnhb/cia5rhes301mxhkjxtkkdy3i1/cia5rhes301myhkjxcrbfcl0b/cia5rhes301mzhkjxq6p026u3', + 'http://example.com/cia5rhes301n0hkjx1c2gv11c/cia5rhes301n1hkjxxfi36cpe/cia5rhes301n2hkjx38o7jvti/cia5rhes301n3hkjx9x9p0qh6', + 'http://example.com/cia5rhes301n4hkjx04xmiymb/cia5rhes301n5hkjx1bimz4eh/cia5rhes301n6hkjxnjqswkw6/cia5rhes301n7hkjxx11qd98z', + 'http://example.com/cia5rhes301n8hkjxdgkuvg3u/cia5rhes301n9hkjx9408l8sy/cia5rhes301nahkjxbdy48hsf/cia5rhes301nbhkjx9gbl5y30', + 'http://example.com/cia5rhes301nchkjx4rj2l6gk/cia5rhes301ndhkjxw603iycn/cia5rhes301nehkjxq9p4xm5r/cia5rhes301nfhkjx17hqhk81', + 'http://example.com/cia5rhes301nghkjxm9macc2i/cia5rhes301nhhkjxubpvluxn/cia5rhes301nihkjxtznh1gve/cia5rhes301njhkjxwft7i8zr', + 'http://example.com/cia5rhes301nkhkjxf33xqqss/cia5rhes301nlhkjxt2nsxi7y/cia5rhes301nmhkjxx1k3jzgs/cia5rhes301nnhkjx377meb7x', + 'http://example.com/cia5rhes301nohkjx1iur2w22/cia5rhes301nphkjxrj1q40j2/cia5rhes301nqhkjxpv78uwi7/cia5rhes301nrhkjx74y43ako', + 'http://example.com/cia5rhes301nshkjxgqi4066n/cia5rhes301nthkjxzeax16t1/cia5rhes301nuhkjxkus1cy9e/cia5rhes301nvhkjxrk8s23la', + 'http://example.com/cia5rhes301nwhkjxtz5i4jno/cia5rhes301nxhkjxnve6r7to/cia5rhes301nyhkjxoy3cq981/cia5rhes301nzhkjxsteraq5a', + 'http://example.com/cia5rhes301o0hkjx0bjvkfri/cia5rhes301o1hkjxl3tpcl1b/cia5rhes301o2hkjxih6vk4ck/cia5rhes301o3hkjxh0vrl561', + 'http://example.com/cia5rhes301o4hkjxmqogfrad/cia5rhes301o5hkjx9m8hdpcc/cia5rhes301o6hkjxaluh3wcr/cia5rhes301o7hkjx4m8wommz', + 'http://example.com/cia5rhes301o8hkjxml1xa1az/cia5rhes301o9hkjxx678ystu/cia5rhes301oahkjxndq6nh65/cia5rhes301obhkjxadfjm3wa', + 'http://example.com/cia5rhes301ochkjxwz6f2spm/cia5rhes301odhkjxgvmfaaq8/cia5rhes301oehkjxt17j08ud/cia5rhes301ofhkjxneg64ahh', + 'http://example.com/cia5rhes301oghkjx2odplosg/cia5rhes301ohhkjx6lsxvvhc/cia5rhes301oihkjx1zjlr3lf/cia5rhes301ojhkjx4too7ovk', + 'http://example.com/cia5rhes301okhkjx5ie6svqi/cia5rhes301olhkjx1dvra0d8/cia5rhes301omhkjx01eottp8/cia5rhes301onhkjx0k4cthfm', + 'http://example.com/cia5rhes301oohkjx2uggrotk/cia5rhes301ophkjxo0nc672k/cia5rhes301oqhkjxyxv3yip2/cia5rhes301orhkjx1lzdi04w', + 'http://example.com/cia5rhes301oshkjx239gzsvl/cia5rhes301othkjxegmfaqs4/cia5rhes301ouhkjx3k7u7klw/cia5rhes301ovhkjxx0w3i22n', + 'http://example.com/cia5rhes301owhkjx43szuyvt/cia5rhes301oxhkjxwn8rt15b/cia5rhes301oyhkjxn9plrtrh/cia5rhes301ozhkjx939j8ua7', + 'http://example.com/cia5rhes301p0hkjx933v5a7c/cia5rhes301p1hkjxnptb4syc/cia5rhes301p2hkjxlbdlt4c7/cia5rhes301p3hkjxdnx9ndcb', + 'http://example.com/cia5rhes301p4hkjxgwkvdwyk/cia5rhes301p5hkjxu5l7j6a8/cia5rhes301p6hkjx69gflmy6/cia5rhes301p7hkjxl0ebaafj', + 'http://example.com/cia5rhes301p8hkjxf8355jja/cia5rhes301p9hkjxynm9lc74/cia5rhes301pahkjx9gj8htwg/cia5rhes301pbhkjx9dnwyvr7', + 'http://example.com/cia5rhes401pchkjxvc8103ko/cia5rhes401pdhkjxdvj8k8ys/cia5rhes401pehkjx1yvwz1t3/cia5rhes401pfhkjx9tdmf2pk', + 'http://example.com/cia5rhes401pghkjxm2moyuwg/cia5rhes401phhkjx6sd8pxql/cia5rhes401pihkjx0f56qfr0/cia5rhes401pjhkjxe09zm4ee', + 'http://example.com/cia5rhes401pkhkjxmw6xikqs/cia5rhes401plhkjxtrw32c5n/cia5rhes401pmhkjx2gs5r2uw/cia5rhes401pnhkjx3lnqjuvy', + 'http://example.com/cia5rhes401pohkjx18h593mm/cia5rhes401pphkjx74f4atkm/cia5rhes401pqhkjxl804wbka/cia5rhes401prhkjxvjq32png', + 'http://example.com/cia5rhes401pshkjxq7ig2fmw/cia5rhes401pthkjx94834nui/cia5rhes401puhkjxg5h7u1tk/cia5rhes401pvhkjx83fsa82j', + 'http://example.com/cia5rhes401pwhkjxslfaan9d/cia5rhes401pxhkjx5qqbf367/cia5rhes401pyhkjx9uafkt0z/cia5rhes401pzhkjxyk4qxvdq', + 'http://example.com/cia5rhes401q0hkjxxovjahis/cia5rhes401q1hkjx7811zjvy/cia5rhes401q2hkjx87k6qna2/cia5rhes401q3hkjxoj0w4dpu', + 'http://example.com/cia5rhes401q4hkjxln1jw5x1/cia5rhes401q5hkjxrh7gm7b7/cia5rhes401q6hkjx7r2y10bk/cia5rhes401q7hkjxhqkthpq6', + 'http://example.com/cia5rhes401q8hkjx6u394gyd/cia5rhes401q9hkjxrtrhrat9/cia5rhes401qahkjxdt7xqdcp/cia5rhes401qbhkjxm5ymdwfi', + 'http://example.com/cia5rhes401qchkjx025wiukn/cia5rhes401qdhkjxpovs1w4l/cia5rhes401qehkjxjdc5rv3v/cia5rhes401qfhkjxe3c0v82a', + 'http://example.com/cia5rhes401qghkjxzhl0kyt9/cia5rhes401qhhkjxx91x3w69/cia5rhes401qihkjxsldvc9au/cia5rhes401qjhkjxnag09g7f', + 'http://example.com/cia5rhes401qkhkjxp81l6si9/cia5rhes401qlhkjxdzg4648q/cia5rhes401qmhkjx5rysqo3m/cia5rhes401qnhkjxquhuyu1t', + 'http://example.com/cia5rhes401qohkjxsko3ojrg/cia5rhes401qphkjxvda749pk/cia5rhes401qqhkjxudg42xak/cia5rhes401qrhkjx7edixyt2', + 'http://example.com/cia5rhes401qshkjx9jc7o9ik/cia5rhes401qthkjxvhwfd027/cia5rhes401quhkjx22ja7ygg/cia5rhes401qvhkjxx2yc25pu', + 'http://example.com/cia5rhes401qwhkjxs1yqlawy/cia5rhes401qxhkjxap6eqaza/cia5rhes401qyhkjxhbq9zkww/cia5rhes401qzhkjx5j6rm35k', + 'http://example.com/cia5rhes401r0hkjxk8f23od8/cia5rhes401r1hkjxf2hw9jtn/cia5rhes401r2hkjx0dcvkzlo/cia5rhes401r3hkjxqgiol3kt', + 'http://example.com/cia5rhes401r4hkjxk8rzt66b/cia5rhes401r5hkjx4zc092sq/cia5rhes401r6hkjxdkgh2lu3/cia5rhes401r7hkjxrxdp47yk', + 'http://example.com/cia5rhes401r8hkjxl08yep62/cia5rhes401r9hkjx1xzzdt21/cia5rhes401rahkjxl1d6b0c6/cia5rhes401rbhkjx6zyydco5', + 'http://example.com/cia5rhes401rchkjx76v07kx8/cia5rhes401rdhkjxr6p5yan5/cia5rhes401rehkjxx6g8s1x3/cia5rhes401rfhkjxjwzjn0xv', + 'http://example.com/cia5rhes401rghkjxhiae442a/cia5rhes401rhhkjx28xtp7j6/cia5rhes401rihkjxqsail6xh/cia5rhes401rjhkjxr7kiu6ki', + 'http://example.com/cia5rhes401rkhkjxqne03tot/cia5rhes401rlhkjxjhxcypey/cia5rhes401rmhkjxsma2ekxx/cia5rhes401rnhkjx02z0sp28', + 'http://example.com/cia5rhes401rohkjxnrlforbh/cia5rhes401rphkjxuuk7smlp/cia5rhes401rqhkjxp387ih60/cia5rhes401rrhkjxxn9o7q8q', + 'http://example.com/cia5rhes401rshkjxh4lkmqca/cia5rhes401rthkjx0jm2hnqp/cia5rhes401ruhkjxeo73uqck/cia5rhes401rvhkjxjbn6t4yy', + 'http://example.com/cia5rhes401rwhkjxzepyozzy/cia5rhes401rxhkjx1pykuc1m/cia5rhes401ryhkjxpgqmomw4/cia5rhes401rzhkjx3zbmunev', + 'http://example.com/cia5rhes401s0hkjxjbbqwl70/cia5rhes401s1hkjx9xuj3zqs/cia5rhes401s2hkjxafsii503/cia5rhes401s3hkjxuu216w98', + 'http://example.com/cia5rhes401s4hkjxbbt02xp1/cia5rhes401s5hkjx1wbhsus2/cia5rhes401s6hkjx1ml5tjx2/cia5rhes401s7hkjxmxzwknq3', + 'http://example.com/cia5rhes401s8hkjxjna2smh1/cia5rhes401s9hkjxxqoxe1xs/cia5rhes401sahkjxta8cres1/cia5rhes401sbhkjxlobgkg5k', + 'http://example.com/cia5rhes401schkjx4a93mw54/cia5rhes401sdhkjx11zbb5rf/cia5rhes401sehkjxztk9dbrf/cia5rhes401sfhkjxgh3yzmo1', + 'http://example.com/cia5rhes401sghkjxc28fo8pm/cia5rhes401shhkjx94mcy08n/cia5rhes401sihkjxk9c7sc1a/cia5rhes401sjhkjx2kpauvo7', + 'http://example.com/cia5rhes401skhkjxil6rkwln/cia5rhes401slhkjx7rw9fbmh/cia5rhes401smhkjxp1azo0ra/cia5rhes401snhkjxjn6ske3g', + 'http://example.com/cia5rhes401sohkjxld97hjxq/cia5rhes401sphkjxw88rub86/cia5rhes401sqhkjxdepedlux/cia5rhes401srhkjxtz9wqykr', + 'http://example.com/cia5rhes401sshkjx23nj0gw3/cia5rhes401sthkjxamuty3aa/cia5rhes401suhkjxkzkkksxw/cia5rhes401svhkjxfy7t55xc', + 'http://example.com/cia5rhes401swhkjx2fv1t47w/cia5rhes401sxhkjx493ijzth/cia5rhes401syhkjxlt98ctc5/cia5rhes401szhkjxcgaqy6ks', + 'http://example.com/cia5rhes401t0hkjxibyaz6lz/cia5rhes401t1hkjxajqz3b7v/cia5rhes401t2hkjxutdwnzqk/cia5rhes401t3hkjxqr2zpknp', + 'http://example.com/cia5rhes401t4hkjx2me8lthv/cia5rhes401t5hkjxej9j1ggl/cia5rhes401t6hkjxoxxbptsl/cia5rhes401t7hkjx31lkyc9v', + 'http://example.com/cia5rhes401t8hkjxljaq5d24/cia5rhes401t9hkjxcj9ozsjc/cia5rhes401tahkjx45acwqjh/cia5rhes401tbhkjxsfepsuqn', + 'http://example.com/cia5rhes401tchkjx2d54v2mc/cia5rhes401tdhkjxg995kn83/cia5rhes401tehkjx3sa4rnpk/cia5rhes401tfhkjx9p5zj2fw', + 'http://example.com/cia5rhes401tghkjxetiwdot9/cia5rhes401thhkjxdzft6ee5/cia5rhes401tihkjxc44k574p/cia5rhes401tjhkjxhlaamwjt', + 'http://example.com/cia5rhes401tkhkjxfhcebmkr/cia5rhes401tlhkjx6d2ahwy8/cia5rhes401tmhkjxnvqrt43n/cia5rhes401tnhkjx6y3x0tl6', + 'http://example.com/cia5rhes401tohkjxm76vc3bd/cia5rhes401tphkjxe4toa8ix/cia5rhes401tqhkjx44k31o69/cia5rhes401trhkjx06h29ag1', + 'http://example.com/cia5rhes401tshkjx0en3ww5b/cia5rhes401tthkjxj0sbg5rs/cia5rhes401tuhkjx4mbcemrx/cia5rhes401tvhkjxzah5kckz', + 'http://example.com/cia5rhes401twhkjxbc8vo2b5/cia5rhes401txhkjx1quodrlw/cia5rhes401tyhkjx5q10omzn/cia5rhes401tzhkjxhoknv1pd', + 'http://example.com/cia5rhes401u0hkjxyboul8es/cia5rhes401u1hkjxb2vn5wu5/cia5rhes401u2hkjxat1dog9k/cia5rhes401u3hkjxg9cpxurx', + 'http://example.com/cia5rhes401u4hkjxcy69r1cg/cia5rhes401u5hkjxakh0jykj/cia5rhes401u6hkjxpsaz87je/cia5rhes401u7hkjx3ujs32jl', + 'http://example.com/cia5rhes401u8hkjxogdqi93b/cia5rhes401u9hkjxh0e8e5it/cia5rhes401uahkjxcypc72ho/cia5rhes401ubhkjx07fholph', + 'http://example.com/cia5rhes401uchkjx96q3s4y9/cia5rhes401udhkjxbw6z849k/cia5rhes401uehkjxhbtqh3g4/cia5rhes401ufhkjxbp1hjydk', + 'http://example.com/cia5rhes401ughkjxq6z30rsc/cia5rhes401uhhkjxgnc7011n/cia5rhes401uihkjx00l0t29g/cia5rhes401ujhkjxpdkefo86', + 'http://example.com/cia5rhes401ukhkjx5w5u4uez/cia5rhes401ulhkjxkp60rcm2/cia5rhes401umhkjx2o152chr/cia5rhes401unhkjxj1c837fv', + 'http://example.com/cia5rhes401uohkjxkm3hwgxw/cia5rhes401uphkjxr9fpwgxo/cia5rhes401uqhkjxbju1cc6a/cia5rhes401urhkjxnyjsugye', + 'http://example.com/cia5rhes401ushkjxnl9fzmwd/cia5rhes401uthkjx829ud4hl/cia5rhes401uuhkjxgzo6bd97/cia5rhes401uvhkjxninvqfmi', + 'http://example.com/cia5rhes401uwhkjx23xkeeyb/cia5rhes401uxhkjxr7f81k32/cia5rhes401uyhkjxu8gwxp2s/cia5rhes401uzhkjx0zbojk5h', + 'http://example.com/cia5rhes401v0hkjxnp3m2er4/cia5rhes401v1hkjxh6zxquzd/cia5rhes401v2hkjxcp9r8512/cia5rhes401v3hkjxfj2ziffr', + 'http://example.com/cia5rhes401v4hkjx450sdsy6/cia5rhes401v5hkjxid7nsxhs/cia5rhes401v6hkjx5umhcl29/cia5rhes401v7hkjx8c4ntx9f', + 'http://example.com/cia5rhes401v8hkjxm7493idl/cia5rhes401v9hkjxvp3boxa7/cia5rhes401vahkjxpdhxc0bd/cia5rhes401vbhkjxjq8g7bbv', + 'http://example.com/cia5rhes401vchkjxutbrig4f/cia5rhes401vdhkjxs6v3l5bs/cia5rhes401vehkjxz0s7ot2j/cia5rhes401vfhkjx6e86cpuy', + 'http://example.com/cia5rhes401vghkjxn3ce11di/cia5rhes401vhhkjx0lgmp1co/cia5rhes401vihkjxgjby3l0n/cia5rhes401vjhkjxh7bj2rti', + 'http://example.com/cia5rhes401vkhkjxq9xd82bm/cia5rhes401vlhkjxs2x6daye/cia5rhes401vmhkjxnv72qdm3/cia5rhes401vnhkjxjuu4sj2i', + 'http://example.com/cia5rhes401vohkjxf8wvg4tv/cia5rhes401vphkjxus1ibfvl/cia5rhes401vqhkjxaapjjznh/cia5rhes401vrhkjxhpfk9ana', + 'http://example.com/cia5rhes401vshkjxb314pxv2/cia5rhes401vthkjxcfenzpqi/cia5rhes401vuhkjxvbef4uzt/cia5rhes401vvhkjxcg2mtju1', + 'http://example.com/cia5rhes401vwhkjxobjolxrt/cia5rhes401vxhkjx8n6q1mbj/cia5rhes401vyhkjx1ffiobsm/cia5rhes401vzhkjx845f4yrb', + 'http://example.com/cia5rhes501w0hkjxnkd5nvx4/cia5rhes501w1hkjxd10zyp5f/cia5rhes501w2hkjxed1isr4c/cia5rhes501w3hkjx52w25p6h', + 'http://example.com/cia5rhes501w4hkjxz590qwcl/cia5rhes501w5hkjxirypp5am/cia5rhes501w6hkjx0la9fxfb/cia5rhes501w7hkjxqn8mmj3v', + 'http://example.com/cia5rhes501w8hkjxtvynj745/cia5rhes501w9hkjxicsfn3ft/cia5rhes501wahkjxawuf4y2u/cia5rhes501wbhkjxuioyhj09', + 'http://example.com/cia5rhes501wchkjxpzp5z6gl/cia5rhes501wdhkjxqyu6yfrv/cia5rhes501wehkjxksohpokd/cia5rhes501wfhkjxocde2wt3', + 'http://example.com/cia5rhes501wghkjxocbfchks/cia5rhes501whhkjx0tpiw1nt/cia5rhes501wihkjxslhtkvr0/cia5rhes501wjhkjx3f2wxmki', + 'http://example.com/cia5rhes501wkhkjxpmltynvl/cia5rhes501wlhkjxig3aj85x/cia5rhes501wmhkjxplefjg23/cia5rhes501wnhkjxanfao1fs', + 'http://example.com/cia5rhes501wohkjx9gnuza2e/cia5rhes501wphkjxi89ym1sn/cia5rhes501wqhkjxmpb91ix0/cia5rhes501wrhkjx6vdiefye', + 'http://example.com/cia5rhes501wshkjxxy1dl1w5/cia5rhes501wthkjxs40731ag/cia5rhes501wuhkjx5tu8ptk3/cia5rhes501wvhkjxb83m364e', + 'http://example.com/cia5rhes501wwhkjxyxi7zia4/cia5rhes501wxhkjxfttjkfl1/cia5rhes501wyhkjx73a609nu/cia5rhes501wzhkjxhrqkcsc9', + 'http://example.com/cia5rhes501x0hkjxpzoc18gx/cia5rhes501x1hkjx2evbj8dh/cia5rhes501x2hkjxcmt0dte5/cia5rhes501x3hkjxs2o08cdn', + 'http://example.com/cia5rhes501x4hkjxn8ppwkl6/cia5rhes501x5hkjxve994e14/cia5rhes501x6hkjxp3nroxzg/cia5rhes501x7hkjxdzh6iphg', + 'http://example.com/cia5rhes501x8hkjx3dxj6rdf/cia5rhes501x9hkjx0uek477t/cia5rhes501xahkjxyomgqdjw/cia5rhes501xbhkjx0adcgz3e', + 'http://example.com/cia5rhes501xchkjxjr38fuho/cia5rhes501xdhkjxi9h8gxgv/cia5rhes501xehkjx9lnq5x48/cia5rhes501xfhkjx6x7q34qn', + 'http://example.com/cia5rhes501xghkjx7kdv4j16/cia5rhes501xhhkjxzh3h1621/cia5rhes501xihkjx2tll48zr/cia5rhes501xjhkjx2mgqrjx7', + 'http://example.com/cia5rhes501xkhkjxb38ktam2/cia5rhes501xlhkjxqe4kly98/cia5rhes501xmhkjxs8kc7y4g/cia5rhes501xnhkjxon8hd6t9', + 'http://example.com/cia5rhes501xohkjxvh07sqak/cia5rhes501xphkjxa8cjku7k/cia5rhes501xqhkjx7czbmtzz/cia5rhes501xrhkjx2v5gm68q', + 'http://example.com/cia5rhes501xshkjxhafeuujz/cia5rhes501xthkjx83z1ik2e/cia5rhes501xuhkjxfwfbdp20/cia5rhes501xvhkjxat92izys', + 'http://example.com/cia5rhes501xwhkjxmxkavbl1/cia5rhes501xxhkjxjmwfaudp/cia5rhes501xyhkjxjb6y5ckv/cia5rhes501xzhkjxx1qzw43n', + 'http://example.com/cia5rhes501y0hkjxjqq91tnx/cia5rhes501y1hkjx5fqvt95y/cia5rhes501y2hkjx213i79od/cia5rhes501y3hkjx2bhrwh3c', + 'http://example.com/cia5rhes501y4hkjxpg0w8tm1/cia5rhes501y5hkjx4rfqmukn/cia5rhes501y6hkjxdmm6zlwo/cia5rhes501y7hkjxuuszpo6e', + 'http://example.com/cia5rhes501y8hkjx1dijvw0o/cia5rhes501y9hkjxh1co3ai2/cia5rhes501yahkjxfcerdd6h/cia5rhes501ybhkjx52yrnztr', + 'http://example.com/cia5rhes501ychkjxmuxdm6gn/cia5rhes501ydhkjxk9cu7gzp/cia5rhes501yehkjxt9czxhe8/cia5rhes501yfhkjxf1hpxe7k', + 'http://example.com/cia5rhes501yghkjxzyfsx9ee/cia5rhes501yhhkjxoobntt4j/cia5rhes501yihkjxbv4l41i4/cia5rhes501yjhkjx9cg8i6yq', + 'http://example.com/cia5rhes501ykhkjxb8micj52/cia5rhes501ylhkjxi810y8kg/cia5rhes501ymhkjx35pqd2dp/cia5rhes501ynhkjx411ay6w2', + 'http://example.com/cia5rhes501yohkjxp230m8o4/cia5rhes501yphkjx85aei3f0/cia5rhes501yqhkjx39awmvdg/cia5rhes501yrhkjxabhea8z7', + 'http://example.com/cia5rhes501yshkjxmy4w0zr0/cia5rhes501ythkjxxxtlmezs/cia5rhes501yuhkjx8mwm07hi/cia5rhes501yvhkjx1l5p3sr0', + 'http://example.com/cia5rhes501ywhkjxdrcc28nn/cia5rhes501yxhkjxqcqd6ogs/cia5rhes501yyhkjxim858nwj/cia5rhes501yzhkjxpi5u68xr', + 'http://example.com/cia5rhes501z0hkjxgxk8ryu8/cia5rhes501z1hkjx7jqdu67h/cia5rhes501z2hkjx21zj3rmt/cia5rhes501z3hkjxcq1lwavz', + 'http://example.com/cia5rhes501z4hkjxgx1266ef/cia5rhes501z5hkjxi6uyr5et/cia5rhes501z6hkjxhr0eot9n/cia5rhes501z7hkjxyz2oyzjs', + 'http://example.com/cia5rhes501z8hkjx5s5s200w/cia5rhes501z9hkjx67v1yb2z/cia5rhes501zahkjxw5u36sb5/cia5rhes501zbhkjxl17xibdr', + 'http://example.com/cia5rhes501zchkjxpx05d6o1/cia5rhes501zdhkjxiiadtum2/cia5rhes501zehkjxoj9i56gl/cia5rhes501zfhkjxqcxmjy73', + 'http://example.com/cia5rhes501zghkjxegc7tvdy/cia5rhes501zhhkjxqeeoq63e/cia5rhes501zihkjxysrggeqs/cia5rhes501zjhkjxf24x4w8j', + 'http://example.com/cia5rhes501zkhkjx36w5g359/cia5rhes501zlhkjxuornb7pf/cia5rhes501zmhkjx4pvpci2q/cia5rhes501znhkjxbv1oa4fp', + 'http://example.com/cia5rhes501zohkjxb6t1a9pz/cia5rhes501zphkjxg5ezhfdv/cia5rhes501zqhkjxl3efud9l/cia5rhes501zrhkjxcqb7r2sc', + 'http://example.com/cia5rhes501zshkjxd7wcvoav/cia5rhes501zthkjxelhdxd7w/cia5rhes501zuhkjxh07pf32p/cia5rhes501zvhkjxgcxn3nvl', + 'http://example.com/cia5rhes501zwhkjx95ri5zb5/cia5rhes501zxhkjxci9sujxb/cia5rhes501zyhkjx1hzc65ou/cia5rhes501zzhkjxf1kbgic9', + 'http://example.com/cia5rhes50200hkjxphxlxmld/cia5rhes50201hkjx0sveusk8/cia5rhes50202hkjxg5822asq/cia5rhes50203hkjxxle2qnr4', + 'http://example.com/cia5rhes50204hkjxswna3iww/cia5rhes50205hkjxo41y7z2t/cia5rhes50206hkjx1auwgf30/cia5rhes50207hkjx3vyiy15y', + 'http://example.com/cia5rhes50208hkjx6n640dxz/cia5rhes50209hkjxxb3tliuh/cia5rhes5020ahkjxht8vaioj/cia5rhes5020bhkjxqjo5gr27', + 'http://example.com/cia5rhes5020chkjxh9wu9gbv/cia5rhes5020dhkjxbrv63660/cia5rhes5020ehkjxbmozonad/cia5rhes5020fhkjxsek9b1wa', + 'http://example.com/cia5rhes5020ghkjxrlfea9iv/cia5rhes5020hhkjxt7qh369y/cia5rhes5020ihkjxkn7yslxt/cia5rhes5020jhkjx2ge4xq51', + 'http://example.com/cia5rhes5020khkjx2sp9c2gt/cia5rhes5020lhkjx1ks9juca/cia5rhes5020mhkjxrova7tax/cia5rhes5020nhkjxnaxah6tg', + 'http://example.com/cia5rhes5020ohkjx9btins8g/cia5rhes5020phkjxy4or4s6u/cia5rhes5020qhkjxxrqcpd3n/cia5rhes5020rhkjxm6xw3z2x', + 'http://example.com/cia5rhes5020shkjxz31fkpjb/cia5rhes5020thkjxsxivj1tx/cia5rhes5020uhkjx218dg3oe/cia5rhes5020vhkjxpxflwg9k', + 'http://example.com/cia5rhes5020whkjx3xpogsrh/cia5rhes5020xhkjxv5k6yvhb/cia5rhes5020yhkjxmg5wu4xg/cia5rhes5020zhkjx49u1376r', + 'http://example.com/cia5rhes50210hkjxu07iog9j/cia5rhes50211hkjxe2zq097b/cia5rhes50212hkjx7d2n5bis/cia5rhes50213hkjx98z0f1wd', + 'http://example.com/cia5rhes50214hkjxxz2fxal3/cia5rhes50215hkjx4cdss157/cia5rhes50216hkjxgemb403b/cia5rhes50217hkjxcx1to7hv', + 'http://example.com/cia5rhes50218hkjxlm8ctocp/cia5rhes50219hkjx1fcacxy3/cia5rhes5021ahkjxx59gdemf/cia5rhes5021bhkjxa8w89mbs', + 'http://example.com/cia5rhes5021chkjxgbgtxsby/cia5rhes5021dhkjxpsb7jlci/cia5rhes5021ehkjxo8ytwukr/cia5rhes5021fhkjxtpoy84xh', + 'http://example.com/cia5rhes5021ghkjxyk2hucae/cia5rhes5021hhkjxyiywhstb/cia5rhes5021ihkjx1sdmxxsc/cia5rhes5021jhkjxp5btccgt', + 'http://example.com/cia5rhes5021khkjxav298li6/cia5rhes5021lhkjx4ba0mhnf/cia5rhes5021mhkjxngkomyhl/cia5rhes5021nhkjxxtqqmtir', + 'http://example.com/cia5rhes5021ohkjxbavqb4tz/cia5rhes5021phkjx1f18irux/cia5rhes5021qhkjxgef61ilr/cia5rhes5021rhkjxeh1y04kj', + 'http://example.com/cia5rhes5021shkjxr4s9i0ob/cia5rhes5021thkjxfocdh5vi/cia5rhes5021uhkjxjcwajris/cia5rhes5021vhkjxitwdjshb', + 'http://example.com/cia5rhes5021whkjxwhlm3an5/cia5rhes5021xhkjx5dcoj15s/cia5rhes5021yhkjxy9biyupr/cia5rhes5021zhkjx6wit7c1p', + 'http://example.com/cia5rhes50220hkjxco3srhrz/cia5rhes50221hkjxn8kb150i/cia5rhes50222hkjxcfl48mla/cia5rhes50223hkjx5wzddel7', + 'http://example.com/cia5rhes50224hkjxv4kbq0bu/cia5rhes50225hkjxdlcujhtv/cia5rhes50226hkjx0nm0ncdj/cia5rhes50227hkjx4hnvg7w9', + 'http://example.com/cia5rhes50228hkjxn2hoexz0/cia5rhes50229hkjx5a0zae0n/cia5rhes5022ahkjx7kw3lf0v/cia5rhes5022bhkjx9uaqp2w5', + 'http://example.com/cia5rhes5022chkjxmllq37r4/cia5rhes5022dhkjxuogvq5kp/cia5rhes5022ehkjxegsxagw5/cia5rhes5022fhkjx25d5a5z8', + 'http://example.com/cia5rhes5022ghkjxwwoecae0/cia5rhes5022hhkjxli8zm9vs/cia5rhes5022ihkjxzxcky0jv/cia5rhes5022jhkjxvsb9g2qa', + 'http://example.com/cia5rhes5022khkjxhwpswkll/cia5rhes5022lhkjxow1y1vc4/cia5rhes5022mhkjxh0o8b4r5/cia5rhes5022nhkjxjsyoo9le', + 'http://example.com/cia5rhes5022ohkjx50pmnu22/cia5rhes5022phkjxfdh1jhl2/cia5rhes5022qhkjxh67gv4up/cia5rhes5022rhkjxmpux301t', + 'http://example.com/cia5rhes5022shkjxmgm2q2tv/cia5rhes5022thkjx7ivn1k01/cia5rhes5022uhkjxs4j1z1st/cia5rhes5022vhkjxh3y1ak61', + 'http://example.com/cia5rhes5022whkjxy2vkf9qu/cia5rhes5022xhkjxotujbeup/cia5rhes5022yhkjx5qiu2ujp/cia5rhes5022zhkjxluajf32y', + 'http://example.com/cia5rhes50230hkjxk7stw4db/cia5rhes60231hkjxf7aj9i0m/cia5rhes60232hkjxziydwog0/cia5rhes60233hkjxx3x1fbuc', + 'http://example.com/cia5rhes60234hkjxg2uqu0ml/cia5rhes60235hkjxq7n4gpgv/cia5rhes60236hkjxolpslbdw/cia5rhes60237hkjxyn1lp5ir', + 'http://example.com/cia5rhes60238hkjxwis4nirx/cia5rhes60239hkjxaiqtx5n6/cia5rhes6023ahkjxsgrablt0/cia5rhes6023bhkjxc06147lu', + 'http://example.com/cia5rhes6023chkjxxge8xmjn/cia5rhes6023dhkjx5j31jwgd/cia5rhes6023ehkjxwuz388j6/cia5rhes6023fhkjx3pdltokg', + 'http://example.com/cia5rhes6023ghkjx6dffsn9x/cia5rhes6023hhkjxzjoqqtor/cia5rhes6023ihkjx3bz79voa/cia5rhes6023jhkjxa7bb04th', + 'http://example.com/cia5rhes6023khkjxhg5ub876/cia5rhes6023lhkjxrklzuro9/cia5rhes6023mhkjx8xmhpdqm/cia5rhes6023nhkjxch1jn490', + 'http://example.com/cia5rhes6023ohkjxhad7g229/cia5rhes6023phkjx4zaksvdn/cia5rhes6023qhkjxx6ko1cpf/cia5rhes6023rhkjx0vireriy', + 'http://example.com/cia5rhes6023shkjxhvae8jtn/cia5rhes6023thkjxw4de6xi4/cia5rhes6023uhkjxzfqht8ml/cia5rhes6023vhkjxs8ul3zvc', + 'http://example.com/cia5rhes6023whkjxdsyyu08r/cia5rhes6023xhkjxhddko66j/cia5rhes6023yhkjxnfhgsx6b/cia5rhes6023zhkjxt63bqpbs', + 'http://example.com/cia5rhes60240hkjxa7oafjex/cia5rhes60241hkjx74x1e2f3/cia5rhes60242hkjxiaptta0r/cia5rhes60243hkjxingpv6qf', + 'http://example.com/cia5rhes60244hkjx832w9v0m/cia5rhes60245hkjxbtb4g19e/cia5rhes60246hkjxahthge6j/cia5rhes60247hkjxhqj3m07o', + 'http://example.com/cia5rhes60248hkjxcf7nc4li/cia5rhes60249hkjxyaeee0po/cia5rhes6024ahkjxz0zbl31v/cia5rhes6024bhkjxyli25oi7', + 'http://example.com/cia5rhes6024chkjxqymyzh67/cia5rhes6024dhkjx41mtrlwg/cia5rhes6024ehkjxupbohin3/cia5rhes6024fhkjx1wtwax3q', + 'http://example.com/cia5rhes6024ghkjxbhnnx8qm/cia5rhes6024hhkjx330f907k/cia5rhes6024ihkjxt8kevs6h/cia5rhes6024jhkjx6fz60hhj', + 'http://example.com/cia5rhes6024khkjx6jh6byd0/cia5rhes6024lhkjxnqak5lqd/cia5rhes6024mhkjx6qi3ka0d/cia5rhes6024nhkjxmydiqa1w', + 'http://example.com/cia5rhes6024ohkjx1wzyvp8g/cia5rhes6024phkjxcpe4crtr/cia5rhes6024qhkjx5k672peu/cia5rhes6024rhkjxrgc14c0o', + 'http://example.com/cia5rhes6024shkjxt3phdd6y/cia5rhes6024thkjxrcolx8rw/cia5rhes6024uhkjx1m8lrl96/cia5rhes6024vhkjx1ub0usjq', + 'http://example.com/cia5rhes6024whkjx30q3vye6/cia5rhes6024xhkjxqhicyl5l/cia5rhes6024yhkjxewkiuvcd/cia5rhes6024zhkjxpi0s95q6', + 'http://example.com/cia5rhes60250hkjx7x45wchz/cia5rhes60251hkjx29nj5yrn/cia5rhes60252hkjxmjtv4j8t/cia5rhes60253hkjx62flt3ct', + 'http://example.com/cia5rhes60254hkjxj24tyltz/cia5rhes60255hkjxu43vfkjt/cia5rhes60256hkjxorb3l17v/cia5rhes60257hkjxuusa9260', + 'http://example.com/cia5rhes60258hkjx2mtr4h7o/cia5rhes60259hkjxfni1laoe/cia5rhes6025ahkjxi8p6cxws/cia5rhes6025bhkjxms0v3mvk', + 'http://example.com/cia5rhes6025chkjxak2ehrye/cia5rhes6025dhkjxkkwv08j7/cia5rhes6025ehkjxmviua90r/cia5rhes6025fhkjxxz5403tq', + 'http://example.com/cia5rhes6025ghkjxw2zi9e42/cia5rhes6025hhkjxcpaquver/cia5rhes6025ihkjxdza15efa/cia5rhes6025jhkjxj10ftcde', + 'http://example.com/cia5rhes6025khkjxzdgyklzu/cia5rhes6025lhkjxepec48wo/cia5rhes6025mhkjxrr0rxhsw/cia5rhes6025nhkjxbx5apxib', + 'http://example.com/cia5rhes6025ohkjxmw1aiv3f/cia5rhes6025phkjxf2m420e9/cia5rhes6025qhkjxjiwth0yz/cia5rhes6025rhkjxrmxufevy', + 'http://example.com/cia5rhes6025shkjxusdiwv01/cia5rhes6025thkjxds425t8m/cia5rhes6025uhkjxuqrtt7if/cia5rhes6025vhkjxowk5zvf3', + 'http://example.com/cia5rhes6025whkjxh652j091/cia5rhes6025xhkjxg7n9opan/cia5rhes6025yhkjxhx4aysaj/cia5rhes6025zhkjxu82h4n54', + 'http://example.com/cia5rhes60260hkjxi674w0z0/cia5rhes60261hkjxojs9dwc5/cia5rhes60262hkjx9zme8232/cia5rhes60263hkjxg3tduw2q', + 'http://example.com/cia5rhes60264hkjxen5f1emm/cia5rhes60265hkjx9wlrydmg/cia5rhes60266hkjxyk0z00l1/cia5rhes60267hkjxim57nlkk', + 'http://example.com/cia5rhes60268hkjx0dxjfg9r/cia5rhes60269hkjxvsd7fx55/cia5rhes6026ahkjxr4wv79py/cia5rhes6026bhkjxbtuynf74', + 'http://example.com/cia5rhes6026chkjx0hbrlens/cia5rhes6026dhkjx4oarjdzi/cia5rhes6026ehkjxcfh9kh1i/cia5rhes6026fhkjxdvhhj9ps', + 'http://example.com/cia5rhes6026ghkjxzbxwxiwi/cia5rhes6026hhkjx10dmy3ck/cia5rhes6026ihkjxrh57qzib/cia5rhes6026jhkjxa6wqf4ro', + 'http://example.com/cia5rhes6026khkjxw4rqjhaq/cia5rhes6026lhkjxuc55dmgp/cia5rhes6026mhkjxlv6a6sz0/cia5rhes6026nhkjxwxm1u6cu', + 'http://example.com/cia5rhes6026ohkjxcezmtk1t/cia5rhes6026phkjxt8hncf2i/cia5rhes6026qhkjxuxprl91o/cia5rhes6026rhkjx9ujzo2je', + 'http://example.com/cia5rhes6026shkjxxutau6ka/cia5rhes6026thkjxa2hy9mje/cia5rhes6026uhkjxr2vho147/cia5rhes6026vhkjx7h70z8i9', + 'http://example.com/cia5rhes6026whkjx1nagxk22/cia5rhes6026xhkjxke02jgeq/cia5rhes6026yhkjxhemx0l0x/cia5rhes6026zhkjx8uhw94o4', + 'http://example.com/cia5rhes60270hkjxtpo8z0gx/cia5rhes60271hkjxaldlng02/cia5rhes60272hkjxi6u6vyos/cia5rhes60273hkjx8t4gz8q3', + 'http://example.com/cia5rhes60274hkjxzetzmgfp/cia5rhes60275hkjxqtd9rh66/cia5rhes60276hkjxo38ak1v6/cia5rhes60277hkjx3t2grzdi', + 'http://example.com/cia5rhes60278hkjxssjf92tp/cia5rhes60279hkjxtdiimuwo/cia5rhes6027ahkjxv7i327um/cia5rhes6027bhkjx34iyiwau', + 'http://example.com/cia5rhes6027chkjxsalv7vq1/cia5rhes6027dhkjxj1qa0eqe/cia5rhes6027ehkjxdstykpct/cia5rhes6027fhkjxep1lg57f', + 'http://example.com/cia5rhes6027ghkjxir6tvp5r/cia5rhes6027hhkjx37mwtxmp/cia5rhes6027ihkjxajh8kdk0/cia5rhes6027jhkjxprxxf6bf', + 'http://example.com/cia5rhes6027khkjxtx8rt4eg/cia5rhes6027lhkjx6stckrq2/cia5rhes6027mhkjxbp2scl06/cia5rhes6027nhkjx5tcodm70', + 'http://example.com/cia5rhes6027ohkjx02hq4e4i/cia5rhes6027phkjxpj98682x/cia5rhes6027qhkjxi6t9w6j8/cia5rhes6027rhkjxdoo5aitq', + 'http://example.com/cia5rhes6027shkjxq61ipcpf/cia5rhes6027thkjx4c95chxk/cia5rhes6027uhkjx5yp65br8/cia5rhes6027vhkjxgaj3cw9t', + 'http://example.com/cia5rhes6027whkjxx18if78t/cia5rhes6027xhkjxeruuk14w/cia5rhes6027yhkjxzur0jh40/cia5rhes6027zhkjx2zxmcdyy', + 'http://example.com/cia5rhes60280hkjxrh298dzu/cia5rhes60281hkjx5m40ppz3/cia5rhes60282hkjxfak6x0vp/cia5rhes60283hkjxcokmxlit', + 'http://example.com/cia5rhes60284hkjx58dts12q/cia5rhes60285hkjx7hgaud95/cia5rhes60286hkjxdycu90lv/cia5rhes60287hkjxjj4cgdk8', + 'http://example.com/cia5rhes60288hkjxai7gc5c8/cia5rhes60289hkjxbnomezv6/cia5rhes6028ahkjxw7wxahj2/cia5rhes6028bhkjx1smzie0j', + 'http://example.com/cia5rhes6028chkjxa57aiiju/cia5rhes6028dhkjxs1etgvw7/cia5rhes6028ehkjxtsbz6p0z/cia5rhes6028fhkjxmo1vsspv', + 'http://example.com/cia5rhes6028ghkjxieobtxp5/cia5rhes6028hhkjx9ragsscj/cia5rhes6028ihkjx385kpk1h/cia5rhes6028jhkjxotj68l1k', + 'http://example.com/cia5rhes6028khkjxea5reemm/cia5rhes6028lhkjx0kwzwbyo/cia5rhes6028mhkjx4nqjjcde/cia5rhes6028nhkjxzrrex5ue', + 'http://example.com/cia5rhes6028ohkjx7t2lhe7z/cia5rhes6028phkjx46qyubif/cia5rhes6028qhkjxjolbuqus/cia5rhes6028rhkjx8r7ii6z7', + 'http://example.com/cia5rhes6028shkjxilpnvd7j/cia5rhes6028thkjxof8m415p/cia5rhes6028uhkjxjp4mywli/cia5rhes6028vhkjxcw58yxw0', + 'http://example.com/cia5rhes6028whkjxhya97tqs/cia5rhes6028xhkjxpezwz1pe/cia5rhes6028yhkjxx59c4igt/cia5rhes6028zhkjxdjv35rpr', + 'http://example.com/cia5rhes60290hkjxnthanean/cia5rhes60291hkjxni7pjxv4/cia5rhes60292hkjx0flrl74n/cia5rhes60293hkjxm9x63zo7', + 'http://example.com/cia5rhes60294hkjxpnfmclsw/cia5rhes60295hkjx56ccc80r/cia5rhes60296hkjx4s91lrwv/cia5rhes60297hkjxf132ofl7', + 'http://example.com/cia5rhes60298hkjxl3mctpt0/cia5rhes60299hkjxvlg5nt62/cia5rhes6029ahkjx336mdt5q/cia5rhes6029bhkjxx1be21if', + 'http://example.com/cia5rhes6029chkjxo22y49m7/cia5rhes6029dhkjx1llimb0p/cia5rhes6029ehkjxt13ucuxv/cia5rhes6029fhkjxh2xoljln', + 'http://example.com/cia5rhes6029ghkjx68wd962d/cia5rhes6029hhkjx387d5swn/cia5rhes6029ihkjxh34aue0p/cia5rhes6029jhkjxfh61fg9l', + 'http://example.com/cia5rhes6029khkjxuz53ttqc/cia5rhes6029lhkjxvrp7a6bu/cia5rhes6029mhkjx5ug57g8j/cia5rhes6029nhkjxiv7fjxr3', + 'http://example.com/cia5rhes6029ohkjx2im4dkbc/cia5rhes6029phkjxk2vkitw7/cia5rhes6029qhkjx1g18697q/cia5rhes6029rhkjxu7cv0cp5', + 'http://example.com/cia5rhes6029shkjxzfgxcfx5/cia5rhes6029thkjx6bi4op1u/cia5rhes6029uhkjx57v7j2tp/cia5rhes6029vhkjxqsn3ros1', + 'http://example.com/cia5rhes7029whkjx33b3346i/cia5rhes7029xhkjxnhbvzlyl/cia5rhes7029yhkjxhofpksax/cia5rhes7029zhkjxpckp9le4', + 'http://example.com/cia5rhes702a0hkjx6pzs7e5d/cia5rhes702a1hkjxp2x65zqo/cia5rhes702a2hkjxu66pcizj/cia5rhes702a3hkjx7o8r0f06', + 'http://example.com/cia5rhes702a4hkjxs3nk500n/cia5rhes702a5hkjxg0rbzm6k/cia5rhes702a6hkjx234c6g7e/cia5rhes702a7hkjx9ocd54xq', + 'http://example.com/cia5rhes702a8hkjxhv3xsjpp/cia5rhes702a9hkjxofxw9mdy/cia5rhes702aahkjxwtmyec4h/cia5rhes702abhkjxly8sn8hi', + 'http://example.com/cia5rhes702achkjx7zlau40c/cia5rhes702adhkjx6i9t1hdm/cia5rhes702aehkjx3w115jp6/cia5rhes702afhkjx3spdsa1v', + 'http://example.com/cia5rhes702aghkjxd4i1f3k7/cia5rhes702ahhkjx1o7338m9/cia5rhes702aihkjx3issv8lp/cia5rhes702ajhkjxkkpxy74s', + 'http://example.com/cia5rhes702akhkjxdng2ft24/cia5rhes702alhkjxvf0nimyo/cia5rhes702amhkjxubx3l0hc/cia5rhes702anhkjxjdg78083', + 'http://example.com/cia5rhes702aohkjxb6np3w0m/cia5rhes702aphkjxbmp49sgd/cia5rhes702aqhkjx3wm23ff0/cia5rhes702arhkjx9ht9wc86', + 'http://example.com/cia5rhes702ashkjxw56jbjfz/cia5rhes702athkjx6js735z5/cia5rhes702auhkjxucfu5lpt/cia5rhes702avhkjxbyglt9ex', + 'http://example.com/cia5rhes702awhkjx18s0uu13/cia5rhes702axhkjxi3zrv40h/cia5rhes702ayhkjx3a8cp916/cia5rhes702azhkjxczqrzngo', + 'http://example.com/cia5rhes702b0hkjxglj4n5o7/cia5rhes702b1hkjx63bg4kb1/cia5rhes702b2hkjx60relgsi/cia5rhes702b3hkjxiol0e8ym', + 'http://example.com/cia5rhes702b4hkjxjfpk1sg5/cia5rhes702b5hkjxk428e7bk/cia5rhes702b6hkjxr97qxcy0/cia5rhes702b7hkjxdyz4rzzn', + 'http://example.com/cia5rhes702b8hkjx7vylah33/cia5rhes702b9hkjxinhs95fl/cia5rhes702bahkjxpengba9m/cia5rhes702bbhkjxh5smj013', + 'http://example.com/cia5rhes702bchkjxqce1aoab/cia5rhes702bdhkjxaiyf10a3/cia5rhes702behkjx5yqopkqf/cia5rhes702bfhkjx3hiu4jp5', + 'http://example.com/cia5rhes702bghkjx27997nof/cia5rhes702bhhkjxh131a1mu/cia5rhes702bihkjxdv7jmcf7/cia5rhes702bjhkjxu56c6np2', + 'http://example.com/cia5rhes702bkhkjxqpt1iswl/cia5rhes702blhkjxxvuevm79/cia5rhes702bmhkjxlb6egm5v/cia5rhes702bnhkjx0frya4zv', + 'http://example.com/cia5rhes702bohkjx62rqvbxx/cia5rhes702bphkjxn5543qcw/cia5rhes702bqhkjxo6xrcl3m/cia5rhes702brhkjxxiyxytk6', + 'http://example.com/cia5rhes702bshkjxtupz79qv/cia5rhes702bthkjx46tmi8da/cia5rhes702buhkjxa076ev9b/cia5rhes702bvhkjxwzgfevcu', + 'http://example.com/cia5rhes702bwhkjxwmx0x18a/cia5rhes702bxhkjxpq4el7be/cia5rhes702byhkjxwlypdgqk/cia5rhes702bzhkjxf16uiqj9', + 'http://example.com/cia5rhes702c0hkjx0oylz3z7/cia5rhes702c1hkjxnka3undy/cia5rhes702c2hkjx9pvadq7q/cia5rhes702c3hkjxubumi03d', + 'http://example.com/cia5rhes702c4hkjxv1je61d0/cia5rhes702c5hkjx3gud1w7h/cia5rhes702c6hkjxhbputn4m/cia5rhes702c7hkjx2fwamiyv', + 'http://example.com/cia5rhes702c8hkjxbgkmje13/cia5rhes702c9hkjxlumxva5q/cia5rhes702cahkjxmiet3v1x/cia5rhes702cbhkjx8ibo8t0v', + 'http://example.com/cia5rhes702cchkjxyl6aj596/cia5rhes702cdhkjxuk4jdais/cia5rhes702cehkjxznkrhgcf/cia5rhes702cfhkjxedld1xxc', + 'http://example.com/cia5rhes702cghkjxc2ry2vt4/cia5rhes702chhkjxahplgyzs/cia5rhes702cihkjxdfgeirre/cia5rhes702cjhkjx5k6zbwnv', + 'http://example.com/cia5rhes702ckhkjxt8jo94yh/cia5rhes702clhkjxsjs9l544/cia5rhes702cmhkjxob8bd0zc/cia5rhes702cnhkjx6cfcl3n9', + 'http://example.com/cia5rhes702cohkjxb9cd9ogj/cia5rhes702cphkjxpoorw1yg/cia5rhes702cqhkjxykcpxjap/cia5rhes702crhkjx3469lxlp', + 'http://example.com/cia5rhes702cshkjxmwi9wm5t/cia5rhes702cthkjx8tmzifvh/cia5rhes702cuhkjx4l68blak/cia5rhes702cvhkjxdxodcgpw', + 'http://example.com/cia5rhes702cwhkjx0tbp18xa/cia5rhes702cxhkjxa9e95679/cia5rhes702cyhkjxpunm4oge/cia5rhes702czhkjxsxewphj9', + 'http://example.com/cia5rhes702d0hkjx1a2yy8af/cia5rhes702d1hkjx4f2cssht/cia5rhes702d2hkjxa1d631y5/cia5rhes702d3hkjx5isc7bl5', + 'http://example.com/cia5rhes702d4hkjxxf0dzxl4/cia5rhes702d5hkjxxnd097v7/cia5rhes702d6hkjx98mpvdya/cia5rhes702d7hkjx284luop7', + 'http://example.com/cia5rhes702d8hkjxy6hghmfk/cia5rhes702d9hkjxr4ozxswm/cia5rhes702dahkjx4aemrdzl/cia5rhes702dbhkjx3b9om3gn', + 'http://example.com/cia5rhes702dchkjx2q559yuu/cia5rhes702ddhkjxr1frvgb5/cia5rhes702dehkjx59to46ip/cia5rhes702dfhkjxtjmix0kn', + 'http://example.com/cia5rhes702dghkjxk4m6a2s0/cia5rhes702dhhkjxfwaeszqy/cia5rhes702dihkjx4zf8y4ca/cia5rhes702djhkjxvhfrquil', + 'http://example.com/cia5rhes702dkhkjx2orxsnm3/cia5rhes702dlhkjx47rdcwpv/cia5rhes702dmhkjx8j62q07m/cia5rhes702dnhkjxt3qftg4a', + 'http://example.com/cia5rhes702dohkjxer57v1ky/cia5rhes702dphkjxjbishjq1/cia5rhes702dqhkjxt8r2fmuw/cia5rhes702drhkjx8etd1xkq', + 'http://example.com/cia5rhes702dshkjxwbjmsogs/cia5rhes702dthkjxzjt0f26i/cia5rhes702duhkjxrspfet0e/cia5rhes702dvhkjx24ih1puf', + 'http://example.com/cia5rhes702dwhkjx4qx5ofni/cia5rhes702dxhkjxyxhxsw0c/cia5rhes702dyhkjx8mi9wbce/cia5rhes702dzhkjxr9gk1g19', + 'http://example.com/cia5rhes702e0hkjxin8zq13k/cia5rhes702e1hkjxn5bq0ikw/cia5rhes702e2hkjxxb2qoxsk/cia5rhes702e3hkjxbco0q0qj', + 'http://example.com/cia5rhes702e4hkjxhxbl6l43/cia5rhes702e5hkjx0zz697fh/cia5rhes702e6hkjxfdsk112c/cia5rhes702e7hkjxabbxyd7j', + 'http://example.com/cia5rhes702e8hkjx3vnctynz/cia5rhes702e9hkjxg4zopm86/cia5rhes702eahkjxo3bg8ml3/cia5rhes702ebhkjxp3aeugu4', + 'http://example.com/cia5rhes702echkjxal3j832h/cia5rhes702edhkjx1lyibi15/cia5rhes702eehkjxstdtwkp6/cia5rhes702efhkjxdnbnyno0', + 'http://example.com/cia5rhes702eghkjx55wp2mw0/cia5rhes702ehhkjxwmxwjl29/cia5rhes702eihkjxg7t126ld/cia5rhes702ejhkjx15qdziu1', + 'http://example.com/cia5rhes702ekhkjxc0im9wy4/cia5rhes702elhkjxh2jd7hzr/cia5rhes702emhkjxcu8r9pzm/cia5rhes702enhkjx9jbgidf1', + 'http://example.com/cia5rhes702eohkjxhlu6h4ep/cia5rhes702ephkjx4mwoc3ql/cia5rhes702eqhkjxe2bwkjv6/cia5rhes702erhkjxh8shrs32', + 'http://example.com/cia5rhes702eshkjxs8w53l9b/cia5rhes702ethkjx1xsjdbbm/cia5rhes702euhkjxjrkym5vf/cia5rhes702evhkjxsuode17c', + 'http://example.com/cia5rhes702ewhkjxj1bzme2d/cia5rhes702exhkjx88mzjzre/cia5rhes702eyhkjxst5flmg9/cia5rhes702ezhkjxdar3h55h', + 'http://example.com/cia5rhes702f0hkjxrdjoki1j/cia5rhes702f1hkjx7iz1lpso/cia5rhes702f2hkjxvsyy2boh/cia5rhes702f3hkjxe4lwxkjq', + 'http://example.com/cia5rhes702f4hkjxhsgvfwf9/cia5rhes702f5hkjxtemdddm6/cia5rhes702f6hkjx8t7z5qmo/cia5rhes702f7hkjxgb9mzb5t', + 'http://example.com/cia5rhes702f8hkjxen7vbt3a/cia5rhes702f9hkjxozpijk1f/cia5rhes702fahkjxh2l1f7h6/cia5rhes702fbhkjxxojzw7gn', + 'http://example.com/cia5rhes702fchkjx0tvnzt2w/cia5rhes702fdhkjxbi6zt33e/cia5rhes702fehkjxd54fxgzx/cia5rhes702ffhkjxsayc02os', + 'http://example.com/cia5rhes702fghkjxpygjjz89/cia5rhes702fhhkjxbct2ojjb/cia5rhes702fihkjxe46ngi4m/cia5rhes702fjhkjxq7azlfig', + 'http://example.com/cia5rhes702fkhkjx1ff4tumn/cia5rhes702flhkjxosiemsy8/cia5rhes702fmhkjx0o6ktv9m/cia5rhes702fnhkjxj9yp67gs', + 'http://example.com/cia5rhes702fohkjxqro5xqt8/cia5rhes702fphkjx6s3gi6y0/cia5rhes702fqhkjxkkab85zz/cia5rhes702frhkjxo03b56tw', + 'http://example.com/cia5rhes702fshkjxlvaiv6rz/cia5rhes702fthkjxvkg1r7dy/cia5rhes702fuhkjx3txhokr4/cia5rhes702fvhkjxtvqvs9ei', + 'http://example.com/cia5rhes702fwhkjx5mknq1w5/cia5rhes702fxhkjxrj6a3pub/cia5rhes702fyhkjxvhu05ms3/cia5rhes702fzhkjxjby42qra', + 'http://example.com/cia5rhes702g0hkjxrcf4pcw1/cia5rhes702g1hkjxn081wq4r/cia5rhes702g2hkjxaf91n239/cia5rhes702g3hkjxxlcnut0h', + 'http://example.com/cia5rhes702g4hkjxboifrcf9/cia5rhes702g5hkjxzdowoz5o/cia5rhes702g6hkjxukarx97t/cia5rhes702g7hkjxccz4m3ra', + 'http://example.com/cia5rhes702g8hkjxcojon0ux/cia5rhes702g9hkjxldlady20/cia5rhes702gahkjxzy3fh4eg/cia5rhes702gbhkjxrbfe6e4i', + 'http://example.com/cia5rhes702gchkjxk66e8nbf/cia5rhes702gdhkjxudeemkvv/cia5rhes702gehkjx3c3hpe66/cia5rhes702gfhkjxn9olbr7q', + 'http://example.com/cia5rhes702gghkjxjutmvz9r/cia5rhes702ghhkjxevjnumc0/cia5rhes702gihkjxcsgdpbt7/cia5rhes702gjhkjxkajsb5n7', + 'http://example.com/cia5rhes702gkhkjxpctjecch/cia5rhes702glhkjx4psglrrf/cia5rhes702gmhkjxqsa29brc/cia5rhes702gnhkjxtu5lc4me', + 'http://example.com/cia5rhes702gohkjxy4ljuvei/cia5rhes702gphkjxscllm1ij/cia5rhes702gqhkjx1e8d9ndd/cia5rhes702grhkjxvt3mx80t', + 'http://example.com/cia5rhes702gshkjxex3gg0nz/cia5rhes702gthkjxlonhrzjs/cia5rhes702guhkjxl4vdp4al/cia5rhes702gvhkjxvu5xtj65', + 'http://example.com/cia5rhes702gwhkjx2eqa8s8p/cia5rhes702gxhkjxzs0d96f8/cia5rhes702gyhkjxh5qhyc6d/cia5rhes702gzhkjxit6h6kq6', + 'http://example.com/cia5rhes702h0hkjxovyyxzzh/cia5rhes702h1hkjxumx2doq9/cia5rhes702h2hkjxe8rwx6ye/cia5rhes702h3hkjxd0biux3c', + 'http://example.com/cia5rhes702h4hkjx0r9rhds4/cia5rhes802h5hkjxxe3pbik6/cia5rhes802h6hkjxkoyqybob/cia5rhes802h7hkjx0s2gcxkk', + 'http://example.com/cia5rhes802h8hkjx1b212net/cia5rhes802h9hkjxhye14m2j/cia5rhes802hahkjxf87hamb3/cia5rhes802hbhkjxvqh1ek5s', + 'http://example.com/cia5rhes802hchkjx5hdnwwul/cia5rhes802hdhkjxyc9ojtpr/cia5rhes802hehkjxdnrgdch1/cia5rhes802hfhkjxj6gwgjbt', + 'http://example.com/cia5rhes802hghkjxehwpywy9/cia5rhes802hhhkjx4lbi6x6l/cia5rhes802hihkjxnpf2cz93/cia5rhes802hjhkjxv9bgej4e', + 'http://example.com/cia5rhes802hkhkjxta1aj8pd/cia5rhes802hlhkjxqot5lx49/cia5rhes802hmhkjxs0uj77o1/cia5rhes802hnhkjx69uqlhl9', + 'http://example.com/cia5rhes802hohkjxsetak465/cia5rhes802hphkjx7cc4cvnw/cia5rhes802hqhkjxyz2rd85f/cia5rhes802hrhkjxwwwj80zy', + 'http://example.com/cia5rhes802hshkjxcxpfz2zy/cia5rhes802hthkjx0mg13xvr/cia5rhes802huhkjxl8tf2f1j/cia5rhes802hvhkjxkkdxui48', + 'http://example.com/cia5rhes802hwhkjxnt5u3nhm/cia5rhes802hxhkjxbffb2x8l/cia5rhes802hyhkjxd0tm0h6e/cia5rhes802hzhkjxua697jh2', + 'http://example.com/cia5rhes802i0hkjx5thy2y3q/cia5rhes802i1hkjx3jr1y269/cia5rhes802i2hkjxwwksi6eg/cia5rhes802i3hkjxor5nv0z2', + 'http://example.com/cia5rhes802i4hkjx4ttg4je9/cia5rhes802i5hkjxqzq7w677/cia5rhes802i6hkjxeldnbsf2/cia5rhes802i7hkjxk8rmgjfv', + 'http://example.com/cia5rhes802i8hkjx6eb7w4np/cia5rhes802i9hkjxstgvt28t/cia5rhes802iahkjx8b9vwdzr/cia5rhes802ibhkjx1pnrsc7b', + 'http://example.com/cia5rhes802ichkjxvo1nrawf/cia5rhes802idhkjxgivthtjh/cia5rhes802iehkjxx967w9dk/cia5rhes802ifhkjxuu3hsee9', + 'http://example.com/cia5rhes802ighkjxeijczff2/cia5rhes802ihhkjxer0knjjl/cia5rhes802iihkjx116p0tfc/cia5rhes802ijhkjxuomqb7a0', + 'http://example.com/cia5rhes802ikhkjxzw0s6ejs/cia5rhes802ilhkjx1fgypntw/cia5rhes802imhkjx7jreimgw/cia5rhes802inhkjx3shm6234', + 'http://example.com/cia5rhes802iohkjx28sv1ivu/cia5rhes802iphkjxr4p098ji/cia5rhes802iqhkjxdsotusgp/cia5rhes802irhkjx5kudhhd2', + 'http://example.com/cia5rhes802ishkjxixiz6mp1/cia5rhes802ithkjxcagn4wzv/cia5rhes802iuhkjxnulj8edc/cia5rhes802ivhkjxkc73vmwx', + 'http://example.com/cia5rhes802iwhkjx0gdh9w2o/cia5rhes802ixhkjxcl50g4e1/cia5rhes802iyhkjxrptys42g/cia5rhes802izhkjx4w62hqht', + 'http://example.com/cia5rhes802j0hkjx692slfdu/cia5rhes802j1hkjxv3bwwytl/cia5rhes802j2hkjxx3gky18b/cia5rhes802j3hkjx3vsa5jra', + 'http://example.com/cia5rhes802j4hkjx2xe9zlx3/cia5rhes802j5hkjx4f3wi9rl/cia5rhes802j6hkjx2qr5bzrp/cia5rhes802j7hkjxrw3fcfe5', + 'http://example.com/cia5rhes802j8hkjx14k6emm1/cia5rhes802j9hkjxcll7rahj/cia5rhes802jahkjx6dmkabft/cia5rhes802jbhkjxj2d4kvm5', + 'http://example.com/cia5rhes802jchkjxu3olmu84/cia5rhes802jdhkjx1kyxhqd9/cia5rhes802jehkjxmzlxuvus/cia5rhes802jfhkjxt7cvj5h1', + 'http://example.com/cia5rhes802jghkjx80q77jzc/cia5rhes802jhhkjxtj8xxa1e/cia5rhes802jihkjxu4lnwkqf/cia5rhes802jjhkjx33w6a2yi', + 'http://example.com/cia5rhes802jkhkjxefk60o55/cia5rhes802jlhkjx9yuz30ib/cia5rhes802jmhkjxhuhfcbcy/cia5rhes802jnhkjxf6wkt9ht', + 'http://example.com/cia5rhes802johkjxbbd9f8zb/cia5rhes802jphkjxzk5mtk4f/cia5rhes802jqhkjxwb6eerfn/cia5rhes802jrhkjxpuyyqgqw', + 'http://example.com/cia5rhes802jshkjxbgeqep0t/cia5rhes802jthkjxdkbxnh69/cia5rhes802juhkjx03vlhdpu/cia5rhes802jvhkjx8zhdnauu', + 'http://example.com/cia5rhes802jwhkjxkw5bbsew/cia5rhes802jxhkjxgzdwzev2/cia5rhes802jyhkjxeutiz8ot/cia5rhes802jzhkjxeigt9qdf', + 'http://example.com/cia5rhes802k0hkjxvmfunndw/cia5rhes802k1hkjx6j968gws/cia5rhes802k2hkjxjdz6yfk6/cia5rhes802k3hkjxnsoiuwfm', + 'http://example.com/cia5rhes802k4hkjx7fezq8em/cia5rhes802k5hkjxsgmtvhig/cia5rhes802k6hkjx8h5r0ac5/cia5rhes802k7hkjxm0tczqr3', + 'http://example.com/cia5rhes802k8hkjx3ej667en/cia5rhes802k9hkjxeta3mqrs/cia5rhes802kahkjxttm3mtbc/cia5rhes802kbhkjx08tnchxt', + 'http://example.com/cia5rhes802kchkjxs9ys1d1h/cia5rhes802kdhkjxa7zfmkfh/cia5rhes802kehkjx0f1f3s5x/cia5rhes802kfhkjx5bkfptdv', + 'http://example.com/cia5rhes802kghkjxfbx0j2be/cia5rhes802khhkjx2796rmnr/cia5rhes802kihkjxc8qjmfqv/cia5rhes802kjhkjx5l18ngbo', + 'http://example.com/cia5rhes802kkhkjxuvxeycqp/cia5rhes802klhkjxt3xak01c/cia5rhes802kmhkjxsnbinf75/cia5rhes802knhkjxdke5f04u', + 'http://example.com/cia5rhes802kohkjxlr2esas9/cia5rhes802kphkjxoi8bubek/cia5rhes802kqhkjx652tsdtk/cia5rhes802krhkjxx0d9sapx', + 'http://example.com/cia5rhes802kshkjx01h9i4q2/cia5rhes802kthkjxnvp9j4x1/cia5rhes802kuhkjxyfb118if/cia5rhes802kvhkjxcajg7k7x', + 'http://example.com/cia5rhes802kwhkjx1ahqqj6a/cia5rhes802kxhkjx576izsui/cia5rhes802kyhkjxdopj85lq/cia5rhes802kzhkjxrak3td4w', + 'http://example.com/cia5rhes802l0hkjx4oalj3hp/cia5rhes802l1hkjxuiaufryz/cia5rhes802l2hkjx3yx8z13v/cia5rhes802l3hkjxql0nh4mw', + 'http://example.com/cia5rhes802l4hkjxh2yk4att/cia5rhes802l5hkjx1ld7evsc/cia5rhes802l6hkjx64mt6pcs/cia5rhes802l7hkjxoa0hr513', + 'http://example.com/cia5rhes802l8hkjxb8puz3pu/cia5rhes802l9hkjx40l0wzy4/cia5rhes802lahkjxvqaauxku/cia5rhes802lbhkjxxe2r13sb', + 'http://example.com/cia5rhes802lchkjxp07dxy3z/cia5rhes802ldhkjx4p23lqcu/cia5rhes802lehkjxj1swfy96/cia5rhes802lfhkjxeppnm27y', + 'http://example.com/cia5rhes802lghkjxowt32sxr/cia5rhes802lhhkjxr2wyl9ej/cia5rhes802lihkjx62orwsjq/cia5rhes802ljhkjxw99oj10o', + 'http://example.com/cia5rhes802lkhkjxieavj07d/cia5rhes802llhkjxrglllbwb/cia5rhes802lmhkjxjbmalhyj/cia5rhes802lnhkjx54ff2569', + 'http://example.com/cia5rhes802lohkjxgar3wut3/cia5rhes802lphkjx3y6byab9/cia5rhes802lqhkjx2ki1hks2/cia5rhes802lrhkjx867oulq5', + 'http://example.com/cia5rhes802lshkjxb7hkzrqs/cia5rhes802lthkjxfu4yyljq/cia5rhes802luhkjxqswmaz83/cia5rhes802lvhkjxcgjxwpin', + 'http://example.com/cia5rhes802lwhkjxnow6sr6f/cia5rhes802lxhkjxbtxn02ok/cia5rhes802lyhkjxtreu397w/cia5rhes802lzhkjx9fbk1l2s', + 'http://example.com/cia5rhes802m0hkjxuov8bbjf/cia5rhes802m1hkjxfjxcjswu/cia5rhes802m2hkjxnuumriep/cia5rhes802m3hkjxv3abuieh', + 'http://example.com/cia5rhes802m4hkjx7chzbj7m/cia5rhes802m5hkjxamwwacgg/cia5rhes802m6hkjxalw3n1b1/cia5rhes802m7hkjx4oobkiqi', + 'http://example.com/cia5rhes802m8hkjx01qpkvwg/cia5rhes802m9hkjx8s23cjy5/cia5rhes802mahkjx7zklmzeg/cia5rhes802mbhkjxs9htzggq', + 'http://example.com/cia5rhes802mchkjxn4kg4arq/cia5rhes802mdhkjxrlms5rxt/cia5rhes802mehkjx51y6d37q/cia5rhes802mfhkjxgq01e010', + 'http://example.com/cia5rhes802mghkjxcuk2pmky/cia5rhes802mhhkjxcy28ajz9/cia5rhes802mihkjxm3xz72d2/cia5rhes802mjhkjxfecrsmb1', + 'http://example.com/cia5rhes802mkhkjx976oo1q6/cia5rhes802mlhkjxt1d0ks1h/cia5rhes802mmhkjxlya2lnkr/cia5rhes802mnhkjxcjv6cg22', + 'http://example.com/cia5rhes802mohkjxbmd2ljcc/cia5rhes802mphkjxqmpsf43e/cia5rhes802mqhkjx1018sa5h/cia5rhes802mrhkjx83lcx364', + 'http://example.com/cia5rhes802mshkjxx317boaq/cia5rhes802mthkjxvgax0zmu/cia5rhes802muhkjxfgnulq5x/cia5rhes802mvhkjxg9czop5a', + 'http://example.com/cia5rhes802mwhkjx3qru605e/cia5rhes802mxhkjxo14r6mbk/cia5rhes802myhkjxnxvtblhe/cia5rhes802mzhkjxp4fuyyvq', + 'http://example.com/cia5rhes802n0hkjxta6r34nn/cia5rhes802n1hkjxn2des330/cia5rhes802n2hkjxut3wbscg/cia5rhes802n3hkjxi3sjsek8', + 'http://example.com/cia5rhes802n4hkjxlrze879b/cia5rhes802n5hkjxl9d2bptv/cia5rhes802n6hkjxe2pyq523/cia5rhes802n7hkjx3d7uk0va', + 'http://example.com/cia5rhes802n8hkjxsm87le7w/cia5rhes802n9hkjxilk0wcph/cia5rhes802nahkjx2n4ghjd4/cia5rhes802nbhkjx2z0n5kej', + 'http://example.com/cia5rhes802nchkjxjyazwvt2/cia5rhes802ndhkjxg9kfrprk/cia5rhes802nehkjxbgdpif6f/cia5rhes802nfhkjxe0456keb', + 'http://example.com/cia5rhes802nghkjxjhpr22o6/cia5rhes802nhhkjxplhnqcb8/cia5rhes802nihkjxzys0lxo2/cia5rhes802njhkjx2q01z427', + 'http://example.com/cia5rhes802nkhkjx2bh3a4jg/cia5rhes802nlhkjxwr4hs5z6/cia5rhes802nmhkjxuj8y14q2/cia5rhes802nnhkjxuhl3zdhl', + 'http://example.com/cia5rhes802nohkjxsghqd6qb/cia5rhes802nphkjxzwvmt5ut/cia5rhes802nqhkjxr3vatvee/cia5rhes802nrhkjx2bozv5k1', + 'http://example.com/cia5rhes802nshkjx2d7r9wfy/cia5rhes802nthkjxcxj3kn6a/cia5rhes802nuhkjxdria7pkp/cia5rhes802nvhkjx6uliansr', + 'http://example.com/cia5rhes802nwhkjx8nqjhhq1/cia5rhes802nxhkjxc2k2euc9/cia5rhes802nyhkjxdv6dq6vu/cia5rhes802nzhkjxidl9ujw8', + 'http://example.com/cia5rhes802o0hkjxt3hs5pt1/cia5rhes802o1hkjxouvuo74k/cia5rhes802o2hkjx46xz3nds/cia5rhes802o3hkjxrrrkqadg', + 'http://example.com/cia5rhes902o4hkjx2apdepej/cia5rhes902o5hkjxqqttkkkz/cia5rhes902o6hkjxh46l0jeu/cia5rhes902o7hkjxl7h17xdc', + 'http://example.com/cia5rhes902o8hkjxbafzc6v5/cia5rhes902o9hkjxcuowkvn1/cia5rhes902oahkjxasvphtbh/cia5rhes902obhkjxgp6ckpu5', + 'http://example.com/cia5rhes902ochkjxfb99zhss/cia5rhes902odhkjx0idz3cqv/cia5rhes902oehkjxy0f9nkn1/cia5rhes902ofhkjxnhrq2m1r', + 'http://example.com/cia5rhes902oghkjx24kuk19k/cia5rhes902ohhkjx5hx5puqb/cia5rhes902oihkjxcaqprqtz/cia5rhes902ojhkjx3zh6ivhp', + 'http://example.com/cia5rhes902okhkjxuk062elz/cia5rhes902olhkjxpv0ezkgb/cia5rhes902omhkjx6gkm3rj1/cia5rhes902onhkjxmckdzmmf', + 'http://example.com/cia5rhes902oohkjx6667yepw/cia5rhes902ophkjxkhrilcux/cia5rhes902oqhkjxubgywv84/cia5rhes902orhkjxl2z5gfhv', + 'http://example.com/cia5rhes902oshkjxwnznffds/cia5rhes902othkjx2nrd505l/cia5rhes902ouhkjxor8wvi62/cia5rhes902ovhkjxkknnf2c5', + 'http://example.com/cia5rhes902owhkjx0xvzj6j4/cia5rhes902oxhkjxm8wjviav/cia5rhes902oyhkjxd48tw0nv/cia5rhes902ozhkjxy55fth1m', + 'http://example.com/cia5rhes902p0hkjxhf2ln9fg/cia5rhes902p1hkjxn1kh849s/cia5rhes902p2hkjx7w18z1ij/cia5rhes902p3hkjx1iukw4f9', + 'http://example.com/cia5rhes902p4hkjx94e9yno8/cia5rhes902p5hkjxgg7krrow/cia5rhes902p6hkjxs7qbcgio/cia5rhes902p7hkjxjy5ubg21', + 'http://example.com/cia5rhes902p8hkjxc76syimq/cia5rhes902p9hkjxr4crms15/cia5rhes902pahkjxnijggak5/cia5rhes902pbhkjxzj7ajf4p', + 'http://example.com/cia5rhes902pchkjxtq8dybc1/cia5rhes902pdhkjxwqg0v1ob/cia5rhes902pehkjxig150nfx/cia5rhes902pfhkjx4pn0r7va', + 'http://example.com/cia5rhes902pghkjxg86s4zod/cia5rhes902phhkjxc16il6yq/cia5rhes902pihkjx25j53w11/cia5rhes902pjhkjxar484o36', + 'http://example.com/cia5rhes902pkhkjxqjtgnf6o/cia5rhes902plhkjxx22y2p6c/cia5rhes902pmhkjxu72lfdom/cia5rhes902pnhkjxv7bb9e9q', + 'http://example.com/cia5rhes902pohkjxxb029uj1/cia5rhes902pphkjx4ujdzzo5/cia5rhes902pqhkjxx4lnnhw7/cia5rhes902prhkjx6x2u79ck', + 'http://example.com/cia5rhes902pshkjxd1hhakk6/cia5rhes902pthkjxmpu8mcyi/cia5rhes902puhkjxzpcbicof/cia5rhes902pvhkjxij383b25', + 'http://example.com/cia5rhes902pwhkjxiur6rdbh/cia5rhes902pxhkjxyhkhpxrq/cia5rhes902pyhkjx29a11uyj/cia5rhes902pzhkjxf1p8g30r', + 'http://example.com/cia5rhes902q0hkjxotowbqgb/cia5rhes902q1hkjxmb7p5sr6/cia5rhes902q2hkjx378apexd/cia5rhes902q3hkjxjkglr1c4', + 'http://example.com/cia5rhes902q4hkjxxcw4jsq6/cia5rhes902q5hkjxqenj7c97/cia5rhes902q6hkjx2ye8s3q1/cia5rhes902q7hkjxtxm7sdya', + 'http://example.com/cia5rhes902q8hkjxkc9vstb2/cia5rhes902q9hkjxzwok7ng9/cia5rhes902qahkjx8ygp04d1/cia5rhes902qbhkjx4qux7aki', + 'http://example.com/cia5rhes902qchkjx57dfmt8h/cia5rhes902qdhkjx9b0035cy/cia5rhes902qehkjxvebgxts8/cia5rhes902qfhkjxu6yi37mb', + 'http://example.com/cia5rhes902qghkjx6xi3dyjx/cia5rhes902qhhkjx9x0aclfr/cia5rhes902qihkjx7mxvg28t/cia5rhes902qjhkjx9q2wphpa', + 'http://example.com/cia5rhes902qkhkjxu6s6q2q0/cia5rhes902qlhkjxlgcpgxpx/cia5rhes902qmhkjxc1dxbvr1/cia5rhes902qnhkjx6bvhf6hr', + 'http://example.com/cia5rhes902qohkjx1tm0hkvs/cia5rhes902qphkjx3pu22rbr/cia5rhes902qqhkjxdjcth8ug/cia5rhes902qrhkjxwhg6mr88', + 'http://example.com/cia5rhes902qshkjxji4arcck/cia5rhes902qthkjx5t1kjk9o/cia5rhes902quhkjx88zgme2o/cia5rhes902qvhkjxhs22agoc', + 'http://example.com/cia5rhes902qwhkjxkqdfy8em/cia5rhes902qxhkjxo11waca0/cia5rhes902qyhkjxthqzds0b/cia5rhes902qzhkjx890jrftn', + 'http://example.com/cia5rhes902r0hkjx2scv74kv/cia5rhes902r1hkjxhczgr5iw/cia5rhes902r2hkjxd9v3ewx1/cia5rhes902r3hkjxx4tpj5xh', + 'http://example.com/cia5rhes902r4hkjx8217649m/cia5rhes902r5hkjx954lwwvc/cia5rhes902r6hkjxzczxe9o4/cia5rhes902r7hkjxadtvbtm3', + 'http://example.com/cia5rhes902r8hkjx1su72qpn/cia5rhes902r9hkjxexh45oq0/cia5rhes902rahkjxah76ntxr/cia5rhes902rbhkjxnnfojf19', + 'http://example.com/cia5rhes902rchkjxc85n1zzu/cia5rhes902rdhkjxix5w6nkz/cia5rhes902rehkjxogcyyb50/cia5rhes902rfhkjx3r7glwov', + 'http://example.com/cia5rhes902rghkjxtck9dhwc/cia5rhes902rhhkjxru36hy4a/cia5rhes902rihkjxmmyc9tpx/cia5rhes902rjhkjxmbsypxaq', + 'http://example.com/cia5rhes902rkhkjx2fo040pu/cia5rhes902rlhkjxr65jltb9/cia5rhes902rmhkjxnzf86rqg/cia5rhes902rnhkjxca9gnhfv', + 'http://example.com/cia5rhes902rohkjx3t12qfew/cia5rhes902rphkjx0uy0q6x0/cia5rhes902rqhkjxytr1mozv/cia5rhes902rrhkjxti5cpfhq', + 'http://example.com/cia5rhes902rshkjxtzuesbvw/cia5rhes902rthkjx4imx7yq2/cia5rhes902ruhkjxv5rwbdfw/cia5rhes902rvhkjxx9dyruvh', + 'http://example.com/cia5rhes902rwhkjx80skj5fy/cia5rhes902rxhkjxs2roo0or/cia5rhes902ryhkjx0f0egqew/cia5rhes902rzhkjx2qyobgwd', + 'http://example.com/cia5rhes902s0hkjxwzjb0ibj/cia5rhes902s1hkjxthhdzgdb/cia5rhes902s2hkjxmp0am5hc/cia5rhes902s3hkjxou8fe0bw', + 'http://example.com/cia5rhes902s4hkjxy807y0wz/cia5rhes902s5hkjxyi0ucjpj/cia5rhes902s6hkjx57r4913i/cia5rhes902s7hkjx5zyg25co', + 'http://example.com/cia5rhes902s8hkjxtv0y9qsr/cia5rhes902s9hkjxmara3sln/cia5rhes902sahkjx16zbww31/cia5rhes902sbhkjxk3yfnqrf', + 'http://example.com/cia5rhes902schkjxmqs7wb8e/cia5rhes902sdhkjxbzqsikjf/cia5rhes902sehkjxifnkxd42/cia5rhes902sfhkjxeslnix9t', + 'http://example.com/cia5rhes902sghkjx9csqi025/cia5rhes902shhkjx03m41rdk/cia5rhes902sihkjx7o16p436/cia5rhes902sjhkjxuopqyoaf', + 'http://example.com/cia5rhes902skhkjxkj9lox0l/cia5rhes902slhkjx4siwdfz6/cia5rhes902smhkjxkz6smrk5/cia5rhes902snhkjxbydhx9sr', + 'http://example.com/cia5rhes902sohkjxmt7rn0m7/cia5rhes902sphkjxbr1rrero/cia5rhes902sqhkjxgsa5faxo/cia5rhes902srhkjxkaypi7hq', + 'http://example.com/cia5rhes902sshkjxcdabjgaq/cia5rhes902sthkjxdj1l2sdw/cia5rhes902suhkjx4w18whjz/cia5rhes902svhkjx00bsy24i', + 'http://example.com/cia5rhes902swhkjx1sxzd3bs/cia5rhes902sxhkjxwihbb32s/cia5rhes902syhkjxjv82ql1y/cia5rhes902szhkjxhx2p1tjw', + 'http://example.com/cia5rhes902t0hkjxlq1v45l8/cia5rhes902t1hkjxpcb65x6c/cia5rhes902t2hkjxqd79lp9t/cia5rhes902t3hkjxzlu0vgsq', + 'http://example.com/cia5rhes902t4hkjxchoh1xz9/cia5rhes902t5hkjxi7ja8w34/cia5rhes902t6hkjxcibihy5j/cia5rhes902t7hkjxzxhj2llf', + 'http://example.com/cia5rhes902t8hkjxe6kjteus/cia5rhes902t9hkjxct0osy9c/cia5rhes902tahkjxkpn37x26/cia5rhes902tbhkjxs1i3y06r', + 'http://example.com/cia5rhes902tchkjxkijsvrry/cia5rhes902tdhkjx478e7b15/cia5rhes902tehkjxe15r2zp0/cia5rhes902tfhkjx0xdr6u4g', + 'http://example.com/cia5rhes902tghkjxre727axs/cia5rhes902thhkjx8tjhkncn/cia5rhes902tihkjxfwe9moa8/cia5rhes902tjhkjxrw37is68', + 'http://example.com/cia5rhes902tkhkjx1vha7oxy/cia5rhes902tlhkjxorgrss4a/cia5rhes902tmhkjx5v2vjvpc/cia5rhes902tnhkjxe13xjwvn', + 'http://example.com/cia5rhes902tohkjxhh415ghg/cia5rhes902tphkjxewddudgl/cia5rhes902tqhkjxlt904su4/cia5rhes902trhkjxvox3ueb9', + 'http://example.com/cia5rhes902tshkjx565cdwgu/cia5rhes902tthkjx7v8dxnp1/cia5rhes902tuhkjx9lkhhc8x/cia5rhes902tvhkjxet30fwnm', + 'http://example.com/cia5rhes902twhkjx50zbd0gj/cia5rhes902txhkjxcxmjzp6i/cia5rhes902tyhkjx4wwog6sc/cia5rhes902tzhkjxl5k35m8y', + 'http://example.com/cia5rhes902u0hkjxmixf873e/cia5rhes902u1hkjxqkzx249g/cia5rhes902u2hkjxq1h6e73c/cia5rhes902u3hkjxy0raorlv', + 'http://example.com/cia5rhes902u4hkjxp7qu708r/cia5rhes902u5hkjxjq511roe/cia5rhes902u6hkjx24zsjlw7/cia5rhes902u7hkjxxao19ibw', + 'http://example.com/cia5rhes902u8hkjxjj8e4qjy/cia5rhes902u9hkjxnpfmyyee/cia5rhesa02uahkjx2cbqjqlj/cia5rhesa02ubhkjx2sb57ho9', + 'http://example.com/cia5rhesa02uchkjxi7stcunb/cia5rhesa02udhkjxf13m1va9/cia5rhesa02uehkjxbrbvzlts/cia5rhesa02ufhkjxv7c5sg8p', + 'http://example.com/cia5rhesa02ughkjxc4bg17mm/cia5rhesa02uhhkjx1fodi8bu/cia5rhesa02uihkjx1pgynm8w/cia5rhesa02ujhkjx21oibarf', + 'http://example.com/cia5rhesa02ukhkjx9l592wdv/cia5rhesa02ulhkjxvbp05nkt/cia5rhesa02umhkjxosf9qynb/cia5rhesa02unhkjx7bb91ukh', + 'http://example.com/cia5rhesa02uohkjxkss6ccme/cia5rhesa02uphkjxvd93brv7/cia5rhesa02uqhkjxoc61qqcx/cia5rhesa02urhkjxawfbw41u', + 'http://example.com/cia5rhesa02ushkjxgxz51hyw/cia5rhesa02uthkjxewu4vl7k/cia5rhesa02uuhkjxknapklva/cia5rhesa02uvhkjxmdf6weyv', + 'http://example.com/cia5rhesa02uwhkjx9egqxjsi/cia5rhesa02uxhkjxfzhkd5yr/cia5rhesa02uyhkjx8hv3p08k/cia5rhesa02uzhkjx45psji1y', + 'http://example.com/cia5rhesa02v0hkjx4l8lsl3u/cia5rhesa02v1hkjxngdy1ar6/cia5rhesa02v2hkjx6jo5h3qu/cia5rhesa02v3hkjxzbv3dpni', + 'http://example.com/cia5rhesa02v4hkjxtcyq3hrj/cia5rhesa02v5hkjxi1yvcnxy/cia5rhesa02v6hkjxw7v5871t/cia5rhesa02v7hkjxe8a1rpaz', + 'http://example.com/cia5rhesa02v8hkjx11e94e28/cia5rhesa02v9hkjxy79y9wsa/cia5rhesa02vahkjx4x1k6e7p/cia5rhesa02vbhkjx4nugadg0', + 'http://example.com/cia5rhesa02vchkjxyff973f9/cia5rhesa02vdhkjxxeylqp99/cia5rhesa02vehkjxup7kbh2i/cia5rhesa02vfhkjxvik2bnru', + 'http://example.com/cia5rhesa02vghkjxojpmez35/cia5rhesa02vhhkjxrsr1rbtw/cia5rhesa02vihkjxz51r21kh/cia5rhesa02vjhkjxnry87ysd', + 'http://example.com/cia5rhesa02vkhkjxc7kcgnod/cia5rhesa02vlhkjxou8csehx/cia5rhesa02vmhkjx4g46j5vv/cia5rhesa02vnhkjx0xdxordo', + 'http://example.com/cia5rhesa02vohkjxcpd7futv/cia5rhesa02vphkjxjhhvuq13/cia5rhesa02vqhkjx1jx0mwyq/cia5rhesa02vrhkjxatheqhre', + 'http://example.com/cia5rhesa02vshkjxhoxrm7du/cia5rhesa02vthkjxp3j2d7pl/cia5rhesa02vuhkjxfajs3kp2/cia5rhesa02vvhkjx094w7t5z', + 'http://example.com/cia5rhesa02vwhkjx8zsoc546/cia5rhesa02vxhkjxbbwesmgs/cia5rhesa02vyhkjxah7vbsl2/cia5rhesa02vzhkjxccc1osvb', + 'http://example.com/cia5rhesa02w0hkjxilmp1gcj/cia5rhesa02w1hkjxpax3mj4u/cia5rhesa02w2hkjxl4830fix/cia5rhesa02w3hkjxushwofrd', + 'http://example.com/cia5rhesa02w4hkjx0ayq3lna/cia5rhesa02w5hkjxtyfjinxi/cia5rhesa02w6hkjx6v3jk6np/cia5rhesa02w7hkjxb3kzmwfz', + 'http://example.com/cia5rhesa02w8hkjxpfztdog3/cia5rhesa02w9hkjxxu1jj9ro/cia5rhesa02wahkjx9x02t4s6/cia5rhesa02wbhkjxmudm4let', + 'http://example.com/cia5rhesa02wchkjxf8gwzm46/cia5rhesa02wdhkjxnogroqj5/cia5rhesa02wehkjxzcswjm19/cia5rhesa02wfhkjxd7sq70cn', + 'http://example.com/cia5rhesa02wghkjxzl71wo9i/cia5rhesa02whhkjx4qzdc4en/cia5rhesa02wihkjxqcwczavg/cia5rhesa02wjhkjx5v1mo7io', + 'http://example.com/cia5rhesa02wkhkjx17rwy1u4/cia5rhesa02wlhkjxupgzmlhz/cia5rhesa02wmhkjxy4guynpo/cia5rhesa02wnhkjx7hwclzmy', + 'http://example.com/cia5rhesa02wohkjxbhrfwyae/cia5rhesa02wphkjxg54k6a1v/cia5rhesa02wqhkjxxx6ovpcu/cia5rhesa02wrhkjx7chazbg3', + 'http://example.com/cia5rhesa02wshkjxsqxk0429/cia5rhesa02wthkjxjmhikrl3/cia5rhesa02wuhkjxojb6ebr1/cia5rhesa02wvhkjxrcv5ezdg', + 'http://example.com/cia5rhesa02wwhkjx6oc3w8ov/cia5rhesa02wxhkjxm2i72vec/cia5rhesa02wyhkjx3fh9ne9a/cia5rhesa02wzhkjx0971hhm1', + 'http://example.com/cia5rhesa02x0hkjxwenvo26l/cia5rhesa02x1hkjxtfilhs8a/cia5rhesa02x2hkjxpqvnoyqk/cia5rhesa02x3hkjx23vjztdc', + 'http://example.com/cia5rhesa02x4hkjxsgmx5os7/cia5rhesa02x5hkjxgrehs28q/cia5rhesa02x6hkjxvxtnze9l/cia5rhesa02x7hkjx0vlv9z1s', + 'http://example.com/cia5rhesa02x8hkjxge35kywm/cia5rhesa02x9hkjxw2tbefo5/cia5rhesa02xahkjxv137f9qt/cia5rhesa02xbhkjxnz9ep47k', + 'http://example.com/cia5rhesa02xchkjx00anlyr6/cia5rhesa02xdhkjx79zjud7w/cia5rhesa02xehkjxrb6rk7rw/cia5rhesa02xfhkjxphslyr6m', + 'http://example.com/cia5rhesa02xghkjxv656h0en/cia5rhesa02xhhkjxwt9sllti/cia5rhesa02xihkjxbblv9n51/cia5rhesa02xjhkjxoms9ldox', + 'http://example.com/cia5rhesa02xkhkjxb0ljdnru/cia5rhesa02xlhkjxuysb8km6/cia5rhesa02xmhkjx7sdb3ap1/cia5rhesa02xnhkjx556d8gld', + 'http://example.com/cia5rhesa02xohkjxmh07tx4r/cia5rhesa02xphkjxzekp4dcp/cia5rhesa02xqhkjxywdkdqe0/cia5rhesa02xrhkjxn2exhmk3', + 'http://example.com/cia5rhesa02xshkjxot0nxe5o/cia5rhesa02xthkjxxns5dc6l/cia5rhesa02xuhkjxppx37eq1/cia5rhesa02xvhkjxa0n1ft75', + 'http://example.com/cia5rhesa02xwhkjxdlz42y7u/cia5rhesa02xxhkjxyyrh6ehu/cia5rhesa02xyhkjxc2snloyu/cia5rhesa02xzhkjx7hniv0l2', + 'http://example.com/cia5rhesa02y0hkjx1ufllm5d/cia5rhesa02y1hkjxyciovmxi/cia5rhesa02y2hkjxeecnhafz/cia5rhesa02y3hkjxka899vl8', + 'http://example.com/cia5rhesa02y4hkjxas1scma5/cia5rhesa02y5hkjx7hx7cgry/cia5rhesa02y6hkjxt4r854cj/cia5rhesa02y7hkjxl2d58z7z', + 'http://example.com/cia5rhesa02y8hkjx6uvep3v0/cia5rhesa02y9hkjxzkox5acn/cia5rhesa02yahkjxbsttsd42/cia5rhesa02ybhkjx9s0eooqr', + 'http://example.com/cia5rhesa02ychkjxs38kr0ju/cia5rhesa02ydhkjxp7i0dm4v/cia5rhesa02yehkjxytdwg00m/cia5rhesa02yfhkjx6kojbk3h', + 'http://example.com/cia5rhesa02yghkjxu47g5rne/cia5rhesa02yhhkjxp5jiqzck/cia5rhesa02yihkjx9n0k7a86/cia5rhesa02yjhkjxawsmggmg', + 'http://example.com/cia5rhesa02ykhkjxpz5t3big/cia5rhesa02ylhkjxd7mv52ko/cia5rhesa02ymhkjxaq7e3qjp/cia5rhesa02ynhkjxx6n59eel', + 'http://example.com/cia5rhesa02yohkjx151ccq4m/cia5rhesa02yphkjxs6vfdnyb/cia5rhesa02yqhkjxakcfphvj/cia5rhesa02yrhkjxrtgqqlkl', + 'http://example.com/cia5rhesa02yshkjx5nthrj0p/cia5rhesa02ythkjxaoa6xfw1/cia5rhesa02yuhkjxsyk94k5s/cia5rhesa02yvhkjxp1fsbr6q', + 'http://example.com/cia5rhesa02ywhkjxxrjgdzm9/cia5rhesa02yxhkjxmt4liicf/cia5rhesa02yyhkjxqnavwf3w/cia5rhesa02yzhkjxwb6efk2q', + 'http://example.com/cia5rhesa02z0hkjxai4gwv4i/cia5rhesb02z1hkjxotmfrbh1/cia5rhesb02z2hkjxcorstega/cia5rhesb02z3hkjxmm6qrl72', + 'http://example.com/cia5rhesb02z4hkjx119h63fe/cia5rhesb02z5hkjx51zhx95d/cia5rhesb02z6hkjx13iaxgj7/cia5rhesb02z7hkjxnhttadyh', + 'http://example.com/cia5rhesb02z8hkjx7n279k7d/cia5rhesb02z9hkjxtyhtwvh4/cia5rhesb02zahkjxuxc8tnjw/cia5rhesb02zbhkjx9f5w1igd', + 'http://example.com/cia5rhesb02zchkjxu6u03gpq/cia5rhesb02zdhkjxad5fmie8/cia5rhesb02zehkjx82hi1ubw/cia5rhesb02zfhkjxlz014bc9', + 'http://example.com/cia5rhesb02zghkjxpcp41mh4/cia5rhesb02zhhkjxwtmgx1un/cia5rhesb02zihkjxvdlzs9gj/cia5rhesb02zjhkjxxnbuzjtx', + 'http://example.com/cia5rhesb02zkhkjxszpr5g1b/cia5rhesb02zlhkjx5r4u5x2d/cia5rhesb02zmhkjxj9k1c9lb/cia5rhesb02znhkjx76dnsetw', + 'http://example.com/cia5rhesb02zohkjxk9w5hbj0/cia5rhesb02zphkjxsz3yi7na/cia5rhesb02zqhkjxn35x1ss7/cia5rhesb02zrhkjxcmyedvkx', + 'http://example.com/cia5rhesb02zshkjxhuw9xl6g/cia5rhesb02zthkjxnkalu85l/cia5rhesb02zuhkjx0nb3kn0f/cia5rhesb02zvhkjxekzyryxq', + 'http://example.com/cia5rhesb02zwhkjxl2y2pyxt/cia5rhesb02zxhkjxeqoaa6v8/cia5rhesb02zyhkjxu5g8zso5/cia5rhesb02zzhkjx4t9www0y', + 'http://example.com/cia5rhesb0300hkjxdl9hwbgu/cia5rhesb0301hkjxed3e759g/cia5rhesb0302hkjxhsksjcb6/cia5rhesb0303hkjx3fn4nqpg', + 'http://example.com/cia5rhesb0304hkjx0j1w4t7r/cia5rhesb0305hkjx8v918aao/cia5rhesb0306hkjxvdvahvsq/cia5rhesb0307hkjxooa62xp7', + 'http://example.com/cia5rhesb0308hkjx33xkvxg7/cia5rhesb0309hkjxws0twzy4/cia5rhesb030ahkjxtpn8o3r0/cia5rhesb030bhkjxh3wusg8f', + 'http://example.com/cia5rhesb030chkjxt4rz9ksr/cia5rhesb030dhkjxklvupy26/cia5rhesb030ehkjxxf7wxi4e/cia5rhesb030fhkjxa11i0b7u', + 'http://example.com/cia5rhesb030ghkjxc1beup56/cia5rhesb030hhkjxxcgs2kpz/cia5rhesb030ihkjxc7a9g482/cia5rhesb030jhkjxjb51smqy', + 'http://example.com/cia5rhesb030khkjxu6a7pi1g/cia5rhesb030lhkjxo0qkosjn/cia5rhesb030mhkjxucjtxcjj/cia5rhesb030nhkjxbn92q469', + 'http://example.com/cia5rhesb030ohkjxalklya9k/cia5rhesb030phkjx2s6kj633/cia5rhesb030qhkjx5dus8zhl/cia5rhesb030rhkjxexszt1qv', + 'http://example.com/cia5rhesb030shkjxs325mfs5/cia5rhesb030thkjxhj36rw16/cia5rhesb030uhkjxzs6na9ek/cia5rhesb030vhkjxcahu5xdq', + 'http://example.com/cia5rhesb030whkjxbq6vx29f/cia5rhesb030xhkjxzcefm4gv/cia5rhesb030yhkjxcx0o6obs/cia5rhesb030zhkjxy6a654xp', + 'http://example.com/cia5rhesb0310hkjx74o7x2ol/cia5rhesb0311hkjxbaa60v2j/cia5rhesb0312hkjxws59xi68/cia5rhesb0313hkjxe024wl25', + 'http://example.com/cia5rhesb0314hkjxsmo6r7qy/cia5rhesb0315hkjxyo4vsu02/cia5rhesb0316hkjxq7bv4sl0/cia5rhesb0317hkjxnu8xcpds', + 'http://example.com/cia5rhesb0318hkjxfllzbwdp/cia5rhesb0319hkjx9jpu3qeb/cia5rhesb031ahkjx1yw2rxmr/cia5rhesb031bhkjx0kh6iq8e', + 'http://example.com/cia5rhesb031chkjxdjrdwexa/cia5rhesb031dhkjxpdkelmj0/cia5rhesb031ehkjxo0q4659i/cia5rhesb031fhkjxqj6po4aw', + 'http://example.com/cia5rhesb031ghkjxydbw4cnp/cia5rhesb031hhkjx7ak9k5ib/cia5rhesb031ihkjxshjg8guf/cia5rhesb031jhkjxgc7isxom', + 'http://example.com/cia5rhesb031khkjxilu3xhrq/cia5rhesb031lhkjx7qa2tmqv/cia5rhesb031mhkjx2gqx175d/cia5rhesb031nhkjxcclzxfj5', + 'http://example.com/cia5rhesb031ohkjxnqa5u0yu/cia5rhesb031phkjxvj65rgc0/cia5rhesb031qhkjxps94ct2m/cia5rhesb031rhkjx13vf7hqf', + 'http://example.com/cia5rhesb031shkjx4c0rxkqe/cia5rhesb031thkjx2f1rlhtc/cia5rhesb031uhkjxc6mmo6r9/cia5rhesb031vhkjxmkdbf7tz', + 'http://example.com/cia5rhesb031whkjx4wrcwah4/cia5rhesb031xhkjxjy564fgv/cia5rhesb031yhkjxel00ycv5/cia5rhesb031zhkjxwv42qge9', + 'http://example.com/cia5rhesb0320hkjx579rdytw/cia5rhesb0321hkjxqwktfaa3/cia5rhesb0322hkjx5uguvgm4/cia5rhesb0323hkjxod265vm7', + 'http://example.com/cia5rhesb0324hkjxo91kfm12/cia5rhesb0325hkjx7eeoo34p/cia5rhesb0326hkjxkcbju4fy/cia5rhesb0327hkjx9rgv9jej', + 'http://example.com/cia5rhesb0328hkjxu29htifz/cia5rhesb0329hkjx833v3icl/cia5rhesb032ahkjxp93q4nqo/cia5rhesb032bhkjx4tktxa61', + 'http://example.com/cia5rhesb032chkjxli18annx/cia5rhesb032dhkjxoin4rpsb/cia5rhesb032ehkjxkezkkq9n/cia5rhesb032fhkjxxq4syq15', + 'http://example.com/cia5rhesb032ghkjxjr48ia8g/cia5rhesb032hhkjxaz6zhm4c/cia5rhesb032ihkjxriefifyj/cia5rhesb032jhkjxt06hn2ix', + 'http://example.com/cia5rhesb032khkjxl0o2c8hq/cia5rhesb032lhkjxvlfg1dcu/cia5rhesb032mhkjxa6neghbc/cia5rhesb032nhkjxomcdlu3w', + 'http://example.com/cia5rhesb032ohkjxnrefhx6j/cia5rhesb032phkjx05xbd8mi/cia5rhesb032qhkjx22ncbb1j/cia5rhesb032rhkjx8mqw8vvb', + 'http://example.com/cia5rhesb032shkjxzw7wur7z/cia5rhesb032thkjxdybqu2ix/cia5rhesb032uhkjxjqrudsu0/cia5rhesb032vhkjx60p88zgu', + 'http://example.com/cia5rhesb032whkjxsj2cgd7r/cia5rhesb032xhkjxjv4oyt79/cia5rhesb032yhkjxlzlkj3x2/cia5rhesb032zhkjxhkvllyb6', + 'http://example.com/cia5rhesb0330hkjxhduykvat/cia5rhesb0331hkjxqg1x6769/cia5rhesb0332hkjx8scwhj5n/cia5rhesb0333hkjxous8ibmx', +]; diff --git a/dom/cache/test/mochitest/mochitest.ini b/dom/cache/test/mochitest/mochitest.ini index 573a515938c2c..3cfe425a5cfc9 100644 --- a/dom/cache/test/mochitest/mochitest.ini +++ b/dom/cache/test/mochitest/mochitest.ini @@ -21,6 +21,7 @@ support-files = test_cache_delete.js test_cache_put_reorder.js test_cache_https.js + large_url_list.js [test_cache.html] [test_cache_add.html] @@ -37,3 +38,4 @@ support-files = [test_cache_https.html] skip-if = buildapp == 'b2g' # bug 1162353 [test_cache_restart.html] +[test_cache_shrink.html] diff --git a/dom/cache/test/mochitest/test_cache_shrink.html b/dom/cache/test/mochitest/test_cache_shrink.html new file mode 100644 index 0000000000000..56b3d8d3e3d7c --- /dev/null +++ b/dom/cache/test/mochitest/test_cache_shrink.html @@ -0,0 +1,131 @@ + + + + + Test Cache with QuotaManager Restart + + + + + + + + From f5fb27939cf37737ba0efee5e5f90850e0b5c31b Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 28 May 2015 10:47:35 -0400 Subject: [PATCH 066/151] Bug 1157283 - Recreate IPC redirected HTTP channels as necessary after intercepting the request in the child. r=mayhemer --- .../test/serviceworkers/fetch/fetch_tests.js | 25 +++++++++++--- .../test/serviceworkers/fetch/redirect.sjs | 4 +++ .../test/serviceworkers/fetch_event_worker.js | 16 +++++++-- dom/workers/test/serviceworkers/mochitest.ini | 1 + netwerk/ipc/NeckoChannelParams.ipdlh | 1 + netwerk/protocol/http/HttpBaseChannel.cpp | 8 +++++ netwerk/protocol/http/HttpChannelChild.cpp | 33 ++++++++++++++++++- netwerk/protocol/http/HttpChannelChild.h | 8 +++++ netwerk/protocol/http/HttpChannelParent.cpp | 30 +++++++++++++++-- netwerk/protocol/http/HttpChannelParent.h | 10 +++++- netwerk/protocol/http/nsIHttpChannelChild.idl | 6 +++- 11 files changed, 130 insertions(+), 12 deletions(-) create mode 100644 dom/workers/test/serviceworkers/fetch/redirect.sjs diff --git a/dom/workers/test/serviceworkers/fetch/fetch_tests.js b/dom/workers/test/serviceworkers/fetch/fetch_tests.js index b256ca3b65d4f..915bbea502e96 100644 --- a/dom/workers/test/serviceworkers/fetch/fetch_tests.js +++ b/dom/workers/test/serviceworkers/fetch/fetch_tests.js @@ -21,7 +21,7 @@ function fetchXHR(name, onload, onerror, headers) { x.send(); } -fetchXHR('synthesized.txt', function(xhr) { +fetchXHR('bare-synthesized.txt', function(xhr) { my_ok(xhr.status == 200, "load should be successful"); my_ok(xhr.responseText == "synthesized response body", "load should have synthesized response"); finish(); @@ -46,16 +46,33 @@ fetchXHR('synthesized-headers.txt', function(xhr) { finish(); }); -fetch('synthesized-redirect-real-file.txt', function(xhr) { +fetchXHR('synthesized-redirect-real-file.txt', function(xhr) { dump("Got status AARRGH " + xhr.status + " " + xhr.responseText + "\n"); my_ok(xhr.status == 200, "load should be successful"); my_ok(xhr.responseText == "This is a real file.\n", "Redirect to real file should complete."); finish(); }); -fetch('synthesized-redirect-synthesized.txt', function(xhr) { +fetchXHR('synthesized-redirect-twice-real-file.txt', function(xhr) { my_ok(xhr.status == 200, "load should be successful"); - my_ok(xhr.responseText == "synthesized response body", "load should have synthesized response"); + my_ok(xhr.responseText == "This is a real file.\n", "Redirect to real file (twice) should complete."); + finish(); +}); + +fetchXHR('synthesized-redirect-synthesized.txt', function(xhr) { + my_ok(xhr.status == 200, "synth+redirect+synth load should be successful"); + my_ok(xhr.responseText == "synthesized response body", "load should have redirected+synthesized response"); + finish(); +}); + +fetchXHR('synthesized-redirect-twice-synthesized.txt', function(xhr) { + my_ok(xhr.status == 200, "synth+redirect+synth (twice) load should be successful"); + my_ok(xhr.responseText == "synthesized response body", "load should have redirected+synthesized (twice) response"); + finish(); +}); + +fetchXHR('fetch/redirect.sjs', function(xhr) { + my_ok(xhr.status == 404, "redirected load should be uninterrupted"); finish(); }); diff --git a/dom/workers/test/serviceworkers/fetch/redirect.sjs b/dom/workers/test/serviceworkers/fetch/redirect.sjs new file mode 100644 index 0000000000000..dab558f4a8465 --- /dev/null +++ b/dom/workers/test/serviceworkers/fetch/redirect.sjs @@ -0,0 +1,4 @@ +function handleRequest(request, response) { + response.setStatusLine(request.httpVersion, 301, "Moved Permanently"); + response.setHeader("Location", "synthesized-redirect-twice-real-file.txt"); +} diff --git a/dom/workers/test/serviceworkers/fetch_event_worker.js b/dom/workers/test/serviceworkers/fetch_event_worker.js index ff7bc98b599bc..d3301ee262163 100644 --- a/dom/workers/test/serviceworkers/fetch_event_worker.js +++ b/dom/workers/test/serviceworkers/fetch_event_worker.js @@ -1,7 +1,7 @@ var seenIndex = false; onfetch = function(ev) { - if (ev.request.url.includes("synthesized.txt")) { + if (ev.request.url.includes("bare-synthesized.txt")) { ev.respondWith(Promise.resolve( new Response("synthesized response body", {}) )); @@ -33,12 +33,24 @@ onfetch = function(ev) { )); } + else if (ev.request.url.includes("synthesized-redirect-twice-real-file.txt")) { + ev.respondWith(Promise.resolve( + Response.redirect("synthesized-redirect-real-file.txt") + )); + } + else if (ev.request.url.includes("synthesized-redirect-synthesized.txt")) { ev.respondWith(Promise.resolve( - Response.redirect("synthesized.txt") + Response.redirect("bare-synthesized.txt") )); } + else if (ev.request.url.includes("synthesized-redirect-twice-synthesized.txt")) { + ev.respondWith(Promise.resolve( + Response.redirect("synthesized-redirect-synthesized.txt") + )); + } + else if (ev.request.url.includes("ignored.txt")) { } diff --git a/dom/workers/test/serviceworkers/mochitest.ini b/dom/workers/test/serviceworkers/mochitest.ini index 10a81a3de0b66..0e226121e6d6e 100644 --- a/dom/workers/test/serviceworkers/mochitest.ini +++ b/dom/workers/test/serviceworkers/mochitest.ini @@ -27,6 +27,7 @@ support-files = fetch/fetch_worker_script.js fetch/fetch_tests.js fetch/deliver-gzip.sjs + fetch/redirect.sjs fetch/real-file.txt fetch/context/index.html fetch/context/register.html diff --git a/netwerk/ipc/NeckoChannelParams.ipdlh b/netwerk/ipc/NeckoChannelParams.ipdlh index f79d5f79ad359..bfcb5de343e3f 100644 --- a/netwerk/ipc/NeckoChannelParams.ipdlh +++ b/netwerk/ipc/NeckoChannelParams.ipdlh @@ -73,6 +73,7 @@ struct HttpChannelOpenArgs struct HttpChannelConnectArgs { uint32_t channelId; + bool shouldIntercept; }; union HttpChannelCreationArgs diff --git a/netwerk/protocol/http/HttpBaseChannel.cpp b/netwerk/protocol/http/HttpBaseChannel.cpp index 9308a68600f40..82667783c521c 100644 --- a/netwerk/protocol/http/HttpBaseChannel.cpp +++ b/netwerk/protocol/http/HttpBaseChannel.cpp @@ -2254,6 +2254,14 @@ HttpBaseChannel::SetupReplacementChannel(nsIURI *newURI, } } + // Preserve any skip-serviceworker-flag if possible. + if (mForceNoIntercept) { + nsCOMPtr httpChan = do_QueryInterface(newChannel); + if (httpChan) { + httpChan->ForceNoIntercept(); + } + } + // Propagate our loadinfo if needed. newChannel->SetLoadInfo(mLoadInfo); diff --git a/netwerk/protocol/http/HttpChannelChild.cpp b/netwerk/protocol/http/HttpChannelChild.cpp index b75e6a401fd37..d1fa7d50b4bcb 100644 --- a/netwerk/protocol/http/HttpChannelChild.cpp +++ b/netwerk/protocol/http/HttpChannelChild.cpp @@ -177,6 +177,8 @@ HttpChannelChild::HttpChannelChild() , mDivertingToParent(false) , mFlushedForDiversion(false) , mSuspendSent(false) + , mSynthesizedResponse(false) + , mShouldParentIntercept(false) { LOG(("Creating HttpChannelChild @%x\n", this)); @@ -1111,6 +1113,14 @@ HttpChannelChild::Redirect1Begin(const uint32_t& newChannelId, return; } + nsCOMPtr httpChannelChild = do_QueryInterface(newChannel); + if (mSynthesizedResponse && httpChannelChild) { + // In the case where there was a synthesized response that caused a redirection, + // we must force the new channel to intercept the request in the parent before a + // network transaction is initiated. + httpChannelChild->ForceIntercepted(); + } + mRedirectChannelChild = do_QueryInterface(newChannel); if (mRedirectChannelChild) { mRedirectChannelChild->ConnectParent(newChannelId); @@ -1261,7 +1271,7 @@ HttpChannelChild::ConnectParent(uint32_t id) // until OnStopRequest, or we do a redirect, or we hit an IPDL error. AddIPDLReference(); - HttpChannelConnectArgs connectArgs(id); + HttpChannelConnectArgs connectArgs(id, mShouldParentIntercept); PBrowserOrId browser = static_cast(gNeckoChild->Manager()) ->GetBrowserOrId(tabChild); if (!gNeckoChild-> @@ -1283,6 +1293,15 @@ HttpChannelChild::CompleteRedirectSetup(nsIStreamListener *listener, NS_ENSURE_TRUE(!mIsPending, NS_ERROR_IN_PROGRESS); NS_ENSURE_TRUE(!mWasOpened, NS_ERROR_ALREADY_OPENED); + if (mShouldParentIntercept) { + // This is a redirected channel, and the corresponding parent channel has started + // AsyncOpen but was intercepted and suspended. We must tear it down and start + // fresh - we will intercept the child channel this time, before creating a new + // parent channel unnecessarily. + PHttpChannelChild::Send__delete__(this); + return AsyncOpen(listener, aContext); + } + /* * No need to check for cancel: we don't get here if nsHttpChannel canceled * before AsyncOpen(); if it's canceled after that, OnStart/Stop will just @@ -2149,6 +2168,10 @@ HttpChannelChild::ResetInterception() } mInterceptListener = nullptr; + // The chance to intercept any further requests associated with this channel + // (such as redirects) has passed. + ForceNoIntercept(); + // Continue with the original cross-process request nsresult rv = ContinueAsyncOpen(); NS_ENSURE_SUCCESS_VOID(rv); @@ -2163,6 +2186,7 @@ HttpChannelChild::OverrideWithSynthesizedResponse(nsAutoPtr& SetApplyConversion(false); mResponseHead = aResponseHead; + mSynthesizedResponse = true; uint16_t status = mResponseHead->Status(); if (status != 200 && status != 404) { @@ -2206,4 +2230,11 @@ HttpChannelChild::OverrideWithSynthesizedResponse(nsAutoPtr& } } +NS_IMETHODIMP +HttpChannelChild::ForceIntercepted() +{ + mShouldParentIntercept = true; + return NS_OK; +} + }} // mozilla::net diff --git a/netwerk/protocol/http/HttpChannelChild.h b/netwerk/protocol/http/HttpChannelChild.h index 0e1fb8912b1e8..8f7a752d87d86 100644 --- a/netwerk/protocol/http/HttpChannelChild.h +++ b/netwerk/protocol/http/HttpChannelChild.h @@ -195,6 +195,14 @@ class HttpChannelChild final : public PHttpChannelChild // diverting callbacks to parent. bool mSuspendSent; + // Set if a response was synthesized, indicating that any forthcoming redirects + // should be intercepted. + bool mSynthesizedResponse; + + // Set if the corresponding parent channel should force an interception to occur + // before the network transaction is initiated. + bool mShouldParentIntercept; + // true after successful AsyncOpen until OnStopRequest completes. bool RemoteChannelExists() { return mIPCOpen && !mKeptAlive; } diff --git a/netwerk/protocol/http/HttpChannelParent.cpp b/netwerk/protocol/http/HttpChannelParent.cpp index f91d36077cb4a..5ae9477a76e3f 100644 --- a/netwerk/protocol/http/HttpChannelParent.cpp +++ b/netwerk/protocol/http/HttpChannelParent.cpp @@ -57,6 +57,8 @@ HttpChannelParent::HttpChannelParent(const PBrowserOrId& iframeEmbedding, , mDivertingFromChild(false) , mDivertedOnStartRequest(false) , mSuspendedForDiversion(false) + , mShouldIntercept(false) + , mShouldSuspendIntercept(false) , mNestedFrameId(0) { LOG(("Creating HttpChannelParent [this=%p]\n", this)); @@ -92,6 +94,13 @@ HttpChannelParent::ActorDestroy(ActorDestroyReason why) // yet, but child process has crashed. We must not try to send any more msgs // to child, or IPDL will kill chrome process, too. mIPCClosed = true; + + // If this is an intercepted channel, we need to make sure that any resources are + // cleaned up to avoid leaks. + if (mInterceptedChannel) { + mInterceptedChannel->Cancel(); + mInterceptedChannel = nullptr; + } } bool @@ -118,7 +127,7 @@ HttpChannelParent::Init(const HttpChannelCreationArgs& aArgs) case HttpChannelCreationArgs::THttpChannelConnectArgs: { const HttpChannelConnectArgs& cArgs = aArgs.get_HttpChannelConnectArgs(); - return ConnectChannel(cArgs.channelId()); + return ConnectChannel(cArgs.channelId(), cArgs.shouldIntercept()); } default: NS_NOTREACHED("unknown open type"); @@ -143,7 +152,7 @@ NS_IMPL_ISUPPORTS(HttpChannelParent, NS_IMETHODIMP HttpChannelParent::ShouldPrepareForIntercept(nsIURI* aURI, bool aIsNavigate, bool* aShouldIntercept) { - *aShouldIntercept = !!mSynthesizedResponseHead; + *aShouldIntercept = mShouldIntercept; return NS_OK; } @@ -188,6 +197,11 @@ class FinishSynthesizedResponse : public nsRunnable NS_IMETHODIMP HttpChannelParent::ChannelIntercepted(nsIInterceptedChannel* aChannel) { + if (mShouldSuspendIntercept) { + mInterceptedChannel = aChannel; + return NS_OK; + } + aChannel->SynthesizeStatus(mSynthesizedResponseHead->Status(), mSynthesizedResponseHead->StatusText()); nsCOMPtr visitor = new HeaderVisitor(aChannel); @@ -388,6 +402,9 @@ HttpChannelParent::DoAsyncOpen( const URIParams& aURI, if (aSynthesizedResponseHead.type() == OptionalHttpResponseHead::TnsHttpResponseHead) { mSynthesizedResponseHead = new nsHttpResponseHead(aSynthesizedResponseHead.get_nsHttpResponseHead()); + mShouldIntercept = true; + } else { + mChannel->ForceNoIntercept(); } nsCOMPtr cacheKey = @@ -467,7 +484,7 @@ HttpChannelParent::DoAsyncOpen( const URIParams& aURI, } bool -HttpChannelParent::ConnectChannel(const uint32_t& channelId) +HttpChannelParent::ConnectChannel(const uint32_t& channelId, const bool& shouldIntercept) { nsresult rv; @@ -478,6 +495,13 @@ HttpChannelParent::ConnectChannel(const uint32_t& channelId) mChannel = static_cast(channel.get()); LOG((" found channel %p, rv=%08x", mChannel.get(), rv)); + mShouldIntercept = shouldIntercept; + if (mShouldIntercept) { + // When an interception occurs, this channel should suspend all further activity. + // It will be torn down and recreated if necessary. + mShouldSuspendIntercept = true; + } + if (mPBOverride != kPBOverride_Unset) { // redirected-to channel may not support PB nsCOMPtr pbChannel = do_QueryObject(mChannel); diff --git a/netwerk/protocol/http/HttpChannelParent.h b/netwerk/protocol/http/HttpChannelParent.h index c96a71ec5bf27..07e8626de876d 100644 --- a/netwerk/protocol/http/HttpChannelParent.h +++ b/netwerk/protocol/http/HttpChannelParent.h @@ -88,7 +88,7 @@ class HttpChannelParent final : public PHttpChannelParent protected: // used to connect redirected-to channel in parent with just created // ChildChannel. Used during redirects. - bool ConnectChannel(const uint32_t& channelId); + bool ConnectChannel(const uint32_t& channelId, const bool& shouldIntercept); bool DoAsyncOpen(const URIParams& uri, const OptionalURIParams& originalUri, @@ -204,7 +204,15 @@ class HttpChannelParent final : public PHttpChannelParent bool mSuspendedForDiversion; + // Set if this channel should be intercepted before it sets up the HTTP transaction. + bool mShouldIntercept : 1; + // Set if this channel should suspend on interception. + bool mShouldSuspendIntercept : 1; + dom::TabId mNestedFrameId; + + // Handle to the channel wrapper if this channel has been intercepted. + nsCOMPtr mInterceptedChannel; }; } // namespace net diff --git a/netwerk/protocol/http/nsIHttpChannelChild.idl b/netwerk/protocol/http/nsIHttpChannelChild.idl index 05d3e3edbdef5..93911f7c19abc 100644 --- a/netwerk/protocol/http/nsIHttpChannelChild.idl +++ b/netwerk/protocol/http/nsIHttpChannelChild.idl @@ -7,11 +7,15 @@ [ptr] native RequestHeaderTuples(mozilla::net::RequestHeaderTuples); -[uuid(306ACF4D-C6DF-4EF6-BDA9-5CB92E83EDD9)] +[uuid(3842c5e9-b5b1-400c-8eb7-936a3316ff21)] interface nsIHttpChannelChild : nsISupports { void addCookiesToRequest(); + // Mark this channel as requiring an interception; this will propagate + // to the corresponding parent channel when a redirect occurs. + void forceIntercepted(); + // Headers that the channel client has set via SetRequestHeader. readonly attribute RequestHeaderTuples clientSetRequestHeaders; }; From 7ea74752c968df2d6a2b127d1dfea5732447c35a Mon Sep 17 00:00:00 2001 From: Ben Kelly Date: Thu, 28 May 2015 07:52:35 -0700 Subject: [PATCH 067/151] Bug 1168152 P5 Follow-up to use 32kb growth size as intended in previous patches. r=me --- dom/cache/DBSchema.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dom/cache/DBSchema.cpp b/dom/cache/DBSchema.cpp index f4ea47c4f9fc5..e545a17a427de 100644 --- a/dom/cache/DBSchema.cpp +++ b/dom/cache/DBSchema.cpp @@ -39,7 +39,7 @@ const int32_t kMaxEntriesPerStatement = 255; const uint32_t kPageSize = 4 * 1024; // Grow the database in chunks to reduce fragmentation -const uint32_t kGrowthSize = 64 * 1024; +const uint32_t kGrowthSize = 32 * 1024; const uint32_t kGrowthPages = kGrowthSize / kPageSize; static_assert(kGrowthSize % kPageSize == 0, "Growth size must be multiple of page size"); From 47df1bbfe37d2ee26e69a8071c9b5683df396506 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Thu, 28 May 2015 11:01:18 -0400 Subject: [PATCH 068/151] Backed out changeset dd96df1da2b5 (bug 1166728) for making test_bug320799.html permafail on Mulet. CLOSED TREE --HG-- extra : rebase_source : 4ff4ea2d22a0beb2af011cec40f90efba2e452b9 --- .../content/aboutPrivateBrowsing.css | 2 +- browser/themes/linux/searchbar.css | 2 +- browser/themes/osx/searchbar.css | 2 +- browser/themes/shared/aboutNetError.css | 2 +- browser/themes/windows/searchbar.css | 2 +- dom/base/test/test_bug320799.html | 2 +- layout/base/nsLayoutUtils.cpp | 28 +++++++++-- layout/forms/test/test_textarea_resize.html | 2 +- layout/generic/nsFrame.cpp | 8 ++- layout/generic/nsHTMLReflowState.cpp | 26 +++++++--- .../box-properties/box-sizing-1-ref.html | 12 +++++ .../reftests/box-properties/box-sizing-1.html | 13 +++++ .../box-properties/box-sizing-2-ref.html | 11 +++++ .../reftests/box-properties/box-sizing-2.html | 12 +++++ .../reftests/box-properties/box-sizing-3.html | 13 +++++ .../box-properties/box-sizing-4-ref.html | 12 +++++ .../reftests/box-properties/box-sizing-4.html | 13 +++++ .../box-sizing-mozbox-minmax-height-ref.html | 5 ++ .../box-sizing-mozbox-minmax-height.html | 10 ++++ .../computed-size-reporting-ref.html | 12 +++++ .../box-sizing/computed-size-reporting.html | 13 +++++ layout/reftests/box-sizing/intrinsic-1a.html | 2 +- layout/reftests/box-sizing/intrinsic-1b.html | 2 +- layout/reftests/box-sizing/intrinsic-1d.html | 2 +- layout/reftests/box-sizing/intrinsic-1e.html | 2 +- layout/reftests/box-sizing/intrinsic-1f.html | 2 +- .../ui3/box-sizing-padding-box-001-ref.xht | 40 +++++++++++++++ .../ui3/box-sizing-padding-box-001.xht | 43 ++++++++++++++++ .../ui3/box-sizing-padding-box-002-ref.xht | 42 ++++++++++++++++ .../ui3/box-sizing-padding-box-002.xht | 45 +++++++++++++++++ .../ui3/box-sizing-padding-box-003-ref.xht | 42 ++++++++++++++++ .../ui3/box-sizing-padding-box-003.xht | 49 +++++++++++++++++++ .../submitted/ui3/box-sizing-replaced-001.xht | 2 +- .../w3c-css/submitted/ui3/reftest.list | 3 ++ layout/style/nsCSSProps.cpp | 1 + layout/style/nsComputedDOMStyle.cpp | 9 +++- layout/style/nsStyleConsts.h | 3 +- layout/style/test/property_database.js | 8 +-- layout/tables/BasicTableLayoutStrategy.cpp | 20 ++++++-- layout/tables/FixedTableLayoutStrategy.cpp | 14 +++++- layout/tables/nsTableRowFrame.cpp | 12 ++++- layout/xul/nsResizerFrame.cpp | 9 +++- .../shared/in-content/info-pages.inc.css | 2 +- 43 files changed, 514 insertions(+), 42 deletions(-) create mode 100644 layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-001-ref.xht create mode 100644 layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-001.xht create mode 100644 layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-002-ref.xht create mode 100644 layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-002.xht create mode 100644 layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-003-ref.xht create mode 100644 layout/reftests/w3c-css/submitted/ui3/box-sizing-padding-box-003.xht diff --git a/browser/components/privatebrowsing/content/aboutPrivateBrowsing.css b/browser/components/privatebrowsing/content/aboutPrivateBrowsing.css index 6283c2781beb8..ca0ab3f035d3b 100644 --- a/browser/components/privatebrowsing/content/aboutPrivateBrowsing.css +++ b/browser/components/privatebrowsing/content/aboutPrivateBrowsing.css @@ -8,7 +8,7 @@ body { display: flex; - box-sizing: border-box; + box-sizing: padding-box; min-height: 100vh; padding: 0 48px; align-items: center; diff --git a/browser/themes/linux/searchbar.css b/browser/themes/linux/searchbar.css index 4627bbad4ec1c..f293c4253db39 100644 --- a/browser/themes/linux/searchbar.css +++ b/browser/themes/linux/searchbar.css @@ -168,7 +168,7 @@ searchbar[oneoffui] .search-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon } .searchbar-engine-one-off-item:not(.last-row) { - box-sizing: content-box; + box-sizing: padding-box; border-bottom: 1px solid #ccc; } diff --git a/browser/themes/osx/searchbar.css b/browser/themes/osx/searchbar.css index f8fb109aea9a8..b4075afc66d13 100644 --- a/browser/themes/osx/searchbar.css +++ b/browser/themes/osx/searchbar.css @@ -191,7 +191,7 @@ searchbar[oneoffui] .search-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon } .searchbar-engine-one-off-item:not(.last-row) { - box-sizing: content-box; + box-sizing: padding-box; border-bottom: 1px solid #ccc; } diff --git a/browser/themes/shared/aboutNetError.css b/browser/themes/shared/aboutNetError.css index 80171743246e0..460efd5d2eeb6 100644 --- a/browser/themes/shared/aboutNetError.css +++ b/browser/themes/shared/aboutNetError.css @@ -6,7 +6,7 @@ body { display: flex; - box-sizing: border-box; + box-sizing: padding-box; min-height: 100vh; padding: 0 48px; align-items: center; diff --git a/browser/themes/windows/searchbar.css b/browser/themes/windows/searchbar.css index 931457d8243db..c2dde6df29443 100644 --- a/browser/themes/windows/searchbar.css +++ b/browser/themes/windows/searchbar.css @@ -225,7 +225,7 @@ searchbar[oneoffui] .search-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon } .searchbar-engine-one-off-item:not(.last-row) { - box-sizing: content-box; + box-sizing: padding-box; border-bottom: 1px solid #ccc; } diff --git a/dom/base/test/test_bug320799.html b/dom/base/test/test_bug320799.html index fd966dfb86068..c160283aba385 100644 --- a/dom/base/test/test_bug320799.html +++ b/dom/base/test/test_bug320799.html @@ -11,7 +11,7 @@ Mozilla Bug 320799

- is focused, check if it has a list="" which can // provide the list of suggestions. + MOZ_ASSERT(!mPwmgrInputs.Get(mFocusedInputNode)); nsresult rv; - nsCOMPtr result; - bool dummy; - if (!mPwmgrInputs.Get(mFocusedInputNode, &dummy)) { - nsCOMPtr inputListAutoComplete = - do_GetService("@mozilla.org/satchel/inputlist-autocomplete;1", &rv); - NS_ENSURE_SUCCESS(rv, rv); - rv = inputListAutoComplete->AutoCompleteSearch(aPreviousResult, - mLastSearchString, - mFocusedInput, - getter_AddRefs(result)); - NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr inputListAutoComplete = + do_GetService("@mozilla.org/satchel/inputlist-autocomplete;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + rv = inputListAutoComplete->AutoCompleteSearch(aSearch, + mFocusedInput, + aResult); + NS_ENSURE_SUCCESS(rv, rv); - if (mFocusedInput) { - nsCOMPtr list; - mFocusedInput->GetList(getter_AddRefs(list)); - - // Add a mutation observer to check for changes to the items in the - // and update the suggestions accordingly. - nsCOMPtr node = do_QueryInterface(list); - if (mListNode != node) { - if (mListNode) { - mListNode->RemoveMutationObserver(this); - mListNode = nullptr; - } - if (node) { - node->AddMutationObserverUnlessExists(this); - mListNode = node; - } + if (mFocusedInput) { + nsCOMPtr list; + mFocusedInput->GetList(getter_AddRefs(list)); + + // Add a mutation observer to check for changes to the items in the + // and update the suggestions accordingly. + nsCOMPtr node = do_QueryInterface(list); + if (mListNode != node) { + if (mListNode) { + mListNode->RemoveMutationObserver(this); + mListNode = nullptr; + } + if (node) { + node->AddMutationObserverUnlessExists(this); + mListNode = node; } } - } else { - result = aPreviousResult; - - // If this is a password manager input mLastSearchResult will be a JS - // object (wrapped in an XPConnect reflector), so we need to take care not - // to hold onto it for too long. - mLastSearchResult = nullptr; - } - - if (mLastListener) { - mLastListener->OnSearchResult(this, result); } return NS_OK; @@ -759,14 +738,24 @@ void nsFormFillController::RevalidateDataList() if (!mLastListener) { return; } + + if (XRE_GetProcessType() == GeckoProcessType_Content) { + nsCOMPtr controller(do_QueryInterface(mLastListener)); + if (!controller) { + return; + } + + controller->StartSearch(mLastSearchString); + return; + } + nsresult rv; nsCOMPtr inputListAutoComplete = do_GetService("@mozilla.org/satchel/inputlist-autocomplete;1", &rv); nsCOMPtr result; - rv = inputListAutoComplete->AutoCompleteSearch(mLastSearchResult, - mLastSearchString, + rv = inputListAutoComplete->AutoCompleteSearch(mLastSearchString, mFocusedInput, getter_AddRefs(result)); @@ -793,14 +782,16 @@ nsFormFillController::StopSearch() NS_IMETHODIMP nsFormFillController::OnSearchCompletion(nsIAutoCompleteResult *aResult) { - nsCOMPtr resultParam = do_QueryInterface(aResult); - nsAutoString searchString; - resultParam->GetSearchString(searchString); - mLastSearchResult = aResult; + aResult->GetSearchString(searchString); + mLastSearchString = searchString; - return PerformInputListAutoComplete(resultParam); + if (mLastListener) { + mLastListener->OnSearchResult(this, aResult); + } + + return NS_OK; } //////////////////////////////////////////////////////////////////////// @@ -905,9 +896,8 @@ nsFormFillController::MaybeStartControllingInput(nsIDOMHTMLInputElement* aInput) aInput->GetList(getter_AddRefs(datalist)); bool hasList = datalist != nullptr; - bool dummy; bool isPwmgrInput = false; - if (mPwmgrInputs.Get(inputNode, &dummy)) + if (mPwmgrInputs.Get(inputNode)) isPwmgrInput = true; if (isPwmgrInput || hasList || autocomplete) { diff --git a/toolkit/components/satchel/nsFormFillController.h b/toolkit/components/satchel/nsFormFillController.h index 8a732369d44f6..76d58e5a59e36 100644 --- a/toolkit/components/satchel/nsFormFillController.h +++ b/toolkit/components/satchel/nsFormFillController.h @@ -72,7 +72,8 @@ class nsFormFillController final : public nsIFormFillController, */ void MaybeStartControllingInput(nsIDOMHTMLInputElement* aElement); - nsresult PerformInputListAutoComplete(nsIAutoCompleteResult* aPreviousResult); + nsresult PerformInputListAutoComplete(const nsAString& aSearch, + nsIAutoCompleteResult** aResult); void RevalidateDataList(); bool RowMatch(nsFormHistory *aHistory, uint32_t aIndex, const nsAString &aInputName, const nsAString &aInputValue); @@ -102,9 +103,6 @@ class nsFormFillController final : public nsIFormFillController, nsTArray > mDocShells; nsTArray > mPopups; - //these are used to dynamically update the autocomplete - nsCOMPtr mLastSearchResult; - // The observer passed to StartSearch. It will be notified when the search is // complete or the data from a datalist changes. nsCOMPtr mLastListener; diff --git a/toolkit/components/satchel/nsIFormAutoComplete.idl b/toolkit/components/satchel/nsIFormAutoComplete.idl index a9118a3e5acca..78a3802905851 100644 --- a/toolkit/components/satchel/nsIFormAutoComplete.idl +++ b/toolkit/components/satchel/nsIFormAutoComplete.idl @@ -9,7 +9,7 @@ interface nsIAutoCompleteResult; interface nsIFormAutoCompleteObserver; interface nsIDOMHTMLInputElement; -[scriptable, uuid(1d5b18b1-25f9-4407-9a0f-076dba1e41a0)] +[scriptable, uuid(bfd9b82b-0ab3-4b6b-9e54-aa961ff4b732)] interface nsIFormAutoComplete: nsISupports { /** * Generate results for a form input autocomplete menu asynchronously. @@ -18,6 +18,7 @@ interface nsIFormAutoComplete: nsISupports { in AString aSearchString, in nsIDOMHTMLInputElement aField, in nsIAutoCompleteResult aPreviousResult, + in nsIAutoCompleteResult aDatalistResult, in nsIFormAutoCompleteObserver aListener); /** diff --git a/toolkit/components/satchel/nsIInputListAutoComplete.idl b/toolkit/components/satchel/nsIInputListAutoComplete.idl index 483b1d317b2ce..6f0f492b090de 100644 --- a/toolkit/components/satchel/nsIInputListAutoComplete.idl +++ b/toolkit/components/satchel/nsIInputListAutoComplete.idl @@ -7,13 +7,11 @@ interface nsIAutoCompleteResult; interface nsIDOMHTMLInputElement; -[scriptable, uuid(9e7ba3eb-a9cf-4861-93e0-82e93d836f7a)] - +[scriptable, uuid(0e33de3e-4faf-4a1a-b96e-24115b8bfd45)] interface nsIInputListAutoComplete: nsISupports { /** * Generate results for a form input autocomplete menu. */ - nsIAutoCompleteResult autoCompleteSearch(in nsIAutoCompleteResult aResult, - in AString aSearchString, + nsIAutoCompleteResult autoCompleteSearch(in AString aSearchString, in nsIDOMHTMLInputElement aField); }; diff --git a/toolkit/components/satchel/nsInputListAutoComplete.js b/toolkit/components/satchel/nsInputListAutoComplete.js index 195ac3cd051f2..1fe290723551e 100644 --- a/toolkit/components/satchel/nsInputListAutoComplete.js +++ b/toolkit/components/satchel/nsInputListAutoComplete.js @@ -14,40 +14,14 @@ InputListAutoComplete.prototype = { classID : Components.ID("{bf1e01d0-953e-11df-981c-0800200c9a66}"), QueryInterface: XPCOMUtils.generateQI([Ci.nsIInputListAutoComplete]), - autoCompleteSearch : function (formHistoryResult, aUntrimmedSearchString, aField) { - let comments = []; // "comments" column values for suggestions + autoCompleteSearch : function (aUntrimmedSearchString, aField) { let [values, labels] = this.getListSuggestions(aField); - let historyResults = []; - let historyComments = []; - - // formHistoryResult will be null if form autocomplete is disabled. - // We still want the list values to display. - if (formHistoryResult) { - let entries = formHistoryResult.wrappedJSObject.entries; - for (let i = 0; i < entries.length; ++i) { - historyResults.push(entries[i].text); - historyComments.push(""); - } - } - - // fill out the comment column for the suggestions - // if we have any suggestions, put a label at the top - if (values.length) { - comments[0] = "separator"; - } - for (let i = 1; i < values.length; ++i) { - comments.push(""); - } - - // now put the history results above the suggestions - let finalValues = historyResults.concat(values); - let finalLabels = historyResults.concat(labels); - let finalComments = historyComments.concat(comments); - + if (values.length === 0) + return null; return new FormAutoCompleteResult(aUntrimmedSearchString, Ci.nsIAutoCompleteResult.RESULT_SUCCESS, - 0, "", finalValues, finalLabels, - finalComments, formHistoryResult); + 0, "", values, labels, + [], null); }, getListSuggestions : function (aField) { diff --git a/toolkit/components/satchel/test/unit/test_autocomplete.js b/toolkit/components/satchel/test/unit/test_autocomplete.js index 8f464ea5ef70a..7b36199c0f27b 100644 --- a/toolkit/components/satchel/test/unit/test_autocomplete.js +++ b/toolkit/components/satchel/test/unit/test_autocomplete.js @@ -85,7 +85,7 @@ add_test(function test1() { add_test(function test2() { do_log_info("Check search contains all entries"); - fac.autoCompleteSearchAsync("field1", "", null, null, { + fac.autoCompleteSearchAsync("field1", "", null, null, null, { onSearchCompletion : function(aResults) { do_check_eq(numRecords, aResults.matchCount); run_next_test(); @@ -97,7 +97,7 @@ add_test(function test3() { do_log_info("Check search result ordering with empty search term"); let lastFound = numRecords; - fac.autoCompleteSearchAsync("field1", "", null, null, { + fac.autoCompleteSearchAsync("field1", "", null, null, null, { onSearchCompletion : function(aResults) { for (let i = 0; i < numRecords; i+=2) { do_check_eq(parseInt(aResults.getValueAt(i + 1).substr(5), 10), --lastFound); @@ -112,7 +112,7 @@ add_test(function test4() { do_log_info("Check search result ordering with \"v\""); let lastFound = numRecords; - fac.autoCompleteSearchAsync("field1", "v", null, null, { + fac.autoCompleteSearchAsync("field1", "v", null, null, null, { onSearchCompletion : function(aResults) { for (let i = 0; i < numRecords; i+=2) { do_check_eq(parseInt(aResults.getValueAt(i + 1).substr(5), 10), --lastFound); @@ -142,7 +142,7 @@ add_test(function test6() { do_log_info("Check search result ordering with empty search term"); let lastFound = timesUsedSamples; - fac.autoCompleteSearchAsync("field2", "", null, null, { + fac.autoCompleteSearchAsync("field2", "", null, null, null, { onSearchCompletion : function(aResults) { for (let i = 0; i < timesUsedSamples; i++) { do_check_eq(parseInt(aResults.getValueAt(i).substr(5)), --lastFound); @@ -156,7 +156,7 @@ add_test(function test7() { do_log_info("Check search result ordering with \"v\""); let lastFound = timesUsedSamples; - fac.autoCompleteSearchAsync("field2", "v", null, null, { + fac.autoCompleteSearchAsync("field2", "v", null, null, null, { onSearchCompletion : function(aResults) { for (let i = 0; i < timesUsedSamples; i++) { do_check_eq(parseInt(aResults.getValueAt(i).substr(5)), --lastFound); @@ -180,7 +180,7 @@ add_test(function test8() { }); add_test(function test9() { - fac.autoCompleteSearchAsync("field3", "", null, null, { + fac.autoCompleteSearchAsync("field3", "", null, null, null, { onSearchCompletion : function(aResults) { do_check_eq(aResults.getValueAt(0), "senior citizen"); do_check_eq(aResults.getValueAt(1), "old but not senior"); @@ -203,7 +203,7 @@ add_test(function test10() { }); add_test(function test11() { - fac.autoCompleteSearchAsync("field4", "", null, null, { + fac.autoCompleteSearchAsync("field4", "", null, null, null, { onSearchCompletion : function(aResults) { do_check_eq(aResults.matchCount, 3); run_next_test(); @@ -223,21 +223,6 @@ add_test(function test12() { updateFormHistory(changes, run_next_test); }); -add_test(function test13() { - let autocompleteService = Cc["@mozilla.org/satchel/form-autocomplete;1"].getService(Ci.nsIFormAutoComplete); - let results = autocompleteService.autoCompleteSearch("field5", "", null, null); - do_check_eq(results.matchCount, syncValues.length, "synchronous matchCount"); - for (let i = 0; i < results.matchCount; i++) { - do_check_eq(results.getValueAt(i), syncValues[i]); - } - - results = autocompleteService.autoCompleteSearch("field5", "sync1", null, null); - do_check_eq(results.matchCount, 2, "synchronous matchCount"); - do_check_eq(results.getValueAt(0), "sync1"); - do_check_eq(results.getValueAt(1), "sync1a"); - run_next_test(); -}); - add_test(function test_token_limit_DB() { function test_token_limit_previousResult(previousResult) { do_log_info("Check that the number of tokens used in a search is not capped to " + @@ -247,7 +232,7 @@ add_test(function test_token_limit_DB() { // when re-using a previous result. fac.autoCompleteSearchAsync("field_token_cap", "a b c d e f g h i j .", - null, previousResult, { + null, previousResult, null, { onSearchCompletion : function(aResults) { do_check_eq(aResults.matchCount, 0, "All search tokens should be used with " + @@ -269,7 +254,7 @@ add_test(function test_token_limit_DB() { // (which would prevent the result from being returned if the 11th term was used). fac.autoCompleteSearchAsync("field_token_cap", "a b c d e f g h i j .", - null, null, { + null, null, null, { onSearchCompletion : function(aResults) { do_check_eq(aResults.matchCount, 1, "Only the first MAX_SEARCH_TOKENS tokens " + From 5aab2947e90331efe7cb34cdc542819f71c92dd9 Mon Sep 17 00:00:00 2001 From: Blake Kaplan Date: Thu, 28 May 2015 09:55:46 -0700 Subject: [PATCH 074/151] Bug 1162330 - Prepare satchel mochitests for e10s and turn a few of them on. r=MattN --- toolkit/components/satchel/test/mochitest.ini | 7 +- .../components/satchel/test/parent_utils.js | 120 ++++++++++++++++ .../components/satchel/test/satchel_common.js | 129 ++++++++++++------ .../satchel/test/test_bug_511615.html | 3 +- .../satchel/test/test_bug_787624.html | 2 +- .../satchel/test/test_form_autocomplete.html | 29 +--- .../test_form_autocomplete_with_list.html | 35 +---- .../satchel/test/test_form_submission.html | 6 +- .../satchel/test/test_popup_enter_event.html | 4 +- 9 files changed, 227 insertions(+), 108 deletions(-) create mode 100644 toolkit/components/satchel/test/parent_utils.js diff --git a/toolkit/components/satchel/test/mochitest.ini b/toolkit/components/satchel/test/mochitest.ini index 78d05fa09462e..29e84e7e397c0 100644 --- a/toolkit/components/satchel/test/mochitest.ini +++ b/toolkit/components/satchel/test/mochitest.ini @@ -1,15 +1,20 @@ [DEFAULT] -skip-if = toolkit == 'android' || buildapp == 'b2g' || os == 'linux' || e10s # linux - bug 947531 +skip-if = toolkit == 'android' || buildapp == 'b2g' || os == 'linux' # linux - bug 947531 support-files = satchel_common.js subtst_form_submission_1.html subtst_privbrowsing.html + parent_utils.js [test_bug_511615.html] +skip-if = e10s # bug 1162338 (needs refactoring to talk to the autocomplete popup) [test_bug_787624.html] +skip-if = e10s # bug 1162338 (needs refactoring to talk to the autocomplete popup) [test_form_autocomplete.html] skip-if = true # Test disabled for too many intermittent failures (bug 874429) + # XXX Now fails for other reasons (incl. ) [test_form_autocomplete_with_list.html] +skip-if = e10s # bug 1162329 (autocomplete impl. in e10s isn't complete) [test_form_submission.html] [test_form_submission_cap.html] [test_form_submission_cap2.html] diff --git a/toolkit/components/satchel/test/parent_utils.js b/toolkit/components/satchel/test/parent_utils.js new file mode 100644 index 0000000000000..e4bdd7f7edf8d --- /dev/null +++ b/toolkit/components/satchel/test/parent_utils.js @@ -0,0 +1,120 @@ +const { classes: Cc, interfaces: Ci, utils: Cu } = Components; + +Cu.import("resource://gre/modules/FormHistory.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://testing-common/ContentTaskUtils.jsm"); + +let gAutocompletePopup = Services.ww.activeWindow. + document. + getElementById("PopupAutoComplete"); +assert.ok(gAutocompletePopup, "Got autocomplete popup"); + +let ParentUtils = { + getMenuEntries() { + let entries = []; + let column = gAutocompletePopup.tree.columns[0]; + let numRows = gAutocompletePopup.tree.view.rowCount; + for (let i = 0; i < numRows; i++) { + entries.push(gAutocompletePopup.tree.view.getCellText(i, column)); + } + return entries; + }, + + cleanUpFormHist() { + FormHistory.update({ op: "remove" }); + }, + + updateFormHistory(changes) { + let handler = { + handleError: function (error) { + assert.ok(false, error); + sendAsyncMessage("formHistoryUpdated", { ok: false }); + }, + handleCompletion: function (reason) { + if (!reason) + sendAsyncMessage("formHistoryUpdated", { ok: true }); + }, + }; + FormHistory.update(changes, handler); + }, + + popupshownListener() { + let results = this.getMenuEntries(); + sendAsyncMessage("onpopupshown", { results }); + }, + + countEntries(name, value) { + let obj = {}; + if (name) + obj.fieldname = name; + if (value) + obj.value = value; + + let count = 0; + let listener = { + handleResult(result) { count = result }, + handleError(error) { + assert.ok(false, error); + sendAsyncMessage("entriesCounted", { ok: false }); + }, + handleCompletion(reason) { + if (!reason) { + sendAsyncMessage("entriesCounted", { ok: true, count }); + } + } + }; + + FormHistory.count(obj, listener); + }, + + checkRowCount(expectedCount, expectedFirstValue = null) { + ContentTaskUtils.waitForCondition(() => { + return gAutocompletePopup.tree.view.rowCount === expectedCount && + (!expectedFirstValue || + expectedCount <= 1 || + gAutocompletePopup.tree.view.getValueAt(0, gAutocompletePopup.tree.columns[0]) === + expectedFirstValue); + }).then(() => { + let results = this.getMenuEntries(); + sendAsyncMessage("gotMenuChange", { results }); + }); + }, + + observe(subject, topic, data) { + assert.ok(topic === "satchel-storage-changed"); + sendAsyncMessage("satchel-storage-changed", { subject: null, topic, data }); + }, + + cleanup() { + gAutocompletePopup.removeEventListener("popupshown", this._popupshownListener); + this.cleanUpFormHist(); + } +}; + +ParentUtils._popupshownListener = + ParentUtils.popupshownListener.bind(ParentUtils); +gAutocompletePopup.addEventListener("popupshown", ParentUtils._popupshownListener); +ParentUtils.cleanUpFormHist(); + +addMessageListener("updateFormHistory", (msg) => { + ParentUtils.updateFormHistory(msg.changes); +}); + +addMessageListener("countEntries", ({ name, value }) => { + ParentUtils.countEntries(name, value); +}); + +addMessageListener("waitForMenuChange", ({ expectedCount, expectedFirstValue }) => { + ParentUtils.checkRowCount(expectedCount, expectedFirstValue); +}); + +addMessageListener("addObserver", () => { + Services.obs.addObserver(ParentUtils, "satchel-storage-changed", false); +}); +addMessageListener("removeObserver", () => { + Services.obs.removeObserver(ParentUtils, "satchel-storage-changed"); +}); + +addMessageListener("cleanup", () => { + ParentUtils.cleanup(); +}); diff --git a/toolkit/components/satchel/test/satchel_common.js b/toolkit/components/satchel/test/satchel_common.js index 72acd3524e302..a6326dc47c146 100644 --- a/toolkit/components/satchel/test/satchel_common.js +++ b/toolkit/components/satchel/test/satchel_common.js @@ -3,6 +3,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ var Services = SpecialPowers.Services; +var gPopupShownListener; +var gLastAutoCompleteResults; /* * $_ @@ -44,7 +46,7 @@ function doKey(aKey, modifier) { if (!modifier) modifier = null; - // Window utils for sending fake sey events. + // Window utils for sending fake key events. var wutils = SpecialPowers.getDOMWindowUtils(window); if (wutils.sendKeyEvent("keydown", key, 0, modifier)) { @@ -53,34 +55,37 @@ function doKey(aKey, modifier) { wutils.sendKeyEvent("keyup", key, 0, modifier); } - -function getAutocompletePopup() { - var Ci = SpecialPowers.Ci; - chromeWin = SpecialPowers.wrap(window) - .QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIWebNavigation) - .QueryInterface(Ci.nsIDocShellTreeItem) - .rootTreeItem - .QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDOMWindow) - .QueryInterface(Ci.nsIDOMChromeWindow); - autocompleteMenu = chromeWin.document.getElementById("PopupAutoComplete"); - ok(autocompleteMenu, "Got autocomplete popup"); - - return autocompleteMenu; +function registerPopupShownListener(listener) { + if (gPopupShownListener) { + ok(false, "got too many popupshownlisteners"); + return; + } + gPopupShownListener = listener; } +function getMenuEntries() { + if (!gLastAutoCompleteResults) { + throw new Error("no autocomplete results"); + } -function cleanUpFormHist() { - SpecialPowers.formHistory.update({ op : "remove" }); + var results = gLastAutoCompleteResults; + gLastAutoCompleteResults = null; + return results; } -cleanUpFormHist(); - var checkObserver = { verifyStack: [], callback: null, + init() { + script.sendAsyncMessage("addObserver"); + script.addMessageListener("satchel-storage-changed", this.observe.bind(this)); + }, + + uninit() { + script.sendAsyncMessage("removeObserver"); + }, + waitForChecks: function(callback) { if (this.verifyStack.length == 0) callback(); @@ -88,7 +93,7 @@ var checkObserver = { this.callback = callback; }, - observe: function(subject, topic, data) { + observe: function({ subject, topic, data }) { if (data != "formhistory-add" && data != "formhistory-update") return; ok(this.verifyStack.length > 0, "checking if saved form data was expected"); @@ -120,6 +125,22 @@ function checkForSave(name, value, message) { checkObserver.verifyStack.push({ name : name, value: value, message: message }); } +function NonE10SgetAutocompletePopup() { + var Ci = SpecialPowers.Ci; + chromeWin = SpecialPowers.wrap(window) + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShellTreeItem) + .rootTreeItem + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindow) + .QueryInterface(Ci.nsIDOMChromeWindow); + autocompleteMenu = chromeWin.document.getElementById("PopupAutoComplete"); + ok(autocompleteMenu, "Got autocomplete popup"); + + return autocompleteMenu; +} + function getFormSubmitButton(formNum) { var form = $("form" + formNum); // by id, not name @@ -137,28 +158,54 @@ function getFormSubmitButton(formNum) { // Count the number of entries with the given name and value, and call then(number) // when done. If name or value is null, then the value of that field does not matter. function countEntries(name, value, then) { - var obj = {}; - if (name !== null) - obj.fieldname = name; - if (value !== null) - obj.value = value; - - var count = 0; - SpecialPowers.formHistory.count(obj, SpecialPowers.wrapCallbackObject({ handleResult: function (result) { count = result }, - handleError: function (error) { - ok(false, "Error occurred searching form history: " + error.message); - SimpleTest.finish(); - }, - handleCompletion: function (reason) { if (!reason) then(count); } - })); + script.sendAsyncMessage("countEntries", { name, value }); + script.addMessageListener("entriesCounted", function counted(data) { + script.removeMessageListener("entriesCounted", counted); + if (!data.ok) { + ok(false, "Error occurred counting form history"); + SimpleTest.finish(); + return; + } + + then(data.count); + }); } // Wrapper around FormHistory.update which handles errors. Calls then() when done. function updateFormHistory(changes, then) { - SpecialPowers.formHistory.update(changes, SpecialPowers.wrapCallbackObject({ handleError: function (error) { - ok(false, "Error occurred updating form history: " + error.message); - SimpleTest.finish(); - }, - handleCompletion: function (reason) { if (!reason) then(); }, - })); + script.sendAsyncMessage("updateFormHistory", { changes }); + script.addMessageListener("formHistoryUpdated", function updated({ ok }) { + script.removeMessageListener("formHistoryUpdated", updated); + if (!ok) { + ok(false, "Error occurred updating form history"); + SimpleTest.finish(); + return; + } + + then(); + }); +} + +function notifyMenuChanged(expectedCount, expectedFirstValue, then) { + script.sendAsyncMessage("waitForMenuChange", + { expectedCount, + expectedFirstValue }); + script.addMessageListener("gotMenuChange", function changed({ results }) { + script.removeMessageListener("gotMenuChange", changed); + gLastAutoCompleteResults = results; + then(); + }); } + +var chromeURL = SimpleTest.getTestFileURL("parent_utils.js"); +var script = SpecialPowers.loadChromeScript(chromeURL); +script.addMessageListener("onpopupshown", ({ results }) => { + gLastAutoCompleteResults = results; + if (gPopupShownListener) + gPopupShownListener(); +}); + +SimpleTest.registerCleanupFunction(() => { + script.sendAsyncMessage("cleanup"); + script.destroy(); +}); diff --git a/toolkit/components/satchel/test/test_bug_511615.html b/toolkit/components/satchel/test/test_bug_511615.html index d24f64208688f..7bc63fdc6a41b 100644 --- a/toolkit/components/satchel/test/test_bug_511615.html +++ b/toolkit/components/satchel/test/test_bug_511615.html @@ -29,8 +29,7 @@